> For the complete documentation index, see [llms.txt](/llms.txt).
> The full corpus is at [llms-full.txt](/llms-full.txt).

# Operation

> **Operation** = `InsertOperation` \| `InsertTextOperation` \| `RemoveTextOperation` \| `SetOperation` \| `UnsetOperation`

Defined in: packages/editor/src/types/operation.ts:41

The document-changing operations emitted through
`editor.on('operation', ...)`. Every change to the editor (local edits,
remote patches, value sync, normalization fixes, undo/redo) is expressed
as a sequence of these five operations.

The vocabulary is closed: there are exactly five, listed explicitly so
that a new engine operation never becomes public surface by default, and
the dot-named ones (`insert.text`, `remove.text`) are not namespaces that
grow members.

Selection movements are not emitted on this stream; subscribe to the
`selection` event instead.

Operation objects are the engine's own, passed by reference: treat them
as read-only and copy anything you retain beyond the listener call.

Delivery order: normalization fix operations are delivered adjacent to
the operation that triggered them, but whether a fix arrives before or
after its trigger depends on how the trigger was applied (a fix
re-enters the engine's apply, so an unbatched trigger delivers the fix
first; batched applies deliver fixes after the batch). Do not assume
delivery order equals application order under normalization: seed
derived state from `editor.getSnapshot()` and recompute on change
rather than replaying deltas blindly.

`inverse`, when present, reflects what the engine itself needs to make
the operation reversible. Its presence follows the engine's history
policy and is not a stable per-operation contract.

:::caution[Beta]
This API should not be used in production and may be trimmed from a public release.
:::