# Classes A–R

Import these from `@grafloria/engine`.

## Classes

### `AddGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddGroupCommand extends Command
```

**Methods**

- `constructor(private group: GroupModel)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `AddLinkCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddLinkCommand extends Command
```

**Methods**

- `constructor(private link: LinkModel)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `AddNodeCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddNodeCommand extends Command
```

**Methods**

- `constructor(private node: NodeModel)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `AddPortCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddPortCommand extends Command
```

**Methods**

- `constructor( private nodeId: string, port: PortModel )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override serialize(): SerializedCommand` — Serialize command

### `AddStrokeCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddStrokeCommand extends Command
```

**Methods**

- `constructor(private readonly stroke: StrokeModel)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override serialize(): SerializedCommand` — Serialize command

### `AddToGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class AddToGroupCommand extends Command
```

**Methods**

- `constructor( private groupId: string, private entityId: string )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `AlignCommand`

Also has every member of `Command`, listed on its own entry.

Align the selected nodes to a shared edge or centre line.

```ts
class AlignCommand extends MultiNodeArrangeCommand
```

**Methods**

- `constructor(nodeIds: string[], private readonly edge: AlignEdge)`
- `override getDescription(): string` — Get description for UI
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command

### `BatchCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class BatchCommand extends Command
```

**Methods**

- `constructor( name: string, private commands: Command[] )`
- `async execute(context: CommandContext): Promise<void>` — Execute the command
- `async undo(context: CommandContext): Promise<void>` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI
- `getCommands(): ReadonlyArray<Command>` — Get all commands in batch
- `addCommand(command: Command): void` — Add command to batch

### `BringNodeToFrontCommand`

Also has every member of `Command`, listed on its own entry.

Lift a node above every other node in the diagram.

```ts
class BringNodeToFrontCommand extends NodeZOrderCommand
```

**Methods**

- `constructor(nodeId: string)`
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone

### `CollapseGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class CollapseGroupCommand extends Command
```

**Methods**

- `constructor( private groupId: string, private options?: CollapseOptions )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `Command`

```ts
abstract class Command
```

**Properties**

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `id` | `string` |  |  |
| `name` | `string` |  |  |
| `timestamp` | `number` |  |  |

**Methods**

- `constructor(name: string)`
- `abstract execute(context: CommandContext): void | Promise<void>` — Execute the command
- `abstract undo(context: CommandContext): void | Promise<void>` — Undo the command
- `redo(context: CommandContext): void | Promise<void>` — Redo the command (default: re-execute)
- `canExecute(context: CommandContext): boolean` — Check if command can be executed
- `canUndo(context: CommandContext): boolean` — Check if command can be undone
- `isUndoable(): boolean` — Does this command belong on the undo stack AT ALL?

`canUndo(context)` is a state probe ("can I undo RIGHT NOW?") consulted at
undo time — many commands answer it from live diagram state. This is the
static declaration consulted at EXECUTE time: a non-mutating command
(Copy) answers false and never enters history. Recording one used to
poison the stack — undo() hit the entry, threw "Cannot undo command:
Copy", never decremented the index, and everything behind it became
permanently unreachable.
- `canMergeWith(other: Command): boolean` — Check if can merge with another command
- `mergeWith(other: Command): Command` — Merge with another command
- `abstract serialize(): SerializedCommand` — Serialize command
- `getDescription(): string` — Get description for UI

### `CommandManager`

```ts
class CommandManager
```

**Methods**

- `constructor( private context: CommandContext, private eventBus: EventBus = context.eventBus )`
- `async execute(command: Command): Promise<void>` — Execute a command
- `async undo(): Promise<void>` — Undo last command
- `async redo(): Promise<void>` — Redo command
- `beginBatch(): void` — Begin batch mode
- `async endBatch(name: string = 'Batch Operation'): Promise<void>` — End batch mode: commit the queued commands as ONE BatchCommand through the
normal execute() path — one history entry, one undo step (with
reverse-order undo), and the same strict-validation gate as any other
command. The old code looped executeCommand() directly, so a "batch"
mutated the diagram while building NO history at all.

Note BatchCommand's existing gate contract: its canExecute() checks every
queued command against the CURRENT (pre-batch) state, so a queue whose
later commands only become executable after earlier ones ran is refused
up front rather than applied halfway.
- `cancelBatch(): void` — Cancel batch
- `clear(): void` — Clear history
- `canUndo(): boolean` — Can undo
- `canRedo(): boolean` — Can redo
- `getHistory(): ReadonlyArray<CommandHistoryEntry>` — Get history
- `getUndoStack(): ReadonlyArray<Command>` — Get undo stack
- `getRedoStack(): ReadonlyArray<Command>` — Get redo stack
- `setMaxHistorySize(size: number): void` — Set max history size
- `setMergingEnabled(enabled: boolean): void` — Enable/disable merging
- `setMergingWindow(milliseconds: number): void` — Set merging window
- `updateContext(updates: Partial<CommandContext>): void` — Update command context

### `CopyCommand`

Also has every member of `Command`, listed on its own entry.

CopyCommand copies selected entities to clipboard

Features:
- Copies selected nodes
- Includes links between selected nodes
- Optionally includes groups containing selected nodes
- Non-destructive (doesn't modify diagram)

```ts
class CopyCommand extends Command
```

**Methods**

- `constructor( private clipboard: ClipboardManager, private options: { includeGroups?: boolean; includeLinks?: boolean; } = {} )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override isUndoable(): boolean` — Does this command belong on the undo stack AT ALL?

`canUndo(context)` is a state probe ("can I undo RIGHT NOW?") consulted at
undo time — many commands answer it from live diagram state. This is the
static declaration consulted at EXECUTE time: a non-mutating command
(Copy) answers false and never enters history. Recording one used to
poison the stack — undo() hit the entry, threw "Cannot undo command:
Copy", never decremented the index, and everything behind it became
permanently unreachable.
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `DeleteSelectionCommand`

Also has every member of `Command`, listed on its own entry.

DeleteSelectionCommand deletes selected entities from diagram

Features:
- Deletes selected nodes, links, and groups
- Recursively deletes child nodes
- Removes links connected to deleted nodes
- Removes nodes from groups they belong to
- Stores all deleted data for undo
- Supports undo/redo

```ts
class DeleteSelectionCommand extends Command
```

**Methods**

- `constructor( private options: { deleteChildren?: boolean; deleteLinks?: boolean; } = {} )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override redo(context: CommandContext): void` — Redo re-applies the RECORDED deletion instead of re-running execute().

The default `Command.redo()` calls `execute()`, which reads the LIVE
selection — but `undo()` restores the entities WITHOUT restoring the
selection, so a redo would find an empty selection and throw
`No entities selected`. Redo therefore removes exactly the entities this
command removed the first time. The recorded arrays are left intact, so the
command can be undone again afterwards (undo/redo/undo/redo all work).
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `DistributeCommand`

Also has every member of `Command`, listed on its own entry.

Space the selected nodes with EQUAL GAPS along an axis; the two extreme
nodes stay put and the interior ones are redistributed between them.

```ts
class DistributeCommand extends MultiNodeArrangeCommand
```

**Methods**

- `constructor(nodeIds: string[], private readonly axis: DistributeAxis)`
- `override getDescription(): string` — Get description for UI
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command

### `DuplicateCommand`

Also has every member of `Command`, listed on its own entry.

DuplicateCommand duplicates selected entities in the diagram

Features:
- Generates new IDs for duplicated entities
- Remaps relationships (links, groups, hierarchy)
- Applies position offset
- Preserves all properties (transforms, layout configs, etc.)
- Supports undo/redo
- Similar to paste but operates directly on selection

```ts
class DuplicateCommand extends Command
```

**Methods**

- `constructor( private options: { offset?: Point; selectDuplicated?: boolean; } = {} )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `ExpandGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class ExpandGroupCommand extends Command
```

**Methods**

- `constructor(private groupId: string)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `MacroCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class MacroCommand extends Command
```

**Methods**

- `constructor(name: string)`
- `addStep(command: Command, delay?: number): void` — Add step to macro
- `addSteps(commands: Command[]): void` — Add multiple steps
- `async execute(context: CommandContext): Promise<void>` — Execute the command
- `async undo(context: CommandContext): Promise<void>` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI
- `getSteps(): ReadonlyArray<MacroStep>` — Get all steps in macro
- `clear(): void` — Clear all steps

### `MoveGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class MoveGroupCommand extends Command
```

**Methods**

- `constructor( private readonly nodeMoves: GroupNodeMove[], private readonly frameMoves: GroupFrameMove[] )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `isNoop(): boolean` — True when the gesture actually moved something (drop == press is a no-op).
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `MoveNodeCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class MoveNodeCommand extends Command
```

**Methods**

- `constructor( private nodeId: string, newPosition: Point, oldPosition?: Point, options: MoveNodeCommandOptions = {} )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override canMergeWith(other: Command): boolean` — Check if can merge with another command
- `override mergeWith(other: Command): Command` — Merge with another command
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `PasteCommand`

Also has every member of `Command`, listed on its own entry.

PasteCommand pastes entities from clipboard into diagram

Features:
- Generates new IDs for pasted entities
- Remaps relationships (links, groups, hierarchy)
- Applies position offset
- Preserves all properties (transforms, layout configs, etc.)
- Supports undo/redo

```ts
class PasteCommand extends Command
```

**Methods**

- `constructor( private clipboard: ClipboardManager, private options: { offset?: Point; selectPasted?: boolean; } = {} )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `ReconnectLinkCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class ReconnectLinkCommand extends Command
```

**Methods**

- `constructor( private linkId: string, private endpoint: LinkEndpoint, private newPortId: string, private newNodeId: string | undefined, private oldPortId: string, private oldNodeId: string | undefined )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override serialize(): SerializedCommand` — Serialize command

### `RemoveFromGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class RemoveFromGroupCommand extends Command
```

**Methods**

- `constructor( private groupId: string, private entityId: string )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `RemoveGroupCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class RemoveGroupCommand extends Command
```

**Methods**

- `constructor(private groupId: string)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `RemoveLinkCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class RemoveLinkCommand extends Command
```

**Methods**

- `constructor(private linkId: string)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `RemoveNodeCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class RemoveNodeCommand extends Command
```

**Methods**

- `constructor(private nodeId: string)`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override canUndo(context: CommandContext): boolean` — Check if command can be undone
- `override serialize(): SerializedCommand` — Serialize command
- `override getDescription(): string` — Get description for UI

### `RemovePortCommand`

Also has every member of `Command`, listed on its own entry.

```ts
class RemovePortCommand extends Command
```

**Methods**

- `constructor( private nodeId: string, private portId: string )`
- `override execute(context: CommandContext): void` — Execute the command
- `override undo(context: CommandContext): void` — Undo the command
- `override canExecute(context: CommandContext): boolean` — Check if command can be executed
- `override serialize(): SerializedCommand` — Serialize command
