Skip to content

Editing and AI Suggestions

Canvas gives you two ways to change a memo: edit it directly, or propose changes as suggestions that someone reviews. AI-assisted edits — from chat and from Deep Brushes — arrive as suggestions, so you stay in control of every change to the document.

The mode you’re in decides what your keystrokes do:

  • Viewing — read-only. Select text, read comments, navigate. No changes.
  • Suggesting — typing creates suggestion marks (proposed insertions and deletions) instead of changing the document. Each suggestion is reviewed and then accepted or rejected.
  • Editing — direct edits. Your changes land in the document immediately. Editing a section acquires that section’s edit lock (in the non-collaborative path) or marks your editing presence (in the collaborative path — see Real-Time Collaboration).

Mode is a per-user preference: switching to suggesting mode affects only you, not the other people in the same memo.

Available modes are derived from your deal role and the document state:

RoleDraft / Editing stateApproved state
Owner / Editorviewing, suggesting, editing (default: editing)viewing, suggesting (default: suggesting)
Commentersuggesting onlysuggesting only
Viewerviewing onlyviewing only

Two things fall out of this table:

  • Owners and editors edit directly while the memo is in Draft or Editing, but once it’s Approved they drop to viewing/suggesting — to directly edit an approved memo, an owner must first reopen it.
  • Commenters never edit directly; their contribution is always a suggestion. Viewers never change the document at all.

See Roles and Permissions for the full role model.

A suggestion is a proposed change rendered inline in the document — proposed new text and proposed deletions are visibly marked so you can see exactly what would change before committing to it.

Under the hood, suggestions are ProseMirror marks, not transient highlights. A suggestionInsert mark flags proposed new text; a suggestionDelete mark flags text proposed for removal. Both carry a shared suggestionId linking the insertion and deletion halves of a single proposed edit.

  • AI chat — when you ask the in-editor assistant to revise a passage, it returns the change as a suggestion rather than overwriting your text.
  • Deep Brushes — brush workflows (source it, quantify, enrich, audit, compare, compliance, and deal-structure) produce their edits as suggestions. See Deep Brushes.
  • Suggesting mode — your own typing while in suggesting mode becomes suggestions for someone with edit rights to accept.

You resolve suggestions one at a time or in bulk:

  • Accept a suggestion — the proposed insertion becomes real text and any proposed deletion is removed. The suggestion marks are cleared.
  • Reject a suggestion — the proposal is discarded and the original text is left untouched.
  • Accept all / Reject all — resolve every pending suggestion in the document at once.

The suggestion toolbar and the section UI expose accept/reject for the active suggestion and accept-all/reject-all for the whole document.

Canvas registers shortcuts globally. The suggestion shortcuts only fire when there is an active suggestion — letter shortcuts are suppressed while you’re typing in a field, so pressing A mid-sentence types an “a” rather than accepting anything.

ShortcutAction
AAccept the active suggestion
RReject the active suggestion
⌘ EnterAccept all suggestions
EscDismiss all suggestions (reject all) / close the open panel
⌘ SSave the document
⌘ ⇧ AApprove the memo (owners; only when there are no unsaved changes)
⌘ ⇧ MCycle editor mode (View → Suggest → Edit)
⌘ ⇧ LToggle the AI chat panel
⌘ F / ⌘ HFind / find and replace
⌘ / or ?Show the full shortcuts help

In editing mode you change text the way you’d expect — type, delete, format, restructure. Standard formatting (bold, italic, lists, links, headings, alignment), tables, and the memo’s richer content (charts, images, footnotes) are all editable in place.

Your edits autosave in the background, and the first save promotes the memo from Draft to Editing. While you’re directly editing a section, other collaborators see that you’re in it (presence) so two people don’t unknowingly fight over the same paragraph — covered in Real-Time Collaboration.

  • canvas-ui/src/types/editorMode.ts — the three modes (viewing / suggesting / editing) and their semantics
  • canvas-ui/src/utils/editorModeDerivation.ts — role × document-state → available modes and default mode (the truth table)
  • canvas-ui/src/hooks/useDocumentShortcuts.ts — concrete keyboard bindings (A accept, R reject, ⌘ Enter accept-all, Esc reject-all/close, ⌘ S save, ⌘ ⇧ A approve, ⌘ ⇧ M cycle mode, ⌘ ⇧ L chat, ⌘ F/⌘ H find)
  • canvas-ui/src/hooks/useKeyboardShortcuts.ts — global shortcut dispatch; letter shortcuts suppressed while typing
  • canvas-ui/src/editor-core/commands/suggestions.tsacceptSuggestion / rejectSuggestion / acceptAllSuggestions / rejectAllSuggestions, suggestion-mark stripping before save
  • memory/canvas_ui_suggestion.md — mark-based (not decoration) suggestions, suggestionInsert/suggestionDelete with shared suggestionId, stripBeforeSave, why marks survive serialization
  • memory/prosemirror_roundtrip_contract.md — suggestion marks are stripped at serialize time (client applies all suggestions before save)