revise 2.2.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/CHANGELOG.md +56 -1182
  2. package/LICENSE +24 -41
  3. package/README.md +103 -26
  4. package/agent.d.ts +139 -0
  5. package/chunks/chunk-U5X47PZ6.js +135 -0
  6. package/chunks/chunk-U6YKQBKL.js +15 -0
  7. package/chunks/chunk-ZLQVPMBN.js +1650 -0
  8. package/chunks/package-5SHL5FOJ.js +14 -0
  9. package/chunks/render-QD5VWKSV.js +109 -0
  10. package/cli-output.schema.json +1984 -0
  11. package/cli.js +3609 -0
  12. package/document.d.ts +320 -0
  13. package/docx.d.ts +73 -0
  14. package/errors.d.ts +14 -0
  15. package/index.d.ts +13 -975
  16. package/index.js +31 -1
  17. package/legacy/editor.d.ts +19 -0
  18. package/legacy/editor.js +16 -0
  19. package/legacy/server.d.ts +37 -0
  20. package/legacy/server.js +25 -0
  21. package/legacy/style.css +2 -0
  22. package/package.d.ts +23 -0
  23. package/package.json +49 -55
  24. package/render.d.ts +27 -0
  25. package/FONT-LICENSE-HAN-EXT-B.txt +0 -91
  26. package/FONT-LICENSE-KATEX.txt +0 -95
  27. package/FONT-LICENSE-LIBERATION.txt +0 -102
  28. package/FONT-LICENSE-NOTO-MULTILINGUAL.txt +0 -93
  29. package/FONT-LICENSE-NOTO-SANS-SC.txt +0 -93
  30. package/FONT-LICENSE-NOTO.txt +0 -94
  31. package/FONT-LICENSE-SOURCE-CODE-PRO.txt +0 -94
  32. package/FONT-LICENSE-SOURCE-SERIF-4.txt +0 -93
  33. package/THIRD-PARTY-NOTICES.md +0 -3376
  34. package/assets/historyMaterializeWorker-B51R08XN.js +0 -612
  35. package/backend.d.ts +0 -161
  36. package/backend.js +0 -3
  37. package/chunks/AgentPageRenderer-CH8kSTJn.js +0 -1
  38. package/chunks/AgentPageRenderer-P23XVguo.js +0 -1
  39. package/chunks/AttachmentDocumentImporter-B1WOaa7d.js +0 -1
  40. package/chunks/AttachmentDocumentImporter-CT_PJp_e.js +0 -1
  41. package/chunks/BidiText-Swm5fl9J.js +0 -160
  42. package/chunks/ColorParserFull-BKH72fK8.js +0 -446
  43. package/chunks/DocumentMutator-btiDK57e.js +0 -31
  44. package/chunks/DocumentScrubber-CMPfm_HF.js +0 -18
  45. package/chunks/DocumentScrubber-Cm2kH8op.js +0 -1
  46. package/chunks/DocumentScrubber-bJoKijol.js +0 -1
  47. package/chunks/DocumentStylesheet-DreoD7sD.js +0 -7
  48. package/chunks/DocxConverter-BcVG-p5K.js +0 -13
  49. package/chunks/DocxConverter-D2bO5RE-.js +0 -1125
  50. package/chunks/DocxConverter-haCfRuWb.js +0 -13
  51. package/chunks/DocxGraft-BRKh4mHQ.js +0 -1
  52. package/chunks/DocxGraft-BxSQtl12.js +0 -7
  53. package/chunks/DocxGraft-C9MBQCnf.js +0 -1
  54. package/chunks/FileImporter-CszqRfVU.js +0 -1
  55. package/chunks/FileImporter-DObFoCCn.js +0 -1
  56. package/chunks/HorizontalRuleOrnaments-gmUZ3R7Q.js +0 -3
  57. package/chunks/HtmlConverter-DwXB4IDh.js +0 -267
  58. package/chunks/ListNumbering-Qlu6AuRZ.js +0 -23
  59. package/chunks/MarkdownConverter-CUC8GgsS.js +0 -57
  60. package/chunks/MathRenderer-DT6GyJXb.js +0 -68
  61. package/chunks/OdtConverter-7h9HHMpL.js +0 -125
  62. package/chunks/OdtConverter-Ct4qypJk.js +0 -6
  63. package/chunks/OdtConverter-DFl__sJc.js +0 -6
  64. package/chunks/OfficeImportShared-BY6FdZ8d.js +0 -1
  65. package/chunks/OfficeImportShared-BrZoDM0j.js +0 -30
  66. package/chunks/OfficeImportShared-Bvm-mOyj.js +0 -1
  67. package/chunks/ParagraphDiffAnalysis-DrmStvmz.js +0 -36
  68. package/chunks/PdfConverter-1wyvoT7X.js +0 -21
  69. package/chunks/PdfConverter-BAoEHILo.js +0 -21
  70. package/chunks/PdfConverter-CKEvFj11.js +0 -448
  71. package/chunks/PdfImportService-BhLPp5uG.js +0 -2
  72. package/chunks/PdfImportService-xbzrN__L.js +0 -2
  73. package/chunks/RtfConverter-Bxn-enp8.js +0 -15
  74. package/chunks/RtfConverter-LZPzBDSr.js +0 -15
  75. package/chunks/RtfConverter-_bacXqr1.js +0 -186
  76. package/chunks/TableBorders-CwnF3jvH.js +0 -30
  77. package/chunks/TableGrid-DbroRucl.js +0 -12
  78. package/chunks/TextFileDecoder--rsVs3NR.js +0 -9
  79. package/chunks/TxtConverter-C7FOwHpH.js +0 -14
  80. package/chunks/UnicodeUtils-CXtusU4g.js +0 -10
  81. package/chunks/XmlConverter-7oo8oeQB.js +0 -2
  82. package/chunks/XmlConverter-DGORHJcZ.js +0 -96
  83. package/chunks/XmlConverter-DeLHReK_.js +0 -2
  84. package/chunks/__vite-browser-external-l0sNRNKZ.js +0 -0
  85. package/chunks/_commonjsHelpers-DaMA6jEr.js +0 -2
  86. package/chunks/_revise-sdk-lazy-harfbuzz-CDWdjF9f.js +0 -1
  87. package/chunks/_revise-sdk-lazy-harfbuzz-X8gnYTZL.js +0 -1
  88. package/chunks/ar-ComXvtmh.js +0 -13
  89. package/chunks/backend-DecaBz-I.js +0 -490
  90. package/chunks/base64-sSPOzq-u.js +0 -198
  91. package/chunks/browser-module-CFmqfGkE.js +0 -1791
  92. package/chunks/browser-module-Dj5o3kuL.js +0 -3
  93. package/chunks/browser-module-UuM_O36W.js +0 -3
  94. package/chunks/bundle.min-DRpfgV69.js +0 -782
  95. package/chunks/capture-1btcWcPF.js +0 -9
  96. package/chunks/carrier-DQeng6yq.js +0 -6
  97. package/chunks/de-BkbpIKxx.js +0 -13
  98. package/chunks/es-CKkXujOF.js +0 -13
  99. package/chunks/fil-piIHMc8F.js +0 -13
  100. package/chunks/footnoteFlatten-DUQticYy.js +0 -6
  101. package/chunks/fr-DuA8qLje.js +0 -13
  102. package/chunks/graftExport-CYnStOdU.js +0 -82
  103. package/chunks/html2canvas.esm-CntiHiYW.js +0 -997
  104. package/chunks/index-2TBhRkX7.js +0 -387
  105. package/chunks/index-BWdRWxoH.js +0 -1807
  106. package/chunks/index-Bf14eTEW.js +0 -1096
  107. package/chunks/index-BwcX_r62.js +0 -387
  108. package/chunks/index.es-CI0QPo8w.js +0 -780
  109. package/chunks/index.es-CI7cDExj.js +0 -5
  110. package/chunks/index.es-DHpGt6Y5.js +0 -5
  111. package/chunks/ja-DgrSs555.js +0 -13
  112. package/chunks/jspdf.es.min--GshOuIm.js +0 -77
  113. package/chunks/jspdf.es.min-DU74zN8b.js +0 -1792
  114. package/chunks/jspdf.es.min-DurJZ1zW.js +0 -77
  115. package/chunks/jszip.min-CPW0h1Kx.js +0 -476
  116. package/chunks/katex-DWj8TvwO.js +0 -1462
  117. package/chunks/pdf-BLWDCiFF.js +0 -1828
  118. package/chunks/persistInlineDocumentImages-DQj2iaqg.js +0 -1
  119. package/chunks/pseudoLocale-BoYTjmiK.js +0 -1
  120. package/chunks/pseudoLocale-DG2NnZmz.js +0 -1
  121. package/chunks/purify.es-BwLardii.js +0 -107
  122. package/chunks/serverDocumentSession-CJ1EH3Tp.js +0 -15
  123. package/chunks/signatures-Bwt_OGik.js +0 -17
  124. package/chunks/suggestionAuthorship-B-IuLQlE.js +0 -1
  125. package/chunks/tree-sitter-D6zWWUMP.js +0 -4
  126. package/chunks/wasmInline.generated-CBYFkdSM.js +0 -1
  127. package/chunks/web-tree-sitter-BXGZGnNj.js +0 -2
  128. package/chunks/zh-9OF3SWWO.js +0 -13
  129. package/full.js +0 -1
  130. package/root.d.ts +0 -5
  131. package/root.js +0 -2
  132. package/serverToolContract.d.ts +0 -391
  133. package/serverToolInputs.generated.d.ts +0 -250
  134. package/style.css +0 -1
package/CHANGELOG.md CHANGED
@@ -1,1184 +1,58 @@
1
1
  # Changelog
2
2
 
3
- ## 2.2.0
4
-
5
- ### Added
6
-
7
- - **ODT and RTF input.** `ReviseDocumentFormat` and `ReviseServerFormat` gain
8
- `"odt"` and `"rtf"`, detected from `.odt` / `.rtf` filenames and from the
9
- `application/vnd.oasis.opendocument.text`, `application/rtf`, and
10
- `text/rtf` MIME types. Both import fonts, sizes, colors, highlighting,
11
- character and paragraph formatting, headings, lists with their numbering,
12
- tables with merged cells and column widths, images, hyperlinks, footnotes
13
- and endnotes, headers and footers, comments, tracked changes, and page
14
- size and margins. RTF from Word, WordPad, TextEdit, and LibreOffice is
15
- supported, in any Windows code page or East Asian encoding. Each converter
16
- loads only when a host first opens that format. `revise/server`'s
17
- `parseDocument`, `fileToYDoc`, and `seedYDocFromFile` accept both. Host
18
- code with an exhaustive `switch` over either type needs cases for the two
19
- new values.
20
- - **Delete whole table rows, columns, or tables from a cell selection.**
21
- Backspace or Delete over fully selected rows or columns removes them, and
22
- over every cell removes the table; a partial selection still clears only
23
- the cell contents. Removing several rows is one undo step, and a table that
24
- was the only block leaves an empty paragraph. Shift+click in another cell
25
- of the same table now extends a cell selection, as dragging does.
26
- - **Move connectors.** When a tracked move is focused, a line in the left
27
- margin links where the text moved from to where it moved to, across pages.
28
- It is not drawn in print preview.
29
- - **Pleading-paper line numbers.** Documents whose page layout carries a
30
- pleading grid show numbered rows (for example 1 to 28) at fixed positions
31
- on every page, independent of the text, on screen and in PDF export. DOCX
32
- export writes them as Word line numbers restarting on each page.
33
-
34
- ### Changed
35
-
36
- - **Margin line numbers behave like Word's.** Each number sits on its line's
37
- baseline, table lines are not counted on screen (PDF already skipped
38
- them), and a section that turns numbering off shows none instead of
39
- inheriting the document setting. Numbers are set in the font that
40
- dominates each page's text, on screen and in PDF, where they were always
41
- Helvetica before.
42
- - **The delegated agent can move blocks.** `agent.run()` and comment agents
43
- can move paragraphs, lists, and tables as one tracked move (applied
44
- directly in editing mode); blocks with anchored comments are not moved.
45
- `move_blocks` is not part of the embedded tool list for `tools.*` hosts.
46
- The delegated agent also recovers more reliably: it repairs a run that
47
- edited and then reported no change, checks table fill work before it
48
- finishes, and keeps the request and latest tool results when it recovers
49
- from a context limit.
50
- - **Suggestion cards show a date once a change is over a week old.** Old
51
- changes read "Sep 4" or "Oct 11, 2013" instead of "4739d ago".
52
- - **The footnote card is a compact row.** Clicking a footnote reference shows
53
- its label with **Go to note** and **Remove**; the note is edited in the
54
- note itself. In narrow layouts the card is centered under its reference
55
- mark.
56
-
57
- ### Fixed
58
-
59
- - **Links.** Bare email addresses link and autolink as `mailto:`;
60
- `mailto:` and `tel:` URLs are kept as typed; an `@` before the path is not
61
- read as `https://` user info. Cmd+K uses the selected text as the link
62
- target only when it is a full URL or an email address, and the link popup
63
- finds a link Cmd+K just made on a backward selection.
64
- - **Link, footnote, and inline-math popups line up at every zoom level.**
65
- - **Math is no longer clipped when it renders before the KaTeX fonts load.**
66
- Such results show provisionally and re-render once the fonts arrive, and
67
- failed font or stylesheet fetches are not cached.
68
- - **DOCX tracked moves of whole paragraphs, lists, and tables.** On import,
69
- Word's paragraph-mark `w:moveFrom` / `w:moveTo` make the whole block part
70
- of the move, so accepting it removes the source paragraph instead of
71
- leaving an empty one, and a list split across a move becomes two lists.
72
- Export writes paragraph marks and table rows with the move, and accepting
73
- or rejecting resolves both halves together.
74
- - **Accepting the deletion of every row of a table removes the table**, as
75
- in Word, instead of leaving a table with no rows.
76
- - **DOCX header and footer line breaks.** `w:br` in headers and footers is
77
- imported, and export writes `w:br` instead of a raw newline that Word
78
- showed as a space.
79
- - **Header and footer layout.** In multi-column sections, headers and
80
- footers span the full text width instead of one column; a zone is as wide
81
- as its widest line; a bordered zone, such as a footer rule, spans the whole
82
- band; and empty zones give up their space.
83
- - **`replace_block` and `append_to_paragraph` on a non-text target**, such as
84
- a table, fail with `target_type_mismatch` instead of doing nothing.
85
- - **DOCX, ODT, and RTF open where `Blob.arrayBuffer` is missing** (Safari
86
- before 14, jsdom). Files are read with a `FileReader` fallback.
87
-
88
- ### Security
89
-
90
- - **ODT and RTF import is hardened against hostile files.** Links pass a
91
- scheme allowlist (http, https, mailto, tel, ftp, and relative), so
92
- `javascript:` and similar are dropped. Self-referencing ODT deletions and
93
- RTF control words such as `\constructor` can no longer overflow the stack
94
- or swallow text, and imported tables are capped at 1,000 columns and
95
- 100,000 cells.
96
-
97
- ## 2.1.0
98
-
99
- ### Added
100
-
101
- - **`source` on document inputs.** `{ id, source: file }` names the field for
102
- what it takes: DOCX, Markdown, plain text, or HTML. `docx` still works as the
103
- same field; passing both with different values throws.
104
- - **`context_notes` is optional in typed host calls.** `tools.execute()` and
105
- `tools.call()` (browser and `revise/server`) fill in `"N/A"` for the read and
106
- search tools, so application code no longer passes a model's working memory.
107
- `executeDynamic()` keeps the schema requirement for model-provided calls.
108
- - **`leave_comment` reports a retargeted anchor.** When the anchor text is not
109
- in the named block and the comment goes to the only read block that has it,
110
- `data.requestedBlockId` names the block you asked for and the message says so.
111
-
112
- - **`read_table` and `edit_table_cells` agent tools.** Read a large table in
113
- bounded windows (a summary, up to 50 rows, or one oversized cell in pages),
114
- then set the plain text of up to 50 cells per call by row ID and column.
115
- Cell text is written literally. Only cells a `read_table` call returned in
116
- full can be edited, and that read stays valid across later `execute()` calls
117
- on the same document while the cell and table geometry remain unchanged.
118
- An invalid target rejects the whole batch with no changes. In suggesting mode each cell is its own suggestion. Read-only
119
- surfaces and viewers get `read_table` only. Both tools are also in the
120
- `revise/server` session. The SDK's `read_table` does not take the native
121
- agent's task-declaration arguments (`task_kind`, `scope_*`,
122
- `source_attachment_id`, `deliberate_blanks`). They are left out of the
123
- published schema, and a call that supplies one fails with
124
- `unsupported_argument` without reading anything. Empty placeholders
125
- (`null`, `""`, `[]`) are ignored.
126
-
127
- ### Changed
128
-
129
- - **The delegated agent plans long tasks.** `agent.run()`, `revise_run_agent`,
130
- and comment agents keep a step-by-step plan for multi-step work, update it
131
- in the same turns as their edits, and save it with the conversation, so
132
- fewer turns go to bookkeeping. The embedded tool list is unchanged: plan
133
- tools stay inside the delegated agent.
134
- - **Faster on long documents.** The scrollbar track and its markers are drawn
135
- once and reused while scrolling, Find reuses each block's normalized text
136
- between keystrokes, and tracked-change records are indexed in one pass
137
- instead of one document walk per suggestion.
138
-
139
- ### Fixed
140
-
141
- - **DOCX paragraph spacing follows the document's rules.** `w:contextualSpacing` no longer
142
- zeroes a paragraph's declared space before and after on import. Spacing is
143
- resolved from neighboring paragraphs on screen, in table cells and
144
- containers, and in PDF export: the gap between two paragraphs is the larger
145
- of their spacings, not the sum, and contextual spacing drops it only between
146
- paragraphs of the same style. PDF keep-with-next reserves the whole gap, and
147
- exported DOCX keeps the declared spacing. Documents whose paragraphs both
148
- declare spacing lay out tighter than in 2.0.x.
149
- - **`style_blocks` with `list-style-type: none` turns list items into plain
150
- paragraphs**, keeping their spacing and line spacing and applying the call's
151
- other paragraph attributes in the same step.
152
- - **Unsupported DOCX content can be suggested for removal.** In suggesting
153
- mode, removing a block the editor preserves but cannot render (an opaque
154
- DOCX payload) now becomes a tracked deletion.
155
- - **Comment previews keep their layout.** In a comment chip's hover preview,
156
- the avatar holds its size and a long author name is truncated.
157
- - **An editor with no agent configured sends nothing.** `agent.run()`, the
158
- `revise_run_agent` tool, and comment agents used to stream the document,
159
- unauthenticated, to Revise's hosted agent and then report a generic
160
- connection error. Without a `turnStream`, `baseUrl`, or `token`, they now
161
- fail at once with `agent_not_configured` (`AgentNotConfiguredError` from
162
- `agent.run()`), and `getToolDefinitions()` leaves the delegation tool out.
163
- - **`documents.open()` activates the new document every time.** Opening a
164
- document straight after another open, or after `documents.activate()`, left
165
- the earlier one active. `documents.list()` status was also briefly stale
166
- right after a document became ready.
167
- - **`tools.getDefinitions()` lists only the native tools.** It included
168
- `revise_run_agent`, which the docs say it leaves out.
169
- - **Changing `agent.turnStream` no longer reloads the document.** A new
170
- `turnStream` or `disableMetrics` value re-created the document runtime,
171
- re-parsing the source and dropping unsaved edits, so an inline generator in
172
- JSX reloaded the document on every render. Agent settings now apply to the
173
- next run in place.
174
- - **Reads are not refused for the life of the editor.** After a window had
175
- been read once, every later `read_blocks_from_index` of it failed with
176
- `no_new_read_context`, so a host agent's second conversation could not read
177
- the document. The guard now resets with each call, like the other per-turn
178
- limits.
179
- - **Tool errors speak to SDK callers.** Messages no longer carry the internal
180
- `Failed operation: <tool>: <Error>:` prefix or point at `<document_content>`,
181
- which only Revise's own agent sees; they point at read results instead.
182
- - **The open-error screen shows a plain message.** A corrupt file showed the
183
- parser's internals (a zip library's message and link) to the person who
184
- picked it. `onError` still receives the full detail. Loading text no longer
185
- says "DOCX" for other formats, and a `File` source's title drops `.md`,
186
- `.txt`, and `.html` extensions as well as `.docx`.
187
- - **PDF export requests a failing font once.** When a font download failed
188
- (a CSP or firewall blocking revise.io, say), export requested the same URL a
189
- second time. The warning now says a fallback font was used and names
190
- `setAssetBaseUrl()` for mirroring the fonts.
191
- - **Readable errors from the package in Node.** Bundled code is wrapped at
192
- short lines, so an uncaught error (such as the missing-`jsdom` hint) is no
193
- longer printed under a 100 KB line of minified source.
194
- - **Quieter host builds.** Vite no longer warns that `"buffer"` was
195
- externalized, or prints the inlined WebAssembly's base64 as a file that
196
- "doesn't exist at build time".
197
-
198
- ## 2.0.1
199
-
200
- ### Added
201
-
202
- - **`tools.export({ format, mode })`.** Export as DOCX, PDF, HTML, Markdown,
203
- or plain text from code, not just the ribbon's Export menu. `mode: "final"`
204
- accepts every pending change and drops comments first for a clean copy;
205
- the default `"review"` keeps tracked changes and comments in a .docx. The
206
- editor-level `tools.export(options, documentId?)` routes to any open
207
- document.
208
- - **`exportDocument(source, options)` in `revise/server`.** The same export
209
- for a room or a parsed document on the server: DOCX, HTML, Markdown, and
210
- plain text, in review or final mode.
211
- - **`onImageUpload(file, documentId)`.** Store images users insert, paste, or
212
- drop in your own storage and return the URL the document should use.
213
-
214
- ### Fixed
215
-
216
- - **Inserting, pasting, or dropping an image works.** It used to post to
217
- Revise's app API, which the SDK cannot reach, so the image never appeared.
218
- Without `onImageUpload`, images are now embedded in the document as data
219
- URLs and export into the .docx. `toolbar.insertImage()` resolves `false`
220
- when an upload fails, and the failure reaches `onError`.
221
- - **Docs:** linked moves are described correctly in Support, the reserved
222
- collaboration keys point to `RESERVED_DOCUMENT_KEYS`, and the delegated
223
- agent page says how to get hosted-agent access.
224
-
225
- ## 2.0.0
226
-
227
- The SDK is now public: `npm i revise`. No account, token, or contact
228
- with us is needed to install it. 2.0.0 also ships everything from the
229
- 2.0.0-alpha releases below.
230
-
231
- ### Changed
232
-
233
- - **BREAKING: the package is now `revise`.** The private `@reviseio/sdk`
234
- package is retired. Update the dependency and imports:
235
- `@reviseio/sdk` → `revise/editor`, `@reviseio/sdk/full` →
236
- `revise/editor/full`, `@reviseio/sdk/backend` → `revise/server`, and
237
- `@reviseio/sdk/style.css` → `revise/style.css`. Remove the `@reviseio`
238
- scope and token lines from `.npmrc`.
239
- - **New license: free for evaluation, personal projects, and education.**
240
- Production use by businesses, nonprofits, and government requires a paid
241
- license. See `LICENSE` and [developer.revise.io](https://developer.revise.io/editor-sdk/license).
242
- The previous 60-day evaluation terms no longer apply.
243
- - **The editor fills its container at any size.** The 640×560px minimum is
244
- gone, so the editor fits phone-width columns and short panels without
245
- overflowing them. A container with no height gets a 560px fallback and a
246
- one-time console warning instead of a collapsed editor.
247
- - **Hosted agent defaults to production.** Without `agent.baseUrl`, the
248
- delegated Revise agent now targets `https://agent.revise.io` instead of a
249
- development address.
250
-
251
- ### Added
252
-
253
- - **A 4.5 MB package, with assets loaded on demand.** PDF export fonts were
254
- inlined as base64 and made up three quarters of the package; they, the math
255
- fonts and stylesheet, the pdf.js worker, and Tree-sitter grammars now load
256
- from `https://revise.io` when first needed. **`setAssetBaseUrl(url)`**
257
- points the SDK at a self-hosted mirror.
258
- - **`import ReviseEditor from "revise/editor"`.** The editor entry now has a
259
- default export. The named `ReviseEditor` export still works.
260
- - **`revise` root entry** with `REVISE_SDK_VERSION`, `REVISE_SDK_BUILD`, and
261
- the shared types, and no runtime weight.
262
- - **`THIRD-PARTY-NOTICES.md`** lists every bundled open-source package with
263
- its license.
264
- - **Anonymous usage ping, and the `telemetry` prop to turn it off.** Once
265
- per page load, the editor sends Revise its version; the browser adds the
266
- site's origin. Development hosts are counted per day and version without
267
- their origin. No cookies, user data, or document content.
268
- `telemetry={false}` disables it.
269
-
270
- ### Fixed
271
-
272
- - **Math renders with its real fonts in host apps.** Equations looked for
273
- their fonts and stylesheet at the host's own `/fonts` and `/katex.min.css`
274
- and fell back to system fonts; the help link in the editor menu also
275
- pointed at the host's `/help`. All now resolve to Revise's assets.
276
- - **The SDK no longer reaches for development servers.** Revise application
277
- endpoints (document history, preferences, uploads, failure reports) and the
278
- sync-server addresses no longer resolve to `localhost` in an embedding
279
- host. Document history in particular fetched from `localhost:3001` in
280
- browsers without a `process` global.
281
- - **No debug globals on the host's `window`.** `__getEditor`,
282
- `__getDocLayout`, and `__aiLogs` are no longer installed.
283
- - **DOCX math export uses Revise's own MathML → OMML converter.** Equations
284
- export to native Word math (fractions, radicals, scripts, sums and
285
- integrals with limits, delimiters, matrices, accents, bars, braces,
286
- functions, boxed and text runs) with no third-party copyleft code in the
287
- package. Re-importing them is more faithful: `\left\{ … \right.`,
288
- `\underline`, `\overbrace`, `\boxed`, `\text{…}`, `\mathbb`, binomials,
289
- and named functions (`\sin`, `\log`, `\lim_{…}`) now come back as the
290
- same LaTeX instead of approximations, and symbols no longer run into the
291
- following letter (`\alpha x`, not `\alphax`).
292
-
293
- ## 2.0.0-alpha.7
294
-
295
- ### Fixed
296
-
297
- - **DOCX round trips keep every modeled mark and block.** A new
298
- export → import matrix (every formatting mark in every text context,
299
- every paragraph, list, table, cell, image, code, math, note, header,
300
- footer, and page-layout attribute, plus a second-pass fixed-point
301
- check) found and pinned a set of losses: lists inside table cells
302
- were dropped on export; hanging indents exported as zero and
303
- `w:hanging` was ignored on import; headings came back as Word's blue
304
- 16pt built-ins (export now writes the editor's heading sizes with
305
- inherited color); unscoped header/footer blocks were not exported;
306
- hyperlinks discarded an explicit text color; links inside footnotes
307
- were lost on import; header and footer runs used a reduced codec in
308
- both directions and now share the body run codec, links and inline
309
- code included; inline code and code blocks flattened to Courier text
310
- and now travel as `CodeInline` / `CodeBlock_<language>` styles and
311
- return as the original nodes; todo items exported as literal
312
- `[x]` text and now use checkbox glyphs that re-import as todo lists
313
- with their checked state; code-block line breaks doubled on
314
- re-import; and a single run in another font restamped the whole
315
- document (the inferred document font is now the character-weighted
316
- majority).
317
- - **Table borders export and re-import faithfully.** Export no longer
318
- throws on non-hex colors such as `TRANSPARENT`, `rgba()`, or CSS
319
- names — unresolvable values are omitted or written as `auto`. The
320
- uniform `borderWidth`/`borderColor` pair is honored (width 0 means
321
- no borders), width-0 spec edges export as `none` instead of a
322
- hairline, and an explicit `w:sz="0"` imports as hidden rather than a
323
- 1px line. Table Settings border changes now rewrite the structured
324
- table spec and clear per-cell overrides, so hiding borders on an
325
- imported table takes effect.
326
- - **Byte-preserving DOCX export degrades instead of failing.** A carrier
327
- that fails to load falls back to the regenerated package like every
328
- other graft failure; the graft option reports its outcome (exact,
329
- grafted, regenerated, and the fallback code) through an isolated
330
- callback that can never break an export. Untouched imports of rich
331
- documents now export byte-identical: note-body font inheritance,
332
- header/footer zone ids, and legacy chrome no longer drift the
333
- fidelity signatures; watermark and settings edits graft instead of
334
- restoring carrier values; body grafting is invalidated when wrapper
335
- or style sidecars change; single-quoted and non-numeric relationship
336
- ids parse; and a changed header image is replaced even when its
337
- media filename collides.
338
- - **Formatting suggestions preserve footnotes.** Accepting a
339
- `style_blocks` suggestion keeps footnote references and bodies.
340
- - **Large documents no longer stall on batch edits.** Styling 205 blocks
341
- in a 10,000-block document, applying 100 replacements, and large
342
- multi-block insertions run without re-decoding the document per
343
- action; suggestion projection latency is bounded; batch paragraph
344
- formatting suggestions behave identically through preview,
345
- acceptance, and rejection.
346
- - **Semantic tool errors and inputs.** Errors distinguish Markdown find
347
- syntax from stored plain text; metric CSS paragraph indentation
348
- (`cm`, `mm`) is accepted; number-dot prose can be parsed as inline
349
- text instead of a list when requested.
350
- - **Comments render AI citations.** Structured citations persist on
351
- replies and render in the panel; unsupported provider citation
352
- markers are hidden, including on legacy comments.
353
- - **Agent image rehosting.** Wikimedia thumbnail URLs are recovered by
354
- rehosting the original image, and rate-limited rehosts surface the
355
- backend reason and status.
356
- - **Revision timeline never collapses to zero.** A stale or missing
357
- server update counter no longer disables history or pins every frame
358
- to the first update; loaded frames are authoritative.
359
- - **Pasted images write once.** A pasted image no longer inserts a
360
- temporary base64 placeholder that is replaced later; the final hosted
361
- URL is written at the captured paste position when the upload
362
- completes.
363
-
364
- ### Changed
365
-
366
- - **Comment margin geometry is direction-aware.** Chip, floating-stack,
367
- and insert-chip positions are computed along an outward axis with a
368
- single conversion to physical coordinates. The embedded document
369
- surface itself is still laid out left-to-right: the margin chrome
370
- stays on the page's right regardless of the host page's direction.
371
- Mirroring the embed for right-to-left hosts is not part of this
372
- release.
373
-
374
- ## 2.0.0-alpha.6
375
-
376
- ### Fixed
377
-
378
- - **A healed seed race now recovers full fidelity — and never loses a
379
- comment.** Three repair refinements: the winner is the seed whose
380
- metadata survived the merge (each seed stamps a ballot in the same
381
- transaction), so the kept content matches the surviving import
382
- capture; a shared deterministic id keeps the WINNER's element, not an
383
- arbitrary one; and map records under a shared key (deterministic
384
- comment ids) are never deleted — the merge already deduplicated them,
385
- and alpha.5's repair removed the only surviving record. A raced,
386
- repaired room now reports "exact" and exports byte-identically.
387
-
388
- ## 2.0.0-alpha.5
389
-
390
- ### Fixed
391
-
392
- - **Seed-race repair kept a duplicate footnote.** Deterministic ids that
393
- every seed generates identically (docx footnotes) were protected from
394
- repair as a collision safeguard, leaving one copy per seed. Repair now
395
- keeps exactly one occurrence of a shared id. Supersedes 2.0.0-alpha.4,
396
- which was deprecated minutes after publish.
397
-
398
- ## 2.0.0-alpha.4
399
-
400
- ### Fixed
401
-
402
- - **Double-seed connect race no longer duplicates the document.** Two
403
- peers that each found an empty room and seeded the same file before
404
- syncing used to merge into a perfectly-synced, perfectly-duplicated
405
- document. Every seed now records a claim in the same transaction as
406
- its content, and any peer that sees two claims deterministically
407
- removes the losing seed's content — idempotent, convergent, and
408
- content added after a seed is never touched. `seedYDocFromFile` is
409
- now genuinely safe to call on every connection: a later call also
410
- heals an already-raced room, and every live editor session repairs
411
- one the moment the second claim syncs in.
412
- - **Editing no longer rewrites document properties.** A structural edit
413
- (or a rejected tracked change) permanently dropped the imported core
414
- properties from the live model, so every later export regenerated
415
- `docProps/core.xml` with an "Un-named" creator, the title removed,
416
- and the creation date reset to export time. Core properties now
417
- survive every model rebuild, and when core.xml IS legitimately
418
- regenerated it is a faithful merge: `cp:revision` round-trips and
419
- fields the original never had are not invented.
420
- - **`docProps/app.xml` passes through untouched.** It is never
421
- regenerated (preserving Application/Company/TotalTime) and never
422
- added to a package that did not have one.
423
-
424
- ### Added
425
-
426
- - **`repairSeedRace(ydoc)`** on the backend entry (with
427
- `SeedRaceRepairResult`): detect and repair a double-seed race on
428
- demand. Editor sessions and `seedYDocFromFile` run it for you.
429
-
430
- ### Changed
431
-
432
- - **New reserved top-level key in shared documents: `"seed-claims"`**
433
- (see `RESERVED_DOCUMENT_KEYS`) — where seed claims live.
434
-
435
- ## 2.0.0-alpha.3
436
-
437
- ### Fixed
438
-
439
- - **Backspace before a chip deleted the chip.** A preserved-object chip
440
- has two caret stops — before and after — and a delete now respects
441
- which side the caret is on, like a caret between two characters:
442
- backspace at the before-stop targets the block BEFORE the chip (an
443
- atomic neighbor is deleted whole, a text neighbor loses its last
444
- character), and forward delete at the after-stop targets the block
445
- after. Deletes pointing AT the chip still remove it.
446
- - **Up/down arrows at a chip slid the caret to the chip's other side**
447
- instead of changing lines. Vertical movement now leaves the chip's
448
- line and lands on the neighboring block's stop nearest the caret's
449
- column — arrowing through a stack of chips keeps the caret on the
450
- same side all the way down.
451
-
452
- ## 2.0.0-alpha.2
453
-
454
- ### Fixed
455
-
456
- - **Exporting .docx could crash in production builds of the host app**
457
- ("Cannot destructure property 'default' … as it is undefined" from
458
- the converter's zip loader). The SDK's build emitted duplicate
459
- interop chunks for its zip dependency behind dynamic imports, and
460
- some consumer bundlers resolved one family to `undefined` when
461
- producing production builds — development builds were unaffected,
462
- which is why the crash only appeared after deployment. The dependency
463
- is now a static import inside the (still lazily loaded) converter
464
- modules: the load profile is unchanged and the chunk graph no longer
465
- depends on the host bundler's interop handling.
466
- - **Backspace in an empty paragraph directly after a chip deleted the
467
- chip** instead of the paragraph. Preserved payloads are content the
468
- source file owns, not editor furniture: the empty paragraph dies, the
469
- chip survives. (Page and section breaks keep their old
470
- consume-on-backspace behavior.)
471
- - **Chips gained real before/after caret stops.** The caret can now be
472
- placed on either side of a chip — arrow keys walk across it, and
473
- clicking the left or right half of the chip places the caret on the
474
- matching side.
475
-
476
- ## 2.0.0-alpha.1
477
-
478
- Prerelease for evaluation. The 2.0 line's headline is DOCX source
479
- fidelity: a document imported from .docx can now leave the editor as the
480
- file it came from, not a reconstruction of it.
481
-
482
- ### Added
483
-
484
- - **DOCX source-fidelity mode (default on).** Importing a .docx keeps the
485
- original package inside the document (the "carrier", shared documents
486
- included, capped at 25MB). On export, content you did not touch is
487
- emitted as the exact bytes that arrived — byte-for-byte, unannotated —
488
- and only changed content is regenerated. A verification stage inspects
489
- every composed package and falls back to full regeneration rather than
490
- ship anything it cannot verify.
491
- - **`handle.getSourceFidelity()`** (and `ydocSourceFidelity(ydoc)` /
492
- `documentToDocx(doc, { originalDocx })` on the backend entry) reports
493
- the honest relationship of the next export to the original file:
494
- `"exact"` (byte-identical), `"grafted"` (original bytes plus your
495
- edits), or `"converted"` (no usable original; the report says why).
496
- - **Unmodeled Word formatting survives editing.** Run, paragraph, table,
497
- row, cell, and section properties the editor does not model (vendor
498
- effects such as `w14:glow`, revision-save ids, row heights, table
499
- look flags, page borders, note-numbering properties…) are carried
500
- through the model and re-emitted — so an EDITED paragraph keeps them
501
- too, with or without the carrier.
502
- - **Preserved objects render as labeled chips.** OLE embeds (Excel,
503
- Visio), SmartArt without a raster fallback, and unknown OOXML
504
- constructs import as atomic blocks labeled with their source tag
505
- (e.g. "w:object · Excel.Sheet.12"), render as chips on canvas and in
506
- PDF export, and re-export verbatim. In agent HTML they appear as
507
- `<docx-raw id tag/>`: an agent can keep, move, or omit one
508
- (omission deletes), but can never inject raw OOXML of its own.
509
- - **Editable-region permissions preserved.** `w:permStart`/`w:permEnd`
510
- pairs (and future paired ranges) survive import, editing, and export
511
- with balance guaranteed by construction: typing inside extends the
512
- region, deleting its text retires it, and unbalanced pairs in source
513
- files are repaired at import.
514
-
515
- ### Changed
516
-
517
- - **BREAKING: two new reserved top-level keys in shared documents** —
518
- `"docx-carrier"` and `"oxml-ranges"` (see
519
- `RESERVED_DOCUMENT_KEYS`). A host-built Y.Doc already using these
520
- names is rejected by `assertUsableSharedDocument`.
521
- - **BREAKING: docx-sourced exports are byte-preserving by default.**
522
- 1.x regenerated every export from the model; 2.0 reproduces original
523
- bytes for untouched content. Hosts that depended on exports being
524
- normalized into the generated dialect should convert explicitly.
525
- - `ReviseDocument` block children may now include the `"docx-raw"`
526
- node type (opaque; convert rather than inspect, as ever).
527
- - Shared documents built from a .docx are larger by roughly the size of
528
- the source file (the carrier). It is stored once, chunked, and synced
529
- like any other document state.
530
-
531
- ## 1.3.1
532
-
533
- ### Fixed
534
-
535
- - **Delegated page inspection now reaches the embedded editor canvas.** The
536
- SDK connects the delegated agent's `render_document_pages` tool to the
537
- mounted document renderer, so appearance and layout requests return the
538
- actual pages instead of reporting that canvas inspection is unavailable.
539
- - **Agent-tool documentation now matches the generated SDK catalog.** The
540
- public docs use the canonical `remove_blocks` name, distinguish the
541
- deterministic document-local tool subset from delegated-agent-only tools,
542
- and explain where visual page inspection is available.
543
-
544
- ## 1.3.0
545
-
546
- ### Added
547
-
548
- - **The built-in editor UI now localizes itself in English, Spanish, and
549
- German.** Ribbon controls, menus, dialogs, comments, Review mode, and agent
550
- chrome follow the browser language or the persisted Revise UI-language
551
- preference, while English remains the fallback if a locale chunk cannot be
552
- loaded.
553
- - **The delegated browser agent can inspect the document's rendered pages.**
554
- It can request bounded appearance contact sheets or layout diagnostics from
555
- the real canvas renderer, including page geometry, tables, images, math,
556
- headers, footers, and safe placeholders for unavailable visual assets.
557
-
558
- ### Changed
559
-
560
- - **Tab editing and layout now follow Word-style paragraph behavior.** Tab and
561
- Shift+Tab at the start of a block keep indenting or outdenting, while either
562
- key inside paragraph text inserts a tab. Long tabbed lines wrap at word
563
- boundaries, restart their ruler on each visual line, and preserve custom,
564
- aligned, leader, and right-to-left tab stops.
565
-
566
- ### Fixed
567
-
568
- - **DOCX named styles remain stable through editing and repeated round trips.**
569
- Imported paragraph styles and document defaults now drive newly created
570
- headings and agent-created styled blocks, survive Yjs persistence, suppress
571
- redundant direct formatting on export, and converge without accumulating
572
- unused generated Word styles. Explicit formatting resets, borders, spacing,
573
- fonts, and styles inside table cells remain intact.
574
- - **Agent document measurements reconcile pending Review changes.** Primary
575
- totals consistently measure the final, as-if-accepted document and include
576
- the original review projection when pending suggestions make the visible
577
- word or character count differ.
578
-
579
- ## 1.2.0
580
-
581
- ### Added
582
-
583
- - **International text support now extends across the editing and conversion
584
- pipeline.** Unicode-aware line breaking, search, list numbering, font
585
- fallback, and IME composition preserve multilingual text more reliably, and
586
- text import now detects UTF-8 and UTF-16 files. HTML, DOCX, RTF, ODT, and
587
- plain-text conversions keep the expanded script coverage intact.
588
- - **Orange and purple join the SDK highlight palette.** The editor UI,
589
- `find_highlights`, `style_blocks`, agent HTML, and DOCX round trips now
590
- share the same seven canonical highlight colors.
591
- - **Agent styling covers richer document structures.** `style_blocks` adds
592
- span, descendant-wildcard, first-row, and named-paragraph-style selectors,
593
- with durable mappings for image sizing and alignment, paragraph borders,
594
- nested tables and lists, per-edge cell borders, cell fills, padding, and
595
- table-cell text styles.
596
-
597
- ### Fixed
598
-
599
- - **DOCX import follows Word's effective paragraph and table styling.**
600
- Unstyled paragraphs inherit the document's default style; exact and
601
- at-least line rules use the resolved font size; paragraph before/after and
602
- contextual spacing replace the editor's fallback gap; missing table borders
603
- remain borderless; and non-uniform cell margins survive import. The imported
604
- spacing persists through Yjs, paragraph splits and merges, HTML, DOCX, and
605
- PDF output, keeping compact Word layouts from growing onto extra pages.
606
- - **Unavailable Word fonts use the document's own substitution hints.** DOCX
607
- import reads `fontTable.xml` alternate names and PANOSE/family/pitch
608
- metadata, persists them with the document, and chooses metric-compatible
609
- fallbacks before resorting to a generic family.
610
- - **Multilingual PDF export embeds and shapes the scripts it needs.** Chinese,
611
- Japanese, Korean, Indic, Southeast Asian, Tibetan, Ethiopic, Armenian,
612
- Georgian, Syriac, Thaana, symbols, emoji, and rare Han use bundled lazy
613
- fallback faces, while a hidden logical-text layer preserves search and text
614
- extraction.
615
- - **Agent edits preserve complex formatting and pending review state.** Styled
616
- tables, nested content, list-item formatting, explicit text overrides,
617
- comments, and edits layered over pending insertions now survive preview,
618
- acceptance, and rejection without duplicating or flattening structure.
619
- - **Borderless layout tables stay visually borderless while editing.** The
620
- canvas now reveals only the specific invisible vertical edge under a resize
621
- pointer instead of ghosting the table's entire grid on hover or focus.
622
- - **Imported pale-yellow highlights remain highlights.** HTML clipboard import
623
- no longer remaps Word's pale yellow to the editor's green palette entry.
624
-
625
- ## 1.1.0
626
-
627
- ### Added
628
-
629
- - **First-class right-to-left editing.** The built-in toolbar can set paragraph
630
- and list direction to automatic, LTR, or RTL. Mixed Hebrew, Arabic, and
631
- left-to-right text now uses bidi-aware line layout, visual arrow-key
632
- movement, stable caret and selection geometry, direction-aware alignment and
633
- indents, mirrored list markers, and RTL tab stops. Direction survives Yjs,
634
- clipboard and agent edits, HTML, and DOCX round trips; PDF export preserves
635
- mixed-direction reading order and positioning.
636
- - **Multi-column sections.** Page layout now supports one, two, or three
637
- newspaper-style columns with a configurable gap. Continuous section breaks
638
- balance their final columns, while page and next-page sections keep ordinary
639
- pagination. The canvas editor and PDF export share the flow rules, DOCX and
640
- HTML import/export preserve the settings, and `set_page_layout` exposes
641
- `columnCount`, `columnGap`, and section-scoped updates to browser and
642
- server agent sessions.
643
- - **Native document-structure tools.** `insert_block` can create a live table
644
- of contents with `<toc levels="3"></toc>`. The canonical
645
- `remove_blocks` tool can delete a counted range, exact IDs, a saved search
646
- result, or an explicitly authorized document tail with `through_end`.
647
-
648
- ### Changed
649
-
650
- - **Agent tool sessions avoid unproductive read cycles.** Sequential reads now
651
- reject windows containing only blocks already returned in the same request
652
- with `no_new_read_context`; `read_specific_blocks` remains available for
653
- intentional revisits. `remove_blocks` is now the model-facing name, while
654
- the previous `remove_block` name remains an executable compatibility alias.
655
-
656
- ### Fixed
657
-
658
- - **Strict-provider nulls behave like omitted optional tool fields.** Browser
659
- and server tool execution normalize provider-materialized `null` values
660
- from the generated schema before dispatch, without stripping required or
661
- deliberately nullable values. Optional layout and mutation inputs therefore
662
- no longer take invalid branches merely because a provider filled them in.
663
- - **Agent-generated Unicode escapes become the intended text.** Literal
664
- `\uXXXX` sequences in agent HTML and replacement paths are decoded without
665
- disturbing escaped backslashes or code spans, preventing visible escape text
666
- in edited documents.
667
- - **Review decisions preserve the reader's place.** Accepting or rejecting a
668
- tracked change no longer forces the embedded editor to scroll back to the
669
- active suggestion.
670
- - **SDK PDF export keeps Hebrew and Arabic text self-contained.** The package
671
- now bundles the Noto fallback faces used by RTL export, so embedding hosts do
672
- not need to mirror Revise's public font directory to avoid dropped glyphs.
673
-
674
- ## 1.0.1
675
-
676
- ### Fixed
677
-
678
- - **Malformed model input can no longer crash a host's agent loop.** A bare
679
- string where `search_document` expects a `queries` array — the most
680
- common model slip — threw a raw `TypeError` out of `execute()` /
681
- `executeDynamic()` instead of returning a structured failure. Bare
682
- strings are now coerced to one-element arrays (also for
683
- `read_specific_blocks`' `block_ids`), anything uncoercible fails
684
- structurally, and both surfaces gained a safety net that converts an
685
- unexpected handler throw into an `internal_error` result. The documented
686
- contract — expected failures as results, only environment errors reject —
687
- now holds for arbitrary input.
688
- - **Invalid enum values no longer mutate the wrong target silently.** An
689
- insert tool called with `position: "above"` placed content _after_ the
690
- reference block while reporting success, and `set_header_footer` with a
691
- misspelled or missing `side` edited the header. Both now return a
692
- structured failure naming the valid values.
693
-
694
- ## 1.0.0
695
-
696
- One package, one tool contract. The browser and server surfaces now speak
697
- the same canonical envelope, so host result-handling code is shared verbatim
698
- between web and Node. That convergence is breaking on the browser side —
699
- every change is listed below.
700
-
701
- ### Breaking
702
-
703
- - **`tools.execute()` returns the canonical discriminated envelope.** The
704
- flat `{ toolCallId, name, success, error?, agentFeedback?, output?,
705
- documentContent? }` result is gone. Both surfaces now return
706
- `{ ok: true, value: { callId, tool, message, data, context, suggestionIds } }`
707
- or `{ ok: false, error: { callId, tool, code, message } }`
708
- (`ReviseToolResult`). Field mapping: `toolCallId → value.callId`,
709
- `name → value.tool`, `agentFeedback → value.message`,
710
- `output → value.data`, `documentContent → value.context.html`;
711
- `view_image`'s attachment lives on `value.image`.
712
- `ReviseEditorToolExecutionResult` no longer exists.
713
- - **`tools.execute()` is typed and no longer routes `document_id`.**
714
- `execute()`/`call()` take the generated per-tool input types and
715
- cover the shared 24-tool contract; untrusted model calls — including the
716
- browser-only `get_selection`, `view_image`, and
717
- `revise_run_agent`, and model-facing `document_id` routing — go
718
- through the new `executeDynamic()`, exactly as on the server.
719
- - **Unknown tools and role denials are results, not throws.** `execute()`
720
- returns `{ ok: false }` with `code: "unknown_tool"` or
721
- `"role_not_permitted"` instead of throwing; the new `tools.call()`
722
- throws a typed `ReviseToolError` for hosts that prefer exceptions.
723
- `ReviseRoleError` is still thrown by `agent.run()` and UI
724
- controllers.
725
- - **ID-keyed suggestion decisions return per-ID outcomes.**
726
- `review.acceptSuggestions`/`rejectSuggestions`,
727
- `review.acceptCommentSuggestions`/`rejectCommentSuggestions`, and
728
- `tools.acceptAllSuggestions`/`rejectAllSuggestions`, and the server
729
- session's `acceptSuggestions`/`rejectSuggestions` return
730
- `{ resolved, missing, unresolved }` (`ReviseSuggestionDecision`)
731
- instead of a bare count. Stale IDs land in `missing`; a role that may
732
- not resolve reports everything `unresolved`. `review.acceptAll()` /
733
- `rejectAll()` keep their boolean UI-gesture contract.
734
- - **Server sessions default to suggesting mode.** `createServerDocumentSession`
735
- without `mode` now proposes tracked changes instead of applying edits
736
- directly — the same default posture as the browser surface, and the safe
737
- one. Pass `mode: "editing"` (or per-call `directMode: true`) for
738
- direct application.
739
-
740
- ### Added
741
-
742
- - **Browser mutation results report created suggestion IDs.** Successful
743
- mutations carry `suggestionIds` — the tracked records that call created
744
- (empty for direct edits, `null` for read/search/measure tools) — with a
745
- concurrent human suggestion never attributed to the tool call. Feed them
746
- straight to `review.acceptSuggestions()`.
747
- - **The tool contract types ship from both entries.** `ReviseToolResult`,
748
- `ReviseToolResponse`, `ReviseToolFailure`, `ReviseToolError`,
749
- `ReviseSuggestionDecision`, the generated `ReviseToolInputMap`, and
750
- friends are exported by `@reviseio/sdk` and `@reviseio/sdk/backend`
751
- alike.
752
-
753
- - **Server mutation results report the tracked records they created.**
754
- Successful mutation calls from `createServerDocumentSession` now carry
755
- `suggestionIds` — the tracked suggestion records that call created (empty
756
- for direct edits, `null` for read/search/measure tools) — so a host can
757
- persist per-edit IDs with its review workflow instead of diffing the
758
- document-global pending set.
759
- - **`listSuggestions()`** returns every pending suggestion as a reviewable
760
- record with authorship metadata (`authorType`, `agentName`,
761
- `agentModel`, `source`, `label`, `createdAt`), so hosts can decide on
762
- their own agent's suggestions and leave collaborators' pending work alone.
763
- - **`acceptAllSuggestions()` / `rejectAllSuggestions()`** make the
764
- whole-document decision an explicit, greppable call instead of the
765
- `acceptSuggestions(getPendingSuggestionIds())` idiom.
766
-
767
- ### Fixed
768
-
769
- - **Server tool types now resolve for `moduleResolution: "NodeNext"`
770
- consumers.** The packaged declarations re-exported the server tool contract
771
- through extensionless relative specifiers, which NodeNext cannot resolve —
772
- every tool input/output type silently degraded to `any`, and importing a
773
- contract type by name (e.g. `ServerDocumentSession`) failed to compile.
774
- The declarations now use explicit `.js` specifiers, which every supported
775
- resolution mode maps to the sibling `.d.ts` files.
776
- - **Importing a document with code blocks no longer risks crashing a Node
777
- host.** The canvas syntax highlighter tried to fetch its tree-sitter wasm
778
- under Node (the server DOM shims install a jsdom `window`, defeating its
779
- browser check), failing as an unhandled promise rejection. Highlighting now
780
- recognizes the server runtime explicitly and stays off, and a failed
781
- highlighter init in the browser no longer poisons later attempts.
782
- - **Table and list mutations no longer spam `Invalid access` warnings.**
783
- Building table rows, cells, and list items called Yjs `push()` on
784
- elements not yet integrated into a document, which logs a warning per
785
- child. Construction now inserts children at explicit indices — dozens of
786
- stderr lines per table insert in server logs, gone.
787
- - **Editing mode applies server edits directly again.** A server session in
788
- `"editing"` mode quietly recorded every mutation as a
789
- pending tracked suggestion instead of applying it. Editing-mode calls now
790
- run in the runtime's direct mode and settle within the call, matching the
791
- documented behavior; an explicit per-call `directMode` still overrides in
792
- either direction.
793
-
794
- ## 0.9.0
795
-
796
- ### Added
797
-
798
- - **`review.listChanges()` now reports linked moves as moves.** A move pair
799
- surfaces as ONE `ReviseTrackedChange` with `kind: "move"`,
800
- `moveSourceBlockIds`/`moveDestinationBlockIds` locating each half, and
801
- `deletedText`/`insertedText` carrying the text as it left and as it
802
- arrived. Previously both halves were folded into a single change labeled
803
- `"delete"`, leaving a host review panel no way to distinguish a move from
804
- a replacement. Accept/reject semantics are unchanged: resolving the change
805
- settles both locations atomically.
806
-
807
- ## 0.8.0
808
-
809
- ### Added
810
-
811
- - **Cut and paste now creates native linked moves in Suggesting mode.** Cutting
812
- text from supported paragraphs and pasting that same internal clipboard
813
- payload elsewhere in the document produces one atomic “Moved from”/“Moved
814
- here” pair. Accepting or rejecting either half resolves both locations, undo
815
- cannot strand an orphaned half, and DOCX export/reimport preserves native
816
- linked move markup. Copy/paste, editing mode, reused or mismatched clipboard
817
- payloads, and unsupported structural selections continue to use ordinary
818
- insertion/deletion behavior.
819
-
820
- ## 0.7.0
821
-
822
- ### Added
823
-
824
- - **Server-side semantic tools.** `await createServerDocumentSession(ydoc,
825
- { documentId, mode })` in `@reviseio/sdk/backend` binds the canonical
826
- document-local agent tools — read, search, measure, mutate, layout,
827
- footnotes, tables, comments — to a host-owned Y.Doc under plain Node.
828
- `mode: "suggesting"` produces Word-compatible tracked changes with
829
- accept/reject; concurrent calls are serialized; literal tool calls infer
830
- their schema inputs and structured outputs. See the README's "Server semantic
831
- tools" section.
832
- - **Linked Word moves now round-trip as atomic move suggestions.** DOCX import
833
- pairs native `w:moveFrom` and `w:moveTo` ranges across runs, paragraphs,
834
- and table cells. Accepting either half keeps the text at its
835
- destination; rejecting either half restores its original location; export
836
- re-emits native paired move markup. Suggestion cards distinguish “Moved from”
837
- and “Moved here”, and focusing either half highlights its partner even across
838
- paragraphs.
839
-
840
- ### Fixed
841
-
842
- - **Node-side DOCX imports preserve tracked table-row revisions without a
843
- browser `FileReader`.** The backend DOM shims and table-revision
844
- postprocessor now work from `Blob.arrayBuffer()`, retaining row insertion
845
- and deletion metadata in server integrations.
846
- - **Word comment anchors preserve their identity and semantic range.** Safe
847
- native numeric IDs no longer shift, cross-paragraph and table-cell ranges
848
- emit one anchor triple instead of duplicates, and collapsed, overlapping,
849
- threaded, and resolved comments survive repeated round trips.
850
- - **Visible drawing text survives DOCX import when shape geometry is
851
- flattened.** Inline and anchored DrawingML, grouped shapes, legacy VML,
852
- headers, and standards-valid `mc:AlternateContent` Choice/Fallback content
853
- become editable paragraphs in reading order without duplicate fallback text.
854
- - **DOCX archives no longer inflate and large imports avoid repeated work.**
855
- Generated packages use DEFLATE compression, parse the main document XML once,
856
- and skip move indexing when a file has no moves, preventing the reported
857
- multi-fold output growth and superlinear no-move scan.
858
-
859
- ## 0.6.0
860
-
861
- ### Added
862
-
863
- - **Horizontal rules and ornamental dividers are now supported throughout the
864
- editor.** Insert thin, thick, double, dashed, dotted, star, or diamond
865
- dividers from the toolbar or context menu, or create them with text triggers
866
- such as `---`, `===`, `-**-`, and `-<>-`. DOCX, HTML, Markdown, agent HTML,
867
- PDF, and plain-text output preserve the divider where the format permits;
868
- DOCX, HTML, Markdown, RTF, and ODT imports recognize their native divider or
869
- paragraph-border representations.
870
-
871
- ### Changed
872
-
873
- - **Em-dash autocorrection now waits for a word boundary.** Typing `--` remains
874
- literal until Space or Enter, allowing `---` to be used for horizontal-rule
875
- insertion and preserving word-initial values such as `--flag`.
876
-
877
- ### Fixed
878
-
879
- - **Words no longer wrap in the middle at formatting or tracked-change run
880
- boundaries.** A word split across differently styled text nodes now wraps as
881
- one unit and keeps a stable layout when suggestions are accepted.
882
- - **Suggestion editing produces stable runs and caret placement.** Continued
883
- typing or backspacing merges into the existing suggestion instead of creating
884
- one run per keystroke, replacement normalization no longer leaves the caret
885
- inside hidden deleted text, and Enter after a pending deletion creates the
886
- expected paragraph or list item without moving the deleted content.
887
- - **Structural editing keeps the expected document shape and keyboard focus.**
888
- Backspace exits or splits empty list items correctly, compatible lists rejoin
889
- when their separating empty paragraph is removed, Enter at the start of a
890
- leading heading or code block creates a body paragraph above it, and toolbar
891
- commands no longer steal keyboard focus from the editor.
892
-
893
- ## 0.5.1
894
-
895
- ### Fixed
896
-
897
- - **PDF table-of-contents page numbers stay accurate when a heading moves to
898
- the next page.** Export now records a heading's destination after paragraph
899
- pagination, so a keep-with-next or end-of-page preflight cannot leave the
900
- TOC pointing at the page the heading would have occupied before it moved.
901
-
902
- ## 0.5.0
903
-
904
- ### Added
905
-
906
- - **Comments now work on list items, including nested items.** Selecting list
907
- text, expanding a word from the caret, and commenting on a whole item all
908
- create item-local anchors. Returning the caret to that text activates the
909
- thread, list-item threads survive agent-HTML round trips, and the
910
- `leave_comment` agent tool accepts list-item IDs.
911
-
912
- ### Changed
913
-
914
- - **PDF export now follows the editor's layout and print semantics much more
915
- closely.** It shares wrapping and pagination rules for tab stops and
916
- leaders, hyphenation, keep-with-next, keep-lines, widows and orphans, code
917
- blocks, nested tables, footnotes, page and section breaks, live TOC page
918
- numbers, line numbers, and watermarks. Editor-only placeholders and review
919
- chrome are not printed, and Word hidden text remains hidden in ordinary PDF
920
- output. The SDK now carries its metric-compatible PDF fonts itself, so an
921
- embedding host does not need to mirror Revise's public font directory.
922
- - **Agent tool sessions reject redundant full-document read loops.** After a
923
- session has read the complete document, another sequential `read_document`
924
- returns `no_new_read_context`; agents can still revisit known content with
925
- `read_specific_blocks`.
926
-
927
- ### Fixed
928
-
929
- - **DOCX formatting exceptions survive a complete edit and export cycle.**
930
- Explicit run-property clears over named styles, zero paragraph indents,
931
- paragraph border and shading clears, decimal font sizes, and mixed small-cap
932
- and all-cap overrides now remain distinct from inherited formatting and do
933
- not leak into adjacent text.
934
- - **Complex Word structures no longer lose modeled content on re-export.**
935
- Internal bookmark links stay internal; exact table widths, columns,
936
- alignment, cell padding, and vertical alignment survive; nested tables keep
937
- the paragraphs around them; display equations are not flattened when a file
938
- is immediately re-exported; and multi-block footnotes and endnotes can retain
939
- their lists and tables.
940
- - **Accepting or rejecting a compound agent edit is atomic.** Mixed text,
941
- formatting, and structural suggestions are resolved together, so accepting
942
- a rewrite no longer retains deleted fragments and rejecting it restores the
943
- original content and formatting.
944
- - **Comment cards stay where users put them.** A previously active card no
945
- longer drifts with the viewport, and selecting text inside a card no longer
946
- jumps focus back to the document or clears the selection. Inline code in
947
- comment bodies is also styled as code.
948
- - **Package managers can no longer omit the Yjs runtime.** Every editor session
949
- is Yjs-backed even without a collaboration provider, so `yjs` and
950
- `y-protocols` are now required peers instead of optional peers. This makes
951
- package managers install or validate them instead of letting bundlers
952
- substitute empty optional-peer modules and fail the consumer build.
953
-
954
- ## 0.4.5
955
-
956
- ### Fixed
957
-
958
- - **Starting a list no longer drops the font.** Typing a list trigger
959
- (`- `, `1. `, `[] `) in a paragraph set in a non-default font produced
960
- a list item that fell back to the default font: clearing the trigger text
961
- left an empty item with nowhere to carry its formatting. The formatting at
962
- the trigger's trailing edge — the font family included — is now preserved
963
- on the empty item and applies to the next character typed.
964
-
965
- ## 0.4.4
966
-
967
- ### Fixed
968
-
969
- - **Suggestion cards now hang from the suggested text.** The floating
970
- accept/reject card anchored to the caret; it now follows the suggested
971
- fragment (or your selection) and sits centered below its line, the same
972
- placement the revise.io app uses, falling back to the caret only when the
973
- fragment cannot be measured. Wide cards are clamped to the page edges
974
- instead of a fixed margin.
975
-
976
- ## 0.4.3
977
-
978
- Identical in content to 0.4.2; republished.
979
-
980
- ## 0.4.2
981
-
982
- ### Fixed
983
-
984
- - **Word-level diffs misplaced edits next to repeated words.** When the text
985
- adjacent to an edit repeated a word from the edit itself (replacing
986
- "[Berkshire County / appropriate Massachusetts county]," with "Suffolk
987
- County, Massachusetts," just before "Massachusetts will"), the unchanged
988
- suffix could be drawn as deleted and retyped. Unchanged repeated words now
989
- stay anchored as unchanged, in tracked changes and the diff view alike.
990
- - **Writing a comment no longer collapses the comments margin.** Finishing a
991
- draft that had itself opened the margin always collapsed it — even when
992
- submitting had just created a thread, so the pages jerked sideways in both
993
- directions and hid the card the user just wrote. The margin now stays open
994
- on the new thread; only an abandoned draft with no other open thread
995
- collapses it.
996
- - **Comment card placement around drafts and tracked changes.** A comment
997
- draft started while hovering the card stack could pin its card — and drag
998
- the viewport — to the top of page 1; it now anchors where the draft was
999
- made. A caret inside a resolved thread's highlight, or inside an imported
1000
- thread's replies, activated no card at all; it now activates the right
1001
- open thread. And when a commented paragraph also contains tracked changes,
1002
- the card describes the change under the cursor instead of jumping to the
1003
- top of the paragraph.
1004
- - **The selection card no longer chases the pointer mid-drag.** While the
1005
- mouse button is down nothing pops up under the pointer; the card appears
1006
- on release, anchored below the selection the user meant.
1007
-
1008
- ## 0.4.1
1009
-
1010
- ### Fixed
1011
-
1012
- - **Opening the export menu crashed.** An icon component in the export menu
1013
- referenced React without importing it, which the packaged build has no
1014
- global to fall back on.
1015
-
1016
- ## 0.4.0
1017
-
1018
- ### Changed
1019
-
1020
- - **The default entry no longer ships Tree-sitter syntax highlighting or the
1021
- embedded WASM payload.** Code blocks still render as code, and every WASM
1022
- hot path has a TypeScript implementation. This keeps the normal
1023
- integration smaller and compatible with strict Content Security Policies.
1024
- Optional features now load as async chunks inside the package.
1025
-
1026
- ### Added
1027
-
1028
- - **`@reviseio/sdk/full`** — an opt-in entry point that keeps token-colored
1029
- code blocks and the WASM hot paths. The API and stylesheet are identical
1030
- between the two entries.
1031
-
1032
- ## 0.3.4
1033
-
1034
- ### Fixed
1035
-
1036
- - **The SDK no longer attempts any telemetry.** Earlier builds emitted
1037
- editor health metrics toward a Revise backend that does not exist in your
1038
- deployment, which could only fail — loudly, as console CORS errors — and
1039
- represented network calls you never asked for. Telemetry is now something
1040
- only the revise.io application itself can switch on; embedded editors
1041
- send nothing anywhere: no metric POSTs, no analytics vendor code, no
1042
- beacons.
1043
-
1044
- ### Added
1045
-
1046
- - **`onAnalyticsEvent`** — the editor's own instrumentation, delivered to
1047
- the host instead:
1048
- `<ReviseEditor onAnalyticsEvent={(event, properties) => ...} />`.
1049
- Forward events to your own analytics service; a throwing handler never
1050
- breaks the editor. Event names and property shapes are internal and
1051
- version-unstable.
1052
-
1053
- ## 0.3.3
1054
-
1055
- Four suggesting-mode fixes, two of them content corruption. If your users
1056
- edit in `suggesting` mode — the mode this SDK exists for — take this
1057
- release.
1058
-
1059
- ### Fixed
1060
-
1061
- - **Pasting in suggesting mode corrupted the document.** The paste path
1062
- predated suggesting mode: it duplicated the rest of the paragraph and
1063
- inserted the pasted text without tracked-change marks, so the paste was
1064
- invisible to review and survived reject. Pasting is now recorded exactly
1065
- as if the pasted characters had been typed — an insertion suggestion, plus
1066
- a deletion suggestion for any replaced selection.
1067
- - **Formatting across a pending change destroyed it.** Applying bold (or any
1068
- inline format) over a range touching a pending insertion or deletion
1069
- overwrote the change's identity; resolving the format then silently turned
1070
- a pending insertion into accepted text, or resurrected deleted text.
1071
- Formatting now leaves deletion spans alone, folds into insertion spans (as
1072
- Word nests run properties inside `w:ins`), and records a reviewable
1073
- format change only on unmarked text.
1074
- - **Accepting a deletion that crossed a paragraph boundary left the
1075
- paragraphs unmerged.** The boundary is now part of the suggestion, as the
1076
- pilcrow is in Word: accepting merges the paragraphs, in any resolution
1077
- order, for any number of paragraphs in the selection.
1078
- - **Copying a selection inside your own pending insertion copied nothing.**
1079
- It now copies the selected text. Clipboard payloads are also sanitized so
1080
- tracked-change marks never travel with copied content.
1081
-
1082
- ### Console
1083
-
1084
- - Opening a document no longer logs to the console (previously one Yjs
1085
- warning per block plus two internal debug lines). `console.warn` and
1086
- `console.error` remain for genuinely actionable problems.
1087
-
1088
- ## 0.3.2
1089
-
1090
- ### Fixed
1091
-
1092
- - `editor.whenReady()` was missing from the published type declarations. It
1093
- worked at runtime, but TypeScript rejected the call the documentation tells
1094
- you to make.
1095
-
1096
- ## 0.3.1
1097
-
1098
- ### Fixed
1099
-
1100
- - Using the editor handle from `onReady` no longer throws. `onReady` fires
1101
- before any document exists, and "subscribe to everything on ready" is the
1102
- first thing a host writes — a subscription placed then now waits and
1103
- attaches when a document arrives. `selection.observe()` was affected too.
1104
- Methods that act on a document still fail loudly, and the message now names
1105
- the fix.
1106
-
1107
- ### Added
1108
-
1109
- - `editor.whenReady()` — resolves once a document is open and its
1110
- controllers are usable.
1111
- - `REVISE_SDK_VERSION` and `REVISE_SDK_BUILD` exports, and a `bugs` entry
1112
- in the manifest: a support ticket can name the exact build it came from.
1113
-
1114
- ## 0.3.0
1115
-
1116
- ### Collaboration
1117
-
1118
- Multi-user editing over a Yjs transport you own. The editor builds the
1119
- document; you attach the connection:
1120
-
1121
- ```ts
1122
- collaboration: {
1123
- connect: (doc, awareness) =>
1124
- new HocuspocusProvider({ url, name, document: doc, awareness }),
1125
- synced,
1126
- }
1127
- ```
1128
-
1129
- Remote carets, a presence roster (`editor.collaboration`), seed-or-join
1130
- semantics, and validation of any document you supply. See the collaboration
1131
- guide.
1132
-
1133
- ### Roles
1134
-
1135
- `role="editor" | "suggester" | "viewer"`, editor-wide or per document, and
1136
- enforced on every surface: typing, the built-in chrome, the handle, and agent
1137
- tool calls. A suggester cannot leave suggesting mode, apply anything directly,
1138
- or accept and reject.
1139
-
1140
- ### Tracked changes you can list
1141
-
1142
- `review.listChanges()` and `review.getChange(id)` return each pending change
1143
- with its kind, author, timestamp, affected blocks, and text — enough to build
1144
- your own review panel. Imported Word redlines keep their original reviewers.
1145
-
1146
- ### Server-side primitives
1147
-
1148
- New subpath export `@reviseio/sdk/backend` (Node only): `parseDocument`,
1149
- `fileToYDoc`, `seedYDocFromFile`, `ydocToDocx`, `encodeYDoc`/`decodeYDoc`.
1150
- Your server can create a collaborative room from a .docx before any browser
1151
- connects, and export a live room without one. Requires `jsdom`.
1152
-
1153
- ### Breaking
1154
-
1155
- - **`yjs` and `y-protocols` are now peer dependencies** and are no longer
1156
- bundled. Install them yourself, and make sure your bundler resolves ONE copy
1157
- — Yjs identifies its own types with `instanceof`, so a second copy breaks a
1158
- shared document. Only collaboration needs them; they are optional peers.
1159
- - **`ReviseDocumentInput.docx` is now optional**, since a document joining a
1160
- collaborative room needs no source file. Inputs must supply `docx`,
1161
- `collaboration`, or both.
1162
-
1163
- ### Fixed
1164
-
1165
- - `search_result_id`, which the agent tool schemas advertise for bulk edits,
1166
- was unusable: tool state did not survive between `tools.execute()` calls.
1167
- - `exportDocx()` omitted TOC page numbers, which only the live layout knows.
1168
- - Exports lost imported named styles and reset core property dates in any
1169
- non-browser environment.
1170
- - `collaboration.synced` was read once at mount, so a host reporting sync
1171
- later was ignored and the document never opened.
1172
- - The margin insert-comment chip was missing from the embedded editor.
1173
- - Presence colors: an explicit `currentUser.color` was ignored whenever the
1174
- user had an id.
1175
-
1176
- ## 0.2.0
1177
-
1178
- Multi-document sessions, host-owned chrome, skinning props, per-embed
1179
- theming, the selection controller, and comment-thread agents.
1180
-
1181
- ## 0.1.0
1182
-
1183
- First release: the editor, DOCX in and out, tracked changes, comments, and
1184
- the agent tool surface.
3
+ ## 3.0.1
4
+
5
+ ### Fixed
6
+
7
+ - **Windows-1252 text on Node 20.** Text that isn't UTF-8, like a .txt file
8
+ from a Windows editor piped to `convert`, and RTF files read € “ ” ‘ ’ – —
9
+ and the other characters Windows-1252 stores in bytes 0x80–0x9F as
10
+ invisible control characters. Node 22 and later were not affected.
11
+
12
+ ## 3.0.0
13
+
14
+ The first release of `revise` as a command-line tool and TypeScript library
15
+ for reading, editing, and redlining Word documents.
16
+
17
+ Versions 2.x of this package were the Revise editor for React. The editor is
18
+ now [`@reviseio/editor`](https://www.npmjs.com/package/@reviseio/editor); 2.x
19
+ stays installable.
20
+
21
+ ### Added
22
+
23
+ - **The `revise` CLI.** Read a document as HTML with block ids, search it,
24
+ edit it with the same tools the Revise agent uses, and save the file in
25
+ place, as tracked changes by default in .docx. Review with `changes`,
26
+ `diff`, `accept`, and `reject`; `undo` and `restore` work across edits;
27
+ `render` draws pages as images; `export`, `convert`, `compare`, and `new`
28
+ write .docx, PDF, Markdown, HTML, and text. `convert` also works in a
29
+ pipe: `-` reads stdin (the format is recognized from its bytes) or writes
30
+ stdout. `--out new.docx` on an edit saves the result as a new file and
31
+ leaves the original as it is. Every command has its own
32
+ `--help`, and colored output on a terminal (not in pipes unless
33
+ `FORCE_COLOR` is set; never with `--json`).
34
+ - **`--json` on every command**: one envelope (`schema`, `ok`, `command`,
35
+ `meta`, `data`, `warnings`, `error`) with stable error codes, structured
36
+ partial results, and exit codes that say whether anything was saved.
37
+ Specified in [JSON output](https://revise.io/developer/docs/revise/json) and shipped as a JSON Schema,
38
+ `revise/cli-output.schema.json`.
39
+ - **`ReviseDocument`**, the same operations as a library: open a file or
40
+ bytes, run typed tools, review changes, export with a fidelity report,
41
+ and snapshot and restore state.
42
+ - **`agentTools(doc, { provider })`**: the editing tools in the shapes the
43
+ Anthropic and OpenAI SDKs expect, with a matching result formatter.
44
+ - **Collaboration rooms.** `seedYDoc(room, file)` seeds a sync server's
45
+ Y.Doc on every connection (idempotent, repairs two peers that seeded at
46
+ once, keeps the original Word file in the room), and
47
+ `ReviseDocument.fromYDoc(room)` edits and exports a live room.
48
+ - **Word fidelity.** Untouched content in a .docx exports byte for byte;
49
+ `xml` commands read and patch the raw package for what the tools don't
50
+ cover (styles, numbering, settings).
51
+ - **An agent skill**: `revise skill install` writes a SKILL.md that teaches
52
+ coding agents the CLI.
53
+
54
+ ### Removed
55
+
56
+ - **The editor entry points of 2.x.** `revise/editor`, `revise/editor/full`,
57
+ and `revise/server` now throw an error pointing to `@reviseio/editor`, and
58
+ `revise/style.css` is an empty stylesheet that says the same.