This is the full developer documentation for SumOffice
#
> Document and spreadsheet editors inside your product, under your name. Word and Excel files stay with you: no third-party cloud, no third-party interface.
Business documents still live in Word and Excel files, and some of them are not just text but working tools with formulas, macros, and data queries. Office suites are sold per seat: you cannot embed them in your product. **SumOffice is an independent office platform that embeds into your product**, under its name and inside its perimeter. SumDoc works with Word documents, SumSheet with Excel spreadsheets. The platform is not tied to Microsoft; [how to move away from it without losing files](/platform/replace-office/).
## How this is proven
[Section titled “How this is proven”](#how-this-is-proven)
These are not plans. Every number is taken from installed builds and checked twice: on our side against the products’ source code, and when the site is published against lists taken from the delivery itself. If even one diverges, the site is not published.
**41**document session commands — all accepted by the release core
**208**spreadsheet contract operations, 206 of them accepted by the core of the latest release
**13**spreadsheet formats, including XLSX, XLSB, XLSM, ODS and CSV
**1 000 000**rows open in the browser — scroll and see the cost of a frame
**1–3 s**a two-page memo on screen in the browser; a 24-page draft with tracked changes—3–4 s. Measured on September 5, 2026 on a production node, clean profile—[open it and time it](/sumdoc/demo/)
**33 MB**29 pages, 37 photos—a real government agency report opened by the same core; alongside it three more real DOCX files, up to 42 photos—[files and live sandboxes](https://sumoffice.com/#files)
The document is owned by the platform’s own core: it reads the file, computes layout and formulas, keeps the edit history, and writes the result. It is not a wrapper around someone else’s editor—[what that means next to Excel](/sumsheet/atlas/).
## Try it right here
[Section titled “Try it right here”](#try-it-right-here)
Both editors open right on the site, with no installation: this is not a screen recording but a working program. Only you see your edits. If the demo environment is down at that moment, a screenshot and a caption saying so will appear in place of the frame.
A document in SumDoc
A two-page contract: headings, lists, a table with deadlines and an amount. Edit a paragraph and see what it looks like inside a third-party application.
[Open the live editor →](/sumdoc/demo/)
An estimate in SumSheet
A spreadsheet with formulas. Change a quantity or a price—the sums, shares, and both totals recalculate on their own.
[Open the live spreadsheet →](/sumsheet/demo/)
## Two engines, one embedding model
[Section titled “Two engines, one embedding model”](#two-engines-one-embedding-model)
The third engine—for presentations—is in development: a public beta is planned for December 2026; it cannot be downloaded yet, and PPTX compatibility, platforms, and speed are not promised.
SumDoc — Word documents
The document editor: opens a Word file, shows the pages, lets you edit, saves and reopens—all inside your window. Your application drives it through 41 commands, and there is no other path to the document.
[SumDoc overview](/sumdoc/overview/) · [Quick start](/sumdoc/quickstart/) · [Reference](/reference/sumdoc/overview/)
SumSheet — Excel spreadsheets
The spreadsheet editor: formulas, edit history, reading and saving workbooks. Only what is needed right now is loaded into memory, so large workbooks open. The set of operations is the same on the desktop, in the browser, and on the server: 208 operations are described, 206 of them accepted by the core of the latest release.
[SumSheet overview](/sumsheet/overview/) · [Quick start](/sumsheet/quickstart/) · [Reference](/reference/sumsheet/overview/)
## What this changes for your product
[Section titled “What this changes for your product”](#what-this-changes-for-your-product)
Your product, not someone else's window
The user opens a document from the familiar record card. The editor appears in the same window and under the same brand; the new version goes back into your existing storage and audit perimeter.
One source of truth about the document
Content, formulas, history, and file writing live in the core. There is no second engine—so the document looks and calculates the same on the desktop, in the browser, and on the server.
Refusal instead of silent corruption
If an edit cannot be applied—the file was changed elsewhere, the sheet is protected, the operation is unsupported—a refusal with a reason arrives **before** the file changes. There is no such thing as a half-changed document.
An agent works as a single transaction
An AI agent takes the same path as a person: it looks, makes a plan, shows the changes, waits for approval, applies, saves, and writes to the audit log. Not clicks on someone else’s interface and not editing the file behind the editor’s back.
## Where to start: choose what you are embedding into
[Section titled “Where to start: choose what you are embedding into”](#where-to-start-choose-what-you-are-embedding-into)
Three paths, and they differ from the first step. Open yours—everything is step by step there, from “what to take from the delivery” to “which screen the user will see”. And if you don’t want to figure it out—[hand the task to Claude](/start/kit/), and the AI assistant will wire up the editor for you.
Into a web application
Your product lives in the browser. The editor opens right on your page, and the file stays within your perimeter.
[Four steps →](/start/web/)
Into a desktop application
An accounting system, an industry platform, an add-on over 1C. The editor runs alongside your program, and the program knows about every change.
[Three steps →](/start/desktop/)
Into a mobile application
Phone and tablet: ready-made apps in the stores, a free viewer kit for Android and iOS, and a path for editing from a phone.
[The working path →](/start/mobile/)
Builds are available for macOS, Windows, and Linux. On Windows, both architectures, x64 and arm64; on Linux only x86-64 so far. For macOS, SumSheet has builds for both Apple Silicon and Intel, while SumDoc is currently published only for Apple Silicon. The product is under active development, so we hand out builds on request and name the limitations of the current version along with them. What to do after receiving them—[installing SumDoc](/sumdoc/install/) and [installing SumSheet](/sumsheet/install/).
## Code examples
[Section titled “Code examples”](#code-examples)
Twenty-four projects are shown in full, file by file: you can see how much code each task takes. In these sheets a stand-in takes the place of the core, so look at the amount of code rather than at the numbers in the cells — the real recalculation lives in the [live spreadsheet](/sumsheet/demo/) above.
* [Live SumDoc example: the editor in the browsera working document editor right on the page, and the whole project that connects it](/sumdoc/demo/)
* [Minimal sheethow many lines it takes to get a working sheet](/sumsheet/examples/minimal/)
* [Sheet with the ribbonhow to add our ribbon if you need it](/sumsheet/examples/ribbon/)
* [Embedding into a third-party pagewhat happens to the host page around the sheet: its font, background and scrolling](/sumsheet/examples/embedded/)
* [A million rowsthe cost of three gestures on a workbook at the limit — scrolling, fill-dragging and zooming: p50 and p95 frame times and calls to the core as numbers, not promises](/sumsheet/examples/stress/)
* [Crosshairhighlighting the row and column of the active cell: off by default, enabled with a property](/sumsheet/examples/crosshair/)
* [Read-onlythe workbook is visible but cannot be edited: commands are grayed out with a reason rather than hidden, and editing never starts at all](/sumsheet/examples/read-only/)
* [Custom headersthe integrator sets the row and column labels, and the header strip width is computed from that text](/sumsheet/examples/custom-headers/)
* [Sheet without header stripsthe strips are hidden with a single property, and the sheet itself takes the freed space](/sumsheet/examples/no-headings/)
* [Custom menu itema third-party item in our menu: below the divider, under its owner’s name and with its own command — it cannot pass itself off as ours](/sumsheet/examples/custom-menu/)
* [Custom keyboard shortcutthe third-party shortcut fires, while the ones taken by the sheet (Ctrl+D, Ctrl+R, F2, Shift+Space) stay with the sheet — the refusal is visible in words](/sumsheet/examples/custom-shortcut/)
* [Custom languagea language that is not among our three is brought by the page owner: labels are translated, and anything untranslated falls back along a chain instead of disappearing](/sumsheet/examples/custom-locale/)
* [Drop a workbook herea third-party document is opened from bytes: the shell carries the file, parsing stays behind the contract seam, and a refusal comes in the words of whoever opened it — on the showcase this is a stub that takes csv, tsv and txt and honestly refuses xlsx](/sumsheet/examples/open-bytes/)
* [Two people in one documenttwo frames side by side: move the selection in one and the other shows the remote cursor with a name; the screen says plainly that only windows of this browser are visible](/sumsheet/examples/presence/)
* [Assistants drive the sheetup to ten external participants, each in its own process: walking its own column, selecting a region and writing in a total — as intents through the same channel; a refusal of anything beyond that is visible both to it and to the person; if they were not started, the page says so](/sumsheet/examples/driver/)
* [Custom eventtwo outward extension points: onCommand delivers any intent of the surface (ours and third-party), onGesture the cost of a finished gesture as numbers](/sumsheet/examples/custom-event/)
* [Hyperlinka link is a cell property: one core operation sets it together with the text, removes it leaving the text, and lists the links of the sheet itself](/sumsheet/examples/hyperlink/)
* [Find and replacesearch is one request, replace is two, and the first does not change the workbook: the core computes a plan of edits, and the same path as typing writes them](/sumsheet/examples/find-replace/)
* [Notessix items of “Review” — one contract operation and an intent field; the text, number and normalized address are named by the core](/sumsheet/examples/annotations/)
* [Sheet outlineeight actions — one operation: the shell names the range, axis and action, and the core computes the levels and what to hide](/sumsheet/examples/outline/)
* [Page layoutwhere a page break falls — the only SDK method that asks and changes nothing; printing itself is done by the host, and that is a boundary, not a gap](/sumsheet/examples/page-breaks/)
* [Allow editing rangessix intents of a single operation: the password goes behind the seam and never comes back — only the protection method returns](/sumsheet/examples/protected-ranges/)
* [Workbook linksa formula computes from another workbook: the list of links, their state and the source address come from the core, and the window owner opens the workbook](/sumsheet/examples/workbook-links/)
* [Headlessa workbook is opened, edited and read from Node — without a single call to the DOM](/sumsheet/examples/headless/)
All examples by product: [SumDoc](/sumdoc/examples/) and [SumSheet](/sumsheet/examples/).
## Where to go next
[Section titled “Where to go next”](#where-to-go-next)
[What you get](/platform/story/)The product formula: what you bring, what the platform does, what comes out.
[Feature parity](/platform/parity/)What parity with Word and Excel means and how it is proven.
[Pilot and acceptance](/platform/pilot/)A two-week plan: what is checked at each layer and what the go/no-go decision is based on.
[AI tools and MCP](/start/ai/)Connect the documentation to Claude, Cursor or ChatGPT as an MCP server.
[Contact us](/start/contact/)Request a pilot, join the beta, or ask a question about embedding.
# Page not found
> There is no such address on this site. Below are the entry points to the SumOffice documentation: products, references and how to get in touch.
There is no such address here. The page may have been renamed, or the link came from an old conversation. The search at the top covers the whole documentation; the entry points are below.
## Start over
[Section titled “Start over”](#start-over)
* [What SumOffice is](/start/intro/) — the platform in five minutes.
* [How to read this documentation](/start/how-to-read/) — reading paths for different tasks.
* [Glossary](/start/glossary/) — when a term is unclear.
## Products
[Section titled “Products”](#products)
* [SumDoc — the DOCX document editor](/sumdoc/overview/): [installation](/sumdoc/install/), [quick start](/sumdoc/quickstart/), [reference](/reference/sumdoc/overview/).
* [SumSheet — the XLSX spreadsheet processor](/sumsheet/overview/): [installation](/sumsheet/install/), [quick start](/sumsheet/quickstart/), [reference](/reference/sumsheet/overview/).
## If you are evaluating the platform
[Section titled “If you are evaluating the platform”](#if-you-are-evaluating-the-platform)
* [Your own office suite instead of Microsoft Office](/platform/replace-office/) — why it is needed and what it gives.
* [Risks and honest boundaries](/platform/risks/) — what is not covered yet.
* [Pilot and acceptance](/platform/pilot/) — how to test on your own documents.
## Did not find what you need
[Section titled “Did not find what you need”](#did-not-find-what-you-need)
Write to and we will point you to where it is described. If a link on this site brought you here, tell us which one: [email with a ready subject](mailto:hello@sumoffice.com?subject=documentation).
# What embedding gives you that Office doesn't
> Eight measurable axes where an embeddable platform gives you more than a ready-made editor, and the areas where superiority can't be claimed without testing.
An advantage only matters where it can be measured. Below are eight axes where an embeddable platform gives you more than a ready-made editor, and how each claim is verified on your documents before the contract is signed.
| Axis | What it gives you | How to verify it |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Embedding as the foundation | What you get is your product, not an editor inside someone else’s environment. | Take the [evaluation kit](/start/glossary/) and embed a real document in your application within the allotted time. |
| One owner of meaning | One core parses, calculates, and writes the file; there is no second formula engine or history in the interface, and the result is the same in the desktop app and in the browser. | Run the same operation in the desktop app and in the browser, and compare the content, formulas, history, and the written file. Pagination is not part of the comparison: text width is measured by the system where the core runs, and the desktop app on macOS may not match the server core on Linux. |
| Refusal before mutation | An unsupported operation doesn’t corrupt the file. | Check four cases — a stale revision, sheet or document protection, read-only mode, a corrupted file — and confirm that not a single byte changed. |
| Preservation as a commitment | Power Query, macros, unfamiliar markup, charts, and relationships between parts of the file survive a save. | Compare the file’s content before and after, and reopen it in a new process. |
| A contract ready for agents | An agent’s work becomes manageable and verifiable. | Walk through the “preview → confirm → apply → roll back” scenario and confirm that every step is recorded. |
| One layer for desktop and web | Offline work and the browser are served by one core. The path to the browser differs between the products: spreadsheets calculate right in the browser, documents use the core on the server, one process per user. | Compare the meaning of the same operations in your chosen pair of environments — [SumSheet runtimes](/sumsheet/environments/), [the SumDoc editor in the browser](/sumdoc/webhost/). |
| Lifecycle and shutdown | The embedded editor runs for a long time, without leaks or hung processes. | Open and close the editor repeatedly, and confirm that no listeners, background threads, or processes are left behind. |
| A capability matrix as part of the contract | Less risk of false promises and of disputes after the rollout. | An agreed matrix: formats × runtime × operations × limits. |
## Where you shouldn’t promise superiority without testing
[Section titled “Where you shouldn’t promise superiority without testing”](#where-you-shouldnt-promise-superiority-without-testing)
* The total number of interface features compared with mature office suites.
* Full compatibility with Word and Excel in every rare edge case.
* Speed superiority over other suites without an identical set of documents and an identical measurement method.
* Full support for VBA and the M language without a separate compatibility matrix.
* Simultaneous editing of objects and formatting by several people: co-editing is proven for text and cells (measured with five participants and 119 scenarios); objects and formatting under concurrent input are still being measured.
* A ready-made server service for production load — queues, quotas, monitoring — if it isn’t part of the capability profile.
How to verify this yourself
Any claim in the table above can be verified on your own documents before signing a contract — the right-hand column describes exactly how. A claim that can’t be verified shouldn’t go into the contract — yours or ours.
## Next
[Section titled “Next”](#next)
* What exactly the product does with the file — the [SumDoc capability map](/sumdoc/capabilities/) and the [map next to Excel](/sumsheet/atlas/).
* How verification on your documents works — [Pilot and acceptance](/platform/pilot/).
* What’s not there yet, and how that gap is covered — [Risks and honest boundaries](/platform/risks/).
# VBA, Power Query, and agents
> Automation without losing control: a supported subset instead of blanket promises, a Power Query ladder, and agent work as a transaction.
The most common question when moving away from Excel is “will my macros and queries come along?”. The honest answer: some will, some won’t, and the main thing is to find out before the rollout, not after. The platform is built so that what’s unsupported doesn’t break the file silently but is named explicitly, and a change can be seen before it’s applied.
## VBA
[Section titled “VBA”](#vba)
Full VBA compatibility isn’t promised. The supported subset runs; everything else is rejected with a clear reason — before the document changes. For documents the rule is stricter: running macros isn’t promised at all, and reading their contents is separated from running them.
| Where | What’s promised | What isn’t promised |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Spreadsheets (SumSheet) | VBA compatibility as a separate capability on top of the operations contract; unsupported language constructs, application calls, and attempts to cross security boundaries are rejected with a stated reason. | Full compatibility with Excel VBA — without an agreed set of workbooks, security requirements, and a matrix of supported calls. |
| Documents (SumDoc) | Detecting macros and their printable strings without running them; business-logic events through the public event set and policy enforcement points. | Parsing macros into source code, running them, and an Office.js-compatible environment — without a separate agreement. |
| Enterprise automation | The “inspect → propose → confirm → apply” order, role-based restrictions, protection against repeated execution, an action log. | An agent that clicks through the interface or edits the file directly. |
## Power Query and data workbooks
[Section titled “Power Query and data workbooks”](#power-query-and-data-workbooks)
Power Query is a strength for enterprise rollouts, but it needs to be discussed in steps, not with the single word “supported”. It’s not a full match with Excel: the declared subset works, the rest is rejected with a stated reason.
* **Recognize.** Find the queries, connections, data model, and anything unsupported in the workbook.
* **Preserve.** Don’t delete, on write, anything the operation doesn’t manage.
* **Show.** Reveal the query structure without exposing credentials or handing over the whole workbook.
* **Refresh.** Run agreed sources and transformations — within the bounds of the declared capabilities and set rules.
* **Create.** Add and change queries and connections within the confirmed subset.
There are contract operations for every step — 61 of them, spread across seven sections of the reference.
## Agents
[Section titled “Agents”](#agents)
The agent works not by clicking and not by editing the file, but through the same contract as the interface. It has stable object identifiers, a revision check before a change, policy enforcement points, a preview of the result, and the ability to confirm or roll back.
A strong formula
SumOffice turns automation from “a script did something to the file” into the order “intent → check → preview → confirmation → apply as one indivisible action → save and reopen → write to the log”. For enterprise rollout, this is fundamentally better than a hidden macro run that nobody knows about.
## For developers
[Section titled “For developers”](#for-developers)
* Macros and VBA in SumSheet — [the reference section](/reference/sumsheet/vba/). Checking SumDoc macros without running them — the `inspect-vba` command: [what else the processor does](/sumdoc/overview/#what-else-the-processor-does-besides-editing).
* Power Query, 61 operations, spread across seven sections of the reference: [queries and steps](/reference/sumsheet/pq-queries/) — 13, [connectors](/reference/sumsheet/pq-connectors/) — 13, [M expressions](/reference/sumsheet/pq-expressions/) — 9, [execution and progress](/reference/sumsheet/pq-execution/) — 9, [tables from queries](/reference/sumsheet/pq-tables/) — 8, [trust and privacy](/reference/sumsheet/pq-trust/) — 6, [external mashups](/reference/sumsheet/pq-mashup/) — 3; the list with the numbers is in the [reference overview](/reference/sumsheet/overview/).
* The agent’s route for documents today is the same session commands a person uses, all 41 of them: [session commands](/reference/sumdoc/session-protocol/). There’s no separate interface for the agent; it’s [only proposed](/sumdoc/host-api/). A repeated call with the same identifier isn’t executed twice.
# Commercial packaging
> The commercial model: units of delivery, the licensing model and prices, the key and the modes without one, partnership levels.
You buy the right to embed the engine and managed compatibility, not the source code. That means a supported runtime with commitments on compatibility and updates, not a fork you would then have to maintain yourself.
| Deal component | What it is | Why it matters |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| The right to embed | The right to embed and distribute SumOffice under your brand. | The legal basis for delivering it under your own name. |
| Access to the developer kit | Built packages, types, the public interface, examples, and documentation. For documents, the public contract works today; for spreadsheets, the set is still being separated from the internal contract, and its current contents are a matter of the agreement, not a default. | Integration goes through a stable contract, not internal details. |
| Capability profile | A named set of features, platforms, formats, embedding methods, and limits. | This, not general phrases, is what defines the commercial promise. |
| Integration package | Joint development of an adapter for your application, storage handling, and an acceptance scenario. | Reduces the risk of a failed pilot. |
| Automation modules | An interface for agents, VBA compatibility, Power Query, and data connections — each with its own profile. | The base editor delivery isn’t mixed with what needs separate verification. |
| Version support and commitments | The support period, security fixes, the update cadence, the compatibility period. | Enterprise rollout depends on how predictable these timelines are. |
| Security package | The delivery’s component inventory, vulnerability response times, the disclosure process, file signatures, release notes. What’s already signed in the current release and what isn’t yet is listed in [Risks](/platform/risks/). | Covers the requirements of the security and procurement teams. |
| Quality program | A set of documents for regression testing, sample files, speed and memory thresholds, an escalation process. | Reduces the risk of disputes after rollout. |
## Product tiers
[Section titled “Product tiers”](#product-tiers)
| Tier | What’s included | Who it’s for |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| [Evaluation kit](/start/glossary/) | The runtime, a sample application, a few sample documents, the quick start, and a list of known limitations. | For a CTO or architect running a first check. |
| Limited pilot | One platform, one real working scenario, a narrowed capability profile. | Check whether the product fits and whether compatibility is good enough. |
| Embedding kit | The public interface, types, a shell under your brand, adapters, and documentation. For documents, this is a contract and surface that work today; for spreadsheets, the public set is still taking shape, and its contents are fixed by the agreement — [what’s in it today](/sumsheet/embedding-api/). | A working integration into your product. |
| Enterprise profile | The security package, version support and commitments, an update channel, acceptance before production use. | For enterprise customers and anyone deploying the product inside their own perimeter. |
| Extended automation | Agents, the supported subset of VBA, Power Query and data connections, policy enforcement points. “Agents” means different things here: for documents, an agent uses the same commands as a person (there are 41), there is no separate interface for it, and it [only proposes](/sumdoc/host-api/); for spreadsheets, the “inspect, propose, apply” flow relies on the release’s operations, while the agent’s permissions, the audit contents, and the approval process are fixed by the pilot. | Complex data migrations, document-management, accounting, and resource-planning systems, analytical processes. |
The contract’s principle
Commitments aren’t defined by words like “editor”, “Excel”, or “compatibility”, but by agreed documents: the capability profile, the platform matrix, the set of acceptance documents, and the support terms.
## Licensing model
[Section titled “Licensing model”](#licensing-model)
The engine is licensed to the application that embeds it: not per seat, not per document, not per operation.
| Stage | Terms |
| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Evaluation | Free: the full engine, real files. Working in the editor is not time-limited; automated processing without a key switches to quiet mode after 60 days — [key and operating modes](#key-and-operating-modes). |
| Pilot | Two weeks on your corpus with written acceptance criteria; the report stays with you either way — [Pilot and acceptance](/platform/pilot/). |
| Production use | An annual license for one embedding application. Updates and engineering support with a named response time are included in the price; deployment inside your perimeter, under your brand; users aren’t counted. |
| Editors as a server | Server images of SumDoc and SumSheet inside your system: evaluation is free, production use is the same annual license for the embedding application. |
| A \[\[var:node.product]] node with the editors inside | 90 days at full speed, then a key: \[\[var:pricing.node-50]] per month for up to 50 people, \[\[var:pricing.node-200]] for up to 200. Without a key, the node keeps working and keeps its data; only the automated paths slow down — export, conversion, transcription. |
What the license covers: distributing the engine inside your application — in your perimeter or in your cloud, all engine updates during the term, engineering support with a named response time. The price depends on one thing: which application embeds the engine and how it is delivered. A written proposal — within one business day.
## Changes for your process
[Section titled “Changes for your process”](#changes-for-your-process)
You don’t pay for the right to open a file. You pay for adapting the tool to your process — with a deadline and a named owner. Our defects aren’t an order: a file that opens incorrectly, a lost edit, a crash — these are fixed for free, and the service level only sets the speed.
| Class | Price | Deadline | Examples |
| ----------------------------- | ------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| A — behavior settings | \[\[var:pricing.change-a]] | 1 business day | The default export format, page settings and fonts, the template set, features turned on and off, your logo and name on the editor surface, the interface language. |
| B — connection to your system | \[\[var:pricing.change-b]] | 2–3 business days | Two endpoints of your system (“who am I”, “file by ID”), pass-through single sign-on, a save notification (webhook), a file naming rule, reverse proxy setup, a reversible rollback. |
| C — engine behavior | \[\[var:pricing.change-c]] | up to 5 business days | Porting one macro or one Power Query source of a typical form, support for one DOCX or XLSX construct from your corpus, an export variant, automation of one operation. |
| By estimate | from \[\[var:pricing.change-c]] | agreed in advance | Everything beyond class C: a set of macros, integration with a document management system without WOPI, a new data source, on-site work, a corpus audit before migration. |
On-call — \[\[var:pricing.on-call-org]] per month per organization: a response within a business day, a file fix in the engine within five days, builds with fixes as they are ready. For one person — \[\[var:pricing.on-call-person]] per month. The price and deadline are named before work starts; if the deadline is missed, you don’t pay. A change arrives as a build or a setting, verified on our test bench with your file, with a note on what changed and how to roll it back; your originals and your system are not touched.
## Key and operating modes
[Section titled “Key and operating modes”](#key-and-operating-modes)
A person working in the editor — the editor window, the mobile app, the web sandbox — is never limited by a key. A key is needed only for automated processing: the command line, the developer kit, the API, and server-side export.
| Mode | When | Limits |
| ---------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Full | Working in the editor — always; automated processing with a valid key that covers the product. | No limits. |
| Evaluation | Automated processing without a key, the first 60 days after the first launch on this machine. | No more than two operations in parallel, up to 1,000 documents per day, the “\[\[var:license.pdf-footer-mark]]” mark in the PDF footer. |
| Quiet | Automated processing without a key after 60 days. | One document at a time, a 3-second delay per operation, 100 documents per day, the same mark in the PDF. |
There is no refusal in quiet mode: parallel requests wait their turn, and an exhausted daily quota waits for the next day. A key covers the products named in it and remains valid for another 30 days after it expires.
## For developers
[Section titled “For developers”](#for-developers)
Environment variables for automated processing:
| Variable | What it does |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------- |
| `SUMOFFICE_LICENSE` | The key as a string; `SUMOFFICE_LICENSE_FILE` — the path to the key file. |
| `SUMOFFICE_SESSION_KIND=interactive` | Declares an interactive session — for the desktop shell that starts the processor on behalf of a person. |
| `SUMOFFICE_LICENSE_QUOTA_WAIT=fail` | Instead of waiting for the quota, return exit code 75 — for a service with its own queue. |
Concurrency in quiet mode is held by locks: the second request waits rather than being refused.
## What’s next
[Section titled “What’s next”](#whats-next)
* How verification works before the contract — [Pilot and acceptance](/platform/pilot/).
* What’s in the delivery — [What the delivery includes](/platform/delivery/).
* To request a written proposal or a pilot — [contact us](/start/contact/).
# What the delivery includes
> Exactly what you get: engines, a ready-made interface, server images, mobile kits, the capability matrix, the evaluation kit, and the operations package.
You do not get “the editor’s source code” but a developer kit together with a runtime: the contract, examples, the capability matrix, and acceptance scenarios. This means the integration rests on fixed commitments, not on reading someone else’s code.
| What’s included | What it is | What this gives you |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Document editor inside an application | Surface Host — a local SumDoc service in Rust with a built-in interface; it runs in your program’s window and listens only on a local address. | A DOCX editor inside your own desktop program, with no dependency on Electron. |
| Document editor in the browser | The SumDoc server image: each user gets their own core process with their own document. Published separately from the desktop installer — an image on Docker Hub and an archive in the release directory. | A DOCX editor in the browser inside your web product — [how it works and where to get it](/sumdoc/webhost/). |
| Spreadsheet processor in the browser | The same kind of server image for SumSheet: a process per user with its own copy of the workbook, sign-in through your system, file export and delivery. Published separately from the engine packages. | An XLSX editor in the browser when the core computes on the server — [the server path](/sumsheet/server/). |
| Mobile apps and the viewer kit | Ready-made apps for iPhone, iPad, Android, and the Mac App Store. A free viewer kit for Android and iOS — viewing only, for DOCX, DOCM, XLSX, and XLSM — ships under the same version number as the store build, with a checksum. Editing inside your app is the editing kit, licensed per app. | A document or spreadsheet on the phone without your own server and your own screens — [phone and tablet](/start/mobile/). |
| Spreadsheet engine packages | SumSheet builds for the desktop app and for the browser, the operation contract adapter, workbook and session state. The [embedding examples](/sumsheet/examples/) are assembled from these packages; they are not published to the public npm registry. | Formulas, history, import and save for spreadsheets — and the choice of where the core runs. |
| A surface under your brand | A ready-made interface: the document canvas or the spreadsheet grid, dialogs, commands, theme, and language. | A working editor inside your product without building an interface. |
| A public interface | Stable methods for opening, executing, subscribing to events, saving, and closing; types, errors, and declared capabilities. | An integration that does not depend on internal names in the code. |
| Application adapters | Examples for a window inside a desktop program, for the browser, for local exchange, and for working with storage. | A short path from the first try to a pilot. |
| Capability matrix | Format × runtime × operation × read, edit, save, and markup preservation × limitations. Part of it is open already: [13 spreadsheet formats](/reference/sumsheet/formats/) and [what you can do with each file in documents](/sumdoc/overview/#which-files-it-works-with). | “We support the format” becomes a verifiable commitment. |
| Evaluation kit | Examples, sample documents, an end-to-end path on a real file, the expected result of each step, notes on logging and security. | Your engineer opens their own document in 30–60 minutes, or builds a technical prototype. |
| Architecture specification | A document for architects: protocol, session lifecycle, security, versioning, deployment, and acceptance. Issued together with the evaluation kit. | The integration can be designed before the first call — [where to start a pilot](/sumdoc/handoff/). |
| Operations package | Signatures of delivery files, component inventory, the vulnerability handling process and response times, migration notes between versions, release and update rules. Which signatures exist in the current release and which do not yet is listed under [risks](/platform/risks/). | A runtime that a corporate operations team will accept. |
What isn’t part of the delivery
Source code and unlimited access to all internal commands: the set of capabilities is defined by the chosen profile. Instead — a named public developer kit with a fixed lifecycle, support period, long-term version support, security requirements, and acceptance scenarios. For documents this kit works today — it is the session contract and the surface. For spreadsheets it is still being separated from the internal contract, and its contents are fixed by agreement, not implied: [what is in it today](/sumsheet/embedding-api/).
## For developers
[Section titled “For developers”](#for-developers)
* Server images: `docker pull hissih/sumdoc-webhost:latest` for documents and `docker pull hissih/sumsheet-webhost:latest` for spreadsheets. The image archive is in the `webhost/` folder of the release directory — `https://dl.layers.md/sumoffice/sumdoc/release/latest/webhost/` and `https://dl.layers.md/sumoffice/sumsheet/release/latest/webhost/` — together with `INSTALL.md` and `SHA256SUMS`.
* Spreadsheet engine packages — `@sumsheet/*`; the viewer kit for the phone ships with a sha256 checksum.
* Where to start checking: [installing SumDoc](/sumdoc/install/) and the [quick start](/sumdoc/quickstart/), [installing SumSheet](/sumsheet/install/) and the [quick start](/sumsheet/quickstart/).
# Embedding modes
> Eight ways to connect the platform—from a ready-made surface to a server inside your perimeter and a preview without an editor: when to choose each one and what is mandatory in all of them.
You don’t have to adopt the whole platform at once. You can start with a ready-made surface inside your product and then deepen the integration—to headless operation, to a separate process or to the core right in the browser. The meaning of a command doesn’t change along the way: it’s defined by the contract, not by the way data is transported.
Two things matter for the decision: where your product lives and where the data must stay. The mode is chosen by these two questions.
| Mode | When to choose it | Readiness and boundaries |
| ----------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| SumDoc inside a desktop application | You need a full DOCX editor inside your Windows or macOS program. | Verified on macOS; acceptance on Windows must be run separately. The reason is not a formality: on macOS text width is measured by the system font engine, on Windows and Linux by a portable one, so identical pagination across systems is not promised. That is exactly what to check at acceptance—on your own documents and your own fonts. |
| SumDoc in the browser | Your product lives on the web, and the user doesn’t need to install anything. | Works. The document is computed by the core on your server, one process per user. Several people edit one document at the same time: others’ input is visible immediately, the one who opened it first writes to the file, the rest are co-editors or observers as chosen at sign-in—[the editor in the browser](/sumdoc/webhost/). |
| SumDoc headless | Batch processing, services, and agents that don’t need a screen. | Works as the session protocol; which part of it becomes public is agreed separately. |
| SumSheet in the browser | Embedding in a web product when data must not leave the browser. | Works. The core computes in the page’s memory and itself picks the fastest build the browser allows; if it didn’t take a faster one, it names the reason. The fastest, multithreaded build requires configuration on your site and a separate delivery—[the core in the browser](/sumsheet/wasm/). |
| SumSheet as a separate process | Offline operation, local files, full speed. | Works. The process must be monitored, shipped with updates and shut down correctly—[a separate core process](/sumsheet/native/). |
| Hybrid mode | A web interface, but with access to the file system and OS rules. | You need a secure channel between the interface and the core and a well-thought-out window lifecycle. |
| A server inside your own perimeter | Centralized processing, agents, pipelines. | A separate production architecture: access checks, isolated sessions, quotas and operations tooling—[the processor on a server](/sumsheet/server/). |
| Preview without an editor | You need thumbnails, read-only pages or PDF from DOCX and XLSX, but no editor. | Works. One container with the SumDoc and SumSheet cores; the file is erased after the response, and no network is needed once the image is downloaded. PDF from a workbook is not produced yet, presentations and ODS are not accepted—[preview without an editor](/platform/preview/). |
## What’s required in every mode
[Section titled “What’s required in every mode”](#whats-required-in-every-mode)
* One open document per process — the simplest and safest isolation for a pilot.
* The application learns the contract version before it shows the interface or sends the first command.
* Tokens, addresses, credentials, document text, and its source markup don’t go into logs by default.
* Closing releases everything: listeners, connections, background threads, files and child processes.
* An unknown command or capability is never executed silently: work stops, or a refusal with a reason comes back.
## For developers
[Section titled “For developers”](#for-developers)
* How each mode works: SumDoc—[platforms and deployment](/sumdoc/deployment/); SumSheet—[the core in the browser](/sumsheet/wasm/), [a separate core process](/sumsheet/native/), [the processor on a server](/sumsheet/server/), [phone and tablet](/sumsheet/mobile/).
* SumDoc desktop mode: your application plus a local service per document; HTTP and WebSocket on the local interface only; a WebView2 or WKWebView window. Headless mode: JSON lines over standard input/output, or WebSocket with a token.
* The multithreaded SumSheet build in the browser is enabled only when two conditions hold at once: the COOP and COEP isolation headers on your site and SIMD support in the browser; without either of them the core takes a simpler build and names the reason—[the core in the browser](/sumsheet/wasm/).
* For the processor, the contract version is reported by the greeting line—it is read first; in the browser there is none, and the version is requested from the session with a `contract_version()` call—[SumSheet runtimes](/sumsheet/environments/).
* The success flag in the response envelope is not the whole story: for a document edit, the outcome is named in a separate field—[how to read a response](/sumdoc/envelope/).
# What's promised, and what isn't
> Behind general phrases like “full compatibility” and “white-label delivery”: what's promised and verifiable, and what's fixed separately. Plus the questions worth answering before you start integrating.
Office engines are usually described in general words: “an Office replacement”, “full compatibility”. Such words can neither be verified nor fixed in a contract. Below is what stands behind each of them in the case of SumOffice: on the left the familiar wording, on the right what is actually promised and verifiable on your files.
| General phrasing | What’s actually promised |
| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A replacement for Word and Excel. | An embeddable office processor for your product: editing DOCX and XLSX files, saving with a reopen check, automation, and an interface under your brand. |
| Full compatibility with Microsoft Office. | Matching behavior on an agreed set of your documents, for the listed capabilities, and within the bounds of the declared matrix. |
| We support XLSX and DOCX. | For every format and every operation, it’s recorded separately: whether it’s read, edited, saved, and whether unsupported markup is preserved. This is already public: [13 spreadsheet formats](/reference/sumsheet/formats/) and [what you can do with each file type in documents](/sumdoc/overview/#which-files-it-works-with). |
| We have VBA. | Its own runtime for an agreed subset: inspect the project, see the plan and the changed cells before running, run with a limit, apply or roll back. What is not supported—COM, external libraries, certain statements—is rejected with a message rather than faked; the contents of the subset are fixed in the matrix. |
| We have Power Query. | Queries are read, saved without loss, and refreshed by its own M language engine: sources, steps, preview, load, refresh. An unsupported source gets an explicit refusal with a migration path rather than a silent failure; the list of supported sources is fixed in the matrix. |
| We’re the fastest. | Instead of a slogan, measurements on your own documents: typical and worst-case time, memory, the amount of data loaded, saving and reopening. |
| White-label delivery. | You own the shell, the brand, sign-in, storage, and processes; SumOffice is responsible for the meaning of the document and the spreadsheet. |
| An agent edits the document. | An agent works through the same operations contract and history as a human: inspect, plan, preview the result, get confirmation, apply or roll back. |
## The platform in brief
[Section titled “The platform in brief”](#the-platform-in-brief)
Note
SumOffice is an embeddable office platform for anyone who needs their own editor, on par with Word and Excel, inside their product. You keep your brand, users, storage, security, and workflows. We deliver SumDoc for DOCX, SumSheet for XLSX, the Rust core, a ready-made editor surface, a developer kit — already working for documents, still taking shape for spreadsheets — automation, and a capability matrix. It all starts with a limited pilot on your real documents and ends with an enterprise profile that includes acceptance, availability commitments, and a version-support period.
## Questions before you start
[Section titled “Questions before you start”](#questions-before-you-start)
* Which operating systems, which technology is your application built on, and which embedding method do you need at the first stage?
* Which three to five of your real documents will decide whether the product fits?
* Which ten user actions need to work without Microsoft Office?
* Which of these are critical: comments, tracked changes, tables, fields, headers and footers, formulas, charts, pivot tables, Power Query, VBA?
* Where are documents stored: on the computer, inside your perimeter, in the browser, in a document-management or accounting system, in the cloud?
* What are the security requirements: where the data physically resides, leak control, logging, the delivery inventory, signatures, audit?
* Do you need agents, and which operations are they allowed to read, propose, and apply?
## Next
[Section titled “Next”](#next)
* Verify what’s promised on your own files — [Pilot and acceptance](/platform/pilot/).
* What’s locked in by the contract — [Commercial packaging](/platform/commercial/).
* What isn’t covered yet — [Risks and honest boundaries](/platform/risks/).
* Start small — [early access request](/start/beta/).
# Feature parity with Word and Excel
> How to state parity correctly: seven levels — from everyday scenarios to operations — and how to prove each one.
Nobody has full parity with Word and Excel except Microsoft Office itself. A promise of “feature parity” without qualification means nothing and can’t be verified. That’s why parity is broken down into tiers—and at every tier there’s a way to check on your own files.
| Tier | What it means | How it’s proved |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| By scenario | The user performs their everyday actions without switching to Microsoft Office. | An agreed acceptance scenario inside your application. |
| Format openability | DOCX, XLSX, XLSB, ODS and CSV open in the chosen runtime. Opening isn’t the same as editing and saving: these are separated by row—[spreadsheet formats](/reference/sumsheet/formats/), [what you can do with each file in documents](/sumdoc/overview/#which-files-it-works-with). | Open the entire agreed set of documents and review every warning and refusal. |
| The editing corridor | The agreed capabilities work correctly: text, tables, formulas, formatting, comments, sheets, charts. | Compare the document’s meaning before and after editing, for every capability on the list. |
| Save | A saved file reopens without losing its meaning or structure. | Reopen it in a new process, ideally twice, and separately verify the “saved here, opened in Word or Excel” round trip. |
| Preservation of the unsupported | What the editor doesn’t understand is preserved unchanged, or explicitly flagged. | Compare the file’s contents before and after, including the relationships between parts. |
| Automation | Macros, queries, and agents work within the supported subset; everything else is recognized and explained. | A capability matrix, explicit refusals instead of silent errors, an action log. |
| Operations | Offline operation, on-premises installation, security, updates, and the lifecycle meet enterprise deployment requirements. | A security checklist, full resource release on shutdown, the delivery inventory and signatures — what’s already there today is listed in [Risks](/platform/risks/). |
What’s promised
SumOffice provides an embeddable platform on par with Word and Excel, with parity over an agreed set of documents and a capability profile. In specific respects — embedding into someone else’s product, manageability, explicit refusals, preserving unsupported markup, readiness to work with agents — the platform can be stronger than familiar office suites, even without replicating every Microsoft Office feature.
## Why this is stronger than the usual “we support XLSX/DOCX”
[Section titled “Why this is stronger than the usual “we support XLSX/DOCX””](#why-this-is-stronger-than-the-usual-we-support-xlsxdocx)
* What matters to the customer isn’t a list of file extensions, but that nothing was lost after saving.
* What decides a migration are the specifics: data queries, macros, links to other workbooks, charts, pivot tables, styles, comments, tracked changes, headers and footers, and fields.
* Whoever embeds the editor in their product cares about more than looks: the lifecycle, memory consumption, full resource release on shutdown, update compatibility and observability.
* The capability matrix turns an argument into a verifiable agreement: what is read, what is edited, what is saved, what is preserved as-is without parsing, and what is rejected.
The matrix doesn’t use free-form language. The spreadsheet delivery contains a closed list of eight states, and every cell gets one of them:
| State | What it means |
| ------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Absent | This part wasn’t present in the workbook under test. |
| Not documented | This part is on the list, but the product can’t recognize it yet — and doesn’t pretend that it can. |
| Detected, not interpreted | Its presence is detected, but the product doesn’t assign it meaning and doesn’t promise to preserve it. |
| Preserved only | The part passes through open and save as opaque data: it won’t be lost, but it won’t be understood either. |
| Cached value only | What’s shown is whatever Excel wrote; the product doesn’t promise a live recalculation. |
| Partial | There’s live behavior, but coverage is narrow, and that’s stated outright. |
| Blocked by policy | The part is recognized, but running it is deliberately blocked — by a product rule or a security policy. |
| Fully live | Its meaning is modeled and kept live, without relying on cached values. |
The difference between “preserved only” and “cached value only” is the boundary people usually argue about: in the first case the part of the workbook comes back unchanged, in the second you’ll see a number, but it wasn’t recalculated by us.
A state is assigned not to the workbook as a whole but to its parts. The list of parts is closed too—ten families:
| Workbook part | What it includes |
| ----------------------------- | ------------------------------------------------------------------------------------------------------ |
| Macros | Automation built into the workbook: VBA and the like. |
| Add-ins | Functions and commands that come from add-ins. |
| External data | Connections and refreshable queries. |
| External references | References to other files and workbooks. |
| Names and hidden dependencies | Named ranges, hidden areas—everything that affects the workbook’s meaning without appearing on screen. |
| Tables | Structured tables, their styling and behavior. |
| Pivots and the data model | Pivot tables, their caches, slicers and the data model. |
| Protection and trust | Protection flags and parts restricted by trust rules. |
| The import/export round trip | Parts where what matters isn’t behavior but import accuracy and preservation on export. |
| Provenance and diagnostics | Parts that explain why content was preserved as-is, blocked, or shown from a cache. |
The matrix is the intersection of the two lists: every workbook part has its own state. The question “do you support macros” turns into “what state do macros have in my workbooks”, and that one has a verifiable answer.
## What to measure with
[Section titled “What to measure with”](#what-to-measure-with)
* 41 commands of the SumDoc document session—for developers: [Session Protocol reference](/reference/sumdoc/session-protocol/).
* 208 operations in the SumSheet contract; which of them the core of the latest release accepts is stated in the [Compute Contract reference](/reference/sumsheet/overview/). Take the release as the yardstick for acceptance: what is described but not yet in the build can’t be verified on your workbooks.
* What’s available today, and what’s part of the pilot — [SumDoc readiness and boundaries](/sumdoc/status/) and [SumSheet strengths and trade-offs](/sumsheet/tradeoffs/).
# Pilot and acceptance
> How to prove the promise: what is verified, the two-week pilot plan, and what the go or no-go decision is based on.
A pilot proves real embedding, not a presentation: your document opens inside your application, is edited, saved, and reopened without loss. The go or no-go decision is made against written criteria, and the report stays with you either way.
## What is verified
[Section titled “What is verified”](#what-is-verified)
| What we verify | What counts as passed |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Opening | A real document or workbook opens inside your application; no separate editor window appears. The declared capabilities are visible. |
| Editing | The user performs the agreed edits; each edit creates one history entry, and the application learns about unsaved changes. |
| Saving | The file is returned to your application; the right to save is declared explicitly. |
| Reopening | The saved file reopens from a cold start without loss of meaning or integrity — for documents and for spreadsheets. |
| Events | The application receives the open (`ready`), change (`dirty`), save (`saved`), error (`error`), and close (`unmounted`) events; events of a white-label delivery are by agreement. For spreadsheets, the event contract is fixed and versioned, but the part that implements it isn’t in the release yet: you can write code against the names today, but you can’t run it, and this row can’t be verified for spreadsheets during the pilot ([what the kit includes](/sumsheet/embedding-api/)). |
| Security | The token and credentials don’t leak, the service listens only on the local address, document content doesn’t end up in logs; the policy is checked before opening, saving, and any network call. |
| Resource release | After closing, no processes, connections, or background tasks remain. |
| Performance | Startup, opening, editing, recalculation, saving, and memory on the agreed classes of documents and workbooks. |
## Pilot plan: two weeks
[Section titled “Pilot plan: two weeks”](#pilot-plan-two-weeks)
A pilot is a structured two-week verification on your document corpus with written acceptance criteria: what opens, what survives the “open — save — open” round trip, and what performance you see.
| Stage | Duration | Result |
| -------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Assessment | 1–2 business days | Choice of platform and server side, key scenarios, document corpus, acceptance criteria, security requirements, and the business owner on your side. |
| Prototype and measurements | by the end of the second week | Opening, editing, saving, and reopening real DOCX and XLSX files from your corpus inside your container; performance measurements against the acceptance criteria. |
| Decision: go or no-go | 1 meeting at the end of the second week | A report against the acceptance criteria, the final list of capabilities, the list of work before production use, a commercial estimate, and the expected commitments on availability and version support period. |
| Work for your process | after the decision, by estimate | Styling under your brand, a storage adapter, single sign-on and audit, events, selected product routes. These are not part of the pilot: they are changes for your process, with a price and a deadline named in advance — [commercial packaging](/platform/commercial/). |
When a pilot counts as successful
A pilot is successful only if the chosen capability profile works in your real application, saves documents, survives a cold-start reopen, leaves no hidden processes or handlers behind, and never puts secrets into logs.
## For developers
[Section titled “For developers”](#for-developers)
* What to give your engineers and in what order to read it — [How to start a pilot](/sumdoc/handoff/).
* The list of checks before a pilot — the [SumSheet checklist](/sumsheet/checklist/) and the [SumDoc checklist](/sumdoc/diagnostics/).
* Event names: for documents — [SumDoc embedding](/sumdoc/embedding/), for spreadsheets — [the embedding kit](/sumsheet/embedding-api/). The evaluation kit is described in the [glossary](/start/glossary/).
# Preview without the editor
> One container with the SumDoc and SumSheet cores: a thumbnail, pages for reading, and PDF from DOCX and XLSX—what it gives you, the limits, and the requests for a developer.
Not every place in a product needs an editor. A file list needs a thumbnail, a card needs pages for reading, a “download” button needs a PDF. For that there is a separate preview container: it turns DOCX and XLSX into an image, pages, or PDF and stores nothing.
For the business this means: you can show a document in your product without the editor and without sending files outside.
## What it does
[Section titled “What it does”](#what-it-does)
* A thumbnail of the first page of a document or the first sheet of a workbook.
* All pages of a document or all sheets of a workbook in a form ready for reading in the browser.
* A PDF of the document. PDF from a workbook is not produced yet: the spreadsheet core does not print to PDF, and such a request gets a refusal with a reason.
Inside are the SumDoc and SumSheet cores and fonts with Office metrics, so pages break the same way as in the editor. The response reports whether everything was rendered: how many pages out of how many, whether there are scripts missing from the built-in font, and how many formulas are shown empty because the workbook holds no values for them.
## Limits
[Section titled “Limits”](#limits)
* Presentations are not accepted—until the third editor appears; ODS is not supported yet. An unknown format gets a refusal with a clear message.
* The service does not accept files larger than 50 MB; the limit can be changed.
* The request directory is wiped right after the response; the service makes no outbound calls, and no network is needed after the image is downloaded.
* Viewing is free; production use is under the license for the embedding application—[commercial packaging](/platform/commercial/).
## For developers
[Section titled “For developers”](#for-developers)
Start:
```sh
docker run -d -p 8099:8099 hissih/sumoffice-preview
```
One container, about 224 MB. Allow roughly 250 MB of RAM for each document processed concurrently. The file size limit is set by the `PREVIEW_MAX_MB` environment variable.
| Request | What it returns |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `POST /thumb?w=320` | A PNG of the first page of a document or the first sheet of a workbook as a grid of values. The width `w` is from 64 to 2000 pixels; a value outside the range is clamped to the nearest bound. |
| `POST /pages` | Self-contained HTML: all pages of a document or all sheets of a workbook as tables. |
| `POST /pdf` | A PDF of the document. For a workbook—a 415 refusal with a reason. |
| `GET /health` | A check that the service is alive. |
The file is passed as the `file` field of a `multipart` form or as the raw request body—then the file name is given by the `?name=report.docx` parameter or the `X-File-Name` header. An unknown format gets a 415 refusal.
```sh
curl -F file=@report.docx http://localhost:8099/thumb?w=320 > thumb.png
curl -F file=@report.docx http://localhost:8099/pages > report.html
curl -F file=@report.docx http://localhost:8099/pdf > report.pdf
curl -F file=@book.xlsx http://localhost:8099/pages > book.html
```
Response headers—they are used to decide whether to show the result as complete:
| Header | What it means |
| ----------------------------------------- | --------------------------------------------------------------------------------------- |
| `X-Preview-Pages` | How many pages the document has according to the PDF. |
| `X-Preview-Coverage`, `X-Preview-Partial` | How many pages were rendered out of how many; `Partial: true` if fewer than in the PDF. |
| `X-Preview-Scripts-Outside-Font` | Scripts missing from the built-in font—they may have rendered incorrectly. |
| `X-Preview-Sheets`, `X-Preview-Cells` | How many sheets and cells the workbook has. |
| `X-Preview-Uncomputed-Formulas` | How many formula cells are shown empty: the workbook holds no values for them. |
## Next
[Section titled “Next”](#next)
* The other embedding modes—[Embedding modes](/platform/deployment/).
* The same container path, but with the editor—[the SumDoc editor in the browser](/sumdoc/webhost/) and [the SumSheet processor on the server](/sumsheet/server/).
# Your own office instead of Microsoft Office
> DOCX and XLSX editors inside your product and your perimeter, under your brand: what this gives a company, what already works, and how to verify it in an hour.
Business documents still live in DOCX and XLSX: contracts, estimates, deliverables, and reports. Some of them are not documents but applications: formulas, macros, Power Query, form controls. A workbook that calculates is a program, and leaving Microsoft means keeping it running. The choice is usually between bad options: shipping documents to someone else’s cloud, or moving people to an editor that cannot be embedded in your own processes.
**SumOffice is an independent office platform whose engines embed in your product.** Not another office suite next to yours, but a document and spreadsheet editor inside it: under your name, inside your perimeter, with your access rights and your storage. The platform has no ties to Microsoft.
## What you get instead of someone else’s office
[Section titled “What you get instead of someone else’s office”](#what-you-get-instead-of-someone-elses-office)
| Today, with someone else’s office | With SumOffice |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| The document opens in an external application or someone else’s cloud | The document opens inside your product; files never leave your perimeter |
| The editor carries someone else’s name and interface | The editor carries your name, your colors, and your navigation |
| Permissions and audit live separately from the document | Your system checks permissions; every action goes through the contract |
| “Supports DOCX” is a promise in words | A capability matrix: what’s read, what’s edited, what’s preserved without loss |
| Automation is macros nobody knows about | The agent works through the same contract as a person: preview, confirmation, rollback, log |
| A vendor update can break your integration | A versioned contract and a compatibility period, locked in by the agreement |
## Leaving Microsoft: four steps
[Section titled “Leaving Microsoft: four steps”](#leaving-microsoft-four-steps)
Not a feature list, but a check your team will run. Each step is a real file on a real server, and the result says outright what is not there yet.
1. **Upload a workbook** — [on the check page](https://view.sumoffice.com/check/) or send it to the [check bot](https://sumoffice.com/bots) in Slack or Telegram. Nothing in it is executed; the file is deleted after 24 hours.
2. **Read the report**: every macro with its route, functions known and unknown to the engine, data sources — as “N of M”.
3. **Open the same workbook in the browser** on our server: formulas recalculate, macros follow their routes, nothing is installed.
4. **Save and open in Excel**: the VBA project byte for byte, values in place.
A macro or a Power Query source the engine does not carry yet is a change for your process: \[\[var:pricing.change-c]] per item, the whole corpus by estimate, price and timeline stated before work starts — [Commercial packaging](/platform/commercial/#changes-for-your-process).
## You can try this right now
[Section titled “You can try this right now”](#you-can-try-this-right-now)
Not a presentation and not a screen recording, but a working program: both editors open right on the site, in the browser, with nothing to install. If the demo environment is down at that moment, a snapshot takes the place of the frame — and the page says so outright.
The SumDoc document editor
A two-page contract: headings, lists, a table with dates and an amount. Open it, edit a paragraph — the document lives in your own sandbox.
[Open the live example →](/sumdoc/demo/)
The SumSheet spreadsheet processor
An office-equipment budget with formulas. Change a quantity or a price — the core recalculates the totals, the shares, and both sums, not the page layout.
[Open the live example →](/sumsheet/demo/)
For developers, there are worked embedding projects with full code next to it: [twenty-three examples for spreadsheets](/sumsheet/examples/) — from a minimal sheet to a million-row workbook, collaboration, and links between workbooks — and [a project for documents](/sumdoc/examples/).
## Why this isn’t a wrapper around someone else’s editor
[Section titled “Why this isn’t a wrapper around someone else’s editor”](#why-this-isnt-a-wrapper-around-someone-elses-editor)
The meaning of the document belongs to its own core: it parses the file, computes layout and formulas, keeps the history, and writes the result back. The interface only shows and asks — it has no copy of the document of its own. For you this means the result is the same in the desktop app and in the browser, and that one side is responsible for it.
* **A verifiable boundary.** 41 document session commands and 208 spreadsheet contract operations are exposed, each described in the reference, and the reference is checked against the code on every documentation change. Which operations the core of the latest release accepts, and which are described but not yet in the build, is stated separately. For developers — the [SumDoc reference](/reference/sumdoc/overview/) and the [SumSheet reference](/reference/sumsheet/overview/).
* **Formats are named one by one.** 13 spreadsheet formats, including XLSX, XLSB, XLSM, ODS, and CSV — with a [matrix](/reference/sumsheet/formats/) that says for each what can be opened, what can be edited, and where it can be saved. The document side handles DOCX and exchanges **eight more formats**: PDF, ODT, flat ODT, RTF, HTML, plain text, EPUB, and FB2 — all in both directions except PDF, which is print only. [Which files it works with](/sumdoc/overview/#which-files-it-works-with).
* **Refusal instead of silent corruption.** An unsupported operation gets an explicit refusal with a reason **before** the file changes. There is no such thing as a half-written document: the file is published in one atomic action, and the editor refuses to overwrite an edit made by someone else.
* **Preserving what’s not understood.** Parts of the file the editor doesn’t parse carry over into the new file as-is, instead of disappearing on save.
* **Speed you can see, not just a promise.** A [million-row sheet](/sumsheet/examples/stress/) is open right on the site: scroll it, and it shows you the frame cost itself — typical, worst-case, and whether it stayed within budget. The measurement runs on your machine, not in our presentation.
* **Works without a network and without a cloud.** A desktop app, a window inside your program, the browser, a server inside your perimeter, a phone — the same contract in every environment. The core never calls out; the only outbound channel is in the ready-made apps — the support assistant with error reports, and it is described under [security](/platform/security/). The SumDoc and SumSheet mobile apps are released for iPhone, iPad, and Android, and for macOS. For embedding in your own app there is a free viewer kit for Android and iOS — the same engine as in the store builds, under the same version number; editing inside your app is the editing kit, licensed per app ([phone and tablet](/start/mobile/)).
## What we compare ourselves to
[Section titled “What we compare ourselves to”](#what-we-compare-ourselves-to)
With Word and Excel — there’s nothing else to compare against. They’re what’s already on your people’s desks, your contracts and estimates are written in them, and they’re exactly what the result will be measured against.
But the comparison isn’t about the number of buttons. Office is a finished product for a workstation; you buy it so a person can open a file. You buy SumOffice so that **an office appears inside your product**: not an application alongside it, but an engine inside it, under your own name.
Exactly what the product does with the file is broken down by task: the [SumDoc capability map](/sumdoc/capabilities/) for documents and the [map next to Excel](/sumsheet/atlas/) for spreadsheets. What parity means and how it’s confirmed — [Feature parity](/platform/parity/).
## How this is verified at your end
[Section titled “How this is verified at your end”](#how-this-is-verified-at-your-end)
We don’t ask you to take our word for it. Verification happens on your own files and inside your own perimeter, in steps known in advance:
15 minutes
The core responds, your DOCX is open, a paragraph is changed and saved as a separate file. Step by step, for a developer — in the [quick start](/sumdoc/quickstart/).
30 minutes
The same document, but now inside your application: the editor in your window, editing, saving, events. The steps are in [How to start a pilot](/sumdoc/handoff/).
2 weeks
The full pilot: a check on your document corpus with written acceptance criteria, measurements, and a “take it or not” decision; the report stays with you either way. Stages and timelines — in [Pilot and acceptance](/platform/pilot/).
What the contract locks in — the capability profile, the platform matrix, acceptance scenarios, support terms, and security commitments — is gathered in [Commercial packaging](/platform/commercial/).
## What’s next
[Section titled “What’s next”](#whats-next)
[Submit an early access request](/start/beta/)Three fields. We will send the builds and tell you outright what already works and what is still rough.
[What you get: in short](/platform/story/)The product formula in three parts: what you bring, what the platform does, what comes out.
[Risks and honest boundaries](/platform/risks/)What isn't covered yet, and what covers it. No rollout conversation is complete without this page.
[What embedding gives you that Office doesn't](/platform/advantages/)Not “we're better”, but a list of the places where embedding gives you something a ready-made office suite can't.
[What's promised, and what isn't](/platform/messaging/)The claims we're ready to defend during a pilot, and the ones we deliberately avoid.
[VBA, Power Query, and agents](/platform/automation/)Automation without losing control: a supported subset, a Power Query ladder, and agent work as a single transaction.
[What's coming next](/platform/roadmap/)Where the platform is heading, and what will arrive before the rest.
# Risks and honest boundaries
> What can't be promised without a separate agreement, and which limits need to be spelled out in advance.
Promising “full Office” without criteria is easier, but such a promise can’t be verified. So this page names what’s still open and what closes it. Without this page, a conversation about rollout is incomplete.
| Risk or open question | Why it matters | What covers it |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| What will be in the public interface | There are more internal capabilities than can be declared public and then supported for years. | A locked public interface, types, and versioning rules. |
| Fidelity of round-tripping | A file opening doesn’t yet mean it will come back from the editor without loss. | A matrix of critical documents and capabilities, before-and-after file comparison, a reopen check. |
| Archival PDF/A | For archives and legal or government records management, this is a condition of admissibility, and plain PDF isn’t enough there. | Plain PDF export works, including with embedded fonts; PDF/A-1b readiness is checked with a separate command, and export to that format itself is still closed and runs through your own verification program — [what you can do with each file type](/sumdoc/overview/#which-files-it-works-with). |
| VBA | Security requirements and incomplete compatibility clash with expectations that it “just works”. | A matrix of supported calls, a list of refusal kinds, security rules, and a ban on changing the document silently. |
| Power Query | Rollout most often runs into exactly this: queries, connections, and the data model. | Recognition and preservation first; refreshing and editing queries as a separate stage; acceptance by comparing files. |
| Speed claims | The market is already oversaturated with slogans like “ten times faster”, and arguing with slogans is pointless. | A reproducible benchmark on your own documents, fixed hardware, thresholds for typical and worst-case time. |
| Confirmation on every system | Verification on one system doesn’t automatically carry over to the others. | Separate acceptance on every declared system and in every embedding method. For documents, look at pagination first: text width is measured by the engine of the system where the core runs — the system engine on macOS, a portable one on Windows and Linux. Spreadsheets don’t have this cause: SumSheet doesn’t use system font engines; widths are taken as declared in the workbook itself. |
| A server with many clients at once | Working in a desktop application doesn’t carry over to a cloud service. | A separate architecture: quotas, access checks, a task queue, isolating clients from each other, observability. |
| Packaging and signing | An unsigned file won’t pass enterprise deployment. | Not everything is signed yet, and it differs by product — the list is below. Wherever there’s no signature, checksum verification remains; how to check is shown on the installation pages for [SumDoc](/sumdoc/install/) and [SumSheet](/sumsheet/install/). |
| Version support | You depend on how long the version your product is built on stays supported. | A support period, deprecation rules, migration guides, an escalation process. |
## What is signed today
[Section titled “What is signed today”](#what-is-signed-today)
* **SumDoc.** The macOS app is signed with a Developer ID certificate and notarized by Apple; the Windows installers carry no signature.
* **SumSheet.** The app in the `.zip` archive is signed and notarized — verified on a downloaded build: the system answers `accepted` and `source=Notarized Developer ID`; the `.dmg` image from the same folder carries no notarization. The Windows installers are signed with a **test certificate**, “SumOffice Test Signing (DEVELOPMENT ONLY)” — the system will warn about an unknown publisher; this signature isn’t confirmed by the release evidence, so check it on the downloaded file yourself.
* **Both products on Linux.** The `deb` and `AppImage` packages have a detached `.asc` signature next to them; `rpm` doesn’t.
## Decisions to make before you start
[Section titled “Decisions to make before you start”](#decisions-to-make-before-you-start)
* Your target operating systems, your application’s technology, the embedding method, and the deployment boundary.
* A dozen critical user actions and three to five real documents.
* Requirements for comments, tracked changes, tables, drawings, fields, sections, and headers and footers.
* Requirements for formulas, charts, pivot tables, external references, Power Query, macros, and data connections.
* What agents are supposed to do, what permissions they’re given, what goes into the audit trail, and who approves their actions.
* Where files come from and where they’re saved, how backups and recovery work, how leaks are caught, what gets written to logs, and where performance metrics go.
* What availability commitments are needed, how many years a version must be supported, how often updates ship, who’s responsible for rollout, and how vulnerability handling works.
An honest way to put it
The foundation is already there: a processor inside someone else’s product, and a shell you can replace with your own. Turning this into a deliverable developer kit doesn’t mean rewriting the product — it means formalizing the boundary: a stable public interface, packaged delivery files, documentation, acceptance, security, support, and a capability matrix locked in by contract.
## Next
[Section titled “Next”](#next)
* How these boundaries are verified on your documents — [Pilot and acceptance](/platform/pilot/).
* What the contract covers — [Commercial packaging](/platform/commercial/).
* In what order the rest gets covered — [What’s coming next](/platform/roadmap/).
* Start small — [early access request](/start/beta/).
# What's coming next
> What's not yet in the platform, in what order it will appear, and what each piece of work gives you. Plus a short formula for the offer.
Part of the platform hasn’t been brought to delivery yet, and it’s more honest to say so directly. Below is the order of work and what each piece will give you. You can plan a rollout by this list: it says what will appear before the rest.
| Order | What’s being built | What this gives you |
| ----- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | A single capability matrix | One list for both products: what opens, what can be edited, what’s preserved without loss, and where the boundaries are. You can check it before the pilot, not after. |
| 2 | Evaluation kit | Both surfaces, a sample application, a quick start, and a correct result known in advance — to compare with what you got. |
| 3 | A set of documents for comparison | Twenty to fifty real files, run through us and through other office suites. The difference shows up in the documents, not in promises. |
| 4 | What happens with macros | Which calls are supported, which are deliberately rejected, under what security rules, and what to do with the ones that aren’t supported. |
| 5 | What happens with data queries | On real workbooks: what’s recognized, what’s preserved on write, what you can view, what you can refresh, and what you can create from scratch. |
| 6 | Stable names and versions | Package and type names will stop changing between releases, and versioning rules will tell you in advance whether an update will break your build. |
| 7 | A kit for the security team | The delivery inventory, signatures, the update and rollback process, vulnerability-fix timelines, and telemetry rules. |
## Where the conversation starts
[Section titled “Where the conversation starts”](#where-the-conversation-starts)
The platform’s formula fits in one sentence: your product plus SumOffice’s engines equals your own office platform. The detailed account exists as a foundation, so the short materials don’t promise more than they should.
Where to start verifying
Take one real Word document and one real Excel workbook — ones that actually circulate in your organization, not sample files. Decide where you’re embedding and where this will run.
Next comes an hour and a half of architecture review, then two weeks of a trial build through one full cycle: open, edit, get an event, save, close, and reopen, then compare against the original file. That comparison is what decides whether to move forward.
## The final formula of the offer
[Section titled “The final formula of the offer”](#the-final-formula-of-the-offer)
Summary
SumOffice isn’t another office suite. It’s an embeddable office platform: documents and spreadsheets live under your brand, in your sign-in and storage, inside your processes. The Word and Excel formats, layout, formulas, edit history, lossless saving, automation, agents, security, and compatibility — all on our side.
| What you get | What the end user gets | What the security team gets |
| ------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Libraries and cores for documents and spreadsheets | Editing documents and spreadsheets inside the product they already use | A versioned call contract, a delivery inventory, and signatures — to the extent they exist in the current release (the seventh row of the queue above covers what’s still missing from this kit) |
| A ready-made interface — keep it as is, or replace it with your own | The work never leaves the application they already use | Document content never goes into logs — this is a condition of delivery; policies, leak control, audit |
| Adapters and scaffolding for your stack | Real documents open and save on day one | The lifecycle under control, acceptance that verifies no leaks |
| A capability matrix and a set of acceptance documents | Fewer unexpected losses during migration | Promises you can verify on your own files |
| A path for automation and agents | Scenarios run without manual clicking | Preview, approval, audit, and rollback |
### The platform in brief
[Section titled “The platform in brief”](#the-platform-in-brief)
SumOffice gives your product its own embedded office engine: Word-grade documents and Excel-grade spreadsheets under your brand, in your storage, inside your security perimeter and your processes. The delivery includes the document and spreadsheet cores in Rust, an interface under your brand, a developer kit — working for documents, being finalized for spreadsheets — automation, and measurable compatibility through capability profiles and acceptance checks.
## What already works
[Section titled “What already works”](#what-already-works)
Plans are easier to read next to what already works today: [what SumDoc can do with a document](/sumdoc/capabilities/), [SumSheet’s capability map](/sumsheet/atlas/), and [the boundaries we state outright](/platform/risks/).
# Security, privacy, and operations
> Trust boundaries, secrets, storage, roles, logs, the supply chain, and lifecycle: what SumOffice provides, and what stays on your side.
In an embeddable product, security is not a section at the end of the contract but part of the contract itself: the boundaries run right along the calls. For a security team this means it is known in advance where the trust boundaries are, what goes into the logs, which credentials never leave, how the runtime is updated, and how resources are released.
The main rule: the core and the processor never call out. Documents stay inside your perimeter, and document content never goes into the logs.
| Area | What SumOffice is responsible for | What stays on your side |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Network boundary | For documents, the editor service listens only on a local address: it cannot be reached from outside, even from your own network. For spreadsheets in the browser there is no separate service at all — the core computes in the page’s memory, and the workbook never leaves. Data providers do not go to the network without explicit permission in either case. | Set the allowed source addresses, root directories, and network rules. |
| Secrets | The SumDoc editor service is protected by a pass, new on every start and valid while the service runs; secrets are cut out of the output, and credentials are passed as opaque identifiers. | Do not log passes, addresses, or credentials; choose where the performance metrics go. If you set your own pass, its strength and rotation on every start are your responsibility: the core only checks that the string is not empty. |
| Storage | The save contract, transfer as bytes or a stream, address-based access only with a declared capability, replacing the file in one atomic action. | Paths, access rights, backups, retention periods, leak control. |
| Read-only mode and roles | The restriction is checked when a command runs, not just by graying out buttons in the interface. | The roles themselves and permission decisions. |
| Logs | Counters, durations, codes, and checksums — without the document’s content. | Agree on what gets redacted, what goes into the audit trail, and how long it’s kept. |
| Supply chain | Signatures, component inventories, checksums, and update compatibility rules. Not everything is signed yet, and it differs by system — exactly what is verified today is summarized under [risks](/platform/risks/). | The rollout and rollback process, approvals, the support channel. |
| Lifecycle | Closing twice is safe; acceptance requires that no resource stays held after shutdown. | Monitoring the process, timeout rules, deciding what happens to an unsaved document. |
| Ready-made apps | The only outbound channel is the support assistant in the ready-made SumDoc and SumSheet apps. It sends to the support service only messages, problem reports, and automatic error reports: on desktop systems — a snapshot of the document window, a recording of the last minute of interface actions, and the app logs; on mobile — only the tail of the log. The same error is sent once, no more than five automatic reports per hour; there is no off switch. The support service is hosted by a partner ([privacy policy](https://sumoffice.com/app-privacy)). | Decide whether such a channel is allowed inside your perimeter; if it is not, do not deploy the ready-made apps — embed the core instead. |
## What can be collected without content
[Section titled “What can be collected without content”](#what-can-be-collected-without-content)
* the runtime version, the contract version, the capability profile identifier;
* the operation identifier, the command family, duration in milliseconds, the outcome class;
* document size to within a range and the number of structural elements — without the text itself;
* the reason the process ended, peak memory use, timeout and retry counters;
* versions of the system, WebView, browser, and runtime, and the update channel.
Don’t log
Tokens, full addresses, document text, comments, author names, source markup, workbook bytes, credentials, and absolute paths — unless a redaction rule is defined for them.
## What’s left of a redacted value
[Section titled “What’s left of a redacted value”](#whats-left-of-a-redacted-value)
Cutting out does not drop the value silently: a separate, deliberately sparse projection is built for the log. Whoever decides where such a log goes needs to know what it contains.
What remains of a value is its length in bytes, a `sha256` hash, and, for binary data, up to the **first sixteen bytes**. The bytes themselves, base64, and field contents are never carried over; for records with fields, only their count and a “cut out” mark remain. Credentials, addresses, and local paths are masked **before** the value gets into the projection. But sixteen bytes of binary data remain, and the hash of a short value can be brute-forced — for a log that goes outside, this is worth considering separately.
## For developers
[Section titled “For developers”](#for-developers)
For documents everything is collected on one page; for spreadsheets it is split by topic.
* The SumDoc service pass: 256 bits from the system’s source of randomness, new on every start; your own pass — [about `--token`](/reference/sumdoc/transport/). The minimal security model, the local address, and forbidden workarounds — [Responsibility and security](/sumdoc/responsibility/).
* SumSheet, where the data stays: in the browser the workbook lives in the tab’s memory — [the core in the browser](/sumsheet/wasm/); on the server, client isolation, quotas, and the log remain yours — [the processor on the server](/sumsheet/server/).
* SumSheet, boundaries for outside input: allowed directories and file types, a ban on passing a destination address from an external client — [integration into an application](/sumsheet/integration/).
* SumSheet, what never leaves: credentials and the source text of Power Query queries and macros don’t go into events — [runtimes](/sumsheet/environments/); source privacy levels — [trust and privacy](/reference/sumsheet/pq-trust/).
* What comes back in a refusal, and why a refusal is safer than silent corruption — [How the session API works](/sumsheet/session/).
# What you get: in short
> What you bring, what the platform does, and what comes out — the product formula in three parts.
SumOffice gives your product its own document and spreadsheet editor: under your name, inside your system, with your access rights and your storage. You bring the product and the perimeter, we bring the document and spreadsheet engines. Below is what comes out.
What is delivered is not a source archive and not someone else’s office suite with someone else’s interface, but an office processor inside your product—with a contract and commitments.
| What you bring | What you get |
| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Brand, name, domain, the interface shell, help, and training | The editor looks like part of your product, not an external service: your colors, your language, your set of commands. |
| Sign-in through your system, users, roles, licenses, audit | Documents stay inside your perimeter. Roles and rights are checked by your system, and every action leaves a trace in the audit log. |
| Storage: files, document management and accounting systems | Files are saved where you say, with no hidden cloud on the vendor’s side. Document management systems connect over WOPI, the standard file exchange protocol; verified on Nextcloud, while SharePoint and ownCloud have not been verified. If the file was changed from outside, the editor refuses to save and names the reason. |
| Your own real documents, a dozen key scenarios, critical features | Fidelity with Word and Excel is proven on your files rather than promised in general: a capability profile, an acceptance document set, and speed thresholds. |
| The list of platforms: browser, Windows, macOS, Linux, phones, your own perimeter | One product gets desktop, browser, server, and mobile variants. The document and spreadsheet apps are published in the App Store and Google Play, the desktop ones in the Mac App Store. For your own mobile app there is a viewer kit for Android and iOS—under the same version number as the store build: [phone and tablet](/start/mobile/). |
| Automation tasks: VBA, Power Query, agents, pipelines | Automation becomes controlled and verifiable: first show what will change, then confirm and apply. Anything unsupported is rejected with a reason rather than corrupting the file—[VBA, Power Query, and agents](/platform/automation/). |
| Working together on one document | Several people edit one DOCX or XLSX at the same time inside your perimeter. Proven for text and cells (measured with five participants and 119 scenarios); objects and formatting under concurrent input are still being measured. How it works on the server—[the editor in the browser](/sumdoc/webhost/). |
The formula in one line
Your product and sales channels + SumOffice’s document and spreadsheet engines + a surface under your brand, ready-made or replaced with your own = your own office platform, on par with Word and Excel, inside your perimeter.
* For you, this isn’t buying an editor — it’s an office processor as a component of your own industry platform.
* For your user, this isn’t a separate account and someone else’s window — it’s a familiar document or spreadsheet inside their current process.
* For security and operations, this isn’t a black box: the declared capabilities, error codes, collected metrics, lifecycle, update rules, and acceptance criteria are all fixed in advance.
Today the platform has two engines—documents and spreadsheets. The third, for presentations, is in development: a public beta is planned for December 2026, it cannot be downloaded yet, and PPTX compatibility, platforms, and speed are not promised.
Platform terms — capability profile, explicit refusal, preservation of the unsupported, white-label delivery — are explained in the [glossary](/start/glossary/).
## Next
[Section titled “Next”](#next)
* What exactly is delivered—[What is delivered](/platform/delivery/).
* What it looks like under your brand—[White-label setup](/platform/white-label/).
* How to verify on your own files—[Pilot and acceptance](/platform/pilot/).
# Customizing for your brand
> What you can change, and what stays in the core: brand, styling, navigation, commands, storage, users, events, and localization.
White-label delivery isn’t a cosmetic wrapper over someone else’s product; it’s a division of responsibility. The outward-facing product and the user journey belong to you. The meaning of the document and the spreadsheet — how the file is parsed, calculated, and written — stays in the core and doesn’t fork.
For the business this means one thing: the editor carries your name and lives in your process, but you don’t end up with your own version of the engine that you’d have to maintain, update, and audit for security.
| Area | What you can change | What you can’t do |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Brand | The product name, logo, tab icon, links to legal documents, shell colors. | Change document content bypassing the core. |
| Styling | Documents have five theme variables and a choice of light or dark theme. Spreadsheets don’t have such a list yet: the public embedding kit is still being finalized — [what’s in it today](/sumsheet/embedding-api/). | Changing the canvas geometry with styles: page layout is calculated in the core, and the screen will diverge from the file. |
| Navigation | Your application’s routes, where open and save live, your own side panel, tooltips, and onboarding. | Relying on the internal structure of the interface: it changes without notice. |
| Commands | Showing commands based on declared capabilities, enabling and disabling them by your own rules, adding your own panels. For spreadsheets, the list of commands ships in the delivery as a registry: 472 commands on 28 interface surfaces, each recording where it lives and which checks cover it. You can plan from the registry; you can’t plan from screenshots. | Show commands that aren’t in the declared profile: the user will click and get a refusal. |
| Storage | Your own open and save adapters — or the ready-made WOPI client, if your document management system speaks it; version history, autosave rules, auditing. | Bypass the save contract or write to the document file directly. |
| Users | The account from your sign-in system, workspace context, roles. | Pass credentials into document data or into logs. |
| Events | Analytics and audit through the public set of events. | Treating internal interface events as a public contract. |
| Localization | Language packs, your own terminology in labels. | Split the meaning of the same command across different brands. |
## How deep you can go
[Section titled “How deep you can go”](#how-deep-you-can-go)
* **The ready-made shell.** The ribbon, grid, dialogs, and File menu entirely from us, inside your window. For documents, the server option provides such a shell: the whole editor opens in an embed on your site. The standalone SumDoc surface for your own window isn’t it: today it’s a limited set that proves the embedding boundary, not a ribbon with dialogs ([what’s in it](/sumdoc/embedding/)).
* **The mixed option.** The document or spreadsheet canvas from us, while the interface frame, panels, and industry-specific commands are yours. The only one of the four that starts with a conversation rather than a download: for documents, the set of your own panels and menu items [is fixed in the pilot](/sumdoc/status/); for spreadsheets, the public embedding kit is still being finalized.
* **Core only.** Your interface calls the public operations and renders what it gets back itself.
* **Automation only.** A headless process: batch processing, agents, checks, and document creation.
## For developers
[Section titled “For developers”](#for-developers)
* Theme variables of the SumDoc surface: `--fastdoc-accent`, `--fastdoc-background`, `--fastdoc-foreground`, `--fastdoc-muted`, `--fastdoc-paper`.
* The SumSheet interface is driven by a registry of 472 commands — each records which of the 28 surfaces it lives on — besides the File menu and the Data, Insert, View, Layout, and Review ribbons, these are the canvas, the formula bar, dialogs, and the contextual ribbons for tables, pivots, and charts — and at which stage it becomes available; five commands are marked as not exposed outward — your own shell has nothing to show them with.
* Allowed and forbidden customization points of SumDoc — [Responsibility and security](/sumdoc/responsibility/); the boundary between the surface and the SumSheet core — [the embedding kit](/sumsheet/embedding-api/).
# Missing APIs and compatibility
> What's explicitly not in the current contract, and how that affects integration planning.
What follows is about the embedding contract — what’s available to your application from the outside: session commands and the browser surface. Inside the desktop SumDoc application itself, its shell can do more, but that’s its internal exchange, and you can’t rely on it for integration.
| What’s missing | What to use instead |
| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Click and double-click | Not in the public surface contract. Inside the product, text, tables, borders, and autofit width are handled — [what of this will make it into the contract](/sumdoc/status/) |
| Right-click and custom menu items | Not in the contract. Inside the product, the text and table menus work over their own internal channel, but a way to plug in your own hasn’t been settled yet — [Readiness and boundaries](/sumdoc/status/) |
| A public “what’s under this point” call | Not in the session or the surface; available as a separate processor command: [`hit-test-docx`](/sumdoc/hit-test/) |
| Editing an arbitrary node | There’s no single universal command |
| Stable version numbering | No: the contract is marked `1.0.0-draft` |
| WebSocket from outside, without a token | Not allowed: only a local interface, with a token |
| Binary WebSocket frames | Requests travel only as UTF-8 text frames. A binary frame gets the refusal “session WebSocket requests must be UTF-8 text frames”, and the connection stays open |
| Your own copy of the document in the editor window | Not allowed: the model, history, and file writing belong to the core |
While the contract is marked `1.0.0-draft`, pin the checksum and version of the executable together with the type declarations, and on startup check the schema of the greeting message and the `supported_commands` list — both arrive in the very first line of the session.
# SumDoc session and conventions
> What matters before your first call: request correlation, command order, required edit fields, the unsaved-changes flag, ending the session, and the absence of timeouts.
**How names are written.** SumDoc has three different conventions, and you shouldn’t mix them up. Command names use a hyphen or a single word: `save-checkpoint`, `print-window`, `model`, `mutate`; there isn’t a single underscore in a command name. Field names, by contrast, use an underscore: `document_id`, `paragraph_index`, `operation_kind`, `expected_revision`. And field values chosen from a list go back to a hyphen: `insert-text`, `delete-line-break`, `merge-with-next`. A spelling mistake returns a refusal that reads as “command not supported”, even though it’s a single character.
And here’s an exception worth knowing in advance. The hyphen rule holds for `operation_kind` on the `mutate` command. For the typed `apply-text-transaction` transaction, the kind of action lives in a different field — `command.type` — and its values are written **with an underscore**: `insert_text`, `delete_range`, `merge_paragraphs`, `paste_plain_text`. So the same action is written differently in the two commands: `insert-text` for `mutate` and `insert_text` for the transaction.
The word “list” is a loose term here: the contract doesn’t declare a single list of edit kinds — they’re documented at the places where they apply. An unknown kind doesn’t break the document and doesn’t come back as an envelope failure: the response is `ok: true`, `result.mutation.result_kind` is `invalid-request`, and the workbook stays unchanged. So the working set of edit kinds comes from what [gets settled before integration begins](/sumdoc/status/): it’s agreed on together with the confirmation payload and the list of errors.
For comparison: in SumSheet, fields are written in camelCase — `subsetId`, `sheetKey` — with no underscores. If you embed both products, don’t look for a name from one in the other.
**Two more differences that matter when embedding both.** Here, a refusal comes as an `error` field — a reason in words; SumDoc has no separate code to branch handling on, and this [gets settled before integration begins](/sumdoc/status/). SumSheet has such a field, called `code`, and the habit of branching on it doesn’t carry over here — see [how to read a response](/sumdoc/envelope/).
And the exchange: here it’s strictly alternating — a request line, a response line. The SumDoc processor never asks questions of its own and never reaches out over the network. SumSheet is different: there, the core can send a line of its own and wait for your answer, so you can’t write one shared stream-reading routine for both products — see [how the conversation with SumSheet works](/sumsheet/session/).
**What sizes are measured in.** There are two units, and the field name tells you which. Fields ending in `_twips` are in twips: a Word markup unit, one 1,440th of an inch. An inch is 1440 twips, a centimeter is about 567, and the standard 2.54 cm page margin is exactly 1440. Fields ending in `_milli_px` are in thousandths of a pixel: 96000 means 96 px, not ninety-six thousand. The first comes from the document format, the second from the screen, and you shouldn’t mix them.
**Correlation.** The `id` field is optional and accepts any JSON value — a string or a number. The core returns it unchanged, so it’s what you use to match a response to a request; the field is always present in the response and is `null` if the request didn’t carry one.
**Order.** The session keeps state between commands. A command that needs an open document refuses, before `open`, with the text `no document is open in this session`.
**Editing.** For `mutate`, `operation_kind` and `paragraph_index` are required — the other fields have default values. Paragraphs are numbered from zero. Edit kinds are listed in [Request and response objects](/sumdoc/envelope/).
**Unsaved changes.** The `dirty` flag means the current model differs from the last saved state, not that the document is corrupted.
**Ending the session.** The response to `shutdown` contains `shutdown: true` and contains none of `cmd`, `elapsed_ms`, or `result`.
**Response time.** There’s no timeout in the session: the response arrives when the command has been processed. Any time limit is set by the client. The only timeout on the SumDoc side is five seconds for reading an HTTP request in Surface Host.
**Saving.** The file is published atomically: the write goes to a temporary file next to the target, the content is flushed to disk, and only then does it replace the target. An interrupted write never leaves a half-written DOCX file — see [Document lifecycle](/sumdoc/lifecycle/). The `save-checkpoint` command additionally checks the file against the state passed in `expected_hash`, and refuses if it was changed from outside.
The message format and refusal codes are in [Transport](/reference/sumdoc/transport/); the list of commands is in [Session Protocol](/reference/sumdoc/session-protocol/).
# DTO · api-document.ts
> 44 interfaces and 1 type alias of the shell contract — working with the document: opening and resolving paths, media export, report snapshots, support markers, and package relationships.
44 interfaces and 1 type alias — working with the document: opening and resolving paths, media export, report snapshots, support markers, and package relationships.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-document.ts`.
Types on this page — 45
* [`OpenExternalHyperlinkResult`](#openexternalhyperlinkresult)
* [`ShellShareClipboardResult`](#shellshareclipboardresult)
* [`ShellRevealPathResult`](#shellrevealpathresult)
* [`ShellSupportMarker`](#shellsupportmarker)
* [`ShellDetectedFeature`](#shelldetectedfeature)
* [`ShellRelationshipSnapshot`](#shellrelationshipsnapshot)
* [`ShellMediaAsset`](#shellmediaasset)
* [`ShellMediaAssetOwner`](#shellmediaassetowner)
* [`ShellLoadedDocument`](#shellloadeddocument)
* [`ShellDocumentPageWindowTelemetry`](#shelldocumentpagewindowtelemetry)
* [`ShellDocumentPageWindowResult`](#shelldocumentpagewindowresult)
* [`ShellFileSessionRecoveryCandidate`](#shellfilesessionrecoverycandidate)
* [`ShellFileSessionRecoveryState`](#shellfilesessionrecoverystate)
* [`ShellAutosaveRecoverySettings`](#shellautosaverecoverysettings)
* [`ShellAutosaveRecoveryCandidate`](#shellautosaverecoverycandidate)
* [`ShellVersionHistoryEntry`](#shellversionhistoryentry)
* [`ShellVersionHistoryResult`](#shellversionhistoryresult)
* [`ShellDocxCompatibilityIssue`](#shelldocxcompatibilityissue)
* [`ShellDocxCompatibilityReport`](#shelldocxcompatibilityreport)
* [`ShellDocxCompatibilityCommandResult`](#shelldocxcompatibilitycommandresult)
* [`ShellDocxCompatibilityOperationResult`](#shelldocxcompatibilityoperationresult)
* [`ShellExternalChangePromptState`](#shellexternalchangepromptstate)
* [`ShellBridgeState`](#shellbridgestate)
* [`ShellExportCurrentDocumentImagesRequest`](#shellexportcurrentdocumentimagesrequest)
* [`ShellSaveRenderedCanvasImagesRequest`](#shellsaverenderedcanvasimagesrequest)
* [`ShellSaveRenderedCanvasImagesResult`](#shellsaverenderedcanvasimagesresult)
* [`ShellExportCurrentImageWorkflowImagesRequest`](#shellexportcurrentimageworkflowimagesrequest)
* [`ShellCurrentImageWorkflowExportPlanRequest`](#shellcurrentimageworkflowexportplanrequest)
* [`ShellCurrentImageWorkflowExportPlan`](#shellcurrentimageworkflowexportplan)
* [`ShellExportCurrentDocumentImagesResult`](#shellexportcurrentdocumentimagesresult)
* [`ShellCopyCurrentImageWorkflowImageResult`](#shellcopycurrentimageworkflowimageresult)
* [`ShellCompressCurrentImageWorkflowImageRequest`](#shellcompresscurrentimageworkflowimagerequest)
* [`ShellCompressCurrentImageWorkflowImageResult`](#shellcompresscurrentimageworkflowimageresult)
* [`ShellReplaceCurrentImageWorkflowImageRequest`](#shellreplacecurrentimageworkflowimagerequest)
* [`ShellReplaceCurrentImageWorkflowImageResult`](#shellreplacecurrentimageworkflowimageresult)
* [`ShellDocumentWindowDescriptor`](#shelldocumentwindowdescriptor)
* [`ShellDocumentWindowSession`](#shelldocumentwindowsession)
* [`ShellDocumentSessionSelection`](#shelldocumentsessionselection)
* [`ShellDocumentSessionSnapshot`](#shelldocumentsessionsnapshot)
* [`ShellExactPageCountStatus`](#shellexactpagecountstatus)
* [`ShellCanonicalSceneRefreshed`](#shellcanonicalscenerefreshed)
* [`ShellRendererCapabilities`](#shellrenderercapabilities)
* [`ShellDocumentPatchState`](#shelldocumentpatchstate)
* [`ShellDocumentPatch`](#shelldocumentpatch)
* [`ShellDocumentPatchOutcome`](#shelldocumentpatchoutcome)
### OpenExternalHyperlinkResult
[Section titled “OpenExternalHyperlinkResult”](#openexternalhyperlinkresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface OpenExternalHyperlinkResult {
requested: boolean;
opened: boolean;
smokeBlocked: boolean;
target: string | null;
normalizedTarget: string | null;
protocol: string | null;
reason: string | null;
}
```
### ShellShareClipboardResult
[Section titled “ShellShareClipboardResult”](#shellshareclipboardresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellShareClipboardResult {
copied: boolean;
length: number;
text: string;
}
```
### ShellRevealPathResult
[Section titled “ShellRevealPathResult”](#shellrevealpathresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellRevealPathResult {
revealed: boolean;
smokeBlocked: boolean;
path: string | null;
reason: string | null;
}
```
### ShellSupportMarker
[Section titled “ShellSupportMarker”](#shellsupportmarker)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellSupportMarker {
kind: string;
location: string;
detail: string;
}
```
### ShellDetectedFeature
[Section titled “ShellDetectedFeature”](#shelldetectedfeature)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDetectedFeature {
kind?: string;
location?: string;
detail?: string;
}
```
### ShellRelationshipSnapshot
[Section titled “ShellRelationshipSnapshot”](#shellrelationshipsnapshot)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellRelationshipSnapshot {
relationship_part_name?: string;
owner_part_name?: string;
relationship_id?: string;
relationship_type?: string;
target?: string;
target_mode?: string;
resolved_target?: string;
target_status?: string;
}
```
### ShellMediaAsset
[Section titled “ShellMediaAsset”](#shellmediaasset)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellMediaAsset {
source_part_name: string;
content_kind: string;
data_url: string;
byte_len: number;
fingerprint: string;
owner_count?: number;
supported_owner_count?: number;
ownership_status?: string;
owners?: ShellMediaAssetOwner[];
}
```
### ShellMediaAssetOwner
[Section titled “ShellMediaAssetOwner”](#shellmediaassetowner)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellMediaAssetOwner {
object_kind: string;
location: string;
ownerLocation?: string;
relationship_id: string;
relationshipId?: string;
target_part_name: string;
sourcePartName?: string;
relationship_part_name: string | null;
relationship_target_status: string | null;
drawing_fill_mode: string | null;
drawing_tile_present: boolean | null;
supported_ownership: boolean;
}
```
### ShellLoadedDocument
[Section titled “ShellLoadedDocument”](#shellloadeddocument)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellLoadedDocument {
path: string;
displayName: string;
openedAt: string;
command_output_route?: CommandOutputRouteKind;
document_auto_hyphenation_enabled?: boolean;
report: ShellReportSnapshot;
review: ShellReviewSnapshot;
model: CanonicalCommentModelLike & Record;
style: unknown;
pageSetup: {
current_page_setup?: {
gutter_twips?: number;
gutter_position?: string;
gutter_at_top_enabled?: boolean;
page_width_twips?: number;
page_height_twips?: number;
paper_size?: string;
paper_source_first?: number | null;
paper_source_other?: number | null;
multiple_pages?: string;
vertical_alignment?: string;
suppress_endnotes?: boolean;
section_start?: string;
title_page_enabled?: boolean;
even_and_odd_headers_enabled?: boolean;
header_distance_twips?: number;
footer_distance_twips?: number;
line_numbering_restart_mode?: string | null;
line_numbering_count_by?: number | null;
line_numbering_start?: number | null;
line_numbering_distance_twips?: number | null;
};
};
compose: ShellParagraphCompositionSnapshot;
paginate: ShellPaginateSnapshot;
print: ShellPrintSnapshot;
media_assets?: ShellMediaAsset[];
source_format?: "docx" | "docm" | "odt";
read_only?: boolean;
odt_editable_copy?: {
status: "editable" | "source-missing" | "source-changed" | "copy-changed" | "preflight-blocked";
original_source_path: string;
original_source_fingerprint: string;
copy_fingerprint: string;
detail: string | null;
};
support_summary?: unknown;
load_state?: "first-usable" | "complete";
canonical_edit_projections_complete?: true;
open_stage_timings_ms?: Record;
trust?: {
state: "normal" | "protected-view" | "blocked-malformed" | "blocked-encrypted";
reasons: string[];
externalRelationships?: number;
macrosPresent?: boolean;
embeddedObjectsPresent?: boolean;
signaturePresent: boolean;
malformed?: boolean;
encryptedPackageUnsupported?: boolean;
sourceExecutionAllowed: false;
};
}
```
### ShellDocumentPageWindowTelemetry
[Section titled “ShellDocumentPageWindowTelemetry”](#shelldocumentpagewindowtelemetry)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentPageWindowTelemetry {
requestId: number;
requestedPageIndex: number;
payloadBytes: number;
durationMs: number;
sceneCacheCount: number;
sceneCachePeak: number;
sceneCacheLimit: number;
droppedRequestCount: number;
}
```
### ShellDocumentPageWindowResult
[Section titled “ShellDocumentPageWindowResult”](#shelldocumentpagewindowresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentPageWindowResult {
materialized: boolean;
canceled?: boolean;
sourceDocumentFingerprint?: string;
pageIndexes: number[];
pages?: ShellPrintSnapshot["pages"];
modelBlocks?: Array>;
evictedPageIndexes?: number[];
mediaAssets?: ShellMediaAsset[];
telemetry?: ShellDocumentPageWindowTelemetry;
}
```
### ShellFileSessionRecoveryCandidate
[Section titled “ShellFileSessionRecoveryCandidate”](#shellfilesessionrecoverycandidate)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellFileSessionRecoveryCandidate {
recoveryId: string;
documentPath: string | null;
displayName: string;
capturedAtLabel: string;
reasonLabel: string;
}
```
### ShellFileSessionRecoveryState
[Section titled “ShellFileSessionRecoveryState”](#shellfilesessionrecoverystate)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellFileSessionRecoveryState {
status: "none" | "available" | "recovering" | "recovered" | "error";
candidate: ShellFileSessionRecoveryCandidate | null;
errorMessage: string | null;
}
```
### ShellAutosaveRecoverySettings
[Section titled “ShellAutosaveRecoverySettings”](#shellautosaverecoverysettings)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellAutosaveRecoverySettings {
schema: "fastdoc.autosave-recovery.settings.v1";
enabled: boolean;
intervalSeconds: number;
retention: {
maxSnapshotsPerDocument: number;
maxAgeDays: number;
maxTotalBytes: number;
};
}
```
### ShellAutosaveRecoveryCandidate
[Section titled “ShellAutosaveRecoveryCandidate”](#shellautosaverecoverycandidate)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellAutosaveRecoveryCandidate {
recoveryId: string;
documentId: string;
displayName: string;
capturedAt: string;
sourcePath: string | null;
movedSourcePath: string | null;
sourceStatus: "available" | "untitled" | "missing" | "moved" | "externally-replaced" | "read-only";
snapshotPath: string;
snapshotHealth: "ready" | "missing" | "corrupt";
sessionId: string;
retentionExhausted: boolean;
}
```
### ShellVersionHistoryEntry
[Section titled “ShellVersionHistoryEntry”](#shellversionhistoryentry)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellVersionHistoryEntry {
id: string;
documentId: string;
snapshotPath: string;
createdAt: string;
reason: "manual-save" | "autosave" | "recovery" | "restore" | "save-as";
fileName: string;
sizeBytes: number;
sha256: string;
name: string | null;
pinned: boolean;
recoverySessionId: string | null;
sourcePath: string;
health: "ready" | "missing" | "corrupt";
}
```
### ShellVersionHistoryResult
[Section titled “ShellVersionHistoryResult”](#shellversionhistoryresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellVersionHistoryResult {
documentPath: string;
versions: ShellVersionHistoryEntry[];
}
```
### ShellDocxCompatibilityIssue
[Section titled “ShellDocxCompatibilityIssue”](#shelldocxcompatibilityissue)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocxCompatibilityIssue {
code: string;
severity: "info" | "warning" | "error" | "blocker";
part: string;
relationship_id: string | null;
impact: string;
allowed_action: string;
repairable: boolean;
detail: string;
}
```
### ShellDocxCompatibilityReport
[Section titled “ShellDocxCompatibilityReport”](#shelldocxcompatibilityreport)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocxCompatibilityReport {
schema: "fastdoc.docx-compatibility-report.v1";
package_kind: "docx" | "docm";
producer_hint: string;
trusted_open_allowed: boolean;
repair_copy_allowed: boolean;
repair_required: boolean;
macro_payload_present: boolean;
macro_execution_allowed: false;
external_relationships_resolved: false;
source_part_count: number;
relationship_count: number;
preserved_opaque_part_count: number;
issues: ShellDocxCompatibilityIssue[];
}
```
### ShellDocxCompatibilityCommandResult
[Section titled “ShellDocxCompatibilityCommandResult”](#shelldocxcompatibilitycommandresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocxCompatibilityCommandResult {
schema: "fastdoc.docx-compatibility-command.v1";
action: "check-compatibility" | "inspect-package" | "repair-copy";
source_path: string;
output_path: string | null;
source_sha256_before: string;
source_sha256_after: string;
source_size_bytes: number;
source_unchanged: boolean;
output_sha256: string | null;
saves_completed: number;
reopens_completed: number;
temp_files_cleaned: boolean;
macro_execution_allowed: false;
applied_rules: string[];
report: ShellDocxCompatibilityReport;
report_after: ShellDocxCompatibilityReport | null;
}
```
### ShellDocxCompatibilityOperationResult
[Section titled “ShellDocxCompatibilityOperationResult”](#shelldocxcompatibilityoperationresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocxCompatibilityOperationResult {
canceled: boolean;
opened: boolean;
outputPath: string | null;
result: ShellDocxCompatibilityCommandResult | null;
}
```
### ShellExternalChangePromptState
[Section titled “ShellExternalChangePromptState”](#shellexternalchangepromptstate)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellExternalChangePromptState {
status: "none" | "prompt";
kind: "modified" | "deleted" | "moved" | "read-only" | "corrupt" | null;
documentPath: string;
diskPath: string | null;
diskHash: string | null;
dirty: boolean;
revision: number;
message: string | null;
choices: Array<"keep-current" | "keep-mine" | "reload-disk" | "save-mine-copy" | "compare" | "cancel">;
reloadAllowed: boolean;
}
```
### ShellBridgeState
[Section titled “ShellBridgeState”](#shellbridgestate)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellBridgeState {
document: ShellLoadedDocument | null;
canonicalHistory?: {
owner: "rust-session";
historyOwner: "rust-session" | "canonical_rust_session_m9";
available: boolean;
sessionId: string | null;
documentId: string | null;
transactionOrder: number;
acceptedRevision: number;
selectionRevision: number;
publishedRevision: number;
dirty: boolean;
modelHash: string | null;
undoDepth: number;
redoDepth: number;
typingAttributes: CharacterProperties;
undoTransactions: Array<{
transitionKind: string;
packageStructural?: boolean;
transactionOrder: number;
beforeModelHash: string;
afterModelHash: string;
paragraphIndex?: number;
beforeCaretSlotIndex?: number;
afterCaretSlotIndex?: number;
}>;
redoTransactions: Array<{
transitionKind: string;
packageStructural?: boolean;
transactionOrder: number;
beforeModelHash: string;
afterModelHash: string;
paragraphIndex?: number;
beforeCaretSlotIndex?: number;
afterCaretSlotIndex?: number;
}>;
};
easyEditCapability?: EasyEditBodyTextCapability;
recentDocuments?: Array<{
path: string;
name: string;
parentLabel: string;
lastOpenedLabel: string;
pinned: boolean;
availability: "available" | "missing";
}>;
restoreLastDocument: boolean;
liveTextEditEligible: boolean;
trackRevisionsEnabled: boolean;
saveInPlaceEligible: boolean;
hasUnpublishedChainHead: boolean;
acceptedChainModelHash?: string | null;
publicationDirty?: boolean;
persistentProjectionQuarantine?: string | null;
publishTargetPath: string | null;
documentIsChainContinuation?: boolean;
canonicalHistoryNavigation?: boolean;
liveTextChainInputPath: string | null;
compareDocument: ShellLoadedDocument | null;
errorMessage: string | null;
fileSessionRecovery: ShellFileSessionRecoveryState;
availableFixtures: ShellFixtureOption[];
smokeMode: SmokeMode;
smokeFieldCommandCenterActionId: string | null;
smokeArtifactRoot?: string | null;
wordSurfaceCaptureText: string | null;
wordSurfaceCaptureOutputSuffix: string | null;
wordSurfaceVisibleReplayDelayMs: number;
wordSurfaceShowFormattingMarks: boolean;
launchConfig: {
hideLeftPanel: boolean;
hideRightPanel: boolean;
canvasOnly: boolean;
surfaceMode: "default" | "word-surface-control-sheet";
d5GlyphEdgeCoverageShapeMaterial: boolean;
editableLauncher: boolean;
saveInPlace: boolean;
editorV0RibbonInsertImageSmokeOutputPath: string | null;
editorV0RibbonInsertImageSmokeImagePath: string | null;
editorV0RibbonInsertImageSmokeMenuScreenshotPath: string | null;
smokeSeedViewPreferencesActiveRibbonTabView: boolean;
};
runtimeFontFaceCss: string;
availableFontFamilyNames: string[];
cloudDownloadableFontFamilyNames: string[];
windowChrome: {
customTitlebar: boolean;
trafficLightsInset: boolean;
platform: string;
};
}
```
### ShellExportCurrentDocumentImagesRequest
[Section titled “ShellExportCurrentDocumentImagesRequest”](#shellexportcurrentdocumentimagesrequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellExportCurrentDocumentImagesRequest {
renderedCanvas?: ShellSaveRenderedCanvasImagesRequest;
outputDir?: string | null;
sourcePartName?: string | null;
sourcePartNames?: string[] | string | null;
relationshipId?: string | null;
relationshipIds?: string[] | string | null;
ownerLocation?: string | null;
ownerLocations?: string[] | string | null;
ownerRef?: string | Record | null;
ownerRefs?: Array> | string | null;
ownerReferences?: Array> | string | null;
owner_ref?: string | Record | null;
owner_refs?: Array> | string | null;
owner_references?: Array> | string | null;
drawingSupportStatus?: string | null;
drawingSupportStatuses?: string[] | string | null;
drawing_support_status?: string | null;
drawing_support_statuses?: string[] | string | null;
}
```
### ShellSaveRenderedCanvasImagesRequest
[Section titled “ShellSaveRenderedCanvasImagesRequest”](#shellsaverenderedcanvasimagesrequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellSaveRenderedCanvasImagesRequest {
scope: "selected-object" | "document-pages";
format: "png" | "jpeg";
images: Array<{
name: string;
dataUrl: string;
pageIndex?: number | null;
}>;
outputDir?: string | null;
outputPath?: string | null;
}
```
### ShellSaveRenderedCanvasImagesResult
[Section titled “ShellSaveRenderedCanvasImagesResult”](#shellsaverenderedcanvasimagesresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellSaveRenderedCanvasImagesResult {
schema: "fastdoc.shell.text-087-094-rendered-canvas-images.v1";
backlogIds: [
"TEXT-087",
"TEXT-094"
];
saved: boolean;
canceled: boolean;
scope: "selected-object" | "document-pages";
format: "png" | "jpeg";
outputFiles: string[];
outputDir?: string | null;
sourceDocxMutated: false;
}
```
### ShellExportCurrentImageWorkflowImagesRequest
[Section titled “ShellExportCurrentImageWorkflowImagesRequest”](#shellexportcurrentimageworkflowimagesrequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellExportCurrentImageWorkflowImagesRequest {
outputDir?: string | null;
ownerRef?: string | Record | null;
ownerRefs?: Array> | string | null;
ownerReferences?: Array> | string | null;
owner_ref?: string | Record | null;
owner_refs?: Array> | string | null;
owner_references?: Array> | string | null;
drawingSupportStatus?: string | null;
drawingSupportStatuses?: string[] | string | null;
drawing_support_status?: string | null;
drawing_support_statuses?: string[] | string | null;
}
```
### ShellCurrentImageWorkflowExportPlanRequest
[Section titled “ShellCurrentImageWorkflowExportPlanRequest”](#shellcurrentimageworkflowexportplanrequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCurrentImageWorkflowExportPlanRequest {
outputDir?: string | null;
ownerRef?: string | Record | null;
ownerRefs?: Array> | string | null;
ownerReferences?: Array> | string | null;
owner_ref?: string | Record | null;
owner_refs?: Array> | string | null;
owner_references?: Array> | string | null;
}
```
### ShellCurrentImageWorkflowExportPlan
[Section titled “ShellCurrentImageWorkflowExportPlan”](#shellcurrentimageworkflowexportplan)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCurrentImageWorkflowExportPlan {
schema: "fastdoc.shell.d38-current-image-workflow-export-plan.v1";
backlog_id: "TEXT-271";
document_path?: string | null;
documentPath?: string | null;
computed: boolean;
export_available: boolean;
exportAvailable: boolean;
reason: string;
exportable_owner_ref_count: number;
exportableOwnerRefCount: number;
source_part_names: string[];
sourcePartNames: string[];
relationship_ids: string[];
relationshipIds: string[];
owner_locations: string[];
ownerLocations: string[];
owner_refs: Array>;
ownerRefs: Array>;
planned_items: Array>;
plannedItems: Array>;
claims: Record;
support_markers: string[];
supportMarkers: string[];
}
```
### ShellExportCurrentDocumentImagesResult
[Section titled “ShellExportCurrentDocumentImagesResult”](#shellexportcurrentdocumentimagesresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellExportCurrentDocumentImagesResult {
schema: "fastdoc.shell.text-271-export-current-images.v1";
backlog_id: "TEXT-271";
document_path?: string | null;
output_dir?: string | null;
exported: boolean;
reason: string | null;
image_count: number;
filter_applied: boolean;
filter: Record;
requested_filters: Record;
supported_media_part_count: number;
deferred_media_part_count: number;
source_docx_mutated: boolean;
claims: Record;
images: Array>;
current_media_assets: Array>;
current_deferred_image_objects: Array>;
current_image_workflow: Record;
currentImageWorkflow: Record;
workflow_export?: Record;
workflowExport?: Record;
manifest_written?: boolean;
manifestWritten?: boolean;
manifest_path?: string | null;
manifestPath?: string | null;
index_written?: boolean;
indexWritten?: boolean;
index_path?: string | null;
indexPath?: string | null;
index_row_count?: number;
indexRowCount?: number;
html_index_written?: boolean;
htmlIndexWritten?: boolean;
html_index_path?: string | null;
htmlIndexPath?: string | null;
html_index_row_count?: number;
htmlIndexRowCount?: number;
summary_written?: boolean;
summaryWritten?: boolean;
summary_path?: string | null;
summaryPath?: string | null;
workflow_export_summary?: Record;
workflowExportSummary?: Record;
workflow_export_manifest?: Record;
workflowExportManifest?: Record;
support_markers: string[];
}
```
### ShellCopyCurrentImageWorkflowImageResult
[Section titled “ShellCopyCurrentImageWorkflowImageResult”](#shellcopycurrentimageworkflowimageresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCopyCurrentImageWorkflowImageResult {
schema: "fastdoc.shell.d38-selected-image-clipboard-copy.v1";
copied: boolean;
reason: string | null;
document_path?: string | null;
output_dir?: string | null;
owner_refs: Array>;
image_count: number;
source_part_name?: string | null;
output_path?: string | null;
clipboard_image_size?: {
width: number;
height: number;
} | null;
clipboardImageSize?: {
width: number;
height: number;
} | null;
export_result?: Record;
claims: Record;
support_markers: string[];
}
```
### ShellCompressCurrentImageWorkflowImageRequest
[Section titled “ShellCompressCurrentImageWorkflowImageRequest”](#shellcompresscurrentimageworkflowimagerequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCompressCurrentImageWorkflowImageRequest {
ownerRef?: string | Record | null;
ownerRefs?: Array> | string | null;
outputDocxPath?: string | null;
writebackOut?: string | null;
maxPixelWidth?: number | null;
maxPixelHeight?: number | null;
jpegQuality?: number | null;
reopenAfterWrite?: boolean | null;
}
```
### ShellCompressCurrentImageWorkflowImageResult
[Section titled “ShellCompressCurrentImageWorkflowImageResult”](#shellcompresscurrentimageworkflowimageresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCompressCurrentImageWorkflowImageResult {
schema: "fastdoc.shell.d38-picture-format-compress-pictures-action.v1";
backlog_id: "D38";
document_path?: string | null;
output_docx_path?: string | null;
owner_refs: Array>;
max_pixel_width?: number;
maxPixelWidth?: number;
max_pixel_height?: number;
maxPixelHeight?: number;
jpeg_quality?: number;
jpegQuality?: number;
compressed: boolean;
replaced: boolean;
output_written?: boolean;
outputWritten?: boolean;
reason: string | null;
source_part_name?: string | null;
sourcePartName?: string | null;
output_path?: string | null;
outputPath?: string | null;
replacement_image_path?: string | null;
replacementImagePath?: string | null;
original_byte_len?: number | null;
originalByteLen?: number | null;
compressed_byte_len?: number | null;
compressedByteLen?: number | null;
original_pixel_size?: {
width: number;
height: number;
} | null;
originalPixelSize?: {
width: number;
height: number;
} | null;
compressed_pixel_size?: {
width: number;
height: number;
} | null;
compressedPixelSize?: {
width: number;
height: number;
} | null;
byte_reduction?: number | null;
byteReduction?: number | null;
export_result?: Record;
replace_result?: Record;
replaceResult?: Record;
claims: Record;
support_markers: string[];
}
```
### ShellReplaceCurrentImageWorkflowImageRequest
[Section titled “ShellReplaceCurrentImageWorkflowImageRequest”](#shellreplacecurrentimageworkflowimagerequest)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellReplaceCurrentImageWorkflowImageRequest {
ownerRef?: string | Record | null;
ownerRefs?: Array> | string | null;
replacementImagePath?: string | null;
outputDocxPath?: string | null;
writebackOut?: string | null;
widthEmu?: number | null;
heightEmu?: number | null;
altTitle?: string | null;
altDescription?: string | null;
preserveAspectRatio?: boolean | null;
resetToOriginalEmbeddedExtent?: boolean | null;
resetExtent?: boolean | null;
cropMode?: "fit" | "fill" | "fill-center" | "fill-left" | "fill-right" | "reset" | "custom" | null;
cropL?: number | null;
cropT?: number | null;
cropR?: number | null;
cropB?: number | null;
wrapMode?: "inline" | "square" | "tight" | "through" | "top-bottom" | "behind-text" | "in-front-of-text" | null;
wrapSide?: "bothSides" | "left" | "right" | "largest" | null;
wrapPointsPreset?: "inset-rectangle" | null;
wrapDistanceTopEmu?: number | null;
wrapDistanceBottomEmu?: number | null;
wrapDistanceLeftEmu?: number | null;
wrapDistanceRightEmu?: number | null;
arrangeMode?: "bring-forward" | "send-backward" | "bring-front" | "send-back" | "behind-text" | "in-front-of-text" | null;
alignMode?: "left" | "center" | "right" | null;
verticalAlignMode?: "top" | "center" | "bottom" | null;
alignRelativeFrom?: "page" | "margin" | null;
rotateDegrees?: number | null;
flipMode?: "horizontal" | "vertical" | "none" | null;
removeBackgroundMode?: "corner-color" | "edge-color" | "white" | "auto" | null;
compressPictureMode?: "email-96ppi" | "web-150ppi" | "print-220ppi" | null;
reopenAfterWrite?: boolean | null;
}
```
### ShellReplaceCurrentImageWorkflowImageResult
[Section titled “ShellReplaceCurrentImageWorkflowImageResult”](#shellreplacecurrentimageworkflowimageresult)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellReplaceCurrentImageWorkflowImageResult {
schema: "fastdoc.shell.d38-selected-image-replace-media-copy.v1";
backlog_id: "D38";
document_path?: string | null;
output_docx_path?: string | null;
outputDocxPath?: string | null;
replacement_image_path?: string | null;
owner_refs: Array>;
replaced: boolean;
resized?: boolean;
reset_to_original_embedded_extent_performed?: boolean;
resetToOriginalEmbeddedExtentPerformed?: boolean;
reason: string | null;
cli_result?: Record | null;
cliResult?: Record | null;
output_written?: boolean;
outputWritten?: boolean;
source_unchanged?: boolean;
sourceUnchanged?: boolean;
reopen_after_write?: boolean;
reopenAfterWrite?: boolean;
reopened_document_path?: string | null;
reopenedDocumentPath?: string | null;
source_part_name?: string | null;
sourcePartName?: string | null;
replacement_byte_len?: number | null;
replacementByteLen?: number | null;
remove_background_mode?: string | null;
removeBackgroundMode?: string | null;
remove_background_performed?: boolean | null;
removeBackgroundPerformed?: boolean | null;
remove_background_transparent_pixel_count?: number | null;
removeBackgroundTransparentPixelCount?: number | null;
compress_picture_mode?: string | null;
compressPictureMode?: string | null;
picture_compression_performed?: boolean | null;
pictureCompressionPerformed?: boolean | null;
picture_compression_original_pixel_width?: number | null;
pictureCompressionOriginalPixelWidth?: number | null;
picture_compression_original_pixel_height?: number | null;
pictureCompressionOriginalPixelHeight?: number | null;
picture_compression_pixel_width?: number | null;
pictureCompressionPixelWidth?: number | null;
picture_compression_pixel_height?: number | null;
pictureCompressionPixelHeight?: number | null;
affected_owner_count?: number | null;
affectedOwnerCount?: number | null;
before_extent_emu?: Record | null;
beforeExtentEmu?: Record | null;
requested_extent_emu?: Record | null;
requestedExtentEmu?: Record | null;
original_embedded_extent_emu?: Record | null;
originalEmbeddedExtentEmu?: Record | null;
after_extent_emu?: Record | null;
afterExtentEmu?: Record | null;
extent_changed?: boolean | null;
extentChanged?: boolean | null;
crop_changed?: boolean | null;
cropChanged?: boolean | null;
wrap_changed?: boolean | null;
wrapChanged?: boolean | null;
wrap_side_changed?: boolean | null;
wrapSideChanged?: boolean | null;
wrap_points_changed?: boolean | null;
wrapPointsChanged?: boolean | null;
wrap_distance_changed?: boolean | null;
wrapDistanceChanged?: boolean | null;
display_name_changed?: boolean | null;
displayNameChanged?: boolean | null;
hidden_changed?: boolean | null;
hiddenChanged?: boolean | null;
arrange_changed?: boolean | null;
arrangeChanged?: boolean | null;
position_behavior_changed?: boolean | null;
positionBehaviorChanged?: boolean | null;
image_effect_changed?: boolean | null;
imageEffectChanged?: boolean | null;
picture_style_changed?: boolean | null;
pictureStyleChanged?: boolean | null;
picture_shape_changed?: boolean | null;
pictureShapeChanged?: boolean | null;
alt_title_before?: string | null;
altTitleBefore?: string | null;
alt_title_after?: string | null;
altTitleAfter?: string | null;
alt_description_before?: string | null;
altDescriptionBefore?: string | null;
alt_description_after?: string | null;
altDescriptionAfter?: string | null;
alt_text_changed?: boolean | null;
altTextChanged?: boolean | null;
claims: Record;
support_markers: string[];
}
```
### ShellDocumentWindowDescriptor
[Section titled “ShellDocumentWindowDescriptor”](#shelldocumentwindowdescriptor)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentWindowDescriptor {
windowId: number;
webContentsId: number;
title: string;
documentPath: string | null;
documentIdentity: string | null;
active: boolean;
ready: boolean;
dirty: boolean;
}
```
### ShellDocumentWindowSession
[Section titled “ShellDocumentWindowSession”](#shelldocumentwindowsession)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentWindowSession {
windowId: number | null;
sessionRevision: number;
windows: ShellDocumentWindowDescriptor[];
snapshot: ShellDocumentSessionSnapshot | null;
}
```
### ShellDocumentSessionSelection
[Section titled “ShellDocumentSessionSelection”](#shelldocumentsessionselection)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentSessionSelection {
documentPath: string | null;
pageIndex: number;
lineLocation: string | null;
caretSlotIndex: number | null;
selectionStartSlotIndex: number | null;
selectionEndSlotIndex: number | null;
multiSelectionStartLineLocation: string | null;
multiSelectionStartSlotIndex: number | null;
multiSelectionEndLineLocation: string | null;
multiSelectionEndSlotIndex: number | null;
preferredCaretXPx?: number | null;
}
```
### ShellDocumentSessionSnapshot
[Section titled “ShellDocumentSessionSnapshot”](#shelldocumentsessionsnapshot)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentSessionSnapshot {
documentPath: string;
revision?: number;
originWindowId?: number;
dirty: boolean;
liveEditDraft: Record | null;
liveEditUndoStack: Array>;
liveEditRedoStack: Array>;
selection: ShellDocumentSessionSelection | null;
}
```
### ShellExactPageCountStatus
[Section titled “ShellExactPageCountStatus”](#shellexactpagecountstatus)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellExactPageCountStatus {
running: boolean;
counted: boolean;
pageCount: number | null;
pageCountSource: string | null;
reason: string | null;
}
```
### ShellCanonicalSceneRefreshed
[Section titled “ShellCanonicalSceneRefreshed”](#shellcanonicalscenerefreshed)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellCanonicalSceneRefreshed {
documentPath: string | null;
revision: number;
origin:
| "neighbour"
| "neighbour-advance"
| "own-deferred-review"
| "own-deferred-scene";
documentRevisionDelta?: number;
selectionRevisionDelta?: number;
}
```
### ShellRendererCapabilities
[Section titled “ShellRendererCapabilities”](#shellrenderercapabilities)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellRendererCapabilities {
documentPatch?: boolean;
}
```
### ShellDocumentPatchState
[Section titled “ShellDocumentPatchState”](#shelldocumentpatchstate)
`TypeAliasDeclaration` · `api-document.ts`
```ts
type ShellDocumentPatchState = Omit<
ShellBridgeState,
| "document"
| "compareDocument"
| "runtimeFontFaceCss"
| "availableFixtures"
| "availableFontFamilyNames"
| "cloudDownloadableFontFamilyNames"
| "launchConfig"
| "windowChrome"
| "smokeMode"
| "smokeArtifactRoot"
| "smokeFieldCommandCenterActionId"
| "wordSurfaceCaptureText"
| "wordSurfaceCaptureOutputSuffix"
| "wordSurfaceVisibleReplayDelayMs"
| "wordSurfaceShowFormattingMarks"
>;
```
### ShellDocumentPatch
[Section titled “ShellDocumentPatch”](#shelldocumentpatch)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentPatch {
schema: "fastdoc.shell.document-patch.v1";
documentPath: string;
revision: number;
request_id: string;
before_hash: string;
after_hash: string;
verify: boolean;
model_is_windowed?: boolean;
windowed_model_hash?: string;
foreign?: boolean;
model: { patch: unknown; full?: undefined } | { full: unknown; patch?: undefined };
compose: {
head: Record;
paragraph_count: number;
before_paragraph_count: number;
changed: Array<{ paragraph_index: number; paragraph: unknown }>;
} | null;
print: {
head: Record;
page_count: number;
before_document_fingerprint: string | null;
changed_pages: unknown[];
unchanged_page_indexes: number[];
} | null;
paginate?: unknown;
review?: unknown;
style?: unknown;
document_head: Record;
state: ShellDocumentPatchState;
}
```
### ShellDocumentPatchOutcome
[Section titled “ShellDocumentPatchOutcome”](#shelldocumentpatchoutcome)
`InterfaceDeclaration` · `api-document.ts`
```ts
interface ShellDocumentPatchOutcome {
documentPath: string;
revision: number;
applied: boolean;
reason: string | null;
ms: number;
model: "patch" | "full";
pages_changed: number;
paragraphs_changed: number;
verified: boolean;
}
```
# DTO · api-market.ts
> 8 shell-contract interfaces and 2 type aliases — requests and results for the scripted release-readiness routes, plus header and footer commands; not used in embedding.
8 interfaces and 2 type aliases — requests and results for the scripted release-readiness routes, plus header and footer commands; not used in embedding.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-market.ts`.
**Types on this page — 10**
* [`EditorV0Doc006015MarketRouteRequest`](#editorv0doc006015marketrouterequest)
* [`EditorV0Doc001005MarketRouteRequest`](#editorv0doc001005marketrouterequest)
* [`EditorV0Doc016025MarketRouteRequest`](#editorv0doc016025marketrouterequest)
* [`EditorV0Doc006015MarketRouteResult`](#editorv0doc006015marketrouteresult)
* [`EditorV0Doc001005MarketRouteResult`](#editorv0doc001005marketrouteresult)
* [`EditorV0Doc016025MarketRouteResult`](#editorv0doc016025marketrouteresult)
* [`D36HeaderFooterMarketCommand`](#d36headerfootermarketcommand)
* [`D36HeaderFooterStoryVariant`](#d36headerfooterstoryvariant)
* [`D36HeaderFooterMarketRequest`](#d36headerfootermarketrequest)
* [`D36HeaderFooterMarketResult`](#d36headerfootermarketresult)
### EditorV0Doc006015MarketRouteRequest
[Section titled “EditorV0Doc006015MarketRouteRequest”](#editorv0doc006015marketrouterequest)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc006015MarketRouteRequest {
writebackDir?: string | null;
insertText?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0Doc001005MarketRouteRequest
[Section titled “EditorV0Doc001005MarketRouteRequest”](#editorv0doc001005marketrouterequest)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc001005MarketRouteRequest {
writebackDir?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0Doc016025MarketRouteRequest
[Section titled “EditorV0Doc016025MarketRouteRequest”](#editorv0doc016025marketrouterequest)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc016025MarketRouteRequest {
writebackDir?: string | null;
objectDocumentPath?: string | null;
linkedDocumentPath?: string | null;
updatedLinkedDocumentPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0Doc006015MarketRouteResult
[Section titled “EditorV0Doc006015MarketRouteResult”](#editorv0doc006015marketrouteresult)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc006015MarketRouteResult {
schema: "fastdoc.shell.editor-v0-doc-006-015-market-route-action.v1";
operationKind: "doc-006-015-market-route";
applied: boolean;
documentPath: string | null;
writebackDir: string;
insertTextFilePath: string;
finalOutputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
tasks: string[];
finalVisibleText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0Doc001005MarketRouteResult
[Section titled “EditorV0Doc001005MarketRouteResult”](#editorv0doc001005marketrouteresult)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc001005MarketRouteResult {
schema: "fastdoc.shell.editor-v0-doc-001-005-market-route-action.v1";
operationKind: "doc-001-005-market-route";
applied: boolean;
documentPath: string | null;
writebackDir: string;
finalOutputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
tasks: string[];
finalVisibleText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0Doc016025MarketRouteResult
[Section titled “EditorV0Doc016025MarketRouteResult”](#editorv0doc016025marketrouteresult)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface EditorV0Doc016025MarketRouteResult {
schema: "fastdoc.shell.editor-v0-doc-016-025-market-route-action.v1";
operationKind: "doc-016-025-market-route";
applied: boolean;
documentPath: string | null;
writebackDir: string;
objectDocumentPath: string;
linkedDocumentPath: string;
updatedLinkedDocumentPath: string;
finalOutputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
tasks: string[];
headingMap: string[];
finalVisibleText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### D36HeaderFooterMarketCommand
[Section titled “D36HeaderFooterMarketCommand”](#d36headerfootermarketcommand)
`TypeAliasDeclaration` · `api-market.ts`
```ts
type D36HeaderFooterMarketCommand =
| "header-default"
| "footer-default"
| "page-number-header"
| "page-number-footer"
| "page-number-first"
| "page-number-even"
| "page-number-start"
| "page-number-continue"
| "page-number-remove"
| "link-default-header"
| "link-default-footer"
| "unlink-default-header"
| "unlink-default-footer"
| "different-first-page"
| "different-odd-even"
| "header-footer-distances";
```
### D36HeaderFooterStoryVariant
[Section titled “D36HeaderFooterStoryVariant”](#d36headerfooterstoryvariant)
`TypeAliasDeclaration` · `api-market.ts`
```ts
type D36HeaderFooterStoryVariant = "default" | "first" | "even";
```
### D36HeaderFooterMarketRequest
[Section titled “D36HeaderFooterMarketRequest”](#d36headerfootermarketrequest)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface D36HeaderFooterMarketRequest {
command: D36HeaderFooterMarketCommand;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
pageNumberAlignment?: "left" | "center" | "right" | "inside" | "outside";
pageNumberFirstPage?: boolean;
pageNumberStart?: number;
pageNumberStyle?: "bottom-right-built-in" | null;
pageNumberEntryLayout?: "paragraph-before-number" | null;
enabled?: boolean;
storyVariant?: D36HeaderFooterStoryVariant;
headerDistanceTwips?: number | null;
footerDistanceTwips?: number | null;
}
```
### D36HeaderFooterMarketResult
[Section titled “D36HeaderFooterMarketResult”](#d36headerfootermarketresult)
`InterfaceDeclaration` · `api-market.ts`
```ts
interface D36HeaderFooterMarketResult {
schema: "fastdoc.shell.d36-header-footer-market-workflow.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
command: D36HeaderFooterMarketCommand;
label: string;
paragraphIndex: number;
currentByCommand: Record;
beforeHeaderFooterState: Record | null;
afterHeaderFooterState: Record | null;
beforePagination: Record | null;
afterPagination: Record | null;
writebackResult: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
# DTO · api-quick-parts.ts
> 6 shell-contract interfaces and 5 type aliases — quick parts: galleries, insertion modes, selection, and building-block storage.
6 interfaces and 5 type aliases — quick parts: galleries, insertion modes, selection, and building-block storage.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-quick-parts.ts`.
**Types on this page — 11**
* [`ShellQuickPartGallery`](#shellquickpartgallery)
* [`ShellQuickPartInsertionMode`](#shellquickpartinsertionmode)
* [`ShellQuickPartStoryKind`](#shellquickpartstorykind)
* [`ShellQuickPartsFieldScope`](#shellquickpartsfieldscope)
* [`ShellQuickPartSelection`](#shellquickpartselection)
* [`ShellQuickPartTarget`](#shellquickparttarget)
* [`ShellQuickPartBuildingBlock`](#shellquickpartbuildingblock)
* [`ShellQuickPartsStoreSnapshot`](#shellquickpartsstoresnapshot)
* [`ShellQuickPartsDocumentOperation`](#shellquickpartsdocumentoperation)
* [`ShellQuickPartsDocumentResult`](#shellquickpartsdocumentresult)
* [`FastDocQuickPartsApi`](#fastdocquickpartsapi)
### ShellQuickPartGallery
[Section titled “ShellQuickPartGallery”](#shellquickpartgallery)
`TypeAliasDeclaration` · `api-quick-parts.ts`
```ts
type ShellQuickPartGallery = "quick-parts" | "autotext";
```
### ShellQuickPartInsertionMode
[Section titled “ShellQuickPartInsertionMode”](#shellquickpartinsertionmode)
`TypeAliasDeclaration` · `api-quick-parts.ts`
```ts
type ShellQuickPartInsertionMode = "content" | "paragraph" | "page";
```
### ShellQuickPartStoryKind
[Section titled “ShellQuickPartStoryKind”](#shellquickpartstorykind)
`TypeAliasDeclaration` · `api-quick-parts.ts`
```ts
type ShellQuickPartStoryKind = "body" | "table-cell" | "header" | "footer" | "footnote" | "endnote" | "text-box";
```
### ShellQuickPartsFieldScope
[Section titled “ShellQuickPartsFieldScope”](#shellquickpartsfieldscope)
`TypeAliasDeclaration` · `api-quick-parts.ts`
```ts
type ShellQuickPartsFieldScope = "current" | "selection" | "all";
```
### ShellQuickPartSelection
[Section titled “ShellQuickPartSelection”](#shellquickpartselection)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface ShellQuickPartSelection {
storyKind: ShellQuickPartStoryKind;
storyIndex: number;
tableCellIndex: number | null;
blockStart: number;
blockEnd: number;
}
```
### ShellQuickPartTarget
[Section titled “ShellQuickPartTarget”](#shellquickparttarget)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface ShellQuickPartTarget {
storyKind: ShellQuickPartStoryKind;
storyIndex: number;
tableCellIndex: number | null;
blockIndex: number | null;
insertionMode: ShellQuickPartInsertionMode;
}
```
### ShellQuickPartBuildingBlock
[Section titled “ShellQuickPartBuildingBlock”](#shellquickpartbuildingblock)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface ShellQuickPartBuildingBlock {
id: string;
name: string;
gallery: ShellQuickPartGallery;
category: string;
description: string;
insertionMode: ShellQuickPartInsertionMode;
fragmentFile: string;
fragmentSha256: string;
sourceSelection: ShellQuickPartSelection;
createdAt: string;
updatedAt: string;
}
```
### ShellQuickPartsStoreSnapshot
[Section titled “ShellQuickPartsStoreSnapshot”](#shellquickpartsstoresnapshot)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface ShellQuickPartsStoreSnapshot {
schema: "fastdoc.quick-parts-store.v1";
version: 1;
revision: number;
updatedAt: string;
blocks: ShellQuickPartBuildingBlock[];
storePath: string;
recoveredFrom: "primary" | "backup" | "empty";
recoveryReason: string | null;
}
```
### ShellQuickPartsDocumentOperation
[Section titled “ShellQuickPartsDocumentOperation”](#shellquickpartsdocumentoperation)
`TypeAliasDeclaration` · `api-quick-parts.ts`
```ts
type ShellQuickPartsDocumentOperation = {
operationKind: "insert-building-block";
blockId: string;
target: ShellQuickPartTarget;
} | {
operationKind: "update-document-properties";
properties: {
title?: string;
author?: string;
subject?: string;
company?: string;
keywords?: string;
comments?: string;
custom?: Record;
};
} | {
operationKind: "insert-field";
field: {
instruction: string;
result?: string | null;
locked?: boolean;
target: ShellQuickPartTarget;
};
} | {
operationKind: "replace-field";
field: {
instruction: string;
result?: string | null;
locked?: boolean;
};
selection: ShellQuickPartSelection;
} | {
operationKind: "set-field-lock";
locked: boolean;
scope?: ShellQuickPartsFieldScope;
selection?: ShellQuickPartSelection | null;
updateAll?: boolean;
} | {
operationKind: "update-fields";
scope?: ShellQuickPartsFieldScope;
selection?: ShellQuickPartSelection | null;
updateAll?: boolean;
} | {
operationKind: "toggle-field-display";
showCodes: boolean;
};
```
### ShellQuickPartsDocumentResult
[Section titled “ShellQuickPartsDocumentResult”](#shellquickpartsdocumentresult)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface ShellQuickPartsDocumentResult extends Record {
applied: true;
outputPath: string;
operationKind: string;
reopened: boolean;
}
```
### FastDocQuickPartsApi
[Section titled “FastDocQuickPartsApi”](#fastdocquickpartsapi)
`InterfaceDeclaration` · `api-quick-parts.ts`
```ts
interface FastDocQuickPartsApi {
listQuickPartsBuildingBlocks(): Promise;
createQuickPartsBuildingBlock(request: {
name: string;
gallery: ShellQuickPartGallery;
category: string;
description?: string;
insertionMode: ShellQuickPartInsertionMode;
sourcePath?: string | null;
sourceSelection: ShellQuickPartSelection;
}): Promise;
updateQuickPartsBuildingBlock(request: {
id: string;
expectedRevision?: number | null;
name?: string;
gallery?: ShellQuickPartGallery;
category?: string;
description?: string;
insertionMode?: ShellQuickPartInsertionMode;
}): Promise;
deleteQuickPartsBuildingBlock(request: {
id: string;
expectedRevision?: number | null;
}): Promise;
applyQuickPartsDocumentOperation(request: ShellQuickPartsDocumentOperation & {
sourcePath?: string | null;
reopenAfterWrite?: boolean;
}): Promise;
}
```
# DTO · api-review.ts
> 48 interfaces and 6 type aliases of shell-contract—review: comments, tracked changes, review snapshots and spelling.
48 interfaces and 6 type aliases—review: comments, tracked changes, review snapshots and spelling.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-review.ts`.
Types on this page — 54
* [`ShellCommentAnchorResolution`](#shellcommentanchorresolution)
* [`ShellReviewComment`](#shellreviewcomment)
* [`ShellReviewTrackedChange`](#shellreviewtrackedchange)
* [`ShellReviewSnapshot`](#shellreviewsnapshot)
* [`ShellProofingProviderState`](#shellproofingproviderstate)
* [`ShellProofingWordCheckRequest`](#shellproofingwordcheckrequest)
* [`ShellProofingWordCheckResult`](#shellproofingwordcheckresult)
* [`ShellProofingDocumentPolicy`](#shellproofingdocumentpolicy)
* [`ShellProofingDictionaryResult`](#shellproofingdictionaryresult)
* [`ShellReviewActionPreviewOperation`](#shellreviewactionpreviewoperation)
* [`ShellReviewActionPreviewRequest`](#shellreviewactionpreviewrequest)
* [`ShellReviewActionPreviewResult`](#shellreviewactionpreviewresult)
* [`ShellReviewInsertCommentCopyRequest`](#shellreviewinsertcommentcopyrequest)
* [`ShellReviewInsertCommentCopyResult`](#shellreviewinsertcommentcopyresult)
* [`ShellReviewDeleteCommentCopyRequest`](#shellreviewdeletecommentcopyrequest)
* [`ShellReviewReplyCommentCopyRequest`](#shellreviewreplycommentcopyrequest)
* [`ShellReviewResolveCommentCopyRequest`](#shellreviewresolvecommentcopyrequest)
* [`ShellReviewSetCommentResolvedCopyRequest`](#shellreviewsetcommentresolvedcopyrequest)
* [`ShellReviewResolveAllCommentsCopyRequest`](#shellreviewresolveallcommentscopyrequest)
* [`ShellReviewResolveCommentsAuthorCopyRequest`](#shellreviewresolvecommentsauthorcopyrequest)
* [`ShellReviewResolveMyCommentsCopyRequest`](#shellreviewresolvemycommentscopyrequest)
* [`ShellReviewAcceptChangeCopyRequest`](#shellreviewacceptchangecopyrequest)
* [`ShellReviewRejectChangeCopyRequest`](#shellreviewrejectchangecopyrequest)
* [`ShellReviewModeCopyRequest`](#shellreviewmodecopyrequest)
* [`ShellReviewNewDocumentCopyRequest`](#shellreviewnewdocumentcopyrequest)
* [`ShellTrackedChangeMarkupModeRequest`](#shelltrackedchangemarkupmoderequest)
* [`ShellTrackedChangeMarkupModeResult`](#shelltrackedchangemarkupmoderesult)
* [`ShellReviewToolsActionId`](#shellreviewtoolsactionid)
* [`ShellFieldToolsActionId`](#shellfieldtoolsactionid)
* [`ShellDesignToolsActionId`](#shelldesigntoolsactionid)
* [`ShellInsertExtendedActionId`](#shellinsertextendedactionid)
* [`ShellFileInterchangeActionId`](#shellfileinterchangeactionid)
* [`ShellReviewToolsWritebackRequest`](#shellreviewtoolswritebackrequest)
* [`ShellFieldToolsWritebackRequest`](#shellfieldtoolswritebackrequest)
* [`ShellDesignToolsWritebackRequest`](#shelldesigntoolswritebackrequest)
* [`ShellInsertExtendedWritebackRequest`](#shellinsertextendedwritebackrequest)
* [`ShellFileInterchangeActionRequest`](#shellfileinterchangeactionrequest)
* [`ShellReviewDeleteCommentCopyResult`](#shellreviewdeletecommentcopyresult)
* [`ShellReviewReplyCommentCopyResult`](#shellreviewreplycommentcopyresult)
* [`ShellReviewResolveCommentCopyResult`](#shellreviewresolvecommentcopyresult)
* [`ShellReviewSetCommentResolvedCopyResult`](#shellreviewsetcommentresolvedcopyresult)
* [`ShellReviewResolveAllCommentsCopyResult`](#shellreviewresolveallcommentscopyresult)
* [`ShellReviewResolveCommentsAuthorCopyResult`](#shellreviewresolvecommentsauthorcopyresult)
* [`ShellReviewResolveMyCommentsCopyResult`](#shellreviewresolvemycommentscopyresult)
* [`ShellReviewAcceptChangeCopyResult`](#shellreviewacceptchangecopyresult)
* [`ShellReviewRejectChangeCopyResult`](#shellreviewrejectchangecopyresult)
* [`ShellReviewModeCopyResult`](#shellreviewmodecopyresult)
* [`ShellReviewNewDocumentCopyResult`](#shellreviewnewdocumentcopyresult)
* [`ShellReviewToolsWritebackResult`](#shellreviewtoolswritebackresult)
* [`ShellFieldToolsWritebackResult`](#shellfieldtoolswritebackresult)
* [`ShellDesignToolsWritebackResult`](#shelldesigntoolswritebackresult)
* [`ShellInsertExtendedWritebackResult`](#shellinsertextendedwritebackresult)
* [`ShellFileInterchangeActionResult`](#shellfileinterchangeactionresult)
* [`ShellReviewCommentRangeLineSegment`](#shellreviewcommentrangelinesegment)
### ShellCommentAnchorResolution
[Section titled “ShellCommentAnchorResolution”](#shellcommentanchorresolution)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellCommentAnchorResolution {
source_anchor_location: string;
resolution_kind: string;
paragraph_location: string | null;
line_location: string | null;
page_index: number | null;
section_index: number | null;
source_fragment_location: string | null;
scene_x_milli_px: number | null;
scene_y_milli_px: number | null;
detail: string;
support_markers?: ShellSupportMarker[];
}
```
### ShellReviewComment
[Section titled “ShellReviewComment”](#shellreviewcomment)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewComment {
comment_id: number;
author?: string | null;
initials?: string | null;
date?: string | null;
is_resolved?: boolean;
resolve_action_state?: string;
thread_parent_comment_id?: number | null;
thread_role?: string;
thread_identity_source?: string;
paragraph_texts: string[];
anchor_locations: string[];
anchor_ownership?: string;
deferred_anchor_count: number;
resolved_anchor_count: number;
anchor_resolutions?: ShellCommentAnchorResolution[];
block_count?: number;
support_markers?: ShellSupportMarker[];
}
```
### ShellReviewTrackedChange
[Section titled “ShellReviewTrackedChange”](#shellreviewtrackedchange)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewTrackedChange {
change_id?: number | null;
change_kind: string;
author?: string | null;
date?: string | null;
location: string;
text: string;
review_state: string;
prior_run_properties?: {
bold?: boolean | null;
italic?: boolean | null;
font_color_rgb?: string | null;
font_underline?: string | null;
font_underline_color_rgb?: string | null;
text_highlight_color?: string | null;
font_strikethrough?: string | null;
vertical_alignment?: string | null;
character_spacing_twips?: number | null;
character_scale_percent?: number | null;
character_position_half_points?: number | null;
character_kerning_half_points?: number | null;
text_effect?: string | null;
font_all_caps?: boolean | null;
font_small_caps?: boolean | null;
font_hidden?: boolean | null;
proofing_language?: string | null;
no_proof?: boolean | null;
} | null;
prior_run_property_names?: string[];
support_markers?: ShellSupportMarker[];
}
```
### ShellReviewSnapshot
[Section titled “ShellReviewSnapshot”](#shellreviewsnapshot)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewSnapshot {
stage_id: string;
comment_count: number;
tracked_change_count: number;
resolved_comment_anchor_count: number;
deferred_comment_anchor_count: number;
comments: ShellReviewComment[];
tracked_changes: ShellReviewTrackedChange[];
support_markers?: ShellSupportMarker[];
}
```
### ShellProofingProviderState
[Section titled “ShellProofingProviderState”](#shellproofingproviderstate)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellProofingProviderState {
schema: "fastdoc.shell.proofing-provider-state.v1";
providerKind: "nspell-local-hunspell";
localOnly: true;
ready: boolean;
status: "ready" | "missing-dictionary" | "provider-error";
availableLanguages: string[];
activeLanguages: string[];
requestedLanguages: string[];
missingLanguages: string[];
customWords: string[];
customDictionaryPath: string;
detail: string;
cloudDependencyClaimed: false;
grammarParityClaimed: false;
arabicLinguisticParityClaimed: false;
}
```
### ShellProofingWordCheckRequest
[Section titled “ShellProofingWordCheckRequest”](#shellproofingwordcheckrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellProofingWordCheckRequest {
words: Array<{
word: string;
language: "en-US" | "ru-RU";
}>;
}
```
### ShellProofingWordCheckResult
[Section titled “ShellProofingWordCheckResult”](#shellproofingwordcheckresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellProofingWordCheckResult {
schema: "fastdoc.shell.proofing-word-check.v1";
providerKind: "nspell-local-hunspell";
localOnly: true;
results: Array<{
word: string;
language: "en-US" | "ru-RU";
misspelled: boolean;
suggestions: string[];
}>;
}
```
### ShellProofingDocumentPolicy
[Section titled “ShellProofingDocumentPolicy”](#shellproofingdocumentpolicy)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellProofingDocumentPolicy {
schema: "fastdoc.shell.proofing-document-policy.v1";
documentPath: string;
trackRevisionsEnabled: boolean;
}
```
### ShellProofingDictionaryResult
[Section titled “ShellProofingDictionaryResult”](#shellproofingdictionaryresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellProofingDictionaryResult {
schema: "fastdoc.shell.proofing-dictionary-result.v1";
action: "add" | "remove" | "reset";
applied: boolean;
word: string | null;
customWords: string[];
persisted: boolean;
documentModified: false;
}
```
### ShellReviewActionPreviewOperation
[Section titled “ShellReviewActionPreviewOperation”](#shellreviewactionpreviewoperation)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellReviewActionPreviewOperation = "insert-comment" | "resolve-comment" | "accept-change" | "reject-change";
```
### ShellReviewActionPreviewRequest
[Section titled “ShellReviewActionPreviewRequest”](#shellreviewactionpreviewrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewActionPreviewRequest {
operation: ShellReviewActionPreviewOperation;
commentId?: number | null;
changeId?: number | null;
anchorLocation?: string | null;
anchorStartOffset?: number | null;
anchorEndOffset?: number | null;
text?: string | null;
author?: string | null;
}
```
### ShellReviewActionPreviewResult
[Section titled “ShellReviewActionPreviewResult”](#shellreviewactionpreviewresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewActionPreviewResult {
schema: "fastdoc.shell.review-action-preview.v1";
documentPath: string;
operationKind: string;
requestedTargetId: number;
resultKind: string;
mutationMode: string | null;
targetCommentId: number | null;
targetChangeId: number | null;
targetChangeKind: string | null;
targetLocation: string | null;
affectedCommentId?: number | null;
affectedCommentAuthor?: string | null;
mutatedCommentText?: string | null;
targetAnchorLocation?: string | null;
originalCommentCount: number | null;
mutatedCommentCount: number | null;
originalTrackedChangeCount: number | null;
mutatedTrackedChangeCount: number | null;
bodyEffectKind: string | null;
writebackState: "deferred";
writebackPerformed: false;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
supportMarkerKinds: string[];
snapshot: Record;
}
```
### ShellReviewInsertCommentCopyRequest
[Section titled “ShellReviewInsertCommentCopyRequest”](#shellreviewinsertcommentcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewInsertCommentCopyRequest {
documentPath: string;
anchorLocation: string;
anchorStartOffset?: number | null;
anchorEndOffset?: number | null;
text: string;
author?: string | null;
outputPath?: string | null;
reopenAfterWrite?: boolean | null;
}
```
### ShellReviewInsertCommentCopyResult
[Section titled “ShellReviewInsertCommentCopyResult”](#shellreviewinsertcommentcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewInsertCommentCopyResult {
schema: "fastdoc.shell.review-insert-comment-copy.v1";
documentPath: string;
outputPath: string | null;
route: ReviewCommandRouteKind;
anchorLocation: string | null;
requestedText: string;
requestedAuthor: string;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
affectedCommentId: number | null;
affectedCommentAuthor: string | null;
mutatedCommentText: string | null;
targetAnchorLocation: string | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
supportMarkerKinds: string[];
snapshot: Record;
}
```
### ShellReviewDeleteCommentCopyRequest
[Section titled “ShellReviewDeleteCommentCopyRequest”](#shellreviewdeletecommentcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewDeleteCommentCopyRequest {
commentId: number;
}
```
### ShellReviewReplyCommentCopyRequest
[Section titled “ShellReviewReplyCommentCopyRequest”](#shellreviewreplycommentcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewReplyCommentCopyRequest {
commentId: number;
text?: string;
author?: string | null;
}
```
### ShellReviewResolveCommentCopyRequest
[Section titled “ShellReviewResolveCommentCopyRequest”](#shellreviewresolvecommentcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveCommentCopyRequest {
commentId: number;
}
```
### ShellReviewSetCommentResolvedCopyRequest
[Section titled “ShellReviewSetCommentResolvedCopyRequest”](#shellreviewsetcommentresolvedcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewSetCommentResolvedCopyRequest {
commentId: number;
resolved: boolean;
historySafeOutput?: boolean;
}
```
### ShellReviewResolveAllCommentsCopyRequest
[Section titled “ShellReviewResolveAllCommentsCopyRequest”](#shellreviewresolveallcommentscopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveAllCommentsCopyRequest {
requestId?: string;
historySafeOutput?: boolean;
}
```
### ShellReviewResolveCommentsAuthorCopyRequest
[Section titled “ShellReviewResolveCommentsAuthorCopyRequest”](#shellreviewresolvecommentsauthorcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveCommentsAuthorCopyRequest {
author: string;
historySafeOutput?: boolean;
}
```
### ShellReviewResolveMyCommentsCopyRequest
[Section titled “ShellReviewResolveMyCommentsCopyRequest”](#shellreviewresolvemycommentscopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveMyCommentsCopyRequest {
author: string;
historySafeOutput?: boolean;
}
```
### ShellReviewAcceptChangeCopyRequest
[Section titled “ShellReviewAcceptChangeCopyRequest”](#shellreviewacceptchangecopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewAcceptChangeCopyRequest {
changeId: number;
author?: string;
changeKind?: string;
changeOccurrence?: number;
outputPath?: string;
historySafeOutput?: boolean;
}
```
### ShellReviewRejectChangeCopyRequest
[Section titled “ShellReviewRejectChangeCopyRequest”](#shellreviewrejectchangecopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewRejectChangeCopyRequest {
changeId: number;
author?: string;
changeKind?: string;
changeOccurrence?: number;
outputPath?: string;
historySafeOutput?: boolean;
}
```
### ShellReviewModeCopyRequest
[Section titled “ShellReviewModeCopyRequest”](#shellreviewmodecopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewModeCopyRequest {
enabled?: boolean;
outputPath?: string | null;
}
```
### ShellReviewNewDocumentCopyRequest
[Section titled “ShellReviewNewDocumentCopyRequest”](#shellreviewnewdocumentcopyrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewNewDocumentCopyRequest {
reviewMode?: "on";
}
```
### ShellTrackedChangeMarkupModeRequest
[Section titled “ShellTrackedChangeMarkupModeRequest”](#shelltrackedchangemarkupmoderequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellTrackedChangeMarkupModeRequest {
mode?: "in-line" | "balloon";
}
```
### ShellTrackedChangeMarkupModeResult
[Section titled “ShellTrackedChangeMarkupModeResult”](#shelltrackedchangemarkupmoderesult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellTrackedChangeMarkupModeResult {
schema: "fastdoc.shell.tracked-change-markup-mode.v1";
documentPath: string | null;
requestedMode: "in-line" | "balloon";
priorMode: "in-line" | "balloon";
effectiveMode: "in-line" | "balloon";
resultKind: "applied" | "no-op" | "no-document";
sceneReloaded: boolean;
balloonDrawOpCountBefore: number;
balloonDrawOpCountAfter: number;
documentModified: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
}
```
### ShellReviewToolsActionId
[Section titled “ShellReviewToolsActionId”](#shellreviewtoolsactionid)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellReviewToolsActionId =
| "check-spelling"
| "accept-spelling-suggestion"
| "ignore-spelling-issue"
| "add-word-to-dictionary"
| "check-grammar"
| "accept-grammar-suggestion"
| "set-proofing-language"
| "translate-selection"
| "compare-documents"
| "combine-documents"
| "accept-all-changes"
| "reject-all-changes"
| "accept-filtered-changes"
| "reject-filtered-changes"
| "preserve-review-markup-on-export"
| "protect-review-markup"
| "mark-as-final"
| "always-open-read-only"
| "block-authors"
| "restrict-editing-read-only"
| "restrict-editing-tracked-changes"
| "restrict-editing-comments"
| "restrict-editing-forms"
| "protected-view-enable-editing"
| "protected-view-close"
| "remove-review-protection";
```
### ShellFieldToolsActionId
[Section titled “ShellFieldToolsActionId”](#shellfieldtoolsactionid)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellFieldToolsActionId = "edit-hyperlink" | "remove-hyperlink" | "follow-hyperlink" | "toggle-field-codes" | "show-field-result" | "lock-field" | "unlock-field";
```
### ShellDesignToolsActionId
[Section titled “ShellDesignToolsActionId”](#shelldesigntoolsactionid)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellDesignToolsActionId =
| "apply-style-set-standard"
| "apply-style-set-plain"
| "apply-style-set-blue-accent"
| "apply-style-set-red-accent"
| "apply-style-set-warm"
| "apply-style-set-dark"
| "apply-style-set-teal"
| "apply-style-set-blue"
| "apply-style-set-green"
| "apply-style-set-classic"
| "apply-theme-standard"
| "apply-theme-headlines"
| "apply-theme-aspect"
| "apply-colors-office"
| "apply-colors-blue-green"
| "apply-colors-grayscale"
| "apply-fonts-aptos"
| "apply-fonts-calibri"
| "apply-fonts-cambria"
| "apply-effects-subtle"
| "apply-effects-soft"
| "apply-effects-intense"
| "apply-paragraph-spacing-compact"
| "apply-paragraph-spacing-open"
| "apply-paragraph-spacing-relaxed"
| "apply-page-color-none"
| "apply-page-color-theme-blue"
| "apply-page-color-warm"
| "apply-watermark-confidential"
| "apply-watermark-text"
| "apply-watermark-picture"
| "remove-watermark"
| "apply-page-border-none"
| "apply-page-border-box"
| "apply-page-border-shadow"
| "set-current-design-default";
```
### ShellInsertExtendedActionId
[Section titled “ShellInsertExtendedActionId”](#shellinsertextendedactionid)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellInsertExtendedActionId =
| "insert-cover-page"
| "insert-blank-page"
| "insert-wordart"
| "insert-field-page"
| "insert-icon-star"
| "insert-picture-search-image"
| "insert-picture-stock-image"
| "insert-picture-online"
| "insert-3d-model-package"
| "insert-smartart-process"
| "insert-chart-column"
| "insert-screenshot-capture"
| "insert-object-embedded-document"
| "insert-media-link"
| "insert-textbox-vertical";
```
### ShellFileInterchangeActionId
[Section titled “ShellFileInterchangeActionId”](#shellfileinterchangeactionid)
`TypeAliasDeclaration` · `api-review.ts`
```ts
type ShellFileInterchangeActionId =
| "open-docx-dialog"
| "open-import-dialog"
| "save-as-dialog"
| "open-recent-file"
| "document-open-integrity-check"
| "document-save-clean-copy"
| "document-recovery-snapshot"
| "document-title-path-stability"
| "export-html"
| "export-txt"
| "export-odt"
| "export-fb2"
| "export-epub"
| "export-pdf"
| "export-rtf"
| "save-docx-as"
| "convert-doc-html"
| "import-fb2"
| "import-epub"
| "import-html"
| "import-txt"
| "import-rtf"
| "import-odt"
| "import-xodt";
```
### ShellReviewToolsWritebackRequest
[Section titled “ShellReviewToolsWritebackRequest”](#shellreviewtoolswritebackrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewToolsWritebackRequest {
actionId: ShellReviewToolsActionId;
routeId?: "ribbon" | "review-command-center" | "market-launch-center";
originalPath?: string | null;
revisedPath?: string | null;
outputPath?: string | null;
author?: string | null;
date?: string | null;
changeIds?: number[];
changeAuthors?: string[];
changeKinds?: string[];
changeOccurrences?: number[];
historySafeOutput?: boolean;
password?: string | null;
permissionRanges?: Array<{
id: string;
user?: string | null;
group?: string | null;
startLocation: string;
endLocation: string;
}>;
}
```
### ShellFieldToolsWritebackRequest
[Section titled “ShellFieldToolsWritebackRequest”](#shellfieldtoolswritebackrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellFieldToolsWritebackRequest {
actionId: ShellFieldToolsActionId;
routeId?: "ribbon" | "field-command-center" | "market-launch-center";
}
```
### ShellDesignToolsWritebackRequest
[Section titled “ShellDesignToolsWritebackRequest”](#shelldesigntoolswritebackrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellDesignToolsWritebackRequest {
actionId: ShellDesignToolsActionId;
defaultActionIds?: ShellDesignToolsActionId[] | null;
selectPictureOnly?: boolean | null;
watermarkText?: string | null;
watermarkFont?: string | null;
watermarkSizePoints?: number | null;
watermarkColor?: string | null;
watermarkTransparencyPercent?: number | null;
watermarkOrientation?: "horizontal" | "diagonal" | null;
picturePath?: string | null;
reuseEmbeddedPicture?: boolean | null;
pictureScalePercent?: number | null;
pictureWashout?: boolean | null;
}
```
### ShellInsertExtendedWritebackRequest
[Section titled “ShellInsertExtendedWritebackRequest”](#shellinsertextendedwritebackrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellInsertExtendedWritebackRequest {
actionId: ShellInsertExtendedActionId;
paragraphIndex?: number | null;
offset?: number | null;
screenshotDataUrl?: string | null;
screenshotSourceLabel?: string | null;
screenshotSourcePageIndex?: number | null;
chartOperation?: "insert" | "update" | "resize" | "move" | "copy" | "delete";
chartTargetLocation?: string | null;
chartLocation?: string | null;
chartSpec?: {
chart_type: "column" | "line" | "pie";
title: string;
legend_position: "none" | "right" | "left" | "top" | "bottom";
data_labels: boolean;
categories: string[];
series: Array<{
name: string;
values: string[];
color_rgb: string;
}>;
} | null;
chartWidthEmu?: number | null;
chartHeightEmu?: number | null;
chartXOffsetEmu?: number | null;
chartYOffsetEmu?: number | null;
expectedDocumentPath?: string | null;
sourceDocumentPath?: string | null;
}
```
### ShellFileInterchangeActionRequest
[Section titled “ShellFileInterchangeActionRequest”](#shellfileinterchangeactionrequest)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellFileInterchangeActionRequest {
actionId: ShellFileInterchangeActionId;
routeId?: "file-menu" | "document-command-center" | "market-launch-center";
path?: string | null;
}
```
### ShellReviewDeleteCommentCopyResult
[Section titled “ShellReviewDeleteCommentCopyResult”](#shellreviewdeletecommentcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewDeleteCommentCopyResult {
schema: "fastdoc.shell.review-delete-comment-copy.v1";
documentPath: string;
outputPath: string | null;
requestedCommentId: number;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewReplyCommentCopyResult
[Section titled “ShellReviewReplyCommentCopyResult”](#shellreviewreplycommentcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewReplyCommentCopyResult {
schema: "fastdoc.shell.review-reply-comment-copy.v1";
documentPath: string;
outputPath: string | null;
requestedCommentId: number;
requestedReplyText: string;
requestedAuthor: string;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewResolveCommentCopyResult
[Section titled “ShellReviewResolveCommentCopyResult”](#shellreviewresolvecommentcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveCommentCopyResult {
schema: "fastdoc.shell.review-resolve-comment-copy.v1";
documentPath: string;
outputPath: string | null;
requestedCommentId: number;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewSetCommentResolvedCopyResult
[Section titled “ShellReviewSetCommentResolvedCopyResult”](#shellreviewsetcommentresolvedcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewSetCommentResolvedCopyResult {
schema: "fastdoc.shell.review-set-comment-resolved-copy.v1";
documentPath: string;
outputPath: string | null;
requestedCommentId: number;
requestedResolvedState: boolean;
beforeResolvedState: boolean | null;
afterResolvedState: boolean | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
passwordEncryptionParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewResolveAllCommentsCopyResult
[Section titled “ShellReviewResolveAllCommentsCopyResult”](#shellreviewresolveallcommentscopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveAllCommentsCopyResult {
schema: "fastdoc.shell.review-resolve-all-comments-copy.v1";
documentPath: string;
outputPath: string | null;
requestedCommentCount: number;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewResolveCommentsAuthorCopyResult
[Section titled “ShellReviewResolveCommentsAuthorCopyResult”](#shellreviewresolvecommentsauthorcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveCommentsAuthorCopyResult {
schema: "fastdoc.shell.review-resolve-comments-author-copy.v1";
documentPath: string;
outputPath: string | null;
requestedAuthor: string;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
beforeAuthorCommentCount: number;
afterAuthorCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewResolveMyCommentsCopyResult
[Section titled “ShellReviewResolveMyCommentsCopyResult”](#shellreviewresolvemycommentscopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewResolveMyCommentsCopyResult {
schema: "fastdoc.shell.review-resolve-my-comments-copy.v1";
documentPath: string;
outputPath: string | null;
requestedAuthor: string;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
beforeAuthorCommentCount: number;
afterAuthorCommentCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewAcceptChangeCopyResult
[Section titled “ShellReviewAcceptChangeCopyResult”](#shellreviewacceptchangecopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewAcceptChangeCopyResult {
schema: "fastdoc.shell.review-accept-change-copy.v1";
documentPath: string;
outputPath: string | null;
requestedChangeId: number;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeTrackedChangeCount: number;
afterTrackedChangeCount: number | null;
changedPartCount: number;
preservedPartCount: number;
bodyEffectKind: string | null;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewRejectChangeCopyResult
[Section titled “ShellReviewRejectChangeCopyResult”](#shellreviewrejectchangecopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewRejectChangeCopyResult {
schema: "fastdoc.shell.review-reject-change-copy.v1";
documentPath: string;
outputPath: string | null;
requestedChangeId: number;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeTrackedChangeCount: number;
afterTrackedChangeCount: number | null;
changedPartCount: number;
preservedPartCount: number;
bodyEffectKind: string | null;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewModeCopyResult
[Section titled “ShellReviewModeCopyResult”](#shellreviewmodecopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewModeCopyResult {
schema: "fastdoc.shell.review-mode-copy.v1";
documentPath: string;
outputPath: string | null;
route: ReviewModeRouteKind;
requestedReviewMode: "on" | "off";
priorReviewMode: "on" | "off" | null;
effectiveReviewMode: "on" | "off" | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeTrackedChangeCount: number;
afterTrackedChangeCount: number | null;
changedPartCount: number;
preservedPartCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string | null;
snapshot: Record;
}
```
### ShellReviewNewDocumentCopyResult
[Section titled “ShellReviewNewDocumentCopyResult”](#shellreviewnewdocumentcopyresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewNewDocumentCopyResult {
schema: "fastdoc.shell.review-new-document-copy.v1";
outputPath: string | null;
requestedReviewMode: "on";
effectiveReviewMode: "on" | "off" | "unknown";
reviewModeDefaultEnabled: boolean;
reviewState: string | null;
resultKind: string;
writebackResultKind: "written";
writebackPerformed: true;
trackedChangeCount: number;
commentCount: number;
fullReviewParityClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
detail: string;
snapshot: Record;
}
```
### ShellReviewToolsWritebackResult
[Section titled “ShellReviewToolsWritebackResult”](#shellreviewtoolswritebackresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewToolsWritebackResult {
schema: "fastdoc.shell.review-tools-writeback.v1";
documentPath: string;
outputPath: string | null;
requestedActionId: ShellReviewToolsActionId;
routeId?: "ribbon" | "review-command-center" | "market-launch-center";
taskId: string | null;
operationKind: string | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
beforeCommentCount: number;
afterCommentCount: number | null;
beforeTrackedChangeCount: number;
afterTrackedChangeCount: number | null;
changedPartCount: number;
preservedPartCount: number;
documentXmlMarkers: unknown[];
settingsXmlMarkers: unknown[];
customXmlParts: unknown[];
commentsXmlWritten: boolean;
proofingLanguage: string | null;
targetLanguage: string | null;
protectionMode: string | null;
fullWordProofingEngineClaimed: false;
fullWordTranslationEngineClaimed: false;
fullWordCompareEngineClaimed: false;
legalRedlineParityClaimed: false;
collaborationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
documentProtectionPasswordParityClaimed: false;
passwordMetadataPersisted?: boolean;
wrongPassword?: boolean;
sourceUnchanged?: boolean;
historyEntryCreated?: boolean;
dirtyStateChanged?: boolean;
signaturePresentBefore?: boolean;
signatureInvalidatedByMutation?: boolean;
signatureMessage?: string | null;
canceled?: boolean;
originalPath?: string | null;
revisedPath?: string | null;
originalSha256?: string | null;
revisedSha256?: string | null;
boundedScope?: string | null;
revisionIdRebaseCount?: number;
commentIdRebaseCount?: number;
atomicOutput?: boolean;
partialOutputPossible?: false;
snapshot: Record;
}
```
### ShellFieldToolsWritebackResult
[Section titled “ShellFieldToolsWritebackResult”](#shellfieldtoolswritebackresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellFieldToolsWritebackResult {
schema: "fastdoc.shell.field-tools-writeback.v1";
documentPath: string;
outputPath: string | null;
documentPathAfterReopen?: string | null;
currentDocumentReopened?: boolean;
requestedActionId: ShellFieldToolsActionId;
routeId?: "ribbon" | "field-command-center" | "market-launch-center";
taskId: string | null;
operationKind: string | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
changedPartCount: number;
preservedPartCount: number;
fieldCountBefore: number | null;
fieldCountAfter: number | null;
hyperlinkCountBefore: number | null;
hyperlinkCountAfter: number | null;
lockedFieldCountBefore: number | null;
lockedFieldCountAfter: number | null;
displayMode: string | null;
hyperlinkTarget: string | null;
documentXmlMarkers: unknown[];
relationshipMarkers: unknown[];
customXmlParts: unknown[];
fullWordFieldEngineClaimed: false;
recomputeParityClaimed: false;
browserNavigationParityClaimed: false;
wordSurfacePixelParityClaimed: false;
snapshot: Record;
}
```
### ShellDesignToolsWritebackResult
[Section titled “ShellDesignToolsWritebackResult”](#shelldesigntoolswritebackresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellDesignToolsWritebackResult {
schema: "fastdoc.shell.design-tools-writeback.v1";
documentPath: string;
outputPath: string | null;
outputSha256AtWriteback?: string | null;
saveReopenCount?: number;
selectedPicturePath?: string | null;
requestedActionId: ShellDesignToolsActionId;
taskId: string | null;
operationKind: string | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
changedPartCount: number;
preservedPartCount: number;
documentXmlMarkers: unknown[];
stylesXmlMarkers: unknown[];
themeXmlMarkers: unknown[];
settingsXmlMarkers: unknown[];
headerXmlMarkers: unknown[];
customXmlParts: unknown[];
designChoice: string | null;
pageBackgroundColor: string | null;
watermarkKind: string | null;
watermarkStoryPartNames: string[];
applicationDefaultPersisted?: boolean;
applicationDefaultActionIds?: ShellDesignToolsActionId[];
fullWordThemeEngineClaimed: false;
normalTemplateDefaultClaimed: false;
fullWordWatermarkVmlParityClaimed: false;
wordSurfacePixelParityClaimed: false;
snapshot: Record;
}
```
### ShellInsertExtendedWritebackResult
[Section titled “ShellInsertExtendedWritebackResult”](#shellinsertextendedwritebackresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellInsertExtendedWritebackResult {
schema: "fastdoc.shell.insert-extended-writeback.v1";
documentPath: string;
outputPath: string | null;
requestedActionId: ShellInsertExtendedActionId;
taskId: string | null;
operationKind: string | null;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
changedPartCount: number;
preservedPartCount: number;
documentXmlMarkers: unknown[];
relationshipMarkers: unknown[];
customXmlParts: unknown[];
contentPartNames: unknown[];
insertedVisibleText: unknown[];
screenshotCapture?: Record | null;
fullWordInsertGalleryClaimed: false;
fullWordIconsGalleryClaimed: false;
fullWordSmartArtEngineClaimed: false;
fullWordChartEngineClaimed: false;
fullWordMediaEmbeddingClaimed: false;
fullWordFieldEngineClaimed: false;
fullWord3dModelEngineClaimed: false;
wordSurfacePixelParityClaimed: false;
snapshot: Record;
}
```
### ShellFileInterchangeActionResult
[Section titled “ShellFileInterchangeActionResult”](#shellfileinterchangeactionresult)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellFileInterchangeActionResult {
schema: "fastdoc.shell.file-interchange-action.v1";
routeId?: "file-menu" | "document-command-center" | "market-launch-center";
documentPath: string | null;
sourceInputPath: string | null;
outputPath: string | null;
requestedActionId: ShellFileInterchangeActionId;
cliCommand: string;
resultKind: string;
writebackResultKind: string;
writebackPerformed: boolean;
outputKind: "html" | "fb2" | "epub" | "pdf" | "docx" | string;
outputByteCount: number;
documentTitleBefore: string | null;
documentSubtitleBefore: string | null;
documentPathAfter: string | null;
documentTitleAfter: string | null;
documentSubtitleAfter: string | null;
currentDocumentReopened: boolean;
dialogKind?: string | null;
nativeDialogManualPath?: boolean;
smokeDialogOverrideUsed?: boolean;
systemOpenDialogInvoked?: boolean;
systemSaveDialogInvoked?: boolean;
recentPath?: string | null;
shellUiRouteClaimed: true;
boundedWritebackClaimed: boolean;
fullFormatFidelityClaimed: false;
wordSameRouteClaimed: false;
wordSurfacePixelParityClaimed: false;
cloudImportExportClaimed: false;
snapshot: Record;
}
```
### ShellReviewCommentRangeLineSegment
[Section titled “ShellReviewCommentRangeLineSegment”](#shellreviewcommentrangelinesegment)
`InterfaceDeclaration` · `api-review.ts`
```ts
interface ShellReviewCommentRangeLineSegment {
page_index: number;
line_location: string;
scene_x_milli_px: number;
scene_width_milli_px: number;
page_scene_fingerprint: string;
}
```
# DTO · api-smoke.ts
> 1 shell-contract type alias — smoke-run modes: names of internal SumDoc build checks, not used in embedding.
1 type alias — smoke-run modes: names of internal SumDoc build checks, not used in embedding.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-smoke.ts`.
**Types on this page — 1**
* [`SmokeMode`](#smokemode)
### SmokeMode
[Section titled “SmokeMode”](#smokemode)
`TypeAliasDeclaration` · `api-smoke.ts`
```ts
type SmokeMode =
| "none"
| "open"
| "custom-titlebar"
| "reference-layout"
| "multipage-scroll"
| "viewport-page"
| "sticky-page-context"
| "scroll-rail"
| "font-canvas"
| "visual-preview"
| "product-list-status"
| "editor-v0-statusbar-document-statistics"
| "editor-v0-statusbar-nav-zoom-actions"
| "editor-v0-view-market-tranche"
| "editor-v0-nav-market-tranche"
| "a4-document-navigation-authoring-workflow"
| "editor-v0-hide-side-panels"
| "editor-v0-ui-locale-switch"
| "canvas-only"
| "inspector";
// …list truncated: first 20 shown, 382 values total
```
# DTO · api-view.ts
> 19 interfaces and 6 type aliases of shell-contract — display: inspector modes, rendering operations, text effects, and print view descriptors.
19 interfaces and 6 type aliases — display: inspector modes, rendering operations, text effects, and print view descriptors.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-view.ts`.
**Types on this page — 25**
* [`InspectorMode`](#inspectormode)
* [`ShellDrawOpKind`](#shelldrawopkind)
* [`ShellDrawOp`](#shelldrawop)
* [`ShellTextEffectPaintPass`](#shelltexteffectpaintpass)
* [`ShellTextEffectDrawOp`](#shelltexteffectdrawop)
* [`ShellPrintLineItem`](#shellprintlineitem)
* [`ShellPrintPage`](#shellprintpage)
* [`ShellPrintViewDescriptor`](#shellprintviewdescriptor)
* [`ShellPrintSnapshot`](#shellprintsnapshot)
* [`ShellPaginateFragment`](#shellpaginatefragment)
* [`ShellPaginateSnapshot`](#shellpaginatesnapshot)
* [`CurrentDocumentTruthViewerData`](#currentdocumenttruthviewerdata)
* [`EditorV0QuickPrintRangeMode`](#editorv0quickprintrangemode)
* [`EditorV0QuickPrintDuplexMode`](#editorv0quickprintduplexmode)
* [`EditorV0QuickPrintDispatchMode`](#editorv0quickprintdispatchmode)
* [`EditorV0QuickPrintSelectionGeometry`](#editorv0quickprintselectiongeometry)
* [`EditorV0QuickPrintPlanRequest`](#editorv0quickprintplanrequest)
* [`EditorV0QuickPrintNativeDispatchResult`](#editorv0quickprintnativedispatchresult)
* [`EditorV0QuickPrintPlanResult`](#editorv0quickprintplanresult)
* [`EditorV0SectionPageMarginsCommandRequest`](#editorv0sectionpagemarginscommandrequest)
* [`EditorV0SectionPageMarginsCommandResult`](#editorv0sectionpagemarginscommandresult)
* [`EditorV0SectionPageSetupPreset`](#editorv0sectionpagesetuppreset)
* [`EditorV0SectionPageSetupPresetRequest`](#editorv0sectionpagesetuppresetrequest)
* [`EditorV0SectionPageSetupPresetResult`](#editorv0sectionpagesetuppresetresult)
* [`ShellImageRaster`](#shellimageraster)
### InspectorMode
[Section titled “InspectorMode”](#inspectormode)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type InspectorMode = "print" | "paginate" | "report" | "review";
```
### ShellDrawOpKind
[Section titled “ShellDrawOpKind”](#shelldrawopkind)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type ShellDrawOpKind =
| "draw-text-line"
| "draw-line-number"
| "draw-table-cell-box"
| "draw-table-row-box"
| "draw-image-placeholder"
| "draw-paragraph-border-box"
| "draw-paragraph-shading-box"
| "draw-body-tracked-change-redline"
| "draw-body-tracked-change-balloon-bar"
| "draw-body-tracked-change-balloon-leader"
| "draw-review-comment-anchor"
| "draw-review-comment-surface"
| "draw-footnote-separator-line"
| "draw-endnote-separator-line"
| "draw-footnote-table-cell-box"
| "draw-footnote-table-row-box"
| "draw-shape-textbox"
| "draw-shape-rect"
| "draw-shape-ellipse"
| "draw-shape-round-rect"
| "draw-shape-triangle"
| "draw-shape-diamond"
| "draw-shape-pentagon"
| "draw-shape-hexagon"
| "draw-shape-parallelogram"
| "draw-shape-trapezoid"
| "draw-shape-plus"
| "draw-shape-star5"
| "draw-shape-can"
| "draw-shape-cube"
| "draw-shape-cloud"
| "draw-shape-flowchart-process"
| "draw-shape-flowchart-decision"
| "draw-shape-flowchart-data"
| "draw-shape-flowchart-terminator"
| "draw-shape-flowchart-document"
| "draw-shape-line"
| "draw-shape-left-arrow"
| "draw-shape-right-arrow"
| "draw-shape-up-arrow"
| "draw-shape-down-arrow"
| "draw-chart-column"
| "draw-chart-line"
| "draw-chart-pie"
| "draw-chart-error"
| "draw-embedded-preserved";
```
### ShellDrawOp
[Section titled “ShellDrawOp”](#shelldrawop)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellDrawOp {
draw_index: number;
op_kind: ShellDrawOpKind;
source_line_location: string;
scene_x_milli_px: number;
scene_y_milli_px: number;
scene_box_width_milli_px: number;
scene_box_height_milli_px: number;
text_baseline_offset_milli_px?: number | null;
text: string;
base_direction?: "ltr" | "rtl" | null;
font_family_name?: string | null;
font_size_half_points?: number | null;
font_bold?: boolean | null;
font_italic?: boolean | null;
font_color_rgb?: string | null;
font_underline?: string | null;
font_underline_color_rgb?: string | null;
text_highlight_color?: string | null;
text_shading_color_rgb?: string | null;
font_strikethrough?: string | null;
font_vertical_align?: string | null;
font_small_caps?: boolean | null;
font_small_caps_size_half_points?: number | null;
font_character_spacing_twips?: number | null;
d5_ink_bbox_scale_x_per_mille?: number | null;
table_cell_fill_color_rgb?: string | null;
table_cell_shading_pattern?: string | null;
table_cell_shading_foreground_color_rgb?: string | null;
table_cell_borders?: ShellTableCellBorder[] | null;
review_comment_id?: number | null;
}
```
### ShellTextEffectPaintPass
[Section titled “ShellTextEffectPaintPass”](#shelltexteffectpaintpass)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellTextEffectPaintPass {
pass_kind: "fill" | "stroke";
x_offset_milli_px: number;
y_offset_milli_px: number;
color_rgb: string;
alpha_per_mille: number;
line_width_milli_px: number;
}
```
### ShellTextEffectDrawOp
[Section titled “ShellTextEffectDrawOp”](#shelltexteffectdrawop)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellTextEffectDrawOp {
page_index: number;
target_draw_index: number;
source_line_location: string;
source_run_locations: string[];
text: string;
text_effect: "outline" | "shadow" | "emboss" | "imprint";
paint_passes: ShellTextEffectPaintPass[];
}
```
### ShellPrintLineItem
[Section titled “ShellPrintLineItem”](#shellprintlineitem)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPrintLineItem {
page_index: number;
section_index: number;
page_role: string;
paragraph_index: number;
paragraph_location: string;
line_index: number;
line_location: string;
text: string;
base_direction?: "ltr" | "rtl" | null;
width_milli_px: number;
keep_with_next?: boolean;
keep_lines_together?: boolean;
widow_control?: boolean;
page_break_before?: boolean;
drop_cap_kind?: string | null;
source_fragment_location: string;
scene_x_milli_px?: number | null;
scene_y_milli_px?: number | null;
scene_box_width_milli_px?: number | null;
scene_box_height_milli_px?: number | null;
text_baseline_offset_milli_px?: number | null;
d5_ink_bbox_scale_x_per_mille?: number | null;
font_family_name?: string | null;
font_size_half_points?: number | null;
font_bold?: boolean | null;
font_italic?: boolean | null;
font_color_rgb?: string | null;
font_underline?: string | null;
text_highlight_color?: string | null;
text_shading_color_rgb?: string | null;
font_strikethrough?: string | null;
font_vertical_align?: string | null;
fragments?: Array<{
run_location: string;
text: string;
font_family_name?: string | null;
font_size_half_points?: number | null;
font_bold?: boolean | null;
font_italic?: boolean | null;
font_color_rgb?: string | null;
font_underline?: string | null;
text_highlight_color?: string | null;
text_shading_color_rgb?: string | null;
font_strikethrough?: string | null;
font_vertical_align?: string | null;
}>;
}
```
### ShellPrintPage
[Section titled “ShellPrintPage”](#shellprintpage)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPrintPage {
page_index: number;
display_page_number: number;
section_index?: number;
page_role: string;
page_width_twips: number;
page_height_twips: number;
column_count: number;
column_space_twips?: number | null;
column_widths_twips: number[];
column_line_between: boolean;
column_right_to_left: boolean;
content_box_x_milli_px: number;
content_box_y_milli_px: number;
content_box_width_milli_px: number;
content_box_height_milli_px: number;
header_footer_live_band: {
text_left_milli_px: number;
header_text_top_milli_px: number;
footer_text_bottom_inset_milli_px: number;
header_band_top_milli_px: number;
footer_band_bottom_inset_milli_px: number;
band_height_milli_px: number;
line_height_milli_px: number;
retrospective_bar_left_milli_px: number;
font_family_name: string;
font_size_milli_px: number;
font_size_half_points: number;
font_bold: boolean;
font_italic: boolean;
};
scene_fingerprint: string;
screen_view: ShellPrintViewDescriptor;
pdf_view: ShellPrintViewDescriptor;
line_items?: ShellPrintLineItem[];
draw_ops: ShellDrawOp[];
support_markers?: ShellSupportMarker[];
}
```
### ShellPrintViewDescriptor
[Section titled “ShellPrintViewDescriptor”](#shellprintviewdescriptor)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPrintViewDescriptor {
view_kind: "screen" | "pdf";
source_scene_fingerprint: string;
view_fingerprint: string;
page_width_twips: number;
page_height_twips: number;
column_count: number;
column_space_twips?: number | null;
column_widths_twips: number[];
column_line_between: boolean;
column_right_to_left: boolean;
content_box_x_milli_px: number;
content_box_y_milli_px: number;
content_box_width_milli_px: number;
content_box_height_milli_px: number;
draw_op_count: number;
deferred_lane_markers: string[];
}
```
### ShellPrintSnapshot
[Section titled “ShellPrintSnapshot”](#shellprintsnapshot)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPrintSnapshot {
stage_id: string;
contract_mode: string;
fingerprint_mode: string;
document_fingerprint: string;
source_document_fingerprint?: string;
screen_view_fingerprint: string;
pdf_view_fingerprint: string;
page_count: number;
line_item_count: number;
draw_op_count: number;
text_effect_draw_ops?: ShellTextEffectDrawOp[];
pages: ShellPrintPage[];
support_markers?: ShellSupportMarker[];
scene_cache_limit?: number;
scene_cache_count?: number;
scene_cache_peak?: number;
hydration_payload_bytes?: number;
hydration_duration_ms?: number;
hydration_dropped_request_count?: number;
}
```
### ShellPaginateFragment
[Section titled “ShellPaginateFragment”](#shellpaginatefragment)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPaginateFragment {
page_index: number;
section_index: number;
section_source_location?: string;
section_type?: string | null;
title_page_enabled?: boolean;
page_number_in_section?: number;
page_number_start?: number | null;
page_role: string;
block_range_start: number;
block_range_end: number;
closing_boundary_kind: string;
observed_breaks?: ShellObservedBreak[];
header_binding?: {
binding_kind: string;
relationship_id: string;
target_part_name: string;
source_location: string;
source_kind?: string;
source_section_index?: number;
} | null;
footer_binding?: {
binding_kind: string;
relationship_id: string;
target_part_name: string;
source_location: string;
source_kind?: string;
source_section_index?: number;
} | null;
support_markers?: ShellSupportMarker[];
column_count?: number;
column_space_twips?: number;
column_widths_twips?: number[];
line_numbering_restart_mode?: string | null;
line_numbering_count_by?: number | null;
line_numbering_start?: number | null;
}
```
### ShellPaginateSnapshot
[Section titled “ShellPaginateSnapshot”](#shellpaginatesnapshot)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellPaginateSnapshot {
stage_id: string;
mirror_margins_enabled?: boolean;
even_and_odd_headers_enabled?: boolean;
section_count: number;
explicit_break_count: number;
rendered_break_observation_count: number;
page_fragment_count: number;
hard_split_count: number;
sections?: Array<{
section_index: number;
source_location: string;
section_type?: string | null;
page_width_twips: number;
page_height_twips: number;
margin_top_twips?: number;
margin_right_twips?: number;
margin_bottom_twips?: number;
margin_left_twips?: number;
header_distance_twips?: number;
footer_distance_twips?: number;
gutter_twips?: number;
title_page_enabled?: boolean;
page_number_start?: number | null;
column_count?: number;
column_space_twips?: number;
column_widths_twips?: number[];
line_numbering_restart_mode?: string | null;
line_numbering_count_by?: number | null;
line_numbering_start?: number | null;
}>;
page_fragments: ShellPaginateFragment[];
support_markers?: ShellSupportMarker[];
}
```
### CurrentDocumentTruthViewerData
[Section titled “CurrentDocumentTruthViewerData”](#currentdocumenttruthviewerdata)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface CurrentDocumentTruthViewerData {
schema: "fastdoc.desktop-truth.current-document-viewer-data.v1";
docxPath: string;
repoRelativeDocxPath: string | null;
availability: string;
fixtureId: string | null;
fixturePath: string | null;
comparisonIndexPath: string;
packetJsonPath: string | null;
packetMarkdownPath: string | null;
indexEntry: Record | null;
packet: Record | null;
blockedStates: unknown[];
forbiddenClaims: string[];
productHeartbeat: Record | null;
unavailableReason: string | null;
explicitUnclaimedAreas: string[];
}
```
### EditorV0QuickPrintRangeMode
[Section titled “EditorV0QuickPrintRangeMode”](#editorv0quickprintrangemode)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type EditorV0QuickPrintRangeMode = "all" | "current-page" | "selection" | "pages";
```
### EditorV0QuickPrintDuplexMode
[Section titled “EditorV0QuickPrintDuplexMode”](#editorv0quickprintduplexmode)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type EditorV0QuickPrintDuplexMode = "one-sided" | "long-edge" | "short-edge";
```
### EditorV0QuickPrintDispatchMode
[Section titled “EditorV0QuickPrintDispatchMode”](#editorv0quickprintdispatchmode)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type EditorV0QuickPrintDispatchMode = "plan-only" | "native-print-test-dry-run" | "native-print-dialog" | "native-print";
```
### EditorV0QuickPrintSelectionGeometry
[Section titled “EditorV0QuickPrintSelectionGeometry”](#editorv0quickprintselectiongeometry)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0QuickPrintSelectionGeometry {
anchorXMilliPx: number;
anchorYMilliPx: number;
focusXMilliPx: number;
focusYMilliPx: number;
lineLocation: string;
}
```
### EditorV0QuickPrintPlanRequest
[Section titled “EditorV0QuickPrintPlanRequest”](#editorv0quickprintplanrequest)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0QuickPrintPlanRequest {
outputPath?: string | null;
rangeMode?: EditorV0QuickPrintRangeMode;
pageRange?: string | null;
copies?: number;
duplexMode?: EditorV0QuickPrintDuplexMode;
currentPageIndex?: number | null;
selectionGeometry?: EditorV0QuickPrintSelectionGeometry | null;
dispatchMode?: EditorV0QuickPrintDispatchMode | null;
deviceName?: string | null;
}
```
### EditorV0QuickPrintNativeDispatchResult
[Section titled “EditorV0QuickPrintNativeDispatchResult”](#editorv0quickprintnativedispatchresult)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0QuickPrintNativeDispatchResult {
schema: "fastdoc.shell.editor-v0-quick-print-native-dispatch.v1";
requested: boolean;
dispatchMode: EditorV0QuickPrintDispatchMode;
dispatchState: "plan-only" | "native-print-test-dry-run-not-spooled" | "native-print-spooled" | "native-print-failed" | "native-print-dialog-completed" | "native-print-dialog-canceled" | "native-print-dialog-failed";
sharedScenePdfPath: string | null;
hiddenPrintWindowLoaded: boolean;
nativePrintApiCalled: boolean;
systemPrintDialogInvoked: boolean;
printerDriverSpoolExecuted: boolean;
printSuccess: boolean | null;
printCanceled: boolean;
failureReason: string | null;
sharedSceneOwner: "D5";
sourceLayoutContract: string | null;
sourceDocumentFingerprint: string | null;
sourceViewFingerprint: string | null;
pageSceneFingerprints: string[];
pageTextContracts: Record[];
selectedPageNumbers: number[];
pageCount: number | null;
copies: number;
duplexMode: EditorV0QuickPrintDuplexMode;
}
```
### EditorV0QuickPrintPlanResult
[Section titled “EditorV0QuickPrintPlanResult”](#editorv0quickprintplanresult)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0QuickPrintPlanResult {
prepared: boolean;
schema: "fastdoc.shell.editor-v0-quick-print-action-result.v1";
documentPath: string;
outputPath: string | null;
rangeMode: EditorV0QuickPrintRangeMode;
pageRange: string | null;
copies: number;
duplexMode: EditorV0QuickPrintDuplexMode;
duplexCapability: {
requestedMode: EditorV0QuickPrintDuplexMode;
planSupported: true;
nativeSupported: boolean;
state: "one-sided" | "plan-only-native-unsupported";
reason: string | null;
};
printerTarget: "a4-local-preview" | "system-default";
planPrinterTarget: "a4-local-preview";
planKind: string | null;
pageCount: number | null;
selectedPageNumbers: number[];
sheetCount: number | null;
dispatchFingerprint: string | null;
selectionGeometry: EditorV0QuickPrintSelectionGeometry | null;
dispatchMode: EditorV0QuickPrintDispatchMode;
nativePrintDispatch: EditorV0QuickPrintNativeDispatchResult;
plan: Record;
claims: Record;
}
```
### EditorV0SectionPageMarginsCommandRequest
[Section titled “EditorV0SectionPageMarginsCommandRequest”](#editorv0sectionpagemarginscommandrequest)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0SectionPageMarginsCommandRequest {
topMarginTwips: number;
rightMarginTwips: number;
bottomMarginTwips: number;
leftMarginTwips: number;
gutterTwips?: number | null;
gutterPosition?: "left" | "top" | null;
mirrorMarginsEnabled?: boolean | null;
multiplePages?: "normal" | "mirror" | "two-pages-per-sheet" | "book-fold" | "reverse-book-fold";
pageOrientation?: "portrait" | "landscape";
paperSize?: "a3" | "a4" | "a5" | "letter" | "custom";
paperWidthTwips?: number;
paperHeightTwips?: number;
paperSourceFirst?: number | null;
paperSourceOther?: number | null;
sectionStart?: "nextPage" | "continuous" | "newColumn" | "evenPage" | "oddPage";
suppressEndnotes?: boolean;
differentOddEvenPages?: boolean;
differentFirstPage?: boolean;
headerDistanceTwips?: number;
footerDistanceTwips?: number;
verticalAlignment?: "top" | "center" | "both" | "bottom";
lineNumberingMode?: "none" | "continuous" | "restart-page" | "restart-section";
lineNumberStart?: number;
lineNumberCountBy?: number;
lineNumberDistanceTwips?: number;
paragraphIndex: number;
paragraphIndexes?: number[] | null;
outputKind?: "editor-v0-vertical-ruler-margin-writeback";
rulerDragRole?: "section-left-margin" | "section-right-margin" | "section-top-margin" | "section-bottom-margin" | null;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0SectionPageMarginsCommandResult
[Section titled “EditorV0SectionPageMarginsCommandResult”](#editorv0sectionpagemarginscommandresult)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0SectionPageMarginsCommandResult {
applied: boolean;
outputPath: string;
topMarginTwips: number;
rightMarginTwips: number;
bottomMarginTwips: number;
leftMarginTwips: number;
gutterTwips?: number | null;
gutterPosition?: "left" | "top" | null;
mirrorMarginsEnabled?: boolean | null;
pageSetupValues?: Record;
paragraphIndex: number;
paragraphIndexes?: number[];
beforeTexts: string[];
afterTexts: string[];
}
```
### EditorV0SectionPageSetupPreset
[Section titled “EditorV0SectionPageSetupPreset”](#editorv0sectionpagesetuppreset)
`TypeAliasDeclaration` · `api-view.ts`
```ts
type EditorV0SectionPageSetupPreset =
| "paper-a3"
| "paper-a4"
| "paper-a5"
| "paper-letter"
| "orientation-portrait"
| "orientation-landscape"
| "margins-normal"
| "margins-narrow"
| "margins-wide"
| "margins-2cm"
| "margins-report"
| "margins-mirror"
| "margins-binding"
| "margins-binding-top"
| "margins-moderate"
| "columns-one"
| "columns-two"
| "columns-three"
| "columns-left"
| "columns-right"
| "columns-custom-widths";
```
### EditorV0SectionPageSetupPresetRequest
[Section titled “EditorV0SectionPageSetupPresetRequest”](#editorv0sectionpagesetuppresetrequest)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0SectionPageSetupPresetRequest {
preset: EditorV0SectionPageSetupPreset;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
columnWidthsTwips?: number[];
columnSpaceTwips?: number | null;
columnLineBetween?: boolean | null;
columnRightToLeft?: boolean | null;
selectedParagraphStartIndex?: number | null;
selectedParagraphEndIndex?: number | null;
}
```
### EditorV0SectionPageSetupPresetResult
[Section titled “EditorV0SectionPageSetupPresetResult”](#editorv0sectionpagesetuppresetresult)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface EditorV0SectionPageSetupPresetResult {
applied: boolean;
outputPath: string;
preset: EditorV0SectionPageSetupPreset;
label: string;
paragraphIndex: number;
beforePageSetupState: Record;
afterPageSetupState: Record | null;
selectedAction: Record | null;
mirrorMarginsEnabled?: boolean;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
}
```
### ShellImageRaster
[Section titled “ShellImageRaster”](#shellimageraster)
`InterfaceDeclaration` · `api-view.ts`
```ts
interface ShellImageRaster {
receipt_schema: "fastdoc.d38-raster-scene-receipt.v1";
session_id: string;
revision: number;
source_document_fingerprint: string;
requested_page_indexes: number[];
window_block_range_start?: number | null;
window_block_range_end?: number | null;
window_page_range_start: number;
window_page_range_end: number;
op_kind: "draw-image-raster";
page_index: number;
page_scene_fingerprint: string;
draw_index: number;
source_line_location: string;
relationship_id: string;
target_part_name: string;
content_type: "image/gif" | "image/jpeg" | "image/png";
package_fingerprint: string;
part_sha256: string;
byte_len: number;
data_base64: string;
intrinsic_width_px: number;
intrinsic_height_px: number;
crop_left?: number | null;
crop_top?: number | null;
crop_right?: number | null;
crop_bottom?: number | null;
rotation_degrees?: number | null;
flip_horizontal?: boolean | null;
flip_vertical?: boolean | null;
scene_x_milli_px: number;
scene_y_milli_px: number;
scene_box_width_milli_px: number;
scene_box_height_milli_px: number;
bytes_shared_with_draw_index?: number | null;
bytes_deferred?: boolean;
}
```
# DTO · Fields, footnotes, and references
> 34 interfaces and 8 type aliases from the `api-edit.ts` module — footnotes, table of contents, bibliography, indexes, mail merge, and form fields.
34 interfaces and 8 type aliases — footnotes, table of contents, bibliography, indexes, mail merge, and form fields.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · **Fields, footnotes, and references**.
Types on this page — 42
* [`EditorV0InsertDateFieldRequest`](#editorv0insertdatefieldrequest)
* [`EditorV0InsertDateTimeFieldRequest`](#editorv0insertdatetimefieldrequest)
* [`EditorV0DateFieldKind`](#editorv0datefieldkind)
* [`EditorV0UpdateDateFieldResultRequest`](#editorv0updatedatefieldresultrequest)
* [`EditorV0InsertFootnoteRequest`](#editorv0insertfootnoterequest)
* [`EditorV0ManageNoteKind`](#editorv0managenotekind)
* [`EditorV0ManageNoteAction`](#editorv0managenoteaction)
* [`EditorV0ManageNoteRequest`](#editorv0managenoterequest)
* [`EditorV0CrossReferenceFieldKind`](#editorv0crossreferencefieldkind)
* [`EditorV0InsertCrossReferenceRequest`](#editorv0insertcrossreferencerequest)
* [`EditorV0UpdateCrossReferenceFieldResultRequest`](#editorv0updatecrossreferencefieldresultrequest)
* [`EditorV0UpdateSequenceFieldResultRequest`](#editorv0updatesequencefieldresultrequest)
* [`EditorV0BibliographyStyleRequest`](#editorv0bibliographystylerequest)
* [`EditorV0BibliographyCommandAction`](#editorv0bibliographycommandaction)
* [`EditorV0BibliographyCommandRequest`](#editorv0bibliographycommandrequest)
* [`EditorV0IndexAuthoritiesCommandAction`](#editorv0indexauthoritiescommandaction)
* [`EditorV0IndexAuthoritiesCommandRequest`](#editorv0indexauthoritiescommandrequest)
* [`EditorV0MailMergeCommandAction`](#editorv0mailmergecommandaction)
* [`EditorV0MailMergeCommandRequest`](#editorv0mailmergecommandrequest)
* [`EditorV0FormsFieldsBusinessAction`](#editorv0formsfieldsbusinessaction)
* [`EditorV0FormsFieldsBusinessRequest`](#editorv0formsfieldsbusinessrequest)
* [`EditorV0InsertEndnoteRequest`](#editorv0insertendnoterequest)
* [`EditorV0InsertHyperlinkRequest`](#editorv0inserthyperlinkrequest)
* [`EditorV0InsertBookmarkRequest`](#editorv0insertbookmarkrequest)
* [`EditorV0InsertDateFieldResult`](#editorv0insertdatefieldresult)
* [`EditorV0InsertDateTimeFieldResult`](#editorv0insertdatetimefieldresult)
* [`EditorV0UpdateDateFieldResultResult`](#editorv0updatedatefieldresultresult)
* [`EditorV0InsertFootnoteResult`](#editorv0insertfootnoteresult)
* [`EditorV0ManageNoteResult`](#editorv0managenoteresult)
* [`EditorV0InsertCrossReferenceResult`](#editorv0insertcrossreferenceresult)
* [`EditorV0UpdateCrossReferenceFieldResultResult`](#editorv0updatecrossreferencefieldresultresult)
* [`EditorV0UpdateSequenceFieldResultResult`](#editorv0updatesequencefieldresultresult)
* [`EditorV0BibliographyStyleResult`](#editorv0bibliographystyleresult)
* [`EditorV0BibliographyCommandResult`](#editorv0bibliographycommandresult)
* [`EditorV0IndexAuthoritiesCommandResult`](#editorv0indexauthoritiescommandresult)
* [`EditorV0MailMergeCommandResult`](#editorv0mailmergecommandresult)
* [`EditorV0FormsFieldsBusinessResult`](#editorv0formsfieldsbusinessresult)
* [`EditorV0InsertTocResult`](#editorv0inserttocresult)
* [`EditorV0RemoveTocResult`](#editorv0removetocresult)
* [`EditorV0InsertEndnoteResult`](#editorv0insertendnoteresult)
* [`EditorV0InsertHyperlinkResult`](#editorv0inserthyperlinkresult)
* [`EditorV0InsertBookmarkResult`](#editorv0insertbookmarkresult)
### EditorV0InsertDateFieldRequest
[Section titled “EditorV0InsertDateFieldRequest”](#editorv0insertdatefieldrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDateFieldRequest {
paragraphIndex: number;
offset?: number | null;
isoDate: string;
picture?: string | null;
language?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertDateTimeFieldRequest
[Section titled “EditorV0InsertDateTimeFieldRequest”](#editorv0insertdatetimefieldrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDateTimeFieldRequest {
paragraphIndex: number;
offset?: number | null;
isoDateTime: string;
picture?: string | null;
language?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0DateFieldKind
[Section titled “EditorV0DateFieldKind”](#editorv0datefieldkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0DateFieldKind = "date" | "date-time";
```
### EditorV0UpdateDateFieldResultRequest
[Section titled “EditorV0UpdateDateFieldResultRequest”](#editorv0updatedatefieldresultrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateDateFieldResultRequest {
paragraphIndex: number;
fieldKind?: EditorV0DateFieldKind | null;
currentResult: string;
updatedResult: string;
picture?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertFootnoteRequest
[Section titled “EditorV0InsertFootnoteRequest”](#editorv0insertfootnoterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertFootnoteRequest {
paragraphIndex: number;
offset?: number | null;
noteText?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0ManageNoteKind
[Section titled “EditorV0ManageNoteKind”](#editorv0managenotekind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0ManageNoteKind = "footnote" | "endnote";
```
### EditorV0ManageNoteAction
[Section titled “EditorV0ManageNoteAction”](#editorv0managenoteaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0ManageNoteAction = "edit" | "delete";
```
### EditorV0ManageNoteRequest
[Section titled “EditorV0ManageNoteRequest”](#editorv0managenoterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ManageNoteRequest {
kind: EditorV0ManageNoteKind;
action: EditorV0ManageNoteAction;
noteId?: number | null;
noteText?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0CrossReferenceFieldKind
[Section titled “EditorV0CrossReferenceFieldKind”](#editorv0crossreferencefieldkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0CrossReferenceFieldKind = "REF" | "PAGEREF" | "NOTEREF";
```
### EditorV0InsertCrossReferenceRequest
[Section titled “EditorV0InsertCrossReferenceRequest”](#editorv0insertcrossreferencerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertCrossReferenceRequest {
paragraphIndex: number;
fieldKind?: EditorV0CrossReferenceFieldKind | null;
targetBookmark: string;
resultText: string;
targetKind?: "bookmark" | "caption" | null;
referenceKind?: "stored-result" | "only-label-and-number" | null;
captionLabel?: string | null;
captionParagraphIndex?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0UpdateCrossReferenceFieldResultRequest
[Section titled “EditorV0UpdateCrossReferenceFieldResultRequest”](#editorv0updatecrossreferencefieldresultrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateCrossReferenceFieldResultRequest {
paragraphIndex: number;
fieldKind?: EditorV0CrossReferenceFieldKind | null;
targetBookmark: string;
currentResult: string;
updatedResult: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0UpdateSequenceFieldResultRequest
[Section titled “EditorV0UpdateSequenceFieldResultRequest”](#editorv0updatesequencefieldresultrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateSequenceFieldResultRequest {
paragraphIndex: number;
fieldLabel: string;
currentResult: string;
updatedResult: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0BibliographyStyleRequest
[Section titled “EditorV0BibliographyStyleRequest”](#editorv0bibliographystylerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0BibliographyStyleRequest {
selectedStyle: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0BibliographyCommandAction
[Section titled “EditorV0BibliographyCommandAction”](#editorv0bibliographycommandaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0BibliographyCommandAction = "insert-citation" | "add-source" | "insert-bibliography";
```
### EditorV0BibliographyCommandRequest
[Section titled “EditorV0BibliographyCommandRequest”](#editorv0bibliographycommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0BibliographyCommandRequest {
action: EditorV0BibliographyCommandAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0IndexAuthoritiesCommandAction
[Section titled “EditorV0IndexAuthoritiesCommandAction”](#editorv0indexauthoritiescommandaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0IndexAuthoritiesCommandAction = "mark-index-entry" | "insert-index" | "update-index" | "mark-authority-citation" | "insert-table-of-authorities" | "update-table-of-authorities";
```
### EditorV0IndexAuthoritiesCommandRequest
[Section titled “EditorV0IndexAuthoritiesCommandRequest”](#editorv0indexauthoritiescommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0IndexAuthoritiesCommandRequest {
action: EditorV0IndexAuthoritiesCommandAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0MailMergeCommandAction
[Section titled “EditorV0MailMergeCommandAction”](#editorv0mailmergecommandaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0MailMergeCommandAction =
| "start-mail-merge"
| "select-recipients"
| "edit-recipient-list"
| "filter-recipients"
| "insert-merge-field"
| "insert-greeting-line"
| "insert-rule-if"
| "update-labels"
| "preview-results"
| "first-record"
| "previous-record"
| "next-record"
| "last-record"
| "finish-merge";
```
### EditorV0MailMergeCommandRequest
[Section titled “EditorV0MailMergeCommandRequest”](#editorv0mailmergecommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0MailMergeCommandRequest {
action: EditorV0MailMergeCommandAction;
recordIndex?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0FormsFieldsBusinessAction
[Section titled “EditorV0FormsFieldsBusinessAction”](#editorv0formsfieldsbusinessaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0FormsFieldsBusinessAction = "insert-form-controls" | "protect-forms" | "fill-form-values" | "attempt-body-edit-while-protected" | "unprotect-forms" | "insert-business-fields" | "update-business-fields" | "insert-merge-placeholders" | "merge-from-data";
```
### EditorV0FormsFieldsBusinessRequest
[Section titled “EditorV0FormsFieldsBusinessRequest”](#editorv0formsfieldsbusinessrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0FormsFieldsBusinessRequest {
action: EditorV0FormsFieldsBusinessAction;
dataSourcePath?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertEndnoteRequest
[Section titled “EditorV0InsertEndnoteRequest”](#editorv0insertendnoterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertEndnoteRequest {
paragraphIndex: number;
offset?: number | null;
noteText?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertHyperlinkRequest
[Section titled “EditorV0InsertHyperlinkRequest”](#editorv0inserthyperlinkrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertHyperlinkRequest {
paragraphIndex: number;
offset?: number | null;
deleteCount?: number | null;
hyperlinkUrl: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertBookmarkRequest
[Section titled “EditorV0InsertBookmarkRequest”](#editorv0insertbookmarkrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertBookmarkRequest {
paragraphIndex: number;
offset: number;
deleteCount: number;
bookmarkName: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertDateFieldResult
[Section titled “EditorV0InsertDateFieldResult”](#editorv0insertdatefieldresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDateFieldResult {
schema: "fastdoc.shell.editor-v0-insert-date-field-action.v1";
operationKind: "insert-date-field";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
offset: number;
isoDate: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertDateTimeFieldResult
[Section titled “EditorV0InsertDateTimeFieldResult”](#editorv0insertdatetimefieldresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDateTimeFieldResult {
schema: "fastdoc.shell.editor-v0-insert-date-time-field-action.v1";
operationKind: "insert-date-time-field";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
offset: number;
isoDateTime: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UpdateDateFieldResultResult
[Section titled “EditorV0UpdateDateFieldResultResult”](#editorv0updatedatefieldresultresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateDateFieldResultResult {
schema: "fastdoc.shell.editor-v0-update-date-field-result-action.v1";
operationKind: "update-date-field-result";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
fieldKind: EditorV0DateFieldKind;
currentResult: string;
updatedResult: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertFootnoteResult
[Section titled “EditorV0InsertFootnoteResult”](#editorv0insertfootnoteresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertFootnoteResult {
schema: "fastdoc.shell.editor-v0-insert-footnote-action.v1";
operationKind: "insert-footnote";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
offset: number;
noteText: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0ManageNoteResult
[Section titled “EditorV0ManageNoteResult”](#editorv0managenoteresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ManageNoteResult {
schema: "fastdoc.shell.editor-v0-manage-note-action.v1";
operationKind: "edit-footnote" | "delete-footnote" | "edit-endnote" | "delete-endnote";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
kind: EditorV0ManageNoteKind;
action: EditorV0ManageNoteAction;
noteId: number;
noteText: string | null;
previousText: string;
noteCountBefore: number;
noteCountAfter: number;
referenceCountBefore: number;
referenceCountAfter: number;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertCrossReferenceResult
[Section titled “EditorV0InsertCrossReferenceResult”](#editorv0insertcrossreferenceresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertCrossReferenceResult {
schema: "fastdoc.shell.editor-v0-insert-cross-reference-action.v1";
operationKind: "insert-cross-reference";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
fieldKind: EditorV0CrossReferenceFieldKind;
targetBookmark: string;
resultText: string;
targetKind: "bookmark" | "caption";
referenceKind: "stored-result" | "only-label-and-number";
captionLabel: string | null;
captionParagraphIndex: number | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UpdateCrossReferenceFieldResultResult
[Section titled “EditorV0UpdateCrossReferenceFieldResultResult”](#editorv0updatecrossreferencefieldresultresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateCrossReferenceFieldResultResult {
schema: "fastdoc.shell.editor-v0-update-cross-reference-field-result-action.v1";
operationKind: "update-cross-reference-field-result";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
fieldKind: EditorV0CrossReferenceFieldKind;
targetBookmark: string;
currentResult: string;
updatedResult: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UpdateSequenceFieldResultResult
[Section titled “EditorV0UpdateSequenceFieldResultResult”](#editorv0updatesequencefieldresultresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateSequenceFieldResultResult {
schema: "fastdoc.shell.editor-v0-update-sequence-field-result-action.v1";
operationKind: "update-sequence-field-result";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
fieldLabel: string;
currentResult: string;
updatedResult: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0BibliographyStyleResult
[Section titled “EditorV0BibliographyStyleResult”](#editorv0bibliographystyleresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0BibliographyStyleResult {
schema: "fastdoc.shell.editor-v0-bibliography-style-action.v1";
operationKind: "set-bibliography-style";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selectedStyle: string;
previousStyle: string | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0BibliographyCommandResult
[Section titled “EditorV0BibliographyCommandResult”](#editorv0bibliographycommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0BibliographyCommandResult {
schema: "fastdoc.shell.editor-v0-bibliography-command-action.v1";
operationKind: "bibliography-command";
action: EditorV0BibliographyCommandAction;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
sourceCountBefore: number | null;
sourceCountAfter: number | null;
fieldCountBefore: number | null;
fieldCountAfter: number | null;
citationFieldCountBefore: number | null;
citationFieldCountAfter: number | null;
bibliographyFieldCountBefore: number | null;
bibliographyFieldCountAfter: number | null;
insertedCitationTag: string | null;
insertedCitationResultText: string | null;
addedSourceTag: string | null;
insertedBibliographyResultText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0IndexAuthoritiesCommandResult
[Section titled “EditorV0IndexAuthoritiesCommandResult”](#editorv0indexauthoritiescommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0IndexAuthoritiesCommandResult {
schema: "fastdoc.shell.editor-v0-index-authorities-command-action.v1";
operationKind: "index-authorities-command";
action: EditorV0IndexAuthoritiesCommandAction;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
fieldCountBefore: number | null;
fieldCountAfter: number | null;
xeFieldCountBefore: number | null;
xeFieldCountAfter: number | null;
indexFieldCountBefore: number | null;
indexFieldCountAfter: number | null;
taFieldCountBefore: number | null;
taFieldCountAfter: number | null;
toaFieldCountBefore: number | null;
toaFieldCountAfter: number | null;
insertedIndexEntryText: string | null;
insertedIndexResultText: string | null;
updatedIndexResultText: string | null;
insertedAuthorityEntryText: string | null;
insertedTableOfAuthoritiesResultText: string | null;
updatedTableOfAuthoritiesResultText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
fullWordFieldEngineClaim: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0MailMergeCommandResult
[Section titled “EditorV0MailMergeCommandResult”](#editorv0mailmergecommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0MailMergeCommandResult {
schema: "fastdoc.shell.editor-v0-mail-merge-command-action.v1";
operationKind: "mail-merge-command";
action: EditorV0MailMergeCommandAction;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
fieldCountBefore: number | null;
fieldCountAfter: number | null;
mergeFieldCountBefore: number | null;
mergeFieldCountAfter: number | null;
ifFieldCountBefore: number | null;
ifFieldCountAfter: number | null;
settingsMailMergeBefore: boolean | null;
settingsMailMergeAfter: boolean | null;
recipientCount: number | null;
activeRecordIndexBefore: number | null;
activeRecordIndexAfter: number | null;
activeRecordDisplayText: string | null;
insertedMergeFieldNames: string[];
previewRecordIndex: number | null;
previewResultText: string | null;
finishRecordIndex: number | null;
finishResultText: string | null;
labelsResultText: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
externalDataSourceClaim: false;
outlookDeliveryClaim: false;
fullWordMailMergeEngineClaim: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0FormsFieldsBusinessResult
[Section titled “EditorV0FormsFieldsBusinessResult”](#editorv0formsfieldsbusinessresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0FormsFieldsBusinessResult {
schema: "fastdoc.shell.editor-v0-forms-fields-business-action.v1";
operationKind: "forms-fields-business-command";
action: EditorV0FormsFieldsBusinessAction;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
dataSourcePath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
formTextInputCountAfter: number | null;
formCheckboxCountAfter: number | null;
formDropdownCountAfter: number | null;
formValueCountAfter: number | null;
protectionEditAfter: string | null;
bodyEditBlocked: boolean | null;
unprotectRestoresEditing: boolean | null;
dateFieldCountAfter: number | null;
documentPropertyFieldCountAfter: number | null;
refFieldCountAfter: number | null;
calculatedFieldCountAfter: number | null;
fieldsUpdated: boolean | null;
mergePlaceholderCountAfter: number | null;
mergeRecordCount: number | null;
mergeTemplatePreserved: boolean | null;
mergeOutputDocxTruth: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
passwordOrEncryptionParityClaim: false;
fullWordFieldEngineClaim: false;
fullWordMailMergeEngineClaim: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertTocResult
[Section titled “EditorV0InsertTocResult”](#editorv0inserttocresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertTocResult {
schema: "fastdoc.shell.editor-v0-insert-toc-action.v1";
operationKind: "insert-toc";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
insertedInstructionText: string | null;
insertedResultText: string | null;
tocFieldCountBefore: number | null;
tocFieldCountAfter: number | null;
headingCount: number | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0RemoveTocResult
[Section titled “EditorV0RemoveTocResult”](#editorv0removetocresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0RemoveTocResult {
schema: "fastdoc.shell.editor-v0-remove-toc-action.v1";
operationKind: "remove-toc";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
removedResultText: string | null;
removedBlockIndex: number | null;
tocFieldCountBefore: number | null;
tocFieldCountAfter: number | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertEndnoteResult
[Section titled “EditorV0InsertEndnoteResult”](#editorv0insertendnoteresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertEndnoteResult {
schema: "fastdoc.shell.editor-v0-insert-endnote-action.v1";
operationKind: "insert-endnote";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
offset: number;
noteText: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertHyperlinkResult
[Section titled “EditorV0InsertHyperlinkResult”](#editorv0inserthyperlinkresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertHyperlinkResult {
schema: "fastdoc.shell.editor-v0-insert-hyperlink-action.v1";
operationKind: "auto-create-hyperlink";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
offset: number;
deleteCount: number;
hyperlinkUrl: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertBookmarkResult
[Section titled “EditorV0InsertBookmarkResult”](#editorv0insertbookmarkresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertBookmarkResult {
schema: "fastdoc.shell.editor-v0-insert-bookmark-action.v1";
operationKind: "insert-bookmark";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
offset: number;
deleteCount: number;
bookmarkName: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
# DTO · Objects and drawings
> 29 interfaces and 2 type aliases from the `api-edit.ts` module — images, shapes, formulas, and other insertable objects.
29 interfaces and 2 type aliases — images, shapes, formulas, and other insertable objects.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · **Objects and drawings** · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
Types on this page — 31
* [`EditorV0InsertImageObjectRequest`](#editorv0insertimageobjectrequest)
* [`EditorV0InsertTextBoxObjectRequest`](#editorv0inserttextboxobjectrequest)
* [`EditorV0InsertShapeObjectRequest`](#editorv0insertshapeobjectrequest)
* [`EditorV0InsertEquationObjectRequest`](#editorv0insertequationobjectrequest)
* [`EditorV0EquationSymbolAuthoringRequest`](#editorv0equationsymbolauthoringrequest)
* [`EditorV0EditEquationObjectRequest`](#editorv0editequationobjectrequest)
* [`EditorV0ResizeDrawingObjectRequest`](#editorv0resizedrawingobjectrequest)
* [`EditorV0MoveDrawingObjectRequest`](#editorv0movedrawingobjectrequest)
* [`EditorV0DistributeDrawingObjectsRequest`](#editorv0distributedrawingobjectsrequest)
* [`EditorV0SetDrawingObjectStyleRequest`](#editorv0setdrawingobjectstylerequest)
* [`EditorV0DeleteDrawingObjectRequest`](#editorv0deletedrawingobjectrequest)
* [`EditorV0SetDrawingObjectAnchorLockRequest`](#editorv0setdrawingobjectanchorlockrequest)
* [`EditorV0GroupDrawingObjectsRequest`](#editorv0groupdrawingobjectsrequest)
* [`EditorV0UngroupDrawingObjectRequest`](#editorv0ungroupdrawingobjectrequest)
* [`EditorV0EditDrawingObjectTextRequest`](#editorv0editdrawingobjecttextrequest)
* [`EditorV0InsertObjectTextFileSourceResult`](#editorv0insertobjecttextfilesourceresult)
* [`EditorV0InsertImageObjectResult`](#editorv0insertimageobjectresult)
* [`EditorV0InsertEquationObjectResult`](#editorv0insertequationobjectresult)
* [`EditorV0EquationSymbolAuthoringResult`](#editorv0equationsymbolauthoringresult)
* [`EditorV0EditEquationObjectResult`](#editorv0editequationobjectresult)
* [`EditorV0InsertTextBoxObjectResult`](#editorv0inserttextboxobjectresult)
* [`EditorV0InsertShapeObjectResult`](#editorv0insertshapeobjectresult)
* [`EditorV0EditDrawingObjectTextResult`](#editorv0editdrawingobjecttextresult)
* [`EditorV0ResizeDrawingObjectResult`](#editorv0resizedrawingobjectresult)
* [`EditorV0MoveDrawingObjectResult`](#editorv0movedrawingobjectresult)
* [`EditorV0DistributeDrawingObjectsResult`](#editorv0distributedrawingobjectsresult)
* [`EditorV0SetDrawingObjectStyleResult`](#editorv0setdrawingobjectstyleresult)
* [`EditorV0DeleteDrawingObjectResult`](#editorv0deletedrawingobjectresult)
* [`EditorV0SetDrawingObjectAnchorLockResult`](#editorv0setdrawingobjectanchorlockresult)
* [`EditorV0GroupDrawingObjectsResult`](#editorv0groupdrawingobjectsresult)
* [`EditorV0UngroupDrawingObjectResult`](#editorv0ungroupdrawingobjectresult)
### EditorV0InsertImageObjectRequest
[Section titled “EditorV0InsertImageObjectRequest”](#editorv0insertimageobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertImageObjectRequest {
paragraphIndex: number;
imagePath: string;
wrapMode?: "inline" | "square" | "tight" | "through" | "top-bottom" | "behind-text" | "in-front-of-text" | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertTextBoxObjectRequest
[Section titled “EditorV0InsertTextBoxObjectRequest”](#editorv0inserttextboxobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertTextBoxObjectRequest {
paragraphIndex: number;
text?: string | null;
displayName?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
widthEmu?: number | null;
heightEmu?: number | null;
}
```
### EditorV0InsertShapeObjectRequest
[Section titled “EditorV0InsertShapeObjectRequest”](#editorv0insertshapeobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertShapeObjectRequest {
paragraphIndex: number;
shape?: "rect" | string | null;
displayName?: string | null;
text?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
widthEmu?: number | null;
heightEmu?: number | null;
}
```
### EditorV0InsertEquationObjectRequest
[Section titled “EditorV0InsertEquationObjectRequest”](#editorv0insertequationobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertEquationObjectRequest {
schema?: "fastdoc.shell.equation-symbol-authoring.request.v1";
operationKind?: "insert-equation" | "edit-equation" | "delete-equation" | "insert-symbol";
selection?: {
partName: string;
paragraphLocation: string;
textOffset: number;
} | null;
equationIndex?: number | null;
linearInput?: string | null;
symbol?: string | null;
expectedDocumentPath?: string | null;
expectedPartHash?: string | null;
historyDepth?: number | null;
paragraphIndex?: number;
text?: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0EquationSymbolAuthoringRequest
[Section titled “EditorV0EquationSymbolAuthoringRequest”](#editorv0equationsymbolauthoringrequest)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0EquationSymbolAuthoringRequest = EditorV0InsertEquationObjectRequest;
```
### EditorV0EditEquationObjectRequest
[Section titled “EditorV0EditEquationObjectRequest”](#editorv0editequationobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditEquationObjectRequest {
equationIndex?: number | null;
text: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0ResizeDrawingObjectRequest
[Section titled “EditorV0ResizeDrawingObjectRequest”](#editorv0resizedrawingobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ResizeDrawingObjectRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
widthEmu: number;
heightEmu: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0MoveDrawingObjectRequest
[Section titled “EditorV0MoveDrawingObjectRequest”](#editorv0movedrawingobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0MoveDrawingObjectRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
xOffsetEmu: number;
yOffsetEmu: number;
xRelativeFrom?: string | null;
yRelativeFrom?: string | null;
sourcePart?: string | null;
sourceDrawingIndex?: number | null;
wrapMode?: "inline" | "square" | "tight" | "through" | "top-bottom" | "behind-text" | "in-front-of-text" | null;
positionBehavior?: "move-with-text" | "fix-position-on-page" | null;
arrangeMode?: "bring-forward" | "bring-front" | "send-backward" | "send-back" | "behind-text" | "in-front-of-text" | null;
alignHorizontal?: "left" | "center" | "right" | null;
alignVertical?: "top" | "center" | "bottom" | null;
alignRelativeFrom?: "margin" | "page" | null;
rotateDegrees?: number | null;
locked?: boolean | null;
hidden?: boolean | null;
duplicateTargetPart?: string | null;
duplicateTargetStory?: "body" | "table" | "header" | "footer" | null;
duplicateTargetParagraphIndex?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0DistributeDrawingObjectsRequest
[Section titled “EditorV0DistributeDrawingObjectsRequest”](#editorv0distributedrawingobjectsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0DistributeDrawingObjectsRequest {
objectLocations: string[];
axis: "horizontal" | "vertical";
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0SetDrawingObjectStyleRequest
[Section titled “EditorV0SetDrawingObjectStyleRequest”](#editorv0setdrawingobjectstylerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0SetDrawingObjectStyleRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
fillRgb?: string | null;
fillOpacityPercent?: number | null;
outlineRgb?: string | null;
outlineWidthEmu?: number | null;
outlineOpacityPercent?: number | null;
textDirection?: "horizontal" | "vertical" | "vertical-270" | null;
textAutofit?: "none" | "resize-shape" | "shrink-text" | null;
displayName?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0DeleteDrawingObjectRequest
[Section titled “EditorV0DeleteDrawingObjectRequest”](#editorv0deletedrawingobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0DeleteDrawingObjectRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0SetDrawingObjectAnchorLockRequest
[Section titled “EditorV0SetDrawingObjectAnchorLockRequest”](#editorv0setdrawingobjectanchorlockrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0SetDrawingObjectAnchorLockRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
locked: boolean;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0GroupDrawingObjectsRequest
[Section titled “EditorV0GroupDrawingObjectsRequest”](#editorv0groupdrawingobjectsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0GroupDrawingObjectsRequest {
objectLocations: string[];
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0UngroupDrawingObjectRequest
[Section titled “EditorV0UngroupDrawingObjectRequest”](#editorv0ungroupdrawingobjectrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UngroupDrawingObjectRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0EditDrawingObjectTextRequest
[Section titled “EditorV0EditDrawingObjectTextRequest”](#editorv0editdrawingobjecttextrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditDrawingObjectTextRequest {
objectLocation?: string | null;
sourceLocation?: string | null;
text?: string | null;
textSourcePath?: string | null;
textFromFile?: boolean;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertObjectTextFileSourceResult
[Section titled “EditorV0InsertObjectTextFileSourceResult”](#editorv0insertobjecttextfilesourceresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertObjectTextFileSourceResult {
canceled: boolean;
path: string | null;
text: string;
length: number;
}
```
### EditorV0InsertImageObjectResult
[Section titled “EditorV0InsertImageObjectResult”](#editorv0insertimageobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertImageObjectResult {
schema: "fastdoc.shell.editor-v0-insert-image-object-action.v1";
operationKind: "insert-image-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
imagePath: string | null;
paragraphIndex: number;
mediaPartName: string | null;
relationshipId: string | null;
contentKind: string | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertEquationObjectResult
[Section titled “EditorV0InsertEquationObjectResult”](#editorv0insertequationobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertEquationObjectResult {
schema: "fastdoc.shell.editor-v0-insert-equation-object-action.v1";
operationKind: "insert-equation-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number | null;
equationIndex: number | null;
beforeText: string | null;
afterText: string | null;
sourceUnchanged: boolean | null;
resultKind?: string | null;
authoringOperationKind?: string | null;
changedPartName?: string | null;
canonicalLinearInput?: string | null;
equationInventory?: unknown[];
preservedUnknownSubtreeHashes?: string[];
packageVerifiedAfterReopen?: boolean | null;
historyDepth?: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0EquationSymbolAuthoringResult
[Section titled “EditorV0EquationSymbolAuthoringResult”](#editorv0equationsymbolauthoringresult)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0EquationSymbolAuthoringResult = EditorV0InsertEquationObjectResult;
```
### EditorV0EditEquationObjectResult
[Section titled “EditorV0EditEquationObjectResult”](#editorv0editequationobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditEquationObjectResult {
schema: "fastdoc.shell.editor-v0-edit-equation-object-action.v1";
operationKind: "edit-equation-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number | null;
equationIndex: number | null;
beforeText: string | null;
afterText: string | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertTextBoxObjectResult
[Section titled “EditorV0InsertTextBoxObjectResult”](#editorv0inserttextboxobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertTextBoxObjectResult {
schema: "fastdoc.shell.editor-v0-insert-textbox-object-action.v1";
operationKind: "insert-textbox-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
text: string;
displayName: string;
widthEmu: number | null;
heightEmu: number | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0InsertShapeObjectResult
[Section titled “EditorV0InsertShapeObjectResult”](#editorv0insertshapeobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertShapeObjectResult {
schema: "fastdoc.shell.editor-v0-insert-shape-object-action.v1";
operationKind: "insert-shape-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
paragraphIndex: number;
shape: string;
displayName: string;
text: string | null;
widthEmu: number | null;
heightEmu: number | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0EditDrawingObjectTextResult
[Section titled “EditorV0EditDrawingObjectTextResult”](#editorv0editdrawingobjecttextresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditDrawingObjectTextResult {
schema: "fastdoc.shell.editor-v0-edit-drawing-object-text-action.v1";
operationKind: "edit-drawing-object-text";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
textSourcePath: string | null;
textFromFile: boolean;
beforeText: string | null;
afterText: string | null;
objectKind: string | null;
displayName: string | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0ResizeDrawingObjectResult
[Section titled “EditorV0ResizeDrawingObjectResult”](#editorv0resizedrawingobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ResizeDrawingObjectResult {
schema: "fastdoc.shell.editor-v0-resize-drawing-object-action.v1";
operationKind: "resize-drawing-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
widthEmu: number | null;
heightEmu: number | null;
beforeWpExtentEmu: Record | null;
beforeShapeExtentEmu: Record | null;
afterWpExtentEmu: Record | null;
afterShapeExtentEmu: Record | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0MoveDrawingObjectResult
[Section titled “EditorV0MoveDrawingObjectResult”](#editorv0movedrawingobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0MoveDrawingObjectResult {
schema: "fastdoc.shell.editor-v0-move-drawing-object-action.v1";
operationKind: "move-drawing-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
xOffsetEmu: number | null;
yOffsetEmu: number | null;
xRelativeFrom: string | null;
yRelativeFrom: string | null;
beforePosition: Record | null;
afterPosition: Record | null;
compositionApplied?: boolean;
compositionMutations?: string[];
duplicated?: boolean;
targetPart?: string | null;
targetStory?: string | null;
uniqueDrawingIds?: boolean | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
}
```
### EditorV0DistributeDrawingObjectsResult
[Section titled “EditorV0DistributeDrawingObjectsResult”](#editorv0distributedrawingobjectsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0DistributeDrawingObjectsResult {
schema: "fastdoc.shell.editor-v0-distribute-drawing-objects-action.v1";
operationKind: "distribute-drawing-objects-horizontal" | "distribute-drawing-objects-vertical";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
axis: "horizontal" | "vertical";
requestedLocations: string[];
resolvedLocations: string[];
objectCount: number | null;
beforePrimaryOffsetsEmu: number[];
afterPrimaryOffsetsEmu: number[];
computedGapEmu: number | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0SetDrawingObjectStyleResult
[Section titled “EditorV0SetDrawingObjectStyleResult”](#editorv0setdrawingobjectstyleresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0SetDrawingObjectStyleResult {
schema: "fastdoc.shell.editor-v0-set-drawing-object-style-action.v1";
operationKind: "set-drawing-object-style";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
fillRgb: string | null;
fillOpacityPercent: number | null;
outlineRgb: string | null;
outlineWidthEmu: number | null;
outlineOpacityPercent: number | null;
textDirection: "horizontal" | "vertical" | "vertical-270" | null;
textAutofit: "none" | "resize-shape" | "shrink-text" | null;
beforeFillRgb: string | null;
beforeFillOpacityPercent: number | null;
beforeOutlineRgb: string | null;
beforeOutlineWidthEmu: number | null;
beforeOutlineOpacityPercent: number | null;
beforeTextDirection: string | null;
beforeTextAutofit: string | null;
afterFillRgb: string | null;
afterFillOpacityPercent: number | null;
afterOutlineRgb: string | null;
afterOutlineWidthEmu: number | null;
afterOutlineOpacityPercent: number | null;
afterTextDirection: string | null;
afterTextAutofit: string | null;
objectKind: string | null;
displayName: string | null;
displayNameBefore: string | null;
displayNameAfter: string | null;
displayNameChanged: boolean | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0DeleteDrawingObjectResult
[Section titled “EditorV0DeleteDrawingObjectResult”](#editorv0deletedrawingobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0DeleteDrawingObjectResult {
schema: "fastdoc.shell.editor-v0-delete-drawing-object-action.v1";
operationKind: "delete-drawing-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
objectKind: string | null;
displayName: string | null;
shapePreset: string | null;
deleted: boolean;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0SetDrawingObjectAnchorLockResult
[Section titled “EditorV0SetDrawingObjectAnchorLockResult”](#editorv0setdrawingobjectanchorlockresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0SetDrawingObjectAnchorLockResult {
schema: "fastdoc.shell.editor-v0-set-drawing-object-anchor-lock-action.v1";
operationKind: "set-drawing-object-anchor-lock";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
objectKind: string | null;
displayName: string | null;
shapePreset: string | null;
requestedLocked: boolean;
beforeAnchorPresent: boolean | null;
beforeLocked: string | null;
afterAnchorPresent: boolean | null;
afterLocked: string | null;
anchorLocked: boolean;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0GroupDrawingObjectsResult
[Section titled “EditorV0GroupDrawingObjectsResult”](#editorv0groupdrawingobjectsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0GroupDrawingObjectsResult {
schema: "fastdoc.shell.editor-v0-group-drawing-objects-action.v1";
operationKind: "group-drawing-objects";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
requestedLocations: string[];
resolvedLocations: string[];
groupedObjectCount: number | null;
ungroupedObjectCount: number | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UngroupDrawingObjectResult
[Section titled “EditorV0UngroupDrawingObjectResult”](#editorv0ungroupdrawingobjectresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UngroupDrawingObjectResult {
schema: "fastdoc.shell.editor-v0-ungroup-drawing-object-action.v1";
operationKind: "ungroup-drawing-object";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
reopenAfterWrite: boolean;
reopenedDocumentPath: string | null;
objectLocation: string | null;
sourceLocation: string | null;
requestedLocations: string[];
resolvedLocations: string[];
groupedObjectCount: number | null;
ungroupedObjectCount: number | null;
sourceUnchanged: boolean | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
# DTO · Page setup and document structure
> 19 interfaces and 11 type aliases from the `api-edit.ts` module — sections, page size and orientation, headers and footers, line numbering, hyphenation, and outline mode.
19 interfaces and 11 type aliases — sections, page size and orientation, headers and footers, line numbering, hyphenation, and outline mode.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · **Page setup and document structure** · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
**Types on this page — 30**
* [`OutlineMasterDocumentOperation`](#outlinemasterdocumentoperation)
* [`OutlineMasterDocumentRequest`](#outlinemasterdocumentrequest)
* [`OutlineMasterDocumentOutlineItem`](#outlinemasterdocumentoutlineitem)
* [`OutlineMasterDocumentSubdocument`](#outlinemasterdocumentsubdocument)
* [`OutlineMasterDocumentSnapshot`](#outlinemasterdocumentsnapshot)
* [`OutlineMasterDocumentResult`](#outlinemasterdocumentresult)
* [`EditorV0ContentControlsRequest`](#editorv0contentcontrolsrequest)
* [`EditorV0ContentControlsResult`](#editorv0contentcontrolsresult)
* [`D36CombinedSectionStart`](#d36combinedsectionstart)
* [`D36CombinedPaperSize`](#d36combinedpapersize)
* [`D36CombinedOrientation`](#d36combinedorientation)
* [`D36CombinedMarginPreset`](#d36combinedmarginpreset)
* [`D36CombinedSectionCommandRequest`](#d36combinedsectioncommandrequest)
* [`D36CombinedSectionCommandResult`](#d36combinedsectioncommandresult)
* [`D36SectionPresetVisibleWorkflowCommand`](#d36sectionpresetvisibleworkflowcommand)
* [`D36SectionPresetVisibleWorkflowRequest`](#d36sectionpresetvisibleworkflowrequest)
* [`D36SectionPresetVisibleWorkflowResult`](#d36sectionpresetvisibleworkflowresult)
* [`D36LineNumbersCommand`](#d36linenumberscommand)
* [`D36LineNumbersContinuousRequest`](#d36linenumberscontinuousrequest)
* [`D36LineNumbersContinuousResult`](#d36linenumberscontinuousresult)
* [`D36HyphenationCommand`](#d36hyphenationcommand)
* [`D36HyphenationRequest`](#d36hyphenationrequest)
* [`D36HyphenationResult`](#d36hyphenationresult)
* [`D36HeaderFooterEditModeStoryKind`](#d36headerfootereditmodestorykind)
* [`D36HeaderFooterEditModeStoryVariant`](#d36headerfootereditmodestoryvariant)
* [`D36HeaderFooterEditModeSaveRequest`](#d36headerfootereditmodesaverequest)
* [`D36HeaderFooterEditModeSaveResult`](#d36headerfootereditmodesaveresult)
* [`D36HeaderFooterRemoveOperationKind`](#d36headerfooterremoveoperationkind)
* [`D36HeaderFooterRemoveRequest`](#d36headerfooterremoverequest)
* [`D36HeaderFooterRemoveResult`](#d36headerfooterremoveresult)
### OutlineMasterDocumentOperation
[Section titled “OutlineMasterDocumentOperation”](#outlinemasterdocumentoperation)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type OutlineMasterDocumentOperation =
| "inspect"
| "set-level"
| "promote"
| "demote"
| "move-up"
| "move-down"
| "collapse"
| "expand"
| "create-subdocument"
| "insert-subdocument"
| "expand-subdocument"
| "collapse-subdocument"
| "split-subdocument"
| "merge-subdocuments"
| "unlink-subdocument"
| "update-link";
```
### OutlineMasterDocumentRequest
[Section titled “OutlineMasterDocumentRequest”](#outlinemasterdocumentrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface OutlineMasterDocumentRequest {
operation: OutlineMasterDocumentOperation;
paragraphIndex?: number | null;
level?: number | null;
subdocumentIndex?: number | null;
sourcePath?: string | null;
splitParagraphIndex?: number | null;
searchQuery?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### OutlineMasterDocumentOutlineItem
[Section titled “OutlineMasterDocumentOutlineItem”](#outlinemasterdocumentoutlineitem)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface OutlineMasterDocumentOutlineItem {
paragraph_index: number;
body_child_index: number;
text: string;
style_id: string | null;
level: number | null;
is_body_text: boolean;
has_children: boolean;
collapsed: boolean;
}
```
### OutlineMasterDocumentSubdocument
[Section titled “OutlineMasterDocumentSubdocument”](#outlinemasterdocumentsubdocument)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface OutlineMasterDocumentSubdocument {
subdocument_index: number;
relationship_id: string;
source_path: string;
source_identity: string;
source_status: string;
linked: boolean;
expanded: boolean;
paragraph_start: number;
paragraph_end: number | null;
paragraph_count: number | null;
merge_group: string | null;
editable: boolean;
conflicts: Array<{
kind: string;
identifier: string;
message: string;
}>;
outline_items: OutlineMasterDocumentOutlineItem[];
}
```
### OutlineMasterDocumentSnapshot
[Section titled “OutlineMasterDocumentSnapshot”](#outlinemasterdocumentsnapshot)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface OutlineMasterDocumentSnapshot {
schema: "fastdoc.outline-master-document.snapshot.v1";
operation_kind: string;
result_kind: string;
outline_items: OutlineMasterDocumentOutlineItem[];
subdocuments: OutlineMasterDocumentSubdocument[];
search_results: Array<{
document_kind: string;
subdocument_index: number | null;
paragraph_index: number;
text: string;
source_identity: string | null;
}>;
heading_levels_supported: number[];
source_documents_unchanged: boolean;
fail_closed: boolean;
styles_preserved: boolean;
numbering_preserved: boolean;
bookmarks_preserved: boolean;
sections_preserved: boolean;
headers_footers_preserved: boolean;
comments_preserved: boolean;
tracked_changes_preserved: boolean;
word_parity_claim: false;
}
```
### OutlineMasterDocumentResult
[Section titled “OutlineMasterDocumentResult”](#outlinemasterdocumentresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface OutlineMasterDocumentResult {
schema: "fastdoc.shell.outline-master-document-action.v1";
operationKind: OutlineMasterDocumentOperation;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
resultKind: string;
writebackResultKind: string | null;
transactionCommitted: boolean;
sourceDocumentsUnchanged: boolean;
snapshot: OutlineMasterDocumentSnapshot;
}
```
### EditorV0ContentControlsRequest
[Section titled “EditorV0ContentControlsRequest”](#editorv0contentcontrolsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ContentControlsRequest {
request: Record;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0ContentControlsResult
[Section titled “EditorV0ContentControlsResult”](#editorv0contentcontrolsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ContentControlsResult {
schema: "fastdoc.shell.editor-v0-content-controls-action.v1";
operationKind: "content-controls-command";
action: string;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
controlCountAfter: number;
boundControlCountAfter: number;
protectionEditAfter: string | null;
controls: Array>;
snapshot: Record;
}
```
### D36CombinedSectionStart
[Section titled “D36CombinedSectionStart”](#d36combinedsectionstart)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36CombinedSectionStart = "next-page" | "continuous" | "even-page" | "odd-page";
```
### D36CombinedPaperSize
[Section titled “D36CombinedPaperSize”](#d36combinedpapersize)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36CombinedPaperSize = "A4" | "Letter";
```
### D36CombinedOrientation
[Section titled “D36CombinedOrientation”](#d36combinedorientation)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36CombinedOrientation = "portrait" | "landscape";
```
### D36CombinedMarginPreset
[Section titled “D36CombinedMarginPreset”](#d36combinedmarginpreset)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36CombinedMarginPreset = "normal" | "narrow" | "moderate" | "wide";
```
### D36CombinedSectionCommandRequest
[Section titled “D36CombinedSectionCommandRequest”](#d36combinedsectioncommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36CombinedSectionCommandRequest {
paragraphIndex: number;
sectionStart?: D36CombinedSectionStart;
paperSize?: D36CombinedPaperSize;
orientation?: D36CombinedOrientation;
marginPreset?: D36CombinedMarginPreset;
pageNumberStart?: number;
defaultHeaderText?: string;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36CombinedSectionCommandResult
[Section titled “D36CombinedSectionCommandResult”](#d36combinedsectioncommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36CombinedSectionCommandResult {
applied: boolean;
outputPath: string;
label: string;
paragraphIndex: number;
workflowResult: Record;
finalPageSetupState: Record | null;
finalHeaderFooterState: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
}
```
### D36SectionPresetVisibleWorkflowCommand
[Section titled “D36SectionPresetVisibleWorkflowCommand”](#d36sectionpresetvisibleworkflowcommand)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36SectionPresetVisibleWorkflowCommand = "section-preset-a4" | "section-preset-landscape" | "section-preset-first-page" | "section-preset-narrow-margins";
```
### D36SectionPresetVisibleWorkflowRequest
[Section titled “D36SectionPresetVisibleWorkflowRequest”](#d36sectionpresetvisibleworkflowrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36SectionPresetVisibleWorkflowRequest {
command: D36SectionPresetVisibleWorkflowCommand;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36SectionPresetVisibleWorkflowResult
[Section titled “D36SectionPresetVisibleWorkflowResult”](#d36sectionpresetvisibleworkflowresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36SectionPresetVisibleWorkflowResult {
schema: "fastdoc.shell.d36-section-presets-visible-workflow.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
command: D36SectionPresetVisibleWorkflowCommand;
label: string;
paragraphIndex: number;
beforeState: Record | null;
afterState: Record | null;
beforePagination: Record | null;
afterPagination: Record | null;
steps: Record[];
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
}
```
### D36LineNumbersCommand
[Section titled “D36LineNumbersCommand”](#d36linenumberscommand)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36LineNumbersCommand = "none" | "continuous" | "restart-page" | "restart-section" | "suppress-current-paragraph";
```
### D36LineNumbersContinuousRequest
[Section titled “D36LineNumbersContinuousRequest”](#d36linenumberscontinuousrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36LineNumbersContinuousRequest {
command?: D36LineNumbersCommand;
paragraphIndex: number;
paragraphIndexes?: number[];
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36LineNumbersContinuousResult
[Section titled “D36LineNumbersContinuousResult”](#d36linenumberscontinuousresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36LineNumbersContinuousResult {
schema: "fastdoc.shell.d36-line-numbers-continuous-writeback.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
command: D36LineNumbersCommand;
label: string;
paragraphIndex: number;
paragraphIndexes: number[];
current: boolean;
actualSavedMode: D36LineNumbersCommand;
savedDocxTruthSource: "rust-paginate-docx-after-reopen" | "rust-model-docx-after-reopen";
beforePagination: Record | null;
afterPagination: Record | null;
afterModel: Record | null;
writebackResult: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### D36HyphenationCommand
[Section titled “D36HyphenationCommand”](#d36hyphenationcommand)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36HyphenationCommand = "none" | "auto";
```
### D36HyphenationRequest
[Section titled “D36HyphenationRequest”](#d36hyphenationrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HyphenationRequest {
command?: D36HyphenationCommand;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36HyphenationResult
[Section titled “D36HyphenationResult”](#d36hyphenationresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HyphenationResult {
schema: "fastdoc.shell.d36-hyphenation-writeback.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
command: D36HyphenationCommand;
label: string;
paragraphIndex: number;
current: boolean;
actualSavedMode: D36HyphenationCommand;
savedDocxTruthSource: "rust-hyphenation-state-docx-after-reopen";
afterHyphenationState: Record | null;
writebackResult: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### D36HeaderFooterEditModeStoryKind
[Section titled “D36HeaderFooterEditModeStoryKind”](#d36headerfootereditmodestorykind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36HeaderFooterEditModeStoryKind = "header" | "footer";
```
### D36HeaderFooterEditModeStoryVariant
[Section titled “D36HeaderFooterEditModeStoryVariant”](#d36headerfootereditmodestoryvariant)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36HeaderFooterEditModeStoryVariant = "default" | "first" | "even";
```
### D36HeaderFooterEditModeSaveRequest
[Section titled “D36HeaderFooterEditModeSaveRequest”](#d36headerfootereditmodesaverequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HeaderFooterEditModeSaveRequest {
storyKind: D36HeaderFooterEditModeStoryKind;
storyVariant?: D36HeaderFooterEditModeStoryVariant;
text: string;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36HeaderFooterEditModeSaveResult
[Section titled “D36HeaderFooterEditModeSaveResult”](#d36headerfootereditmodesaveresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HeaderFooterEditModeSaveResult {
schema: "fastdoc.shell.d36-header-footer-edit-mode-save.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
storyKind: D36HeaderFooterEditModeStoryKind;
operationKind: "set-default-header-text" | "edit-default-header-text" | "set-default-footer-text" | "edit-default-footer-text" | "set-first-header-text" | "edit-first-header-text" | "set-first-footer-text" | "edit-first-footer-text" | "set-even-header-text" | "edit-even-header-text" | "set-even-footer-text" | "edit-even-footer-text";
label: string;
paragraphIndex: number;
beforeHeaderFooterState: Record | null;
afterHeaderFooterState: Record | null;
beforePagination: Record | null;
afterPagination: Record | null;
writebackResult: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### D36HeaderFooterRemoveOperationKind
[Section titled “D36HeaderFooterRemoveOperationKind”](#d36headerfooterremoveoperationkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D36HeaderFooterRemoveOperationKind = "remove-default-header" | "remove-default-footer";
```
### D36HeaderFooterRemoveRequest
[Section titled “D36HeaderFooterRemoveRequest”](#d36headerfooterremoverequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HeaderFooterRemoveRequest {
storyKind: D36HeaderFooterEditModeStoryKind;
paragraphIndex: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### D36HeaderFooterRemoveResult
[Section titled “D36HeaderFooterRemoveResult”](#d36headerfooterremoveresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D36HeaderFooterRemoveResult {
schema: "fastdoc.shell.d36-header-footer-remove.v1";
applied: boolean;
noOp: boolean;
outputPath: string;
storyKind: D36HeaderFooterEditModeStoryKind;
operationKind: D36HeaderFooterRemoveOperationKind;
label: string;
paragraphIndex: number;
beforeHeaderFooterState: Record | null;
afterHeaderFooterState: Record | null;
beforePagination: Record | null;
afterPagination: Record | null;
writebackResult: Record | null;
beforeTexts: string[];
afterTexts: string[];
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
# DTO · Tables: cells and formatting
> 55 interfaces and 20 type aliases from the `api-edit.ts` module — cell content, borders, shading, merging, and alignment.
55 interfaces and 20 type aliases — cell content, borders, shading, merging, and alignment.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · **Tables: cells and formatting** · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
Types on this page — 75
* [`ShellTableCellBorder`](#shelltablecellborder)
* [`D37TablePencilEraserSemanticOperation`](#d37tablepencilerasersemanticoperation)
* [`D37TablePencilEraserSemanticRequest`](#d37tablepencilerasersemanticrequest)
* [`D37TablePencilEraserSemanticResult`](#d37tablepencilerasersemanticresult)
* [`D37TableSelectionPencilEraserAction`](#d37tableselectionpencileraseraction)
* [`D37TableSelectionPencilEraserRange`](#d37tableselectionpencileraserrange)
* [`D37TableSelectionPencilEraserRequest`](#d37tableselectionpencileraserrequest)
* [`D37TableSelectionPencilEraserResult`](#d37tableselectionpencileraserresult)
* [`D37TableSelectionPencilEraserCommandState`](#d37tableselectionpencilerasercommandstate)
* [`D37TableEqualizeMode`](#d37tableequalizemode)
* [`D37TableEqualizeRequest`](#d37tableequalizerequest)
* [`D37TableEqualizeResult`](#d37tableequalizeresult)
* [`D37TableSelectionEqualizeColumnsAction`](#d37tableselectionequalizecolumnsaction)
* [`D37TableSelectionEqualizeColumnsRange`](#d37tableselectionequalizecolumnsrange)
* [`D37TableSelectionEqualizeColumnsRequest`](#d37tableselectionequalizecolumnsrequest)
* [`D37TableSelectionEqualizeColumnsResult`](#d37tableselectionequalizecolumnsresult)
* [`D37TableSelectionEqualizeColumnsCommandState`](#d37tableselectionequalizecolumnscommandstate)
* [`D37TableStyleRequest`](#d37tablestylerequest)
* [`D37TableStyleResult`](#d37tablestyleresult)
* [`D37TableStyleOptions`](#d37tablestyleoptions)
* [`D37TableCellRangeFormatRequest`](#d37tablecellrangeformatrequest)
* [`D37TableCellRangeFormatResult`](#d37tablecellrangeformatresult)
* [`D37TableSelectionCellRangeFormatPreset`](#d37tableselectioncellrangeformatpreset)
* [`D37TableSelectionCellRangeFormatRange`](#d37tableselectioncellrangeformatrange)
* [`D37TableSelectionCellRangeFormatRequest`](#d37tableselectioncellrangeformatrequest)
* [`D37TableSelectionCellRangeFormatResult`](#d37tableselectioncellrangeformatresult)
* [`D37TableSelectionCellRangeFormatCommandState`](#d37tableselectioncellrangeformatcommandstate)
* [`D37TableSelectionAllBordersAction`](#d37tableselectionallbordersaction)
* [`D37TableSelectionAllBordersRequest`](#d37tableselectionallbordersrequest)
* [`D37TableSelectionAllBordersResult`](#d37tableselectionallbordersresult)
* [`D37TableSelectionAllBordersCommandState`](#d37tableselectionallborderscommandstate)
* [`D37TableSelectionOutsideBordersAction`](#d37tableselectionoutsidebordersaction)
* [`D37TableSelectionOutsideBordersRequest`](#d37tableselectionoutsidebordersrequest)
* [`D37TableSelectionOutsideBordersResult`](#d37tableselectionoutsidebordersresult)
* [`D37TableSelectionOutsideBordersCommandState`](#d37tableselectionoutsideborderscommandstate)
* [`D37TableSelectionInsideBordersAction`](#d37tableselectioninsidebordersaction)
* [`D37TableSelectionInsideBordersRequest`](#d37tableselectioninsidebordersrequest)
* [`D37TableSelectionInsideBordersResult`](#d37tableselectioninsidebordersresult)
* [`D37TableSelectionInsideBordersCommandState`](#d37tableselectioninsideborderscommandstate)
* [`D37TableAlignmentMode`](#d37tablealignmentmode)
* [`D37TableAlignmentRequest`](#d37tablealignmentrequest)
* [`D37TableAlignmentResult`](#d37tablealignmentresult)
* [`D37TableSelectionAlignmentAction`](#d37tableselectionalignmentaction)
* [`D37TableSelectionAlignmentRange`](#d37tableselectionalignmentrange)
* [`D37TableSelectionAlignmentRequest`](#d37tableselectionalignmentrequest)
* [`D37TableSelectionAlignmentResult`](#d37tableselectionalignmentresult)
* [`D37TableSelectionAlignmentCommandState`](#d37tableselectionalignmentcommandstate)
* [`D37TableWidthMode`](#d37tablewidthmode)
* [`D37TableWidthRequest`](#d37tablewidthrequest)
* [`D37TableWidthResult`](#d37tablewidthresult)
* [`D37TableSelectionWidthFitAction`](#d37tableselectionwidthfitaction)
* [`D37TableSelectionWidthFitRange`](#d37tableselectionwidthfitrange)
* [`D37TableSelectionWidthFitRequest`](#d37tableselectionwidthfitrequest)
* [`D37TableSelectionWidthFitResult`](#d37tableselectionwidthfitresult)
* [`D37TableSelectionWidthFitCommandState`](#d37tableselectionwidthfitcommandstate)
* [`D37TableCellContentVerticalAlignment`](#d37tablecellcontentverticalalignment)
* [`D37TableCellContentHorizontalAlignment`](#d37tablecellcontenthorizontalalignment)
* [`D37TableCellContentAlignmentRequest`](#d37tablecellcontentalignmentrequest)
* [`D37TableCellVerticalAlignment`](#d37tablecellverticalalignment)
* [`D37TableCellVerticalAlignmentMode`](#d37tablecellverticalalignmentmode)
* [`D37TableCellVerticalAlignmentRequest`](#d37tablecellverticalalignmentrequest)
* [`D37TableCellContentAlignmentResult`](#d37tablecellcontentalignmentresult)
* [`D37TableCellVerticalAlignmentResult`](#d37tablecellverticalalignmentresult)
* [`D37TableCellContentAlignmentCommandState`](#d37tablecellcontentalignmentcommandstate)
* [`D37TableCellVerticalAlignmentCommandState`](#d37tablecellverticalalignmentcommandstate)
* [`D37TableCellExactSizeRequest`](#d37tablecellexactsizerequest)
* [`D37TableCellExactSizeResult`](#d37tablecellexactsizeresult)
* [`D37TableCellExactSizeCommandState`](#d37tablecellexactsizecommandstate)
* [`D37TableCellTextDirection`](#d37tablecelltextdirection)
* [`D37TableCellTextDirectionMode`](#d37tablecelltextdirectionmode)
* [`D37TableCellTextDirectionRequest`](#d37tablecelltextdirectionrequest)
* [`D37TableCellTextDirectionResult`](#d37tablecelltextdirectionresult)
* [`D37TableCellTextDirectionCommandState`](#d37tablecelltextdirectioncommandstate)
* [`EditorV0TableCellParagraphTextTarget`](#editorv0tablecellparagraphtexttarget)
* [`EditorV0TableCellTextRangeEndpoint`](#editorv0tablecelltextrangeendpoint)
### ShellTableCellBorder
[Section titled “ShellTableCellBorder”](#shelltablecellborder)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellTableCellBorder {
edge: string;
style: string;
size_eighths?: number | null;
width_milli_px?: number | null;
color_rgb?: string | null;
}
```
### D37TablePencilEraserSemanticOperation
[Section titled “D37TablePencilEraserSemanticOperation”](#d37tablepencilerasersemanticoperation)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TablePencilEraserSemanticOperation = "eraser-merge-horizontal" | "merge-rectangular" | "merge-vertical" | "pencil-split-cell" | "pencil-split-cell-vertical" | "pencil-split-cell-rectangular" | "draw-table-partial-span-cell-split" | "split-cell-grid";
```
### D37TablePencilEraserSemanticRequest
[Section titled “D37TablePencilEraserSemanticRequest”](#d37tablepencilerasersemanticrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TablePencilEraserSemanticRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
spanCount: number;
rowCount?: number | null;
columnCount?: number | null;
operation: D37TablePencilEraserSemanticOperation;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TablePencilEraserSemanticResult
[Section titled “D37TablePencilEraserSemanticResult”](#d37tablepencilerasersemanticresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TablePencilEraserSemanticResult {
schema: "fastdoc.shell.d37-table-pencil-eraser-semantic.v1";
operationKind: "eraser-merge-table-cells-horizontal" | "merge-table-cells-rectangular" | "merge-table-cells-vertical" | "pencil-split-table-cell" | "pencil-split-table-cell-vertical" | "pencil-split-table-cell-rectangular" | "split-table-cell-grid";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
spanCount: number | null;
requestedSpanCount: number;
tableInputProvenance: string | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionPencilEraserAction
[Section titled “D37TableSelectionPencilEraserAction”](#d37tableselectionpencileraseraction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionPencilEraserAction = "merge-selected-horizontal" | "merge-selected-rectangular" | "merge-selected-vertical" | "split-selected-horizontal" | "split-selected-vertical" | "split-selected-rectangular" | "split-draw-table-ordinary-cell" | "split-selected-cell";
```
### D37TableSelectionPencilEraserRange
[Section titled “D37TableSelectionPencilEraserRange”](#d37tableselectionpencileraserrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionPencilEraserRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionPencilEraserRequest
[Section titled “D37TableSelectionPencilEraserRequest”](#d37tableselectionpencileraserrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionPencilEraserRequest {
selection: D37TableSelectionPencilEraserRange;
action: D37TableSelectionPencilEraserAction;
splitRows?: number | null;
splitColumns?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionPencilEraserResult
[Section titled “D37TableSelectionPencilEraserResult”](#d37tableselectionpencileraserresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionPencilEraserResult {
schema: "fastdoc.shell.d37-table-selection-pencil-eraser.v1";
action: D37TableSelectionPencilEraserAction;
selection: D37TableSelectionPencilEraserRange;
computedOperation: D37TablePencilEraserSemanticOperation;
computedSpanCount: number;
pencilEraserResult: D37TablePencilEraserSemanticResult;
}
```
### D37TableSelectionPencilEraserCommandState
[Section titled “D37TableSelectionPencilEraserCommandState”](#d37tableselectionpencilerasercommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionPencilEraserCommandState {
schema: "fastdoc.shell.d37-table-selection-pencil-eraser-command-state.v1";
action: D37TableSelectionPencilEraserAction;
selection: D37TableSelectionPencilEraserRange;
computedOperation: D37TablePencilEraserSemanticOperation;
computedSpanCount: number | null;
operationKind: D37TablePencilEraserSemanticResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableEqualizeMode
[Section titled “D37TableEqualizeMode”](#d37tableequalizemode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableEqualizeMode = "row-heights" | "column-widths" | "column-widths-from-existing";
```
### D37TableEqualizeRequest
[Section titled “D37TableEqualizeRequest”](#d37tableequalizerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableEqualizeRequest {
bodyBlockIndex: number;
equalizeMode: D37TableEqualizeMode;
heightTwips?: number | null;
heightRule?: "exact" | "atLeast" | "auto" | "fit-content" | null;
widthTwips?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableEqualizeResult
[Section titled “D37TableEqualizeResult”](#d37tableequalizeresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableEqualizeResult {
schema: "fastdoc.shell.d37-table-equalize-dimensions.v1";
operationKind: "equalize-table-row-heights" | "equalize-table-column-widths" | "equalize-table-column-widths-from-existing";
applied: boolean;
unchanged: boolean;
historyEntryCreated: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
equalizeMode: D37TableEqualizeMode;
resultKind: string | null;
writebackResultKind: string | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionEqualizeColumnsAction
[Section titled “D37TableSelectionEqualizeColumnsAction”](#d37tableselectionequalizecolumnsaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionEqualizeColumnsAction = "equalize-selected-table-columns";
```
### D37TableSelectionEqualizeColumnsRange
[Section titled “D37TableSelectionEqualizeColumnsRange”](#d37tableselectionequalizecolumnsrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionEqualizeColumnsRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionEqualizeColumnsRequest
[Section titled “D37TableSelectionEqualizeColumnsRequest”](#d37tableselectionequalizecolumnsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionEqualizeColumnsRequest {
selection: D37TableSelectionEqualizeColumnsRange;
action: D37TableSelectionEqualizeColumnsAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionEqualizeColumnsResult
[Section titled “D37TableSelectionEqualizeColumnsResult”](#d37tableselectionequalizecolumnsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionEqualizeColumnsResult {
schema: "fastdoc.shell.d37-table-selection-equalize-columns.v1";
action: D37TableSelectionEqualizeColumnsAction;
selection: D37TableSelectionEqualizeColumnsRange;
computedEqualizeMode: "column-widths-from-existing";
equalizeResult: D37TableEqualizeResult;
}
```
### D37TableSelectionEqualizeColumnsCommandState
[Section titled “D37TableSelectionEqualizeColumnsCommandState”](#d37tableselectionequalizecolumnscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionEqualizeColumnsCommandState {
schema: "fastdoc.shell.d37-table-selection-equalize-columns-command-state.v1";
operationKind: "equalize-table-column-widths-from-existing";
action: D37TableSelectionEqualizeColumnsAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionEqualizeColumnsRange;
computedEqualizeMode: "column-widths-from-existing";
resultKind: string | null;
writebackResultKind: string | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableStyleRequest
[Section titled “D37TableStyleRequest”](#d37tablestylerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableStyleRequest {
bodyBlockIndex: number;
styleKind?: "banded-blue" | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableStyleResult
[Section titled “D37TableStyleResult”](#d37tablestyleresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableStyleResult {
schema: "fastdoc.shell.d37-table-style.v1";
operationKind: "apply-table-style-banded-blue";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
styleKind: "banded-blue";
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableStyleOptions
[Section titled “D37TableStyleOptions”](#d37tablestyleoptions)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableStyleOptions {
headerRow: boolean;
totalRow: boolean;
bandedRows: boolean;
firstColumn: boolean;
lastColumn: boolean;
bandedColumns: boolean;
}
```
### D37TableCellRangeFormatRequest
[Section titled “D37TableCellRangeFormatRequest”](#d37tablecellrangeformatrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellRangeFormatRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
fillColorRgb?: string | null;
borderColorRgb?: string | null;
borderStyle?: "single" | "dotted" | "dashed" | "dashSmallGap" | "thick" | null;
borderSizeEighths?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellRangeFormatResult
[Section titled “D37TableCellRangeFormatResult”](#d37tablecellrangeformatresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellRangeFormatResult {
schema: "fastdoc.shell.d37-table-cell-range-format.v1";
operationKind: "format-table-cell-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
range: {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
};
fillColorRgb: string | null;
borderColorRgb: string | null;
borderStyle: string | null;
borderSizeEighths: number | null;
fillResultKind: string | null;
fillWritebackResultKind: string | null;
borderResultKind: string | null;
borderWritebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
fillSnapshot: unknown;
borderSnapshot: unknown;
}
```
### D37TableSelectionCellRangeFormatPreset
[Section titled “D37TableSelectionCellRangeFormatPreset”](#d37tableselectioncellrangeformatpreset)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionCellRangeFormatPreset = "market-emphasis" | "review-attention";
```
### D37TableSelectionCellRangeFormatRange
[Section titled “D37TableSelectionCellRangeFormatRange”](#d37tableselectioncellrangeformatrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionCellRangeFormatRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionCellRangeFormatRequest
[Section titled “D37TableSelectionCellRangeFormatRequest”](#d37tableselectioncellrangeformatrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionCellRangeFormatRequest {
selection: D37TableSelectionCellRangeFormatRange;
preset: D37TableSelectionCellRangeFormatPreset;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionCellRangeFormatResult
[Section titled “D37TableSelectionCellRangeFormatResult”](#d37tableselectioncellrangeformatresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionCellRangeFormatResult {
schema: "fastdoc.shell.d37-table-selection-cell-range-format.v1";
preset: D37TableSelectionCellRangeFormatPreset;
selection: D37TableSelectionCellRangeFormatRange;
computedFillColorRgb: string;
computedBorderColorRgb: string;
computedBorderStyle: "single" | "thick";
computedBorderSizeEighths: number;
cellRangeFormatResult: D37TableCellRangeFormatResult;
}
```
### D37TableSelectionCellRangeFormatCommandState
[Section titled “D37TableSelectionCellRangeFormatCommandState”](#d37tableselectioncellrangeformatcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionCellRangeFormatCommandState {
schema: "fastdoc.shell.d37-table-selection-cell-range-format-command-state.v1";
operationKind: "format-table-cell-range";
preset: D37TableSelectionCellRangeFormatPreset;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedFillColorRgb: string;
computedBorderColorRgb: string;
computedBorderStyle: "single" | "thick";
computedBorderSizeEighths: number;
fillResultKind: string | null;
fillWritebackResultKind: string | null;
borderResultKind: string | null;
borderWritebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
fillSnapshot: unknown;
borderSnapshot: unknown;
}
```
### D37TableSelectionAllBordersAction
[Section titled “D37TableSelectionAllBordersAction”](#d37tableselectionallbordersaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionAllBordersAction = "set-selected-all-borders" | "clear-selected-all-borders";
```
### D37TableSelectionAllBordersRequest
[Section titled “D37TableSelectionAllBordersRequest”](#d37tableselectionallbordersrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAllBordersRequest {
selection: D37TableSelectionCellRangeFormatRange;
action: D37TableSelectionAllBordersAction;
borderColorRgb?: string | null;
borderStyle?: "nil" | "single" | "dotted" | "dashed" | "dashSmallGap" | "thick" | null;
borderSizeEighths?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionAllBordersResult
[Section titled “D37TableSelectionAllBordersResult”](#d37tableselectionallbordersresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAllBordersResult {
schema: "fastdoc.shell.d37-table-selection-all-borders.v1";
action: D37TableSelectionAllBordersAction;
operationKind: "set-table-cell-all-borders-range" | "clear-table-cell-all-borders-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionAllBordersCommandState
[Section titled “D37TableSelectionAllBordersCommandState”](#d37tableselectionallborderscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAllBordersCommandState {
schema: "fastdoc.shell.d37-table-selection-all-borders-command-state.v1";
action: D37TableSelectionAllBordersAction;
operationKind: "set-table-cell-all-borders-range" | "clear-table-cell-all-borders-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionOutsideBordersAction
[Section titled “D37TableSelectionOutsideBordersAction”](#d37tableselectionoutsidebordersaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionOutsideBordersAction = "set-selected-outside-borders" | "clear-selected-outside-borders";
```
### D37TableSelectionOutsideBordersRequest
[Section titled “D37TableSelectionOutsideBordersRequest”](#d37tableselectionoutsidebordersrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionOutsideBordersRequest {
selection: D37TableSelectionCellRangeFormatRange;
action: D37TableSelectionOutsideBordersAction;
borderColorRgb?: string | null;
borderStyle?: "single" | "dotted" | "dashed" | "dashSmallGap" | "thick" | null;
borderSizeEighths?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionOutsideBordersResult
[Section titled “D37TableSelectionOutsideBordersResult”](#d37tableselectionoutsidebordersresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionOutsideBordersResult {
schema: "fastdoc.shell.d37-table-selection-outside-borders.v1";
action: D37TableSelectionOutsideBordersAction;
operationKind: "set-table-cell-outside-borders-range" | "clear-table-cell-outside-borders-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionOutsideBordersCommandState
[Section titled “D37TableSelectionOutsideBordersCommandState”](#d37tableselectionoutsideborderscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionOutsideBordersCommandState {
schema: "fastdoc.shell.d37-table-selection-outside-borders-command-state.v1";
action: D37TableSelectionOutsideBordersAction;
operationKind: "set-table-cell-outside-borders-range" | "clear-table-cell-outside-borders-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionInsideBordersAction
[Section titled “D37TableSelectionInsideBordersAction”](#d37tableselectioninsidebordersaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionInsideBordersAction = "set-selected-inside-borders" | "clear-selected-inside-borders";
```
### D37TableSelectionInsideBordersRequest
[Section titled “D37TableSelectionInsideBordersRequest”](#d37tableselectioninsidebordersrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionInsideBordersRequest {
selection: D37TableSelectionCellRangeFormatRange;
action: D37TableSelectionInsideBordersAction;
borderColorRgb?: string | null;
borderStyle?: "single" | "dotted" | "dashed" | "dashSmallGap" | "thick" | null;
borderSizeEighths?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionInsideBordersResult
[Section titled “D37TableSelectionInsideBordersResult”](#d37tableselectioninsidebordersresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionInsideBordersResult {
schema: "fastdoc.shell.d37-table-selection-inside-borders.v1";
action: D37TableSelectionInsideBordersAction;
operationKind: "set-table-cell-inside-borders-range" | "clear-table-cell-inside-borders-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionInsideBordersCommandState
[Section titled “D37TableSelectionInsideBordersCommandState”](#d37tableselectioninsideborderscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionInsideBordersCommandState {
schema: "fastdoc.shell.d37-table-selection-inside-borders-command-state.v1";
action: D37TableSelectionInsideBordersAction;
operationKind: "set-table-cell-inside-borders-range" | "clear-table-cell-inside-borders-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
computedBorderColorRgb: string | null;
computedBorderStyle: string | null;
computedBorderSizeEighths: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableAlignmentMode
[Section titled “D37TableAlignmentMode”](#d37tablealignmentmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableAlignmentMode = "left" | "center" | "right";
```
### D37TableAlignmentRequest
[Section titled “D37TableAlignmentRequest”](#d37tablealignmentrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAlignmentRequest {
bodyBlockIndex: number;
alignment: D37TableAlignmentMode;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableAlignmentResult
[Section titled “D37TableAlignmentResult”](#d37tablealignmentresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAlignmentResult {
schema: "fastdoc.shell.d37-table-alignment.v1";
operationKind: "set-table-alignment";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
alignment: D37TableAlignmentMode;
resultKind: string | null;
writebackResultKind: string | null;
tableAlignment: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionAlignmentAction
[Section titled “D37TableSelectionAlignmentAction”](#d37tableselectionalignmentaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionAlignmentAction = "align-selected-table-left" | "align-selected-table-center" | "align-selected-table-right";
```
### D37TableSelectionAlignmentRange
[Section titled “D37TableSelectionAlignmentRange”](#d37tableselectionalignmentrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAlignmentRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionAlignmentRequest
[Section titled “D37TableSelectionAlignmentRequest”](#d37tableselectionalignmentrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAlignmentRequest {
selection: D37TableSelectionAlignmentRange;
action: D37TableSelectionAlignmentAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionAlignmentResult
[Section titled “D37TableSelectionAlignmentResult”](#d37tableselectionalignmentresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAlignmentResult {
schema: "fastdoc.shell.d37-table-selection-alignment.v1";
action: D37TableSelectionAlignmentAction;
selection: D37TableSelectionAlignmentRange;
computedAlignment: D37TableAlignmentMode;
alignmentResult: D37TableAlignmentResult;
}
```
### D37TableSelectionAlignmentCommandState
[Section titled “D37TableSelectionAlignmentCommandState”](#d37tableselectionalignmentcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionAlignmentCommandState {
schema: "fastdoc.shell.d37-table-selection-alignment-command-state.v1";
operationKind: "set-table-alignment";
action: D37TableSelectionAlignmentAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionAlignmentRange;
computedAlignment: D37TableAlignmentMode;
resultKind: string | null;
writebackResultKind: string | null;
tableAlignment: string | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableWidthMode
[Section titled “D37TableWidthMode”](#d37tablewidthmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableWidthMode = "centimeters" | "percent" | "fit-contents" | "fit-window" | "fixed-column-width";
```
### D37TableWidthRequest
[Section titled “D37TableWidthRequest”](#d37tablewidthrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableWidthRequest {
bodyBlockIndex: number;
widthMode: D37TableWidthMode;
widthCentimetersHundredths?: number | null;
widthPercent?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableWidthResult
[Section titled “D37TableWidthResult”](#d37tablewidthresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableWidthResult {
schema: "fastdoc.shell.d37-table-width.v1";
operationKind: "set-table-width-centimeters" | "set-table-width-percent" | "fit-table-width-to-contents" | "fit-table-width-to-window" | "fixed-table-column-width";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
widthMode: D37TableWidthMode;
resultKind: string | null;
writebackResultKind: string | null;
tableWidthUnit: string | null;
tableWidthValue: number | null;
tableWidthTwips: number | null;
computedTableWidthToContentsTwips: number | null;
tableWidthPercentX50: number | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionWidthFitAction
[Section titled “D37TableSelectionWidthFitAction”](#d37tableselectionwidthfitaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionWidthFitAction = "fit-selected-table-to-contents";
```
### D37TableSelectionWidthFitRange
[Section titled “D37TableSelectionWidthFitRange”](#d37tableselectionwidthfitrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionWidthFitRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionWidthFitRequest
[Section titled “D37TableSelectionWidthFitRequest”](#d37tableselectionwidthfitrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionWidthFitRequest {
selection: D37TableSelectionWidthFitRange;
action: D37TableSelectionWidthFitAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionWidthFitResult
[Section titled “D37TableSelectionWidthFitResult”](#d37tableselectionwidthfitresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionWidthFitResult {
schema: "fastdoc.shell.d37-table-selection-width-fit.v1";
action: D37TableSelectionWidthFitAction;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fit-contents";
tableWidthResult: D37TableWidthResult;
}
```
### D37TableSelectionWidthFitCommandState
[Section titled “D37TableSelectionWidthFitCommandState”](#d37tableselectionwidthfitcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionWidthFitCommandState {
schema: "fastdoc.shell.d37-table-selection-width-fit-command-state.v1";
operationKind: "fit-table-width-to-contents";
action: D37TableSelectionWidthFitAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fit-contents";
resultKind: string | null;
writebackResultKind: string | null;
tableWidthUnit: string | null;
tableWidthValue: number | null;
tableWidthTwips: number | null;
computedTableWidthToContentsTwips: number | null;
tableWidthPercentX50: number | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellContentVerticalAlignment
[Section titled “D37TableCellContentVerticalAlignment”](#d37tablecellcontentverticalalignment)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellContentVerticalAlignment = "top" | "center" | "middle" | "bottom";
```
### D37TableCellContentHorizontalAlignment
[Section titled “D37TableCellContentHorizontalAlignment”](#d37tablecellcontenthorizontalalignment)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellContentHorizontalAlignment = "left" | "center" | "right";
```
### D37TableCellContentAlignmentRequest
[Section titled “D37TableCellContentAlignmentRequest”](#d37tablecellcontentalignmentrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellContentAlignmentRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
verticalAlignment: D37TableCellContentVerticalAlignment;
horizontalAlignment: D37TableCellContentHorizontalAlignment;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellVerticalAlignment
[Section titled “D37TableCellVerticalAlignment”](#d37tablecellverticalalignment)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellVerticalAlignment = "top" | "center" | "middle" | "bottom";
```
### D37TableCellVerticalAlignmentMode
[Section titled “D37TableCellVerticalAlignmentMode”](#d37tablecellverticalalignmentmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellVerticalAlignmentMode = "cell" | "range";
```
### D37TableCellVerticalAlignmentRequest
[Section titled “D37TableCellVerticalAlignmentRequest”](#d37tablecellverticalalignmentrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellVerticalAlignmentRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount?: number | null;
columnCount?: number | null;
alignment: D37TableCellVerticalAlignment;
applyMode?: D37TableCellVerticalAlignmentMode | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellContentAlignmentResult
[Section titled “D37TableCellContentAlignmentResult”](#d37tablecellcontentalignmentresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellContentAlignmentResult {
schema: "fastdoc.shell.d37-table-cell-content-alignment.v1";
operationKind: "set-table-cell-alignment-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
requestedVerticalAlignment: D37TableCellContentVerticalAlignment;
requestedHorizontalAlignment: D37TableCellContentHorizontalAlignment;
verticalAlignment: string | null;
horizontalAlignment: string | null;
resultKind: string | null;
writebackResultKind: string | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableCellVerticalAlignmentResult
[Section titled “D37TableCellVerticalAlignmentResult”](#d37tablecellverticalalignmentresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellVerticalAlignmentResult {
schema: "fastdoc.shell.d37-table-cell-vertical-alignment.v1";
operationKind: "set-table-cell-vertical-alignment" | "set-table-cell-vertical-alignment-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
applyMode: D37TableCellVerticalAlignmentMode;
requestedAlignment: D37TableCellVerticalAlignment;
cellVerticalAlignment: string | null;
resultKind: string | null;
writebackResultKind: string | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableCellContentAlignmentCommandState
[Section titled “D37TableCellContentAlignmentCommandState”](#d37tablecellcontentalignmentcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellContentAlignmentCommandState {
schema: "fastdoc.shell.d37-table-cell-content-alignment-command-state.v1";
operationKind: "set-table-cell-alignment-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
requestedVerticalAlignment: D37TableCellContentVerticalAlignment;
requestedHorizontalAlignment: D37TableCellContentHorizontalAlignment;
verticalAlignment: string | null;
horizontalAlignment: string | null;
resultKind: string | null;
writebackResultKind: string | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellVerticalAlignmentCommandState
[Section titled “D37TableCellVerticalAlignmentCommandState”](#d37tablecellverticalalignmentcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellVerticalAlignmentCommandState {
schema: "fastdoc.shell.d37-table-cell-vertical-alignment-command-state.v1";
operationKind: D37TableCellVerticalAlignmentResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
applyMode: D37TableCellVerticalAlignmentMode;
requestedAlignment: D37TableCellVerticalAlignment;
cellVerticalAlignment: string | null;
resultKind: string | null;
writebackResultKind: string | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellExactSizeRequest
[Section titled “D37TableCellExactSizeRequest”](#d37tablecellexactsizerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellExactSizeRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
widthTwips: number;
heightTwips: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellExactSizeResult
[Section titled “D37TableCellExactSizeResult”](#d37tablecellexactsizeresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellExactSizeResult {
schema: "fastdoc.shell.d37-table-cell-exact-size.v1";
operationKind: "set-table-cell-exact-size";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
widthTwips: number | null;
heightTwips: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableCellExactSizeCommandState
[Section titled “D37TableCellExactSizeCommandState”](#d37tablecellexactsizecommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellExactSizeCommandState {
schema: "fastdoc.shell.d37-table-cell-exact-size-command-state.v1";
operationKind: "set-table-cell-exact-size";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
widthTwips: number | null;
heightTwips: number | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellTextDirection
[Section titled “D37TableCellTextDirection”](#d37tablecelltextdirection)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellTextDirection = "horizontal" | "normal" | "rotate_down" | "down" | "vertical" | "rotate_up" | "up" | "0deg" | "90deg" | "270deg" | "-90deg";
```
### D37TableCellTextDirectionMode
[Section titled “D37TableCellTextDirectionMode”](#d37tablecelltextdirectionmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellTextDirectionMode = "single" | "range";
```
### D37TableCellTextDirectionRequest
[Section titled “D37TableCellTextDirectionRequest”](#d37tablecelltextdirectionrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextDirectionRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount?: number | null;
columnCount?: number | null;
direction: D37TableCellTextDirection;
applyMode?: D37TableCellTextDirectionMode | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellTextDirectionResult
[Section titled “D37TableCellTextDirectionResult”](#d37tablecelltextdirectionresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextDirectionResult {
schema: "fastdoc.shell.d37-table-cell-text-direction.v1";
operationKind: "set-table-cell-text-direction" | "set-table-cell-text-direction-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
requestedDirection: D37TableCellTextDirection;
textDirection: string | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableCellTextDirectionCommandState
[Section titled “D37TableCellTextDirectionCommandState”](#d37tablecelltextdirectioncommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextDirectionCommandState {
schema: "fastdoc.shell.d37-table-cell-text-direction-command-state.v1";
operationKind: D37TableCellTextDirectionResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
applyMode: D37TableCellTextDirectionMode;
requestedDirection: D37TableCellTextDirection;
textDirection: string | null;
resultKind: string | null;
writebackResultKind: string | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### EditorV0TableCellParagraphTextTarget
[Section titled “EditorV0TableCellParagraphTextTarget”](#editorv0tablecellparagraphtexttarget)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0TableCellParagraphTextTarget = {
kind: "table-cell";
bodyBlockIndex: number;
rowIndex: number;
cellIndex: number;
paragraphIndex: number;
} | {
kind: "nested-table-cell";
bodyBlockIndex: number;
outerRowIndex: number;
outerCellIndex: number;
nestedTableBlockIndex: number;
rowIndex: number;
cellIndex: number;
paragraphIndex: number;
};
```
### EditorV0TableCellTextRangeEndpoint
[Section titled “EditorV0TableCellTextRangeEndpoint”](#editorv0tablecelltextrangeendpoint)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0TableCellTextRangeEndpoint = EditorV0TableCellParagraphTextTarget & {
offset: number;
};
```
# DTO · Tables: placement on the page
> 27 interfaces and 6 type aliases from the `api-edit.ts` module — text wrapping, floating tables, autofit, and indents.
27 interfaces and 6 type aliases — text wrapping, floating tables, autofit, and indents.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · **Tables: placement on the page** · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
Types on this page — 33
* [`D37TableColumnAutofitRequest`](#d37tablecolumnautofitrequest)
* [`D37TableColumnAutofitResult`](#d37tablecolumnautofitresult)
* [`D37TableSelectionColumnAutofitStrategy`](#d37tableselectioncolumnautofitstrategy)
* [`D37TableSelectionColumnAutofitRange`](#d37tableselectioncolumnautofitrange)
* [`D37TableSelectionColumnAutofitRequest`](#d37tableselectioncolumnautofitrequest)
* [`D37TableSelectionColumnAutofitResult`](#d37tableselectioncolumnautofitresult)
* [`D37TableSelectionColumnAutofitCommandState`](#d37tableselectioncolumnautofitcommandstate)
* [`D37TableCellSpacingRequest`](#d37tablecellspacingrequest)
* [`D37TableCellSpacingResult`](#d37tablecellspacingresult)
* [`D37TableCellSpacingCommandState`](#d37tablecellspacingcommandstate)
* [`D37TableWrappingStyleMode`](#d37tablewrappingstylemode)
* [`D37TableWrappingStyleRequest`](#d37tablewrappingstylerequest)
* [`D37TableWrappingStyleResult`](#d37tablewrappingstyleresult)
* [`D37TableWrappingStyleCommandState`](#d37tablewrappingstylecommandstate)
* [`D37TableFloatingPositionRequest`](#d37tablefloatingpositionrequest)
* [`D37TableFloatingPositionResult`](#d37tablefloatingpositionresult)
* [`D37TableFloatingPositionCommandState`](#d37tablefloatingpositioncommandstate)
* [`D37TableAutofitToWindowAction`](#d37tableautofittowindowaction)
* [`D37TableAutofitToWindowRequest`](#d37tableautofittowindowrequest)
* [`D37TableAutofitToWindowResult`](#d37tableautofittowindowresult)
* [`D37TableAutofitToWindowCommandState`](#d37tableautofittowindowcommandstate)
* [`D37TableFixedColumnWidthAction`](#d37tablefixedcolumnwidthaction)
* [`D37TableFixedColumnWidthRequest`](#d37tablefixedcolumnwidthrequest)
* [`D37TableFixedColumnWidthResult`](#d37tablefixedcolumnwidthresult)
* [`D37TableFixedColumnWidthCommandState`](#d37tablefixedcolumnwidthcommandstate)
* [`D37TableCellMarginsMode`](#d37tablecellmarginsmode)
* [`D37TableCellMarginsRequest`](#d37tablecellmarginsrequest)
* [`D37TableCellMarginsResult`](#d37tablecellmarginsresult)
* [`D37TableCellMarginsCommandState`](#d37tablecellmarginscommandstate)
* [`D37TableCellTextWrappingMode`](#d37tablecelltextwrappingmode)
* [`D37TableCellTextWrappingRequest`](#d37tablecelltextwrappingrequest)
* [`D37TableCellTextWrappingResult`](#d37tablecelltextwrappingresult)
* [`D37TableCellTextWrappingCommandState`](#d37tablecelltextwrappingcommandstate)
### D37TableColumnAutofitRequest
[Section titled “D37TableColumnAutofitRequest”](#d37tablecolumnautofitrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableColumnAutofitRequest {
bodyBlockIndex: number;
columnIndex: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableColumnAutofitResult
[Section titled “D37TableColumnAutofitResult”](#d37tablecolumnautofitresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableColumnAutofitResult {
schema: "fastdoc.shell.d37-table-column-autofit.v1";
operationKind: "autofit-table-column-to-content";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
columnIndex: number;
resultKind: string | null;
writebackResultKind: string | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionColumnAutofitStrategy
[Section titled “D37TableSelectionColumnAutofitStrategy”](#d37tableselectioncolumnautofitstrategy)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionColumnAutofitStrategy = "widest-content-column";
```
### D37TableSelectionColumnAutofitRange
[Section titled “D37TableSelectionColumnAutofitRange”](#d37tableselectioncolumnautofitrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionColumnAutofitRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionColumnAutofitRequest
[Section titled “D37TableSelectionColumnAutofitRequest”](#d37tableselectioncolumnautofitrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionColumnAutofitRequest {
selection: D37TableSelectionColumnAutofitRange;
strategy: D37TableSelectionColumnAutofitStrategy;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionColumnAutofitResult
[Section titled “D37TableSelectionColumnAutofitResult”](#d37tableselectioncolumnautofitresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionColumnAutofitResult {
schema: "fastdoc.shell.d37-table-selection-column-autofit.v1";
strategy: D37TableSelectionColumnAutofitStrategy;
selection: D37TableSelectionColumnAutofitRange;
computedColumnIndex: number;
computedColumnTextLength: number;
columnTextLengths: number[];
columnAutofitResult: D37TableColumnAutofitResult;
}
```
### D37TableSelectionColumnAutofitCommandState
[Section titled “D37TableSelectionColumnAutofitCommandState”](#d37tableselectioncolumnautofitcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionColumnAutofitCommandState {
schema: "fastdoc.shell.d37-table-selection-column-autofit-command-state.v1";
operationKind: "autofit-table-column-to-content";
strategy: D37TableSelectionColumnAutofitStrategy;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionColumnAutofitRange;
computedColumnIndex: number | null;
computedColumnTextLength: number | null;
columnTextLengths: number[];
resultKind: string | null;
writebackResultKind: string | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellSpacingRequest
[Section titled “D37TableCellSpacingRequest”](#d37tablecellspacingrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellSpacingRequest {
bodyBlockIndex: number;
spacingTwips: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellSpacingResult
[Section titled “D37TableCellSpacingResult”](#d37tablecellspacingresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellSpacingResult {
schema: "fastdoc.shell.d37-table-cell-spacing.v1";
operationKind: "set-table-cell-spacing";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
resultKind: string | null;
writebackResultKind: string | null;
spacingTwips: number | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableCellSpacingCommandState
[Section titled “D37TableCellSpacingCommandState”](#d37tablecellspacingcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellSpacingCommandState {
schema: "fastdoc.shell.d37-table-cell-spacing-command-state.v1";
operationKind: "set-table-cell-spacing";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
resultKind: string | null;
writebackResultKind: string | null;
spacingTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableWrappingStyleMode
[Section titled “D37TableWrappingStyleMode”](#d37tablewrappingstylemode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableWrappingStyleMode = "inline" | "floating";
```
### D37TableWrappingStyleRequest
[Section titled “D37TableWrappingStyleRequest”](#d37tablewrappingstylerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableWrappingStyleRequest {
bodyBlockIndex: number;
wrappingStyle: D37TableWrappingStyleMode;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableWrappingStyleResult
[Section titled “D37TableWrappingStyleResult”](#d37tablewrappingstyleresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableWrappingStyleResult {
schema: "fastdoc.shell.d37-table-wrapping-style.v1";
operationKind: "set-table-wrapping-inline" | "set-table-wrapping-floating";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
wrappingStyle: D37TableWrappingStyleMode;
resultKind: string | null;
writebackResultKind: string | null;
tableWrappingStyle: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableWrappingStyleCommandState
[Section titled “D37TableWrappingStyleCommandState”](#d37tablewrappingstylecommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableWrappingStyleCommandState {
schema: "fastdoc.shell.d37-table-wrapping-style-command-state.v1";
operationKind: "set-table-wrapping-inline" | "set-table-wrapping-floating";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
wrappingStyle: D37TableWrappingStyleMode;
resultKind: string | null;
writebackResultKind: string | null;
tableWrappingStyle: string | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableFloatingPositionRequest
[Section titled “D37TableFloatingPositionRequest”](#d37tablefloatingpositionrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFloatingPositionRequest {
bodyBlockIndex: number;
leftFromTextTwips: number;
rightFromTextTwips: number;
topFromTextTwips: number;
bottomFromTextTwips: number;
positionXTwips: number;
positionYTwips: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableFloatingPositionResult
[Section titled “D37TableFloatingPositionResult”](#d37tablefloatingpositionresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFloatingPositionResult {
schema: "fastdoc.shell.d37-table-floating-position.v1";
operationKind: "set-table-floating-position";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
leftFromTextTwips: number;
rightFromTextTwips: number;
topFromTextTwips: number;
bottomFromTextTwips: number;
positionXTwips: number;
positionYTwips: number;
resultKind: string | null;
writebackResultKind: string | null;
tableWrappingStyle: string | null;
tableFloatingLeftFromTextTwips: number | null;
tableFloatingRightFromTextTwips: number | null;
tableFloatingTopFromTextTwips: number | null;
tableFloatingBottomFromTextTwips: number | null;
tableFloatingPositionXTwips: number | null;
tableFloatingPositionYTwips: number | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableFloatingPositionCommandState
[Section titled “D37TableFloatingPositionCommandState”](#d37tablefloatingpositioncommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFloatingPositionCommandState {
schema: "fastdoc.shell.d37-table-floating-position-command-state.v1";
operationKind: "set-table-floating-position";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
leftFromTextTwips: number;
rightFromTextTwips: number;
topFromTextTwips: number;
bottomFromTextTwips: number;
positionXTwips: number;
positionYTwips: number;
resultKind: string | null;
writebackResultKind: string | null;
tableWrappingStyle: string | null;
tableFloatingLeftFromTextTwips: number | null;
tableFloatingRightFromTextTwips: number | null;
tableFloatingTopFromTextTwips: number | null;
tableFloatingBottomFromTextTwips: number | null;
tableFloatingPositionXTwips: number | null;
tableFloatingPositionYTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableAutofitToWindowAction
[Section titled “D37TableAutofitToWindowAction”](#d37tableautofittowindowaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableAutofitToWindowAction = "fit-selected-table-to-window";
```
### D37TableAutofitToWindowRequest
[Section titled “D37TableAutofitToWindowRequest”](#d37tableautofittowindowrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAutofitToWindowRequest {
selection: D37TableSelectionWidthFitRange;
action: D37TableAutofitToWindowAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableAutofitToWindowResult
[Section titled “D37TableAutofitToWindowResult”](#d37tableautofittowindowresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAutofitToWindowResult {
schema: "fastdoc.shell.d37-table-autofit-to-window.v1";
action: D37TableAutofitToWindowAction;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fit-window";
tableWidthResult: D37TableWidthResult;
}
```
### D37TableAutofitToWindowCommandState
[Section titled “D37TableAutofitToWindowCommandState”](#d37tableautofittowindowcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAutofitToWindowCommandState {
schema: "fastdoc.shell.d37-table-autofit-to-window-command-state.v1";
operationKind: "fit-table-width-to-window";
action: D37TableAutofitToWindowAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fit-window";
resultKind: string | null;
writebackResultKind: string | null;
tableWidthUnit: string | null;
tableWidthValue: number | null;
tableWidthTwips: number | null;
computedTableWidthToContentsTwips: number | null;
tableWidthPercentX50: number | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableFixedColumnWidthAction
[Section titled “D37TableFixedColumnWidthAction”](#d37tablefixedcolumnwidthaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableFixedColumnWidthAction = "fixed-selected-table-column-width";
```
### D37TableFixedColumnWidthRequest
[Section titled “D37TableFixedColumnWidthRequest”](#d37tablefixedcolumnwidthrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFixedColumnWidthRequest {
selection: D37TableSelectionWidthFitRange;
action: D37TableFixedColumnWidthAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableFixedColumnWidthResult
[Section titled “D37TableFixedColumnWidthResult”](#d37tablefixedcolumnwidthresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFixedColumnWidthResult {
schema: "fastdoc.shell.d37-table-fixed-column-width.v1";
action: D37TableFixedColumnWidthAction;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fixed-column-width";
tableWidthResult: D37TableWidthResult;
}
```
### D37TableFixedColumnWidthCommandState
[Section titled “D37TableFixedColumnWidthCommandState”](#d37tablefixedcolumnwidthcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableFixedColumnWidthCommandState {
schema: "fastdoc.shell.d37-table-fixed-column-width-command-state.v1";
operationKind: "fixed-table-column-width";
action: D37TableFixedColumnWidthAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionWidthFitRange;
computedWidthMode: "fixed-column-width";
resultKind: string | null;
writebackResultKind: string | null;
tableWidthUnit: string | null;
tableWidthValue: number | null;
tableWidthTwips: number | null;
computedTableWidthToContentsTwips: number | null;
tableWidthPercentX50: number | null;
tableDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellMarginsMode
[Section titled “D37TableCellMarginsMode”](#d37tablecellmarginsmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellMarginsMode = "cell" | "range" | "default-from-cell";
```
### D37TableCellMarginsRequest
[Section titled “D37TableCellMarginsRequest”](#d37tablecellmarginsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellMarginsRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount?: number | null;
columnCount?: number | null;
topTwips?: number | null;
rightTwips?: number | null;
bottomTwips?: number | null;
leftTwips?: number | null;
applyMode?: D37TableCellMarginsMode | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellMarginsResult
[Section titled “D37TableCellMarginsResult”](#d37tablecellmarginsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellMarginsResult {
schema: "fastdoc.shell.d37-table-cell-margins.v1";
operationKind: "set-table-cell-margins" | "set-table-cell-margins-range" | "set-table-default-cell-margins-from-cell";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
resultKind: string | null;
writebackResultKind: string | null;
topTwips: number | null;
rightTwips: number | null;
bottomTwips: number | null;
leftTwips: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableCellMarginsCommandState
[Section titled “D37TableCellMarginsCommandState”](#d37tablecellmarginscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellMarginsCommandState {
schema: "fastdoc.shell.d37-table-cell-margins-command-state.v1";
operationKind: D37TableCellMarginsResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
applyMode: D37TableCellMarginsMode;
resultKind: string | null;
writebackResultKind: string | null;
topTwips: number | null;
rightTwips: number | null;
bottomTwips: number | null;
leftTwips: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableCellTextWrappingMode
[Section titled “D37TableCellTextWrappingMode”](#d37tablecelltextwrappingmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableCellTextWrappingMode = "cell" | "range";
```
### D37TableCellTextWrappingRequest
[Section titled “D37TableCellTextWrappingRequest”](#d37tablecelltextwrappingrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextWrappingRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount?: number | null;
columnCount?: number | null;
wrapText: boolean;
applyMode?: D37TableCellTextWrappingMode | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCellTextWrappingResult
[Section titled “D37TableCellTextWrappingResult”](#d37tablecelltextwrappingresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextWrappingResult {
schema: "fastdoc.shell.d37-table-cell-text-wrapping.v1";
operationKind: "set-table-cell-text-wrapping" | "set-table-cell-text-wrapping-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
resultKind: string | null;
writebackResultKind: string | null;
wrapText: boolean | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableCellTextWrappingCommandState
[Section titled “D37TableCellTextWrappingCommandState”](#d37tablecelltextwrappingcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCellTextWrappingCommandState {
schema: "fastdoc.shell.d37-table-cell-text-wrapping-command-state.v1";
operationKind: D37TableCellTextWrappingResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number | null;
columnCount: number | null;
applyMode: D37TableCellTextWrappingMode;
resultKind: string | null;
writebackResultKind: string | null;
wrapText: boolean | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
# DTO · Tables: structure
> 60 interfaces and 14 type aliases from the `api-edit.ts` module — creating tables, rows and columns, selection, and grid editing.
60 interfaces and 14 type aliases — creating tables, rows and columns, selection, and grid editing.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: [Text and paragraphs](/reference/sumdoc/dto-edit-text/) · **Tables: structure** · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
Types on this page — 74
* [`D37TableRangeRequest`](#d37tablerangerequest)
* [`D37TableRangeResult`](#d37tablerangeresult)
* [`D37TableCreateRequest`](#d37tablecreaterequest)
* [`D37TableCreateResult`](#d37tablecreateresult)
* [`D37TableGridCreateRequest`](#d37tablegridcreaterequest)
* [`D37TableGridCreateResult`](#d37tablegridcreateresult)
* [`EditorV0ConvertTextToTableRequest`](#editorv0converttexttotablerequest)
* [`EditorV0ConvertTextToTableResult`](#editorv0converttexttotableresult)
* [`D37AnyTableCreateResult`](#d37anytablecreateresult)
* [`EditorV0InsertTableCaptionRequest`](#editorv0inserttablecaptionrequest)
* [`EditorV0UpdateTableRequest`](#editorv0updatetablerequest)
* [`EditorV0TableOfFiguresRequest`](#editorv0tableoffiguresrequest)
* [`EditorV0InsertTableCaptionResult`](#editorv0inserttablecaptionresult)
* [`EditorV0UpdateTableResult`](#editorv0updatetableresult)
* [`EditorV0TableOfFiguresResult`](#editorv0tableoffiguresresult)
* [`EditorV0UpdateTableOfFiguresResult`](#editorv0updatetableoffiguresresult)
* [`D37TableMouseDrawSemanticRequest`](#d37tablemousedrawsemanticrequest)
* [`D37TableMouseDrawSemanticResult`](#d37tablemousedrawsemanticresult)
* [`D37TableSelectionResizeAxis`](#d37tableselectionresizeaxis)
* [`D37TableSelectionResizeEdge`](#d37tableselectionresizeedge)
* [`D37TableSelectionResizeRange`](#d37tableselectionresizerange)
* [`D37TableSelectionResizeRequest`](#d37tableselectionresizerequest)
* [`D37TableSelectionResizeCommandState`](#d37tableselectionresizecommandstate)
* [`D37TableSelectionResizeResult`](#d37tableselectionresizeresult)
* [`D37TableTemplateRequest`](#d37tabletemplaterequest)
* [`D37TableTemplateResult`](#d37tabletemplateresult)
* [`D37TableHeaderRowMode`](#d37tableheaderrowmode)
* [`D37TableHeaderRowRequest`](#d37tableheaderrowrequest)
* [`D37TableHeaderRowResult`](#d37tableheaderrowresult)
* [`D37TableHeaderRepeatMode`](#d37tableheaderrepeatmode)
* [`D37TableHeaderRepeatRequest`](#d37tableheaderrepeatrequest)
* [`D37TableHeaderRepeatResult`](#d37tableheaderrepeatresult)
* [`D37TableDataCommandKind`](#d37tabledatacommandkind)
* [`D37TableTextSeparator`](#d37tabletextseparator)
* [`D37TableSortValueType`](#d37tablesortvaluetype)
* [`D37TableSortDirection`](#d37tablesortdirection)
* [`D37TableSortHeaderMode`](#d37tablesortheadermode)
* [`D37TableSortKey`](#d37tablesortkey)
* [`D37TableDataCommandRequest`](#d37tabledatacommandrequest)
* [`D37TableDataCommandResult`](#d37tabledatacommandresult)
* [`D37TableSelectionHeaderRepeatAction`](#d37tableselectionheaderrepeataction)
* [`D37TableSelectionHeaderRepeatRange`](#d37tableselectionheaderrepeatrange)
* [`D37TableSelectionHeaderRepeatRequest`](#d37tableselectionheaderrepeatrequest)
* [`D37TableSelectionHeaderRepeatResult`](#d37tableselectionheaderrepeatresult)
* [`D37TableSelectionHeaderRepeatCommandState`](#d37tableselectionheaderrepeatcommandstate)
* [`D37TableSelectionClearFillRequest`](#d37tableselectionclearfillrequest)
* [`D37TableSelectionClearFillResult`](#d37tableselectionclearfillresult)
* [`D37TableSelectionClearFillCommandState`](#d37tableselectionclearfillcommandstate)
* [`D37TableSelectionClearContentsRequest`](#d37tableselectionclearcontentsrequest)
* [`D37TableSelectionClearContentsResult`](#d37tableselectionclearcontentsresult)
* [`D37TableSelectionClearContentsCommandState`](#d37tableselectionclearcontentscommandstate)
* [`D37TableSelectionClearFormattingRequest`](#d37tableselectionclearformattingrequest)
* [`D37TableSelectionClearFormattingResult`](#d37tableselectionclearformattingresult)
* [`D37TableSelectionClearFormattingCommandState`](#d37tableselectionclearformattingcommandstate)
* [`D37TableSelectionClearContentFormatRequest`](#d37tableselectionclearcontentformatrequest)
* [`D37TableSelectionClearContentFormatResult`](#d37tableselectionclearcontentformatresult)
* [`D37TableSelectionClearContentFormatCommandState`](#d37tableselectionclearcontentformatcommandstate)
* [`D37TableStructureEditMode`](#d37tablestructureeditmode)
* [`D37TableSelectionStructureEditAction`](#d37tableselectionstructureeditaction)
* [`D37TableStructureEditRequest`](#d37tablestructureeditrequest)
* [`D37TableStructureEditResult`](#d37tablestructureeditresult)
* [`D37TableSelectionRange`](#d37tableselectionrange)
* [`D37TableSelectionStructureEditRequest`](#d37tableselectionstructureeditrequest)
* [`D37TableSelectionStructureEditResult`](#d37tableselectionstructureeditresult)
* [`D37TableSelectionStructureCommandState`](#d37tableselectionstructurecommandstate)
* [`D37TableDimensionsRequest`](#d37tabledimensionsrequest)
* [`D37TableDimensionsResult`](#d37tabledimensionsresult)
* [`D37TableSelectionRowFitAction`](#d37tableselectionrowfitaction)
* [`D37TableSelectionRowFitRange`](#d37tableselectionrowfitrange)
* [`D37TableSelectionRowFitRequest`](#d37tableselectionrowfitrequest)
* [`D37TableSelectionRowFitResult`](#d37tableselectionrowfitresult)
* [`D37TableSelectionRowFitCommandState`](#d37tableselectionrowfitcommandstate)
* [`D37TableAltTextRequest`](#d37tablealttextrequest)
* [`D37TableAltTextResult`](#d37tablealttextresult)
### D37TableRangeRequest
[Section titled “D37TableRangeRequest”](#d37tablerangerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableRangeRequest {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
clipboardText?: string;
clipboardHtml?: string;
trackRevisions?: boolean;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableRangeResult
[Section titled “D37TableRangeResult”](#d37tablerangeresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableRangeResult {
schema: "fastdoc.shell.d37-table-range-clipboard.v1";
operationKind: "copy-table-cell-text-range" | "paste-table-cell-text-into-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
clipboardText: string | null;
clipboardHtml: string | null;
range: {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
};
resultKind: string | null;
writebackResultKind: string | null;
snapshot: unknown;
}
```
### D37TableCreateRequest
[Section titled “D37TableCreateRequest”](#d37tablecreaterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCreateRequest {
bodyBlockIndex: number;
clipboardText?: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableCreateResult
[Section titled “D37TableCreateResult”](#d37tablecreateresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableCreateResult {
schema: "fastdoc.shell.d37-table-create-clipboard.v1";
operationKind: "create-simple-table-from-clipboard";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
clipboardText: string | null;
bodyBlockIndex: number;
resultKind: string | null;
writebackResultKind: string | null;
snapshot: unknown;
}
```
### D37TableGridCreateRequest
[Section titled “D37TableGridCreateRequest”](#d37tablegridcreaterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableGridCreateRequest {
bodyBlockIndex: number;
targetKind?: "body-block" | "table-cell";
rowIndex?: number | null;
columnIndex?: number | null;
rowCount: number;
columnCount: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableGridCreateResult
[Section titled “D37TableGridCreateResult”](#d37tablegridcreateresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableGridCreateResult {
schema: "fastdoc.shell.d37-table-create-grid.v1";
operationKind: "create-simple-table" | "create-nested-simple-table";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
targetKind: "body-block" | "table-cell";
rowIndex: number | null;
columnIndex: number | null;
rowCount: number;
columnCount: number;
resultKind: string | null;
writebackResultKind: string | null;
snapshot: unknown;
}
```
### EditorV0ConvertTextToTableRequest
[Section titled “EditorV0ConvertTextToTableRequest”](#editorv0converttexttotablerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ConvertTextToTableRequest {
bodyBlockIndex: number;
clipboardText: string;
separator: "paragraphs" | "tabs" | "semicolons" | `other:${string}`;
columnCount: number;
autofitMode: "fixed-auto" | "fixed" | "contents" | "window";
fixedColumnWidthTwips?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0ConvertTextToTableResult
[Section titled “EditorV0ConvertTextToTableResult”](#editorv0converttexttotableresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ConvertTextToTableResult {
schema: "fastdoc.shell.editor-v0-convert-text-to-table.v1";
operationKind: "convert-text-to-table";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
transientWrite?: boolean;
clipboardText: string | null;
bodyBlockIndex: number;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
separator: string;
autofitMode: string;
fixedColumnWidthTwips: number | null;
resultKind: string | null;
writebackResultKind: string | null;
snapshot: unknown;
}
```
### D37AnyTableCreateResult
[Section titled “D37AnyTableCreateResult”](#d37anytablecreateresult)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37AnyTableCreateResult = D37TableCreateResult | D37TableGridCreateResult;
```
### EditorV0InsertTableCaptionRequest
[Section titled “EditorV0InsertTableCaptionRequest”](#editorv0inserttablecaptionrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertTableCaptionRequest {
bodyBlockIndex: number;
label?: string | null;
captionText?: string | null;
captionPosition?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0UpdateTableRequest
[Section titled “EditorV0UpdateTableRequest”](#editorv0updatetablerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateTableRequest {
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0TableOfFiguresRequest
[Section titled “EditorV0TableOfFiguresRequest”](#editorv0tableoffiguresrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0TableOfFiguresRequest {
captionLabel?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertTableCaptionResult
[Section titled “EditorV0InsertTableCaptionResult”](#editorv0inserttablecaptionresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertTableCaptionResult {
schema: "fastdoc.shell.editor-v0-insert-table-caption-action.v1";
operationKind: "insert-table-caption";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
label: string;
captionText: string;
captionPosition: string;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UpdateTableResult
[Section titled “EditorV0UpdateTableResult”](#editorv0updatetableresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateTableResult {
schema: "fastdoc.shell.editor-v0-update-table-action.v1";
operationKind: "update-toc";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
currentResultText: string | null;
updatedResultText: string | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0TableOfFiguresResult
[Section titled “EditorV0TableOfFiguresResult”](#editorv0tableoffiguresresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0TableOfFiguresResult {
schema: "fastdoc.shell.editor-v0-table-of-figures-action.v1";
operationKind: "insert-table-of-figures";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
captionLabel: string | null;
captionCount: number | null;
existingTableOfFiguresCount: number | null;
insertedInstructionText: string | null;
insertedResultText: string | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0UpdateTableOfFiguresResult
[Section titled “EditorV0UpdateTableOfFiguresResult”](#editorv0updatetableoffiguresresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateTableOfFiguresResult {
schema: "fastdoc.shell.editor-v0-update-table-of-figures-action.v1";
operationKind: "update-table-of-figures";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
documentPathAfterReopen: string | null;
currentDocumentReopened: boolean;
captionLabel: string | null;
captionCount: number | null;
existingTableOfFiguresCount: number | null;
currentResultText: string | null;
updatedResultText: string | null;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### D37TableMouseDrawSemanticRequest
[Section titled “D37TableMouseDrawSemanticRequest”](#d37tablemousedrawsemanticrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableMouseDrawSemanticRequest {
bodyBlockIndex: number;
rowCount: number;
columnCount: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableMouseDrawSemanticResult
[Section titled “D37TableMouseDrawSemanticResult”](#d37tablemousedrawsemanticresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableMouseDrawSemanticResult {
schema: "fastdoc.shell.d37-table-mouse-draw-semantic.v1";
operationKind: "create-drawn-simple-table";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowCount: number | null;
columnCount: number | null;
requestedRowCount: number;
requestedColumnCount: number;
tableInputProvenance: string | null;
resultKind: string | null;
writebackResultKind: string | null;
mutatedTableCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionResizeAxis
[Section titled “D37TableSelectionResizeAxis”](#d37tableselectionresizeaxis)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionResizeAxis = "column-width" | "row-height";
```
### D37TableSelectionResizeEdge
[Section titled “D37TableSelectionResizeEdge”](#d37tableselectionresizeedge)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionResizeEdge = "left" | "right" | "bottom";
```
### D37TableSelectionResizeRange
[Section titled “D37TableSelectionResizeRange”](#d37tableselectionresizerange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionResizeRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionResizeRequest
[Section titled “D37TableSelectionResizeRequest”](#d37tableselectionresizerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionResizeRequest {
selection: D37TableSelectionResizeRange;
resizeAxis: D37TableSelectionResizeAxis;
resizeEdge?: D37TableSelectionResizeEdge | null;
startDimensionTwips: number;
deltaTwips: number;
minDimensionTwips?: number | null;
maxDimensionTwips?: number | null;
tableWidthTwips?: number | null;
tableIndentTwips?: number | null;
tableAlignment?: "left" | "center" | "right" | null;
pairedColumnIndex?: number | null;
pairedColumnWidthTwips?: number | null;
startDimensionSource?: string | null;
rowHeightRule?: "exact" | "atLeast" | "at_least" | "auto" | "automatic" | null;
workflowSource?: "keyboard-nudge" | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionResizeCommandState
[Section titled “D37TableSelectionResizeCommandState”](#d37tableselectionresizecommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionResizeCommandState {
operationKind: "set-table-column-width" | "set-table-row-height";
targetRowIndex: number | null;
targetColumnIndex: number | null;
startDimensionTwips: number;
deltaTwips: number;
requestedDimensionTwips: number;
clampedDimensionTwips: number;
minDimensionTwips: number;
maxDimensionTwips: number;
tableWidthTwips: number | null;
tableIndentTwips: number | null;
tableAlignment: "left" | "center" | "right" | null;
pairedColumnIndex: number | null;
pairedColumnWidthTwips: number | null;
startDimensionSource: string | null;
rowHeightRule: string | null;
workflowSource: string | null;
}
```
### D37TableSelectionResizeResult
[Section titled “D37TableSelectionResizeResult”](#d37tableselectionresizeresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionResizeResult {
schema: "fastdoc.shell.d37-table-selection-resize.v1";
resizeAxis: D37TableSelectionResizeAxis;
resizeEdge: D37TableSelectionResizeEdge;
selection: D37TableSelectionResizeRange;
computedCommandState: D37TableSelectionResizeCommandState;
dimensionsResult: D37TableDimensionsResult;
}
```
### D37TableTemplateRequest
[Section titled “D37TableTemplateRequest”](#d37tabletemplaterequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableTemplateRequest {
bodyBlockIndex: number;
templateKind?: "banded-blue" | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableTemplateResult
[Section titled “D37TableTemplateResult”](#d37tabletemplateresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableTemplateResult {
schema: "fastdoc.shell.d37-table-template-format.v1";
operationKind: "apply-table-template-banded-blue";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
templateKind: "banded-blue";
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableHeaderRowMode
[Section titled “D37TableHeaderRowMode”](#d37tableheaderrowmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableHeaderRowMode = "set";
```
### D37TableHeaderRowRequest
[Section titled “D37TableHeaderRowRequest”](#d37tableheaderrowrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableHeaderRowRequest {
bodyBlockIndex: number;
headerRowMode?: D37TableHeaderRowMode | null;
styleOptions?: D37TableStyleOptions | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableHeaderRowResult
[Section titled “D37TableHeaderRowResult”](#d37tableheaderrowresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableHeaderRowResult {
schema: "fastdoc.shell.d37-table-header-row.v1";
operationKind: "set-table-header-row";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
headerRowMode: D37TableHeaderRowMode;
styleOptions: D37TableStyleOptions | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableHeaderRepeatMode
[Section titled “D37TableHeaderRepeatMode”](#d37tableheaderrepeatmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableHeaderRepeatMode = "repeat" | "clear";
```
### D37TableHeaderRepeatRequest
[Section titled “D37TableHeaderRepeatRequest”](#d37tableheaderrepeatrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableHeaderRepeatRequest {
bodyBlockIndex: number;
repeatMode?: D37TableHeaderRepeatMode | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableHeaderRepeatResult
[Section titled “D37TableHeaderRepeatResult”](#d37tableheaderrepeatresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableHeaderRepeatResult {
schema: "fastdoc.shell.d37-table-header-repeat.v1";
operationKind: "repeat-table-header-row" | "clear-repeat-table-header-row";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
repeatMode: D37TableHeaderRepeatMode;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
### D37TableDataCommandKind
[Section titled “D37TableDataCommandKind”](#d37tabledatacommandkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableDataCommandKind = "sort-table-ascending" | "convert-table-to-text";
```
### D37TableTextSeparator
[Section titled “D37TableTextSeparator”](#d37tabletextseparator)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableTextSeparator = "paragraphs" | "tabs" | "semicolons" | "other";
```
### D37TableSortValueType
[Section titled “D37TableSortValueType”](#d37tablesortvaluetype)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSortValueType = "text" | "number" | "date";
```
### D37TableSortDirection
[Section titled “D37TableSortDirection”](#d37tablesortdirection)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSortDirection = "ascending" | "descending";
```
### D37TableSortHeaderMode
[Section titled “D37TableSortHeaderMode”](#d37tablesortheadermode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSortHeaderMode = "header" | "no-header";
```
### D37TableSortKey
[Section titled “D37TableSortKey”](#d37tablesortkey)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSortKey {
columnIndex: number;
valueType: D37TableSortValueType;
direction: D37TableSortDirection;
}
```
### D37TableDataCommandRequest
[Section titled “D37TableDataCommandRequest”](#d37tabledatacommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableDataCommandRequest {
bodyBlockIndex: number;
command: D37TableDataCommandKind;
keyColumnIndex?: number | null;
sortKeys?: D37TableSortKey[];
sortHeaderMode?: D37TableSortHeaderMode;
sortCaseSensitive?: boolean;
sortLanguage?: string;
sortFieldSeparator?: Exclude;
sortCustomSeparator?: string | null;
textSeparator?: D37TableTextSeparator;
customSeparator?: string | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableDataCommandResult
[Section titled “D37TableDataCommandResult”](#d37tabledatacommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableDataCommandResult {
schema: "fastdoc.shell.d37-table-data-command.v1";
operationKind: D37TableDataCommandKind;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
keyColumnIndex: number | null;
sortKeys: D37TableSortKey[] | null;
sortHeaderMode: D37TableSortHeaderMode | null;
textSeparator: D37TableTextSeparator | null;
customSeparator: string | null;
resultKind: string | null;
writebackResultKind: string | null;
sortCaseSensitive: boolean | null;
sortLanguage: string | null;
sortFieldSeparator: Exclude | null;
sortCustomSeparator: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
clipboardText: string | null;
snapshot: unknown;
}
```
### D37TableSelectionHeaderRepeatAction
[Section titled “D37TableSelectionHeaderRepeatAction”](#d37tableselectionheaderrepeataction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionHeaderRepeatAction = "repeat-selected-header-row";
```
### D37TableSelectionHeaderRepeatRange
[Section titled “D37TableSelectionHeaderRepeatRange”](#d37tableselectionheaderrepeatrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionHeaderRepeatRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionHeaderRepeatRequest
[Section titled “D37TableSelectionHeaderRepeatRequest”](#d37tableselectionheaderrepeatrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionHeaderRepeatRequest {
selection: D37TableSelectionHeaderRepeatRange;
action: D37TableSelectionHeaderRepeatAction;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionHeaderRepeatResult
[Section titled “D37TableSelectionHeaderRepeatResult”](#d37tableselectionheaderrepeatresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionHeaderRepeatResult {
schema: "fastdoc.shell.d37-table-selection-header-repeat.v1";
action: D37TableSelectionHeaderRepeatAction;
selection: D37TableSelectionHeaderRepeatRange;
computedRepeatMode: "repeat" | "clear";
headerRepeatResult: D37TableHeaderRepeatResult;
}
```
### D37TableSelectionHeaderRepeatCommandState
[Section titled “D37TableSelectionHeaderRepeatCommandState”](#d37tableselectionheaderrepeatcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionHeaderRepeatCommandState {
schema: "fastdoc.shell.d37-table-selection-header-repeat-command-state.v1";
operationKind: "repeat-table-header-row" | "clear-repeat-table-header-row";
action: D37TableSelectionHeaderRepeatAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionHeaderRepeatRange;
computedRepeatMode: "repeat" | "clear";
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionClearFillRequest
[Section titled “D37TableSelectionClearFillRequest”](#d37tableselectionclearfillrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFillRequest {
selection: D37TableSelectionCellRangeFormatRange;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionClearFillResult
[Section titled “D37TableSelectionClearFillResult”](#d37tableselectionclearfillresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFillResult {
schema: "fastdoc.shell.d37-table-selection-clear-fill.v1";
operationKind: "clear-table-cell-fill-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionClearFillCommandState
[Section titled “D37TableSelectionClearFillCommandState”](#d37tableselectionclearfillcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFillCommandState {
schema: "fastdoc.shell.d37-table-selection-clear-fill-command-state.v1";
operationKind: "clear-table-cell-fill-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionClearContentsRequest
[Section titled “D37TableSelectionClearContentsRequest”](#d37tableselectionclearcontentsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentsRequest {
selection: D37TableSelectionCellRangeFormatRange;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionClearContentsResult
[Section titled “D37TableSelectionClearContentsResult”](#d37tableselectionclearcontentsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentsResult {
schema: "fastdoc.shell.d37-table-selection-clear-contents.v1";
operationKind: "clear-table-cell-text-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionClearContentsCommandState
[Section titled “D37TableSelectionClearContentsCommandState”](#d37tableselectionclearcontentscommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentsCommandState {
schema: "fastdoc.shell.d37-table-selection-clear-contents-command-state.v1";
operationKind: "clear-table-cell-text-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionClearFormattingRequest
[Section titled “D37TableSelectionClearFormattingRequest”](#d37tableselectionclearformattingrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFormattingRequest {
selection: D37TableSelectionCellRangeFormatRange;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionClearFormattingResult
[Section titled “D37TableSelectionClearFormattingResult”](#d37tableselectionclearformattingresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFormattingResult {
schema: "fastdoc.shell.d37-table-selection-clear-formatting.v1";
operationKind: "clear-table-cell-formatting-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
fillResultKind: string | null;
fillWritebackResultKind: string | null;
borderResultKind: string | null;
borderWritebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
fillSnapshot: unknown;
borderSnapshot: unknown;
}
```
### D37TableSelectionClearFormattingCommandState
[Section titled “D37TableSelectionClearFormattingCommandState”](#d37tableselectionclearformattingcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearFormattingCommandState {
schema: "fastdoc.shell.d37-table-selection-clear-formatting-command-state.v1";
operationKind: "clear-table-cell-formatting-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableSelectionClearContentFormatRequest
[Section titled “D37TableSelectionClearContentFormatRequest”](#d37tableselectionclearcontentformatrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentFormatRequest {
selection: D37TableSelectionCellRangeFormatRange;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionClearContentFormatResult
[Section titled “D37TableSelectionClearContentFormatResult”](#d37tableselectionclearcontentformatresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentFormatResult {
schema: "fastdoc.shell.d37-table-selection-clear-content-format.v1";
operationKind: "clear-table-cell-content-format-range";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
snapshot: unknown;
}
```
### D37TableSelectionClearContentFormatCommandState
[Section titled “D37TableSelectionClearContentFormatCommandState”](#d37tableselectionclearcontentformatcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionClearContentFormatCommandState {
schema: "fastdoc.shell.d37-table-selection-clear-content-format-command-state.v1";
operationKind: "clear-table-cell-content-format-range";
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionCellRangeFormatRange;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableStructureEditMode
[Section titled “D37TableStructureEditMode”](#d37tablestructureeditmode)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableStructureEditMode = "delete-table" | "delete-cell" | "delete-cell-shift-up" | "split-table" | "insert-row" | "insert-rows" | "delete-row" | "delete-rows" | "insert-column" | "insert-columns" | "delete-column" | "delete-columns";
```
### D37TableSelectionStructureEditAction
[Section titled “D37TableSelectionStructureEditAction”](#d37tableselectionstructureeditaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionStructureEditAction = "insert-row-above" | "insert-row-below" | "insert-column-left" | "insert-column-right" | "split-table" | "delete-selected-rows" | "delete-selected-columns";
```
### D37TableStructureEditRequest
[Section titled “D37TableStructureEditRequest”](#d37tablestructureeditrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableStructureEditRequest {
bodyBlockIndex: number;
editMode: D37TableStructureEditMode;
rowIndex?: number | null;
columnIndex?: number | null;
spanCount?: number | null;
clipboardText?: string | null;
cellTexts?: string[] | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableStructureEditResult
[Section titled “D37TableStructureEditResult”](#d37tablestructureeditresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableStructureEditResult {
schema: "fastdoc.shell.d37-table-structure-edit.v1";
operationKind: "delete-table" | "delete-table-cell" | "delete-table-cell-shift-up" | "split-table" | "insert-table-row" | "insert-table-rows" | "delete-table-row" | "delete-table-rows" | "insert-table-column" | "insert-table-columns" | "delete-table-column" | "delete-table-columns";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
editMode: D37TableStructureEditMode;
bodyBlockIndex: number;
targetIndex: number;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
clipboardText: string | null;
cellTexts: string[];
snapshot: unknown;
}
```
### D37TableSelectionRange
[Section titled “D37TableSelectionRange”](#d37tableselectionrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionStructureEditRequest
[Section titled “D37TableSelectionStructureEditRequest”](#d37tableselectionstructureeditrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionStructureEditRequest {
selection: D37TableSelectionRange;
action: D37TableSelectionStructureEditAction;
clipboardText?: string | null;
cellTexts?: string[] | null;
tableInputProvenance?: "mouse-internal-divider-intent" | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionStructureEditResult
[Section titled “D37TableSelectionStructureEditResult”](#d37tableselectionstructureeditresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionStructureEditResult {
schema: "fastdoc.shell.d37-table-selection-structure-edit.v1";
action: D37TableSelectionStructureEditAction;
selection: D37TableSelectionRange;
computedEditMode: D37TableStructureEditMode;
computedTargetIndex: number;
structureEditResult: D37TableStructureEditResult;
}
```
### D37TableSelectionStructureCommandState
[Section titled “D37TableSelectionStructureCommandState”](#d37tableselectionstructurecommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionStructureCommandState {
schema: "fastdoc.shell.d37-table-selection-structure-command-state.v1";
action: D37TableSelectionStructureEditAction;
selection: D37TableSelectionRange;
computedEditMode: D37TableStructureEditMode;
computedTargetIndex: number;
operationKind: D37TableStructureEditResult["operationKind"];
canApply: boolean;
disabledReason: string | null;
canonicalReason: string | null;
canonicalDetail: string | null;
documentPath: string | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
spanCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableDimensionsRequest
[Section titled “D37TableDimensionsRequest”](#d37tabledimensionsrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableDimensionsRequest {
bodyBlockIndex: number;
rowIndex?: number | null;
rowHeightTwips?: number | null;
rowHeightRule?: "exact" | "atLeast" | "at_least" | "auto" | "automatic" | null;
fitRowHeightToContents?: boolean | null;
allowRowToBreakAcrossPages?: boolean | null;
columnIndex?: number | null;
columnWidthTwips?: number | null;
tableWidthTwips?: number | null;
tableIndentTwips?: number | null;
tableAlignment?: "left" | "center" | "right" | null;
pairedColumnIndex?: number | null;
pairedColumnWidthTwips?: number | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableDimensionsResult
[Section titled “D37TableDimensionsResult”](#d37tabledimensionsresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableDimensionsResult {
schema: "fastdoc.shell.d37-table-dimensions.v1";
operationKind: "table-row-column-dimensions";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
rowIndex: number | null;
columnIndex: number | null;
rowOperationKind: string | null;
rowResultKind: string | null;
rowWritebackResultKind: string | null;
rowDimensionTwips: number | null;
rowHeightRule: string | null;
allowRowToBreakAcrossPages: boolean | null;
columnOperationKind: string | null;
columnResultKind: string | null;
columnWritebackResultKind: string | null;
columnDimensionTwips: number | null;
rowCount: number | null;
columnCount: number | null;
rowSnapshot: unknown;
columnSnapshot: unknown;
}
```
### D37TableSelectionRowFitAction
[Section titled “D37TableSelectionRowFitAction”](#d37tableselectionrowfitaction)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type D37TableSelectionRowFitAction = "fit-selected-table-row-to-contents";
```
### D37TableSelectionRowFitRange
[Section titled “D37TableSelectionRowFitRange”](#d37tableselectionrowfitrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionRowFitRange {
bodyBlockIndex: number;
rowIndex: number;
columnIndex: number;
rowCount: number;
columnCount: number;
}
```
### D37TableSelectionRowFitRequest
[Section titled “D37TableSelectionRowFitRequest”](#d37tableselectionrowfitrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionRowFitRequest {
selection: D37TableSelectionRowFitRange;
action?: D37TableSelectionRowFitAction | null;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableSelectionRowFitResult
[Section titled “D37TableSelectionRowFitResult”](#d37tableselectionrowfitresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionRowFitResult {
schema: "fastdoc.shell.d37-table-selection-row-fit.v1";
action: D37TableSelectionRowFitAction;
selection: D37TableSelectionRowFitRange;
computedRowIndex: number;
rowFitResult: D37TableDimensionsResult;
}
```
### D37TableSelectionRowFitCommandState
[Section titled “D37TableSelectionRowFitCommandState”](#d37tableselectionrowfitcommandstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableSelectionRowFitCommandState {
schema: "fastdoc.shell.d37-table-selection-row-fit-command-state.v1";
operationKind: "table-row-column-dimensions";
action: D37TableSelectionRowFitAction;
canApply: boolean;
disabledReason: string | null;
documentPath: string | null;
selection: D37TableSelectionRowFitRange;
computedRowIndex: number | null;
rowOperationKind: string | null;
rowResultKind: string | null;
rowWritebackResultKind: string | null;
rowDimensionTwips: number | null;
rowHeightRule: string | null;
rowCount: number | null;
columnCount: number | null;
supportMarkerKinds: string[];
snapshot: unknown;
}
```
### D37TableAltTextRequest
[Section titled “D37TableAltTextRequest”](#d37tablealttextrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAltTextRequest {
bodyBlockIndex: number;
title: string;
description: string;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### D37TableAltTextResult
[Section titled “D37TableAltTextResult”](#d37tablealttextresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface D37TableAltTextResult {
schema: "fastdoc.shell.d37-table-alt-text.v1";
operationKind: "set-table-alt-text";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
bodyBlockIndex: number;
title: string | null;
description: string | null;
resultKind: string | null;
writebackResultKind: string | null;
rowCount: number | null;
columnCount: number | null;
snapshot: unknown;
}
```
# DTO · Text and paragraphs
> 49 interfaces and 7 type aliases from the `api-edit.ts` module — text editing, paragraphs, lists, fonts, clipboard, and history.
49 interfaces and 7 type aliases — text editing, paragraphs, lists, fonts, clipboard, and history.
Internal contract
These types describe the exchange inside the desktop SumDoc window. For embedding in your product, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
Some types include internal tags such as `backlog_id: "D38"` or `sharedSceneOwner: "D5"` — these are the task numbers the feature was filed under inside the team. They appear in the response, but embedding doesn’t need them: there’s no reason to parse or store them.
Contract module: `api-edit.ts`.
Other topics in this module: **Text and paragraphs** · [Tables: structure](/reference/sumdoc/dto-edit-table-structure/) · [Tables: cells and formatting](/reference/sumdoc/dto-edit-table-cells/) · [Tables: placement on the page](/reference/sumdoc/dto-edit-table-layout/) · [Page setup and document structure](/reference/sumdoc/dto-edit-page/) · [Objects and drawings](/reference/sumdoc/dto-edit-objects/) · [Fields, footnotes, and references](/reference/sumdoc/dto-edit-fields/).
Types on this page — 56
* [`MenuCommand`](#menucommand)
* [`SystemPastePayload`](#systempastepayload)
* [`ShellObservedBreak`](#shellobservedbreak)
* [`ShellReportSnapshot`](#shellreportsnapshot)
* [`ShellFixtureOption`](#shellfixtureoption)
* [`ShellParagraphTabStop`](#shellparagraphtabstop)
* [`ShellComposedLineFragment`](#shellcomposedlinefragment)
* [`ShellComposedParagraphLine`](#shellcomposedparagraphline)
* [`ShellComposedParagraph`](#shellcomposedparagraph)
* [`ShellParagraphCompositionSnapshot`](#shellparagraphcompositionsnapshot)
* [`BoundedLiveTextInsertRequest`](#boundedlivetextinsertrequest)
* [`EditorV0InsertBreakKind`](#editorv0insertbreakkind)
* [`EditorV0InsertDropCapKind`](#editorv0insertdropcapkind)
* [`EditorV0InsertBreakRequest`](#editorv0insertbreakrequest)
* [`EditorV0InsertDropCapRequest`](#editorv0insertdropcaprequest)
* [`EditorV0InsertBreakResult`](#editorv0insertbreakresult)
* [`EditorV0AddTextLevel`](#editorv0addtextlevel)
* [`EditorV0AddTextRequest`](#editorv0addtextrequest)
* [`EditorV0InsertDropCapResult`](#editorv0insertdropcapresult)
* [`EditorV0AddTextResult`](#editorv0addtextresult)
* [`EditorV0ParagraphStructureRequest`](#editorv0paragraphstructurerequest)
* [`EditorV0ParagraphStructureResult`](#editorv0paragraphstructureresult)
* [`EditorV0ToolbarFormatCommandRequest`](#editorv0toolbarformatcommandrequest)
* [`EditorV0ToolbarFormatCommandResult`](#editorv0toolbarformatcommandresult)
* [`EditorV0ToolbarFormatBatchCommandRequest`](#editorv0toolbarformatbatchcommandrequest)
* [`EditorV0ToolbarFormatBatchCommandResult`](#editorv0toolbarformatbatchcommandresult)
* [`EditorV0ParagraphLayoutCommandRequest`](#editorv0paragraphlayoutcommandrequest)
* [`EditorV0ParagraphLayoutCommandResult`](#editorv0paragraphlayoutcommandresult)
* [`EditorV0UpdateStyleFromSelectionRequest`](#editorv0updatestylefromselectionrequest)
* [`EditorV0UpdateStyleFromSelectionResult`](#editorv0updatestylefromselectionresult)
* [`EditorV0HomeCharacterFormat`](#editorv0homecharacterformat)
* [`EditorV0HomeTabStop`](#editorv0hometabstop)
* [`EditorV0HomeParagraphFormat`](#editorv0homeparagraphformat)
* [`EditorV0HomeStyleFormat`](#editorv0homestyleformat)
* [`EditorV0HomeStyleDefinition`](#editorv0homestyledefinition)
* [`EditorV0HomeParagraphState`](#editorv0homeparagraphstate)
* [`EditorV0HomeFormattingSnapshot`](#editorv0homeformattingsnapshot)
* [`EditorV0HomeFormattingOperation`](#editorv0homeformattingoperation)
* [`EditorV0HomeFormattingRequest`](#editorv0homeformattingrequest)
* [`EditorV0HomeFormattingResult`](#editorv0homeformattingresult)
* [`EditorV0ParagraphLayoutBatchCommandRequest`](#editorv0paragraphlayoutbatchcommandrequest)
* [`EditorV0ParagraphLayoutBatchCommandResult`](#editorv0paragraphlayoutbatchcommandresult)
* [`EditorV0ParagraphFillCommandRequest`](#editorv0paragraphfillcommandrequest)
* [`EditorV0ParagraphFillCommandResult`](#editorv0paragraphfillcommandresult)
* [`EditorV0ParagraphBorderCommandRequest`](#editorv0paragraphbordercommandrequest)
* [`EditorV0ParagraphBorderCommandResult`](#editorv0paragraphbordercommandresult)
* [`EditorV0ParagraphSortCommandRequest`](#editorv0paragraphsortcommandrequest)
* [`EditorV0ParagraphSortCommandResult`](#editorv0paragraphsortcommandresult)
* [`BoundedLiveTextInsertResult`](#boundedlivetextinsertresult)
* [`BoundedLiveTextMutationResult`](#boundedlivetextmutationresult)
* [`EditorV0EditingReplaceFirstRequest`](#editorv0editingreplacefirstrequest)
* [`EditorV0EditingReplaceFirstResult`](#editorv0editingreplacefirstresult)
* [`EditorV0EditingReplaceAllRequest`](#editorv0editingreplaceallrequest)
* [`EditorV0EditingReplaceAllSemanticRange`](#editorv0editingreplaceallsemanticrange)
* [`EditorV0EditingReplaceAllParagraphResult`](#editorv0editingreplaceallparagraphresult)
* [`EditorV0EditingReplaceAllResult`](#editorv0editingreplaceallresult)
### MenuCommand
[Section titled “MenuCommand”](#menucommand)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type MenuCommand =
| "open-docx"
| "editor-save-copy"
| "editor-reopen-saved-copy"
| "editor-open-user-copy-dialog"
| "editor-insert-date-time"
| "editor-select-all"
| "editor-copy"
| "editor-cut"
| "editor-history-undo"
| "editor-history-redo"
| "editor-format-subscript"
| "editor-format-superscript"
| "reload-current-docx"
| "toggle-left-panel"
| "toggle-right-panel"
| "hide-side-panels"
| "set-mode-print"
| "set-mode-paginate"
| "set-mode-report"
| "set-mode-review"
| "previous-page"
| "next-page"
| "zoom-in"
| "zoom-out"
| "zoom-reset"
| "view-fit-page-width"
| "view-fit-whole-page"
| "view-fit-multiple-pages"
| "view-draft-layout"
| "view-web-layout"
| "view-outline"
| "view-show-ruler"
| "view-hide-ruler"
| "view-scroll-horizontal"
| "view-smooth-scroll"
| "view-enter-full-screen-reading"
| "view-exit-full-screen-reading"
| "view-use-dark-mode"
| "view-focus-mode"
| "view-show-object-guides"
| "view-split-view"
| "view-restore-state"
| "nav-place-caret-by-click"
| "nav-caret-left"
| "nav-caret-right"
| "nav-caret-up"
| "nav-caret-down"
| "nav-word-previous"
| "nav-word-next"
| "nav-line-start"
| "nav-line-end"
| "nav-paragraph-start"
| "nav-paragraph-end"
| "nav-document-start"
| "nav-document-end"
| "nav-previous-page"
| "nav-next-page"
| "nav-search-previous"
| "nav-search-next"
| "nav-heading-next"
| "nav-bookmark-next"
| "nav-footnote-next"
| "nav-endnote-next"
| "nav-comment-anchor-next"
| "nav-table-cell-next"
| "nav-inline-object-next"
| "nav-floating-object-next"
| "nav-return-last-edit-point";
```
### SystemPastePayload
[Section titled “SystemPastePayload”](#systempastepayload)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type SystemPastePayload = {
schema: "fastdoc.native-clipboard.v1";
text: string;
html: string;
rtf: string;
imagePngBase64: string | null;
imagePath?: string | null;
files: string[];
internalJson: string | null;
forcePlain: boolean;
selectedFormat: "fastdoc-rich" | "rtf" | "html" | "image" | "files" | "plain-text" | "empty" | "rejected";
availableFormats: string[];
priority: readonly [
"fastdoc-rich",
"html",
"rtf",
"image",
"files",
"plain-text"
];
fingerprint: string;
totalBytes: number;
rejectionReasons: string[];
};
```
### ShellObservedBreak
[Section titled “ShellObservedBreak”](#shellobservedbreak)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellObservedBreak {
break_kind: string;
location: string;
detail: string;
}
```
### ShellReportSnapshot
[Section titled “ShellReportSnapshot”](#shellreportsnapshot)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellReportSnapshot {
stage_id: string;
part_count: number;
relationship_count: number;
detected_features?: ShellDetectedFeature[];
relationships?: ShellRelationshipSnapshot[];
support_state_counts?: Record;
}
```
### ShellFixtureOption
[Section titled “ShellFixtureOption”](#shellfixtureoption)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellFixtureOption {
key: string;
label: string;
path: string;
description: string;
}
```
### ShellParagraphTabStop
[Section titled “ShellParagraphTabStop”](#shellparagraphtabstop)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellParagraphTabStop {
alignment: string;
position_twips: number;
leader?: string | null;
source: string;
text?: string;
width_milli_px?: number;
}
```
### ShellComposedLineFragment
[Section titled “ShellComposedLineFragment”](#shellcomposedlinefragment)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellComposedLineFragment {
text: string;
width_milli_px: number;
}
```
### ShellComposedParagraphLine
[Section titled “ShellComposedParagraphLine”](#shellcomposedparagraphline)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellComposedParagraphLine {
text: string;
fragments: ShellComposedLineFragment[];
}
```
### ShellComposedParagraph
[Section titled “ShellComposedParagraph”](#shellcomposedparagraph)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellComposedParagraph {
paragraph_index: number;
paragraph_location: string;
text: string;
available_width_milli_px: number;
line_break_mode: string;
drop_cap_kind?: string | null;
alignment_mode?: string | null;
tab_run_count: number;
tab_stops: ShellParagraphTabStop[];
default_tab_stop_twips?: number | null;
first_line_indent_twips?: number | null;
left_indent_twips?: number | null;
right_indent_twips?: number | null;
spacing_before_twips?: number | null;
spacing_after_twips?: number | null;
line_spacing_twips?: number | null;
line_spacing_rule?: string | null;
fill_color_rgb?: string | null;
keep_with_next?: boolean;
keep_lines_together?: boolean;
widow_control?: boolean;
page_break_before?: boolean;
blocked_reason?: string | null;
lines?: ShellComposedParagraphLine[];
support_markers?: ShellSupportMarker[];
}
```
### ShellParagraphCompositionSnapshot
[Section titled “ShellParagraphCompositionSnapshot”](#shellparagraphcompositionsnapshot)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface ShellParagraphCompositionSnapshot {
model_version: string;
stage_id: string;
stage_name: string;
line_break_mode: string;
width_source: string;
paragraph_count: number;
non_empty_paragraph_count: number;
composed_paragraph_count: number;
blocked_paragraph_count: number;
line_count: number;
support_marker_count: number;
paragraphs: ShellComposedParagraph[];
support_markers?: ShellSupportMarker[];
}
```
### BoundedLiveTextInsertRequest
[Section titled “BoundedLiveTextInsertRequest”](#boundedlivetextinsertrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface BoundedLiveTextInsertRequest {
documentPath?: string | null;
sourcePath?: string | null;
saveAsOwnershipReservationId?: string | null;
paragraphIndex: number;
offset: number;
text?: string;
insertText?: string;
structuredCommentAnchorTargetText?: string;
semanticBoundaryAffinity?: "before" | "after";
semanticBoundaryNoteId?: number;
deleteCount?: number;
persistentEdit?: OptimisticEditRequest;
canonicalTransitionKind?: "typing" | "replacement" | "paste" | "ime" | "format";
canonicalBeforeCaretSlotIndex?: number;
canonicalAfterCaretSlotIndex?: number;
canonicalProjectionPageIndex?: number;
canonicalProjectionRefresh?: "full";
canonicalAutocorrect?: {
kind: "user-replacement" | "built-in-replacement" | "sentence-start" | "caps-lock" | "smart-quote" | "hyphen-to-dash" | "ordinal" | "common-symbol" | "hyperlink" | "bullet-list" | "numbered-list" | "border-line";
rawText: string;
correctedText: string;
};
trackRevisions?: boolean;
noTextMutation?: boolean;
reopenAfterWrite?: boolean;
outputKind?:
| "live-bounded-text-continue"
| "editor-v0-text-continue"
| "editor-v0-txt001-collapsed-typing"
| "editor-v0-txt003-delete-previous-character"
| "editor-v0-txt007-split-paragraph"
| "editor-v0-txt008-join-paragraphs"
| "editor-v0-txt009-insert-soft-line-break"
| "editor-v0-txt010-insert-non-breaking-space"
| "editor-v0-txt011-insert-non-breaking-hyphen"
| "editor-v0-txt012-insert-optional-hyphen"
| "editor-v0-text-continue-commands"
| "editor-v0-undo"
| "editor-v0-redo"
| "editor-v0-save-as-dialog"
| "editor-v0-save-state"
| "editor-v0-nonblocking-typing"
| "editor-v0-double-space-period-autocorrect"
| "editor-v0-selection-replace"
| "editor-v0-selection-edit-2"
| "editor-v0-selection-edit-3";
// …list truncated: first 20 shown, 245 values total
pasteStyleStrategy?: "inherit-start" | "plain" | "source";
pasteStyleSegments?: Array<{
offset: number;
length: number;
bold: boolean;
italic: boolean;
colorRgb: string | null;
underline?: string | null;
fontFamilyName?: string | null;
fontSizeHalfPoints?: number | null;
}> | null;
pasteParagraphLayout?: {
alignment: "left" | "center" | "right" | "both";
leftIndentTwips: number;
firstLineIndentTwips?: number | null;
rightIndentTwips?: number | null;
tabStops?: Array<{
alignment: "left" | "center" | "right" | "decimal" | "bar";
positionTwips: number;
leader?: "dot" | "hyphen" | "underscore" | "middleDot" | "heavy" | null;
}>;
spacingBeforeTwips?: number | null;
spacingAfterTwips: number;
lineSpacingTwips: number;
numbering?: {
kind?: "decimal" | "bullet";
numId: number;
ilvl: number;
start: number;
numFormat: "decimal" | "bullet";
levelText: "%1." | "•";
} | null;
} | null;
pasteParagraphStyle?: "Normal" | "Heading1" | "Heading2" | "Heading3" | null;
pasteParagraphDirection?: "ltr" | "rtl" | null;
pasteHyperlinks?: Array<{
offset: number;
length: number;
url: string;
}> | null;
pasteParagraphBorder?: "box-single" | null;
pasteSectionPageMargins?: {
topMarginTwips: number;
rightMarginTwips: number;
bottomMarginTwips: number;
leftMarginTwips: number;
} | null;
saveAsPath?: string | null;
operationKind?: "delete-multiparagraph-range";
endParagraphIndex?: number;
endOffset?: number;
}
```
### EditorV0InsertBreakKind
[Section titled “EditorV0InsertBreakKind”](#editorv0insertbreakkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0InsertBreakKind = "line-break" | "page-break" | "column-break" | "section-break-next-page" | "section-break-continuous" | "section-break-even-page" | "section-break-odd-page";
```
### EditorV0InsertDropCapKind
[Section titled “EditorV0InsertDropCapKind”](#editorv0insertdropcapkind)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0InsertDropCapKind = "none" | "drop" | "margin";
```
### EditorV0InsertBreakRequest
[Section titled “EditorV0InsertBreakRequest”](#editorv0insertbreakrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertBreakRequest {
breakKind: EditorV0InsertBreakKind;
paragraphIndex: number;
offset?: number | null;
deleteCount?: number | null;
reopenAfterWrite?: boolean;
sourcePath?: string | null;
outputPath?: string | null;
}
```
### EditorV0InsertDropCapRequest
[Section titled “EditorV0InsertDropCapRequest”](#editorv0insertdropcaprequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDropCapRequest {
dropCapKind: EditorV0InsertDropCapKind;
paragraphIndex: number;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertBreakResult
[Section titled “EditorV0InsertBreakResult”](#editorv0insertbreakresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertBreakResult {
schema: "fastdoc.shell.editor-v0-insert-break-action.v1";
operationKind: "insert-line-break" | "delete-line-break" | "insert-page-break" | "insert-column-break" | "insert-section-break";
breakKind: EditorV0InsertBreakKind;
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
offset: number | null;
deleteCount: number;
resultKind: string | null;
writebackResultKind: string | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
}
```
### EditorV0AddTextLevel
[Section titled “EditorV0AddTextLevel”](#editorv0addtextlevel)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0AddTextLevel = "none" | "1" | "2" | "3";
```
### EditorV0AddTextRequest
[Section titled “EditorV0AddTextRequest”](#editorv0addtextrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0AddTextRequest {
paragraphIndex: number;
level: EditorV0AddTextLevel;
reopenAfterWrite?: boolean;
outputPath?: string | null;
}
```
### EditorV0InsertDropCapResult
[Section titled “EditorV0InsertDropCapResult”](#editorv0insertdropcapresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0InsertDropCapResult {
schema: "fastdoc.shell.editor-v0-insert-drop-cap-action.v1";
operationKind: "set-paragraph-drop-cap";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
dropCapKind: EditorV0InsertDropCapKind;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0AddTextResult
[Section titled “EditorV0AddTextResult”](#editorv0addtextresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0AddTextResult {
schema: "fastdoc.shell.editor-v0-add-text-action.v1";
operationKind: "set-toc-entry-level";
applied: boolean;
documentPath: string | null;
outputPath: string | null;
paragraphIndex: number;
level: EditorV0AddTextLevel;
resultKind: string | null;
writebackResultKind: string | null;
writebackChangedPartCount: number | null;
snapshot: unknown;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0ParagraphStructureRequest
[Section titled “EditorV0ParagraphStructureRequest”](#editorv0paragraphstructurerequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphStructureRequest {
operationKind: "insert-text" | "delete-text" | "split-paragraph" | "merge-with-next" | "insert-line-break" | "delete-line-break" | "replace-table-cell-range";
target?: EditorV0TableCellParagraphTextTarget | null;
range?: {
anchor: EditorV0TableCellTextRangeEndpoint;
focus: EditorV0TableCellTextRangeEndpoint;
} | null;
paragraphIndex: number;
offset?: number | null;
insertText?: string | null;
replacementText?: string | null;
deleteCount?: number | null;
sourcePath?: string | null;
outputKind?:
| "editor-v0-paragraph-split-merge"
| "d37-table-cell-text-structure"
| "editor-v0-paragraph-text-flow"
| "editor-v0-paragraph-text-flow-commands"
| "editor-v0-styled-paragraph-flow"
| "editor-v0-styled-paragraph-merge-controls"
| "editor-v0-styled-paragraph-text-after-merge"
| "editor-v0-paragraph-boundary-insert"
| "editor-v0-paragraph-boundary-delete-controls"
| "editor-v0-user-paragraph-boundary-edit"
| "editor-v0-user-paragraph-multiline-flow"
| "doc-br-001-manual-line-break"
| "editor-v0-styled-multiline-boundary-edit"
| "editor-v0-styled-multiline-live-toolbar-state"
| "editor-v0-styled-multiline-second-fixture"
| "editor-v0-toolbar-format-commands-bounded"
| "editor-v0-bold-shortcut-command"
| "editor-v0-toolbar-format-commands-italic-blue"
| "editor-v0-home-chr-tranche2-market"
| "editor-v0-font-family-size-commands";
// …list truncated: first 20 shown, 248 values total
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphStructureResult
[Section titled “EditorV0ParagraphStructureResult”](#editorv0paragraphstructureresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphStructureResult {
applied: boolean;
outputPath: string;
operationKind: "insert-text" | "delete-text" | "split-paragraph" | "merge-with-next" | "insert-line-break" | "delete-line-break" | "replace-table-cell-range";
paragraphIndex: number;
offset: number | null;
beforeTexts: string[];
afterTexts: string[];
paragraphCountDelta: number | null;
undoDelta: unknown | null;
undoDeltas?: unknown[];
finalTarget?: EditorV0TableCellParagraphTextTarget | null;
finalOffset?: number | null;
selectionSemantics?: string | null;
selectedCellCount?: number | null;
}
```
### EditorV0ToolbarFormatCommandRequest
[Section titled “EditorV0ToolbarFormatCommandRequest”](#editorv0toolbarformatcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ToolbarFormatCommandRequest {
commandKind:
| "bold"
| "italic"
| "underline"
| "underline-color"
| "blue"
| "highlight"
| "strikethrough"
| "double-strikethrough"
| "subscript"
| "superscript"
| "font-family"
| "font-size"
| "text-case"
| "all-caps"
| "small-caps"
| "hidden"
| "text-effect"
| "character-spacing"
| "character-scale"
| "character-position"
| "kerning"
| "character-style"
| "proofing-language"
| "run-direction"
| "paragraph-direction"
| "disable-proofing";
enabled: boolean;
fontFamilyName?: string | null;
fontSizeHalfPoints?: number | null;
textCase?: "sentence" | "lowercase" | "uppercase" | "capitalize" | "toggle" | null;
underlineStyle?: "single" | "double" | "dotted" | "dash" | "wave" | "thick" | null;
fontColorRgb?: string | null;
underlineColorRgb?: string | null;
textHighlightColor?: string | null;
characterSpacing?: "normal" | "expanded" | "condensed" | null;
textEffect?: "none" | "outline" | "shadow" | "emboss" | "imprint" | null;
characterScale?: "normal" | "80pct" | null;
characterPosition?: "normal" | "raised-3pt" | "lowered-3pt" | null;
kerning?: "none" | "12pt" | null;
characterStyle?: "none" | "Emphasis" | "Strong" | "Hyperlink" | null;
proofingLanguage?: "en-US" | "es-ES" | "ru-RU" | "ar-SA" | "he-IL" | "ja-JP" | "zh-CN" | "ko-KR" | null;
textDirection?: "ltr" | "rtl" | null;
disableProofing?: boolean | null;
paragraphIndex: number;
offset: number;
rangeLength: number;
expectedParagraphText?: string | null;
outputKind?:
| "editor-v0-toolbar-format-commands-bounded"
| "editor-v0-toolbar-format-commands-italic-blue"
| "editor-v0-home-chr-tranche2-market"
| "editor-v0-user-text-format-command"
| "editor-v0-font-family-size-commands"
| "editor-v0-home-character-formatting-market"
| "editor-v0-home-color-highlight-market"
| "editor-v0-text-case-toolbar-command"
| "editor-v0-text-effect-toolbar-command"
| "editor-v0-underline-style-toolbar-command"
| "editor-v0-font-dialog-font-market"
| "editor-v0-font-dialog-advanced-market"
| "editor-v0-highlight-toolbar-command"
| "editor-v0-font-color-toolbar-command"
| "editor-v0-format-toolbar-multi-command-chain"
| "editor-v0-format-clear-command"
| "editor-v0-format-clear-partial-selection"
| "editor-v0-format-apply-partial-selection"
| "editor-v0-mixed-format-selection-workflow"
| "editor-v0-mixed-format-clear-or-paste-rules"
| "editor-v0-selection-consumes-paragraph-granularity-format"
| "editor-v0-user-created-multiparagraph-source-paste"
| "editor-v0-cut-clear-paste-target-index-expansion"
| "editor-v0-cut-clear-paste-target-toolbar-state"
| "editor-v0-wide-target-keyboard-toolbar-state"
| "editor-v0-keyboard-wide-target-action-chain"
| "editor-v0-keyboard-wide-target-manual-ux"
| "editor-v0-keyboard-wide-target-manual-commands-richer-content"
| "editor-v0-wrap-aware-selection-commands"
| "editor-v0-wrap-aware-selection-manual-commands-polish"
| "editor-v0-wrap-aware-paragraph-editing"
| "editor-v0-wrap-aware-paragraph-manual-ux"
| "editor-v0-wrap-aware-paragraph-commands-polish"
| "editor-v0-wrap-aware-paragraph-reflow-polish";
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ToolbarFormatCommandResult
[Section titled “EditorV0ToolbarFormatCommandResult”](#editorv0toolbarformatcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ToolbarFormatCommandResult {
applied: boolean;
outputPath: string;
commandKind:
| "bold"
| "italic"
| "underline"
| "underline-color"
| "blue"
| "highlight"
| "strikethrough"
| "double-strikethrough"
| "subscript"
| "superscript"
| "font-family"
| "font-size"
| "text-case"
| "all-caps"
| "small-caps"
| "hidden"
| "text-effect"
| "character-spacing"
| "character-scale"
| "character-position"
| "kerning"
| "character-style"
| "proofing-language"
| "run-direction"
| "paragraph-direction"
| "disable-proofing";
enabled: boolean;
fontFamilyName?: string | null;
fontSizeHalfPoints?: number | null;
textCase?: "sentence" | "lowercase" | "uppercase" | "capitalize" | "toggle" | null;
underlineStyle?: "single" | "double" | "dotted" | "dash" | "wave" | "thick" | null;
fontColorRgb?: string | null;
underlineColorRgb?: string | null;
textHighlightColor?: string | null;
characterSpacing?: "normal" | "expanded" | "condensed" | null;
textEffect?: "none" | "outline" | "shadow" | "emboss" | "imprint" | null;
characterScale?: "normal" | "80pct" | null;
characterPosition?: "normal" | "raised-3pt" | "lowered-3pt" | null;
kerning?: "none" | "12pt" | null;
characterStyle?: "none" | "Emphasis" | "Strong" | "Hyperlink" | null;
proofingLanguage?: "en-US" | "es-ES" | "ru-RU" | "ar-SA" | "he-IL" | "ja-JP" | "zh-CN" | "ko-KR" | null;
textDirection?: "ltr" | "rtl" | null;
disableProofing?: boolean | null;
paragraphIndex: number;
offset: number;
rangeLength: number;
beforeTexts: string[];
afterTexts: string[];
disabledReason?: "no-current-document" | "unsupported-document" | null;
resultKind?: "applied" | "no-current-document" | "unsupported-document";
writebackResultKind?: "written" | "not-requested";
popupWarningShown?: false;
shellCoordinateChange?: false;
}
```
### EditorV0ToolbarFormatBatchCommandRequest
[Section titled “EditorV0ToolbarFormatBatchCommandRequest”](#editorv0toolbarformatbatchcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ToolbarFormatBatchCommandRequest {
commands: EditorV0ToolbarFormatCommandRequest[];
reopenAfterWrite?: boolean;
}
```
### EditorV0ToolbarFormatBatchCommandResult
[Section titled “EditorV0ToolbarFormatBatchCommandResult”](#editorv0toolbarformatbatchcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ToolbarFormatBatchCommandResult {
applied: boolean;
outputPath: string;
commandKinds: EditorV0ToolbarFormatCommandRequest["commandKind"][];
commandCount: number;
paragraphIndex: number;
offset: number;
rangeLength: number;
beforeTexts: string[];
afterTexts: string[];
disabledReason?: "no-current-document" | "unsupported-document" | null;
resultKind?: "applied" | "no-current-document" | "unsupported-document";
writebackResultKind?: "written" | "not-requested";
popupWarningShown?: false;
shellCoordinateChange?: false;
oneOkOneReopenBatchRoute: boolean;
}
```
### EditorV0ParagraphLayoutCommandRequest
[Section titled “EditorV0ParagraphLayoutCommandRequest”](#editorv0paragraphlayoutcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphLayoutCommandRequest {
alignment: "left" | "center" | "right" | "both";
leftIndentTwips: number;
firstLineIndentTwips?: number | null;
rightIndentTwips?: number | null;
tabStops?: Array<{
alignment: "left" | "center" | "right" | "decimal" | "bar";
positionTwips: number;
leader?: "dot" | "hyphen" | "underscore" | "middleDot" | "heavy" | null;
}>;
spacingBeforeTwips?: number | null;
spacingAfterTwips: number;
lineSpacingTwips: number;
setNumberingDecimalLevel0?: boolean;
setNumberingBulletLevel0?: boolean;
setNumberingMultilevelLevel1?: boolean;
setNumberingRestartDecimalLevel0?: boolean;
styleId?: "Heading1" | "Heading2" | "Heading3" | "Normal" | null;
paragraphIndex: number;
outputKind?:
| "editor-v0-paragraph-layout-basics"
| "editor-v0-style-heading1-toolbar-command"
| "editor-v0-style-heading2-toolbar-command"
| "editor-v0-style-heading3-toolbar-command"
| "editor-v0-style-normal-card-action"
| "editor-v0-quick-access-more-menu"
| "editor-v0-quick-print-action"
| "editor-v0-paragraph-alignment-toolbar-command"
| "editor-v0-paragraph-indent-toolbar-command"
| "editor-v0-paragraph-line-spacing-toolbar-command"
| "editor-v0-paragraph-numbering-toolbar-command"
| "editor-v0-paragraph-bullets-toolbar-command"
| "editor-v0-paragraph-multilevel-toolbar-command"
| "editor-v0-ruler-drag-writeback";
rulerDragRole?: "paragraph-left-indent" | "paragraph-hanging-indent" | "paragraph-first-line-indent" | "paragraph-right-indent" | "tab-stop" | null;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphLayoutCommandResult
[Section titled “EditorV0ParagraphLayoutCommandResult”](#editorv0paragraphlayoutcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphLayoutCommandResult {
applied: boolean;
outputPath: string;
bulkCommandCount?: number;
alignment: "left" | "center" | "right" | "both";
leftIndentTwips: number;
firstLineIndentTwips?: number | null;
rightIndentTwips?: number | null;
tabStops?: Array<{
alignment: "left" | "center" | "right" | "decimal" | "bar";
positionTwips: number;
leader?: "dot" | "hyphen" | "underscore" | "middleDot" | "heavy" | null;
}>;
spacingBeforeTwips?: number | null;
spacingAfterTwips: number;
lineSpacingTwips: number;
setNumberingDecimalLevel0?: boolean;
setNumberingBulletLevel0?: boolean;
setNumberingMultilevelLevel1?: boolean;
setNumberingRestartDecimalLevel0?: boolean;
styleId?: "Heading1" | "Heading2" | "Heading3" | "Normal" | null;
paragraphIndex: number;
beforeTexts: string[];
afterTexts: string[];
}
```
### EditorV0UpdateStyleFromSelectionRequest
[Section titled “EditorV0UpdateStyleFromSelectionRequest”](#editorv0updatestylefromselectionrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateStyleFromSelectionRequest {
styleId: "FastDocWritingHeading";
styleName: "FastDoc Writing Heading";
paragraphIndexes: number[];
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0UpdateStyleFromSelectionResult
[Section titled “EditorV0UpdateStyleFromSelectionResult”](#editorv0updatestylefromselectionresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0UpdateStyleFromSelectionResult {
schema: "fastdoc.shell.editor-v0-update-style-from-selection-action.v1";
operationKind: "update-style-from-selection";
applied: boolean;
documentPath: string;
outputPath: string;
styleId: "FastDocWritingHeading";
styleName: "FastDoc Writing Heading";
paragraphIndexes: number[];
beforeTexts: string[];
afterTexts: string[];
modifiedStylesXml: true;
appliedParagraphStyleRefs: true;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
muscleMemoryParityClaim: false;
}
```
### EditorV0HomeCharacterFormat
[Section titled “EditorV0HomeCharacterFormat”](#editorv0homecharacterformat)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeCharacterFormat {
bold: boolean;
italic: boolean;
underline: boolean;
colorRgb: string | null;
fontFamily: string | null;
fontSizeHalfPoints: number | null;
}
```
### EditorV0HomeTabStop
[Section titled “EditorV0HomeTabStop”](#editorv0hometabstop)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeTabStop {
positionTwips: number;
alignment: "left" | "center" | "right" | "decimal" | "bar" | "num" | "clear";
leader: "none" | "dot" | "hyphen" | "underscore" | "heavy" | "middle-dot";
}
```
### EditorV0HomeParagraphFormat
[Section titled “EditorV0HomeParagraphFormat”](#editorv0homeparagraphformat)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeParagraphFormat {
alignment: "left" | "center" | "right" | "both" | "distribute";
leftIndentTwips: number;
rightIndentTwips: number;
specialIndent: "none" | "first-line" | "hanging";
specialIndentTwips: number;
spacingBeforeTwips: number;
spacingAfterTwips: number;
lineSpacingMode: "single" | "one-and-half" | "double" | "multiple" | "exact" | "at-least";
lineSpacingValue: number;
outlineLevel: number | null;
collapsedByDefault: boolean;
mirrorIndents: boolean;
adjustRightIndentToGrid: boolean;
contextualSpacing: boolean;
snapToGrid: boolean;
keepWithNext: boolean;
keepLinesTogether: boolean;
widowControl: boolean;
pageBreakBefore: boolean;
suppressLineNumbers: boolean;
suppressAutoHyphens: boolean;
textboxTightWrap: "none" | "allLines" | "firstAndLastLine" | "firstLineOnly" | "lastLineOnly";
kinsoku: boolean;
allowEnglishMidWordWrap: boolean;
overflowPunctuation: boolean;
topLinePunctuation: boolean;
autoSpaceEastAsianLatin: boolean;
autoSpaceEastAsianNumbers: boolean;
textAlignment: "auto" | "top" | "center" | "baseline" | "bottom";
tabStops: EditorV0HomeTabStop[];
}
```
### EditorV0HomeStyleFormat
[Section titled “EditorV0HomeStyleFormat”](#editorv0homestyleformat)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeStyleFormat {
paragraph: EditorV0HomeParagraphFormat;
character: EditorV0HomeCharacterFormat;
}
```
### EditorV0HomeStyleDefinition
[Section titled “EditorV0HomeStyleDefinition”](#editorv0homestyledefinition)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeStyleDefinition {
styleId: string;
name: string;
styleType: string;
basedOn: string | null;
nextStyle: string | null;
custom: boolean;
builtIn: boolean;
isDefault: boolean;
format: EditorV0HomeStyleFormat;
}
```
### EditorV0HomeParagraphState
[Section titled “EditorV0HomeParagraphState”](#editorv0homeparagraphstate)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeParagraphState {
paragraphIndex: number;
text: string;
styleId: string;
hasNumbering: boolean;
format: EditorV0HomeParagraphFormat;
}
```
### EditorV0HomeFormattingSnapshot
[Section titled “EditorV0HomeFormattingSnapshot”](#editorv0homeformattingsnapshot)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeFormattingSnapshot {
schema: "fastdoc.home-formatting-state.v1";
defaultTabStopTwips: number;
styles: EditorV0HomeStyleDefinition[];
paragraphs: EditorV0HomeParagraphState[];
}
```
### EditorV0HomeFormattingOperation
[Section titled “EditorV0HomeFormattingOperation”](#editorv0homeformattingoperation)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type EditorV0HomeFormattingOperation = {
kind: "createStyle";
styleId: string;
name: string;
basedOn: string;
nextStyle: string;
sourceParagraphIndex: number;
paragraphIndexes: number[];
} | {
kind: "modifyStyle";
styleId: string;
name: string;
basedOn: string;
nextStyle: string;
format: EditorV0HomeStyleFormat;
} | {
kind: "updateStyleFromSelection";
styleId: string;
sourceParagraphIndex: number;
} | {
kind: "renameStyle";
styleId: string;
newName: string;
} | {
kind: "deleteStyle";
styleId: string;
fallbackStyleId: string | null;
} | {
kind: "applyStyle";
styleId: string;
paragraphIndexes: number[];
} | {
kind: "formatParagraphs";
paragraphIndexes: number[];
format: EditorV0HomeParagraphFormat;
} | {
kind: "setDefaultTabStop";
defaultTabStopTwips: number;
} | {
kind: "clearParagraphFormatting";
paragraphIndexes: number[];
};
```
### EditorV0HomeFormattingRequest
[Section titled “EditorV0HomeFormattingRequest”](#editorv0homeformattingrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeFormattingRequest {
operations: EditorV0HomeFormattingOperation[];
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0HomeFormattingResult
[Section titled “EditorV0HomeFormattingResult”](#editorv0homeformattingresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0HomeFormattingResult {
schema: "fastdoc.shell.home-formatting.v1";
applied: true;
documentPath: string;
outputPath: string;
operationCount: number;
resultKind: "applied";
writebackResultKind: "written";
changedParts: string[];
sourceUnchanged: true;
state: EditorV0HomeFormattingSnapshot;
}
```
### EditorV0ParagraphLayoutBatchCommandRequest
[Section titled “EditorV0ParagraphLayoutBatchCommandRequest”](#editorv0paragraphlayoutbatchcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphLayoutBatchCommandRequest {
commands: EditorV0ParagraphLayoutCommandRequest[];
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphLayoutBatchCommandResult
[Section titled “EditorV0ParagraphLayoutBatchCommandResult”](#editorv0paragraphlayoutbatchcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphLayoutBatchCommandResult {
applied: boolean;
outputPath: string;
paragraphIndexes: number[];
commandCount: number;
beforeTexts: string[];
afterTexts: string[];
}
```
### EditorV0ParagraphFillCommandRequest
[Section titled “EditorV0ParagraphFillCommandRequest”](#editorv0paragraphfillcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphFillCommandRequest {
paragraphIndex: number;
fillColorRgb: string;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphFillCommandResult
[Section titled “EditorV0ParagraphFillCommandResult”](#editorv0paragraphfillcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphFillCommandResult {
applied: boolean;
outputPath: string;
fillColorRgb: string;
paragraphIndex: number;
beforeTexts: string[];
afterTexts: string[];
}
```
### EditorV0ParagraphBorderCommandRequest
[Section titled “EditorV0ParagraphBorderCommandRequest”](#editorv0paragraphbordercommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphBorderCommandRequest {
paragraphIndex: number;
borderColorRgb: string;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphBorderCommandResult
[Section titled “EditorV0ParagraphBorderCommandResult”](#editorv0paragraphbordercommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphBorderCommandResult {
applied: boolean;
outputPath: string;
borderColorRgb: string;
paragraphIndex: number;
beforeTexts: string[];
afterTexts: string[];
}
```
### EditorV0ParagraphSortCommandRequest
[Section titled “EditorV0ParagraphSortCommandRequest”](#editorv0paragraphsortcommandrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphSortCommandRequest {
startParagraphIndex: number;
paragraphCount: number;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0ParagraphSortCommandResult
[Section titled “EditorV0ParagraphSortCommandResult”](#editorv0paragraphsortcommandresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0ParagraphSortCommandResult {
applied: boolean;
outputPath: string;
startParagraphIndex: number;
paragraphCount: number;
beforeTexts: string[];
sortedTexts: string[];
afterTexts: string[];
resultKind: "applied" | "already-sorted" | "invalid-range";
writebackResultKind: "written" | "not-requested";
}
```
### BoundedLiveTextInsertResult
[Section titled “BoundedLiveTextInsertResult”](#boundedlivetextinsertresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface BoundedLiveTextInsertResult {
applied: boolean;
versionHistoryOwnership?: SaveAsOwnershipCommitReceipt;
outputPath: string;
paragraphIndex: number;
insertedText: string;
deletedCount?: number;
nextCaretSlotIndex: number;
beforeText: string | null;
afterText: string | null;
afterTexts?: string[] | null;
canonicalOwnerAfter?: {
documentId: string;
sessionId: string;
acceptedRevision: number;
selectionRevision: number;
};
persistentReceipt?: AcceptedEditTerminal;
persistentCheckpoint?: {
schema: "fastdoc.persistent-save-checkpoint-receipt.v1";
sessionId: string;
documentId: string;
requestId: string;
acceptedRevision: number;
publishedRevision: number;
publishedModelHash: string;
targetHashBefore: string | null;
targetHash: string;
targetIdentity: PublishedTargetIdentity;
terminalResult: "published" | "unchanged";
physicalDocxWrites: 0 | 1;
versionHistoryOwnership: SaveAsOwnershipCommitReceipt | null;
};
inheritedStyle: {
fontFamilyName: string | null;
fontSizeHalfPoints: number | null;
fontBold: boolean | null;
fontItalic: boolean | null;
fontColorRgb: string | null;
fontUnderline: string | null;
};
}
```
### BoundedLiveTextMutationResult
[Section titled “BoundedLiveTextMutationResult”](#boundedlivetextmutationresult)
`TypeAliasDeclaration` · `api-edit.ts`
```ts
type BoundedLiveTextMutationResult = Omit & {
afterText: string;
};
```
### EditorV0EditingReplaceFirstRequest
[Section titled “EditorV0EditingReplaceFirstRequest”](#editorv0editingreplacefirstrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceFirstRequest {
paragraphIndex: number;
findText: string;
replaceText: string;
offset?: number | null;
deleteCount?: number | null;
matchedText?: string | null;
matchCountBefore?: number | null;
matchCase?: boolean;
wholeWord?: boolean;
storyAware?: boolean;
sourceStory?: "body" | "table" | "header" | "footer" | "footnote" | "endnote" | "comment";
sourcePartName?: string | null;
sourcePartMatchIndex?: number | null;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0EditingReplaceFirstResult
[Section titled “EditorV0EditingReplaceFirstResult”](#editorv0editingreplacefirstresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceFirstResult {
schema: "fastdoc.shell.editor-v0-editing-replace-first-command.v1";
applied: boolean;
outputPath: string;
paragraphIndex: number;
findText: string;
replaceText: string;
beforeTexts: string[];
afterTexts: string[];
resultKind: "applied" | "not-found" | "unsupported-document" | "no-current-document" | "blocked-protected";
writebackResultKind: "written" | "not-requested" | "blocked";
matchCountBefore: number;
matchCountAfter: number;
offset?: number | null;
deleteCount?: number | null;
matchedText?: string | null;
matchCase?: boolean;
wholeWord?: boolean;
operationKind?: string;
deleteResultKind?: string | null;
insertResultKind?: string | null;
reopenedDocumentPath: string | null;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
}
```
### EditorV0EditingReplaceAllRequest
[Section titled “EditorV0EditingReplaceAllRequest”](#editorv0editingreplaceallrequest)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceAllRequest {
findText: string;
replaceText: string;
matchCountBefore?: number | null;
matchCase?: boolean;
wholeWord?: boolean;
storyAware?: boolean;
outputPath?: string | null;
reopenAfterWrite?: boolean;
}
```
### EditorV0EditingReplaceAllSemanticRange
[Section titled “EditorV0EditingReplaceAllSemanticRange”](#editorv0editingreplaceallsemanticrange)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceAllSemanticRange {
offset: number;
deleteCount: number;
matchedText: string;
}
```
### EditorV0EditingReplaceAllParagraphResult
[Section titled “EditorV0EditingReplaceAllParagraphResult”](#editorv0editingreplaceallparagraphresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceAllParagraphResult {
paragraphIndex: number;
matchCountBefore: number;
remainingFindMatchCount: number;
replacementMatchCountAfter: number;
beforeText: string;
afterText: string;
resultKind: string;
writebackResultKind: string;
normalizationDetail: string | null;
operationKind?: string;
rangeCount?: number;
ranges?: EditorV0EditingReplaceAllSemanticRange[];
}
```
### EditorV0EditingReplaceAllResult
[Section titled “EditorV0EditingReplaceAllResult”](#editorv0editingreplaceallresult)
`InterfaceDeclaration` · `api-edit.ts`
```ts
interface EditorV0EditingReplaceAllResult {
schema: "fastdoc.shell.editor-v0-editing-replace-all-command.v1";
applied: boolean;
outputPath: string;
paragraphIndexes: number[];
findText: string;
replaceText: string;
beforeTexts: string[];
afterTexts: string[];
resultKind: "applied" | "not-found" | "unsupported-document" | "no-current-document" | "blocked-protected";
writebackResultKind: "written" | "not-requested" | "blocked";
matchCountBefore: number;
matchCountAfter: number;
remainingFindMatchCount: number;
replacementMatchCountAfter: number;
paragraphResults: EditorV0EditingReplaceAllParagraphResult[];
matchCase?: boolean;
wholeWord?: boolean;
operationKind?: string;
rangeCount?: number;
rangeWritebackStepCount?: number;
rangeStepResultKinds?: string[];
reopenedDocumentPath: string | null;
popupWarningShown: false;
technicalPanelAdded: false;
wordParityClaim: false;
pixelParityClaim: false;
}
```
# Events between the application and the editor
> The full list: seven events from the application to the editor and eleven back, plus six that appeared after the document — each with its signature and channel name.
Internal API
The events below travel inside the desktop SumDoc window, between its shell and the editor. They don’t exist in the browser, in your `iframe`, or in someone else’s shell: for embedding, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
## From the application to the editor — 7 events
[Section titled “From the application to the editor — 7 events”](#from-the-application-to-the-editor--7-events)
### onDocumentSessionSnapshot
[Section titled “onDocumentSessionSnapshot”](#ondocumentsessionsnapshot)
```ts
onDocumentSessionSnapshot(callback: (snapshot: ShellDocumentSessionSnapshot) => void): () => void
```
Channel: `fastdoc-shell:document-session-snapshot`
### onMenuCommand
[Section titled “onMenuCommand”](#onmenucommand)
```ts
onMenuCommand(callback: (command: MenuCommand) => void): () => void
```
Channel: `fastdoc-shell:menu-command`
### onSaveBeforeClose
[Section titled “onSaveBeforeClose”](#onsavebeforeclose)
```ts
onSaveBeforeClose(callback: () => void): () => void
```
Channel: `fastdoc-shell:save-before-close`
### onSaveBeforeCloseFailed
[Section titled “onSaveBeforeCloseFailed”](#onsavebeforeclosefailed)
```ts
onSaveBeforeCloseFailed(callback: (payload: { message: string }) => void): () => void
```
Channel: `fastdoc-shell:save-before-close-failed`
### onSaveBeforeDocumentSwitch
[Section titled “onSaveBeforeDocumentSwitch”](#onsavebeforedocumentswitch)
```ts
onSaveBeforeDocumentSwitch(callback: (request: { requestId: number }) => void): () => void
```
Channel: `fastdoc-shell:save-before-document-switch`
### onStateChanged
[Section titled “onStateChanged”](#onstatechanged)
```ts
onStateChanged(callback: (state: ShellBridgeState) => void): () => void
```
Channel: `fastdoc-shell:state-changed`
### onSystemPaste
[Section titled “onSystemPaste”](#onsystempaste)
```ts
onSystemPaste(callback: (payload: SystemPastePayload) => void): () => void
```
Channel: `fastdoc-shell:system-paste`
## From the editor to the application — 11 events
[Section titled “From the editor to the application — 11 events”](#from-the-editor-to-the-application--11-events)
### completeSaveBeforeClose
[Section titled “completeSaveBeforeClose”](#completesavebeforeclose)
```ts
completeSaveBeforeClose(payload: { saved: boolean; message?: string | null }): void
```
Channel: `fastdoc-shell:save-before-close-result`
### completeSaveBeforeDocumentSwitch
[Section titled “completeSaveBeforeDocumentSwitch”](#completesavebeforedocumentswitch)
```ts
completeSaveBeforeDocumentSwitch(result: { requestId: number; saved: boolean; savedPath: string | null; errorMessage: string | null; }): void
```
Channel: `fastdoc-shell:document-switch-save-result`
### notifyCanonicalEditDropped
[Section titled “notifyCanonicalEditDropped”](#notifycanonicaleditdropped)
```ts
notifyCanonicalEditDropped(payload: { code: string; requestId: string; commandType: string; }): void
```
Channel: `fastdoc-shell:canonical-edit-dropped`
### notifyCurrentDocumentTruthViewerReady
[Section titled “notifyCurrentDocumentTruthViewerReady”](#notifycurrentdocumenttruthviewerready)
```ts
notifyCurrentDocumentTruthViewerReady(payload: { availability: string; fixtureId: string | null; blockedStatesVisible: boolean; forbiddenClaimsVisible: boolean; unavailableStateVisible: boolean; genericFixtureListVisible: boolean; }): void
```
Channel: `fastdoc-shell:current-document-truth-viewer-ready`
### notifyDocumentRendered
[Section titled “notifyDocumentRendered”](#notifydocumentrendered)
```ts
notifyDocumentRendered(renderedPath: string | null): void
```
Channel: `fastdoc-shell:document-rendered`
### notifyEditKeyDropped
[Section titled “notifyEditKeyDropped”](#notifyeditkeydropped)
```ts
notifyEditKeyDropped(payload: { code: string; inputType: string; selectionShape: string; inputRoute: string; contextRefusal: string; pressIndex: number; }): void
```
Channel: `fastdoc-shell:edit-key-dropped`
### notifyPageHydrationDropped
[Section titled “notifyPageHydrationDropped”](#notifypagehydrationdropped)
```ts
notifyPageHydrationDropped(payload: { code: string; stage: string }): void
```
Channel: `fastdoc-shell:page-hydration-dropped`
### notifyPersistentSaveRefused
[Section titled “notifyPersistentSaveRefused”](#notifypersistentsaverefused)
```ts
notifyPersistentSaveRefused(payload: { code: string; requestId: string; saveAs: boolean; }): void
```
Channel: `fastdoc-shell:persistent-save-refused`
### notifyRendererReady
[Section titled “notifyRendererReady”](#notifyrendererready)
```ts
notifyRendererReady(): void
```
Channel: `fastdoc-shell:renderer-ready`
### notifySmokeCheckpoint
[Section titled “notifySmokeCheckpoint”](#notifysmokecheckpoint)
```ts
notifySmokeCheckpoint(checkpoint: string, payload?: { screenshotDataUrl?: string | null; screenshots?: Array<{ name?: string | null; dataUrl?: string | null }>; telemetry?: unknown; reserveCyclesCompleted?: number; reserveElapsedMs?: number; reserveRichPayloadBytes?: number; }): void
```
Channel: `fastdoc-shell:smoke-checkpoint`
### notifyUnsavedState
[Section titled “notifyUnsavedState”](#notifyunsavedstate)
```ts
notifyUnsavedState(hasUnsavedChanges: boolean): void
```
Channel: `fastdoc-shell:unsaved-state`
Subscription lifecycle. Every `on*` method returns an unsubscribe function — call it when you remove the component or close the window, or the handlers will keep hanging around.
## Appeared after the document — 6 events
[Section titled “Appeared after the document — 6 events”](#appeared-after-the-document--6-events)
These channels are declared in the contract and in the desktop SumDoc `preload`, but didn’t make it into the document this reference is built from. Three go from the application to the editor, three go back.
### onCanonicalSceneRefreshed
[Section titled “onCanonicalSceneRefreshed”](#oncanonicalscenerefreshed)
```ts
onCanonicalSceneRefreshed(callback: (event: ShellCanonicalSceneRefreshed) => void): () => void
```
Channel: `fastdoc-shell:canonical-scene-refreshed` — the scene changed for a reason other than this person’s action: a peer’s edit or a deferred read of projections.
### onDocumentPatch
[Section titled “onDocumentPatch”](#ondocumentpatch)
```ts
onDocumentPatch(callback: (patch: ShellDocumentPatch) => void): () => void
```
Channel: `fastdoc-shell:document-patch` — a delta frame for a peer’s edit instead of the whole state.
### onProbeUnsavedState
[Section titled “onProbeUnsavedState”](#onprobeunsavedstate)
```ts
onProbeUnsavedState(callback: (request: { requestId: number }) => void): () => void
```
Channel: `fastdoc-shell:probe-unsaved-state` — the application asks whether there is anything unsaved.
### declareRendererCapabilities
[Section titled “declareRendererCapabilities”](#declarerenderercapabilities)
```ts
declareRendererCapabilities(capabilities: ShellRendererCapabilities): void
```
Channel: `fastdoc-shell:renderer-capabilities` — what the page can accept; declared before `notifyRendererReady`.
### notifyDocumentPatchOutcome
[Section titled “notifyDocumentPatchOutcome”](#notifydocumentpatchoutcome)
```ts
notifyDocumentPatchOutcome(outcome: ShellDocumentPatchOutcome): void
```
Channel: `fastdoc-shell:document-patch-outcome` — whether the page applied the delta frame, and why not.
### completeUnsavedStateProbe
[Section titled “completeUnsavedStateProbe”](#completeunsavedstateprobe)
```ts
completeUnsavedStateProbe(result: { requestId: number; unsaved: boolean }): void
```
Channel: `fastdoc-shell:unsaved-state-probe-result` — the reply to the unsaved-state probe, by `requestId`.
# SumDoc reference
> The full SumDoc API specification: the session protocol (41 commands), the Browser Surface API, window.fastdocShell (321 methods), events between the application and the editor, and the type catalog (487 types).
If this is your first time here
The reference answers “what is it called and what does it accept”, not “where do I start”. The full workflow is shown in the [quick start](/sumdoc/quickstart/): starting the processor, opening a DOCX file, editing with a command, saving, and checking the result.
The request and response format is covered in [Request and response objects](/sumdoc/envelope/), embedding the ready-made surface in [Embedding the surface](/sumdoc/embedding/), and if something isn’t working, in [diagnostics](/sumdoc/diagnostics/). Term definitions are in the [glossary](/start/glossary/), and the session rules common to all commands are in [SumDoc session and conventions](/reference/sumdoc/conventions/).
This section is a machine-verified reference for SumDoc’s external API. It describes four independent surfaces:
| Surface | What it is | Pages |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Rust Session Protocol** | 41 commands of the document session: exchanging JSON lines over standard input/output or over WebSocket on the local interface. The main path for external integration. | [Transport](/reference/sumdoc/transport/), [Session commands](/reference/sumdoc/session-protocol/), [Typed editing types](/reference/sumdoc/typed-dto/) |
| **Browser Surface API** | Embedding the ready-made editor surface and the events it sends to your application. | [Browser surface interface](/reference/sumdoc/surface-api/) |
| **window\.fastdocShell** | 321 methods inside the desktop SumDoc window. An internal contract, not a public interface. | [document](/reference/sumdoc/shell-document/) … [other methods](/reference/sumdoc/shell-current-api/) |
| **Type catalog** | 487 internal contract types and 31 generated session types. | [api-document.ts](/reference/sumdoc/dto-api-document/) … [Session types](/reference/sumdoc/session-types/) |
What’s in the type catalog, and what isn’t
The catalog holds data types: what a request consists of, what comes back in the response, how state is described. Twenty-two contract types were deliberately left out — they describe not data but the bus itself: the list of domains (`ShellContractDomain`), exchange directions (`BridgeDirection`), capability groups (`ShellCapability`), the channel registry, and one composite type per domain (`DocumentBridgeContract` and its siblings).
They matter to whoever rebuilds the shell itself, and are useless to whoever builds a request. They live in the same place, in `shell-contract`, next to the data types.
How to choose the right API
For embedding in someone else’s product, use the **Rust Session Protocol** or the **Browser Surface API**. `window.fastdocShell` is the desktop application’s internal contract. It isn’t a public interface and doesn’t carry over into someone else’s shell.
## What the reference consists of
[Section titled “What the reference consists of”](#what-the-reference-consists-of)
*Session protocol · surface interface · internal window objects · events · types*
| Metric | Value |
| --------------------- | ---------------------------------------------------------------------------------------- |
| Rust Session Protocol | 41 commands · fastdoc.session-protocol-descriptor.v1 |
| `window.fastdocShell` | 321 methods / 323 signatures |
| Types | 487 internal contract types and 31 generated session types |
| Reference status | First-version draft: names and contents may be refined before the public interface ships |
# Rust Session Protocol — 41 commands
> The full list of document session commands: the parameters, preconditions, and result of each command — 41 in total.
For `mutate`, envelope success isn’t yet an edit
The response to `mutate` comes back with `ok: true` even when the core didn’t accept the edit. The real outcome is in `result.mutation.result_kind`, and only the value `applied` means the document changed. The other four — `invalid-request`, `invalid-target`, `not-found`, and `deferred` — mean it didn’t, each for its own reason. Checking for equality with `applied` is more reliable than enumerating refusals: [how to read a response](/sumdoc/envelope/).
Undo history limits
History isn’t infinite. When the number of steps exceeds the limit, or snapshots no longer fit in the allotted memory, the oldest ones are evicted — one step back always stays available. Undoing past the evicted point simply won’t restore the document, and that’s not an error.
| Limit | Value |
| --------------------------- | ------ |
| steps in the undo history | 2 048 |
| memory for the undo history | 256 MB |
| ::: | |
Checkpoints and outside changes to the file
`save-checkpoint` has something plain `save` doesn’t: `target` carries `expected_hash` — the file’s state as your application last saw it. Before publishing, the core checks the file against this state and refuses if it was changed from outside in the meantime: by another program, a second session, or sync. The refusal comes before the write, so no outside edit gets overwritten.
The text of such refusals starts with `external modification`. On receiving one, don’t overwrite the document blindly: the file on disk is newer than the one you started from, and the decision belongs to a person or to your application’s own rules.
Values you can’t guess from the type
| Field | Commands | What it accepts |
| ---------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tracked_change_markup_mode` | `print`, `print-delta` | `in-line` — changes are shown inline in the text, the default value; `balloon` — as margin callouts. The mode applies to how the scene is displayed, not to the document itself. |
| `page_indexes` | `print-window` | The numbers of the pages whose scenes to build. Numbering starts at zero. Without the field, the window is empty — the core doesn’t reject such a request. |
| `defer_raster_bytes` | `print-window` | Don’t embed raster bytes in the response, leaving their identifiers and geometry — for the first display of the document. |
| `soft_page_cursor` | `print-window` | An opaque cursor issued by the core — for the next window of soft pages. |
| `co_editing` | `apply-text-transaction` | Editing during co-editing: undo and redo without a command for peers refuse before acceptance. |
| `rebase_package_baseline` | `save` | Accept the current projection as the baseline of the session package without publishing the file. |
| `include_page_stack` | `print-window` | Add page geometry and brief navigation data to the response. Needed when the document is first opened. |
| `known_fingerprints` | `print-delta` | Scene fingerprints the client already has, by page number. The core returns only what changed. |
| `id` | all | A request tag chosen by the client. Returned unchanged — it’s what matches the response to the request. |
| ::: | | |
| cmd | mut. | params | precondition | result |
| -------------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| apply-composition | yes | request: JSON (required) | open | CompositionReceipt |
| apply-text-transaction | yes | request: JSON (required); co\_editing: boolean (optional, default false) | open | AcceptedEditTerminal { dirty, receipt, model\_delta, model\_projection\_patch, owner\_state, typing\_attributes } |
| commit-snapshot | yes | document\_id: string (required); path: string (required); transaction\_order: integer (required); transition\_kind: string (required) | open | a deprecated commit-and-history receipt |
| commit-structural-snapshot | yes | path: string (required); request: JSON (required) | open | the result of a structural edit, with a receipt |
| compatibility-inspect | no | — | open | fastdoc.docx-compatibility-command.v1 |
| compose | no | — | open | ParagraphCompositionSnapshot\[] |
| model | no | — | open | CanonicalDocument |
| mutate | yes | after\_caret\_slot\_index: integer or null (optional); before\_caret\_slot\_index: integer or null (optional); before\_selection\_end\_slot\_index: integer or null (optional); before\_selection\_start\_slot\_index: integer or null (optional); delete\_count: integer (optional, default 0); document\_id: string or null (optional); offset: integer (optional, default 0); operation\_kind: string (required); paragraph\_index: integer (required); revision\_author: string or null (optional); revision\_date: string or null (optional); revision\_date\_utc: string or null (optional); text: string or null (optional); transaction\_order: integer (optional, default 0); transition\_kind: string or null (optional) | open | { mutation: BodyTextMutationSnapshot, mutation\_count, history } |
| open | yes | document\_id: string or null (optional); path: string (required) | no | { opened, byte\_count, digital\_signature\_present, session\_id, document\_id, revision, accepted\_revision, dirty, history, open\_stage\_timings\_ms } |
| paginate | no | — | open | PaginationSnapshot |
| ping | no | — | no | { pong: true } |
| print | no | tracked\_change\_markup\_mode: string or null (optional) | open | PrintParitySnapshot |
| print-delta | no | known\_fingerprints: JSON array (optional); tracked\_change\_markup\_mode: string or null (optional) | open | snapshot details, `changed_pages[]`, and `unchanged_page_indexes[]` |
| print-summary | no | — | open | { page\_count, line\_item\_count, scene\_fingerprints\[] } |
| print-window | no | include\_page\_stack: boolean (optional); page\_indexes: JSON array (optional, default empty); defer\_raster\_bytes: boolean (optional); soft\_page\_cursor: JSON (optional) | open | the print window and the built pages; on request, `page_stack` and the window model |
| redo | yes | document\_id: string or null (optional); transaction\_order: integer (optional, default 0) | open | history, the transition, `redone=true`, and a receipt |
| report | no | — | open | SupportReport |
| review | no | — | open | ReviewSnapshot |
| save | yes | path: string or null (optional); rebase\_package\_baseline: boolean (optional) | open | { saved, saved\_document\_itself?, byte\_count, history\_preserved, history } |
| save-checkpoint | yes | expected\_revision: integer (required); request\_id: string (required); session\_id: string (required); target: JSON (required) | open | fastdoc.persistent-save-checkpoint-receipt.v1 |
| set-selection | yes | request: JSON (required) | open | SelectionUpdateReceipt |
| shutdown | yes | — | no | { id, ok:true, shutdown:true } |
| simple-field-inventory | no | — | open | SimpleFieldInventorySnapshot |
| squash-history | yes | base\_undo\_depth: integer (required); document\_id: string (required); transition\_kind: string or null (optional) | open | history state |
| status | no | — | open | session state: path, cache, history, revision, the unsaved flag, and the model hash |
| style | no | — | open | StyleSnapshot |
| track-revisions-state | no | — | open | TrackRevisionsStateSnapshot |
| undo | yes | document\_id: string or null (optional); transaction\_order: integer (optional, default 0) | open | history, the transition, `undone=true`, and a receipt |
## apply-composition
[Section titled “apply-composition”](#apply-composition)
Parameters: request: JSON (required)
Result: CompositionReceipt
```json
{
"id": "req-1",
"cmd": "apply-composition",
"request": {
"...": "edit types — see “Typed editing types”"
}
}
```
Concurrent access. `expected_revision` and `expected_selection_revision` are required: a request sent from a stale state is rejected.
## apply-text-transaction
[Section titled “apply-text-transaction”](#apply-text-transaction)
Parameters: request: JSON (required); co\_editing: boolean (optional, default false)
Result: AcceptedEditTerminal { dirty, receipt, model\_delta, model\_projection\_patch, owner\_state, typing\_attributes }
```json
{
"id": "req-1",
"cmd": "apply-text-transaction",
"request": {
"...": "edit types — see “Typed editing types”"
}
}
```
Concurrent access. `expected_revision` and `expected_selection_revision` are required: a request sent from a stale state is rejected.
## commit-snapshot
[Section titled “commit-snapshot”](#commit-snapshot)
Parameters: document\_id: string (required); path: string (required); transaction\_order: integer (required); transition\_kind: string (required)
Result: a deprecated commit-and-history receipt
```json
{
"id": "req-1",
"cmd": "commit-snapshot",
"document_id": "document_id-1",
"path": "/absolute/document.docx",
"transaction_order": 1,
"transition_kind": "transition_kind-1"
}
```
## commit-structural-snapshot
[Section titled “commit-structural-snapshot”](#commit-structural-snapshot)
Parameters: path: string (required); request: JSON (required)
Result: the result of a structural edit, with a receipt
```json
{
"id": "req-1",
"cmd": "commit-structural-snapshot",
"path": "/absolute/document.docx",
"request": {
"...": "edit types — see “Typed editing types”"
}
}
```
## compatibility-inspect
[Section titled “compatibility-inspect”](#compatibility-inspect)
Parameters: —
Result: fastdoc.docx-compatibility-command.v1
```json
{
"id": "req-1",
"cmd": "compatibility-inspect"
}
```
## compose
[Section titled “compose”](#compose)
Parameters: —
Result: ParagraphCompositionSnapshot\[]
```json
{
"id": "req-1",
"cmd": "compose"
}
```
## model
[Section titled “model”](#model)
Parameters: —
Result: CanonicalDocument
```json
{
"id": "req-1",
"cmd": "model"
}
```
## mutate
[Section titled “mutate”](#mutate)
Parameters: after\_caret\_slot\_index: integer or null (optional); before\_caret\_slot\_index: integer or null (optional); before\_selection\_end\_slot\_index: integer or null (optional); before\_selection\_start\_slot\_index: integer or null (optional); delete\_count: integer (optional, default 0); document\_id: string or null (optional); offset: integer (optional, default 0); operation\_kind: string (required); paragraph\_index: integer (required); revision\_author: string or null (optional); revision\_date: string or null (optional); revision\_date\_utc: string or null (optional); text: string or null (optional); transaction\_order: integer (optional, default 0); transition\_kind: string or null (optional)
Result: { mutation: BodyTextMutationSnapshot, mutation\_count, history }
```json
{
"id": "req-1",
"cmd": "mutate",
"operation_kind": "insert-text",
"paragraph_index": 0
}
```
Units. For `mutate`, `offset` and `delete_count` are counted in characters (Unicode scalar values) — not bytes and not UTF-16 units. In JavaScript, that’s what `Array.from(text).length` gives you; the familiar `string.length` returns a different number, because it counts UTF-16 units.
Typed editing uses different units
The second editing path — [typed transactions](/reference/sumdoc/typed-dto/) — measures positions in UTF-16 units instead, the same way `string.length` does. For Latin and Cyrillic text the numbers match; for emoji and rare CJK characters they don’t: one such character is 1 for `mutate` and 2 for typed editing. When you switch from one path to the other, recalculate the offsets.
## open
[Section titled “open”](#open)
Parameters: document\_id: string or null (optional); path: string (required)
Result: { opened, byte\_count, digital\_signature\_present, session\_id, document\_id, revision, accepted\_revision, dirty, history, open\_stage\_timings\_ms }
```json
{
"id": "req-1",
"cmd": "open",
"path": "/absolute/document.docx"
}
```
## paginate
[Section titled “paginate”](#paginate)
Parameters: —
Result: PaginationSnapshot
```json
{
"id": "req-1",
"cmd": "paginate"
}
```
## ping
[Section titled “ping”](#ping)
Parameters: —
Result: { pong: true }
```json
{
"id": "req-1",
"cmd": "ping"
}
```
## print
[Section titled “print”](#print)
Parameters: tracked\_change\_markup\_mode: string or null (optional)
Result: PrintParitySnapshot
```json
{
"id": "req-1",
"cmd": "print"
}
```
## print-delta
[Section titled “print-delta”](#print-delta)
Parameters: known\_fingerprints: JSON array (optional); tracked\_change\_markup\_mode: string or null (optional)
Result: snapshot details, `changed_pages[]`, and `unchanged_page_indexes[]`
```json
{
"id": "req-1",
"cmd": "print-delta"
}
```
## print-summary
[Section titled “print-summary”](#print-summary)
Parameters: —
Result: { page\_count, line\_item\_count, scene\_fingerprints\[] }
```json
{
"id": "req-1",
"cmd": "print-summary"
}
```
## print-window
[Section titled “print-window”](#print-window)
Parameters: include\_page\_stack: boolean (optional); page\_indexes: JSON array (optional, default empty); defer\_raster\_bytes: boolean (optional); soft\_page\_cursor: JSON (optional)
Result: the print window and the built pages; on request, `page_stack` and the window model
```json
{
"id": "req-1",
"cmd": "print-window",
"page_indexes": [
0
]
}
```
## redo
[Section titled “redo”](#redo)
Parameters: document\_id: string or null (optional); transaction\_order: integer (optional, default 0)
Result: history, the transition, `redone=true`, and a receipt
```json
{
"id": "req-1",
"cmd": "redo"
}
```
## report
[Section titled “report”](#report)
Parameters: —
Result: SupportReport
```json
{
"id": "req-1",
"cmd": "report"
}
```
## review
[Section titled “review”](#review)
Parameters: —
Result: ReviewSnapshot
```json
{
"id": "req-1",
"cmd": "review"
}
```
## save
[Section titled “save”](#save)
Parameters: path: string or null (optional); rebase\_package\_baseline: boolean (optional)
Result: { saved, saved\_document\_itself?, byte\_count, history\_preserved, history }
```json
{
"id": "req-1",
"cmd": "save"
}
```
## save-checkpoint
[Section titled “save-checkpoint”](#save-checkpoint)
Parameters: expected\_revision: integer (required); request\_id: string (required); session\_id: string (required); target: JSON (required)
Result: fastdoc.persistent-save-checkpoint-receipt.v1
```json
{
"id": "req-1",
"cmd": "save-checkpoint",
"expected_revision": 1,
"request_id": "request_id-1",
"session_id": "session_id-1",
"target": {
"path": "/absolute/document.docx",
"expected_hash": "sha256:..."
}
}
```
## set-selection
[Section titled “set-selection”](#set-selection)
Parameters: request: JSON (required)
Result: SelectionUpdateReceipt
```json
{
"id": "req-1",
"cmd": "set-selection",
"request": {
"...": "edit types — see “Typed editing types”"
}
}
```
Concurrent access. `expected_revision` and `expected_selection_revision` are required: a request sent from a stale state is rejected.
## shutdown
[Section titled “shutdown”](#shutdown)
Parameters: —
Result: { id, ok:true, shutdown:true }
```json
{
"id": "req-1",
"cmd": "shutdown"
}
```
## simple-field-inventory
[Section titled “simple-field-inventory”](#simple-field-inventory)
Parameters: —
Result: SimpleFieldInventorySnapshot
```json
{
"id": "req-1",
"cmd": "simple-field-inventory"
}
```
## squash-history
[Section titled “squash-history”](#squash-history)
Parameters: base\_undo\_depth: integer (required); document\_id: string (required); transition\_kind: string or null (optional)
Result: history state
```json
{
"id": "req-1",
"cmd": "squash-history",
"base_undo_depth": 1,
"document_id": "document_id-1"
}
```
## status
[Section titled “status”](#status)
Parameters: —
Result: session state: path, cache, history, revision, the unsaved flag, and the model hash
```json
{
"id": "req-1",
"cmd": "status"
}
```
## style
[Section titled “style”](#style)
Parameters: —
Result: StyleSnapshot
```json
{
"id": "req-1",
"cmd": "style"
}
```
## track-revisions-state
[Section titled “track-revisions-state”](#track-revisions-state)
Parameters: —
Result: TrackRevisionsStateSnapshot
```json
{
"id": "req-1",
"cmd": "track-revisions-state"
}
```
## undo
[Section titled “undo”](#undo)
Parameters: document\_id: string or null (optional); transaction\_order: integer (optional, default 0)
Result: history, the transition, `undone=true`, and a receipt
```json
{
"id": "req-1",
"cmd": "undo"
}
```
## Commands added later
[Section titled “Commands added later”](#commands-added-later)
The same session accepts these commands, but they didn’t make it into the original table. All of them require an open document.
| cmd | mut. | params | what it does | result |
| --------------------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| propose | no | request: JSON (required) | The same edit as `apply-text-transaction`, but on a throwaway copy of the session: the document doesn’t change | { proposal\_id, base\_revision, after\_revision, request\_id, applied: false, change { range\_before, deleted\_text, inserted\_text, before\_text, after\_text, before\_hash, after\_hash } } |
| commit-proposal | yes | proposal\_id: string (required) | Applies a proposal by its number; the revision is checked again | { proposal\_id, committed, repeated, base\_revision, accepted\_revision, change, applied } |
| snapshot-checkpoint | no | expected\_revision: integer (required); request\_id: string (required); session\_id: string (required); target: string (required) | Writes the current state to a new file `target` without clearing the unsaved flag | details of the written file |
| vba-inspect | no | include\_source: boolean (optional, default false) | The macro project of the open document: modules, procedures, and with `include_source` the source text | `fastdoc.vba.project.v1` |
| vba-plan | no | entrypoint: string (required); allow: boolean (optional); now\_declared: boolean (optional); answer\_declared: boolean (optional); granted\_classes: JSON array (optional) | The plan for running one entry point: what will stop it — before anything is started | `fastdoc.vba.plan.v1` |
| vba-preview | no | entrypoint: string (required); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional) | The macro runs against a snapshot of the session document; the diff goes out, the document doesn’t change | `fastdoc.vba.preview.v1` |
| vba-trust | no | registry: string (required); action: string (optional, default `ask`); label: string or null (optional) | The trust decision for the project: `ask`, `trust`, `block`, `forget`. Bound to the project hash and remembered in the `registry` file | `fastdoc.vba.trust.v1` |
| vba-commit | yes | entrypoint: string (required); registry: string or null (optional); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional) | The macro’s edits enter the open document by the same road as `mutate`. A refusal recorded in `registry` outranks `allow` | `fastdoc.vba.commit.v1` |
| vba-document-event | no | event: string (required); registry: string or null (optional); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional) | A document event from the shell — `open`, `close`, or `new`; reports what happened, doesn’t commit edits | fastdoc.vba.document-event.v1 |
| apply-concurrent-text-transaction | yes | request: JSON (required); site: string (required); local\_site: string (required); order: JSON (optional); typing\_attributes: JSON (optional); run\_format: JSON (optional) | A peer’s edit composed against an old revision: it is transferred onto the current state rather than rejected | Edit confirmation (`AcceptedEditTerminal`) with a `transfer` block: the numbers `seq`, `base`, `seen`, `own`, `site`, `local_site`, `through_earlier`, `through_later`, `insert_at`, and the `journal` log |
| note-operation-order | no | request\_id: string (required); seq: integer (required) | The manager has named the number of its own, already applied edit in the shared order | The fields `known`, `outcome` (`known`, `unknown`, or `out_of_order`), and the `journal` log |
| note-operation-baseline | no | seq: integer (required) | Up to which number the file the document was opened from already contains other people’s work | { baseline } |
| note-tracked-revision-range | no | participant: integer (required) | The band of tracked-change numbers for a co-editing participant; `0` removes the band | { participant, range { start, end } or null, next } |
Who needs the co-editing commands
`apply-concurrent-text-transaction`, `note-operation-order`, `note-operation-baseline`, and `note-tracked-revision-range` are sent by the web host’s co-editing manager, not by your wrapper: they carry edit numbers from the shared order, which a single session doesn’t have. How this works for the user — [The editor in the browser](/sumdoc/webhost/#two-people-in-one-document).
## propose
[Section titled “propose”](#propose)
Parameters: request: JSON (required)
Result: a preview of the edit — `proposal_id`, the revisions before and after, `change` with the text before and after and hashes, `applied: false`
```json
{
"id": "req-1",
"cmd": "propose",
"request": { "request_id": "edit-1", "expected_revision": 3, "…": "same as apply-text-transaction" }
}
```
## commit-proposal
[Section titled “commit-proposal”](#commit-proposal)
Parameters: proposal\_id: string (required)
Result: `committed`, `repeated`, `base_revision`, `accepted_revision`, `change`, `applied`. If the document has moved since `propose`, the refusal is `proposal-stale` and nothing is applied. A repeated call with the same number returns the same response with `repeated: true`, not a second effect.
```json
{ "id": "req-2", "cmd": "commit-proposal", "proposal_id": "proposal-1" }
```
## snapshot-checkpoint
[Section titled “snapshot-checkpoint”](#snapshot-checkpoint)
Parameters: expected\_revision: integer (required); request\_id: string (required); session\_id: string (required); target: string (required)
Result: details of the written file. Unlike `save-checkpoint`, the person’s file, the “modified” flag, and the document address don’t change: `target` must be a new path, and the session must hold an unsaved edit.
```json
{
"id": "req-3",
"cmd": "snapshot-checkpoint",
"session_id": "session_id-1",
"request_id": "request_id-1",
"expected_revision": 4,
"target": "/absolute/snapshot.docx"
}
```
## vba-inspect
[Section titled “vba-inspect”](#vba-inspect)
Parameters: include\_source: boolean (optional, default false)
Result: fastdoc.vba.project.v1 — `macros_present`, `project_name`, `modules` with procedures, `offered_macros`, `user_forms`. Read-only: the project is taken from the already open session package; the file isn’t read a second time.
```json
{ "id": "req-4", "cmd": "vba-inspect", "include_source": true }
```
## vba-plan
[Section titled “vba-plan”](#vba-plan)
Parameters: entrypoint: string (required); allow: boolean (optional); now\_declared: boolean (optional); answer\_declared: boolean (optional); granted\_classes: JSON array (optional)
Result: fastdoc.vba.plan.v1 — whether this run will go ahead and what exactly will stop it. Executes nothing and writes nothing; the plan describes a specific run, so it repeats the person’s decisions: whether the project identity is confirmed, whether the run moment and the answer to dialogs are given, and which classes of external objects are allowed.
```json
{
"id": "req-5",
"cmd": "vba-plan",
"entrypoint": "Module1.FillContract",
"allow": true,
"now_declared": true,
"granted_classes": ["Scripting.FileSystemObject"]
}
```
## vba-preview
[Section titled “vba-preview”](#vba-preview)
Parameters: entrypoint: string (required); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional)
Result: fastdoc.vba.preview\.v1 — `entrypoint`, `result`, `denied_capability`, `stop`, and the “before → after” diff. The macro does run — otherwise the preview would promise something other than what will happen — but the session document doesn’t change by a single byte: the run goes against a snapshot. The appearance of the `cancel_file` file stops the run at the nearest command boundary.
```json
{
"id": "req-6",
"cmd": "vba-preview",
"entrypoint": "Module1.FillContract",
"allow": true,
"now": "2026-09-21T10:00:00",
"answer": "ok",
"grants": ["object:Scripting.FileSystemObject"]
}
```
## vba-trust
[Section titled “vba-trust”](#vba-trust)
Parameters: registry: string (required); action: string (optional, default `ask`); label: string or null (optional)
Result: fastdoc.vba.trust.v1 — what is recorded about the open document’s project. The decision is bound to the project bytes (the hash of the `vbaProject.bin` part), not to the file name: editing a macro revokes trust by itself. `ask` only shows the state; `trust`, `block`, and `forget` change it. Where to store the registry is up to your application.
```json
{
"id": "req-7",
"cmd": "vba-trust",
"registry": "/absolute/macro-trust.json",
"action": "trust",
"label": "Contract template, fill-in macro"
}
```
## vba-commit
[Section titled “vba-commit”](#vba-commit)
Parameters: entrypoint: string (required); registry: string or null (optional); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional)
Result: fastdoc.vba.commit.v1 — `entrypoint`, `result`, and what entered the document. The edits take the same road as `mutate`: the document after the macro matches the document after the same edits made by hand. The policy decides whether to start: a refusal recorded in `registry` outranks `allow`. A canceled run isn’t committed at all.
```json
{
"id": "req-8",
"cmd": "vba-commit",
"entrypoint": "Module1.FillContract",
"registry": "/absolute/macro-trust.json",
"now": "2026-09-21T10:00:00"
}
```
## vba-document-event
[Section titled “vba-document-event”](#vba-document-event)
Parameters: event: string (required); registry: string or null (optional); allow: boolean (optional); now: string or null (optional); answer: string or null (optional); grants: JSON array (optional); cancel\_file: string or null (optional)
Result: fastdoc.vba.document-event.v1 — what happened on the `open`, `close`, or `new` event. The event is raised by the shell, not by a flag: the “run or not” decision stays with the guard and the trust policy. Edits aren’t committed — that’s what `vba-commit` is for.
```json
{ "id": "req-9", "cmd": "vba-document-event", "event": "open", "registry": "/absolute/macro-trust.json" }
```
## apply-concurrent-text-transaction
[Section titled “apply-concurrent-text-transaction”](#apply-concurrent-text-transaction)
Parameters: request: JSON (required); site: string (required); local\_site: string (required); order: JSON (optional); typing\_attributes: JSON (optional); run\_format: JSON (optional)
Result: AcceptedEditTerminal with a `transfer` field — how the edit landed after the transfer. `request` is the same EditRequest as for `apply-text-transaction`, but `expected_revision` may be old: a peer’s edit is transferred onto the current state. `order` is `{ seq, base }`: the edit’s number in the manager’s shared order and up to which number its author had absorbed everything; `typing_attributes` and `run_format` are what the author executed the edit with, so that here it lands with the same look.
```json
{
"id": "req-10",
"cmd": "apply-concurrent-text-transaction",
"site": "boris",
"local_site": "anna",
"order": { "seq": 17, "base": 15 },
"request": { "request_id": "edit-17", "expected_revision": 15, "…": "same as apply-text-transaction" }
}
```
## note-operation-order
[Section titled “note-operation-order”](#note-operation-order)
Parameters: request\_id: string (required); seq: integer (required)
Result: `known`, `outcome` (`known`, `unknown`, or `out_of_order`), `journal`. Your own edit, already applied by `apply-text-transaction`, receives its number in the manager’s shared order.
```json
{ "id": "req-11", "cmd": "note-operation-order", "request_id": "edit-16", "seq": 16 }
```
## note-operation-baseline
[Section titled “note-operation-baseline”](#note-operation-baseline)
Parameters: seq: integer (required)
Result: `baseline`. Reports up to which number the file the document was opened from already contains other people’s work — for whoever arrives later.
```json
{ "id": "req-12", "cmd": "note-operation-baseline", "seq": 15 }
```
## note-tracked-revision-range
[Section titled “note-tracked-revision-range”](#note-tracked-revision-range)
Parameters: participant: integer (required)
Result: `participant`, `range { start, end }` or null, `next`. The core mints the numbers of its tracked changes within the participant’s band so that different people’s numbers in one document don’t collide; `0` removes the band.
```json
{ "id": "req-13", "cmd": "note-tracked-revision-range", "participant": 2 }
```
## What comes back in the `model` response
[Section titled “What comes back in the model response”](#what-comes-back-in-the-model-response)
The `CanonicalDocument` type is how the `model` command answers the question “what’s in the document right now”. It’s built from two layers, and that’s its main property.
**Counters** — how much of what is in the document: `block_count`, `paragraph_count`, `run_count`, `section_count`, `table_count`, `table_row_count`, `table_cell_count`, `body_word_count`, `header_count`, `footer_count`, `footnote_count`, `endnote_count`, `field_count`, `comment_count`, `tracked_change_count`, `object_count`, `style_definition_count`, `numbering_definition_count`, `support_marker_count`. You use them to check that the file opened as expected, without parsing the content.
**Content** — the objects themselves: `body` with text blocks, `sections`, `headers`, `footers`, `footnotes`, `endnotes`, `fields`, `comments`, `tracked_changes`, `objects`, `style_definitions`, `numbering_definitions`, `support_markers`. Plus `document_design`.
Four fields appear only when there’s something to show: `document_protection`, `bibliography`, `footnote_properties`, and `endnote_properties`.
`model_version`, `stage_id`, `stage_name`, and `word_count_source` stand apart: the model version, the parsing stage label, and where the word count was taken from. The document language is `document_language`: read from the first paragraph with text, then from the defaults layer, then from the most frequent paragraph language; the defaults layer itself (`document_default_language`) is stored in the model but doesn’t appear in the response.
The other result types
Names like `PaginationSnapshot`, `StyleSnapshot`, `ReviewSnapshot`, or `AcceptedEditTerminal` won’t turn up in the type catalog: the catalog is built from the TypeScript shell contract, while these are declared in the Rust core. The easiest way to see what each one contains is in the response itself — run the command on your document and look at the JSON: the fields are named the same as in this breakdown.
## What comes back after an edit
[Section titled “What comes back after an edit”](#what-comes-back-after-an-edit)
`AcceptedEditTerminal` is the response to `mutate` and `apply-text-transaction`. It answers the question that comes up right after a successful edit: what to show the user without rereading the whole document.
| Field | What it is |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `receipt` | A receipt for the edit: `before_revision` and `after_revision`, the selection revision numbers before and after, `selection_after` itself, the history state, and the boundary of what changed. You use it to confirm that it was your change that got applied. |
| `model_projection_patch` | What to redraw: `story_id`, `node_id`, the block number in the body, and `paragraph_after` itself — the paragraph after the edit. Plus `before_hash` and `after_hash`, which show which state the patch was built from. |
| `model_delta` | What exactly changed in the text: the range before the edit, the deleted and inserted strings, the text before and after. Useful for a log and for replaying the edit on your side. |
| `owner_state` | The session owner’s state at the moment of the response. |
| `typing_attributes` | The character properties at the input point: what the next text you type will look like. |
| `dirty` | Whether the document has unsaved changes. |
| `projection_baseline` | Only for documents in restricted mode, and only in the response to the first edit after activation: a pair of hashes, `owner_hash` (what the shell held before activation) and `model_hash` (the model built from the same package). From it, the shell understands that two different hashes describe the same document. The field is absent from other responses. |
The rule is simple: render from `model_projection_patch` — it gives you a ready-made paragraph and where to put it. `model_delta` is for when you need to record or replay the edit on your side, not display it.
## Layout and review snapshots
[Section titled “Layout and review snapshots”](#layout-and-review-snapshots)
`PaginationSnapshot` (the response to `paginate`) and `ReviewSnapshot` (the response to `review`) are built the same way as the `model` response: counters first, then content. If you’ve made sense of one, you’ll make sense of the others.
**`PaginationSnapshot` — how the document breaks down into pages.** Counters: `section_count`, `explicit_break_count`, `rendered_break_observation_count`, `page_fragment_count`, `hard_split_count`, `table_placeholder_count`, `anchored_object_placeholder_count`, `support_marker_count`. Content: `sections`, `explicit_breaks`, `page_fragments`, `support_markers`.
Separately, three spread flags — `even_and_odd_headers_enabled`, `mirror_margins_enabled`, `gutter_at_top_enabled`: different headers and footers for even and odd pages, mirrored margins, and a gutter at the top. Plus `frontier_mode` — how far layout has been computed.
**`ReviewSnapshot` — comments and tracked changes.** Counters: `comment_count`, `tracked_change_count`, `resolved_comment_anchor_count`, `deferred_comment_anchor_count`, `support_marker_count`. Content: `comments`, `tracked_changes`, `support_markers`. The `snapshot_mode` field says in what form the snapshot was taken.
Two anchor counters are worth telling apart: `resolved_comment_anchor_count` — comments whose anchor to the text was successfully restored; `deferred_comment_anchor_count` — those whose anchor is deferred. A nonzero second number means some comments currently have nothing to attach to for display.
Like `model`, both snapshots have `model_version`, `stage_id`, and `stage_name` — the model version and the parsing-stage marker.
# Session types in TypeScript
> 31 types generated from the session contract: this is the shape requests and responses take over the connection to the Rust core.
The types are generated from the session contract — your code uses them to build requests and parse responses. Command names are listed in [session commands](/reference/sumdoc/session-protocol/).
### SessionCommandName
[Section titled “SessionCommandName”](#sessioncommandname)
```ts
type SessionCommandName =
| "apply-composition"
| "apply-text-transaction"
| "commit-snapshot"
| "commit-structural-snapshot"
| "compatibility-inspect"
| "compose"
| "model"
| "mutate"
| "open"
| "paginate"
| "ping"
| "print"
| "print-delta"
| "print-summary"
| "print-window"
| "redo"
| "report"
| "review"
| "save"
| "save-checkpoint"
| "set-selection"
| "shutdown"
| "simple-field-inventory"
| "squash-history"
| "status"
| "style"
| "track-revisions-state"
| "undo";
```
### SessionApplyCompositionRequest
[Section titled “SessionApplyCompositionRequest”](#sessionapplycompositionrequest)
```ts
interface SessionApplyCompositionRequest {
cmd: "apply-composition";
id?: unknown;
request: unknown;
}
```
### SessionApplyTextTransactionRequest
[Section titled “SessionApplyTextTransactionRequest”](#sessionapplytexttransactionrequest)
```ts
interface SessionApplyTextTransactionRequest {
cmd: "apply-text-transaction";
id?: unknown;
request: unknown;
}
```
### SessionCommitSnapshotRequest
[Section titled “SessionCommitSnapshotRequest”](#sessioncommitsnapshotrequest)
```ts
interface SessionCommitSnapshotRequest {
cmd: "commit-snapshot";
id?: unknown;
document_id: string;
path: string;
transaction_order: number;
transition_kind: string;
}
```
### SessionCommitStructuralSnapshotRequest
[Section titled “SessionCommitStructuralSnapshotRequest”](#sessioncommitstructuralsnapshotrequest)
```ts
interface SessionCommitStructuralSnapshotRequest {
cmd: "commit-structural-snapshot";
id?: unknown;
path: string;
request: unknown;
}
```
### SessionCompatibilityInspectRequest
[Section titled “SessionCompatibilityInspectRequest”](#sessioncompatibilityinspectrequest)
```ts
interface SessionCompatibilityInspectRequest {
cmd: "compatibility-inspect";
id?: unknown;
}
```
### SessionComposeRequest
[Section titled “SessionComposeRequest”](#sessioncomposerequest)
```ts
interface SessionComposeRequest {
cmd: "compose";
id?: unknown;
}
```
### SessionModelRequest
[Section titled “SessionModelRequest”](#sessionmodelrequest)
```ts
interface SessionModelRequest {
cmd: "model";
id?: unknown;
}
```
### SessionMutateRequest
[Section titled “SessionMutateRequest”](#sessionmutaterequest)
```ts
interface SessionMutateRequest {
cmd: "mutate";
id?: unknown;
after_caret_slot_index?: number | null;
before_caret_slot_index?: number | null;
before_selection_end_slot_index?: number | null;
before_selection_start_slot_index?: number | null;
delete_count?: number;
document_id?: string | null;
offset?: number;
operation_kind: string;
paragraph_index: number;
revision_author?: string | null;
revision_date?: string | null;
revision_date_utc?: string | null;
text?: string | null;
transaction_order?: number;
transition_kind?: string | null;
}
```
### SessionOpenRequest
[Section titled “SessionOpenRequest”](#sessionopenrequest)
```ts
interface SessionOpenRequest {
cmd: "open";
id?: unknown;
document_id?: string | null;
path: string;
}
```
### SessionPaginateRequest
[Section titled “SessionPaginateRequest”](#sessionpaginaterequest)
```ts
interface SessionPaginateRequest {
cmd: "paginate";
id?: unknown;
}
```
### SessionPingRequest
[Section titled “SessionPingRequest”](#sessionpingrequest)
```ts
interface SessionPingRequest {
cmd: "ping";
id?: unknown;
}
```
### SessionPrintRequest
[Section titled “SessionPrintRequest”](#sessionprintrequest)
```ts
interface SessionPrintRequest {
cmd: "print";
id?: unknown;
tracked_change_markup_mode?: string | null;
}
```
### SessionPrintDeltaRequest
[Section titled “SessionPrintDeltaRequest”](#sessionprintdeltarequest)
```ts
interface SessionPrintDeltaRequest {
cmd: "print-delta";
id?: unknown;
known_fingerprints?: unknown[];
tracked_change_markup_mode?: string | null;
}
```
### SessionPrintSummaryRequest
[Section titled “SessionPrintSummaryRequest”](#sessionprintsummaryrequest)
```ts
interface SessionPrintSummaryRequest {
cmd: "print-summary";
id?: unknown;
}
```
### SessionPrintWindowRequest
[Section titled “SessionPrintWindowRequest”](#sessionprintwindowrequest)
```ts
interface SessionPrintWindowRequest {
cmd: "print-window";
id?: unknown;
include_page_stack?: boolean;
page_indexes: unknown[];
}
```
### SessionRedoRequest
[Section titled “SessionRedoRequest”](#sessionredorequest)
```ts
interface SessionRedoRequest {
cmd: "redo";
id?: unknown;
document_id?: string | null;
transaction_order?: number;
}
```
### SessionReportRequest
[Section titled “SessionReportRequest”](#sessionreportrequest)
```ts
interface SessionReportRequest {
cmd: "report";
id?: unknown;
}
```
### SessionReviewRequest
[Section titled “SessionReviewRequest”](#sessionreviewrequest)
```ts
interface SessionReviewRequest {
cmd: "review";
id?: unknown;
}
```
### SessionSaveRequest
[Section titled “SessionSaveRequest”](#sessionsaverequest)
```ts
interface SessionSaveRequest {
cmd: "save";
id?: unknown;
path?: string | null;
}
```
### SessionSaveCheckpointRequest
[Section titled “SessionSaveCheckpointRequest”](#sessionsavecheckpointrequest)
```ts
interface SessionSaveCheckpointRequest {
cmd: "save-checkpoint";
id?: unknown;
expected_revision: number;
request_id: string;
session_id: string;
target: unknown;
}
```
### SessionSetSelectionRequest
[Section titled “SessionSetSelectionRequest”](#sessionsetselectionrequest)
```ts
interface SessionSetSelectionRequest {
cmd: "set-selection";
id?: unknown;
request: unknown;
}
```
### SessionShutdownRequest
[Section titled “SessionShutdownRequest”](#sessionshutdownrequest)
```ts
interface SessionShutdownRequest {
cmd: "shutdown";
id?: unknown;
}
```
### SessionSimpleFieldInventoryRequest
[Section titled “SessionSimpleFieldInventoryRequest”](#sessionsimplefieldinventoryrequest)
```ts
interface SessionSimpleFieldInventoryRequest {
cmd: "simple-field-inventory";
id?: unknown;
}
```
### SessionSquashHistoryRequest
[Section titled “SessionSquashHistoryRequest”](#sessionsquashhistoryrequest)
```ts
interface SessionSquashHistoryRequest {
cmd: "squash-history";
id?: unknown;
base_undo_depth: number;
document_id: string;
transition_kind?: string | null;
}
```
### SessionStatusRequest
[Section titled “SessionStatusRequest”](#sessionstatusrequest)
```ts
interface SessionStatusRequest {
cmd: "status";
id?: unknown;
}
```
### SessionStyleRequest
[Section titled “SessionStyleRequest”](#sessionstylerequest)
```ts
interface SessionStyleRequest {
cmd: "style";
id?: unknown;
}
```
### SessionTrackRevisionsStateRequest
[Section titled “SessionTrackRevisionsStateRequest”](#sessiontrackrevisionsstaterequest)
```ts
interface SessionTrackRevisionsStateRequest {
cmd: "track-revisions-state";
id?: unknown;
}
```
### SessionUndoRequest
[Section titled “SessionUndoRequest”](#sessionundorequest)
```ts
interface SessionUndoRequest {
cmd: "undo";
id?: unknown;
document_id?: string | null;
transaction_order?: number;
}
```
### SessionRequest
[Section titled “SessionRequest”](#sessionrequest)
```ts
type SessionRequest = SessionApplyCompositionRequest | SessionApplyTextTransactionRequest | SessionCommitSnapshotRequest | SessionCommitStructuralSnapshotRequest | SessionCompatibilityInspectRequest | SessionComposeRequest | SessionModelRequest | SessionMutateRequest | SessionOpenRequest | SessionPaginateRequest | SessionPingRequest | SessionPrintRequest | SessionPrintDeltaRequest | SessionPrintSummaryRequest | SessionPrintWindowRequest | SessionRedoRequest | SessionReportRequest | SessionReviewRequest | SessionSaveRequest | SessionSaveCheckpointRequest | SessionSetSelectionRequest | SessionShutdownRequest | SessionSimpleFieldInventoryRequest | SessionSquashHistoryRequest | SessionStatusRequest | SessionStyleRequest | SessionTrackRevisionsStateRequest | SessionUndoRequest;
```
### SessionResponse
[Section titled “SessionResponse”](#sessionresponse)
```ts
interface SessionResponse {
cmd?: string;
elapsed_ms?: number;
error?: string;
id?: unknown;
ok?: boolean;
result?: unknown;
}
```
# window.fastdocShell · other methods
> Methods that don't fit the topic groups above: edit history, working with the current document and windows, templates, autosave, and recovery. Methods: 70.
Methods that don’t fit the topic groups above: edit history, working with the current document and windows, templates, autosave, and recovery. Methods on this page: 70.
Internal API
`window.fastdocShell` is only available inside the desktop SumDoc window. For external integration, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
How to read the line under the signature
Under each method is a line of four values — for example `web_to_host_request_response` · `invoke` · `fastdoc-shell:get-state` · `capability=document`.
| Value | What it means |
| ------------------------------ | ------------------------------------------------------------------------------- |
| `web_to_host_request_response` | The editor window asks the application shell and waits for a response |
| `web_to_host_event` | The editor window notifies the shell and doesn’t wait for a response |
| `host_to_web_event` | The shell notifies the editor window; you subscribe to these methods |
| `invoke`, `send`, `on` | Exchange method: request with a response, send without a response, subscription |
| `fastdoc-shell:…` | The name of the channel the message travels on |
| `capability=…` | The capability group the method belongs to |
All three sets of values are declared in the shell contract: directions in `BridgeDirection`, domains in `ShellContractDomain`, capabilities in `ShellCapability`. The last set doesn’t match the domains: smoke runs and the release center have no capability of their own, so their methods are assigned to `internal` or `document`.
The first word of the name tells you what the method does
| Start of the name | What happens |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apply…` | Performs an action and changes the document. The response says what happened |
| `compute…CommandState` | Changes nothing: answers whether the action can be performed now (`canApply`) and why not (`disabledReason`). The shell uses this response to decide whether to enable the button |
| `run…` | Runs an entire scenario — a compatibility check or a release-readiness check |
| `get…`, `list…` | Read state and change nothing |
| `set…`, `update…` | Change a setting, not the document’s content |
| `create…`, `delete…` | Create and delete — a version, a comment, a checkpoint |
| `open…` | Opens — the document, one of its versions, a link in an external program |
| `resolve…` | Two different meanings, visible from the rest of the name: for comments, it marks one resolved; for recovery and external changes, it resolves a conflict by choosing whose edit to keep |
| `notify…` | Notifies the shell of an event and doesn’t wait for a response |
| `on…` | Subscription: the shell calls you when the event happens |
The `apply…` and `compute…CommandState` pairs go together: first you ask for the state, then you apply. A method ending in `Copy` is a special case, covered below.
What `Copy` at the end of a name means
This kind of method doesn’t change the open document. It creates a file next to it and applies the action to that copy: the open document and its history stay as they were. Where to write it is set by the `outputPath` field; without it, the shell picks a path itself, next to the source file.
So “accepting a change” with `Copy` isn’t an in-place edit — it produces a second file with the change accepted. Editing the open document goes through a different path — session commands, `mutate` and `apply-text-transaction`: [Rust Session Protocol](/reference/sumdoc/session-protocol/).
Methods on this page — 70
* [`applyCanonicalHistory`](#applycanonicalhistory)
* [`applyEditorV0HomeFormattingCommand`](#applyeditorv0homeformattingcommand)
* [`applyEditorV0MailMergeCommandAction`](#applyeditorv0mailmergecommandaction)
* [`applyOutlineMasterDocumentAction`](#applyoutlinemasterdocumentaction)
* [`applyPersistentEditingComposition`](#applypersistenteditingcomposition)
* [`applyPersistentEditingStructuralCommand`](#applypersistenteditingstructuralcommand)
* [`applyQuickPartsDocumentOperation`](#applyquickpartsdocumentoperation)
* [`arrangeDocumentWindows`](#arrangedocumentwindows)
* [`checkLocalProofingWords`](#checklocalproofingwords)
* [`clearRecentDocuments`](#clearrecentdocuments)
* [`closeCurrentDocument`](#closecurrentdocument)
* [`commitAutosaveRecovery`](#commitautosaverecovery)
* [`commitUserTemplate`](#commitusertemplate)
* [`completeSaveBeforeDocumentSwitch`](#completesavebeforedocumentswitch)
* [`configureLocalProofingProvider`](#configurelocalproofingprovider)
* [`createDocumentWindow`](#createdocumentwindow)
* [`createEditableOdtCopy`](#createeditableodtcopy)
* [`createFromBuiltinTemplate`](#createfrombuiltintemplate)
* [`createFromUserTemplate`](#createfromusertemplate)
* [`createQuickPartsBuildingBlock`](#createquickpartsbuildingblock)
* [`createVersionCheckpoint`](#createversioncheckpoint)
* [`deleteQuickPartsBuildingBlock`](#deletequickpartsbuildingblock)
* [`deleteUserTemplate`](#deleteusertemplate)
* [`deleteVersion`](#deleteversion)
* [`finalizeAutosaveRecovery`](#finalizeautosaverecovery)
* [`focusDocumentWindow`](#focusdocumentwindow)
* [`getAutosaveRecoveryState`](#getautosaverecoverystate)
* [`getDocumentWindowSession`](#getdocumentwindowsession)
* [`getLocalProofingDocumentPolicy`](#getlocalproofingdocumentpolicy)
* [`getPathForFile`](#getpathforfile)
* [`inspectEditorV0HomeFormatting`](#inspecteditorv0homeformatting)
* [`inspectExternalChange`](#inspectexternalchange)
* [`invalidatePersistentEditingProductRoute`](#invalidatepersistenteditingproductroute)
* [`linkVersionHistorySaveAs`](#linkversionhistorysaveas)
* [`listDocumentWindows`](#listdocumentwindows)
* [`listFileStartTemplates`](#listfilestarttemplates)
* [`listQuickPartsBuildingBlocks`](#listquickpartsbuildingblocks)
* [`listVersionHistory`](#listversionhistory)
* [`materializeDocumentPageWindow`](#materializedocumentpagewindow)
* [`mutateLocalProofingDictionary`](#mutatelocalproofingdictionary)
* [`notifyCanonicalEditDropped`](#notifycanonicaleditdropped)
* [`notifyEditKeyDropped`](#notifyeditkeydropped)
* [`notifyPageHydrationDropped`](#notifypagehydrationdropped)
* [`notifyPersistentSaveRefused`](#notifypersistentsaverefused)
* [`notifyUserDocumentSaved`](#notifyuserdocumentsaved)
* [`onDocumentSessionSnapshot`](#ondocumentsessionsnapshot)
* [`onSaveBeforeDocumentSwitch`](#onsavebeforedocumentswitch)
* [`openMostRecentDocument`](#openmostrecentdocument)
* [`openVersion`](#openversion)
* [`prepareAutosaveRecovery`](#prepareautosaverecovery)
* [`preparePersistentSaveCopyTarget`](#preparepersistentsavecopytarget)
* [`prepareUserTemplate`](#prepareusertemplate)
* [`publishDocumentSessionSnapshot`](#publishdocumentsessionsnapshot)
* [`removeRecentDocument`](#removerecentdocument)
* [`requestDocumentWindowClose`](#requestdocumentwindowclose)
* [`resolveAutosaveRecovery`](#resolveautosaverecovery)
* [`resolveExternalChange`](#resolveexternalchange)
* [`resolveFileSessionRecovery`](#resolvefilesessionrecovery)
* [`restoreVersion`](#restoreversion)
* [`rollbackSaveAsOwnershipReservation`](#rollbacksaveasownershipreservation)
* [`runDocxCompatibility`](#rundocxcompatibility)
* [`runEditorV0MailMergeBusiness`](#runeditorv0mailmergebusiness)
* [`saveOdtAsDocxCopy`](#saveodtasdocxcopy)
* [`savePersistentEditingCheckpoint`](#savepersistenteditingcheckpoint)
* [`setPersistentEditingSelection`](#setpersistenteditingselection)
* [`setRecentDocumentPinned`](#setrecentdocumentpinned)
* [`setRestoreLastDocument`](#setrestorelastdocument)
* [`updateAutosaveRecoverySettings`](#updateautosaverecoverysettings)
* [`updateQuickPartsBuildingBlock`](#updatequickpartsbuildingblock)
* [`updateVersionMetadata`](#updateversionmetadata)
### applyCanonicalHistory
[Section titled “applyCanonicalHistory”](#applycanonicalhistory)
```ts
applyCanonicalHistory(direction: "undo" | "redo"): Promise<{ owner: "rust-session";
available: boolean;
sessionId: string | null;
documentId: string | null;
transactionOrder: number;
acceptedRevision: number;
selectionRevision: number;
publishedRevision: number;
dirty: boolean;
modelHash: string | null;
undoDepth: number;
redoDepth: number;
direction: "undo" | "redo";
projectionPath: string;
historyPreservedBySave: boolean;
sceneModelHash: string;
visibleSceneMatchesCanonicalModel: boolean;
residueCount: 0;
structuralProjection?: boolean;
structuralStartBodyBlockIndex?: number;
bridgeState?: ShellBridgeState;
transition: { transitionKind: string;
transactionOrder: number;
beforeModelHash: string;
afterModelHash: string;
paragraphIndex?: number;
beforeCaretSlotIndex?: number;
afterCaretSlotIndex?: number;
beforeSelectionStartSlotIndex?: number;
beforeSelectionEndSlotIndex?: number;
paragraphOwner?: string;
requestId?: string;
};
persistentReceipt?: BoundedLiveTextInsertResult["persistentReceipt"];
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-canonical-history`
### applyEditorV0HomeFormattingCommand
[Section titled “applyEditorV0HomeFormattingCommand”](#applyeditorv0homeformattingcommand)
```ts
applyEditorV0HomeFormattingCommand(request: EditorV0HomeFormattingRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-home-formatting-command`
### applyEditorV0MailMergeCommandAction
[Section titled “applyEditorV0MailMergeCommandAction”](#applyeditorv0mailmergecommandaction)
```ts
applyEditorV0MailMergeCommandAction(request: EditorV0MailMergeCommandRequest): Promise
```
**deprecated: always responds with a refusal** · **the refusal comes with the code MAIL\_MERGE\_LEGACY\_COMMAND\_OWNER\_RETIRED**
### applyOutlineMasterDocumentAction
[Section titled “applyOutlineMasterDocumentAction”](#applyoutlinemasterdocumentaction)
```ts
applyOutlineMasterDocumentAction(request: OutlineMasterDocumentRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-outline-master-document-action`
### applyPersistentEditingComposition
[Section titled “applyPersistentEditingComposition”](#applypersistenteditingcomposition)
```ts
applyPersistentEditingComposition(request: CompositionRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-persistent-editing-composition`
### applyPersistentEditingStructuralCommand
[Section titled “applyPersistentEditingStructuralCommand”](#applypersistenteditingstructuralcommand)
```ts
applyPersistentEditingStructuralCommand(request: EditRequest, options?: { projectionRefresh?: "full" | "page-window" | "model-only";
pageIndex?: number;
}): Promise<{ receipt: EditReceipt;
model: Record;
document: ShellLoadedDocument;
canonicalHistory: CanonicalHistoryState;
projectionRefresh: "full" | "page-window" | "model-only";
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-persistent-editing-structural-command`
### applyQuickPartsDocumentOperation
[Section titled “applyQuickPartsDocumentOperation”](#applyquickpartsdocumentoperation)
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-quick-parts-document-operation`
### arrangeDocumentWindows
[Section titled “arrangeDocumentWindows”](#arrangedocumentwindows)
```ts
arrangeDocumentWindows(): Promise<{ arranged: number;
bounds: Array<{ x: number;
y: number;
width: number;
height: number }>;
windows: ShellDocumentWindowDescriptor[];
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:arrange-document-windows`
### checkLocalProofingWords
[Section titled “checkLocalProofingWords”](#checklocalproofingwords)
```ts
checkLocalProofingWords(request: ShellProofingWordCheckRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:check-local-proofing-words`
### clearRecentDocuments
[Section titled “clearRecentDocuments”](#clearrecentdocuments)
```ts
clearRecentDocuments(): Promise<{ cleared: boolean; persisted: boolean; recentDocuments: string[]; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:clear-recent-documents`
### closeCurrentDocument
[Section titled “closeCurrentDocument”](#closecurrentdocument)
```ts
closeCurrentDocument(decision: "save" | "discard"): Promise<{ closed: boolean;
path: string | null;
decision: "save" | "discard";
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:close-current-document`
### commitAutosaveRecovery
[Section titled “commitAutosaveRecovery”](#commitautosaverecovery)
```ts
commitAutosaveRecovery(request: { recoveryId: string; stagedPath: string }): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:commit-autosave-recovery`
### commitUserTemplate
[Section titled “commitUserTemplate”](#commitusertemplate)
```ts
commitUserTemplate(request: { id: string;
title: string;
sourcePath: string;
previewText?: string;
}): ReturnType
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:commit-user-template`
### completeSaveBeforeDocumentSwitch
[Section titled “completeSaveBeforeDocumentSwitch”](#completesavebeforedocumentswitch)
```ts
completeSaveBeforeDocumentSwitch(result: { requestId: number;
saved: boolean;
savedPath: string | null;
errorMessage: string | null;
}): void
```
`web_to_host_event` · `send` · `fastdoc-shell:document-switch-save-result`
### configureLocalProofingProvider
[Section titled “configureLocalProofingProvider”](#configurelocalproofingprovider)
```ts
configureLocalProofingProvider(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:configure-local-proofing-provider`
### createDocumentWindow
[Section titled “createDocumentWindow”](#createdocumentwindow)
```ts
createDocumentWindow(): Promise<{ created: boolean;
windowId: number | null;
documentPath: string | null;
error: string | null;
windows: ShellDocumentWindowDescriptor[];
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-document-window`
### createEditableOdtCopy
[Section titled “createEditableOdtCopy”](#createeditableodtcopy)
```ts
createEditableOdtCopy(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-editable-odt-copy`
### createFromBuiltinTemplate
[Section titled “createFromBuiltinTemplate”](#createfrombuiltintemplate)
```ts
createFromBuiltinTemplate(templateId: string): Promise<{ opened: boolean;
canceled: boolean;
path: string | null;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-from-builtin-template`
### createFromUserTemplate
[Section titled “createFromUserTemplate”](#createfromusertemplate)
```ts
createFromUserTemplate(templateId: string): Promise<{ opened: boolean;
canceled: boolean;
path: string | null;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-from-user-template`
### createQuickPartsBuildingBlock
[Section titled “createQuickPartsBuildingBlock”](#createquickpartsbuildingblock)
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-quick-parts-building-block`
### createVersionCheckpoint
[Section titled “createVersionCheckpoint”](#createversioncheckpoint)
```ts
createVersionCheckpoint(request: { reason: ShellVersionHistoryEntry["reason"];
name?: string | null;
pinned?: boolean;
recoverySessionId?: string | null;
}): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:create-version-checkpoint`
### deleteQuickPartsBuildingBlock
[Section titled “deleteQuickPartsBuildingBlock”](#deletequickpartsbuildingblock)
`web_to_host_request_response` · `invoke` · `fastdoc-shell:delete-quick-parts-building-block`
### deleteUserTemplate
[Section titled “deleteUserTemplate”](#deleteusertemplate)
```ts
deleteUserTemplate(templateId: string): ReturnType
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:delete-user-template`
### deleteVersion
[Section titled “deleteVersion”](#deleteversion)
```ts
deleteVersion(request: { versionId: string; confirmed: boolean }): Promise<{ deleted: true }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:delete-version`
### finalizeAutosaveRecovery
[Section titled “finalizeAutosaveRecovery”](#finalizeautosaverecovery)
```ts
finalizeAutosaveRecovery(request: { recoveryId: string;
action: "save" | "save-as" | "discard" | "cancel";
savedPath?: string | null;
}): Promise<{ finalized: boolean;
preserved: boolean }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:finalize-autosave-recovery`
### focusDocumentWindow
[Section titled “focusDocumentWindow”](#focusdocumentwindow)
```ts
focusDocumentWindow(windowId: number): Promise<{ focused: boolean;
windows: ShellDocumentWindowDescriptor[];
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:focus-document-window`
### getAutosaveRecoveryState
[Section titled “getAutosaveRecoveryState”](#getautosaverecoverystate)
```ts
getAutosaveRecoveryState(): Promise<{ sessionId: string;
settings: ShellAutosaveRecoverySettings;
candidates: ShellAutosaveRecoveryCandidate[] }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-autosave-recovery-state`
### getDocumentWindowSession
[Section titled “getDocumentWindowSession”](#getdocumentwindowsession)
```ts
getDocumentWindowSession(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-document-window-session`
### getLocalProofingDocumentPolicy
[Section titled “getLocalProofingDocumentPolicy”](#getlocalproofingdocumentpolicy)
```ts
getLocalProofingDocumentPolicy(request: { documentPath: string }): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-local-proofing-document-policy`
### getPathForFile
[Section titled “getPathForFile”](#getpathforfile)
```ts
getPathForFile(file: { readonly name: string }): string
```
**a direct Electron adapter, not a core command** · **runs synchronously and never reaches the core**
### inspectEditorV0HomeFormatting
[Section titled “inspectEditorV0HomeFormatting”](#inspecteditorv0homeformatting)
```ts
inspectEditorV0HomeFormatting(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:inspect-editor-v0-home-formatting`
### inspectExternalChange
[Section titled “inspectExternalChange”](#inspectexternalchange)
```ts
inspectExternalChange(request: { dirty: boolean }): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:inspect-external-change`
### invalidatePersistentEditingProductRoute
[Section titled “invalidatePersistentEditingProductRoute”](#invalidatepersistenteditingproductroute)
```ts
invalidatePersistentEditingProductRoute(reason: string): Promise<{ invalidated: true }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:invalidate-persistent-editing-product-route`
### linkVersionHistorySaveAs
[Section titled “linkVersionHistorySaveAs”](#linkversionhistorysaveas)
```ts
linkVersionHistorySaveAs(request: { previousPath: string; nextPath: string }): Promise<{ linked: true }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:link-version-history-save-as`
### listDocumentWindows
[Section titled “listDocumentWindows”](#listdocumentwindows)
```ts
listDocumentWindows(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:list-document-windows`
### listFileStartTemplates
[Section titled “listFileStartTemplates”](#listfilestarttemplates)
```ts
listFileStartTemplates(): Promise<{ builtInTemplates: Array<{ id: "blank" | "letter" | "report" | "meeting-notes";
title: string;
description: string;
previewText: string;
}>;
userTemplates: Array<{ id: string;
title: string;
sourcePath: string;
previewText: string;
createdAt: string;
}>;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:list-file-start-templates`
### listQuickPartsBuildingBlocks
[Section titled “listQuickPartsBuildingBlocks”](#listquickpartsbuildingblocks)
`web_to_host_request_response` · `invoke` · `fastdoc-shell:list-quick-parts-building-blocks`
### listVersionHistory
[Section titled “listVersionHistory”](#listversionhistory)
```ts
listVersionHistory(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:list-version-history`
### materializeDocumentPageWindow
[Section titled “materializeDocumentPageWindow”](#materializedocumentpagewindow)
```ts
materializeDocumentPageWindow(request: { path: string;
pageIndex: number;
}): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:materialize-document-page-window`
### mutateLocalProofingDictionary
[Section titled “mutateLocalProofingDictionary”](#mutatelocalproofingdictionary)
```ts
mutateLocalProofingDictionary(request: { action: "add" | "remove" | "reset";
word?: string | null;
}): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:mutate-local-proofing-dictionary`
### notifyCanonicalEditDropped
[Section titled “notifyCanonicalEditDropped”](#notifycanonicaleditdropped)
```ts
notifyCanonicalEditDropped(payload: { code: string; requestId: string; commandType: string; }): void
```
`web_to_host_event` · `send` · `fastdoc-shell:canonical-edit-dropped`
### notifyEditKeyDropped
[Section titled “notifyEditKeyDropped”](#notifyeditkeydropped)
```ts
notifyEditKeyDropped(payload: { code: string;
inputType: string;
selectionShape: string;
inputRoute: string;
contextRefusal: string;
pressIndex: number;
}): void
```
`web_to_host_event` · `send` · `fastdoc-shell:edit-key-dropped`
### notifyPageHydrationDropped
[Section titled “notifyPageHydrationDropped”](#notifypagehydrationdropped)
```ts
notifyPageHydrationDropped(payload: { code: string; stage: string }): void
```
`web_to_host_event` · `send` · `fastdoc-shell:page-hydration-dropped`
### notifyPersistentSaveRefused
[Section titled “notifyPersistentSaveRefused”](#notifypersistentsaverefused)
```ts
notifyPersistentSaveRefused(payload: { code: string; requestId: string; saveAs: boolean; }): void
```
`web_to_host_event` · `send` · `fastdoc-shell:persistent-save-refused`
### notifyUserDocumentSaved
[Section titled “notifyUserDocumentSaved”](#notifyuserdocumentsaved)
```ts
notifyUserDocumentSaved(savedPath: string): Promise<{ recorded: boolean }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:user-document-saved`
### onDocumentSessionSnapshot
[Section titled “onDocumentSessionSnapshot”](#ondocumentsessionsnapshot)
```ts
onDocumentSessionSnapshot(callback: (snapshot: ShellDocumentSessionSnapshot) => void): () => void
```
`host_to_web_event` · `on` · `fastdoc-shell:document-session-snapshot`
### onSaveBeforeDocumentSwitch
[Section titled “onSaveBeforeDocumentSwitch”](#onsavebeforedocumentswitch)
```ts
onSaveBeforeDocumentSwitch(callback: (request: { requestId: number }) => void): () => void
```
`host_to_web_event` · `on` · `fastdoc-shell:save-before-document-switch`
### openMostRecentDocument
[Section titled “openMostRecentDocument”](#openmostrecentdocument)
```ts
openMostRecentDocument(): Promise<{ opened: boolean; canceled: boolean; path: string | null; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:open-most-recent-document`
### openVersion
[Section titled “openVersion”](#openversion)
```ts
openVersion(request: { versionId: string;
mode: "preview" | "read-only" | "compare";
}): Promise<{ opened: true;
mode: "preview" | "read-only" | "compare";
snapshotPath: string;
sourceHash: string }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:open-version`
### prepareAutosaveRecovery
[Section titled “prepareAutosaveRecovery”](#prepareautosaverecovery)
```ts
prepareAutosaveRecovery(request: { recoveryId?: string | null;
documentId?: string | null;
displayName: string;
sourcePath: string | null;
serializationPath: string;
}): Promise<{ recoveryId: string;
documentId: string;
stagingPath: string;
settings: ShellAutosaveRecoverySettings }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:prepare-autosave-recovery`
### preparePersistentSaveCopyTarget
[Section titled “preparePersistentSaveCopyTarget”](#preparepersistentsavecopytarget)
```ts
preparePersistentSaveCopyTarget(request?: { outputKind?: string;
saveAsPath?: string | null;
}): Promise<{ status: "canceled" | "reserved";
canceled: boolean;
path: string | null;
reservationId: string | null;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:prepare-persistent-save-copy-target`
### prepareUserTemplate
[Section titled “prepareUserTemplate”](#prepareusertemplate)
```ts
prepareUserTemplate(request: { title: string;
previewText?: string }): Promise<{ id: string;
title: string;
targetPath: string;
previewText: string;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:prepare-user-template`
### publishDocumentSessionSnapshot
[Section titled “publishDocumentSessionSnapshot”](#publishdocumentsessionsnapshot)
```ts
publishDocumentSessionSnapshot(snapshot: ShellDocumentSessionSnapshot): Promise<{ accepted: boolean;
revision: number;
recipients: number;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:publish-document-session-snapshot`
### removeRecentDocument
[Section titled “removeRecentDocument”](#removerecentdocument)
```ts
removeRecentDocument(path: string): Promise<{ removed: boolean;
persisted: boolean;
recentDocuments: string[];
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:remove-recent-document`
### requestDocumentWindowClose
[Section titled “requestDocumentWindowClose”](#requestdocumentwindowclose)
```ts
requestDocumentWindowClose(): Promise<{ requested: boolean; remaining: number; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:request-document-window-close`
### resolveAutosaveRecovery
[Section titled “resolveAutosaveRecovery”](#resolveautosaverecovery)
```ts
resolveAutosaveRecovery(request: { recoveryId: string;
action: "recover" | "open-copy" | "delete" | "dismiss";
outputPath?: string | null;
}): Promise<{ action: string;
documentPath: string | null;
candidates: ShellAutosaveRecoveryCandidate[] }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:resolve-autosave-recovery`
### resolveExternalChange
[Section titled “resolveExternalChange”](#resolveexternalchange)
```ts
resolveExternalChange(request: { decision: "keep-current" | "keep-mine" | "reload-disk" | "save-mine-copy" | "compare" | "cancel";
revision: number;
}): Promise<{ resolved: boolean;
stale: boolean;
decision: string;
requiresRendererSaveAs: boolean;
documentPath: string | null;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:resolve-external-change`
### resolveFileSessionRecovery
[Section titled “resolveFileSessionRecovery”](#resolvefilesessionrecovery)
```ts
resolveFileSessionRecovery(request: { decision: "recover" | "decline" | "open-original";
}): Promise<{ state: ShellFileSessionRecoveryState;
recovered: boolean;
declined: boolean;
openedOriginal: boolean;
documentPath: string | null;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:resolve-file-session-recovery`
### restoreVersion
[Section titled “restoreVersion”](#restoreversion)
```ts
restoreVersion(request: { versionId: string;
mode: "current" | "copy";
outputPath?: string | null;
}): Promise<{ restored: boolean;
canceled: boolean;
mode: "current" | "copy";
outputPath: string | null }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:restore-version`
### rollbackSaveAsOwnershipReservation
[Section titled “rollbackSaveAsOwnershipReservation”](#rollbacksaveasownershipreservation)
```ts
rollbackSaveAsOwnershipReservation(request: { reservationId: string;
targetPath: string;
}): Promise<{ rolledBack: boolean }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:rollback-save-as-ownership-reservation`
### runDocxCompatibility
[Section titled “runDocxCompatibility”](#rundocxcompatibility)
```ts
runDocxCompatibility(request: { action: "check" | "inspect" | "repair-copy";
sourcePath?: string | null;
selectSource?: boolean;
}): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:run-docx-compatibility`
### runEditorV0MailMergeBusiness
[Section titled “runEditorV0MailMergeBusiness”](#runeditorv0mailmergebusiness)
```ts
runEditorV0MailMergeBusiness(request: Record): Promise>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:run-editor-v0-mail-merge-business`
### saveOdtAsDocxCopy
[Section titled “saveOdtAsDocxCopy”](#saveodtasdocxcopy)
```ts
saveOdtAsDocxCopy(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:save-odt-as-docx-copy`
### savePersistentEditingCheckpoint
[Section titled “savePersistentEditingCheckpoint”](#savepersistenteditingcheckpoint)
```ts
savePersistentEditingCheckpoint(request?: { saveAs?: boolean;
targetPath?: string;
saveAsOwnershipReservationId?: string;
}): Promise< BoundedLiveTextInsertResult | null >
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:save-persistent-editing-checkpoint`
### setPersistentEditingSelection
[Section titled “setPersistentEditingSelection”](#setpersistenteditingselection)
```ts
setPersistentEditingSelection(request: SelectionUpdateRequest): Promise
setPersistentEditingSelection(request: SelectionUpdateRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:set-persistent-editing-selection`
### setRecentDocumentPinned
[Section titled “setRecentDocumentPinned”](#setrecentdocumentpinned)
```ts
setRecentDocumentPinned(path: string, pinned: boolean): Promise<{ pinned: boolean; persisted: boolean; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:set-recent-document-pinned`
### setRestoreLastDocument
[Section titled “setRestoreLastDocument”](#setrestorelastdocument)
```ts
setRestoreLastDocument(enabled: boolean): Promise<{ enabled: boolean; persisted: boolean; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:set-restore-last-document`
### updateAutosaveRecoverySettings
[Section titled “updateAutosaveRecoverySettings”](#updateautosaverecoverysettings)
```ts
updateAutosaveRecoverySettings(request: Partial> & { retention?: Partial; }): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:update-autosave-recovery-settings`
### updateQuickPartsBuildingBlock
[Section titled “updateQuickPartsBuildingBlock”](#updatequickpartsbuildingblock)
`web_to_host_request_response` · `invoke` · `fastdoc-shell:update-quick-parts-building-block`
### updateVersionMetadata
[Section titled “updateVersionMetadata”](#updateversionmetadata)
```ts
updateVersionMetadata(request: { versionId: string;
name?: string | null;
pinned?: boolean;
}): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:update-version-metadata`
# window.fastdocShell · document
> Working with the current document: opening, image export, comparison, printing. Methods: 35.
Working with the current document: opening, image export, comparison, printing. Methods on this page: 35.
Internal API
`window.fastdocShell` is only available inside the desktop SumDoc window. For external integration, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
How to read the line under the signature
Under each method is a line of four values — for example `web_to_host_request_response` · `invoke` · `fastdoc-shell:get-state` · `capability=document`.
| Value | What it means |
| ------------------------------ | ------------------------------------------------------------------------------- |
| `web_to_host_request_response` | The editor window asks the application shell and waits for a response |
| `web_to_host_event` | The editor window notifies the shell and doesn’t wait for a response |
| `host_to_web_event` | The shell notifies the editor window; you subscribe to these methods |
| `invoke`, `send`, `on` | Exchange method: request with a response, send without a response, subscription |
| `fastdoc-shell:…` | The name of the channel the message travels on |
| `capability=…` | The capability group the method belongs to |
All three sets of values are declared in the shell contract: directions in `BridgeDirection`, domains in `ShellContractDomain`, capabilities in `ShellCapability`. The last set doesn’t match the domains: smoke runs and the release center have no capability of their own, so their methods are assigned to `internal` or `document`.
The first word of the name tells you what the method does
| Start of the name | What happens |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apply…` | Performs an action and changes the document. The response says what happened |
| `compute…CommandState` | Changes nothing: answers whether the action can be performed now (`canApply`) and why not (`disabledReason`). The shell uses this response to decide whether to enable the button |
| `run…` | Runs an entire scenario — a compatibility check or a release-readiness check |
| `get…`, `list…` | Read state and change nothing |
| `set…`, `update…` | Change a setting, not the document’s content |
| `create…`, `delete…` | Create and delete — a version, a comment, a checkpoint |
| `open…` | Opens — the document, one of its versions, a link in an external program |
| `resolve…` | Two different meanings, visible from the rest of the name: for comments, it marks one resolved; for recovery and external changes, it resolves a conflict by choosing whose edit to keep |
| `notify…` | Notifies the shell of an event and doesn’t wait for a response |
| `on…` | Subscription: the shell calls you when the event happens |
The `apply…` and `compute…CommandState` pairs go together: first you ask for the state, then you apply. A method ending in `Copy` is a special case, covered below.
## Contract methods missing from the source document
[Section titled “Contract methods missing from the source document”](#contract-methods-missing-from-the-source-document)
These five methods are declared in the shell contract but didn’t make it into the document the reference was compiled from. Their signatures are taken directly from the contract.
```ts
openDocxDialog(): Promise<{ canceled: boolean; path: string | null }>
reloadCurrentDocx(): Promise<{ reloaded: boolean; canceled: boolean }>
createA4DefaultNewDocument(): Promise<{ opened: boolean; canceled: boolean; path: string | null }>
openFixture(fixtureKey: string): Promise<{ opened: boolean; canceled: boolean; path: string | null }>
openCompareFixture(fixtureKey: string): Promise<{ opened: boolean }>
```
The first three are ordinary document operations: the open dialog, re-reading the current file, and creating a new default one. The last two open samples for internal build checks and aren’t needed for embedding.
Ten more methods appeared in the contract after the document — for collaborative editing, the delta frame, and the exact page count. The signatures are also from the contract:
```ts
getPersistentDispatchIdentity(): Promise
savePersistentRecoverySnapshot(request: { snapshotPath: string; requestId?: string }): Promise<{ sessionId: string; documentId: string; requestId: string; acceptedRevision: number; publishedRevision: number; snapshotPath: string; snapshotHash: string; dirty: boolean }>
countDocumentPagesExactly(request: { path: string }): Promise
exactPageCountStatus(request: { path: string }): Promise
onCanonicalSceneRefreshed(callback: (event: ShellCanonicalSceneRefreshed) => void): () => void
onDocumentPatch(callback: (patch: ShellDocumentPatch) => void): () => void
declareRendererCapabilities(capabilities: ShellRendererCapabilities): void
notifyDocumentPatchOutcome(outcome: ShellDocumentPatchOutcome): void
onProbeUnsavedState(callback: (request: { requestId: number }) => void): () => void
completeUnsavedStateProbe(result: { requestId: number; unsaved: boolean }): void
```
* `getPersistentDispatchIdentity` — five fields about whose edit is first in the queue, instead of a whole state frame; an old shell responds with a refusal, and then the page takes `getState()`.
* `savePersistentRecoverySnapshot` — a recovery snapshot at the given path; the response contains the accepted and published revisions and the snapshot hash.
* `countDocumentPagesExactly` and `exactPageCountStatus` — count the pages exactly on a person’s request and find out how the count ended. `counted: false` with a named reason is a valid answer: the number remains an estimate.
* `onCanonicalSceneRefreshed` — the scene changed not because of this person’s action: a neighbor’s edit or a deferred read of projections after your own typing.
* `onDocumentPatch`, `declareRendererCapabilities`, `notifyDocumentPatchOutcome` — a delta frame for a neighbor’s edit instead of the whole state: the page declares that it can accept one, receives the frame, and reports whether it applied it.
* `onProbeUnsavedState` and `completeUnsavedStateProbe` — the shell asks the page whether there is anything unsaved and gets the answer by `requestId`.
What `Copy` at the end of a name means
This kind of method doesn’t change the open document. It creates a file next to it and applies the action to that copy: the open document and its history stay as they were. Where to write it is set by the `outputPath` field; without it, the shell picks a path itself, next to the source file.
So “accepting a change” with `Copy` isn’t an in-place edit — it produces a second file with the change accepted. Editing the open document goes through a different path — session commands, `mutate` and `apply-text-transaction`: [Rust Session Protocol](/reference/sumdoc/session-protocol/).
**Methods on this page — 20**
* [`clearCompareDocx`](#clearcomparedocx)
* [`copyCurrentImageWorkflowImage`](#copycurrentimageworkflowimage)
* [`copyShareText`](#copysharetext)
* [`exportCurrentDocumentImages`](#exportcurrentdocumentimages)
* [`exportCurrentImageWorkflowImages`](#exportcurrentimageworkflowimages)
* [`getCurrentDocumentTruth`](#getcurrentdocumenttruth)
* [`getCurrentDrawingMlWorkflow`](#getcurrentdrawingmlworkflow)
* [`getCurrentImageWorkflow`](#getcurrentimageworkflow)
* [`getCurrentImageWorkflowExportPlan`](#getcurrentimageworkflowexportplan)
* [`notifyDocumentRendered`](#notifydocumentrendered)
* [`openCompareDocxPath`](#opencomparedocxpath)
* [`openDocxPath`](#opendocxpath)
* [`openEditorV0UserCopyDialog`](#openeditorv0usercopydialog)
* [`pathExists`](#pathexists)
* [`prepareEditorV0QuickPrintPlan`](#prepareeditorv0quickprintplan)
* [`reopenEditorV0TextContinueCopy`](#reopeneditorv0textcontinuecopy)
* [`selectCurrentImageWorkflowReplacementImage`](#selectcurrentimageworkflowreplacementimage)
* [`selectEditorV0InsertImageObjectImage`](#selecteditorv0insertimageobjectimage)
* [`selectEditorV0InsertObjectTextFileSource`](#selecteditorv0insertobjecttextfilesource)
* [`writeJsonFile`](#writejsonfile)
### clearCompareDocx
[Section titled “clearCompareDocx”](#clearcomparedocx)
```ts
clearCompareDocx(): Promise<{ cleared: boolean }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:clear-compare-docx` · `capability=document`
### copyCurrentImageWorkflowImage
[Section titled “copyCurrentImageWorkflowImage”](#copycurrentimageworkflowimage)
```ts
copyCurrentImageWorkflowImage(request?: ShellExportCurrentImageWorkflowImagesRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:copy-current-image-workflow-image` · `capability=document`
### copyShareText
[Section titled “copyShareText”](#copysharetext)
```ts
copyShareText(text: string): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:copy-share-text` · `capability=document`
### exportCurrentDocumentImages
[Section titled “exportCurrentDocumentImages”](#exportcurrentdocumentimages)
```ts
exportCurrentDocumentImages(request: ShellExportCurrentDocumentImagesRequest & { renderedCanvas: ShellSaveRenderedCanvasImagesRequest; }): Promise
exportCurrentDocumentImages(request?: ShellExportCurrentDocumentImagesRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:export-current-document-images` · `capability=document`
### exportCurrentImageWorkflowImages
[Section titled “exportCurrentImageWorkflowImages”](#exportcurrentimageworkflowimages)
```ts
exportCurrentImageWorkflowImages(request?: ShellExportCurrentImageWorkflowImagesRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:export-current-image-workflow-images` · `capability=document`
### getCurrentDocumentTruth
[Section titled “getCurrentDocumentTruth”](#getcurrentdocumenttruth)
```ts
getCurrentDocumentTruth(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-current-document-truth` · `capability=document`
### getCurrentDrawingMlWorkflow
[Section titled “getCurrentDrawingMlWorkflow”](#getcurrentdrawingmlworkflow)
```ts
getCurrentDrawingMlWorkflow(): Promise>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-current-drawingml-workflow` · `capability=document`
### getCurrentImageWorkflow
[Section titled “getCurrentImageWorkflow”](#getcurrentimageworkflow)
```ts
getCurrentImageWorkflow(): Promise>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-current-image-workflow` · `capability=document`
### getCurrentImageWorkflowExportPlan
[Section titled “getCurrentImageWorkflowExportPlan”](#getcurrentimageworkflowexportplan)
```ts
getCurrentImageWorkflowExportPlan(request?: ShellCurrentImageWorkflowExportPlanRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:get-current-image-workflow-export-plan` · `capability=document`
### notifyDocumentRendered
[Section titled “notifyDocumentRendered”](#notifydocumentrendered)
```ts
notifyDocumentRendered(renderedPath: string | null): void
```
`web_to_host_event` · `send` · `fastdoc-shell:document-rendered` · `capability=document`
### openCompareDocxPath
[Section titled “openCompareDocxPath”](#opencomparedocxpath)
```ts
openCompareDocxPath(path: string): Promise<{ opened: boolean; path: string }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:open-compare-docx-path` · `capability=document`
### openDocxPath
[Section titled “openDocxPath”](#opendocxpath)
```ts
openDocxPath(path: string, source?: "file-menu" | "drop" | "recent" | "outline-history"): Promise<{ opened: boolean;
canceled: boolean;
path: string | null;
reentryReceipt?: FileSessionReentryReceipt;
}>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:open-docx-path` · `capability=document`
### openEditorV0UserCopyDialog
[Section titled “openEditorV0UserCopyDialog”](#openeditorv0usercopydialog)
```ts
openEditorV0UserCopyDialog(request?: { path?: string | null;
}): Promise<{ canceled: boolean;
path: string | null;
text: string | null }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:open-editor-v0-user-copy-dialog` · `capability=document`
### pathExists
[Section titled “pathExists”](#pathexists)
```ts
pathExists(path: string): Promise<{ path: string; exists: boolean }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:path-exists` · `capability=document`
### prepareEditorV0QuickPrintPlan
[Section titled “prepareEditorV0QuickPrintPlan”](#prepareeditorv0quickprintplan)
```ts
prepareEditorV0QuickPrintPlan(request?: EditorV0QuickPrintPlanRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:prepare-editor-v0-quick-print-plan` · `capability=document`
### reopenEditorV0TextContinueCopy
[Section titled “reopenEditorV0TextContinueCopy”](#reopeneditorv0textcontinuecopy)
```ts
reopenEditorV0TextContinueCopy(request?: { outputKind?: |
| "editor-v0-text-continue-commands"
| "editor-v0-undo"
| "editor-v0-redo"
| "editor-v0-save-as-dialog"
| "editor-v0-save-state"
| "editor-v0-nonblocking-typing"
| "editor-v0-double-space-period-autocorrect"
| "editor-v0-selection-replace"
| "editor-v0-selection-edit-2"
| "editor-v0-selection-edit-3"
| "editor-v0-selection-edit-4"
| "editor-v0-save-open-loop"
| "editor-v0-autosave-toggle-action"
| "editor-v0-open-saved-copy-ui"
| "editor-v0-multistep-undo"
| "editor-v0-save-copy-shortcuts"
| "editor-v0-save-copy-destination-polish"
| "editor-v0-save-copy-as-user-path"
| "editor-v0-quick-save-copy-action"
| "editor-v0-quick-open-copy-action"
| "editor-v0-quick-open-docx-action"
| "editor-v0-open-user-copy-dialog"
| "editor-v0-save-open-recent-copy"
| "editor-v0-formatted-run-edit"
| "editor-v0-formatted-selection-edit"
| "editor-v0-formatted-text-tranche"
| "editor-v0-formatted-selection-ui"
| "editor-v0-formatted-selection-controls"
| "editor-v0-run-boundary-edit"
| "editor-v0-run-boundary-edit-controls"
| "editor-v0-run-boundary-insert-controls"
| "editor-v0-run-boundary-text-input-controls"
| "editor-v0-cross-run-selection-input"
| "editor-v0-paragraph-split-merge"
| "editor-v0-paragraph-text-flow"
| "editor-v0-paragraph-text-flow-commands"
| "editor-v0-styled-paragraph-flow"
| "editor-v0-styled-paragraph-merge-controls"
| "editor-v0-styled-paragraph-text-after-merge"
| "editor-v0-paragraph-boundary-insert"
| "editor-v0-paragraph-boundary-delete-controls"
| "editor-v0-user-paragraph-boundary-edit"
| "editor-v0-user-paragraph-multiline-flow"
| "editor-v0-styled-multiline-boundary-edit"
| "editor-v0-toolbar-format-commands-bounded"
| "editor-v0-toolbar-format-commands-italic-blue"
| "editor-v0-home-chr-tranche2-market"
| "editor-v0-font-family-size-commands"
| "editor-v0-text-case-toolbar-command"
| "editor-v0-format-toolbar-multi-command-chain"
| "editor-v0-format-clear-command"
| "editor-v0-format-clear-partial-selection"
| "editor-v0-format-apply-partial-selection"
| "editor-v0-mixed-format-selection-workflow"
| "editor-v0-mixed-format-clear-or-paste-rules"
| "editor-v0-mixed-format-paste-rules"
| "editor-v0-clipboard-copy-cut-paste"; path?: string | null; transientTableEdit?: boolean; canonicalHistoryTransitionKind?: | "table-cell-semantic-undo" | "table-cell-semantic-redo"; expectedClipboardFingerprint?: string | null; expectedDocumentPath?: string | null; canonicalOwnerReceipt?: { schema: "fastdoc.persistent-save-checkpoint-receipt.v1";
sessionId: string;
documentId: string;
acceptedRevision: number;
publishedModelHash: string;
targetHash: string;
targetIdentity: PublishedTargetIdentity;
} | null; }): Promise<{ opened: boolean; path: string; text?: string | null }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:reopen-editor-v0-text-continue-copy` · `capability=document`
### selectCurrentImageWorkflowReplacementImage
[Section titled “selectCurrentImageWorkflowReplacementImage”](#selectcurrentimageworkflowreplacementimage)
```ts
selectCurrentImageWorkflowReplacementImage(): Promise<{ canceled: boolean; path: string | null; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:select-current-image-workflow-replacement-image` · `capability=document`
### selectEditorV0InsertImageObjectImage
[Section titled “selectEditorV0InsertImageObjectImage”](#selecteditorv0insertimageobjectimage)
```ts
selectEditorV0InsertImageObjectImage(): Promise<{ canceled: boolean; path: string | null; }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:select-editor-v0-insert-image-object-image` · `capability=document`
### selectEditorV0InsertObjectTextFileSource
[Section titled “selectEditorV0InsertObjectTextFileSource”](#selecteditorv0insertobjecttextfilesource)
```ts
selectEditorV0InsertObjectTextFileSource(): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:select-editor-v0-insert-object-text-file-source` · `capability=document`
### writeJsonFile
[Section titled “writeJsonFile”](#writejsonfile)
```ts
writeJsonFile(path: string, data: unknown): Promise<{ path: string; written: boolean; bytes: number }>
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:write-json-file` · `capability=document`
# window.fastdocShell · edit
> The largest family: text editing, formatting, tables, clipboard, history. Methods: 118.
The largest family: text editing, formatting, tables, clipboard, history. Methods on this page: 118.
Internal API
`window.fastdocShell` is only available inside the desktop SumDoc window. For external integration, use the [Rust Session Protocol](/reference/sumdoc/session-protocol/) or the [browser surface interface](/reference/sumdoc/surface-api/).
How to read the line under the signature
Under each method is a line of four values — for example `web_to_host_request_response` · `invoke` · `fastdoc-shell:get-state` · `capability=document`.
| Value | What it means |
| ------------------------------ | ------------------------------------------------------------------------------- |
| `web_to_host_request_response` | The editor window asks the application shell and waits for a response |
| `web_to_host_event` | The editor window notifies the shell and doesn’t wait for a response |
| `host_to_web_event` | The shell notifies the editor window; you subscribe to these methods |
| `invoke`, `send`, `on` | Exchange method: request with a response, send without a response, subscription |
| `fastdoc-shell:…` | The name of the channel the message travels on |
| `capability=…` | The capability group the method belongs to |
All three sets of values are declared in the shell contract: directions in `BridgeDirection`, domains in `ShellContractDomain`, capabilities in `ShellCapability`. The last set doesn’t match the domains: smoke runs and the release center have no capability of their own, so their methods are assigned to `internal` or `document`.
The first word of the name tells you what the method does
| Start of the name | What happens |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apply…` | Performs an action and changes the document. The response says what happened |
| `compute…CommandState` | Changes nothing: answers whether the action can be performed now (`canApply`) and why not (`disabledReason`). The shell uses this response to decide whether to enable the button |
| `run…` | Runs an entire scenario — a compatibility check or a release-readiness check |
| `get…`, `list…` | Read state and change nothing |
| `set…`, `update…` | Change a setting, not the document’s content |
| `create…`, `delete…` | Create and delete — a version, a comment, a checkpoint |
| `open…` | Opens — the document, one of its versions, a link in an external program |
| `resolve…` | Two different meanings, visible from the rest of the name: for comments, it marks one resolved; for recovery and external changes, it resolves a conflict by choosing whose edit to keep |
| `notify…` | Notifies the shell of an event and doesn’t wait for a response |
| `on…` | Subscription: the shell calls you when the event happens |
The `apply…` and `compute…CommandState` pairs go together: first you ask for the state, then you apply. A method ending in `Copy` is a special case, covered below.
Methods on this page — 118
* [`applyD36CombinedSectionCommand`](#applyd36combinedsectioncommand)
* [`applyD36HeaderFooterEditModeSave`](#applyd36headerfootereditmodesave)
* [`applyD36HeaderFooterMarketWorkflow`](#applyd36headerfootermarketworkflow)
* [`applyD36HeaderFooterRemove`](#applyd36headerfooterremove)
* [`applyD36HyphenationWriteback`](#applyd36hyphenationwriteback)
* [`applyD36LineNumbersContinuousWriteback`](#applyd36linenumberscontinuouswriteback)
* [`applyD36SectionPresetVisibleWorkflow`](#applyd36sectionpresetvisibleworkflow)
* [`applyDesignToolsWriteback`](#applydesigntoolswriteback)
* [`applyEditorV0AddTextAction`](#applyeditorv0addtextaction)
* [`applyEditorV0BibliographyCommandAction`](#applyeditorv0bibliographycommandaction)
* [`applyEditorV0BibliographyStyleAction`](#applyeditorv0bibliographystyleaction)
* [`applyEditorV0ContentControlsAction`](#applyeditorv0contentcontrolsaction)
* [`applyEditorV0ConvertTextToTable`](#applyeditorv0converttexttotable)
* [`applyEditorV0DeleteDrawingObjectAction`](#applyeditorv0deletedrawingobjectaction)
* [`applyEditorV0DistributeDrawingObjectsAction`](#applyeditorv0distributedrawingobjectsaction)
* [`applyEditorV0Doc001005MarketRouteAction`](#applyeditorv0doc001005marketrouteaction)
* [`applyEditorV0Doc006015MarketRouteAction`](#applyeditorv0doc006015marketrouteaction)
* [`applyEditorV0Doc016025MarketRouteAction`](#applyeditorv0doc016025marketrouteaction)
* [`applyEditorV0EditDrawingObjectTextAction`](#applyeditorv0editdrawingobjecttextaction)
* [`applyEditorV0EditEquationObjectAction`](#applyeditorv0editequationobjectaction)
* [`applyEditorV0EditingReplaceAllCommand`](#applyeditorv0editingreplaceallcommand)
* [`applyEditorV0EditingReplaceFirstCommand`](#applyeditorv0editingreplacefirstcommand)
* [`applyEditorV0FormsFieldsBusinessAction`](#applyeditorv0formsfieldsbusinessaction)
* [`applyEditorV0GroupDrawingObjectsAction`](#applyeditorv0groupdrawingobjectsaction)
* [`applyEditorV0IndexAuthoritiesCommandAction`](#applyeditorv0indexauthoritiescommandaction)
* [`applyEditorV0InsertBookmarkAction`](#applyeditorv0insertbookmarkaction)
* [`applyEditorV0InsertBreakAction`](#applyeditorv0insertbreakaction)
* [`applyEditorV0InsertCrossReferenceAction`](#applyeditorv0insertcrossreferenceaction)
* [`applyEditorV0InsertDateFieldAction`](#applyeditorv0insertdatefieldaction)
* [`applyEditorV0InsertDateTimeFieldAction`](#applyeditorv0insertdatetimefieldaction)
* [`applyEditorV0InsertDropCapAction`](#applyeditorv0insertdropcapaction)
* [`applyEditorV0InsertEndnoteAction`](#applyeditorv0insertendnoteaction)
* [`applyEditorV0InsertEquationObjectAction`](#applyeditorv0insertequationobjectaction)
* [`applyEditorV0InsertFootnoteAction`](#applyeditorv0insertfootnoteaction)
* [`applyEditorV0InsertHyperlinkAction`](#applyeditorv0inserthyperlinkaction)
* [`applyEditorV0InsertImageObjectAction`](#applyeditorv0insertimageobjectaction)
* [`applyEditorV0InsertShapeObjectAction`](#applyeditorv0insertshapeobjectaction)
* [`applyEditorV0InsertTableCaptionAction`](#applyeditorv0inserttablecaptionaction)
* [`applyEditorV0InsertTextBoxObjectAction`](#applyeditorv0inserttextboxobjectaction)
* [`applyEditorV0InsertTocAction`](#applyeditorv0inserttocaction)
* [`applyEditorV0ManageNoteAction`](#applyeditorv0managenoteaction)
* [`applyEditorV0MoveDrawingObjectAction`](#applyeditorv0movedrawingobjectaction)
* [`applyEditorV0ParagraphBorderCommand`](#applyeditorv0paragraphbordercommand)
* [`applyEditorV0ParagraphFillCommand`](#applyeditorv0paragraphfillcommand)
* [`applyEditorV0ParagraphLayoutBatchCommand`](#applyeditorv0paragraphlayoutbatchcommand)
* [`applyEditorV0ParagraphLayoutCommand`](#applyeditorv0paragraphlayoutcommand)
* [`applyEditorV0ParagraphSortCommand`](#applyeditorv0paragraphsortcommand)
* [`applyEditorV0ParagraphStructure`](#applyeditorv0paragraphstructure)
* [`applyEditorV0RemoveTocAction`](#applyeditorv0removetocaction)
* [`applyEditorV0ResizeDrawingObjectAction`](#applyeditorv0resizedrawingobjectaction)
* [`applyEditorV0SectionPageMarginsCommand`](#applyeditorv0sectionpagemarginscommand)
* [`applyEditorV0SectionPageSetupPreset`](#applyeditorv0sectionpagesetuppreset)
* [`applyEditorV0SetDrawingObjectAnchorLockAction`](#applyeditorv0setdrawingobjectanchorlockaction)
* [`applyEditorV0SetDrawingObjectStyleAction`](#applyeditorv0setdrawingobjectstyleaction)
* [`applyEditorV0TableOfFiguresAction`](#applyeditorv0tableoffiguresaction)
* [`applyEditorV0ToolbarFormatBatchCommand`](#applyeditorv0toolbarformatbatchcommand)
* [`applyEditorV0ToolbarFormatCommand`](#applyeditorv0toolbarformatcommand)
* [`applyEditorV0UngroupDrawingObjectAction`](#applyeditorv0ungroupdrawingobjectaction)
* [`applyEditorV0UpdateCrossReferenceFieldResultAction`](#applyeditorv0updatecrossreferencefieldresultaction)
* [`applyEditorV0UpdateDateFieldResultAction`](#applyeditorv0updatedatefieldresultaction)
* [`applyEditorV0UpdateSequenceFieldResultAction`](#applyeditorv0updatesequencefieldresultaction)
* [`applyEditorV0UpdateStyleFromSelectionCommand`](#applyeditorv0updatestylefromselectioncommand)
* [`applyEditorV0UpdateTableAction`](#applyeditorv0updatetableaction)
* [`applyEditorV0UpdateTableOfFiguresAction`](#applyeditorv0updatetableoffiguresaction)
* [`applyFieldToolsWriteback`](#applyfieldtoolswriteback)
* [`applyFileInterchangeAction`](#applyfileinterchangeaction)
* [`applyInsertExtendedWriteback`](#applyinsertextendedwriteback)
* [`applyTableAlignment`](#applytablealignment)
* [`applyTableAltText`](#applytablealttext)
* [`applyTableAutofitToWindow`](#applytableautofittowindow)
* [`applyTableCellContentAlignment`](#applytablecellcontentalignment)
* [`applyTableCellExactSize`](#applytablecellexactsize)
* [`applyTableCellMargins`](#applytablecellmargins)
* [`applyTableCellRangeFormat`](#applytablecellrangeformat)
* [`applyTableCellSpacing`](#applytablecellspacing)
* [`applyTableCellTextDirection`](#applytablecelltextdirection)
* [`applyTableCellTextWrapping`](#applytablecelltextwrapping)
* [`applyTableCellVerticalAlignment`](#applytablecellverticalalignment)
* [`applyTableColumnAutofit`](#applytablecolumnautofit)
* [`applyTableDataCommand`](#applytabledatacommand)
* [`applyTableDimensions`](#applytabledimensions)
* [`applyTableFixedColumnWidth`](#applytablefixedcolumnwidth)
* [`applyTableFloatingPosition`](#applytablefloatingposition)
* [`applyTableHeaderRepeat`](#applytableheaderrepeat)
* [`applyTableHeaderRow`](#applytableheaderrow)
* [`applyTablePencilEraserSemantic`](#applytablepencilerasersemantic)
* [`applyTableSelectionAlignment`](#applytableselectionalignment)
* [`applyTableSelectionAllBorders`](#applytableselectionallborders)
* [`applyTableSelectionCellRangeFormat`](#applytableselectioncellrangeformat)
* [`applyTableSelectionClearContentFormat`](#applytableselectionclearcontentformat)
* [`applyTableSelectionClearContents`](#applytableselectionclearcontents)
* [`applyTableSelectionClearFill`](#applytableselectionclearfill)
* [`applyTableSelectionClearFormatting`](#applytableselectionclearformatting)
* [`applyTableSelectionColumnAutofit`](#applytableselectioncolumnautofit)
* [`applyTableSelectionHeaderRepeat`](#applytableselectionheaderrepeat)
* [`applyTableSelectionInsideBorders`](#applytableselectioninsideborders)
* [`applyTableSelectionOutsideBorders`](#applytableselectionoutsideborders)
* [`applyTableSelectionPencilEraser`](#applytableselectionpencileraser)
* [`applyTableSelectionRowFit`](#applytableselectionrowfit)
* [`applyTableSelectionStructureEdit`](#applytableselectionstructureedit)
* [`applyTableSelectionWidthFit`](#applytableselectionwidthfit)
* [`applyTableStructureEdit`](#applytablestructureedit)
* [`applyTableStyle`](#applytablestyle)
* [`applyTableTemplate`](#applytabletemplate)
* [`applyTableWidth`](#applytablewidth)
* [`applyTableWrappingStyle`](#applytablewrappingstyle)
* [`compressCurrentImageWorkflowImage`](#compresscurrentimageworkflowimage)
* [`copyTableCellRange`](#copytablecellrange)
* [`createMouseDrawnTableFromSemanticIntent`](#createmousedrawntablefromsemanticintent)
* [`createTableGrid`](#createtablegrid)
* [`equalizeTableDimensions`](#equalizetabledimensions)
* [`equalizeTableSelectionColumns`](#equalizetableselectioncolumns)
* [`insertBoundedLiveText`](#insertboundedlivetext)
* [`pasteTableCellRange`](#pastetablecellrange)
* [`replaceCurrentImageWorkflowImage`](#replacecurrentimageworkflowimage)
* [`resizeTableSelection`](#resizetableselection)
* [`saveBoundedLiveTextCopyAs`](#saveboundedlivetextcopyas)
* [`saveBoundedLiveTextDraft`](#saveboundedlivetextdraft)
### applyD36CombinedSectionCommand
[Section titled “applyD36CombinedSectionCommand”](#applyd36combinedsectioncommand)
```ts
applyD36CombinedSectionCommand(request: D36CombinedSectionCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-combined-section-command` · `capability=edit`
### applyD36HeaderFooterEditModeSave
[Section titled “applyD36HeaderFooterEditModeSave”](#applyd36headerfootereditmodesave)
```ts
applyD36HeaderFooterEditModeSave(request: D36HeaderFooterEditModeSaveRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-header-footer-edit-mode-save` · `capability=edit`
### applyD36HeaderFooterMarketWorkflow
[Section titled “applyD36HeaderFooterMarketWorkflow”](#applyd36headerfootermarketworkflow)
```ts
applyD36HeaderFooterMarketWorkflow(request: D36HeaderFooterMarketRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-header-footer-market-workflow` · `capability=edit`
### applyD36HeaderFooterRemove
[Section titled “applyD36HeaderFooterRemove”](#applyd36headerfooterremove)
```ts
applyD36HeaderFooterRemove(request: D36HeaderFooterRemoveRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-header-footer-remove` · `capability=edit`
### applyD36HyphenationWriteback
[Section titled “applyD36HyphenationWriteback”](#applyd36hyphenationwriteback)
```ts
applyD36HyphenationWriteback(request: D36HyphenationRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-hyphenation-writeback` · `capability=edit`
### applyD36LineNumbersContinuousWriteback
[Section titled “applyD36LineNumbersContinuousWriteback”](#applyd36linenumberscontinuouswriteback)
```ts
applyD36LineNumbersContinuousWriteback(request: D36LineNumbersContinuousRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-line-numbers-continuous-writeback` · `capability=edit`
### applyD36SectionPresetVisibleWorkflow
[Section titled “applyD36SectionPresetVisibleWorkflow”](#applyd36sectionpresetvisibleworkflow)
```ts
applyD36SectionPresetVisibleWorkflow(request: D36SectionPresetVisibleWorkflowRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-d36-section-preset-visible-workflow` · `capability=edit`
### applyDesignToolsWriteback
[Section titled “applyDesignToolsWriteback”](#applydesigntoolswriteback)
```ts
applyDesignToolsWriteback(request: ShellDesignToolsWritebackRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-design-tools-writeback` · `capability=edit`
### applyEditorV0AddTextAction
[Section titled “applyEditorV0AddTextAction”](#applyeditorv0addtextaction)
```ts
applyEditorV0AddTextAction(request: EditorV0AddTextRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-add-text-action` · `capability=edit`
### applyEditorV0BibliographyCommandAction
[Section titled “applyEditorV0BibliographyCommandAction”](#applyeditorv0bibliographycommandaction)
```ts
applyEditorV0BibliographyCommandAction(request: EditorV0BibliographyCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-bibliography-command-action` · `capability=edit`
### applyEditorV0BibliographyStyleAction
[Section titled “applyEditorV0BibliographyStyleAction”](#applyeditorv0bibliographystyleaction)
```ts
applyEditorV0BibliographyStyleAction(request: EditorV0BibliographyStyleRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-bibliography-style-action` · `capability=edit`
### applyEditorV0ContentControlsAction
[Section titled “applyEditorV0ContentControlsAction”](#applyeditorv0contentcontrolsaction)
```ts
applyEditorV0ContentControlsAction(request: EditorV0ContentControlsRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-content-controls-action` · `capability=edit`
### applyEditorV0ConvertTextToTable
[Section titled “applyEditorV0ConvertTextToTable”](#applyeditorv0converttexttotable)
```ts
applyEditorV0ConvertTextToTable(request: EditorV0ConvertTextToTableRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-convert-text-to-table` · `capability=edit`
### applyEditorV0DeleteDrawingObjectAction
[Section titled “applyEditorV0DeleteDrawingObjectAction”](#applyeditorv0deletedrawingobjectaction)
```ts
applyEditorV0DeleteDrawingObjectAction(request: EditorV0DeleteDrawingObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-delete-drawing-object-action` · `capability=edit`
### applyEditorV0DistributeDrawingObjectsAction
[Section titled “applyEditorV0DistributeDrawingObjectsAction”](#applyeditorv0distributedrawingobjectsaction)
```ts
applyEditorV0DistributeDrawingObjectsAction(request: EditorV0DistributeDrawingObjectsRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-distribute-drawing-objects-action` · `capability=edit`
### applyEditorV0Doc001005MarketRouteAction
[Section titled “applyEditorV0Doc001005MarketRouteAction”](#applyeditorv0doc001005marketrouteaction)
```ts
applyEditorV0Doc001005MarketRouteAction(request: EditorV0Doc001005MarketRouteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-doc-001-005-market-route-action` · `capability=edit`
### applyEditorV0Doc006015MarketRouteAction
[Section titled “applyEditorV0Doc006015MarketRouteAction”](#applyeditorv0doc006015marketrouteaction)
```ts
applyEditorV0Doc006015MarketRouteAction(request: EditorV0Doc006015MarketRouteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-doc-006-015-market-route-action` · `capability=edit`
### applyEditorV0Doc016025MarketRouteAction
[Section titled “applyEditorV0Doc016025MarketRouteAction”](#applyeditorv0doc016025marketrouteaction)
```ts
applyEditorV0Doc016025MarketRouteAction(request: EditorV0Doc016025MarketRouteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-doc-016-025-market-route-action` · `capability=edit`
### applyEditorV0EditDrawingObjectTextAction
[Section titled “applyEditorV0EditDrawingObjectTextAction”](#applyeditorv0editdrawingobjecttextaction)
```ts
applyEditorV0EditDrawingObjectTextAction(request: EditorV0EditDrawingObjectTextRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-edit-drawing-object-text-action` · `capability=edit`
### applyEditorV0EditEquationObjectAction
[Section titled “applyEditorV0EditEquationObjectAction”](#applyeditorv0editequationobjectaction)
```ts
applyEditorV0EditEquationObjectAction(request: EditorV0EditEquationObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-edit-equation-object-action` · `capability=edit`
### applyEditorV0EditingReplaceAllCommand
[Section titled “applyEditorV0EditingReplaceAllCommand”](#applyeditorv0editingreplaceallcommand)
```ts
applyEditorV0EditingReplaceAllCommand(request: EditorV0EditingReplaceAllRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-editing-replace-all-command` · `capability=edit`
### applyEditorV0EditingReplaceFirstCommand
[Section titled “applyEditorV0EditingReplaceFirstCommand”](#applyeditorv0editingreplacefirstcommand)
```ts
applyEditorV0EditingReplaceFirstCommand(request: EditorV0EditingReplaceFirstRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-editing-replace-first-command` · `capability=edit`
### applyEditorV0FormsFieldsBusinessAction
[Section titled “applyEditorV0FormsFieldsBusinessAction”](#applyeditorv0formsfieldsbusinessaction)
```ts
applyEditorV0FormsFieldsBusinessAction(request: EditorV0FormsFieldsBusinessRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-forms-fields-business-action` · `capability=edit`
### applyEditorV0GroupDrawingObjectsAction
[Section titled “applyEditorV0GroupDrawingObjectsAction”](#applyeditorv0groupdrawingobjectsaction)
```ts
applyEditorV0GroupDrawingObjectsAction(request: EditorV0GroupDrawingObjectsRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-group-drawing-objects-action` · `capability=edit`
### applyEditorV0IndexAuthoritiesCommandAction
[Section titled “applyEditorV0IndexAuthoritiesCommandAction”](#applyeditorv0indexauthoritiescommandaction)
```ts
applyEditorV0IndexAuthoritiesCommandAction(request: EditorV0IndexAuthoritiesCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-index-authorities-command-action` · `capability=edit`
### applyEditorV0InsertBookmarkAction
[Section titled “applyEditorV0InsertBookmarkAction”](#applyeditorv0insertbookmarkaction)
```ts
applyEditorV0InsertBookmarkAction(request: EditorV0InsertBookmarkRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-bookmark-action` · `capability=edit`
### applyEditorV0InsertBreakAction
[Section titled “applyEditorV0InsertBreakAction”](#applyeditorv0insertbreakaction)
```ts
applyEditorV0InsertBreakAction(request: EditorV0InsertBreakRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-break-action` · `capability=edit`
### applyEditorV0InsertCrossReferenceAction
[Section titled “applyEditorV0InsertCrossReferenceAction”](#applyeditorv0insertcrossreferenceaction)
```ts
applyEditorV0InsertCrossReferenceAction(request: EditorV0InsertCrossReferenceRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-cross-reference-action` · `capability=edit`
### applyEditorV0InsertDateFieldAction
[Section titled “applyEditorV0InsertDateFieldAction”](#applyeditorv0insertdatefieldaction)
```ts
applyEditorV0InsertDateFieldAction(request: EditorV0InsertDateFieldRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-date-field-action` · `capability=edit`
### applyEditorV0InsertDateTimeFieldAction
[Section titled “applyEditorV0InsertDateTimeFieldAction”](#applyeditorv0insertdatetimefieldaction)
```ts
applyEditorV0InsertDateTimeFieldAction(request: EditorV0InsertDateTimeFieldRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-date-time-field-action` · `capability=edit`
### applyEditorV0InsertDropCapAction
[Section titled “applyEditorV0InsertDropCapAction”](#applyeditorv0insertdropcapaction)
```ts
applyEditorV0InsertDropCapAction(request: EditorV0InsertDropCapRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-drop-cap-action` · `capability=edit`
### applyEditorV0InsertEndnoteAction
[Section titled “applyEditorV0InsertEndnoteAction”](#applyeditorv0insertendnoteaction)
```ts
applyEditorV0InsertEndnoteAction(request: EditorV0InsertEndnoteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-endnote-action` · `capability=edit`
### applyEditorV0InsertEquationObjectAction
[Section titled “applyEditorV0InsertEquationObjectAction”](#applyeditorv0insertequationobjectaction)
```ts
applyEditorV0InsertEquationObjectAction(request: EditorV0InsertEquationObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-equation-object-action` · `capability=edit`
### applyEditorV0InsertFootnoteAction
[Section titled “applyEditorV0InsertFootnoteAction”](#applyeditorv0insertfootnoteaction)
```ts
applyEditorV0InsertFootnoteAction(request: EditorV0InsertFootnoteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-footnote-action` · `capability=edit`
### applyEditorV0InsertHyperlinkAction
[Section titled “applyEditorV0InsertHyperlinkAction”](#applyeditorv0inserthyperlinkaction)
```ts
applyEditorV0InsertHyperlinkAction(request: EditorV0InsertHyperlinkRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-hyperlink-action` · `capability=edit`
### applyEditorV0InsertImageObjectAction
[Section titled “applyEditorV0InsertImageObjectAction”](#applyeditorv0insertimageobjectaction)
```ts
applyEditorV0InsertImageObjectAction(request: EditorV0InsertImageObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-image-object-action` · `capability=edit`
### applyEditorV0InsertShapeObjectAction
[Section titled “applyEditorV0InsertShapeObjectAction”](#applyeditorv0insertshapeobjectaction)
```ts
applyEditorV0InsertShapeObjectAction(request: EditorV0InsertShapeObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-shape-object-action` · `capability=edit`
### applyEditorV0InsertTableCaptionAction
[Section titled “applyEditorV0InsertTableCaptionAction”](#applyeditorv0inserttablecaptionaction)
```ts
applyEditorV0InsertTableCaptionAction(request: EditorV0InsertTableCaptionRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-table-caption-action` · `capability=edit`
### applyEditorV0InsertTextBoxObjectAction
[Section titled “applyEditorV0InsertTextBoxObjectAction”](#applyeditorv0inserttextboxobjectaction)
```ts
applyEditorV0InsertTextBoxObjectAction(request: EditorV0InsertTextBoxObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-textbox-object-action` · `capability=edit`
### applyEditorV0InsertTocAction
[Section titled “applyEditorV0InsertTocAction”](#applyeditorv0inserttocaction)
```ts
applyEditorV0InsertTocAction(request: EditorV0UpdateTableRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-insert-toc-action` · `capability=edit`
### applyEditorV0ManageNoteAction
[Section titled “applyEditorV0ManageNoteAction”](#applyeditorv0managenoteaction)
```ts
applyEditorV0ManageNoteAction(request: EditorV0ManageNoteRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-manage-note-action` · `capability=edit`
### applyEditorV0MoveDrawingObjectAction
[Section titled “applyEditorV0MoveDrawingObjectAction”](#applyeditorv0movedrawingobjectaction)
```ts
applyEditorV0MoveDrawingObjectAction(request: EditorV0MoveDrawingObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-move-drawing-object-action` · `capability=edit`
### applyEditorV0ParagraphBorderCommand
[Section titled “applyEditorV0ParagraphBorderCommand”](#applyeditorv0paragraphbordercommand)
```ts
applyEditorV0ParagraphBorderCommand(request: EditorV0ParagraphBorderCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-border-command` · `capability=edit`
### applyEditorV0ParagraphFillCommand
[Section titled “applyEditorV0ParagraphFillCommand”](#applyeditorv0paragraphfillcommand)
```ts
applyEditorV0ParagraphFillCommand(request: EditorV0ParagraphFillCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-fill-command` · `capability=edit`
### applyEditorV0ParagraphLayoutBatchCommand
[Section titled “applyEditorV0ParagraphLayoutBatchCommand”](#applyeditorv0paragraphlayoutbatchcommand)
```ts
applyEditorV0ParagraphLayoutBatchCommand(request: EditorV0ParagraphLayoutBatchCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-layout-batch-command` · `capability=edit`
### applyEditorV0ParagraphLayoutCommand
[Section titled “applyEditorV0ParagraphLayoutCommand”](#applyeditorv0paragraphlayoutcommand)
```ts
applyEditorV0ParagraphLayoutCommand(request: EditorV0ParagraphLayoutCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-layout-command` · `capability=edit`
### applyEditorV0ParagraphSortCommand
[Section titled “applyEditorV0ParagraphSortCommand”](#applyeditorv0paragraphsortcommand)
```ts
applyEditorV0ParagraphSortCommand(request: EditorV0ParagraphSortCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-sort-command` · `capability=edit`
### applyEditorV0ParagraphStructure
[Section titled “applyEditorV0ParagraphStructure”](#applyeditorv0paragraphstructure)
```ts
applyEditorV0ParagraphStructure(request: EditorV0ParagraphStructureRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-paragraph-structure` · `capability=edit`
### applyEditorV0RemoveTocAction
[Section titled “applyEditorV0RemoveTocAction”](#applyeditorv0removetocaction)
```ts
applyEditorV0RemoveTocAction(request: EditorV0UpdateTableRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-remove-toc-action` · `capability=edit`
### applyEditorV0ResizeDrawingObjectAction
[Section titled “applyEditorV0ResizeDrawingObjectAction”](#applyeditorv0resizedrawingobjectaction)
```ts
applyEditorV0ResizeDrawingObjectAction(request: EditorV0ResizeDrawingObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-resize-drawing-object-action` · `capability=edit`
### applyEditorV0SectionPageMarginsCommand
[Section titled “applyEditorV0SectionPageMarginsCommand”](#applyeditorv0sectionpagemarginscommand)
```ts
applyEditorV0SectionPageMarginsCommand(request: EditorV0SectionPageMarginsCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-section-page-margins-command` · `capability=edit`
### applyEditorV0SectionPageSetupPreset
[Section titled “applyEditorV0SectionPageSetupPreset”](#applyeditorv0sectionpagesetuppreset)
```ts
applyEditorV0SectionPageSetupPreset(request: EditorV0SectionPageSetupPresetRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-section-page-setup-preset` · `capability=edit`
### applyEditorV0SetDrawingObjectAnchorLockAction
[Section titled “applyEditorV0SetDrawingObjectAnchorLockAction”](#applyeditorv0setdrawingobjectanchorlockaction)
```ts
applyEditorV0SetDrawingObjectAnchorLockAction(request: EditorV0SetDrawingObjectAnchorLockRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-set-drawing-object-anchor-lock-action` · `capability=edit`
### applyEditorV0SetDrawingObjectStyleAction
[Section titled “applyEditorV0SetDrawingObjectStyleAction”](#applyeditorv0setdrawingobjectstyleaction)
```ts
applyEditorV0SetDrawingObjectStyleAction(request: EditorV0SetDrawingObjectStyleRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-set-drawing-object-style-action` · `capability=edit`
### applyEditorV0TableOfFiguresAction
[Section titled “applyEditorV0TableOfFiguresAction”](#applyeditorv0tableoffiguresaction)
```ts
applyEditorV0TableOfFiguresAction(request: EditorV0TableOfFiguresRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-table-of-figures-action` · `capability=edit`
### applyEditorV0ToolbarFormatBatchCommand
[Section titled “applyEditorV0ToolbarFormatBatchCommand”](#applyeditorv0toolbarformatbatchcommand)
```ts
applyEditorV0ToolbarFormatBatchCommand(request: EditorV0ToolbarFormatBatchCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-toolbar-format-batch-command` · `capability=edit`
### applyEditorV0ToolbarFormatCommand
[Section titled “applyEditorV0ToolbarFormatCommand”](#applyeditorv0toolbarformatcommand)
```ts
applyEditorV0ToolbarFormatCommand(request: EditorV0ToolbarFormatCommandRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-toolbar-format-command` · `capability=edit`
### applyEditorV0UngroupDrawingObjectAction
[Section titled “applyEditorV0UngroupDrawingObjectAction”](#applyeditorv0ungroupdrawingobjectaction)
```ts
applyEditorV0UngroupDrawingObjectAction(request: EditorV0UngroupDrawingObjectRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-ungroup-drawing-object-action` · `capability=edit`
### applyEditorV0UpdateCrossReferenceFieldResultAction
[Section titled “applyEditorV0UpdateCrossReferenceFieldResultAction”](#applyeditorv0updatecrossreferencefieldresultaction)
```ts
applyEditorV0UpdateCrossReferenceFieldResultAction(request: EditorV0UpdateCrossReferenceFieldResultRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-update-cross-reference-field-result-action` · `capability=edit`
### applyEditorV0UpdateDateFieldResultAction
[Section titled “applyEditorV0UpdateDateFieldResultAction”](#applyeditorv0updatedatefieldresultaction)
```ts
applyEditorV0UpdateDateFieldResultAction(request: EditorV0UpdateDateFieldResultRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-update-date-field-result-action` · `capability=edit`
### applyEditorV0UpdateSequenceFieldResultAction
[Section titled “applyEditorV0UpdateSequenceFieldResultAction”](#applyeditorv0updatesequencefieldresultaction)
```ts
applyEditorV0UpdateSequenceFieldResultAction(request: EditorV0UpdateSequenceFieldResultRequest): Promise
```
`web_to_host_request_response` · `invoke` · `fastdoc-shell:apply-editor-v0-update-sequence-field-result-action` · `capability=edit`
### applyEditorV0UpdateStyleFromSelectionCommand
[Section titled “applyEditorV0UpdateStyleFromSelectionCommand”](#applyeditorv0updatestylefromselectioncommand)
```ts
applyEditorV0UpdateStyleFromSelectionCommand(request: EditorV0UpdateStyleFromSelectionRequest): Promise