@skaile/forge-editor 0.0.0-stage → 5.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 (2006) hide show
  1. package/CHANGELOG.md +436 -0
  2. package/LICENSE +21 -0
  3. package/README.md +119 -2
  4. package/dist/adapters/anchors.d.ts +80 -0
  5. package/dist/adapters/anchors.js +270 -0
  6. package/dist/adapters/anchors.js.map +1 -0
  7. package/dist/adapters/change-sets/handlers.js +101 -0
  8. package/dist/adapters/change-sets/handlers.js.map +1 -0
  9. package/dist/adapters/change-sets/json.js +62 -0
  10. package/dist/adapters/change-sets/json.js.map +1 -0
  11. package/dist/adapters/change-sets/owner.js +14 -0
  12. package/dist/adapters/change-sets/owner.js.map +1 -0
  13. package/dist/adapters/change-sets/types.d.ts +27 -0
  14. package/dist/adapters/change-sets/types.js +21 -0
  15. package/dist/adapters/change-sets/types.js.map +1 -0
  16. package/dist/adapters/comments/drizzle.d.ts +430 -0
  17. package/dist/adapters/comments/drizzle.js +236 -0
  18. package/dist/adapters/comments/drizzle.js.map +1 -0
  19. package/dist/adapters/comments/errors.d.ts +9 -0
  20. package/dist/adapters/comments/errors.js +19 -0
  21. package/dist/adapters/comments/errors.js.map +1 -0
  22. package/dist/adapters/comments/json.d.ts +19 -0
  23. package/dist/adapters/comments/json.js +86 -0
  24. package/dist/adapters/comments/json.js.map +1 -0
  25. package/dist/adapters/comments/record.d.ts +15 -0
  26. package/dist/adapters/comments/record.js +78 -0
  27. package/dist/adapters/comments/record.js.map +1 -0
  28. package/dist/adapters/comments/rest-model.js +537 -0
  29. package/dist/adapters/comments/rest-model.js.map +1 -0
  30. package/dist/adapters/comments/server.d.ts +24 -0
  31. package/dist/adapters/comments/server.js +103 -0
  32. package/dist/adapters/comments/server.js.map +1 -0
  33. package/dist/adapters/comments/types.d.ts +109 -0
  34. package/dist/adapters/direct-ai.d.ts +36 -0
  35. package/dist/adapters/direct-ai.js +157 -0
  36. package/dist/adapters/direct-ai.js.map +1 -0
  37. package/dist/adapters/document-admin/handlers.js +124 -0
  38. package/dist/adapters/document-admin/handlers.js.map +1 -0
  39. package/dist/adapters/document-state.d.ts +23 -0
  40. package/dist/adapters/document-state.js +66 -0
  41. package/dist/adapters/document-state.js.map +1 -0
  42. package/dist/adapters/documents.js +170 -0
  43. package/dist/adapters/documents.js.map +1 -0
  44. package/dist/adapters/drizzle.d.ts +293 -0
  45. package/dist/adapters/drizzle.js +166 -0
  46. package/dist/adapters/drizzle.js.map +1 -0
  47. package/dist/adapters/embeddings/index.d.ts +2 -0
  48. package/dist/adapters/embeddings/index.js +1 -0
  49. package/dist/adapters/embeddings/openai.d.ts +24 -0
  50. package/dist/adapters/embeddings/openai.js +42 -0
  51. package/dist/adapters/embeddings/openai.js.map +1 -0
  52. package/dist/adapters/files.js +30 -0
  53. package/dist/adapters/files.js.map +1 -0
  54. package/dist/adapters/forge.d.ts +63 -0
  55. package/dist/adapters/forge.js +84 -0
  56. package/dist/adapters/forge.js.map +1 -0
  57. package/dist/adapters/http.d.ts +20 -0
  58. package/dist/adapters/http.js +86 -0
  59. package/dist/adapters/http.js.map +1 -0
  60. package/dist/adapters/index/drizzle.d.ts +406 -0
  61. package/dist/adapters/index/drizzle.js +231 -0
  62. package/dist/adapters/index/drizzle.js.map +1 -0
  63. package/dist/adapters/index/edges.js +13 -0
  64. package/dist/adapters/index/edges.js.map +1 -0
  65. package/dist/adapters/index/handlers.js +281 -0
  66. package/dist/adapters/index/handlers.js.map +1 -0
  67. package/dist/adapters/index/memory.d.ts +9 -0
  68. package/dist/adapters/index/memory.js +56 -0
  69. package/dist/adapters/index/memory.js.map +1 -0
  70. package/dist/adapters/index.d.ts +13 -0
  71. package/dist/adapters/index.js +0 -0
  72. package/dist/adapters/json.d.ts +24 -0
  73. package/dist/adapters/json.js +128 -0
  74. package/dist/adapters/json.js.map +1 -0
  75. package/dist/adapters/knowledge/index.d.ts +2 -0
  76. package/dist/adapters/knowledge/index.js +1 -0
  77. package/dist/adapters/knowledge/memory.d.ts +15 -0
  78. package/dist/adapters/knowledge/memory.js +56 -0
  79. package/dist/adapters/knowledge/memory.js.map +1 -0
  80. package/dist/adapters/memory.d.ts +28 -0
  81. package/dist/adapters/memory.js +117 -0
  82. package/dist/adapters/memory.js.map +1 -0
  83. package/dist/adapters/nitro.d.ts +127 -0
  84. package/dist/adapters/nitro.js +180 -0
  85. package/dist/adapters/nitro.js.map +1 -0
  86. package/dist/adapters/pruefung/handlers.js +99 -0
  87. package/dist/adapters/pruefung/handlers.js.map +1 -0
  88. package/dist/adapters/pruefung/json.js +48 -0
  89. package/dist/adapters/pruefung/json.js.map +1 -0
  90. package/dist/adapters/pruefung/types.d.ts +63 -0
  91. package/dist/adapters/react.d.ts +55 -0
  92. package/dist/adapters/react.js +209 -0
  93. package/dist/adapters/react.js.map +1 -0
  94. package/dist/adapters/render/memory.d.ts +37 -0
  95. package/dist/adapters/render/memory.js +78 -0
  96. package/dist/adapters/render/memory.js.map +1 -0
  97. package/dist/adapters/shared.d.ts +31 -0
  98. package/dist/adapters/shared.js +34 -0
  99. package/dist/adapters/shared.js.map +1 -0
  100. package/dist/adapters/speech/index.d.ts +3 -0
  101. package/dist/adapters/speech/index.js +3 -0
  102. package/dist/adapters/speech/memory.d.ts +16 -0
  103. package/dist/adapters/speech/memory.js +70 -0
  104. package/dist/adapters/speech/memory.js.map +1 -0
  105. package/dist/adapters/speech/openai.d.ts +25 -0
  106. package/dist/adapters/speech/openai.js +69 -0
  107. package/dist/adapters/speech/openai.js.map +1 -0
  108. package/dist/adapters/upstream.js +29 -0
  109. package/dist/adapters/upstream.js.map +1 -0
  110. package/dist/adapters/vue.d.ts +52 -0
  111. package/dist/adapters/vue.js +136 -0
  112. package/dist/adapters/vue.js.map +1 -0
  113. package/dist/change-sets/ChangeSetPanel.js +183 -0
  114. package/dist/change-sets/ChangeSetPanel.js.map +1 -0
  115. package/dist/change-sets/ChangeSetPanel.vue.d.ts +21 -0
  116. package/dist/change-sets/change-set-model.d.ts +54 -0
  117. package/dist/change-sets/change-set-model.js +165 -0
  118. package/dist/change-sets/change-set-model.js.map +1 -0
  119. package/dist/change-sets/index.d.ts +3 -0
  120. package/dist/change-sets/index.js +1 -0
  121. package/dist/change-sets/react/ChangeSetPanel.d.ts +22 -0
  122. package/dist/change-sets/react/ChangeSetPanel.js +161 -0
  123. package/dist/change-sets/react/ChangeSetPanel.js.map +1 -0
  124. package/dist/change-sets/react/use-change-set-model.d.ts +17 -0
  125. package/dist/change-sets/react/use-change-set-model.js +27 -0
  126. package/dist/change-sets/react/use-change-set-model.js.map +1 -0
  127. package/dist/change-sets/react.d.ts +3 -0
  128. package/dist/change-sets/react.js +3 -0
  129. package/dist/change-sets/use-change-set-model.d.ts +17 -0
  130. package/dist/change-sets/use-change-set-model.js +23 -0
  131. package/dist/change-sets/use-change-set-model.js.map +1 -0
  132. package/dist/change-sets/vue.d.ts +3 -0
  133. package/dist/change-sets/vue.js +3 -0
  134. package/dist/code/CodeSurface.d.ts +24 -0
  135. package/dist/code/CodeSurface.js +57 -0
  136. package/dist/code/CodeSurface.js.map +1 -0
  137. package/dist/code/CodeSurface.vue.d.ts +29 -0
  138. package/dist/code/CodeSurface2.js +75 -0
  139. package/dist/code/CodeSurface2.js.map +1 -0
  140. package/dist/code/chrome-theme.js +76 -0
  141. package/dist/code/chrome-theme.js.map +1 -0
  142. package/dist/code/compartments.js +19 -0
  143. package/dist/code/compartments.js.map +1 -0
  144. package/dist/code/editor-factory.d.ts +41 -0
  145. package/dist/code/editor-factory.js +126 -0
  146. package/dist/code/editor-factory.js.map +1 -0
  147. package/dist/code/format-json.d.ts +27 -0
  148. package/dist/code/format-json.js +94 -0
  149. package/dist/code/format-json.js.map +1 -0
  150. package/dist/code/highlight-style.js +118 -0
  151. package/dist/code/highlight-style.js.map +1 -0
  152. package/dist/code/index.d.ts +6 -0
  153. package/dist/code/index.js +6 -0
  154. package/dist/code/jsonl-language.d.ts +6 -0
  155. package/dist/code/jsonl-language.js +33 -0
  156. package/dist/code/jsonl-language.js.map +1 -0
  157. package/dist/code/kind.d.ts +15 -0
  158. package/dist/code/kind.js +142 -0
  159. package/dist/code/kind.js.map +1 -0
  160. package/dist/code/lang-registry.d.ts +31 -0
  161. package/dist/code/lang-registry.js +54 -0
  162. package/dist/code/lang-registry.js.map +1 -0
  163. package/dist/code/react.d.ts +2 -0
  164. package/dist/code/react.js +1 -0
  165. package/dist/code/vue.d.ts +2 -0
  166. package/dist/code/vue.js +1 -0
  167. package/dist/config/index.d.ts +105 -0
  168. package/dist/config/index.js +95 -0
  169. package/dist/config/index.js.map +1 -0
  170. package/dist/core/abilities.d.ts +33 -0
  171. package/dist/core/abilities.js +163 -0
  172. package/dist/core/abilities.js.map +1 -0
  173. package/dist/core/add-on-support.d.ts +32 -0
  174. package/dist/core/add-on-support.js +64 -0
  175. package/dist/core/add-on-support.js.map +1 -0
  176. package/dist/core/agent-op-types.d.ts +50 -0
  177. package/dist/core/agent-op-types.js +30 -0
  178. package/dist/core/agent-op-types.js.map +1 -0
  179. package/dist/core/api-routes.d.ts +204 -0
  180. package/dist/core/api-routes.js +73 -0
  181. package/dist/core/api-routes.js.map +1 -0
  182. package/dist/core/backend-capability.d.ts +9 -0
  183. package/dist/core/backend-capability.js +24 -0
  184. package/dist/core/backend-capability.js.map +1 -0
  185. package/dist/core/backend-types.d.ts +352 -0
  186. package/dist/core/backend-types.js +17 -0
  187. package/dist/core/backend-types.js.map +1 -0
  188. package/dist/core/backend.d.ts +260 -0
  189. package/dist/core/backend.js +19 -0
  190. package/dist/core/backend.js.map +1 -0
  191. package/dist/core/block-convert.d.ts +35 -0
  192. package/dist/core/block-convert.js +101 -0
  193. package/dist/core/block-convert.js.map +1 -0
  194. package/dist/core/block-drag.d.ts +12 -0
  195. package/dist/core/block-drag.js +66 -0
  196. package/dist/core/block-drag.js.map +1 -0
  197. package/dist/core/block-flash.d.ts +19 -0
  198. package/dist/core/block-flash.js +66 -0
  199. package/dist/core/block-flash.js.map +1 -0
  200. package/dist/core/block-index.d.ts +150 -0
  201. package/dist/core/block-index.js +279 -0
  202. package/dist/core/block-index.js.map +1 -0
  203. package/dist/core/block-search.d.ts +43 -0
  204. package/dist/core/block-search.js +118 -0
  205. package/dist/core/block-search.js.map +1 -0
  206. package/dist/core/block-snippet.d.ts +17 -0
  207. package/dist/core/block-snippet.js +30 -0
  208. package/dist/core/block-snippet.js.map +1 -0
  209. package/dist/core/block-transfer.d.ts +52 -0
  210. package/dist/core/block-transfer.js +77 -0
  211. package/dist/core/block-transfer.js.map +1 -0
  212. package/dist/core/capabilities.d.ts +111 -0
  213. package/dist/core/capabilities.js +151 -0
  214. package/dist/core/capabilities.js.map +1 -0
  215. package/dist/core/change-set.d.ts +60 -0
  216. package/dist/core/change-set.js +33 -0
  217. package/dist/core/change-set.js.map +1 -0
  218. package/dist/core/command-types.d.ts +96 -0
  219. package/dist/core/commands.d.ts +40 -0
  220. package/dist/core/commands.js +156 -0
  221. package/dist/core/commands.js.map +1 -0
  222. package/dist/core/context.d.ts +60 -0
  223. package/dist/core/context.js +111 -0
  224. package/dist/core/context.js.map +1 -0
  225. package/dist/core/conversions.d.ts +33 -0
  226. package/dist/core/conversions.js +93 -0
  227. package/dist/core/conversions.js.map +1 -0
  228. package/dist/core/convert.d.ts +97 -0
  229. package/dist/core/convert.js +242 -0
  230. package/dist/core/convert.js.map +1 -0
  231. package/dist/core/core-feature.d.ts +35 -0
  232. package/dist/core/core-feature.js +139 -0
  233. package/dist/core/core-feature.js.map +1 -0
  234. package/dist/core/define-editor.d.ts +24 -0
  235. package/dist/core/define-editor.js +152 -0
  236. package/dist/core/define-editor.js.map +1 -0
  237. package/dist/core/derivation.d.ts +150 -0
  238. package/dist/core/derivation.js +319 -0
  239. package/dist/core/derivation.js.map +1 -0
  240. package/dist/core/derive.d.ts +61 -0
  241. package/dist/core/derive.js +69 -0
  242. package/dist/core/derive.js.map +1 -0
  243. package/dist/core/doc-anchors.d.ts +72 -0
  244. package/dist/core/doc-anchors.js +113 -0
  245. package/dist/core/doc-anchors.js.map +1 -0
  246. package/dist/core/document-markdown.d.ts +14 -0
  247. package/dist/core/document-markdown.js +44 -0
  248. package/dist/core/document-markdown.js.map +1 -0
  249. package/dist/core/document-summary.d.ts +23 -0
  250. package/dist/core/download.d.ts +7 -0
  251. package/dist/core/download.js +20 -0
  252. package/dist/core/download.js.map +1 -0
  253. package/dist/core/draft-field.js +60 -0
  254. package/dist/core/draft-field.js.map +1 -0
  255. package/dist/core/editor-ui.d.ts +60 -0
  256. package/dist/core/editor-ui.js +95 -0
  257. package/dist/core/editor-ui.js.map +1 -0
  258. package/dist/core/extension-points.d.ts +131 -0
  259. package/dist/core/feature-context.d.ts +39 -0
  260. package/dist/core/feature-context.js +68 -0
  261. package/dist/core/feature-context.js.map +1 -0
  262. package/dist/core/feature.d.ts +323 -0
  263. package/dist/core/feature.js +12 -0
  264. package/dist/core/feature.js.map +1 -0
  265. package/dist/core/fences.js +105 -0
  266. package/dist/core/fences.js.map +1 -0
  267. package/dist/core/fetch-error.d.ts +5 -0
  268. package/dist/core/fetch-error.js +13 -0
  269. package/dist/core/fetch-error.js.map +1 -0
  270. package/dist/core/frontmatter.d.ts +27 -0
  271. package/dist/core/frontmatter.js +98 -0
  272. package/dist/core/frontmatter.js.map +1 -0
  273. package/dist/core/graph.d.ts +53 -0
  274. package/dist/core/graph.js +147 -0
  275. package/dist/core/graph.js.map +1 -0
  276. package/dist/core/hash.d.ts +5 -0
  277. package/dist/core/hash.js +11 -0
  278. package/dist/core/hash.js.map +1 -0
  279. package/dist/core/http-backend.d.ts +11 -0
  280. package/dist/core/http-backend.js +320 -0
  281. package/dist/core/http-backend.js.map +1 -0
  282. package/dist/core/import-check.d.ts +37 -0
  283. package/dist/core/import-check.js +82 -0
  284. package/dist/core/import-check.js.map +1 -0
  285. package/dist/core/index.d.ts +61 -0
  286. package/dist/core/index.js +55 -0
  287. package/dist/core/knowledge.d.ts +29 -0
  288. package/dist/core/knowledge.js +9 -0
  289. package/dist/core/knowledge.js.map +1 -0
  290. package/dist/core/metadata-types.d.ts +27 -0
  291. package/dist/core/metadata-types.js +10 -0
  292. package/dist/core/metadata-types.js.map +1 -0
  293. package/dist/core/metadata.d.ts +39 -0
  294. package/dist/core/metadata.js +76 -0
  295. package/dist/core/metadata.js.map +1 -0
  296. package/dist/core/notify.d.ts +36 -0
  297. package/dist/core/notify.js +7 -0
  298. package/dist/core/notify.js.map +1 -0
  299. package/dist/core/palette.d.ts +48 -0
  300. package/dist/core/palette.js +95 -0
  301. package/dist/core/palette.js.map +1 -0
  302. package/dist/core/pipeline.d.ts +76 -0
  303. package/dist/core/pipeline.js +132 -0
  304. package/dist/core/pipeline.js.map +1 -0
  305. package/dist/core/properties.d.ts +50 -0
  306. package/dist/core/properties.js +79 -0
  307. package/dist/core/properties.js.map +1 -0
  308. package/dist/core/property-kinds.d.ts +36 -0
  309. package/dist/core/property-kinds.js +303 -0
  310. package/dist/core/property-kinds.js.map +1 -0
  311. package/dist/core/query-types.d.ts +21 -0
  312. package/dist/core/query-types.js +16 -0
  313. package/dist/core/query-types.js.map +1 -0
  314. package/dist/core/query.d.ts +137 -0
  315. package/dist/core/query.js +483 -0
  316. package/dist/core/query.js.map +1 -0
  317. package/dist/core/related.d.ts +14 -0
  318. package/dist/core/related.js +41 -0
  319. package/dist/core/related.js.map +1 -0
  320. package/dist/core/schema/abilities.d.ts +58 -0
  321. package/dist/core/schema/abilities.js +122 -0
  322. package/dist/core/schema/abilities.js.map +1 -0
  323. package/dist/core/schema/block-ids.d.ts +29 -0
  324. package/dist/core/schema/block-ids.js +135 -0
  325. package/dist/core/schema/block-ids.js.map +1 -0
  326. package/dist/core/schema/hex-color.d.ts +5 -0
  327. package/dist/core/schema/hex-color.js +7 -0
  328. package/dist/core/schema/hex-color.js.map +1 -0
  329. package/dist/core/schema/index.d.ts +49 -0
  330. package/dist/core/schema/index.js +56 -0
  331. package/dist/core/schema/index.js.map +1 -0
  332. package/dist/core/schema/mark-flags.d.ts +19 -0
  333. package/dist/core/schema/node-flags.d.ts +23 -0
  334. package/dist/core/schema/node-flags.js +34 -0
  335. package/dist/core/schema/node-flags.js.map +1 -0
  336. package/dist/core/schema/of-features.d.ts +13 -0
  337. package/dist/core/schema/of-features.js +14 -0
  338. package/dist/core/schema/of-features.js.map +1 -0
  339. package/dist/core/schema/opaque-fence.d.ts +11 -0
  340. package/dist/core/schema/opaque-fence.js +57 -0
  341. package/dist/core/schema/opaque-fence.js.map +1 -0
  342. package/dist/core/schema/persisted-names.d.ts +51 -0
  343. package/dist/core/schema/persisted-names.js +90 -0
  344. package/dist/core/schema/persisted-names.js.map +1 -0
  345. package/dist/core/schema/strike.d.ts +4 -0
  346. package/dist/core/schema/strike.js +9 -0
  347. package/dist/core/schema/strike.js.map +1 -0
  348. package/dist/core/selection-range.d.ts +13 -0
  349. package/dist/core/selection-range.js +28 -0
  350. package/dist/core/selection-range.js.map +1 -0
  351. package/dist/core/serial.js +22 -0
  352. package/dist/core/serial.js.map +1 -0
  353. package/dist/core/slash.d.ts +26 -0
  354. package/dist/core/slash.js +68 -0
  355. package/dist/core/slash.js.map +1 -0
  356. package/dist/core/source-anchor.d.ts +38 -0
  357. package/dist/core/source-anchor.js +72 -0
  358. package/dist/core/source-anchor.js.map +1 -0
  359. package/dist/core/sse.js +77 -0
  360. package/dist/core/sse.js.map +1 -0
  361. package/dist/core/store.d.ts +22 -0
  362. package/dist/core/store.js +61 -0
  363. package/dist/core/store.js.map +1 -0
  364. package/dist/core/suggestion-popup.d.ts +63 -0
  365. package/dist/core/suggestion-popup.js +57 -0
  366. package/dist/core/suggestion-popup.js.map +1 -0
  367. package/dist/core/surface-session.js +153 -0
  368. package/dist/core/surface-session.js.map +1 -0
  369. package/dist/core/tag-name.d.ts +11 -0
  370. package/dist/core/tag-name.js +15 -0
  371. package/dist/core/tag-name.js.map +1 -0
  372. package/dist/core/templates.d.ts +32 -0
  373. package/dist/core/templates.js +67 -0
  374. package/dist/core/templates.js.map +1 -0
  375. package/dist/core/toolbar-items.d.ts +16 -0
  376. package/dist/core/toolbar-items.js +280 -0
  377. package/dist/core/toolbar-items.js.map +1 -0
  378. package/dist/core/transaction-guards.d.ts +21 -0
  379. package/dist/core/transaction-guards.js +49 -0
  380. package/dist/core/transaction-guards.js.map +1 -0
  381. package/dist/core/typed-block.d.ts +86 -0
  382. package/dist/core/typed-block.js +81 -0
  383. package/dist/core/typed-block.js.map +1 -0
  384. package/dist/core/util.js +15 -0
  385. package/dist/core/util.js.map +1 -0
  386. package/dist/document/DocumentSurface.d.ts +38 -0
  387. package/dist/document/DocumentSurface.js +44 -0
  388. package/dist/document/DocumentSurface.js.map +1 -0
  389. package/dist/document/DocumentSurface.vue.d.ts +56 -0
  390. package/dist/document/DocumentSurface2.js +71 -0
  391. package/dist/document/DocumentSurface2.js.map +1 -0
  392. package/dist/document/react.d.ts +2 -0
  393. package/dist/document/react.js +1 -0
  394. package/dist/document/vue.d.ts +2 -0
  395. package/dist/document/vue.js +1 -0
  396. package/dist/features/ai/actions.d.ts +33 -0
  397. package/dist/features/ai/actions.js +83 -0
  398. package/dist/features/ai/actions.js.map +1 -0
  399. package/dist/features/ai/agent-op-review.d.ts +69 -0
  400. package/dist/features/ai/agent-op-review.js +180 -0
  401. package/dist/features/ai/agent-op-review.js.map +1 -0
  402. package/dist/features/ai/agent-ops.d.ts +16 -0
  403. package/dist/features/ai/agent-ops.js +220 -0
  404. package/dist/features/ai/agent-ops.js.map +1 -0
  405. package/dist/features/ai/ai-apply.d.ts +76 -0
  406. package/dist/features/ai/ai-apply.js +193 -0
  407. package/dist/features/ai/ai-apply.js.map +1 -0
  408. package/dist/features/ai/ai-menu.d.ts +38 -0
  409. package/dist/features/ai/ai-menu.js +20 -0
  410. package/dist/features/ai/ai-menu.js.map +1 -0
  411. package/dist/features/ai/ai-review.d.ts +146 -0
  412. package/dist/features/ai/ai-review.js +555 -0
  413. package/dist/features/ai/ai-review.js.map +1 -0
  414. package/dist/features/ai/ai-selection-highlight.d.ts +21 -0
  415. package/dist/features/ai/ai-selection-highlight.js +44 -0
  416. package/dist/features/ai/ai-selection-highlight.js.map +1 -0
  417. package/dist/features/ai/ai-sse.d.ts +28 -0
  418. package/dist/features/ai/ai-sse.js +43 -0
  419. package/dist/features/ai/ai-sse.js.map +1 -0
  420. package/dist/features/ai/assistant.d.ts +54 -0
  421. package/dist/features/ai/assistant.js +82 -0
  422. package/dist/features/ai/assistant.js.map +1 -0
  423. package/dist/features/ai/block-actions.d.ts +21 -0
  424. package/dist/features/ai/block-actions.js +56 -0
  425. package/dist/features/ai/block-actions.js.map +1 -0
  426. package/dist/features/ai/components/AiReviewBar.js +106 -0
  427. package/dist/features/ai/components/AiReviewBar.js.map +1 -0
  428. package/dist/features/ai/components/AiReviewBar.vue.d.ts +16 -0
  429. package/dist/features/ai/components/AiSelectionMenu.js +345 -0
  430. package/dist/features/ai/components/AiSelectionMenu.js.map +1 -0
  431. package/dist/features/ai/components/AiSelectionMenu.vue.d.ts +18 -0
  432. package/dist/features/ai/components/AiSidebar.js +287 -0
  433. package/dist/features/ai/components/AiSidebar.js.map +1 -0
  434. package/dist/features/ai/components/AiSidebar.vue.d.ts +31 -0
  435. package/dist/features/ai/components/DocumentChatAnswer.js +67 -0
  436. package/dist/features/ai/components/DocumentChatAnswer.js.map +1 -0
  437. package/dist/features/ai/components/DocumentChatAnswer.vue.d.ts +13 -0
  438. package/dist/features/ai/components/DocumentChatGenerationPart.js +76 -0
  439. package/dist/features/ai/components/DocumentChatGenerationPart.js.map +1 -0
  440. package/dist/features/ai/components/DocumentChatOps.js +114 -0
  441. package/dist/features/ai/components/DocumentChatOps.js.map +1 -0
  442. package/dist/features/ai/components/DocumentChatOps.vue.d.ts +28 -0
  443. package/dist/features/ai/components/DocumentChatOpsPart.js +40 -0
  444. package/dist/features/ai/components/DocumentChatOpsPart.js.map +1 -0
  445. package/dist/features/ai/components/DocumentChatTextPart.js +40 -0
  446. package/dist/features/ai/components/DocumentChatTextPart.js.map +1 -0
  447. package/dist/features/ai/components/ModelQuickSwitch.js +89 -0
  448. package/dist/features/ai/components/ModelQuickSwitch.js.map +1 -0
  449. package/dist/features/ai/components/ModelQuickSwitch.vue.d.ts +23 -0
  450. package/dist/features/ai/components/SettingsAiTab.js +88 -0
  451. package/dist/features/ai/components/SettingsAiTab.js.map +1 -0
  452. package/dist/features/ai/components/SettingsAiTab.vue.d.ts +6 -0
  453. package/dist/features/ai/components/SettingsModelProfiles.js +241 -0
  454. package/dist/features/ai/components/SettingsModelProfiles.js.map +1 -0
  455. package/dist/features/ai/components/SettingsModelProfiles.vue.d.ts +6 -0
  456. package/dist/features/ai/document-chat-model.d.ts +99 -0
  457. package/dist/features/ai/document-chat-model.js +209 -0
  458. package/dist/features/ai/document-chat-model.js.map +1 -0
  459. package/dist/features/ai/document-chat.d.ts +18 -0
  460. package/dist/features/ai/document-chat.js +110 -0
  461. package/dist/features/ai/document-chat.js.map +1 -0
  462. package/dist/features/ai/feature.d.ts +25 -0
  463. package/dist/features/ai/feature.js +102 -0
  464. package/dist/features/ai/feature.js.map +1 -0
  465. package/dist/features/ai/ghost-autocomplete.d.ts +48 -0
  466. package/dist/features/ai/ghost-autocomplete.js +201 -0
  467. package/dist/features/ai/ghost-autocomplete.js.map +1 -0
  468. package/dist/features/ai/index.d.ts +30 -0
  469. package/dist/features/ai/index.js +28 -0
  470. package/dist/features/ai/model-profiles.d.ts +37 -0
  471. package/dist/features/ai/model-profiles.js +111 -0
  472. package/dist/features/ai/model-profiles.js.map +1 -0
  473. package/dist/features/ai/model-quick-switch.js +19 -0
  474. package/dist/features/ai/model-quick-switch.js.map +1 -0
  475. package/dist/features/ai/model-test-flow.js +34 -0
  476. package/dist/features/ai/model-test-flow.js.map +1 -0
  477. package/dist/features/ai/preview-extensions.js +14 -0
  478. package/dist/features/ai/preview-extensions.js.map +1 -0
  479. package/dist/features/ai/protocol/agent-ops.d.ts +92 -0
  480. package/dist/features/ai/protocol/agent-ops.js +330 -0
  481. package/dist/features/ai/protocol/agent-ops.js.map +1 -0
  482. package/dist/features/ai/protocol/block-lines.d.ts +89 -0
  483. package/dist/features/ai/protocol/block-lines.js +177 -0
  484. package/dist/features/ai/protocol/block-lines.js.map +1 -0
  485. package/dist/features/ai/protocol/chat.d.ts +74 -0
  486. package/dist/features/ai/protocol/chat.js +202 -0
  487. package/dist/features/ai/protocol/chat.js.map +1 -0
  488. package/dist/features/ai/protocol/complete.d.ts +40 -0
  489. package/dist/features/ai/protocol/complete.js +107 -0
  490. package/dist/features/ai/protocol/complete.js.map +1 -0
  491. package/dist/features/ai/protocol/generate.d.ts +95 -0
  492. package/dist/features/ai/protocol/generate.js +58 -0
  493. package/dist/features/ai/protocol/generate.js.map +1 -0
  494. package/dist/features/ai/protocol/index.d.ts +11 -0
  495. package/dist/features/ai/protocol/index.js +10 -0
  496. package/dist/features/ai/protocol/models.d.ts +34 -0
  497. package/dist/features/ai/protocol/models.js +41 -0
  498. package/dist/features/ai/protocol/models.js.map +1 -0
  499. package/dist/features/ai/protocol/schemas.d.ts +36 -0
  500. package/dist/features/ai/protocol/schemas.js +40 -0
  501. package/dist/features/ai/protocol/schemas.js.map +1 -0
  502. package/dist/features/ai/protocol/tasks.d.ts +109 -0
  503. package/dist/features/ai/protocol/tasks.js +299 -0
  504. package/dist/features/ai/protocol/tasks.js.map +1 -0
  505. package/dist/features/ai/rate-limit.d.ts +9 -0
  506. package/dist/features/ai/rate-limit.js +22 -0
  507. package/dist/features/ai/rate-limit.js.map +1 -0
  508. package/dist/features/ai/react/AiReviewBar.d.ts +13 -0
  509. package/dist/features/ai/react/AiReviewBar.js +99 -0
  510. package/dist/features/ai/react/AiReviewBar.js.map +1 -0
  511. package/dist/features/ai/react/AiSelectionMenu.d.ts +15 -0
  512. package/dist/features/ai/react/AiSelectionMenu.js +322 -0
  513. package/dist/features/ai/react/AiSelectionMenu.js.map +1 -0
  514. package/dist/features/ai/react/AiSidebar.d.ts +22 -0
  515. package/dist/features/ai/react/AiSidebar.js +339 -0
  516. package/dist/features/ai/react/AiSidebar.js.map +1 -0
  517. package/dist/features/ai/react/DocumentChatAnswer.d.ts +10 -0
  518. package/dist/features/ai/react/DocumentChatAnswer.js +70 -0
  519. package/dist/features/ai/react/DocumentChatAnswer.js.map +1 -0
  520. package/dist/features/ai/react/DocumentChatOps.d.ts +20 -0
  521. package/dist/features/ai/react/DocumentChatOps.js +112 -0
  522. package/dist/features/ai/react/DocumentChatOps.js.map +1 -0
  523. package/dist/features/ai/react/ModelQuickSwitch.d.ts +19 -0
  524. package/dist/features/ai/react/ModelQuickSwitch.js +87 -0
  525. package/dist/features/ai/react/ModelQuickSwitch.js.map +1 -0
  526. package/dist/features/ai/react/SettingsAiTab.d.ts +5 -0
  527. package/dist/features/ai/react/SettingsAiTab.js +103 -0
  528. package/dist/features/ai/react/SettingsAiTab.js.map +1 -0
  529. package/dist/features/ai/react/SettingsModelProfiles.d.ts +8 -0
  530. package/dist/features/ai/react/SettingsModelProfiles.js +298 -0
  531. package/dist/features/ai/react/SettingsModelProfiles.js.map +1 -0
  532. package/dist/features/ai/react/use-ai-assistant.d.ts +22 -0
  533. package/dist/features/ai/react/use-ai-assistant.js +36 -0
  534. package/dist/features/ai/react/use-ai-assistant.js.map +1 -0
  535. package/dist/features/ai/react/use-ai-review-bar.js +29 -0
  536. package/dist/features/ai/react/use-ai-review-bar.js.map +1 -0
  537. package/dist/features/ai/react/use-ai-selection-flow.js +34 -0
  538. package/dist/features/ai/react/use-ai-selection-flow.js.map +1 -0
  539. package/dist/features/ai/react/use-document-chat.d.ts +34 -0
  540. package/dist/features/ai/react/use-document-chat.js +49 -0
  541. package/dist/features/ai/react/use-document-chat.js.map +1 -0
  542. package/dist/features/ai/react/use-model-profiles.d.ts +21 -0
  543. package/dist/features/ai/react/use-model-profiles.js +33 -0
  544. package/dist/features/ai/react/use-model-profiles.js.map +1 -0
  545. package/dist/features/ai/react.d.ts +23 -0
  546. package/dist/features/ai/react.js +28 -0
  547. package/dist/features/ai/react.js.map +1 -0
  548. package/dist/features/ai/review-bar-model.d.ts +52 -0
  549. package/dist/features/ai/review-bar-model.js +96 -0
  550. package/dist/features/ai/review-bar-model.js.map +1 -0
  551. package/dist/features/ai/selection-flow.d.ts +133 -0
  552. package/dist/features/ai/selection-flow.js +283 -0
  553. package/dist/features/ai/selection-flow.js.map +1 -0
  554. package/dist/features/ai/sidebar-context.js +6 -0
  555. package/dist/features/ai/sidebar-context.js.map +1 -0
  556. package/dist/features/ai/sidebar-flow.d.ts +61 -0
  557. package/dist/features/ai/sidebar-flow.js +125 -0
  558. package/dist/features/ai/sidebar-flow.js.map +1 -0
  559. package/dist/features/ai/sidebar-messages.js +65 -0
  560. package/dist/features/ai/sidebar-messages.js.map +1 -0
  561. package/dist/features/ai/use-ai-assistant.d.ts +22 -0
  562. package/dist/features/ai/use-ai-assistant.js +39 -0
  563. package/dist/features/ai/use-ai-assistant.js.map +1 -0
  564. package/dist/features/ai/use-document-chat.d.ts +34 -0
  565. package/dist/features/ai/use-document-chat.js +46 -0
  566. package/dist/features/ai/use-document-chat.js.map +1 -0
  567. package/dist/features/ai/use-model-profiles.d.ts +24 -0
  568. package/dist/features/ai/use-model-profiles.js +50 -0
  569. package/dist/features/ai/use-model-profiles.js.map +1 -0
  570. package/dist/features/ai/vue.d.ts +21 -0
  571. package/dist/features/ai/vue.js +28 -0
  572. package/dist/features/ai/vue.js.map +1 -0
  573. package/dist/features/authors/attribution.d.ts +36 -0
  574. package/dist/features/authors/attribution.js +94 -0
  575. package/dist/features/authors/attribution.js.map +1 -0
  576. package/dist/features/authors/author-color-styles.d.ts +12 -0
  577. package/dist/features/authors/author-color-styles.js +24 -0
  578. package/dist/features/authors/author-color-styles.js.map +1 -0
  579. package/dist/features/authors/components/AuthorColorsButton.js +50 -0
  580. package/dist/features/authors/components/AuthorColorsButton.js.map +1 -0
  581. package/dist/features/authors/components/AuthorColorsButton.vue.d.ts +11 -0
  582. package/dist/features/authors/components/AuthorColorsPanel.js +72 -0
  583. package/dist/features/authors/components/AuthorColorsPanel.js.map +1 -0
  584. package/dist/features/authors/components/AuthorColorsPanel.vue.d.ts +11 -0
  585. package/dist/features/authors/components/SettingsAuthorsTab.js +49 -0
  586. package/dist/features/authors/components/SettingsAuthorsTab.js.map +1 -0
  587. package/dist/features/authors/components/SettingsAuthorsTab.vue.d.ts +6 -0
  588. package/dist/features/authors/feature.d.ts +22 -0
  589. package/dist/features/authors/feature.js +48 -0
  590. package/dist/features/authors/feature.js.map +1 -0
  591. package/dist/features/authors/index.d.ts +7 -0
  592. package/dist/features/authors/index.js +6 -0
  593. package/dist/features/authors/react/AuthorColorsButton.d.ts +8 -0
  594. package/dist/features/authors/react/AuthorColorsButton.js +41 -0
  595. package/dist/features/authors/react/AuthorColorsButton.js.map +1 -0
  596. package/dist/features/authors/react/AuthorColorsPanel.d.ts +8 -0
  597. package/dist/features/authors/react/AuthorColorsPanel.js +125 -0
  598. package/dist/features/authors/react/AuthorColorsPanel.js.map +1 -0
  599. package/dist/features/authors/react/SettingsAuthorsTab.d.ts +5 -0
  600. package/dist/features/authors/react/SettingsAuthorsTab.js +92 -0
  601. package/dist/features/authors/react/SettingsAuthorsTab.js.map +1 -0
  602. package/dist/features/authors/react.d.ts +11 -0
  603. package/dist/features/authors/react.js +16 -0
  604. package/dist/features/authors/react.js.map +1 -0
  605. package/dist/features/authors/schema.d.ts +22 -0
  606. package/dist/features/authors/schema.js +70 -0
  607. package/dist/features/authors/schema.js.map +1 -0
  608. package/dist/features/authors/vue.d.ts +10 -0
  609. package/dist/features/authors/vue.js +16 -0
  610. package/dist/features/authors/vue.js.map +1 -0
  611. package/dist/features/block-ui/block-actions.d.ts +59 -0
  612. package/dist/features/block-ui/block-actions.js +168 -0
  613. package/dist/features/block-ui/block-actions.js.map +1 -0
  614. package/dist/features/block-ui/block-target.d.ts +29 -0
  615. package/dist/features/block-ui/block-target.js +63 -0
  616. package/dist/features/block-ui/block-target.js.map +1 -0
  617. package/dist/features/block-ui/components/BlockActionsOverlay.js +170 -0
  618. package/dist/features/block-ui/components/BlockActionsOverlay.js.map +1 -0
  619. package/dist/features/block-ui/components/BlockActionsOverlay.vue.d.ts +36 -0
  620. package/dist/features/block-ui/components/BlockHandles.js +113 -0
  621. package/dist/features/block-ui/components/BlockHandles.js.map +1 -0
  622. package/dist/features/block-ui/components/BlockUi.js +201 -0
  623. package/dist/features/block-ui/components/BlockUi.js.map +1 -0
  624. package/dist/features/block-ui/components/BlockUi.vue.d.ts +19 -0
  625. package/dist/features/block-ui/feature.d.ts +28 -0
  626. package/dist/features/block-ui/feature.js +30 -0
  627. package/dist/features/block-ui/feature.js.map +1 -0
  628. package/dist/features/block-ui/handle-geometry.js +41 -0
  629. package/dist/features/block-ui/handle-geometry.js.map +1 -0
  630. package/dist/features/block-ui/index.d.ts +5 -0
  631. package/dist/features/block-ui/index.js +4 -0
  632. package/dist/features/block-ui/react/BlockActionsOverlay.d.ts +30 -0
  633. package/dist/features/block-ui/react/BlockActionsOverlay.js +158 -0
  634. package/dist/features/block-ui/react/BlockActionsOverlay.js.map +1 -0
  635. package/dist/features/block-ui/react/BlockHandles.d.ts +15 -0
  636. package/dist/features/block-ui/react/BlockHandles.js +104 -0
  637. package/dist/features/block-ui/react/BlockHandles.js.map +1 -0
  638. package/dist/features/block-ui/react/BlockUi.d.ts +16 -0
  639. package/dist/features/block-ui/react/BlockUi.js +190 -0
  640. package/dist/features/block-ui/react/BlockUi.js.map +1 -0
  641. package/dist/features/block-ui/react.d.ts +13 -0
  642. package/dist/features/block-ui/react.js +13 -0
  643. package/dist/features/block-ui/react.js.map +1 -0
  644. package/dist/features/block-ui/vue.d.ts +11 -0
  645. package/dist/features/block-ui/vue.js +12 -0
  646. package/dist/features/block-ui/vue.js.map +1 -0
  647. package/dist/features/collab/anchor-resolver.d.ts +7 -0
  648. package/dist/features/collab/anchor-resolver.js +92 -0
  649. package/dist/features/collab/anchor-resolver.js.map +1 -0
  650. package/dist/features/collab/feature.d.ts +22 -0
  651. package/dist/features/collab/feature.js +38 -0
  652. package/dist/features/collab/feature.js.map +1 -0
  653. package/dist/features/collab/index.d.ts +3 -0
  654. package/dist/features/collab/index.js +3 -0
  655. package/dist/features/collab/react.d.ts +7 -0
  656. package/dist/features/collab/react.js +10 -0
  657. package/dist/features/collab/react.js.map +1 -0
  658. package/dist/features/collab/vue.d.ts +6 -0
  659. package/dist/features/collab/vue.js +37 -0
  660. package/dist/features/collab/vue.js.map +1 -0
  661. package/dist/features/comments/comments-plugin.d.ts +71 -0
  662. package/dist/features/comments/comments-plugin.js +185 -0
  663. package/dist/features/comments/comments-plugin.js.map +1 -0
  664. package/dist/features/comments/components/CommentBubble.js +54 -0
  665. package/dist/features/comments/components/CommentBubble.js.map +1 -0
  666. package/dist/features/comments/components/CommentBubble.vue.d.ts +14 -0
  667. package/dist/features/comments/components/CommentComposer.js +87 -0
  668. package/dist/features/comments/components/CommentComposer.js.map +1 -0
  669. package/dist/features/comments/components/CommentComposer.vue.d.ts +21 -0
  670. package/dist/features/comments/components/CommentThreadView.js +258 -0
  671. package/dist/features/comments/components/CommentThreadView.js.map +1 -0
  672. package/dist/features/comments/components/CommentThreadView.vue.d.ts +30 -0
  673. package/dist/features/comments/components/CommentsListMenu.js +134 -0
  674. package/dist/features/comments/components/CommentsListMenu.js.map +1 -0
  675. package/dist/features/comments/components/CommentsListMenu.vue.d.ts +10 -0
  676. package/dist/features/comments/components/CommentsMargin.js +169 -0
  677. package/dist/features/comments/components/CommentsMargin.js.map +1 -0
  678. package/dist/features/comments/components/CommentsMargin.vue.d.ts +16 -0
  679. package/dist/features/comments/components/CommentsOverlay.js +39 -0
  680. package/dist/features/comments/components/CommentsOverlay.js.map +1 -0
  681. package/dist/features/comments/components/CommentsPopover.js +124 -0
  682. package/dist/features/comments/components/CommentsPopover.js.map +1 -0
  683. package/dist/features/comments/components/CommentsPopover.vue.d.ts +10 -0
  684. package/dist/features/comments/components/CommentsToolbarButton.js +61 -0
  685. package/dist/features/comments/components/CommentsToolbarButton.js.map +1 -0
  686. package/dist/features/comments/components/SettingsCommentsTab.js +46 -0
  687. package/dist/features/comments/components/SettingsCommentsTab.js.map +1 -0
  688. package/dist/features/comments/components/SettingsCommentsTab.vue.d.ts +6 -0
  689. package/dist/features/comments/feature.d.ts +39 -0
  690. package/dist/features/comments/feature.js +129 -0
  691. package/dist/features/comments/feature.js.map +1 -0
  692. package/dist/features/comments/index.d.ts +9 -0
  693. package/dist/features/comments/index.js +8 -0
  694. package/dist/features/comments/margin-controller.d.ts +44 -0
  695. package/dist/features/comments/margin-controller.js +132 -0
  696. package/dist/features/comments/margin-controller.js.map +1 -0
  697. package/dist/features/comments/margin-layout.d.ts +56 -0
  698. package/dist/features/comments/margin-layout.js +79 -0
  699. package/dist/features/comments/margin-layout.js.map +1 -0
  700. package/dist/features/comments/model.d.ts +31 -0
  701. package/dist/features/comments/model.js +416 -0
  702. package/dist/features/comments/model.js.map +1 -0
  703. package/dist/features/comments/react/CommentAvatar.js +24 -0
  704. package/dist/features/comments/react/CommentAvatar.js.map +1 -0
  705. package/dist/features/comments/react/CommentBubble.d.ts +11 -0
  706. package/dist/features/comments/react/CommentBubble.js +43 -0
  707. package/dist/features/comments/react/CommentBubble.js.map +1 -0
  708. package/dist/features/comments/react/CommentComposer.d.ts +15 -0
  709. package/dist/features/comments/react/CommentComposer.js +69 -0
  710. package/dist/features/comments/react/CommentComposer.js.map +1 -0
  711. package/dist/features/comments/react/CommentThreadView.d.ts +25 -0
  712. package/dist/features/comments/react/CommentThreadView.js +249 -0
  713. package/dist/features/comments/react/CommentThreadView.js.map +1 -0
  714. package/dist/features/comments/react/CommentsListMenu.d.ts +8 -0
  715. package/dist/features/comments/react/CommentsListMenu.js +115 -0
  716. package/dist/features/comments/react/CommentsListMenu.js.map +1 -0
  717. package/dist/features/comments/react/CommentsMargin.d.ts +11 -0
  718. package/dist/features/comments/react/CommentsMargin.js +128 -0
  719. package/dist/features/comments/react/CommentsMargin.js.map +1 -0
  720. package/dist/features/comments/react/CommentsOverlay.d.ts +11 -0
  721. package/dist/features/comments/react/CommentsOverlay.js +52 -0
  722. package/dist/features/comments/react/CommentsOverlay.js.map +1 -0
  723. package/dist/features/comments/react/CommentsPopover.d.ts +15 -0
  724. package/dist/features/comments/react/CommentsPopover.js +107 -0
  725. package/dist/features/comments/react/CommentsPopover.js.map +1 -0
  726. package/dist/features/comments/react/CommentsToolbarButton.d.ts +12 -0
  727. package/dist/features/comments/react/CommentsToolbarButton.js +52 -0
  728. package/dist/features/comments/react/CommentsToolbarButton.js.map +1 -0
  729. package/dist/features/comments/react/SettingsCommentsTab.d.ts +5 -0
  730. package/dist/features/comments/react/SettingsCommentsTab.js +77 -0
  731. package/dist/features/comments/react/SettingsCommentsTab.js.map +1 -0
  732. package/dist/features/comments/react/use-comments.d.ts +18 -0
  733. package/dist/features/comments/react/use-comments.js +37 -0
  734. package/dist/features/comments/react/use-comments.js.map +1 -0
  735. package/dist/features/comments/react/use-margin-layout.js +45 -0
  736. package/dist/features/comments/react/use-margin-layout.js.map +1 -0
  737. package/dist/features/comments/react.d.ts +23 -0
  738. package/dist/features/comments/react.js +28 -0
  739. package/dist/features/comments/react.js.map +1 -0
  740. package/dist/features/comments/schema.d.ts +24 -0
  741. package/dist/features/comments/schema.js +41 -0
  742. package/dist/features/comments/schema.js.map +1 -0
  743. package/dist/features/comments/shortcuts.js +34 -0
  744. package/dist/features/comments/shortcuts.js.map +1 -0
  745. package/dist/features/comments/snapshot-equality.js +40 -0
  746. package/dist/features/comments/snapshot-equality.js.map +1 -0
  747. package/dist/features/comments/thread-anchor.js +33 -0
  748. package/dist/features/comments/thread-anchor.js.map +1 -0
  749. package/dist/features/comments/use-comments.d.ts +40 -0
  750. package/dist/features/comments/use-comments.js +46 -0
  751. package/dist/features/comments/use-comments.js.map +1 -0
  752. package/dist/features/comments/use-margin-layout.js +29 -0
  753. package/dist/features/comments/use-margin-layout.js.map +1 -0
  754. package/dist/features/comments/vue.d.ts +20 -0
  755. package/dist/features/comments/vue.js +28 -0
  756. package/dist/features/comments/vue.js.map +1 -0
  757. package/dist/features/composites/accepted-children.d.ts +23 -0
  758. package/dist/features/composites/accepted-children.js +142 -0
  759. package/dist/features/composites/accepted-children.js.map +1 -0
  760. package/dist/features/composites/ai-brief.d.ts +31 -0
  761. package/dist/features/composites/ai-brief.js +120 -0
  762. package/dist/features/composites/ai-brief.js.map +1 -0
  763. package/dist/features/composites/ai-proposal.d.ts +12 -0
  764. package/dist/features/composites/ai-proposal.js +19 -0
  765. package/dist/features/composites/ai-proposal.js.map +1 -0
  766. package/dist/features/composites/anchors.d.ts +47 -0
  767. package/dist/features/composites/anchors.js +137 -0
  768. package/dist/features/composites/anchors.js.map +1 -0
  769. package/dist/features/composites/badges.d.ts +11 -0
  770. package/dist/features/composites/badges.js +24 -0
  771. package/dist/features/composites/badges.js.map +1 -0
  772. package/dist/features/composites/baskets.d.ts +27 -0
  773. package/dist/features/composites/baskets.js +44 -0
  774. package/dist/features/composites/baskets.js.map +1 -0
  775. package/dist/features/composites/bibliography-command.d.ts +11 -0
  776. package/dist/features/composites/bibliography-form.js +90 -0
  777. package/dist/features/composites/bibliography-form.js.map +1 -0
  778. package/dist/features/composites/bibliography.d.ts +37 -0
  779. package/dist/features/composites/bibliography.js +120 -0
  780. package/dist/features/composites/bibliography.js.map +1 -0
  781. package/dist/features/composites/block-types-json.d.ts +38 -0
  782. package/dist/features/composites/block-types-json.js +122 -0
  783. package/dist/features/composites/block-types-json.js.map +1 -0
  784. package/dist/features/composites/block-types.d.ts +120 -0
  785. package/dist/features/composites/block-types.js +422 -0
  786. package/dist/features/composites/block-types.js.map +1 -0
  787. package/dist/features/composites/capabilities.js +121 -0
  788. package/dist/features/composites/capabilities.js.map +1 -0
  789. package/dist/features/composites/chrome-badges.js +57 -0
  790. package/dist/features/composites/chrome-badges.js.map +1 -0
  791. package/dist/features/composites/cite-label.d.ts +27 -0
  792. package/dist/features/composites/cite-label.js +41 -0
  793. package/dist/features/composites/cite-label.js.map +1 -0
  794. package/dist/features/composites/cite-suggestion.d.ts +10 -0
  795. package/dist/features/composites/cite-suggestion.js +39 -0
  796. package/dist/features/composites/cite-suggestion.js.map +1 -0
  797. package/dist/features/composites/cite.d.ts +49 -0
  798. package/dist/features/composites/cite.js +153 -0
  799. package/dist/features/composites/cite.js.map +1 -0
  800. package/dist/features/composites/collection-actions.js +28 -0
  801. package/dist/features/composites/collection-actions.js.map +1 -0
  802. package/dist/features/composites/collection-model.d.ts +79 -0
  803. package/dist/features/composites/collection-model.js +258 -0
  804. package/dist/features/composites/collection-model.js.map +1 -0
  805. package/dist/features/composites/collection.d.ts +22 -0
  806. package/dist/features/composites/collection.js +49 -0
  807. package/dist/features/composites/collection.js.map +1 -0
  808. package/dist/features/composites/components/BibliographyEditor.js +261 -0
  809. package/dist/features/composites/components/BibliographyEditor.js.map +1 -0
  810. package/dist/features/composites/components/BlockEmbedView.js +61 -0
  811. package/dist/features/composites/components/BlockEmbedView.js.map +1 -0
  812. package/dist/features/composites/components/BlockEmbedView.vue.d.ts +96 -0
  813. package/dist/features/composites/components/CiteView.js +111 -0
  814. package/dist/features/composites/components/CiteView.js.map +1 -0
  815. package/dist/features/composites/components/CiteView.vue.d.ts +96 -0
  816. package/dist/features/composites/components/CollectionView.js +151 -0
  817. package/dist/features/composites/components/CollectionView.js.map +1 -0
  818. package/dist/features/composites/components/CollectionView.vue.d.ts +96 -0
  819. package/dist/features/composites/components/CompositeBasketMenu.js +97 -0
  820. package/dist/features/composites/components/CompositeBasketMenu.js.map +1 -0
  821. package/dist/features/composites/components/CompositeChrome.js +366 -0
  822. package/dist/features/composites/components/CompositeChrome.js.map +1 -0
  823. package/dist/features/composites/components/CompositeChrome.vue.d.ts +19 -0
  824. package/dist/features/composites/components/CompositeDetails.js +169 -0
  825. package/dist/features/composites/components/CompositeDetails.js.map +1 -0
  826. package/dist/features/composites/components/CompositeDetails.vue.d.ts +19 -0
  827. package/dist/features/composites/components/CompositeFieldEditor.js +200 -0
  828. package/dist/features/composites/components/CompositeFieldEditor.js.map +1 -0
  829. package/dist/features/composites/components/CompositeFieldEditor.vue.d.ts +23 -0
  830. package/dist/features/composites/components/CompositeInspector.js +365 -0
  831. package/dist/features/composites/components/CompositeInspector.js.map +1 -0
  832. package/dist/features/composites/components/CompositeInspector.vue.d.ts +32 -0
  833. package/dist/features/composites/components/CompositeStatusMenu.js +51 -0
  834. package/dist/features/composites/components/CompositeStatusMenu.js.map +1 -0
  835. package/dist/features/composites/components/CompositeStatusMenu.vue.d.ts +28 -0
  836. package/dist/features/composites/components/CompositeSummaryEditor.js +66 -0
  837. package/dist/features/composites/components/CompositeSummaryEditor.js.map +1 -0
  838. package/dist/features/composites/components/CompositeSummaryEditor.vue.d.ts +18 -0
  839. package/dist/features/composites/components/CompositeTable.js +294 -0
  840. package/dist/features/composites/components/CompositeTable.js.map +1 -0
  841. package/dist/features/composites/components/CompositeTable.vue.d.ts +15 -0
  842. package/dist/features/composites/components/CompositeTagsEditor.js +95 -0
  843. package/dist/features/composites/components/CompositeTagsEditor.js.map +1 -0
  844. package/dist/features/composites/components/CompositeTagsEditor.vue.d.ts +13 -0
  845. package/dist/features/composites/components/CompositeView.js +78 -0
  846. package/dist/features/composites/components/CompositeView.js.map +1 -0
  847. package/dist/features/composites/components/CompositeView.vue.d.ts +106 -0
  848. package/dist/features/composites/components/DataView.js +249 -0
  849. package/dist/features/composites/components/DataView.js.map +1 -0
  850. package/dist/features/composites/components/DataView.vue.d.ts +96 -0
  851. package/dist/features/composites/components/DerivationBadge.js +126 -0
  852. package/dist/features/composites/components/DerivationBadge.js.map +1 -0
  853. package/dist/features/composites/components/DocumentBadges.js +40 -0
  854. package/dist/features/composites/components/DocumentBadges.js.map +1 -0
  855. package/dist/features/composites/components/DocumentBadges.vue.d.ts +15 -0
  856. package/dist/features/composites/components/EdgesSection.js +142 -0
  857. package/dist/features/composites/components/EdgesSection.js.map +1 -0
  858. package/dist/features/composites/components/EdgesSection.vue.d.ts +17 -0
  859. package/dist/features/composites/components/ExportCheckSection.js +66 -0
  860. package/dist/features/composites/components/ExportCheckSection.js.map +1 -0
  861. package/dist/features/composites/components/ExportCheckSection.vue.d.ts +17 -0
  862. package/dist/features/composites/components/FocusChip.js +53 -0
  863. package/dist/features/composites/components/FocusChip.js.map +1 -0
  864. package/dist/features/composites/components/FocusChip.vue.d.ts +14 -0
  865. package/dist/features/composites/components/InspectorSections.js +46 -0
  866. package/dist/features/composites/components/InspectorSections.js.map +1 -0
  867. package/dist/features/composites/components/QueryBuilder.js +271 -0
  868. package/dist/features/composites/components/QueryBuilder.js.map +1 -0
  869. package/dist/features/composites/components/QueryBuilder.vue.d.ts +15 -0
  870. package/dist/features/composites/components/ReferenceFieldSelect.js +60 -0
  871. package/dist/features/composites/components/ReferenceFieldSelect.js.map +1 -0
  872. package/dist/features/composites/components/ReferenceListFieldEditor.js +71 -0
  873. package/dist/features/composites/components/ReferenceListFieldEditor.js.map +1 -0
  874. package/dist/features/composites/components/ReferenceView.js +120 -0
  875. package/dist/features/composites/components/ReferenceView.js.map +1 -0
  876. package/dist/features/composites/components/ReferenceView.vue.d.ts +96 -0
  877. package/dist/features/composites/components/SettingsEditingTab.js +155 -0
  878. package/dist/features/composites/components/SettingsEditingTab.js.map +1 -0
  879. package/dist/features/composites/components/SettingsEditingTab.vue.d.ts +11 -0
  880. package/dist/features/composites/convert.d.ts +24 -0
  881. package/dist/features/composites/convert.js +143 -0
  882. package/dist/features/composites/convert.js.map +1 -0
  883. package/dist/features/composites/derived-chrome.js +109 -0
  884. package/dist/features/composites/derived-chrome.js.map +1 -0
  885. package/dist/features/composites/details-model.js +90 -0
  886. package/dist/features/composites/details-model.js.map +1 -0
  887. package/dist/features/composites/edges-model.js +154 -0
  888. package/dist/features/composites/edges-model.js.map +1 -0
  889. package/dist/features/composites/editing-settings-keys.js +47 -0
  890. package/dist/features/composites/editing-settings-keys.js.map +1 -0
  891. package/dist/features/composites/embed-dom.d.ts +38 -0
  892. package/dist/features/composites/embed-dom.js +145 -0
  893. package/dist/features/composites/embed-dom.js.map +1 -0
  894. package/dist/features/composites/embed-model.d.ts +31 -0
  895. package/dist/features/composites/embed-model.js +81 -0
  896. package/dist/features/composites/embed-model.js.map +1 -0
  897. package/dist/features/composites/embed-suggestion.d.ts +12 -0
  898. package/dist/features/composites/embed-suggestion.js +51 -0
  899. package/dist/features/composites/embed-suggestion.js.map +1 -0
  900. package/dist/features/composites/embed.d.ts +61 -0
  901. package/dist/features/composites/embed.js +160 -0
  902. package/dist/features/composites/embed.js.map +1 -0
  903. package/dist/features/composites/export-check.d.ts +48 -0
  904. package/dist/features/composites/export-check.js +87 -0
  905. package/dist/features/composites/export-check.js.map +1 -0
  906. package/dist/features/composites/feature.d.ts +53 -0
  907. package/dist/features/composites/feature.js +536 -0
  908. package/dist/features/composites/feature.js.map +1 -0
  909. package/dist/features/composites/fences.d.ts +12 -0
  910. package/dist/features/composites/fences.js +135 -0
  911. package/dist/features/composites/fences.js.map +1 -0
  912. package/dist/features/composites/focus.d.ts +38 -0
  913. package/dist/features/composites/focus.js +87 -0
  914. package/dist/features/composites/focus.js.map +1 -0
  915. package/dist/features/composites/foreign-blocks.d.ts +22 -0
  916. package/dist/features/composites/foreign-blocks.js +117 -0
  917. package/dist/features/composites/foreign-blocks.js.map +1 -0
  918. package/dist/features/composites/heading-composites.d.ts +37 -0
  919. package/dist/features/composites/heading-composites.js +163 -0
  920. package/dist/features/composites/heading-composites.js.map +1 -0
  921. package/dist/features/composites/index.d.ts +54 -0
  922. package/dist/features/composites/index.js +54 -0
  923. package/dist/features/composites/inspector-model.d.ts +123 -0
  924. package/dist/features/composites/inspector-model.js +292 -0
  925. package/dist/features/composites/inspector-model.js.map +1 -0
  926. package/dist/features/composites/legacy.d.ts +6 -0
  927. package/dist/features/composites/legacy.js +73 -0
  928. package/dist/features/composites/legacy.js.map +1 -0
  929. package/dist/features/composites/markdown-export.d.ts +18 -0
  930. package/dist/features/composites/markdown-export.js +59 -0
  931. package/dist/features/composites/markdown-export.js.map +1 -0
  932. package/dist/features/composites/merge.d.ts +25 -0
  933. package/dist/features/composites/merge.js +77 -0
  934. package/dist/features/composites/merge.js.map +1 -0
  935. package/dist/features/composites/meta-display.d.ts +12 -0
  936. package/dist/features/composites/meta-display.js +113 -0
  937. package/dist/features/composites/meta-display.js.map +1 -0
  938. package/dist/features/composites/meta-keys.d.ts +8 -0
  939. package/dist/features/composites/meta-keys.js +23 -0
  940. package/dist/features/composites/meta-keys.js.map +1 -0
  941. package/dist/features/composites/node-views.d.ts +56 -0
  942. package/dist/features/composites/node-views.js +46 -0
  943. package/dist/features/composites/node-views.js.map +1 -0
  944. package/dist/features/composites/nodes.d.ts +74 -0
  945. package/dist/features/composites/nodes.js +570 -0
  946. package/dist/features/composites/nodes.js.map +1 -0
  947. package/dist/features/composites/outline.d.ts +88 -0
  948. package/dist/features/composites/outline.js +201 -0
  949. package/dist/features/composites/outline.js.map +1 -0
  950. package/dist/features/composites/properties.d.ts +50 -0
  951. package/dist/features/composites/properties.js +118 -0
  952. package/dist/features/composites/properties.js.map +1 -0
  953. package/dist/features/composites/react/BibliographyEditor.js +229 -0
  954. package/dist/features/composites/react/BibliographyEditor.js.map +1 -0
  955. package/dist/features/composites/react/BlockEmbedView.d.ts +10 -0
  956. package/dist/features/composites/react/BlockEmbedView.js +57 -0
  957. package/dist/features/composites/react/BlockEmbedView.js.map +1 -0
  958. package/dist/features/composites/react/CiteView.d.ts +10 -0
  959. package/dist/features/composites/react/CiteView.js +94 -0
  960. package/dist/features/composites/react/CiteView.js.map +1 -0
  961. package/dist/features/composites/react/CollectionView.d.ts +10 -0
  962. package/dist/features/composites/react/CollectionView.js +114 -0
  963. package/dist/features/composites/react/CollectionView.js.map +1 -0
  964. package/dist/features/composites/react/CompositeBasketMenu.js +88 -0
  965. package/dist/features/composites/react/CompositeBasketMenu.js.map +1 -0
  966. package/dist/features/composites/react/CompositeChrome.d.ts +16 -0
  967. package/dist/features/composites/react/CompositeChrome.js +346 -0
  968. package/dist/features/composites/react/CompositeChrome.js.map +1 -0
  969. package/dist/features/composites/react/CompositeDetails.d.ts +16 -0
  970. package/dist/features/composites/react/CompositeDetails.js +159 -0
  971. package/dist/features/composites/react/CompositeDetails.js.map +1 -0
  972. package/dist/features/composites/react/CompositeFieldEditor.d.ts +18 -0
  973. package/dist/features/composites/react/CompositeFieldEditor.js +163 -0
  974. package/dist/features/composites/react/CompositeFieldEditor.js.map +1 -0
  975. package/dist/features/composites/react/CompositeInspector.d.ts +23 -0
  976. package/dist/features/composites/react/CompositeInspector.js +379 -0
  977. package/dist/features/composites/react/CompositeInspector.js.map +1 -0
  978. package/dist/features/composites/react/CompositeStatusMenu.d.ts +15 -0
  979. package/dist/features/composites/react/CompositeStatusMenu.js +36 -0
  980. package/dist/features/composites/react/CompositeStatusMenu.js.map +1 -0
  981. package/dist/features/composites/react/CompositeSummaryEditor.d.ts +15 -0
  982. package/dist/features/composites/react/CompositeSummaryEditor.js +46 -0
  983. package/dist/features/composites/react/CompositeSummaryEditor.js.map +1 -0
  984. package/dist/features/composites/react/CompositeTable.d.ts +11 -0
  985. package/dist/features/composites/react/CompositeTable.js +288 -0
  986. package/dist/features/composites/react/CompositeTable.js.map +1 -0
  987. package/dist/features/composites/react/CompositeTagsEditor.d.ts +10 -0
  988. package/dist/features/composites/react/CompositeTagsEditor.js +122 -0
  989. package/dist/features/composites/react/CompositeTagsEditor.js.map +1 -0
  990. package/dist/features/composites/react/CompositeView.d.ts +9 -0
  991. package/dist/features/composites/react/CompositeView.js +54 -0
  992. package/dist/features/composites/react/CompositeView.js.map +1 -0
  993. package/dist/features/composites/react/DataView.d.ts +10 -0
  994. package/dist/features/composites/react/DataView.js +204 -0
  995. package/dist/features/composites/react/DataView.js.map +1 -0
  996. package/dist/features/composites/react/DerivationBadge.js +137 -0
  997. package/dist/features/composites/react/DerivationBadge.js.map +1 -0
  998. package/dist/features/composites/react/DocumentBadges.d.ts +12 -0
  999. package/dist/features/composites/react/DocumentBadges.js +28 -0
  1000. package/dist/features/composites/react/DocumentBadges.js.map +1 -0
  1001. package/dist/features/composites/react/EdgesSection.d.ts +14 -0
  1002. package/dist/features/composites/react/EdgesSection.js +114 -0
  1003. package/dist/features/composites/react/EdgesSection.js.map +1 -0
  1004. package/dist/features/composites/react/ExportCheckSection.d.ts +14 -0
  1005. package/dist/features/composites/react/ExportCheckSection.js +51 -0
  1006. package/dist/features/composites/react/ExportCheckSection.js.map +1 -0
  1007. package/dist/features/composites/react/FocusChip.d.ts +11 -0
  1008. package/dist/features/composites/react/FocusChip.js +50 -0
  1009. package/dist/features/composites/react/FocusChip.js.map +1 -0
  1010. package/dist/features/composites/react/InspectorSections.js +30 -0
  1011. package/dist/features/composites/react/InspectorSections.js.map +1 -0
  1012. package/dist/features/composites/react/QueryBuilder.d.ts +11 -0
  1013. package/dist/features/composites/react/QueryBuilder.js +235 -0
  1014. package/dist/features/composites/react/QueryBuilder.js.map +1 -0
  1015. package/dist/features/composites/react/ReferenceFieldSelect.js +52 -0
  1016. package/dist/features/composites/react/ReferenceFieldSelect.js.map +1 -0
  1017. package/dist/features/composites/react/ReferenceListFieldEditor.js +70 -0
  1018. package/dist/features/composites/react/ReferenceListFieldEditor.js.map +1 -0
  1019. package/dist/features/composites/react/ReferenceView.d.ts +11 -0
  1020. package/dist/features/composites/react/ReferenceView.js +110 -0
  1021. package/dist/features/composites/react/ReferenceView.js.map +1 -0
  1022. package/dist/features/composites/react/SettingsEditingTab.d.ts +8 -0
  1023. package/dist/features/composites/react/SettingsEditingTab.js +188 -0
  1024. package/dist/features/composites/react/SettingsEditingTab.js.map +1 -0
  1025. package/dist/features/composites/react/use-chrome-badges.js +50 -0
  1026. package/dist/features/composites/react/use-chrome-badges.js.map +1 -0
  1027. package/dist/features/composites/react/use-composite-anchors.d.ts +17 -0
  1028. package/dist/features/composites/react/use-composite-anchors.js +46 -0
  1029. package/dist/features/composites/react/use-composite-anchors.js.map +1 -0
  1030. package/dist/features/composites/react/use-composite-details.js +26 -0
  1031. package/dist/features/composites/react/use-composite-details.js.map +1 -0
  1032. package/dist/features/composites/react/use-composite-inspector.js +29 -0
  1033. package/dist/features/composites/react/use-composite-inspector.js.map +1 -0
  1034. package/dist/features/composites/react/use-composite-rows.d.ts +11 -0
  1035. package/dist/features/composites/react/use-composite-rows.js +26 -0
  1036. package/dist/features/composites/react/use-composite-rows.js.map +1 -0
  1037. package/dist/features/composites/react.d.ts +34 -0
  1038. package/dist/features/composites/react.js +52 -0
  1039. package/dist/features/composites/react.js.map +1 -0
  1040. package/dist/features/composites/reference-ai.js +16 -0
  1041. package/dist/features/composites/reference-ai.js.map +1 -0
  1042. package/dist/features/composites/reference-label.d.ts +19 -0
  1043. package/dist/features/composites/reference-label.js +92 -0
  1044. package/dist/features/composites/reference-label.js.map +1 -0
  1045. package/dist/features/composites/reference-list-model.js +35 -0
  1046. package/dist/features/composites/reference-list-model.js.map +1 -0
  1047. package/dist/features/composites/reference-suggestion.d.ts +13 -0
  1048. package/dist/features/composites/reference-suggestion.js +63 -0
  1049. package/dist/features/composites/reference-suggestion.js.map +1 -0
  1050. package/dist/features/composites/reference-text.d.ts +19 -0
  1051. package/dist/features/composites/reference-text.js +91 -0
  1052. package/dist/features/composites/reference-text.js.map +1 -0
  1053. package/dist/features/composites/reference.d.ts +53 -0
  1054. package/dist/features/composites/reference.js +168 -0
  1055. package/dist/features/composites/reference.js.map +1 -0
  1056. package/dist/features/composites/render-actions.js +109 -0
  1057. package/dist/features/composites/render-actions.js.map +1 -0
  1058. package/dist/features/composites/reveal-source.d.ts +38 -0
  1059. package/dist/features/composites/reveal-source.js +102 -0
  1060. package/dist/features/composites/reveal-source.js.map +1 -0
  1061. package/dist/features/composites/rows-model.d.ts +38 -0
  1062. package/dist/features/composites/rows-model.js +93 -0
  1063. package/dist/features/composites/rows-model.js.map +1 -0
  1064. package/dist/features/composites/rows.d.ts +88 -0
  1065. package/dist/features/composites/rows.js +189 -0
  1066. package/dist/features/composites/rows.js.map +1 -0
  1067. package/dist/features/composites/schema.d.ts +32 -0
  1068. package/dist/features/composites/schema.js +42 -0
  1069. package/dist/features/composites/schema.js.map +1 -0
  1070. package/dist/features/composites/source.d.ts +20 -0
  1071. package/dist/features/composites/source.js +49 -0
  1072. package/dist/features/composites/source.js.map +1 -0
  1073. package/dist/features/composites/split.d.ts +62 -0
  1074. package/dist/features/composites/split.js +164 -0
  1075. package/dist/features/composites/split.js.map +1 -0
  1076. package/dist/features/composites/structure-mode.d.ts +11 -0
  1077. package/dist/features/composites/structure-mode.js +16 -0
  1078. package/dist/features/composites/structure-mode.js.map +1 -0
  1079. package/dist/features/composites/structure.d.ts +19 -0
  1080. package/dist/features/composites/structure.js +19 -0
  1081. package/dist/features/composites/structure.js.map +1 -0
  1082. package/dist/features/composites/table-model.js +340 -0
  1083. package/dist/features/composites/table-model.js.map +1 -0
  1084. package/dist/features/composites/tree-root.d.ts +11 -0
  1085. package/dist/features/composites/tree-root.js +16 -0
  1086. package/dist/features/composites/tree-root.js.map +1 -0
  1087. package/dist/features/composites/use-chrome-badges.js +61 -0
  1088. package/dist/features/composites/use-chrome-badges.js.map +1 -0
  1089. package/dist/features/composites/use-composite-anchors.d.ts +18 -0
  1090. package/dist/features/composites/use-composite-anchors.js +42 -0
  1091. package/dist/features/composites/use-composite-anchors.js.map +1 -0
  1092. package/dist/features/composites/use-composite-details.js +24 -0
  1093. package/dist/features/composites/use-composite-details.js.map +1 -0
  1094. package/dist/features/composites/use-composite-inspector.js +43 -0
  1095. package/dist/features/composites/use-composite-inspector.js.map +1 -0
  1096. package/dist/features/composites/use-composite-rows.d.ts +25 -0
  1097. package/dist/features/composites/use-composite-rows.js +28 -0
  1098. package/dist/features/composites/use-composite-rows.js.map +1 -0
  1099. package/dist/features/composites/views/data-view-model.d.ts +133 -0
  1100. package/dist/features/composites/views/data-view-model.js +323 -0
  1101. package/dist/features/composites/views/data-view-model.js.map +1 -0
  1102. package/dist/features/composites/views/data-view.d.ts +21 -0
  1103. package/dist/features/composites/views/data-view.js +40 -0
  1104. package/dist/features/composites/views/data-view.js.map +1 -0
  1105. package/dist/features/composites/views/layouts.d.ts +140 -0
  1106. package/dist/features/composites/views/layouts.js +160 -0
  1107. package/dist/features/composites/views/layouts.js.map +1 -0
  1108. package/dist/features/composites/views/query-builder-model.d.ts +121 -0
  1109. package/dist/features/composites/views/query-builder-model.js +402 -0
  1110. package/dist/features/composites/views/query-builder-model.js.map +1 -0
  1111. package/dist/features/composites/vue.d.ts +33 -0
  1112. package/dist/features/composites/vue.js +52 -0
  1113. package/dist/features/composites/vue.js.map +1 -0
  1114. package/dist/features/explore/components/ExplorePanel.js +283 -0
  1115. package/dist/features/explore/components/ExplorePanel.js.map +1 -0
  1116. package/dist/features/explore/components/ExplorePanel.vue.d.ts +22 -0
  1117. package/dist/features/explore/components/ExploreSection.js +82 -0
  1118. package/dist/features/explore/components/ExploreSection.js.map +1 -0
  1119. package/dist/features/explore/components/ExploreSection.vue.d.ts +19 -0
  1120. package/dist/features/explore/explore-model.d.ts +95 -0
  1121. package/dist/features/explore/explore-model.js +273 -0
  1122. package/dist/features/explore/explore-model.js.map +1 -0
  1123. package/dist/features/explore/feature.d.ts +47 -0
  1124. package/dist/features/explore/feature.js +52 -0
  1125. package/dist/features/explore/feature.js.map +1 -0
  1126. package/dist/features/explore/index.d.ts +3 -0
  1127. package/dist/features/explore/index.js +3 -0
  1128. package/dist/features/explore/react/ExplorePanel.d.ts +22 -0
  1129. package/dist/features/explore/react/ExplorePanel.js +292 -0
  1130. package/dist/features/explore/react/ExplorePanel.js.map +1 -0
  1131. package/dist/features/explore/react/ExploreSection.d.ts +18 -0
  1132. package/dist/features/explore/react/ExploreSection.js +65 -0
  1133. package/dist/features/explore/react/ExploreSection.js.map +1 -0
  1134. package/dist/features/explore/react/use-explore-model.d.ts +19 -0
  1135. package/dist/features/explore/react/use-explore-model.js +39 -0
  1136. package/dist/features/explore/react/use-explore-model.js.map +1 -0
  1137. package/dist/features/explore/react.d.ts +15 -0
  1138. package/dist/features/explore/react.js +20 -0
  1139. package/dist/features/explore/react.js.map +1 -0
  1140. package/dist/features/explore/use-explore-model.d.ts +20 -0
  1141. package/dist/features/explore/use-explore-model.js +25 -0
  1142. package/dist/features/explore/use-explore-model.js.map +1 -0
  1143. package/dist/features/explore/vue.d.ts +14 -0
  1144. package/dist/features/explore/vue.js +34 -0
  1145. package/dist/features/explore/vue.js.map +1 -0
  1146. package/dist/features/image-studio/components/ImageStudioChat.js +121 -0
  1147. package/dist/features/image-studio/components/ImageStudioChat.js.map +1 -0
  1148. package/dist/features/image-studio/components/ImageStudioDialog.js +422 -0
  1149. package/dist/features/image-studio/components/ImageStudioDialog.js.map +1 -0
  1150. package/dist/features/image-studio/components/ImageStudioDialog.vue.d.ts +29 -0
  1151. package/dist/features/image-studio/components/ImageStudioLibraryPanel.js +186 -0
  1152. package/dist/features/image-studio/components/ImageStudioLibraryPanel.js.map +1 -0
  1153. package/dist/features/image-studio/components/ImageStudioLibraryTile.js +134 -0
  1154. package/dist/features/image-studio/components/ImageStudioLibraryTile.js.map +1 -0
  1155. package/dist/features/image-studio/components/ImageStudioTile.js +74 -0
  1156. package/dist/features/image-studio/components/ImageStudioTile.js.map +1 -0
  1157. package/dist/features/image-studio/components/ImageStudioView.js +117 -0
  1158. package/dist/features/image-studio/components/ImageStudioView.js.map +1 -0
  1159. package/dist/features/image-studio/feature.d.ts +24 -0
  1160. package/dist/features/image-studio/feature.js +53 -0
  1161. package/dist/features/image-studio/feature.js.map +1 -0
  1162. package/dist/features/image-studio/index.d.ts +6 -0
  1163. package/dist/features/image-studio/index.js +4 -0
  1164. package/dist/features/image-studio/library.d.ts +35 -0
  1165. package/dist/features/image-studio/node-core.d.ts +46 -0
  1166. package/dist/features/image-studio/node-core.js +79 -0
  1167. package/dist/features/image-studio/node-core.js.map +1 -0
  1168. package/dist/features/image-studio/node-store.d.ts +19 -0
  1169. package/dist/features/image-studio/node-store.js +35 -0
  1170. package/dist/features/image-studio/node-store.js.map +1 -0
  1171. package/dist/features/image-studio/react/ImageStudioChat.js +101 -0
  1172. package/dist/features/image-studio/react/ImageStudioChat.js.map +1 -0
  1173. package/dist/features/image-studio/react/ImageStudioDialog.d.ts +19 -0
  1174. package/dist/features/image-studio/react/ImageStudioDialog.js +388 -0
  1175. package/dist/features/image-studio/react/ImageStudioDialog.js.map +1 -0
  1176. package/dist/features/image-studio/react/ImageStudioLibraryPanel.js +142 -0
  1177. package/dist/features/image-studio/react/ImageStudioLibraryPanel.js.map +1 -0
  1178. package/dist/features/image-studio/react/ImageStudioLibraryTile.js +105 -0
  1179. package/dist/features/image-studio/react/ImageStudioLibraryTile.js.map +1 -0
  1180. package/dist/features/image-studio/react/ImageStudioTile.js +51 -0
  1181. package/dist/features/image-studio/react/ImageStudioTile.js.map +1 -0
  1182. package/dist/features/image-studio/react/ImageStudioView.js +126 -0
  1183. package/dist/features/image-studio/react/ImageStudioView.js.map +1 -0
  1184. package/dist/features/image-studio/react/store.d.ts +46 -0
  1185. package/dist/features/image-studio/react/store.js +46 -0
  1186. package/dist/features/image-studio/react/store.js.map +1 -0
  1187. package/dist/features/image-studio/react.d.ts +19 -0
  1188. package/dist/features/image-studio/react.js +21 -0
  1189. package/dist/features/image-studio/react.js.map +1 -0
  1190. package/dist/features/image-studio/schema.d.ts +29 -0
  1191. package/dist/features/image-studio/schema.js +86 -0
  1192. package/dist/features/image-studio/schema.js.map +1 -0
  1193. package/dist/features/image-studio/state.d.ts +57 -0
  1194. package/dist/features/image-studio/state.js +155 -0
  1195. package/dist/features/image-studio/state.js.map +1 -0
  1196. package/dist/features/image-studio/store.d.ts +34 -0
  1197. package/dist/features/image-studio/vue.d.ts +18 -0
  1198. package/dist/features/image-studio/vue.js +20 -0
  1199. package/dist/features/image-studio/vue.js.map +1 -0
  1200. package/dist/features/media/assets.d.ts +32 -0
  1201. package/dist/features/media/assets.js +26 -0
  1202. package/dist/features/media/assets.js.map +1 -0
  1203. package/dist/features/media/audio-recorder.d.ts +25 -0
  1204. package/dist/features/media/audio-recorder.js +123 -0
  1205. package/dist/features/media/audio-recorder.js.map +1 -0
  1206. package/dist/features/media/components/AudioRecorderModal.js +152 -0
  1207. package/dist/features/media/components/AudioRecorderModal.js.map +1 -0
  1208. package/dist/features/media/components/AudioRecorderModal.vue.d.ts +15 -0
  1209. package/dist/features/media/components/AudioView.js +46 -0
  1210. package/dist/features/media/components/AudioView.js.map +1 -0
  1211. package/dist/features/media/components/FileView.js +82 -0
  1212. package/dist/features/media/components/FileView.js.map +1 -0
  1213. package/dist/features/media/components/VideoView.js +47 -0
  1214. package/dist/features/media/components/VideoView.js.map +1 -0
  1215. package/dist/features/media/duplicates.js +76 -0
  1216. package/dist/features/media/duplicates.js.map +1 -0
  1217. package/dist/features/media/feature.d.ts +23 -0
  1218. package/dist/features/media/feature.js +97 -0
  1219. package/dist/features/media/feature.js.map +1 -0
  1220. package/dist/features/media/file-import.d.ts +39 -0
  1221. package/dist/features/media/file-import.js +240 -0
  1222. package/dist/features/media/file-import.js.map +1 -0
  1223. package/dist/features/media/importers/bib.d.ts +11 -0
  1224. package/dist/features/media/importers/bib.js +54 -0
  1225. package/dist/features/media/importers/bib.js.map +1 -0
  1226. package/dist/features/media/importers/bibtex.d.ts +19 -0
  1227. package/dist/features/media/importers/bibtex.js +229 -0
  1228. package/dist/features/media/importers/bibtex.js.map +1 -0
  1229. package/dist/features/media/importers/index.d.ts +13 -0
  1230. package/dist/features/media/importers/index.js +16 -0
  1231. package/dist/features/media/importers/index.js.map +1 -0
  1232. package/dist/features/media/importers/markdown.d.ts +10 -0
  1233. package/dist/features/media/importers/markdown.js +29 -0
  1234. package/dist/features/media/importers/markdown.js.map +1 -0
  1235. package/dist/features/media/importers/subtitle.d.ts +29 -0
  1236. package/dist/features/media/importers/subtitle.js +106 -0
  1237. package/dist/features/media/importers/subtitle.js.map +1 -0
  1238. package/dist/features/media/importers/typed-block.js +19 -0
  1239. package/dist/features/media/importers/typed-block.js.map +1 -0
  1240. package/dist/features/media/index.d.ts +13 -0
  1241. package/dist/features/media/index.js +13 -0
  1242. package/dist/features/media/node-views.d.ts +28 -0
  1243. package/dist/features/media/node-views.js +28 -0
  1244. package/dist/features/media/node-views.js.map +1 -0
  1245. package/dist/features/media/react/AudioRecorderModal.d.ts +12 -0
  1246. package/dist/features/media/react/AudioRecorderModal.js +147 -0
  1247. package/dist/features/media/react/AudioRecorderModal.js.map +1 -0
  1248. package/dist/features/media/react/AudioView.js +32 -0
  1249. package/dist/features/media/react/AudioView.js.map +1 -0
  1250. package/dist/features/media/react/FileView.js +78 -0
  1251. package/dist/features/media/react/FileView.js.map +1 -0
  1252. package/dist/features/media/react/TitleField.js +30 -0
  1253. package/dist/features/media/react/TitleField.js.map +1 -0
  1254. package/dist/features/media/react/VideoView.js +33 -0
  1255. package/dist/features/media/react/VideoView.js.map +1 -0
  1256. package/dist/features/media/react/use-audio-recorder.d.ts +11 -0
  1257. package/dist/features/media/react/use-audio-recorder.js +21 -0
  1258. package/dist/features/media/react/use-audio-recorder.js.map +1 -0
  1259. package/dist/features/media/react.d.ts +19 -0
  1260. package/dist/features/media/react.js +43 -0
  1261. package/dist/features/media/react.js.map +1 -0
  1262. package/dist/features/media/schema.d.ts +71 -0
  1263. package/dist/features/media/schema.js +309 -0
  1264. package/dist/features/media/schema.js.map +1 -0
  1265. package/dist/features/media/upload.d.ts +43 -0
  1266. package/dist/features/media/upload.js +100 -0
  1267. package/dist/features/media/upload.js.map +1 -0
  1268. package/dist/features/media/use-audio-recorder.d.ts +12 -0
  1269. package/dist/features/media/use-audio-recorder.js +21 -0
  1270. package/dist/features/media/use-audio-recorder.js.map +1 -0
  1271. package/dist/features/media/vue.d.ts +19 -0
  1272. package/dist/features/media/vue.js +36 -0
  1273. package/dist/features/media/vue.js.map +1 -0
  1274. package/dist/features/mentions/index.d.ts +24 -0
  1275. package/dist/features/mentions/index.js +38 -0
  1276. package/dist/features/mentions/index.js.map +1 -0
  1277. package/dist/features/mentions/mention-suggestion.d.ts +11 -0
  1278. package/dist/features/mentions/mention-suggestion.js +34 -0
  1279. package/dist/features/mentions/mention-suggestion.js.map +1 -0
  1280. package/dist/features/mentions/mention-text.d.ts +18 -0
  1281. package/dist/features/mentions/mention-text.js +75 -0
  1282. package/dist/features/mentions/mention-text.js.map +1 -0
  1283. package/dist/features/mentions/mention.d.ts +14 -0
  1284. package/dist/features/mentions/mention.js +33 -0
  1285. package/dist/features/mentions/mention.js.map +1 -0
  1286. package/dist/features/mentions/metadata-defaults.d.ts +8 -0
  1287. package/dist/features/mentions/metadata-defaults.js +24 -0
  1288. package/dist/features/mentions/metadata-defaults.js.map +1 -0
  1289. package/dist/features/mentions/normalize.d.ts +10 -0
  1290. package/dist/features/mentions/normalize.js +31 -0
  1291. package/dist/features/mentions/normalize.js.map +1 -0
  1292. package/dist/features/mentions/schema.d.ts +12 -0
  1293. package/dist/features/mentions/schema.js +11 -0
  1294. package/dist/features/mentions/schema.js.map +1 -0
  1295. package/dist/features/mentions/tag-suggestion.d.ts +11 -0
  1296. package/dist/features/mentions/tag-suggestion.js +45 -0
  1297. package/dist/features/mentions/tag-suggestion.js.map +1 -0
  1298. package/dist/features/mentions/tag.d.ts +38 -0
  1299. package/dist/features/mentions/tag.js +150 -0
  1300. package/dist/features/mentions/tag.js.map +1 -0
  1301. package/dist/features/pruefung/badges.d.ts +38 -0
  1302. package/dist/features/pruefung/badges.js +101 -0
  1303. package/dist/features/pruefung/badges.js.map +1 -0
  1304. package/dist/features/pruefung/capability.d.ts +30 -0
  1305. package/dist/features/pruefung/capability.js +43 -0
  1306. package/dist/features/pruefung/capability.js.map +1 -0
  1307. package/dist/features/pruefung/components/PruefungBadge.js +157 -0
  1308. package/dist/features/pruefung/components/PruefungBadge.js.map +1 -0
  1309. package/dist/features/pruefung/components/PruefungBadge.vue.d.ts +18 -0
  1310. package/dist/features/pruefung/feature.d.ts +43 -0
  1311. package/dist/features/pruefung/feature.js +159 -0
  1312. package/dist/features/pruefung/feature.js.map +1 -0
  1313. package/dist/features/pruefung/hash.d.ts +13 -0
  1314. package/dist/features/pruefung/hash.js +22 -0
  1315. package/dist/features/pruefung/hash.js.map +1 -0
  1316. package/dist/features/pruefung/index.d.ts +10 -0
  1317. package/dist/features/pruefung/index.js +8 -0
  1318. package/dist/features/pruefung/lock.d.ts +11 -0
  1319. package/dist/features/pruefung/lock.js +63 -0
  1320. package/dist/features/pruefung/lock.js.map +1 -0
  1321. package/dist/features/pruefung/model.d.ts +80 -0
  1322. package/dist/features/pruefung/model.js +153 -0
  1323. package/dist/features/pruefung/model.js.map +1 -0
  1324. package/dist/features/pruefung/react/PruefungBadge.d.ts +15 -0
  1325. package/dist/features/pruefung/react/PruefungBadge.js +148 -0
  1326. package/dist/features/pruefung/react/PruefungBadge.js.map +1 -0
  1327. package/dist/features/pruefung/react.d.ts +13 -0
  1328. package/dist/features/pruefung/react.js +14 -0
  1329. package/dist/features/pruefung/react.js.map +1 -0
  1330. package/dist/features/pruefung/rest-model.d.ts +23 -0
  1331. package/dist/features/pruefung/rest-model.js +31 -0
  1332. package/dist/features/pruefung/rest-model.js.map +1 -0
  1333. package/dist/features/pruefung/schema.d.ts +3 -0
  1334. package/dist/features/pruefung/schema.js +1 -0
  1335. package/dist/features/pruefung/vue.d.ts +9 -0
  1336. package/dist/features/pruefung/vue.js +11 -0
  1337. package/dist/features/pruefung/vue.js.map +1 -0
  1338. package/dist/features/tables/feature.d.ts +15 -0
  1339. package/dist/features/tables/feature.js +120 -0
  1340. package/dist/features/tables/feature.js.map +1 -0
  1341. package/dist/features/tables/index.d.ts +3 -0
  1342. package/dist/features/tables/index.js +3 -0
  1343. package/dist/features/tables/schema.d.ts +6 -0
  1344. package/dist/features/tables/schema.js +27 -0
  1345. package/dist/features/tables/schema.js.map +1 -0
  1346. package/dist/features/themes/components/SettingsAppearanceTab.js +224 -0
  1347. package/dist/features/themes/components/SettingsAppearanceTab.js.map +1 -0
  1348. package/dist/features/themes/components/SettingsAppearanceTab.vue.d.ts +6 -0
  1349. package/dist/features/themes/feature.d.ts +24 -0
  1350. package/dist/features/themes/feature.js +27 -0
  1351. package/dist/features/themes/feature.js.map +1 -0
  1352. package/dist/features/themes/index.d.ts +7 -0
  1353. package/dist/features/themes/index.js +6 -0
  1354. package/dist/features/themes/react/SettingsAppearanceTab.d.ts +5 -0
  1355. package/dist/features/themes/react/SettingsAppearanceTab.js +218 -0
  1356. package/dist/features/themes/react/SettingsAppearanceTab.js.map +1 -0
  1357. package/dist/features/themes/react.d.ts +13 -0
  1358. package/dist/features/themes/react.js +15 -0
  1359. package/dist/features/themes/react.js.map +1 -0
  1360. package/dist/features/themes/schema.d.ts +17 -0
  1361. package/dist/features/themes/schema.js +16 -0
  1362. package/dist/features/themes/schema.js.map +1 -0
  1363. package/dist/features/themes/scope-css.d.ts +5 -0
  1364. package/dist/features/themes/scope-css.js +142 -0
  1365. package/dist/features/themes/scope-css.js.map +1 -0
  1366. package/dist/features/themes/theme-runtime.d.ts +14 -0
  1367. package/dist/features/themes/theme-runtime.js +149 -0
  1368. package/dist/features/themes/theme-runtime.js.map +1 -0
  1369. package/dist/features/themes/vue.d.ts +13 -0
  1370. package/dist/features/themes/vue.js +29 -0
  1371. package/dist/features/themes/vue.js.map +1 -0
  1372. package/dist/features/transcript/TranscriptSegmentView.js +189 -0
  1373. package/dist/features/transcript/TranscriptSegmentView.js.map +1 -0
  1374. package/dist/features/transcript/TranscriptSegmentView.vue.d.ts +96 -0
  1375. package/dist/features/transcript/convert.d.ts +11 -0
  1376. package/dist/features/transcript/convert.js +40 -0
  1377. package/dist/features/transcript/convert.js.map +1 -0
  1378. package/dist/features/transcript/export.d.ts +21 -0
  1379. package/dist/features/transcript/export.js +75 -0
  1380. package/dist/features/transcript/export.js.map +1 -0
  1381. package/dist/features/transcript/feature.d.ts +25 -0
  1382. package/dist/features/transcript/feature.js +96 -0
  1383. package/dist/features/transcript/feature.js.map +1 -0
  1384. package/dist/features/transcript/index.d.ts +8 -0
  1385. package/dist/features/transcript/index.js +8 -0
  1386. package/dist/features/transcript/react/TranscriptSegmentView.d.ts +6 -0
  1387. package/dist/features/transcript/react/TranscriptSegmentView.js +174 -0
  1388. package/dist/features/transcript/react/TranscriptSegmentView.js.map +1 -0
  1389. package/dist/features/transcript/react.d.ts +9 -0
  1390. package/dist/features/transcript/react.js +12 -0
  1391. package/dist/features/transcript/react.js.map +1 -0
  1392. package/dist/features/transcript/schema.d.ts +9 -0
  1393. package/dist/features/transcript/schema.js +9 -0
  1394. package/dist/features/transcript/schema.js.map +1 -0
  1395. package/dist/features/transcript/segment-node.d.ts +23 -0
  1396. package/dist/features/transcript/segment-node.js +142 -0
  1397. package/dist/features/transcript/segment-node.js.map +1 -0
  1398. package/dist/features/transcript/segment.d.ts +10 -0
  1399. package/dist/features/transcript/segment.js +26 -0
  1400. package/dist/features/transcript/segment.js.map +1 -0
  1401. package/dist/features/transcript/speakers.d.ts +8 -0
  1402. package/dist/features/transcript/speakers.js +22 -0
  1403. package/dist/features/transcript/speakers.js.map +1 -0
  1404. package/dist/features/transcript/vue.d.ts +8 -0
  1405. package/dist/features/transcript/vue.js +12 -0
  1406. package/dist/features/transcript/vue.js.map +1 -0
  1407. package/dist/features/transfer/components/TransferMenu.js +93 -0
  1408. package/dist/features/transfer/components/TransferMenu.js.map +1 -0
  1409. package/dist/features/transfer/components/TransferMenu.vue.d.ts +15 -0
  1410. package/dist/features/transfer/feature.d.ts +78 -0
  1411. package/dist/features/transfer/feature.js +170 -0
  1412. package/dist/features/transfer/feature.js.map +1 -0
  1413. package/dist/features/transfer/index.d.ts +3 -0
  1414. package/dist/features/transfer/index.js +3 -0
  1415. package/dist/features/transfer/react/TransferMenu.d.ts +12 -0
  1416. package/dist/features/transfer/react/TransferMenu.js +71 -0
  1417. package/dist/features/transfer/react/TransferMenu.js.map +1 -0
  1418. package/dist/features/transfer/react.d.ts +10 -0
  1419. package/dist/features/transfer/react.js +11 -0
  1420. package/dist/features/transfer/react.js.map +1 -0
  1421. package/dist/features/transfer/transforms.d.ts +83 -0
  1422. package/dist/features/transfer/transforms.js +134 -0
  1423. package/dist/features/transfer/transforms.js.map +1 -0
  1424. package/dist/features/transfer/vue.d.ts +9 -0
  1425. package/dist/features/transfer/vue.js +11 -0
  1426. package/dist/features/transfer/vue.js.map +1 -0
  1427. package/dist/i18n/de/ai.js +174 -0
  1428. package/dist/i18n/de/ai.js.map +1 -0
  1429. package/dist/i18n/de/authors.js +21 -0
  1430. package/dist/i18n/de/authors.js.map +1 -0
  1431. package/dist/i18n/de/block.js +16 -0
  1432. package/dist/i18n/de/block.js.map +1 -0
  1433. package/dist/i18n/de/change-sets.js +22 -0
  1434. package/dist/i18n/de/change-sets.js.map +1 -0
  1435. package/dist/i18n/de/comments.js +35 -0
  1436. package/dist/i18n/de/comments.js.map +1 -0
  1437. package/dist/i18n/de/common.js +10 -0
  1438. package/dist/i18n/de/common.js.map +1 -0
  1439. package/dist/i18n/de/composites.js +399 -0
  1440. package/dist/i18n/de/composites.js.map +1 -0
  1441. package/dist/i18n/de/explore.js +34 -0
  1442. package/dist/i18n/de/explore.js.map +1 -0
  1443. package/dist/i18n/de/image-studio.js +48 -0
  1444. package/dist/i18n/de/image-studio.js.map +1 -0
  1445. package/dist/i18n/de/integrations.js +99 -0
  1446. package/dist/i18n/de/integrations.js.map +1 -0
  1447. package/dist/i18n/de/markdown.js +16 -0
  1448. package/dist/i18n/de/markdown.js.map +1 -0
  1449. package/dist/i18n/de/media.js +32 -0
  1450. package/dist/i18n/de/media.js.map +1 -0
  1451. package/dist/i18n/de/mentions.js +10 -0
  1452. package/dist/i18n/de/mentions.js.map +1 -0
  1453. package/dist/i18n/de/outline.js +9 -0
  1454. package/dist/i18n/de/outline.js.map +1 -0
  1455. package/dist/i18n/de/palette.js +22 -0
  1456. package/dist/i18n/de/palette.js.map +1 -0
  1457. package/dist/i18n/de/pruefung.js +25 -0
  1458. package/dist/i18n/de/pruefung.js.map +1 -0
  1459. package/dist/i18n/de/search.js +14 -0
  1460. package/dist/i18n/de/search.js.map +1 -0
  1461. package/dist/i18n/de/settings.js +12 -0
  1462. package/dist/i18n/de/settings.js.map +1 -0
  1463. package/dist/i18n/de/tables.js +14 -0
  1464. package/dist/i18n/de/tables.js.map +1 -0
  1465. package/dist/i18n/de/themes.js +26 -0
  1466. package/dist/i18n/de/themes.js.map +1 -0
  1467. package/dist/i18n/de/toolbar.js +22 -0
  1468. package/dist/i18n/de/toolbar.js.map +1 -0
  1469. package/dist/i18n/de/transcript.js +14 -0
  1470. package/dist/i18n/de/transcript.js.map +1 -0
  1471. package/dist/i18n/de/transfer.js +17 -0
  1472. package/dist/i18n/de/transfer.js.map +1 -0
  1473. package/dist/i18n/de/tree.js +55 -0
  1474. package/dist/i18n/de/tree.js.map +1 -0
  1475. package/dist/i18n/de.d.ts +977 -0
  1476. package/dist/i18n/de.js +56 -0
  1477. package/dist/i18n/de.js.map +1 -0
  1478. package/dist/i18n/en/ai.js +174 -0
  1479. package/dist/i18n/en/ai.js.map +1 -0
  1480. package/dist/i18n/en/authors.js +21 -0
  1481. package/dist/i18n/en/authors.js.map +1 -0
  1482. package/dist/i18n/en/block.js +16 -0
  1483. package/dist/i18n/en/block.js.map +1 -0
  1484. package/dist/i18n/en/change-sets.js +22 -0
  1485. package/dist/i18n/en/change-sets.js.map +1 -0
  1486. package/dist/i18n/en/comments.js +35 -0
  1487. package/dist/i18n/en/comments.js.map +1 -0
  1488. package/dist/i18n/en/common.js +10 -0
  1489. package/dist/i18n/en/common.js.map +1 -0
  1490. package/dist/i18n/en/composites.js +394 -0
  1491. package/dist/i18n/en/composites.js.map +1 -0
  1492. package/dist/i18n/en/explore.js +34 -0
  1493. package/dist/i18n/en/explore.js.map +1 -0
  1494. package/dist/i18n/en/image-studio.js +48 -0
  1495. package/dist/i18n/en/image-studio.js.map +1 -0
  1496. package/dist/i18n/en/integrations.js +99 -0
  1497. package/dist/i18n/en/integrations.js.map +1 -0
  1498. package/dist/i18n/en/markdown.js +16 -0
  1499. package/dist/i18n/en/markdown.js.map +1 -0
  1500. package/dist/i18n/en/media.js +32 -0
  1501. package/dist/i18n/en/media.js.map +1 -0
  1502. package/dist/i18n/en/mentions.js +10 -0
  1503. package/dist/i18n/en/mentions.js.map +1 -0
  1504. package/dist/i18n/en/outline.js +9 -0
  1505. package/dist/i18n/en/outline.js.map +1 -0
  1506. package/dist/i18n/en/palette.js +22 -0
  1507. package/dist/i18n/en/palette.js.map +1 -0
  1508. package/dist/i18n/en/pruefung.js +25 -0
  1509. package/dist/i18n/en/pruefung.js.map +1 -0
  1510. package/dist/i18n/en/search.js +14 -0
  1511. package/dist/i18n/en/search.js.map +1 -0
  1512. package/dist/i18n/en/settings.js +12 -0
  1513. package/dist/i18n/en/settings.js.map +1 -0
  1514. package/dist/i18n/en/tables.js +14 -0
  1515. package/dist/i18n/en/tables.js.map +1 -0
  1516. package/dist/i18n/en/themes.js +26 -0
  1517. package/dist/i18n/en/themes.js.map +1 -0
  1518. package/dist/i18n/en/toolbar.js +22 -0
  1519. package/dist/i18n/en/toolbar.js.map +1 -0
  1520. package/dist/i18n/en/transcript.js +14 -0
  1521. package/dist/i18n/en/transcript.js.map +1 -0
  1522. package/dist/i18n/en/transfer.js +17 -0
  1523. package/dist/i18n/en/transfer.js.map +1 -0
  1524. package/dist/i18n/en/tree.js +55 -0
  1525. package/dist/i18n/en/tree.js.map +1 -0
  1526. package/dist/i18n/en.js +56 -0
  1527. package/dist/i18n/en.js.map +1 -0
  1528. package/dist/i18n/index.d.ts +25 -0
  1529. package/dist/i18n/index.js +29 -0
  1530. package/dist/i18n/index.js.map +1 -0
  1531. package/dist/index.d.ts +11 -0
  1532. package/dist/index.js +0 -0
  1533. package/dist/integrations/composite-ai/ai-edit-session.d.ts +20 -0
  1534. package/dist/integrations/composite-ai/ai-edit-session.js +84 -0
  1535. package/dist/integrations/composite-ai/ai-edit-session.js.map +1 -0
  1536. package/dist/integrations/composite-ai/bibliography-fetch.d.ts +28 -0
  1537. package/dist/integrations/composite-ai/bibliography-fetch.js +148 -0
  1538. package/dist/integrations/composite-ai/bibliography-fetch.js.map +1 -0
  1539. package/dist/integrations/composite-ai/composite-fill.d.ts +40 -0
  1540. package/dist/integrations/composite-ai/composite-fill.js +122 -0
  1541. package/dist/integrations/composite-ai/composite-fill.js.map +1 -0
  1542. package/dist/integrations/composite-ai/composite-summary.d.ts +17 -0
  1543. package/dist/integrations/composite-ai/composite-summary.js +95 -0
  1544. package/dist/integrations/composite-ai/composite-summary.js.map +1 -0
  1545. package/dist/integrations/composite-ai/derive.d.ts +46 -0
  1546. package/dist/integrations/composite-ai/derive.js +187 -0
  1547. package/dist/integrations/composite-ai/derive.js.map +1 -0
  1548. package/dist/integrations/composite-ai/index.d.ts +31 -0
  1549. package/dist/integrations/composite-ai/index.js +219 -0
  1550. package/dist/integrations/composite-ai/index.js.map +1 -0
  1551. package/dist/integrations/composite-ai/outline-sanitize.d.ts +52 -0
  1552. package/dist/integrations/composite-ai/outline-sanitize.js +152 -0
  1553. package/dist/integrations/composite-ai/outline-sanitize.js.map +1 -0
  1554. package/dist/integrations/composite-ai/rendition.d.ts +41 -0
  1555. package/dist/integrations/composite-ai/rendition.js +302 -0
  1556. package/dist/integrations/composite-ai/rendition.js.map +1 -0
  1557. package/dist/integrations/composite-ai/split.d.ts +40 -0
  1558. package/dist/integrations/composite-ai/split.js +155 -0
  1559. package/dist/integrations/composite-ai/split.js.map +1 -0
  1560. package/dist/integrations/composite-ai/transfer-transforms.d.ts +27 -0
  1561. package/dist/integrations/composite-ai/transfer-transforms.js +108 -0
  1562. package/dist/integrations/composite-ai/transfer-transforms.js.map +1 -0
  1563. package/dist/integrations/composite-media/index.d.ts +23 -0
  1564. package/dist/integrations/composite-media/index.js +170 -0
  1565. package/dist/integrations/composite-media/index.js.map +1 -0
  1566. package/dist/integrations/transcript-ai/index.d.ts +16 -0
  1567. package/dist/integrations/transcript-ai/index.js +66 -0
  1568. package/dist/integrations/transcript-ai/index.js.map +1 -0
  1569. package/dist/integrations/transcript-ai/protocol.d.ts +71 -0
  1570. package/dist/integrations/transcript-ai/protocol.js +178 -0
  1571. package/dist/integrations/transcript-ai/protocol.js.map +1 -0
  1572. package/dist/integrations/transcript-ai/transcript-cleanup.d.ts +35 -0
  1573. package/dist/integrations/transcript-ai/transcript-cleanup.js +164 -0
  1574. package/dist/integrations/transcript-ai/transcript-cleanup.js.map +1 -0
  1575. package/dist/markdown/MarkdownSurface.d.ts +25 -0
  1576. package/dist/markdown/MarkdownSurface.js +93 -0
  1577. package/dist/markdown/MarkdownSurface.js.map +1 -0
  1578. package/dist/markdown/MarkdownSurface.vue.d.ts +77 -0
  1579. package/dist/markdown/MarkdownSurface2.js +234 -0
  1580. package/dist/markdown/MarkdownSurface2.js.map +1 -0
  1581. package/dist/markdown/clipboard.d.ts +17 -0
  1582. package/dist/markdown/clipboard.js +125 -0
  1583. package/dist/markdown/clipboard.js.map +1 -0
  1584. package/dist/markdown/document.d.ts +36 -0
  1585. package/dist/markdown/document.js +101 -0
  1586. package/dist/markdown/document.js.map +1 -0
  1587. package/dist/markdown/index.d.ts +6 -0
  1588. package/dist/markdown/index.js +6 -0
  1589. package/dist/markdown/policy.d.ts +35 -0
  1590. package/dist/markdown/policy.js +78 -0
  1591. package/dist/markdown/policy.js.map +1 -0
  1592. package/dist/markdown/react.d.ts +2 -0
  1593. package/dist/markdown/react.js +1 -0
  1594. package/dist/markdown/source-mode.d.ts +49 -0
  1595. package/dist/markdown/source-mode.js +86 -0
  1596. package/dist/markdown/source-mode.js.map +1 -0
  1597. package/dist/markdown/vue.d.ts +2 -0
  1598. package/dist/markdown/vue.js +1 -0
  1599. package/dist/nuxt/module.d.ts +2024 -0
  1600. package/dist/nuxt/module.js +69 -0
  1601. package/dist/nuxt/module.js.map +1 -0
  1602. package/dist/nuxt/runtime/install-context.d.ts +20 -0
  1603. package/dist/nuxt/runtime/install-context.js +31 -0
  1604. package/dist/nuxt/runtime/install-context.js.map +1 -0
  1605. package/dist/nuxt/runtime/plugins/editor-context-nuxt-ui.client.ts +8 -0
  1606. package/dist/nuxt/runtime/server/plugins/editor-server.d.ts +5 -0
  1607. package/dist/nuxt/runtime/server/plugins/editor-server.js +13 -0
  1608. package/dist/nuxt/runtime/server/plugins/editor-server.js.map +1 -0
  1609. package/dist/outline/EditorOutline.js +124 -0
  1610. package/dist/outline/EditorOutline.js.map +1 -0
  1611. package/dist/outline/EditorOutline.vue.d.ts +15 -0
  1612. package/dist/outline/heading-outline.d.ts +26 -0
  1613. package/dist/outline/heading-outline.js +46 -0
  1614. package/dist/outline/heading-outline.js.map +1 -0
  1615. package/dist/outline/index.d.ts +2 -0
  1616. package/dist/outline/index.js +1 -0
  1617. package/dist/outline/react/EditorOutline.d.ts +12 -0
  1618. package/dist/outline/react/EditorOutline.js +112 -0
  1619. package/dist/outline/react/EditorOutline.js.map +1 -0
  1620. package/dist/outline/react.d.ts +2 -0
  1621. package/dist/outline/react.js +1 -0
  1622. package/dist/outline/vue.d.ts +2 -0
  1623. package/dist/outline/vue.js +1 -0
  1624. package/dist/presets/catalog.d.ts +140 -0
  1625. package/dist/presets/catalog.js +114 -0
  1626. package/dist/presets/catalog.js.map +1 -0
  1627. package/dist/presets/compose.d.ts +137 -0
  1628. package/dist/presets/compose.js +226 -0
  1629. package/dist/presets/compose.js.map +1 -0
  1630. package/dist/presets/layer.js +32 -0
  1631. package/dist/presets/layer.js.map +1 -0
  1632. package/dist/presets/schema-ids.js +25 -0
  1633. package/dist/presets/schema-ids.js.map +1 -0
  1634. package/dist/react/AdvancedEditor.d.ts +23 -0
  1635. package/dist/react/AdvancedEditor.js +26 -0
  1636. package/dist/react/AdvancedEditor.js.map +1 -0
  1637. package/dist/react/EditorCommandPalette.d.ts +13 -0
  1638. package/dist/react/EditorCommandPalette.js +118 -0
  1639. package/dist/react/EditorCommandPalette.js.map +1 -0
  1640. package/dist/react/EditorSettingsModal.d.ts +14 -0
  1641. package/dist/react/EditorSettingsModal.js +43 -0
  1642. package/dist/react/EditorSettingsModal.js.map +1 -0
  1643. package/dist/react/EditorSettingsPanel.d.ts +18 -0
  1644. package/dist/react/EditorSettingsPanel.js +43 -0
  1645. package/dist/react/EditorSettingsPanel.js.map +1 -0
  1646. package/dist/react/EditorSurface.d.ts +61 -0
  1647. package/dist/react/EditorSurface.js +175 -0
  1648. package/dist/react/EditorSurface.js.map +1 -0
  1649. package/dist/react/EditorToolbar.d.ts +13 -0
  1650. package/dist/react/EditorToolbar.js +137 -0
  1651. package/dist/react/EditorToolbar.js.map +1 -0
  1652. package/dist/react/Icon.d.ts +13 -0
  1653. package/dist/react/Icon.js +19 -0
  1654. package/dist/react/Icon.js.map +1 -0
  1655. package/dist/react/SettingsSection.d.ts +10 -0
  1656. package/dist/react/SettingsSection.js +22 -0
  1657. package/dist/react/SettingsSection.js.map +1 -0
  1658. package/dist/react/SimpleEditor.d.ts +26 -0
  1659. package/dist/react/SimpleEditor.js +36 -0
  1660. package/dist/react/SimpleEditor.js.map +1 -0
  1661. package/dist/react/advanced.d.ts +5 -0
  1662. package/dist/react/advanced.js +4 -0
  1663. package/dist/react/compose.d.ts +18 -0
  1664. package/dist/react/compose.js +44 -0
  1665. package/dist/react/compose.js.map +1 -0
  1666. package/dist/react/composed-surface.d.ts +59 -0
  1667. package/dist/react/composed-surface.js +78 -0
  1668. package/dist/react/composed-surface.js.map +1 -0
  1669. package/dist/react/context.d.ts +12 -0
  1670. package/dist/react/context.js +25 -0
  1671. package/dist/react/context.js.map +1 -0
  1672. package/dist/react/editor-ui.d.ts +14 -0
  1673. package/dist/react/editor-ui.js +20 -0
  1674. package/dist/react/editor-ui.js.map +1 -0
  1675. package/dist/react/index.d.ts +18 -0
  1676. package/dist/react/index.js +18 -0
  1677. package/dist/react/key-labels.js +15 -0
  1678. package/dist/react/key-labels.js.map +1 -0
  1679. package/dist/react/notify.d.ts +6 -0
  1680. package/dist/react/notify.js +29 -0
  1681. package/dist/react/notify.js.map +1 -0
  1682. package/dist/react/settings.d.ts +17 -0
  1683. package/dist/react/settings.js +27 -0
  1684. package/dist/react/settings.js.map +1 -0
  1685. package/dist/react/simple.d.ts +2 -0
  1686. package/dist/react/simple.js +1 -0
  1687. package/dist/react/styles/advanced.css +18 -0
  1688. package/dist/react/styles/themes-bridge.css +26 -0
  1689. package/dist/react/styles/ui-vars.css +20 -0
  1690. package/dist/react/suggestion-renderer.d.ts +12 -0
  1691. package/dist/react/suggestion-renderer.js +90 -0
  1692. package/dist/react/suggestion-renderer.js.map +1 -0
  1693. package/dist/react/ui/alert.js +38 -0
  1694. package/dist/react/ui/alert.js.map +1 -0
  1695. package/dist/react/ui/avatar.js +24 -0
  1696. package/dist/react/ui/avatar.js.map +1 -0
  1697. package/dist/react/ui/badge.js +30 -0
  1698. package/dist/react/ui/badge.js.map +1 -0
  1699. package/dist/react/ui/button.js +50 -0
  1700. package/dist/react/ui/button.js.map +1 -0
  1701. package/dist/react/ui/collapsible.js +19 -0
  1702. package/dist/react/ui/collapsible.js.map +1 -0
  1703. package/dist/react/ui/command.js +82 -0
  1704. package/dist/react/ui/command.js.map +1 -0
  1705. package/dist/react/ui/dialog.js +88 -0
  1706. package/dist/react/ui/dialog.js.map +1 -0
  1707. package/dist/react/ui/dropdown-menu.js +70 -0
  1708. package/dist/react/ui/dropdown-menu.js.map +1 -0
  1709. package/dist/react/ui/input-group.js +57 -0
  1710. package/dist/react/ui/input-group.js.map +1 -0
  1711. package/dist/react/ui/input.js +16 -0
  1712. package/dist/react/ui/input.js.map +1 -0
  1713. package/dist/react/ui/label.js +17 -0
  1714. package/dist/react/ui/label.js.map +1 -0
  1715. package/dist/react/ui/popover.js +36 -0
  1716. package/dist/react/ui/popover.js.map +1 -0
  1717. package/dist/react/ui/radio-group.js +29 -0
  1718. package/dist/react/ui/radio-group.js.map +1 -0
  1719. package/dist/react/ui/select.js +88 -0
  1720. package/dist/react/ui/select.js.map +1 -0
  1721. package/dist/react/ui/separator.js +18 -0
  1722. package/dist/react/ui/separator.js.map +1 -0
  1723. package/dist/react/ui/switch.js +21 -0
  1724. package/dist/react/ui/switch.js.map +1 -0
  1725. package/dist/react/ui/table.js +44 -0
  1726. package/dist/react/ui/table.js.map +1 -0
  1727. package/dist/react/ui/tabs.js +41 -0
  1728. package/dist/react/ui/tabs.js.map +1 -0
  1729. package/dist/react/ui/textarea.js +15 -0
  1730. package/dist/react/ui/textarea.js.map +1 -0
  1731. package/dist/react/ui/tooltip.js +37 -0
  1732. package/dist/react/ui/tooltip.js.map +1 -0
  1733. package/dist/react/ui/utils.d.ts +5 -0
  1734. package/dist/react/ui/utils.js +10 -0
  1735. package/dist/react/ui/utils.js.map +1 -0
  1736. package/dist/react/use-draft-field.js +44 -0
  1737. package/dist/react/use-draft-field.js.map +1 -0
  1738. package/dist/react/use-editor-i18n.d.ts +12 -0
  1739. package/dist/react/use-editor-i18n.js +17 -0
  1740. package/dist/react/use-editor-i18n.js.map +1 -0
  1741. package/dist/react/use-notifier.d.ts +11 -0
  1742. package/dist/react/use-notifier.js +25 -0
  1743. package/dist/react/use-notifier.js.map +1 -0
  1744. package/dist/react/use-store.d.ts +6 -0
  1745. package/dist/react/use-store.js +10 -0
  1746. package/dist/react/use-store.js.map +1 -0
  1747. package/dist/schema/advanced.d.ts +14 -0
  1748. package/dist/schema/advanced.js +41 -0
  1749. package/dist/schema/advanced.js.map +1 -0
  1750. package/dist/schema/simple.d.ts +10 -0
  1751. package/dist/schema/simple.js +13 -0
  1752. package/dist/schema/simple.js.map +1 -0
  1753. package/dist/search/SearchPanel.js +128 -0
  1754. package/dist/search/SearchPanel.js.map +1 -0
  1755. package/dist/search/SearchPanel.vue.d.ts +19 -0
  1756. package/dist/search/index.d.ts +2 -0
  1757. package/dist/search/index.js +1 -0
  1758. package/dist/search/react/SearchPanel.d.ts +19 -0
  1759. package/dist/search/react/SearchPanel.js +127 -0
  1760. package/dist/search/react/SearchPanel.js.map +1 -0
  1761. package/dist/search/react/use-search-model.d.ts +18 -0
  1762. package/dist/search/react/use-search-model.js +31 -0
  1763. package/dist/search/react/use-search-model.js.map +1 -0
  1764. package/dist/search/react.d.ts +3 -0
  1765. package/dist/search/react.js +3 -0
  1766. package/dist/search/search-model.d.ts +42 -0
  1767. package/dist/search/search-model.js +104 -0
  1768. package/dist/search/search-model.js.map +1 -0
  1769. package/dist/search/use-search-model.d.ts +19 -0
  1770. package/dist/search/use-search-model.js +26 -0
  1771. package/dist/search/use-search-model.js.map +1 -0
  1772. package/dist/search/vue.d.ts +3 -0
  1773. package/dist/search/vue.js +3 -0
  1774. package/dist/server/ai.d.ts +87 -0
  1775. package/dist/server/ai.js +105 -0
  1776. package/dist/server/ai.js.map +1 -0
  1777. package/dist/server/auth.d.ts +9 -0
  1778. package/dist/server/block-index.d.ts +49 -0
  1779. package/dist/server/block-index.js +109 -0
  1780. package/dist/server/block-index.js.map +1 -0
  1781. package/dist/server/collab-state.d.ts +16 -0
  1782. package/dist/server/collab-state.js +43 -0
  1783. package/dist/server/collab-state.js.map +1 -0
  1784. package/dist/server/collab.d.ts +68 -0
  1785. package/dist/server/collab.js +198 -0
  1786. package/dist/server/collab.js.map +1 -0
  1787. package/dist/server/crossref.js +78 -0
  1788. package/dist/server/crossref.js.map +1 -0
  1789. package/dist/server/document-blocks.js +59 -0
  1790. package/dist/server/document-blocks.js.map +1 -0
  1791. package/dist/server/document-mutator.d.ts +39 -0
  1792. package/dist/server/document-mutator.js +226 -0
  1793. package/dist/server/document-mutator.js.map +1 -0
  1794. package/dist/server/errors.d.ts +17 -0
  1795. package/dist/server/errors.js +26 -0
  1796. package/dist/server/errors.js.map +1 -0
  1797. package/dist/server/extract.js +308 -0
  1798. package/dist/server/extract.js.map +1 -0
  1799. package/dist/server/h3.d.ts +8 -0
  1800. package/dist/server/h3.js +41 -0
  1801. package/dist/server/h3.js.map +1 -0
  1802. package/dist/server/handlers/ai.d.ts +199 -0
  1803. package/dist/server/handlers/ai.js +681 -0
  1804. package/dist/server/handlers/ai.js.map +1 -0
  1805. package/dist/server/handlers/context.d.ts +86 -0
  1806. package/dist/server/handlers/context.js +101 -0
  1807. package/dist/server/handlers/context.js.map +1 -0
  1808. package/dist/server/handlers/editor.d.ts +117 -0
  1809. package/dist/server/handlers/editor.js +261 -0
  1810. package/dist/server/handlers/editor.js.map +1 -0
  1811. package/dist/server/handlers/images.d.ts +22 -0
  1812. package/dist/server/handlers/images.js +46 -0
  1813. package/dist/server/handlers/images.js.map +1 -0
  1814. package/dist/server/handlers/index.d.ts +10 -0
  1815. package/dist/server/handlers/index.js +10 -0
  1816. package/dist/server/handlers/knowledge.d.ts +16 -0
  1817. package/dist/server/handlers/knowledge.js +34 -0
  1818. package/dist/server/handlers/knowledge.js.map +1 -0
  1819. package/dist/server/handlers/render.d.ts +26 -0
  1820. package/dist/server/handlers/render.js +65 -0
  1821. package/dist/server/handlers/render.js.map +1 -0
  1822. package/dist/server/handlers/speech.d.ts +27 -0
  1823. package/dist/server/handlers/speech.js +86 -0
  1824. package/dist/server/handlers/speech.js.map +1 -0
  1825. package/dist/server/handlers/streamed-asset.js +27 -0
  1826. package/dist/server/handlers/streamed-asset.js.map +1 -0
  1827. package/dist/server/index.d.ts +18 -0
  1828. package/dist/server/index.js +15 -0
  1829. package/dist/server/markdown-blocks.d.ts +16 -0
  1830. package/dist/server/markdown-blocks.js +19 -0
  1831. package/dist/server/markdown-blocks.js.map +1 -0
  1832. package/dist/server/node.d.ts +24 -0
  1833. package/dist/server/node.js +54 -0
  1834. package/dist/server/node.js.map +1 -0
  1835. package/dist/server/pdf.js +97 -0
  1836. package/dist/server/pdf.js.map +1 -0
  1837. package/dist/server/ports.d.ts +331 -0
  1838. package/dist/server/ports.js +37 -0
  1839. package/dist/server/ports.js.map +1 -0
  1840. package/dist/server/query-definitions.js +12 -0
  1841. package/dist/server/query-definitions.js.map +1 -0
  1842. package/dist/server/rate-limit.d.ts +22 -0
  1843. package/dist/server/rate-limit.js +34 -0
  1844. package/dist/server/rate-limit.js.map +1 -0
  1845. package/dist/server/readable-documents.d.ts +17 -0
  1846. package/dist/server/readable-documents.js +59 -0
  1847. package/dist/server/readable-documents.js.map +1 -0
  1848. package/dist/server/routes.d.ts +22 -0
  1849. package/dist/server/routes.js +82 -0
  1850. package/dist/server/routes.js.map +1 -0
  1851. package/dist/server/speech-budget.d.ts +22 -0
  1852. package/dist/server/speech-budget.js +36 -0
  1853. package/dist/server/speech-budget.js.map +1 -0
  1854. package/dist/server/stored-content.d.ts +19 -0
  1855. package/dist/server/stored-content.js +35 -0
  1856. package/dist/server/stored-content.js.map +1 -0
  1857. package/dist/server/tools.d.ts +42 -0
  1858. package/dist/server/tools.js +24 -0
  1859. package/dist/server/tools.js.map +1 -0
  1860. package/dist/server/workspace-tools.d.ts +31 -0
  1861. package/dist/server/workspace-tools.js +174 -0
  1862. package/dist/server/workspace-tools.js.map +1 -0
  1863. package/dist/settings/index.d.ts +119 -0
  1864. package/dist/settings/index.js +127 -0
  1865. package/dist/settings/index.js.map +1 -0
  1866. package/dist/settings/migrate.d.ts +18 -0
  1867. package/dist/settings/migrate.js +46 -0
  1868. package/dist/settings/migrate.js.map +1 -0
  1869. package/dist/settings/values.d.ts +35 -0
  1870. package/dist/settings/values.js +41 -0
  1871. package/dist/settings/values.js.map +1 -0
  1872. package/dist/styles/ai.css +78 -0
  1873. package/dist/styles/authors.css +18 -0
  1874. package/dist/styles/block-ui.css +16 -0
  1875. package/dist/styles/collab.css +26 -0
  1876. package/dist/styles/comments.css +11 -0
  1877. package/dist/styles/composites.css +178 -0
  1878. package/dist/styles/core.css +99 -0
  1879. package/dist/styles/media.css +8 -0
  1880. package/dist/styles/mentions.css +24 -0
  1881. package/dist/styles/tables.css +25 -0
  1882. package/dist/styles/themes.css +622 -0
  1883. package/dist/styles/tokens.css +29 -0
  1884. package/dist/styles/transcript.css +13 -0
  1885. package/dist/tree/DocumentTree.js +607 -0
  1886. package/dist/tree/DocumentTree.js.map +1 -0
  1887. package/dist/tree/DocumentTree.vue.d.ts +48 -0
  1888. package/dist/tree/drop-rules.d.ts +13 -0
  1889. package/dist/tree/drop-rules.js +45 -0
  1890. package/dist/tree/drop-rules.js.map +1 -0
  1891. package/dist/tree/folder-paths.js +11 -0
  1892. package/dist/tree/folder-paths.js.map +1 -0
  1893. package/dist/tree/index.d.ts +7 -0
  1894. package/dist/tree/index.js +3 -0
  1895. package/dist/tree/react/DocumentTree.d.ts +32 -0
  1896. package/dist/tree/react/DocumentTree.js +497 -0
  1897. package/dist/tree/react/DocumentTree.js.map +1 -0
  1898. package/dist/tree/react/use-tree-model.js +133 -0
  1899. package/dist/tree/react/use-tree-model.js.map +1 -0
  1900. package/dist/tree/react/use-tree-view.d.ts +16 -0
  1901. package/dist/tree/react/use-tree-view.js +23 -0
  1902. package/dist/tree/react/use-tree-view.js.map +1 -0
  1903. package/dist/tree/react.d.ts +3 -0
  1904. package/dist/tree/react.js +3 -0
  1905. package/dist/tree/row-focus.js +46 -0
  1906. package/dist/tree/row-focus.js.map +1 -0
  1907. package/dist/tree/store.d.ts +45 -0
  1908. package/dist/tree/tree-host.js +140 -0
  1909. package/dist/tree/tree-host.js.map +1 -0
  1910. package/dist/tree/tree-items.d.ts +61 -0
  1911. package/dist/tree/tree-items.js +272 -0
  1912. package/dist/tree/tree-items.js.map +1 -0
  1913. package/dist/tree/tree-model.d.ts +19 -0
  1914. package/dist/tree/tree-model.js +704 -0
  1915. package/dist/tree/tree-model.js.map +1 -0
  1916. package/dist/tree/tree-rows.d.ts +4 -0
  1917. package/dist/tree/tree-rows.js +90 -0
  1918. package/dist/tree/tree-rows.js.map +1 -0
  1919. package/dist/tree/tree-view-model.d.ts +39 -0
  1920. package/dist/tree/tree-view-model.js +85 -0
  1921. package/dist/tree/tree-view-model.js.map +1 -0
  1922. package/dist/tree/tree-view.d.ts +17 -0
  1923. package/dist/tree/tree-view.js +23 -0
  1924. package/dist/tree/tree-view.js.map +1 -0
  1925. package/dist/tree/types.d.ts +2 -0
  1926. package/dist/tree/types.js +0 -0
  1927. package/dist/tree/use-tree-model.js +95 -0
  1928. package/dist/tree/use-tree-model.js.map +1 -0
  1929. package/dist/tree/vue.d.ts +3 -0
  1930. package/dist/tree/vue.js +3 -0
  1931. package/dist/vue/AdvancedEditor.js +135 -0
  1932. package/dist/vue/AdvancedEditor.js.map +1 -0
  1933. package/dist/vue/AdvancedEditor.vue.d.ts +110 -0
  1934. package/dist/vue/SimpleEditor.js +107 -0
  1935. package/dist/vue/SimpleEditor.js.map +1 -0
  1936. package/dist/vue/SimpleEditor.vue.d.ts +66 -0
  1937. package/dist/vue/advanced.d.ts +4 -0
  1938. package/dist/vue/advanced.js +4 -0
  1939. package/dist/vue/components/EditorCommandPalette.js +91 -0
  1940. package/dist/vue/components/EditorCommandPalette.js.map +1 -0
  1941. package/dist/vue/components/EditorCommandPalette.vue.d.ts +15 -0
  1942. package/dist/vue/components/EditorSettingsModal.js +73 -0
  1943. package/dist/vue/components/EditorSettingsModal.js.map +1 -0
  1944. package/dist/vue/components/EditorSettingsModal.vue.d.ts +24 -0
  1945. package/dist/vue/components/EditorSettingsPanel.js +62 -0
  1946. package/dist/vue/components/EditorSettingsPanel.js.map +1 -0
  1947. package/dist/vue/components/EditorSettingsPanel.vue.d.ts +29 -0
  1948. package/dist/vue/components/EditorSurface.js +174 -0
  1949. package/dist/vue/components/EditorSurface.js.map +1 -0
  1950. package/dist/vue/components/EditorSurface.vue.d.ts +68 -0
  1951. package/dist/vue/components/EditorToolbar.js +144 -0
  1952. package/dist/vue/components/EditorToolbar.js.map +1 -0
  1953. package/dist/vue/components/EditorToolbar.vue.d.ts +15 -0
  1954. package/dist/vue/components/SettingsSection.js +26 -0
  1955. package/dist/vue/components/SettingsSection.js.map +1 -0
  1956. package/dist/vue/components/SettingsSection.vue.d.ts +21 -0
  1957. package/dist/vue/components/SuggestionList.js +91 -0
  1958. package/dist/vue/components/SuggestionList.js.map +1 -0
  1959. package/dist/vue/components/SuggestionList.vue.d.ts +19 -0
  1960. package/dist/vue/compose.d.ts +15 -0
  1961. package/dist/vue/compose.js +46 -0
  1962. package/dist/vue/compose.js.map +1 -0
  1963. package/dist/vue/context-key.d.ts +6 -0
  1964. package/dist/vue/context-key.js +6 -0
  1965. package/dist/vue/context-key.js.map +1 -0
  1966. package/dist/vue/context.d.ts +26 -0
  1967. package/dist/vue/context.js +43 -0
  1968. package/dist/vue/context.js.map +1 -0
  1969. package/dist/vue/index.d.ts +28 -0
  1970. package/dist/vue/index.js +18 -0
  1971. package/dist/vue/kit/index.d.ts +3 -0
  1972. package/dist/vue/kit/index.js +1 -0
  1973. package/dist/vue/kit/nuxt-ui.css +24 -0
  1974. package/dist/vue/kit/nuxt-ui.d.ts +31 -0
  1975. package/dist/vue/kit/nuxt-ui.js +124 -0
  1976. package/dist/vue/kit/nuxt-ui.js.map +1 -0
  1977. package/dist/vue/kit/types.d.ts +411 -0
  1978. package/dist/vue/kit/use-ui-kit.d.ts +12 -0
  1979. package/dist/vue/kit/use-ui-kit.js +17 -0
  1980. package/dist/vue/kit/use-ui-kit.js.map +1 -0
  1981. package/dist/vue/notify.d.ts +12 -0
  1982. package/dist/vue/notify.js +27 -0
  1983. package/dist/vue/notify.js.map +1 -0
  1984. package/dist/vue/settings.d.ts +16 -0
  1985. package/dist/vue/settings.js +64 -0
  1986. package/dist/vue/settings.js.map +1 -0
  1987. package/dist/vue/simple.d.ts +2 -0
  1988. package/dist/vue/simple.js +1 -0
  1989. package/dist/vue/store-ref.d.ts +20 -0
  1990. package/dist/vue/store-ref.js +59 -0
  1991. package/dist/vue/store-ref.js.map +1 -0
  1992. package/dist/vue/suggestion-renderer.d.ts +6 -0
  1993. package/dist/vue/suggestion-renderer.js +20 -0
  1994. package/dist/vue/suggestion-renderer.js.map +1 -0
  1995. package/dist/vue/use-draft-field.js +36 -0
  1996. package/dist/vue/use-draft-field.js.map +1 -0
  1997. package/dist/vue/use-editor-i18n.d.ts +12 -0
  1998. package/dist/vue/use-editor-i18n.js +17 -0
  1999. package/dist/vue/use-editor-i18n.js.map +1 -0
  2000. package/dist/vue/use-editor-ui.d.ts +15 -0
  2001. package/dist/vue/use-editor-ui.js +23 -0
  2002. package/dist/vue/use-editor-ui.js.map +1 -0
  2003. package/dist/vue/use-notifier.d.ts +11 -0
  2004. package/dist/vue/use-notifier.js +19 -0
  2005. package/dist/vue/use-notifier.js.map +1 -0
  2006. package/package.json +842 -4
package/CHANGELOG.md ADDED
@@ -0,0 +1,436 @@
1
+ # Changelog
2
+
3
+ ## 5.0.1 - 2026-10-26
4
+
5
+ ### Fixed
6
+
7
+ - Optional peer `@skaile/forge-app-actions` accepts `^0.1.0 || ^0.2.0`. A caret on 0.x excludes the next minor, so a host on forge-app-actions 0.2 (the `./chat` binding that turns `documentActions` into chat tools) got a peer warning and a second copy.
8
+
9
+ ## 5.0.0 - 2026-10-26
10
+
11
+ ### Added
12
+
13
+ - `@skaile/forge-editor/ai/actions`: `documentActions({ editor, review, scope?, targets? })` returns two forge actions (`@skaile/forge-app-actions`, optional peer `^0.1.0`) that put the document chat into any chat with client tools: `doc.read` (the document as block lines, `[<block id>] <Markdown>`) and `doc.propose_ops` (edit operations in the shape and limits of the `edit_document` tool, checked with `checkAgentOps` against the block IDs, the `scope` and the convert `targets`; valid ones open as review hunks in `review`, invalid ones come back as `problems` for the model to correct). Operation IDs continue the review's own counter (`nextOp`/`advanceOp`), so the numbering holds across turns and next to the editor's own document chat. The capability names are `app.doc.read` and `app.doc.propose_ops`.
14
+ - `TransferFeatureOptions.extraTransforms`: transforms offered after the default list (or after `transforms`), so an add-on's transforms join the built-in ones without the host listing them again. `AdvancedEditor` (Vue and React `ComposedSurface`) takes `transfer` and `explore` and passes them to `composeEditor`, so a host opts into `'transfer'` and `'explore'` by catalog id with their options instead of adding the features through `add`.
15
+ - Add-on helpers (`/core`: `createCatalogTranslator`, `CatalogTranslate`, `CatalogParams`, `renderFileNameOf`, `MAX_RENDER_FILE_STEM`, `safeLinkUrl`, `SafeLinkOptions`): `createCatalogTranslator(catalog, overrides?)` is the `{name}` translator over one language's string catalog (the library's own `createTranslator` and the string tables of the add-ons use it); `renderFileNameOf(content, fallback, extension)` is the file name a render target gives its output (title of a Typed block, else first heading or paragraph of a Document, cleaned of characters a file system rejects, cut to 80 characters); `safeLinkUrl(value, { relative? })` returns a link that cannot run script (`http:`, `https:`, `mailto:`, relative unless `relative: false`), read the way a browser reads it (`java\tscript:` is refused), else `null`. The `markdown` render target uses `renderFileNameOf`, so a Document whose first heading follows a paragraph is now named after the heading.
16
+ - Node views by Block type id (`/composites`: `CompositeNodeViews.byType`; `CompositeFeatureOptions.blockNodeViews`, `ComposeOptions.blockNodeViews`, the `blockNodeViews` prop of `AdvancedEditor` and `ComposedSurface`): an add-on that draws its own Block type (the charts add-on's `chart`) replaces the standard Typed block view for that type. Also exported for add-ons: `displayEnv`, `subscribeBlockChanges`, `FOREIGN_CONTENT_REFRESH_MS`.
17
+ - Embeddings port and search by meaning (`/server`: `Embedder`, `EditorPorts.embeddings`, `BlockIndex.nearest?`, `BlockIndex.related?`; `/core`: `fuseRanks`, `RANK_FUSION_K`, `DEFAULT_FUSION_WEIGHTS`; new entry `/adapters/embeddings`: `createOpenAiEmbedder(options)` over an OpenAI-compatible `/embeddings` endpoint, `OPENAI_EMBEDDING_DIMENSIONS`; `BackendCapability` unchanged, the server lists `embeddings` in `GET /api/editor/capabilities` as `ServerCapability`): `embeddings` is the port that turns text into vectors, an index that keeps vectors (`@skaile/forge-editor-index-pg`) takes the same embedder. `GET /api/editor/search` fuses the keyword hits with the `nearest` Blocks by reciprocal rank fusion (`fuseRanks`, k = 60, weights 0.7 / 0.3) when the host has the port and the index has `nearest`, and answers the keyword hits when the embedder fails; `GET /api/editor/blocks/:documentId/:blockId/related` prefers `index.related` and falls back to the shared-tags heuristic. Without `embeddings` nothing changes.
18
+ - Query builder (`/composites`: `QueryBuilder` Vue and React forms, `createQueryBuilderModel`, `createEditorQueryBuilder`, `opsOfField`, `valueInputOf`, `fieldChoicesOf`, `conditionValueOf`): data views get a form that edits their stored query: Block type, a flat AND list of `field op value` conditions (fields are the properties of the type plus the pseudo-fields, the operators are the `ops` of the field's kind, the value input follows the kind and operator), one sort and one group field. A complete, valid query is written to `meta.query` (`validateQuery`); an unfinished row writes nothing, and parts the form has no control for (search, aggregates, further sorts, other types, a filter with `or`) are kept. The layout bar of a data view has a button that opens the form.
19
+ - Data views (`/composites`: `DATA_VIEW_TYPE`, `DATA_VIEW_QUERY_KEY`, `DATA_VIEW_LAYOUT_KEY`, `dataViewQueryOf`, `dataViewLayoutOf`, `newDataViewMeta`, `createDataViewModel`, `createEditorDataViewModel`, `chooseDataViewLayout`, `insertDataView`, `mostUsedBlockTypeOf`, `localRowsOf`, `VIEW_LAYOUTS`, `LAYOUT_IDS`, `viewModelOf`, `missingRequirementsOf`, `tableColumnsOf`, `fieldColumnsOf`, `DataView` Vue and React node views, `CompositeNodeViews.dataView`): Block type `dataView` stores only its query and layout (`meta.query`, `meta.layout`), never rows, and shows the answer as table, list or board (a board needs a group; its lanes are the options of the grouped property, `status` groups included). The model asks `backend.index.query` (else the Blocks of the open Document through `evaluateQuery`), asks again after a debounced change of the Blocks and every `FOREIGN_CONTENT_REFRESH_MS` while on screen. `/ansicht` inserts a view over the Document's most used Typed block type (`insertComposite(kind, meta)` takes the new block's `meta`). The Typed blocks table (`tableViewOf`, `CompositeTable`) now reads its columns from the `table` layout (`cellTextOf` exported), so there is one table implementation; the column derivation (`fieldColumnsOf`) moved to `views/layouts`. Guide "Data views".
20
+ - Speech and render records exported from `/core` (`SpeechEngineInfo`, `SpeechVoice`, `SpeechFormat`, `SpeechRequest`, `SpeechBody`, `SpeechSegment`, `RenderTargetInfo`, `RenderInput`, `RenderBody`, `RenderProgress`, `RenderDone`, `RenderResult`): types only, so an add-on names what `EditorBackend['speech']` and `EditorBackend['render']` take and return (both resolve with `RenderResult`) without a path into the library's source.
21
+ - Knowledge graph port (`/server`: `KnowledgeGraph`, `EditorPorts.knowledge`; `/core`: `KnowledgeNode`, `KnowledgeHit`, `KnowledgeEdge`, `KnowledgeNeighbours`, `KNOWLEDGE_QUERY_MAX`, `KNOWLEDGE_ID_MAX`; new entry `/adapters/knowledge`: `createMemoryKnowledgeGraph(nodes, edges)`, `MEMORY_KNOWLEDGE_LIMIT`): the host's graph of sources, concepts and notes outside the Documents, read only (`search(q, user)`, `neighbours(id, user)` and an optional `origin(id, user)`: where a node came from). New capability `knowledge` and routes `knowledgeSearch` (`GET /api/editor/knowledge/search?q=`) and `knowledgeNeighbours` (`GET /api/editor/knowledge/nodes/:id/neighbours`), `401` without a user, `400` for a blank, missing or over-long input, `501` without the port; `EditorBackend.knowledge?: { search(query, signal?), neighbours(id, signal?) }`. The Explore panel gets a fourth tab `knowledge` („Wissensgraph“, `ExploreTab`, `ExploreState.knowledge`, `.query`, `.focus`, `ExploreModel.focusNode`, `exploreTabLabel`, `exploreKnowledgeLinksOf`) when the backend has the capability: the nodes the graph finds for the Block's title (label, kind, score), and the neighbours of the node you click. The add-on `@skaile/forge-editor-kgs` provides the port over the KGS SDK. Guide: `guides/knowledge-graph`.
22
+ - Explore feature (new entries `/explore`, `/explore/vue`, `/explore/react`: `exploreFeature`, `exploreFeatureCore`, `createExploreModel`, `exploreTabsOf`, `exploreCountOf`, `exploreKindLabel`, `ExplorePanel`, `ExploreSection`, `useExploreModel`; `/core`: `derivationTrailOf`, `TRAIL_MAX_HOPS`, `TrailStep`, `TrailSource`, `relatedBlocks`, `relatedScore`, `RELATED_LIMIT`; catalog id `explore` and `ComposeOptions.explore`): an opt-in interaction feature (in no level list: `interaction: [...INTERACTION.full, 'explore']`; `requires` `composites` and the backend capability `index`) that shows for one Block its backlinks (the incoming Edges without `tag`), its related Blocks and its Derivation trail in the `ExplorePanel` the host places, plus the inspector section „Verknüpfungen“ with the counts and a button to the panel (`show`, else inline). New route `blockRelated` (`GET /api/editor/blocks/:documentId/:blockId/related`, answers `BlockSearchHit[]`: 2 points per shared tag, 3 per shared reference target, 1 when the text holds every word of the title, best ten, the Block itself never; `[]` for an unknown Block, `401` without a user, `403` for an unreadable Document, `501` without the `index` port) and `EditorBackend.index.related?`; the in-memory backend ranks with the same `relatedBlocks`. `derivationTrailOf(address, index)` follows `derivedFrom` through `blockGet` up to 8 Derivations back, the original first, each step with the state the row badge shows. Messages `explore.*` (de, en). Guide `32.explore.md`.
23
+ - Block type `collection` (`/composites`: `COLLECTION_TYPE`, `COLLECTION_ITEMS_KEY`, `COLLECTION_QUERY_KEY`, `collectionItemsOf`, `collectionQueryOf`, `withCollectionItems`, `collectionViewOf`, `collectionChoicesOf`, `addToCollection`, `moveCollectionItem`, `removeCollectionItem`, `setCollectionItems`, `fillCollectionFromQuery`, `typedBlockViewOptions`; `CompositeNodeViews.collection?`; Vue and React `CollectionView`): a Typed block that lists other Blocks as an ordered `reference-list` property `items` (an address with `documentId` `''` is a Block of this Document) and keeps an optional `DataQuery` as JSON text in the hidden property `query`. Its node view shows the entries as reference pills in order, with move up, move down and remove, and a „Aus Abfrage füllen“ button (only with a stored query and a backend whose `index.query` exists) that runs the query and appends the hits that are not listed yet. New block action `collection-add` („Zu Sammlung hinzufügen“, a menu of the collections of the open Document) on every Typed block. The Markdown export of a collection (`documentCompositeMarkdown`, `headingsMarkdown`, `compositeChromeBlocks`; new `collectionItemBlocks`) lists its entries as `[@id]` lines in the stored order, and the meta line leaves out hidden and `reference-list` properties. The Vue and React `typedBlock` renderers now take `typedBlockViewOptions` (a Typed block whose type changes gets the other view) and `CompositeView` renders `children` after its content. Guide `30.collections`.
24
+ - Property kind `source-anchor` and the anchor locator (`/core`: `SourceAnchor`, `AnchorRect`, `AnchorQuote`, `sourceAnchorOf`, `sourceAnchorText`, `anchorLocatorOf`, `parseAnchorLocator`, `locatorLabelOf`; `/composites`: `REVEAL_ANCHOR_EVENT`, `SourceLocator` gains `anchor`): `PROPERTY_TYPES` gains `source-anchor`, a passage of a PDF `{ page, rects, quote: { exact, prefix?, suffix? } }` (`rects` are fractions of the page, so the passage survives a change of zoom). `PROPERTY_KINDS['source-anchor']` orders, compares and groups by page, reads as the quoted text and takes `eq` `ne` `lt` `lte` `gt` `gte` `contains` `isEmpty` `isNotEmpty`; `metaWithProperty` keeps only a valid anchor, the field editors (Vue and React) show page and quote read-only, and the AI context and the chat model learn the type. A reference chip locator may now be `page=<n>&anchor=<base64url JSON>`: `parseLocator` returns `{ page, anchor }`, chips and backlinks show it as `S. <n>` (`locatorLabelOf`), and `revealSource` dispatches `sk-reveal-anchor` (`REVEAL_ANCHOR_EVENT`, `detail` = the `SourceAnchor`) after `sk-reveal-page` on the PDF source block, so a viewer can scroll to the passage. The PDF viewer is the add-on `@skaile/forge-editor-pdf-viewer`.
25
+ - Edge graph route (`/core`: `GraphData`, `GraphNode`, `GraphSource`, `GraphWalkOptions`, `walkGraph`, `graphSourceOfRows`, `DEFAULT_GRAPH_DEPTH`, `GRAPH_MAX_DEPTH`, `GRAPH_MAX_NODES`): `walkGraph` is a breadth-first walk over the Edges of the Block index in both directions, at most three hops deep and at most 500 Blocks (`truncated` says when more were left out); `tag` Edges and Edges to Blocks outside the scope are never part of it. New route `graph` (`GET /api/editor/graph?documentId=&blockId=&depth=`, answers `GraphData` `{ nodes: { address, title, type }[], edges: BlockEdge[], truncated }`, `depth` 1 to 3 with default 2, `400` for another `depth` or without `documentId`, `401` without a user, `403` for an unreadable Document, `404` for an unknown `blockId`, `501` without the `index` port) and `EditorBackend.index.graph?` (optional; the memory backend answers it too). It is what the `@skaile/forge-editor-graph` add-on draws.
26
+ - Query model and evaluator (`/core`: `DataQuery`, `SourceRef`, `BlockScope`, `FilterNode`, `FilterCondition`, `SortSpec`, `GroupSpec`, `AggregateSpec`, `SearchClause`, `DataRow`, `DataResult`, `QueryIssue`, `QueryRequestBody`, `PSEUDO_FIELDS`, `MAX_QUERY_ROWS`, `validateQuery`, `evaluateQuery`, `narrowScope`): a query is data (`{ v: 1, source, filter?, search?, sorts?, group?, aggregates?, select?, page? }`) over the Blocks of the Block index, filtered with and/or conditions whose operators come from `PROPERTY_KINDS`, with the pseudo-fields `$title`, `$tags`, `$type`, `$id`, `$doc`, `$basket`, sorted with `nulls`, grouped and totalled, paged by a cursor (the base64 row offset). `BlockIndex.query(query, scope, env, definitions?)` (`/server`; memory and drizzle adapters evaluate `evaluateQuery` in JS, `queryDefinitionsOf` gives the Property definitions of the host's Block types, `HandlerContext.blockTypes` carries them to the handler; a custom `BlockIndex` must implement it). New route `dataQuery` (`POST /api/editor/query`, body `{ query, env? }`, port `index`, handler `blockQuery`; `401` without a user, `400` for a body that is no query, `422` with the issues for a query with an error issue, `501` without the `index` port) and `EditorBackend.index.query?(query, { env?, signal? })`. The `find_blocks` tool of `createWorkspaceTools()` takes `blockType` and `filter` and then lists the Blocks of that type whose Properties satisfy the filter (with `query`: only hits of the search), each hit with its `values`. Guide: [Query](https://skaile-ai.github.io/skaile-editor/guides/query).
27
+ - Import duplicate check (`/core`: `ImportCheckBody`, `ImportMatch`, `ImportMatchReason`, `importMatchesOf`, `settleImportMatches`, `normalizeDoi`, `MAX_IMPORT_MATCHES`, `SHA256_HEX`; `/media`: `fileImportOptions`, `FileImportOptions`; `Notice.secondaryAction`): new route `importCheck` (`POST /api/editor/import/check`, body `{ sha256?, doi?, title?, type? }`, answers `ImportMatch[]` `{ address, title, reason: 'sha256' | 'doi' | 'title' }`, `400` without one of the three, `401`, `501` without the `index` port) and `EditorBackend.index.importCheck?` (optional: a backend without it imports without the check). `projectDocument` copies the SHA-256 of an uploaded file into `properties.sha256` of its Block (a media block, or a Typed block whose first body block is the file). `fileImport` / `useFileImport()` hash a dropped file and ask the index before the upload, and for every Typed block of the plan (title, DOI); a hit is offered in a notice: reference the existing Block (a reference chip) or insert anyway. The route needs no new `BlockIndex` method: it reads through `byDocument`, `documentIds` and `search`. `fileImport(notify, t, options?)` takes a third argument. Guide: `34.importers`.
28
+ - Speech port (`/server`: `SpeechProvider`, `createSpeechBudget`, `SPEECH_CHARS_PER_DAY`, `SpeechBudget`, `SpeechBudgetOptions`; `/core`: `SpeechEngineInfo`, `SpeechVoice`, `SpeechRequest`, `SpeechBody`, `SpeechFormat`, `SpeechSegment`; capability `speech`, `EditorPorts.speech?`): the host passes one `SpeechProvider` (`engines(user)`, `synthesize(request, user, signal)`, optional `transcribe`). New routes `speechEngines` (`GET /api/editor/speech/engines`) and `speechSynthesize` (`POST /api/editor/speech`, SSE `progress`, then `done { asset, fileName, mime }` or `error { message }`; the audio is stored as an asset of the Document through the `assets` port, `501` without it, `404` unknown engine or voice, `403` unreadable Document), handlers `speechEnginesGet`/`speechSynthesizePost` in `/server/handlers`, `EditorBackend.speech?: { engines(), synthesize(request, { onProgress, signal }) }` (the HTTP backend shares the SSE loop with `render`). Each user may synthesize `SPEECH_CHARS_PER_DAY` (50 000) characters per UTC day, counted in memory per process (`HandlerContext.speechBudget` replaces the budget, e.g. in a test); beyond it the route answers `429` with `Retry-After`, and a failed synthesis gives its characters back. New entry `@skaile/forge-editor/adapters/speech` (`createOpenAiSpeech` over `POST <endpoint>/audio/speech`, `OPENAI_VOICES`, `createMemorySpeech` answering a second of silent WAV, `silentWav`). `/transcript` gains the pure subtitle writers `vttOf(cues)` and `srtOf(cues)`, `transcriptCuesOf(node)` and the type `TranscriptCue`, and the transcript feature the read-only block action „Untertitel exportieren“ (`transcript-export`) that downloads the timed segments of a Typed block as `.vtt` or `.srt` (message keys `transcript.export.*`). Guide: [Speech](https://skaile-ai.github.io/skaile-editor/guides/speech).
29
+ - Freigabestatus `vorgeschlagen` and the export check (`/composites`: `isAiProposal`, `exportIssuesOf`, `ExportIssue`, `ExportIssueCode`, `exportCheckSectionOf`, `exportCheckInspectorSection`, `provideCheckProbe`, `CheckProbe`, `subscribeExportCheck`; `/composites/vue` and `/composites/react`: `ExportCheckSection`; `CompositesUi.exportCheck`): a Typed block whose Derivation names the model (`method` `ai:<type>` or `activity.agent`) and whose body is still the text the model wrote (`outputHash` equals the live body hash) reads `vorgeschlagen` for every Prüfung kind without a record, where it read `offen`; an edit of the body ends the proposal (`offen`), a record makes it `geprueft`. `PruefungKindStatus` gains the value, `freigabeOf` counts it as open, the chip shows „KI-Vorschlag“ (`pruefung.status.vorgeschlagen`), `pruefungKindLabel` is exported from `/pruefung`. Nothing is stored: the decision stays the Prüfung. The block action „Als Markdown exportieren“ now runs `exportIssuesOf` (`ai-unchecked`, `stale-derived`, `source-missing`, `unresolved-reference`), shows „n Hinweise“ as a warning notice when there are any, and still exports; the inspector section „Export-Hinweise“ lists them. The `pruefung` feature tells the check through `provideCheckProbe` whether a block still waits for a Prüfung. Guide: [AI proposals and the export check](https://skaile-ai.github.io/skaile-editor/guides/export-check).
30
+ - Edges in the Block index (`/core`: `BlockEdge`, `BlockEdgeRow`, `EdgeKind`, `EdgeOrigin`, `AuthoredEdge`, `META_EDGES_KEY`, `authoredEdgesOf`, `blockEdgesOf`, `edgesInto`, `isTagEdgeTarget`; `BlockRow.edges`): `projectDocument` lists the connections of every Block: `reference` (reference chips), `derivation` (the Block the Derivation names), `embed` (`blockEmbed`), `tag` (target `{ tag }`) and, with `origin: 'meta'`, the Edges a person added in `meta.edges`. `BlockIndex.edges(address, direction, scope)` (`/server`) answers `'out'` (written in the Block) or `'in'` (the backlinks: other Blocks pointing at it, never `tag` Edges) within the scope; a custom `BlockIndex` must implement it. New route `blockEdges` (`GET /api/editor/blocks/:documentId/:blockId/edges?direction=in|out`, `in` by default, port `index`, handler `blockEdges` in `adapters/index/handlers`; `403` for an unreadable Document, `400` for another direction), `EditorBackend.index.edges?(address, direction?, signal?)` (optional). The drizzle adapter writes a second table `editor_block_edges` in the transaction of `replace` with an index on the target: `blockIndexTables()` now returns `{ blocks, edges }` (a host that passed the single table to its drizzle schema adds both), `bootstrapBlockIndexTables` creates both. The composites feature adds the inspector and details section „Kanten“ (`CompositesUi.edges`; `/composites/vue` and `/composites/react`: `EdgesSection`; `/composites`: `edgesSectionOf`, `addAuthoredEdge`, `removeAuthoredEdge`, `edgeTargetChoicesOf`, `edgesInspectorSection`) to list, add (kind as text, target from the `[@` popup's list) and remove authored Edges. New message keys `composites.edges.*`. Guide: [Edges](https://skaile-ai.github.io/skaile-editor/guides/edges).
31
+ - Renderer port (`/server`: `Renderer`, `RenderProgressReporter`, `EditorPorts.render`; `/core`: `RenderTargetInfo`, `RenderInput`, `RenderBody`, `RenderProgress`, `RenderDone`, `RenderResult`; capability `render`, appended to `BACKEND_CAPABILITIES`): export formats beyond the editor's own. New routes `renderTargets` (`GET /api/editor/render/targets`) and `renderPost` (`POST /api/editor/render`, server-sent events `progress`, then `done { asset, fileName, mime }` or `error { message }`; the result is stored as an asset of the Document through the `assets` port, `501` without it, `404` unknown target, `422` a Block type the target does not accept). `EditorBackend.render?: { targets(), render(target, input, { onProgress, signal }) }`. New entry `@skaile/forge-editor/adapters/render` (`createRenderer(targets)`, `RenderTarget`, built-in `markdownTarget(options?)`). `core/sse.ts` holds the one SSE client: `readSseStream` (the parser the HTTP backend used inline) and the generic `postSse(events, onEvent)`; `postAiSse` now delegates to it. `documentCompositeBlocks(schema, node, kinds)` is split out of `documentCompositeMarkdown`. The composites feature adds the block action `render` („Erzeugen als …“, a menu of the targets that accept the Block type) and the command `render-document` (⌘K) when the backend serves `render`; `downloadUrl` joins `downloadText` in `/core`. Guide: [Render](https://skaile-ai.github.io/skaile-editor/guides/render), reference: Renderer port.
32
+ - Importer registry (`/core`: `Importer`, `ImportPlan`, `ImportFallback`, `importersOf`, `planImport`; feature field `importers`): the singleton pipeline hook `wrapImport` (and `wrapImportBlocks`) is replaced by an additive list of file importers. The first importer in feature order whose `accepts` (MIME types, `.ext`, `*`) matches plans the file; no match falls back to the media/file import. An importer accepting `*` wraps the plan of the others: `composite-media` is now `importers: [mediaImporter]` with the same wrapping behaviour, and it merges the plan's `properties` into the Typed block's `meta`. `defineEditor` throws for a duplicate importer id, `checks/composition.ts` covers it. The `media` feature contributes `markdownImporter` (frontmatter becomes `properties`, via `parseFrontmatter`), `subtitleImporter` (`.vtt`, `.srt` become one transcript block with a `transcriptSegment` per cue, `parseSubtitles`, `cueTime`) and `bibImporter` (`.bib` becomes one `paper` or `book` block per entry, new `parseBibtex` to CSL; all exported from `/media`). `fileImport` reports plan warnings in a notice (`media.import.warnings`). Breaking for feature authors: replace `blocks: { wrapImport }` by `importers`. Guide `34.importers.md`.
33
+ - Derivation v2 (`/core`): `Derivation.inputs` (named inputs `{ from, hash }` of an N-to-1 Derivation) and `Derivation.activity` (`{ id, agent?, at? }`, the run that produced the Block). New `derivationFingerprint({ method, inputs })` (SHA-256 over the method and the input hashes by input name; the key order does not matter), `derivedStateOf(state)` and `DerivedStateId` (`'fresh' | 'stale' | 'edited' | 'missing' | 'foreign'`). `derivationState` takes a sixth argument `inputHashOf(from)`: a Derivation with `inputs` is `stale` when any input's live hash differs, `null` without the lookup. The AI rendition (`createRendition`) and „Ableiten (KI)“ (`deriveComposite`) record their `activity`. The composites feature adds the row badge `derivedRowBadge` (`/composites`: `derivedRowBadge`, `derivedChipOf`, `derivedStateLabel`): „veraltet“ for a Derived block whose original changed, „Quelle fehlt“ for one whose original is gone; the Document tree shows a dot with the reason for a stale, missing or edited Derived block. New message keys `composites.derivation.state.<fresh|stale|edited|missing|foreign>`.
34
+ - Property kinds (`/core`: `PROPERTY_KINDS`, `PropertyKind`, `statusGroupOf`, `PropertyType`, `PropertyOption`, `STATUS_GROUPS`, `StatusGroup`, `blockAddressesOf`; types `FilterOp`, `AggregateFn`, `QueryEnv`, `Scalar` from the new `core/query-types.ts`): one registry entry per entry of `PROPERTY_TYPES` says which filter operators apply, how a value sorts and groups, which aggregates fit and how it reads as text. `PROPERTY_TYPES` gains `checkbox` (stored `true`; unchecked removes the key), `url`, `status` (a select whose options carry a `group`: `todo`, `doing` or `done`; the status chip follows the group) and `reference-list` (`BlockAddress[]`, `documentId` `''` = this Document); the Vue and React field editors edit all four (`ReferenceListFieldEditor`) and the AI chat and brief know them. `PropertyDefinition.hidden` keeps a property out of the Block inspector, the details popover and the Block table. A `PropertyDefinition` key that starts with `$` is rejected in a Block type (reserved for the pseudo-fields of a Block query). Guide: [Block properties](https://skaile-ai.github.io/skaile-editor/guides/block-properties).
35
+ - Inline `cite` node (`/composites`, `/composites/schema`: `CiteNode`, `CITE_NODE`, `CITE_TRIGGER`, `citeMarkdown`, `citeAttrsOf`, `citeEntriesOf`, `citeText`, `resolveCite`, `citeSuggestion`; commands `insertCite`, `setCiteLocator`; `bibtexKey` is now exported; Vue and React `CiteView`; `CompositeNodeViews.cite` is optional): `/zitat` or `[cite:` opens a picker over the Document's bibliography entries (Typed blocks with `meta.bib`), and the chip shows `(Autor Jahr)` or `(Autor Jahr, S. 12)` through `citeShort`, follows edits of the entry, reveals it on click and takes a locator on double click. `key` is the entry's BibTeX key (the one `bibtexOf` writes). Markdown is `[cite:<key>]` / `[cite:<key>, <locator>]` (`[@` stays the reference chip's); it parses straight back into the node. The Block index text of a Block holds `[cite:<key>]` for a citation. Guide: [Citations](https://skaile-ai.github.io/skaile-editor/guides/citations).
36
+ - Preset bundles: `composeBundle(bundle, options?)` (`/vue/advanced`, `/react/advanced`; `composeBundle(ui, bundle, options?)` in `presets/compose`) composes the named bundles `simple`, `writing`, `collaborative` and `advanced` (`BUNDLES`, `BundleId`, `Bundle`), with `with` (catalog features added on top, an AI id switches `ai` on; an id outside the catalog throws) and `without` (merged into `remove`) in `BundleOptions`. `simpleEditor()` and `advancedEditor(options)` are bundle calls; the `advancedEditor` options are now `BundleOptions`, so `content`, `interaction` and `ai` are no longer overridable there (use `composeEditor`). Guide: Bundles in [Feature composition](https://skaile-ai.github.io/skaile-editor/guides/composition#bundles).
37
+ - Brand naming and the optional-peer check: `check:editor-entries` fails when a `peerDependenciesMeta` entry lacks `optional: true` or when `react`, `react-dom`, `vue`, `nuxt`, `@nuxt/ui`, `@tiptap/react`, `@tiptap/vue-3`, `@iconify/react` or `@iconify/vue` is a peer without such an entry. `--sk-success` in `vue/kit/nuxt-ui.css` and `--ui-success` in the Obsidian bridge (`styles/themes.css`) read `var(--color-success, …)` first, so the brand bridge wins when present (as in `react/styles/ui-vars.css`). The React examples pin `@skaile/brand` `^0.6.0` (`@ecsplico/brand` exports only `./nuxt-ui.css`, so they keep `@skaile/brand/theme.css`); `docs/content/3.guides/12.themes.md` explains which package is which.
38
+ - `BlockAction.readOnly?: boolean` and `BlockAction.onHover?(ctx, entering)` (`/core`, `BlockActionContext` as in `run`): a Block action marked `readOnly` is offered in a read-only editor too; every other action is hidden there (`blockActionsFor`). `selectedBlockOf` no longer returns null for a read-only editor, and the Vue and React `BlockActionsOverlay` show the bar whenever an action remains and call `onHover` when the pointer enters or leaves an action's button. New hover action `composite-details` („Details“, `i-lucide-info`, order 405, `ABILITY.compositeMeta`, `readOnly`) opens the details popover of a Typed block through `openCompositeDetails(editor, node)`; the chrome binds each popover to the new `CompositeStorage.detailsOpen` store. Guide: [Block UI](https://skaile-ai.github.io/skaile-editor/guides/block-ui#actions-in-a-read-only-editor).
39
+ - Dokumentvorlagen (`/core`: `expandTemplate`, `expandTemplateContent`, `templatesOf`, `TEMPLATES_FOLDER`, `TemplateEnv`, `ExpandedTemplate`): `expandTemplate(text, { title, now, locale })` expands `{{title}}`, `{{date}}` (medium), `{{date:short|medium|long|iso}}`, `{{time}}` and `{{cursor}}` (removed, its offset is returned) and leaves every other `{{…}}` as written. A Document inside the folder named `Dokumentvorlagen` is a Dokumentvorlage: `POST /api/editor/documents` takes an optional `templateId` (`API.documentCreate`, `EditorBackend.documents.create`), and the new Document starts as a copy of that Dokumentvorlage with every text node expanded (`{{title}}` is the new title, dates use the first `Accept-Language` tag, default `de`); the route answers `404` for an id outside the Dokumentvorlagen folder and `403` for a Dokumentvorlage the user may not read, and the Dokumentvorlage itself stays unchanged. The reference app's Documents page lists the Dokumentvorlagen under „Aus Dokumentvorlage“. Guide: [Templates](https://skaile-ai.github.io/skaile-editor/guides/templates).
40
+ - Documentation of the workspace layer: the guide [Workspace](https://skaile-ai.github.io/skaile-editor/guides/workspace) (Block index and its adapters, the block route, Workspace search, references across Documents, Document routes and the `DocumentMutator`, Tool providers, change sets, `blockEmbed`), `docs/adr/0003-one-host-now-apps-ejectable-later.md` (what the library owns and what a host chooses) and the glossary entries **Block address**, **Block index**, **Workspace search**, **Change set**, **Embed** (home and mount) and **Tool provider** in `CONTEXT.md`. Five snippets under `docs/snippets/` (`workspace-*.ts`) are typechecked code.
41
+ - `BlockIndex.documentIds()` (`/server`; memory and drizzle adapters): the Documents that have at least one row, listed without reading any Document. A custom `BlockIndex` must implement it. `readableDocumentsOf` takes its candidates from `documents.listDocumentIds`, else `index.documentIds()`, else the IDs of `listContents`.
42
+ - One read rule for Documents (`server/readable-documents.ts`: `documentAccess`, `readableAmong`, `mayReadDocument`, `mayEditDocument`, `readableDocumentsOf`; `/server` exports `mayReadDocument` and `readableDocumentsOf`): `identity.readableDocuments(user)` decides what a user may read when the host has it, else `authorize(user, id)` does, and with neither every authenticated user may. A Document that `readableDocuments` names but `authorize` refuses is read-only. `accessOf` delegates to it, so the block route, the tree and list, the ops route, the document GET, the search and the chat's tools answer the same for a host that implements only `readableDocuments`, only `authorize` or both.
43
+ - Embeds are bounded: they nest 3 levels deep (`MAX_EMBED_DEPTH`) and one outermost embed mounts at most 24 embeds at once (`MAX_EMBED_VIEWS`); past either bound an embed shows the new state `limit` (`data-state="limit"`, message `composites.embed.limit`) and neither reads nor follows its Block. Before, a chain of Blocks that embed the next one twice mounted 2^n views.
44
+ - Change sets: `changeSetOwner(user)` (`adapters/change-sets/owner.ts`) is the one function that derives the owner key (`ChangeSet.by`) for the chat route, the store and the change set routes, and `AGENT_OP_ID` (`core/change-set.ts`) is the pattern of an operation ID (`op1`, `op2`, …) that the chat route and the change set routes share. Accepting hunks claims them atomically, so two concurrent requests cannot apply the same hunk twice, and a failure of the `DocumentMutator` that is no `HttpError` marks the hunk `invalid` instead of leaving it `pending`.
45
+ - Maintenance of the Block index after a write (`withBlockIndex`, `DocumentMutator`) never fails the write: a failed re-projection is logged, and the next write of the Document re-projects it.
46
+ - The agent operation types `AgentOp`, `ModelAgentOp` and `AgentOpFeedback` live in `core/agent-op-types.ts`, and `DocumentSummary` and `TreeFolder` in `core/document-summary.ts`, because `/core` contracts (`EditorBackend`, `API`, `ChangeSet`) name them and core must not import a feature or the tree module. `features/ai/protocol/agent-ops.ts` and `tree/types.ts` re-export them, so the public entries (`/ai` protocol, `/tree`) export them as before.
47
+ - `blockEmbed` (`/composites`: `BlockEmbedNode`, `BLOCK_EMBED_NODE`, `blockEmbedMarkdown`, `blockEmbedSuggestion`, `embedStateOf`, `embedChainOf`, `mountEmbed`; Vue and React `BlockEmbedView`): a Block of any Document mounted read-only in another Document and edited at its home. An atom block node (`documentId`, `blockId`, `mode: 'block' | 'children'`, `label`) with no content in the Yjs state; Markdown `![[<documentId>#<blockId>]]` (`|children` mounts the Blocks nested in it). The node view renders the home Block's current content from the Block index (a Block of the open Document is read from the editor itself, so its edits show at once) and refreshes it every 4 s, shows `gone`, `unavailable` and `loading` states, nests embeds recursively and stops an embed whose home Block is inside its own chain (`cycle`, no endless render). `![[` opens a picker over `index.search` (also `/einbetten`); „Am Ursprung bearbeiten“ calls the new option `openBlock(address)` of `compositeFeature` (`composeEditor`, `AdvancedEditor` and the React `ComposedSurface` pass it as `openBlock`). `CompositeNodeViews.blockEmbed` is optional: a binding without it shows the embed's static label. The block route takes `?content=block|children` and answers the Block's nodes from the collaboration server's live content (else the stored one) in `BlockSummary.content` (`400` for any other value); `EditorBackend.index.blockGet(address, signal?, content?: BlockContentMode)` and the memory backend carry it, `blockContentOf` and `BlockContentMode` are exported from `/core`. The foreign Block cache keeps answers with content apart from summaries (`foreignBlockLookup`, `FOREIGN_CONTENT_REFRESH_MS`).
48
+ - Document routes (`/server`, `/core`): `DocumentAdmin` gains `listTree()`, `createDocument({ title?, folder? })` and `moveDocument(id, folder)` (a documents port that implements them serves the routes below; without them they answer `501`). New rows of `API`: `GET /api/editor/documents` (`documentList`: the Documents the user may read, newest first), `GET /api/editor/tree` (`documentTree`), `POST /api/editor/documents` (`documentCreate`, `201` with the `DocumentSummary`), `PUT /api/editor/documents/:id/folder` (`documentMove`), `DELETE /api/editor/documents/:id` (`documentDelete`: the collaboration server forgets the Document first, then `deleteDocument`, and the Block index drops its rows) and `POST /api/editor/documents/:id/ops` (`documentOps`). The HTTP backend offers them as `EditorBackend.documents.list/tree/create/move/remove/applyOps`. The Nuxt reference host's tree store is a client of them; its `/api/documents` list/create/delete routes and `/api/tree` are gone.
49
+ - Cross-Document agent edits as a change set. `AgentOp.documentId?` (`/ai`, `features/ai/protocol/agent-ops.ts`) aims an operation of `edit_document` at another Document of the workspace; `checkAgentOps` checks the block IDs per Document (`AgentOpContext.documents`: the lines of the other Documents the user may edit; a Document it does not know is an `AgentOpProblem` with the new reason `document`), `AgentOpFeedback.documentId` carries the Document back to the model, and `agentOpSummary` names it. Operations for the open Document keep feeding `review.propose`; the others become a stored `ChangeSet` (`/core`: `ChangeSet`, `ChangeSetHunk`, `ChangeSetHunkStatus`, `ChangeSetOp`, `ChangeSetFeed`, `ChangeSetDecisionBody`, `hunkFeedback`, `changeSetDocuments`, `CHANGE_SET_HUNK_STATUSES`). New port `EditorPorts.changeSets` (a `ChangeSetStore`: `list(owner)`, `get`, `create`, `decide`; capability `changeSets` in `PORT_CAPABILITY`, JSON adapter `createJsonAdapter(...).changeSets` on `.change-sets.json`, in-memory store in `adapters/change-sets/memory`). New rows of `API`: `GET /api/editor/change-sets` (`changeSetList`), `POST /api/editor/change-sets/:id/accept` (`changeSetAccept`: each pending hunk named in `{ hunks: ['op3', …] }` is applied through the `DocumentMutator`; `409` becomes the hunk status `stale`, `403`/`404`/`422` `invalid`, with the server's message) and `POST /api/editor/change-sets/:id/reject` (`changeSetReject`). `chatPost` takes the open Document's ID as `documentId` in the body, offers `documentId` in the `edit_document` schema (only for Documents the user may read and edit, and only with a `DocumentMutator` and the `changeSets` port), and streams the stored change set as the SSE event `change-set` (`AiStreamEvent` gains `'change-set'`). `EditorBackend.changeSets` (`list`, `accept`, `reject`; HTTP backend over the routes; capability `changeSets`). `createDocumentChat({ …, changeSets? })` hands the received change set to the panel's model and sends its decisions as feedback with the next message; `AiSidebar` (Vue and React) takes the model as the prop `changeSets`, `useDocumentChat(editor, changeSets?)`.
50
+ - Change set panel (`@skaile/forge-editor/change-sets`, `/change-sets/vue`, `/change-sets/react`): `ChangeSetPanel` renders what the chat proposed for other Documents, grouped by Document, each hunk with the snippet of its block (`agentOpSnippet`'s text, now `blockSnippet` in `/core`, with `BlockExcerpt` and `blockExcerptText`), accept or reject per hunk or per Document, the server's message for a `stale` or `invalid` hunk. `createChangeSetModel({ backend })` (`ChangeSetModel`, `ChangeSetState`, `ChangeSetGroup`, `ChangeSetEntry`, `ChangeSetFailure`), `groupChangeSets`, `hunkLabel`, `HUNK_STATUS_KEYS` and `useChangeSetModel({ backend })` are the framework-free model and the hooks. The reference app mounts the panel in the sidebar (`app/composables/useChangeSets.ts`) and passes the model to the chat.
51
+ - `createDocumentMutator({ ports, collab?, reindex?, blockTypes?, schema? })` (`@skaile/forge-editor/server`; `DocumentMutator`, `MutationContext`): `apply(documentId, ops, { user })` checks the operations with `checkAgentOps`, applies `update`, `add`, `delete` and `convert` to a Document nobody has open (through `storeContent`) or to an open one (inside its Y.Doc through the collaboration server, so connected clients see an ordinary edit), and re-projects the Block index. It refuses with `403` (read-only or no access), `404`, `409` (a Block is gone) and `422` (invalid operation; `data` lists the problems). `EditorServer.mutator` is the instance of an installed server.
52
+ - `createMarkdownBlocks({ schema?, blockTypes? })` (`@skaile/forge-editor/server`): the editor-free Markdown to Block parser, the counterpart of `createBlockMarkdown`; it runs the `parseBlocks` and `normalize` stages (reference chips) without an `Editor`.
53
+ - Tool registry of the document chat (`@skaile/forge-editor/server`; code in `server/tools.ts`, `server/workspace-tools.ts`): `ToolProvider { name, tool, handle(ctx, input) }` (a read-only tool: its AI SDK definition and the server-side handler), `ToolContext` (`ports`, `user`, `signal`, `liveContent`), `toolRegistry(providers)`, the option `tools` of `installEditorServer` / `provideEditorServer` (the providers; `installEditorServer` builds the registry once and refuses a duplicate name or `edit_document`) and `AiHandlerContext.tools` (the built `ToolRegistry`). `chatPost` offers `edit_document` plus the registered tools, runs the calls of a registered tool itself (at most 5 turns, 8 calls per turn), feeds the results back as `tool-result` before the next turn and streams each call as a `tool` event `{ name, input, output }` (`AiStreamEvent` gains `'tool'`). `edit_document` stays the chat's own tool: it cannot be registered, and a retry still forces it. The system prompt lists the registered tools. `DocumentChatMessage` of an assistant turn gains `tools?: ChatToolCall[]` (`CHAT_LIMITS.tools`, `CHAT_LIMITS.toolOutput`), which `documentChatMessages(…, tools)` replays with their results; the chat model keeps the `tool` events on the turn and sends them back.
54
+ - `createWorkspaceTools(options?)` (`@skaile/forge-editor/server`): the first two providers. `find_blocks(query, limit?)` searches the Block index over the Documents the user may read; `read_block(documentId, blockId)` returns one Block as Markdown (live content of an open Document first), and refuses an unreadable Document and an unknown Block with the same sentence. `mayReadDocument(ports, user, documentId)` is `readableDocumentsOf` for one Document. The reference host registers them in `server/plugins/editor-adapter.ts`.
55
+ - `createAiReviewBar({ notify, t, editor })` (`/ai`): the framework-free model of the in-document AI review bar (`AiReviewBarModel`, `AiReviewBarState`, `AiReviewAnchor`, `AiReviewBarOptions`). It holds the pending Review hunk count and the clicked hunk, navigates (`go`), decides the active hunk (`decide`) or all (`acceptAll`, `rejectAll`), raises the notice about hunks dropped because their original text was edited, and gives the popover its `anchor`. The Vue and React review bars only render it; their behaviour is unchanged.
56
+ - `AiFlowContext` (`/integrations/composite-ai`): the one context object of a composite AI flow, `{ ai, modelRef, notify, t }` (the AI client, the Model reference of a role, the notifier, the translator).
57
+ - The Typed block as a concept of `/core` (code in `core/typed-block.ts`): `isTypedBlock(node)`, `typedBlockAt(doc, pos)` (the Typed block that starts at `pos`; `null` for any other node or an invalid position), `metaOf(block)` / `withMeta(block, key, value)` / `withoutMeta(block, key)` (read `attrs.meta`, and copies of it that never change the block) and `findBlockType(blockTypes, node)`. `TYPED_BLOCK`, `TYPED_BLOCK_TITLE`, `TYPED_BLOCK_DESCRIPTION`, `TYPED_BLOCK_TAGS` and `BLOCK_TYPE_ATTR` are exported from `/core`; `Derivation`, `DerivationMethod`, `DerivationSource`, `DERIVATION_KEY` and `derivationOf` are defined there and stay exported from `/core` (and the types from the package root).
58
+ - `@skaile/forge-editor/adapters/block-index/drizzle`: `createDrizzleBlockIndex({ db, tables: blockIndexTables() })`, `blockIndexTables()` and `bootstrapBlockIndexTables(db)`, the Block index (`ports.index`) on Postgres or PGlite through drizzle (`drizzle-orm/pg-core`). The whole `BlockRow` is stored as JSON next to generated `tsvector` columns over the folded title and text words (the search folds with the core ranking's own `searchWords`, so it needs neither the `unaccent` extension nor a database locale); `search` runs in SQL with the scope as a filter, title hits first, the last word as a prefix and the limits of `searchLimit`, and gives the memory adapter's answers. The Nuxt reference host picks it with `NUXT_BLOCK_INDEX=pglite` (default `memory`).
59
+ - Block route `GET /api/editor/blocks/:documentId/:blockId` answers `{ title, type, hash, sourceHash, gone }` (`BlockSummary`, `/core`). `sourceHash` is the hash of the Block's body (for a Typed block without its title line); a Derived block whose original is in another Document compares it with the `inputHash` its Derivation recorded to show its stale badge. A custom `EditorBackend.index.blockGet` must return it.
60
+ - Workspace tag list (`GET /api/editor/tags`): with the `index` port the names come from the Block index, so no stored Document is read; Documents open in the collaboration server are still read from their live Y.Doc (a tag removed in an open Document stays listed until the store re-projects it).
61
+ - Documented exception in [Dependency rules](https://skaile-ai.github.io/skaile-editor/reference/dependency-rules): `server` imports the framework-free composite modules (`block-types`, `convert`, `fences`, `reference-text`, `legacy`) it needs to convert Markdown and project Blocks without an editor; no other feature implementation and never a UI framework.
62
+ - `typeIdOf(block)` (`/core`): the Block type id of a Typed block, read from a node or its JSON (`''` when it has none). `isTypedBlock` also accepts the JSON of a block or a `ConvertTarget` and narrows it; the `ConvertTarget` of a Typed block is typed `{ type: typeof TYPED_BLOCK, blockType }` (still `'typedBlock'` at runtime).
63
+ - `EditorServer` handle (`@skaile/forge-editor/server/nitro`): `installEditorServer` returns it with `forgetDocument(id)`, `liveContent(id)`, `enforceRateLimit(request)` and `resolveModel(ref, user)` (the four operations host code needs), next to `ports`, `collab`, `models` and `close()`. Nuxt hosts: `provideEditorServer({ ports, schema?, blockTypes? })` in a Nitro plugin hands the ports to the module, and `useEditorServer()` returns the installed handle in host routes. `installProvidedEditorServer(nitroApp, config)` is what the Nuxt module's server plugin calls.
64
+ - `loadCurrentContent(documents, id)`, `listCurrentContents(documents)` and `currentContent(json)` (`@skaile/forge-editor/server`; code in `server/stored-content.ts`): the one load operation of stored document content, returning it in the current shape with the stored-content migration (old persisted names including the earliest `section` family, the flat `meta.transcript`) applied once and completely. The collaboration load, the tag index and the document GET (`GET /api/editor/documents/:id`) use it; a host reads stored content through it too.
65
+ - `DraftField.typeOver(text, stored)` (`/core`): the user typed `text` while the stored value is `stored`; typing back the stored value resets the draft instead of scheduling a commit. The Vue and React image studio dialogs use it instead of choosing between `reset` and `input` themselves.
66
+ - `EditorBackend.collaboration.patchProperty(id, patch)` and the `PropertyPatch` type (`/core`): store one Block property of a Block through the collaboration server (see Fixed). `metaWithProperty` moved to `core/properties.ts` so the server patch uses it; it is still exported from `/composites`.
67
+ - The `pruefung` feature (`/pruefung`, `/pruefung/schema`; `pruefungFeature({ model? })`, opt-in: `interaction: [..., 'pruefung']`, option `pruefung` of `composeEditor`): a user records a Prüfung (`redaktionell`, `fachlich`, …) of a Typed block, pinned to the block's content hash (`pruefungHash`: SHA-256 of the title line and the body Markdown, `pruefungMarkdown`; meta, tags, description and baskets do not count). A Block type opts in with the block capability `pruefung` (`{ kinds, chain?, lock? }`); the block action „Prüfung eintragen“ (ability `ABILITY.pruefungRecord` = `pruefung.record`, granted per mount through `abilities`) records directly for one kind and opens a kind menu for several (`pruefung-record`, `pruefung-record-menu`). `pruefungModelOf(editor)` is the model (`createPruefungModel`, `createRestPruefungModel` over `EditorBackend.pruefung`): `state`, `refresh`, `record(blockId, kind, note?)`, `mayRecord`, the derived Freigabestatus `statusOf(node)` (`geprueft`, `veraltet`, `offen` per kind) and `freigabeOf()` (`freigegeben`/`offen`, open count). A refused record shows the server's message as a warning notice. The `lock` option and the chip and inspector UI follow separately.
68
+ - Prüfung lock (`pruefung` feature): a Block type with `lock: <kind>` in its `pruefung` config refuses edits to a block (a `TransactionGuard`, notice „Block ist freigegeben und gesperrt“) while that kind is `geprueft` at the block's current hash; only blocks a transaction touches are hashed, remote y-sync transactions pass. The block action „Sperre aufheben“ (ability `pruefung.record`, visible on locked blocks) records a Prüfung of kind `entsperrt` (`UNLOCK_KIND`) at that hash, which lifts the lock until the block changes. A host that limits kinds through `AccessControl.pruefungKinds` must list `entsperrt` for users who may unlock. `isBlockLocked(editor, node)` is exported from `/pruefung`.
69
+ - Prüfung chip and Prüfstand (`pruefung` feature; `/pruefung/vue`, `/pruefung/react` export `pruefungFeature` and `PruefungBadge`, `pruefungFeatureCore<C>({ section }, options)` builds it for another layer): a block whose Block type lists `pruefung` shows the chip `Geprüft` (every kind `geprueft`) or `Prüfung veraltet` (a kind `veraltet`) after its title, nothing while a kind is still `offen`; the inspector's „Dokument“ section shows the Freigabestatus `Freigegeben` / `Offen (n Blöcke)`; the Typed block inspector and the details card get the section „Prüfstand“ (kinds with their status, the records with kind, user, date and note, and „Geprüften Stand anzeigen“, which shows the checked Markdown and the current one as two columns). The chips re-read on document changes and on changes of the Prüfung model. In the catalog the `pruefung` row now has a `ui` part (`UiBindings` of a custom layer needs a `pruefung` binding).
70
+ - New extension points of `EditorFeature` for the composites chrome and inspector, collected into `EditorEntry` like the other contributions: `rowBadges(ctx): RowBadge[]` (a chip after a Typed block's title: `{ id, of(editor, row) => BadgeChip | null, subscribe? }`), `documentBadges(ctx): DocumentBadge[]` (a chip in the inspector's document section) and `inspectorSections(ctx): InspectorSection<C>[]` (`{ id, title, component, appliesTo? }`, a section of the Typed block inspector and the details card; the component receives `{ editor, node }`). `BadgeChip`, `BadgeRow`, `RowBadge`, `DocumentBadge`, `InspectorSection` and `chromeContributionsOf(preset, ctx)` are exported from `/core`. The composites feature draws them (`CompositeChrome`, `CompositeInspector`, `CompositeDetails`, Vue and React) and knows nothing about the features that add them.
71
+ - Documentation: the guide [Block capabilities, abilities and actions](https://skaile-ai.github.io/skaile-editor/guides/block-capabilities#abilities) explains what an ability is, how it resolves at a position, what it gates (commands, shortcuts and input rules, block actions, conversion targets, suggestions, AI) and that it refuses no edit; the glossary gains **Ability**, and Block actions name both gates. An ability is no longer called a permission in the docs.
72
+ - `RowReorder` (`/tree`, with the types `TreeItem`, `DragPayload`, `DropVerdict` it uses) and the `reorder` prop of `DocumentTree` (`/tree/vue`, `/tree/react`): a host's say on dragging the tree's own rows among each other. `verdict(source, target)` is judged before the library's drop rules (`null` leaves it to them), `drop(source, target)` performs an allowed drop (the tree emits no `moveBlock`), and the optional `step(item, direction)` moves a row one place among its siblings.
73
+ - Ctrl+↑ / Ctrl+↓ on a focused row of `DocumentTree` calls `reorder.step`; Ctrl+arrow does nothing else in the tree.
74
+ - Slots `block-badges` and `block-actions` of the Vue `DocumentTree` (React: `blockBadges`, `blockActions`): host content on Typed block rows, always visible after the label and in the hover controls. Rows carry `data-tree-key` (Vue).
75
+ - `range?: { from, to }` on `collectHeadings` and as `options.range` of `sanitizeOutline` (`/integrations/composite-ai`, type `OutlineRange`): „Gliederung bereinigen (KI)“ for the headings that start inside the range only.
76
+ - `/core` exports `API` and `routeUrl` (the route table, so a script calls the editor API without a copy of the paths) with the types `Route`, `RouteResponse`, `RouteUrlArgs`, `DocumentSummary` and `TreeFolder`, `splitFrontmatter`, `joinFrontmatter`, `SplitMarkdown`, `parseFrontmatter` and `normalizeTagName`, `MAX_TAG_NAME_LENGTH`, so add-ons read and write Markdown frontmatter and tag names without a UI entry. `parseFrontmatter` moved from the `media` importers into `core/frontmatter` (`/media` still exports it). The add-on `@skaile/forge-editor-obsidian` imports and exports Obsidian vaults with them.
77
+ - Block capability `titleHidden` (composites; no config; `read` returns whether `meta.titleHidden` is set): a Block type that lists it gets the eye button „Titel ausblenden“ / „Titel einblenden“ in the chrome of its Typed blocks (Vue and React `CompositeChrome`). `defaultBlockTypes` lists it on every built-in type, so nothing changes for them. Shipped in 4.3.2.
78
+
79
+ ### Fixed
80
+
81
+ - Document tree: converting headings into Typed blocks („Überschriften in Blöcke“) no longer drops outline entries. The outline showed only Typed blocks in Structure mode and only headings in Flat mode, so the headings left inside a block's body (sub-headings with „Nur oberste Ebene“) vanished from the tree. The tree now reads `documentOutline` (`/composites`), headings and Typed blocks as one tree in both modes, and the Block type filter can hide headings („Überschriften“, `HEADING_KIND` from `/tree`). The basket filter hides a heading unless a shown Typed block is below it.
82
+ - Vue and React image studio dialog: a pending description edit is committed to the image it was typed for when the host swaps `store`; before, it went to the new image. The draft then shows the new store's description. The Vue `useDraftField` takes an optional `target` getter and `commit(text, target)` receives the target the text was typed against; the React `useDraftField` resets the draft to `stored` when its `target` changes, also while the input has the focus. The React dialog tells stores apart by their `update` function, so keep it stable per image.
83
+ - JSON adapter (`createJsonAdapter`): the content version is a SHA-256 of the document file instead of its modification time and size. Two writes of the same size within one filesystem timestamp tick got the same version, so a host edit could leave a stale collaboration state in place.
84
+ - Block properties under collaboration: two users who set different properties of one Block at the same time no longer lose one of them. `meta` is one node attribute that Yjs syncs as a whole value, so each client's whole-`meta` write replaced the other's key. In a collaboration session whose backend offers `collaboration.patchProperty` (the HTTP backend), `setBlockProperty` now sends the one key to `POST /api/editor/documents/:id/property` (served with the `collabState` port), where the collaboration server writes it into the open Y.Doc; the sync delivers it, nothing is written locally. If the server refuses (document not open there, read-only, unknown Block) the value is written locally and a notice says it was not saved in sync. Without a session, or for a Block without an ID, nothing changes.
85
+ - React image studio gallery: the search field shows its placeholder ("Galerie durchsuchen"), like the Vue one; before it only had an `aria-label`.
86
+ - Speech engines list the formats they make (`SpeechEngineInfo.formats`, absent: `mp3` and `wav`; `createMemorySpeech` lists `wav`). The add-on's "read aloud" (`audio-tts`) asks an engine for `mp3` unless it lists formats without it, so it works with the memory engine instead of failing with "Die Memory-Engine erzeugt nur WAV".
87
+ - Docs and examples: the Tailwind `@source` for React and Vue hosts covers the whole library (`dist` of the installed package, `src` in this repository), not only `react` (or `src/react`). The Features' own components (`features/*/react`, `features/*/components`, e.g. the image studio dialog) sit outside that directory, so their classes were missing and the dialog rendered as one tall column. `examples/react-simple` scans `src`; the Vue guides name `dist` instead of the unpublished `src`.
88
+ - Ctrl+↑ / Ctrl+↓ in `DocumentTree` (Vue and React): after the host's `reorder.step` moved a row, the keyboard focus stayed at the old place (on the row that took it), so the next press moved that neighbour back. The focus now follows the moved row once the tree shows the new order. React Typed block rows carry `data-tree-key` too.
89
+
90
+ ### Changed
91
+
92
+ - Internal: `TreeEditor.outline` takes no `structure` argument and `Outline` is `readonly DocumentOutlineEntry[]` instead of `{ structure, nodes }`; `readOutline(editor, t)` drops its `structure` parameter. A host that builds its own `TreeEditor` returns `documentOutline(doc, untitled, …)`. `filterKinds` no longer takes `structure`.
93
+ - A `collection` made in the editor can be filled: its node view (Vue and React `CollectionView`) has a „Abfrage“ toggle that opens the query builder of the data views and writes the collection's `query`, so „Aus Abfrage füllen“ is offered. Both bindings run on `createCollectionViewModel`, `setCollectionQuery` and `createEdgesFormModel` (`/composites`), the framework-free models of the node view and of the „Kanten“ section.
94
+ - The „Kanten“ of a Typed block store exactly `{ to, kind }` in `meta.edges`: adding or removing an Edge no longer writes the display label of the other entries into the document.
95
+ - One lookup of the Property definitions of a query's Block types (`queryPropertiesOf` in `block-types.ts`, first definition of a key wins) behind the data views, the query builder, the server's `queryDefinitionsOf` and the columns of the table layout, so a column, its sort and a filter of one key use one definition. The Typed blocks table sorts texts in the editor's locale (`TableSource.locale`) instead of always German.
96
+ - The Typed blocks table (`features/composites/table-model.ts`, Vue and React `CompositeTable`) runs on the Property kind registry and the query evaluator, with one implementation of filtering and sorting: cell text, sort keys, the long-text hint and the column alignment come from `PROPERTY_KINDS[type]` (`fieldText`, `fieldSort`, `isLongText`; `fieldDisplay` takes an optional `QueryEnv` and words every type but `reference`, `reference-list`, `bibliography` and `derivation` by the registry, so a `checkbox`, `url` or `status` cell reads like it does in a query), sorting orders with `collatorOf` (accent- and case-insensitive, numeric) instead of a fixed German collator, and the filters of the table (Block types, tags, select options, search text) are one `DataQuery` that `evaluateQuery` answers over the table's rows as `BlockRow`s (`rowsAsBlockRows`, `tableQueryOf` in `table-model`; the rows keep document order). `collator` is no longer exported from `table-model`.
97
+ - **`derivedChromeOf` returns `{ state }`** (a `DerivedStateId`) instead of `{ stale, sourceMissing }`, and it now also tells `edited` (the body hash is kept per node). `OutlineNode.sourceMissing` and `TreeItem.sourceMissing` are replaced by `derived` (`DerivedStateId | null` and `DerivedStateId | undefined`); the tree row marker `data-source-missing` is now `data-derived="<state>"`. The composites chrome no longer draws its own „Quelle geändert“ / „Quelle fehlt“ chips on a Derived block: the row badge shows „veraltet“ / „Quelle fehlt“ instead (the details card keeps its chips).
98
+ - The Vue AI sidebar (`AiSidebar`) renders on `@skaile/forge-chat` (`ChatPanel`, new dependency): the conversation is mapped to chat messages by `sidebarMessages`, and the answer, the proposed operations and the generation card are part renderers. Props (`editor`, `v-model:open`) and behaviour are unchanged; the React sidebar is untouched. `styles/ai.css` imports `@skaile/forge-chat/styles/chat.css`; plain Vue hosts add `@source` for `@skaile/forge-chat/dist` next to the one for the library (the Nuxt module does both).
99
+ - Internal: the commit delays of the Draft fields are named constants (`features/composites/commit-delays.ts`, `DESCRIPTION_COMMIT_DELAY_MS` in `image-studio/state`) read by the Vue and React twins; the values are unchanged.
100
+ - `GET /api/editor/documents/:id` answers a stored document written by an earlier release with its content migrated (old persisted names, the earliest `section` family, a flat `meta.transcript`); before, the content of the port came back as stored when the document was not open in the collaboration server.
101
+ - Internal: the feature catalog is split by entry with one key set. `presets/catalog.ts` holds the data rows (dimension, level lists, `ui` parts, canonical order); `presets/compose` adds the builders, `schema/advanced` the schema sources, and each UI layer its bindings, all keyed by those rows. `UiBindings<C>` is derived from the rows with a `ui` part (same keys and signatures as before; now a mapped type instead of an interface), the order of the rich-content server schema is the `SCHEMA_IDS` list of `presets/schema-ids`, a leaf module the server's `schema/advanced` reads so the server program never type-checks the catalog and the feature code its option types reach (the schema snapshot is unchanged), `vue/compose` and `react/compose` share `presets/layer` (`composeEditor`, `advancedEditor` and the AI bindings), and the entry checks take the feature families from `src/features/`. Adding a catalog feature is one catalog row plus its parts in those entries; a missing part fails to compile.
102
+ - `fillComposite(editor, pos, flow)`, `summarizeComposite(editor, pos, flow)` and `generateCompositeBody(editor, pos, flow, signal)` (`/integrations/composite-ai`) take an `AiFlowContext` instead of the separate `ai`, `modelRef`, `notify` and `t` arguments. Fill and summary run as one AI edit session (abort when the editor is destroyed, outcome notices, anchor on the edited range released at the end); what users see is unchanged. `CompositeBodyResult` no longer carries a partial `output` on `aborted`, `rate-limited`, `data-error` and `error` (only `done` has the text); the request streams through the same helper as the other AI flows.
103
+ - `sanitizeOutline(editor, flow)`, `splitCompositeWithAi(editor, pos, mode, flow, { targetChars, defaultBlockType })`, `deriveComposite(editor, pos, kindId, flow)`, `createRendition(editor, pos, flow, options?)`, `regenerateRendition(editor, pos, flow)` and `fetchBibliography(editor, pos, flow, documentId?)` (`/integrations/composite-ai`) take an `AiFlowContext` instead of the separate `ai`, `modelRef`, `notify` and `t` arguments, like fill and summary. All six flows run as AI edit sessions now, as do the AI transforms of the block transfer (`summaryTransform`, `bulletsTransform`); what users see is unchanged. `writeDerivedBody(editor, id, markdown, { derivation?, notify, done })` no longer takes `discard` and `t`, shows no notice for an empty result or a vanished Typed block, and returns `'empty'` / `'gone'` for those instead of `false` (nothing for a written body, previously `true`); the caller removes the empty Typed block (`discardDerived`).
104
+ - `AiReviewChange` (`/ai`): the ranges of a change (`range`, and `at` of an insertion, now a plain position) are positions in the document when `startAiReview` is called, no longer `DocAnchor`s. `startAiReview` keeps the anchors of its hunks itself, so callers capture and release none (`agentOpChange` and the transcript cleanup no longer do); a caller that tracks a range while a request runs resolves its anchor (`resolveRange`) and passes the result.
105
+ - Nuxt hosts provide their ports with `provideEditorServer({ ports, schema?, blockTypes? })` (`@skaile/forge-editor/server/nitro`) instead of `setEditorPorts(ports, { schema, blockTypes })`; host routes call `useEditorServer().forgetDocument(id)` / `.liveContent(id)` / `.enforceRateLimit(event)` / `.resolveModel(ref, user)` instead of `forgetCollabDocument`, `liveContent`, `enforceAiRateLimit` and `resolveModel` from `@skaile/forge-editor/server`. The registration is consumed by the module's install; without provided ports the first request logs `@skaile/forge-editor: provideEditorServer() was not called`.
106
+ - Internal: the Block type switch of the Typed block details popover (`createCompositeDetails` in `features/composites/details-model.ts`: pending Block type, the values it would drop, reset when the row's Block type changes, apply) and the filter and sort state of the Typed blocks table (`createTableControls` and `tableViewOf` in `features/composites/table-model.ts`) are framework-free, store-backed models; the Vue and React `CompositeDetails` and `CompositeTable` only render them. What users see is unchanged, including the warning that lists the values a switch drops. The names of these models use Block type wording (`blockTypes` instead of `kinds` in the filter picks); `pendingKindOf`, `applyKindChange`, `lostFieldsOf`, `activeFilterOf`, `filterRows`, `nextSort`, `activeSortOf`, `toggled` and the other table helpers the view now wraps are no longer exported.
107
+ - A position that is outside the document or does not start a Typed block no longer throws a `RangeError` in the functions that take one: they read it as "nothing there" and return `null`, `false`, an empty list or do nothing, like `typedBlockAt`. Affected, per entry: `/core` `startBlockDrag` (`false`), `derivedOf` (`[]`), `derivationOriginOf` and `derivationState` (`null`); `/composites` `compositeAiBrief`, `propertyHostOf` and `compositeOfRow` (`null`); `/integrations/composite-ai` `canDeriveAfter` (`false`) and `fillComposite`, `generateCompositeBody`, `summarizeComposite`, `deriveComposite`, `createRendition`, `regenerateRendition`, `splitCompositeWithAi` and `fetchBibliography` (no edit).
108
+ - Internal: the rows of the feature catalog name their schema (`schema: <id>`), and `presets/schema-ids` stays the one place of the schema order; a row without its id in `SCHEMA_IDS`, or an id without a row, fails to compile.
109
+
110
+ ### Changed (breaking)
111
+
112
+ Shipped in 4.3.2 (release/4.3), ported here. Only Block types a host defines are affected; the built-in ones list `titleHidden`.
113
+
114
+ - The eye button of the chrome shows only for a Block type that lists `titleHidden`. A Block type from a host that does not list it (for a host that shows or edits the title elsewhere) gets no button; a stored `meta.titleHidden` stays in the document. Host Block types that relied on the button must add `{ id: 'titleHidden' }` to their `capabilities`.
115
+ - Renamed: the package is `@skaile/forge-editor` (was `@ecsplico/editor`), from the repository `skaile-ai/forge-editor` (was `skaile-ai/skaile-editor`). Nothing else in the API changes with the name: replace the package name in `package.json` and in every import specifier (`@ecsplico/editor/core` becomes `@skaile/forge-editor/core`, and so on), and the error prefix `@ecsplico/editor:` of developer errors becomes `@skaile/forge-editor:`. The documentation site moved to https://skaile-ai.github.io/forge-editor/. The add-on packages follow the same rule and are named `@skaile/forge-editor-<name>` (`audio`, `charts`, `graph`, `index-pg`, `kgs`, `obsidian`, `pdf-viewer`, `slides`, `typst`); their peer is `@skaile/forge-editor ^5.0.0`. The old name `@ecsplico/editor` is deprecated on npm and receives no further releases.
116
+
117
+ ### Removed
118
+
119
+ - `compositeJSON`, `REFERENCE_NODE`, `BIB_KEY` and `derivedStateLabel` are no longer exported from `/composites` and `/composites/schema` (and `nodes.ts`, `reference.ts`, `meta-keys.ts`, `bibliography.ts` and `badges.ts` no longer define them): each is one definition in `/core`. Use `newTypedBlockJSON(blockType, body?, meta?, title?)` for `compositeJSON(kind, body?, meta?)` (same result), and import `REFERENCE_NODE`, `BIB_KEY` and `derivedStateLabel` from `@skaile/forge-editor/core`.
120
+ - `sameAddress` is no longer exported from `/composites` (and `embed-model.ts` no longer defines it): it is the one function of `/core` (`core/block-index.ts`). Import it from `@skaile/forge-editor/core`.
121
+
122
+ **Breaking.** The Typed block module (`core/typed-block.ts`) is the only place that defines the persisted Typed block names and the Typed block helpers; the second definitions and re-exports are gone.
123
+
124
+ | Removed | Use | Entry |
125
+ |---|---|---|
126
+ | `TYPED_BLOCK`, `TYPED_BLOCK_TITLE`, `TYPED_BLOCK_DESCRIPTION`, `TYPED_BLOCK_TAGS`, `BLOCK_TYPE_ATTR` | the same names | `/core/schema` no longer exports them; import them from `/core` |
127
+ | `blockTypeIdOf(node)` (`string \| null`) | `typeIdOf(block)` (`''` where it returned `null`; also reads the JSON of a block) | `/core` |
128
+ | `splitCompositeFences(markdown)`, `CompositeFence`, `FenceSegment` | none: the fence grammar is internal; `blocksFromMarkdown(parse, markdown, blockTypes)` is the public way from Markdown with fences to blocks | `/composites`, `/composites/schema` |
129
+ | `migrateLegacyContent(json)` | `currentContent(json)` of `@skaile/forge-editor/server` (the same migration, applied through the one stored-content module); the client applies it itself through `defineEditor`'s `migrateContent` hook | `/composites`, `/composites/schema` |
130
+ | `compositeFromMarkdown(parse, fence, blockTypes)` | `blocksFromMarkdown(parse, markdown, blockTypes)` (it builds the Typed block of every fence of a registered Block type) | `/composites`, `/composites/schema` |
131
+
132
+ - The process-wide server registry of `@skaile/forge-editor/server` (`server/host.ts`) is gone: `setEditorPorts`, `useEditorPorts`, `useCollabServer`, `useAiModels`, `closeEditorServer`, `forgetCollabDocument`, `liveContent`, `resolveModel`, `enforceAiRateLimit` and `listAiModels` are replaced by the `EditorServer` handle (see Added/Changed). `useRateLimiter`, `collabStats` and `collabContentChanged` have no replacement on the handle: read `server.collab?.stats()` and `server.collab?.contentChanged(id)` from the handle's `collab`. The server no longer throws `@skaile/forge-editor: server not installed`; `installEditorServer` is the only place that builds one, and a plain Nitro host keeps the handle it returns.
133
+
134
+ ## 4.2.0 - 2026-10-22
135
+
136
+ ### Added
137
+
138
+ - `collapsedOutline: Store<string[]>` on `TreeViewModel` (`/tree`), and as `collapsedOutline` from `useTreeView()` (`/tree/vue`: a ref; `/tree/react`: the plain value): the keys of the closed outline rows (`outline:<block id>`). A host can set it to start a tree with rows closed.
139
+
140
+ ### Changed
141
+
142
+ - A closed outline row of the document tree stays closed for the session in every tree of the app, also in a tree mounted again (it was the state of one tree and lost when the tree unmounted).
143
+
144
+ ## 4.1.0 - 2026-10-22
145
+
146
+ ### Added
147
+
148
+ - Gallery tab of the Bild-Studio dialog (`/image-studio`, Vue and React): a store with `library?: ImageStudioLibrary` gets the tabs «Dieser Block» and «Galerie». The gallery searches (300 ms after the last keystroke), filters with one select per host facet (`ImageStudioLibraryFacet`; the first option is the default, values must be non-empty), lists `ImageStudioLibraryItem`s and offers «Als Bild verwenden», «Als Referenz», renaming (`rename`, optional) and removing (`remove`, optional; a rejection's message is shown and the tile stays). New types `ImageStudioLibrary`, `ImageStudioLibraryFacet`, `ImageStudioLibraryQuery`, `ImageStudioLibraryItem`. Without `library` the dialog is unchanged.
149
+ - `placeholderUrl?: string` on `ImageStudioStore` and `ImageStudioReactStore`: shown in the preview while no image is selected (instead of the «Noch kein Bild» text).
150
+ - `adoptImage(state, image)` reducer: makes an image the selection, adding it to the references unless the state already holds it as a reference or generation; unchanged when it is already selected.
151
+
152
+ ## 4.0.0 - 2026-10-21
153
+
154
+ ### Added
155
+
156
+ - Block vocabulary: `BlockType`, `BlockTypeAi`, `defaultBlockTypes`, `blockTypeOf`, `acceptsChild` (`/composites`, `/composites/schema`; code in `features/composites/block-types.ts`), `PropertyDefinition` and `derivedChildrenOf` (`/core`), `ModelRole` / `MODEL_ROLES` (stored as `ai.roles`, see Changed, "Persisted names (settings)"), `ModelPresetConfig` (`/config`, `/server`), `AccessControl` and `DocumentContentStore` of the server ports (`/server`). The former names are listed under Removed.
157
+ - `blockTypes` option: `compositeFeature({ blockTypes })`, `compositeSchemaExtensions({ blockTypes })`, `composeEditor({ blockTypes })`, the `blockTypes` prop of `AdvancedEditor` and `ComposedSurface`.
158
+ - `contentTemplate` on a Block type's `ai` brief and as the AI wire field `block.contentTemplate` (client and server of the AI endpoints ship in the same package).
159
+ - Block capabilities (`@ecsplico/editor/core`): `EditorFeature.blockCapabilities` declares `BlockCapability` descriptors (`id`, `appliesTo(node, { blockTypeId })`, optional `storage` description); `defineEditor` merges them and rejects a duplicate id, also against the built-in `container` (nodes declaring `editorBlockContainer`) and `title` (first child is chrome). `capabilitiesAt(editor, pos)` / `capabilitiesOf(editor, node)` answer which capabilities a block has, memoised per node type and Block type id (`attrs.blockType`), so predicates read only the node type and `blockTypeId`. A capability describes and never installs schema; abilities stay the permission mechanism. `BlockAction.requires` lists capability ids the block must have; `blockActionsFor` hides the action otherwise and `blockActionsOf` throws when an action requires an id no Feature declares. `EditorPreset.capabilities` is the merged `CapabilityIndex`.
160
+ - Block types as data: `BlockType` is `id`, presentation (`label`, `icon`, `titlePlaceholder`, `descriptionPlaceholder`, `chrome`) and `capabilities: { id, config? }[]` (`BlockTypeData` / `BlockTypeCapability` in `@ecsplico/editor/core`). The former switches move into capability entries: `fields` → `properties` (`{ definitions }`), `source` → `source` (`{ media }`), `accepts` → `container` (`{ accepts }`), `ai` → `ai-brief`, plus the new `basket` and `bibliography` entries. Accessors: `propertiesOf`, `sourceMediaOf`, `aiBriefOf`, `acceptsOf`, `blockTypeConfigOf` (`/composites`, `/composites/schema`).
161
+ - The composites feature declares the `properties`, `source`, `bibliography`, `basket`, `ai-brief` and `references` capabilities through `blockCapabilities`; core only has `container` and `title`. `BlockCapability` gains `configSchema` (zod, validates the config a Block type gives) and `read(node, ctx)` (the contents or value in a block: the source child, the basket id, the bibliography record); `appliesTo` stays type-level and memoised per node type and Block type id. `CapabilityContext` gains `blockTypeOf(node)` and `configOf(node, capability)`. New exports (`@ecsplico/editor/core`): `capabilityConfigOf`, `capabilityDataOf`, `blockTypeIdOf`, `listsCapability`, `createCapabilityRegistry`, `validateBlockTypes`, `EditorFeature.blockTypes`, `BlockAction.blockTypes` (type-specific actions only). An editor checks every Block type when it is created: an unknown capability id or an invalid config throws.
162
+ - Derive methods (`@ecsplico/editor/core`): `EditorFeature.deriveMethods` contributes `DeriveMethod` entries (`id`, `label`, `icon`, `ability?`, `order?`, `placement?`, `requires` capability ids on the original, `available(ctx)` for backend flags and per-block conditions, `run` or `menu`). `defineEditor` merges them into `preset.deriveMethods` (`DeriveRegistry`) and rejects a duplicate id, a method with neither or both of `run` and `menu`, and a `requires` entry no feature declares; `blockActionsOf` turns every method into a block action (`deriveActionsOf`), `deriveMethodsAt(editor, ctx, pos)` lists the methods that can run on a block. New `derived` capability (declared by the composites feature; a block has it when `meta.derivation` is present, so `BlockCapability.perNode` lets a capability decide per node instead of per node type) and the memoised reverse index `derivationIndexOf(doc)` / `derivedOf(doc, pos)` / `derivationOriginOf(doc, pos, documentId?)`, computed from block IDs per document node; the original stores no back-pointer.
163
+ - Block types from a JSON file (`@ecsplico/editor/composites`, `/composites/schema`): `parseBlockTypes(input, { registry? })` reads a `BlockType[]` (the file's text or its parsed value) and checks every entry against the capability registry (unknown capability, capability listed twice, invalid `config` per the capability's `configSchema`, duplicate id); it throws one `BlockTypeJsonError` that names the Block type, the capability and the path for every problem (`issues` carries them as data). `mergeBlockTypes(base, extra)` layers the file over `defaultBlockTypes(t)`; the result goes to the existing `blockTypes` option. `examples/vue-two-pane` defines the Block type „Idee“ only in `shared/block-types.json`.
164
+ - Block types on the server: `installEditorServer({ blockTypes })` (`EditorServerOptions.blockTypes`), `AiHandlerContext.blockTypes` and `setEditorPorts(ports, { blockTypes })` (Nuxt) give the server the host's Block types. `POST /api/ai/chat` then describes them to the model and ignores the `blockTypes` of the request; without them it behaves as before. `aiBlockTypesOf(blockTypes)` (`/composites`, `/composites/schema`) builds the chat's Block type list for the editor's `aiContext` and the server alike.
165
+ - One Property definition for every Block (`PropertyDefinition`, `PROPERTY_TYPES` in `@ecsplico/editor/core`; `BlockType`'s `properties` config, the inspector, `AiContextBlockType.fields` and the server's chat schema use it). The `properties` capability applies to any node with a `meta` attribute whose Block type lists it. New helpers `carriesProperties(node)`, `blockPropertiesAt(editor, $pos, blockTypes)`, `propertyHostOf(doc, target)`, `blockPropertiesOf`, `setBlockProperty(editor, target, key, value)` and `metaWithProperty` (`/composites`); `CompositeInspectorState` gains `properties` (the Block properties at the caret) and the Vue `useCompositeInspector` a `properties` ref.
166
+ - The Block inspector shows a Block properties section for any block that has the `properties` capability (heading „Blockeigenschaften“ / "Block properties"), driven by the definitions of its Block type; `CompositeInspector` and `CompositeFieldEditor` write through `setBlockProperty`. Storage, Markdown fences, copy/paste and the Yjs state are unchanged.
167
+ - The Block inspector shows the Derivation of every Derived block, whatever its Block type, with the source-missing state („Quelle fehlt“ / "Source missing"); a Block type that also has a `derivation` Property definition shows it once (`CompositeInspectorState.derivation`, `InspectorDerivation`).
168
+ - The `container` config gains `root: true`: the document tree takes the Block type that sets it as the type of its document rows (`isRootBlockType`, `/composites`); the built-in Document type sets it, and no code looks the type up by its id any more.
169
+ - `capabilityIssues(registry, type)` (`/core`) is the one validator of a Block type's capabilities: `validateBlockTypes` throws on its issues and `parseBlockTypes` collects them. The wording of the unknown, duplicate and invalid-config messages changed.
170
+ - Documentation: the guides [Block capabilities and actions](https://skaile-ai.github.io/skaile-editor/guides/block-capabilities), [Block types in code and JSON](https://skaile-ai.github.io/skaile-editor/guides/block-types), [Derive methods and the Derivation index](https://skaile-ai.github.io/skaile-editor/guides/derive-methods) and [Block properties](https://skaile-ai.github.io/skaile-editor/guides/block-properties), and the reference pages Block capability contract, Block type contract and Derive method contract. Their code samples come from `docs/snippets`, which `bun run check:docs-snippets` keeps in sync.
171
+ - `BlockAction.target?: 'block' | 'typedBlock'` (`/core`, default `'block'`): on the toolbar surface an action with `target: 'typedBlock'` is checked against and runs with the Typed block around the selected block (the block itself when it is one), so its split, merge, export, bibliography and focus actions stay on the toolbar while the caret is in a paragraph inside the Typed block; with no Typed block around, the action is absent. `blockActionsFor` evaluates `ability`, `requires`, `blockTypes` and `isVisible` against that Typed block and passes its `node` and `pos` in the context; the hover bar ignores the field, and the bar still docks at the selected block. `typedBlockAround(editor, target)` (`/block-ui`) finds the Typed block. The composites feature's eight Typed-block actions declare `target: 'typedBlock'`.
172
+
173
+ ### Fixed
174
+
175
+ - The workspace tag list (`GET /api/editor/tags`) again offers the tags of stored documents that still use the old persisted names; it reads them through the old-name migration.
176
+
177
+ ### Changed
178
+
179
+ - Inspector, details popover, table, tree, outline and the AI brief read capabilities instead of Block type fields. The Basket menu and stripe need the `basket` capability, the BibTeX export action the `bibliography` capability, the Block properties the `properties` capability; a host Block type that relied on the former defaults must list them (migration guide, "Block types as data").
180
+ - Block actions decide by `requires` (BibTeX export, source replacement, AI fill, readable rendition, literature lookup) instead of node-name and Block-type-name checks.
181
+ - The Focus block action (`composite-focus`) is gated by `requires: ['container']` instead of a node-name check; it still appears only on Typed blocks.
182
+ - The built-in Folder and Document Block types declare `accepts: 'all'` themselves (in their `container` config); the id-keyed default is gone. A Block type without `accepts`, and a type id a list does not define, accepts no nested Typed blocks (`acceptsChild`); a host list that defines its own `folder` or `document` type must set `accepts` on it.
183
+ - Derivation lives in core: `Derivation`, `derivationOf`, `derivedChildrenOf`, `derivationState` and `DERIVATION_KEY` moved from `features/composites/derivation.ts` to `core/derivation.ts` (import them from `@ecsplico/editor/core`; the Source-media helpers `sourceOf`, `bodyMarkdown` and `SourceBlock` stay in `features/composites/source.ts`). **`derivationState` signature changed**: it takes `(doc, derivedPos, bodyHash, documentId?)` and finds the original itself (was `(composite, derived, bodyHash, kinds, documentId?)`), and its `source` field is `'found' | 'missing' | 'foreign'` (was `foreign: boolean`). A Derived block whose original was deleted or is gone from the document stays and shows „Quelle fehlt“ / „Source missing“ in the chrome row, the details card, the Block inspector and the Block outline (`OutlineNode.sourceMissing`, `TreeItem.sourceMissing`).
184
+ - The block actions `composite-fill`, `composite-summarize`, `composite-derive`, `bibliography-fetch`, `rendition-create` and `rendition-regenerate` are generated from derive methods; ids, labels, order and abilities are unchanged. `rendition-regenerate` now requires the `derived` capability instead of `container` and `title`.
185
+ - The Document Block type is plain configuration; no code tests the type id `document` any more. New capabilities of the composites feature: `export` (the block action „Exportieren“, `document-export`, is `requires: ['export']` instead of `blockTypes: ['document']`; the built-in Document type lists it, a host type may too) and `import` (config `{ media?: SourceMedia[] }`: the imported-file wrapping of `composite-media` and "Datei importieren" use the type whose `import` takes the file's media, by default `recording` for audio/video, `figure` for images and `document` as the catch-all; the tree's "Datei importieren" entry is offered below Typed blocks whose type accepts such a type). New helpers `importTypeOf`, `acceptsImport` (`/composites`, `/composites/schema`). A host Block type list that wrapped files by the ids `document`/`recording`/`figure` must list `import` on them. The server's legacy migration of the flat `meta.transcript` keys on that property (`hasFlatTranscript`), not on the Block type; stored documents open as before.
186
+ - Block UI addresses the outer block: with the caret or pointer inside a list item or a blockquote paragraph, the hover bar, the toolbar block actions (`selectedBlockOf`) and the drag handle act on the whole list or quote, because list items are not Blocks of their own. The rule is the outermost block below the nearest block container (`doc` or a Container block such as a Typed block); new framework-free resolvers `outerBlocksAt($pos)`, `outerBlockAt($pos)` and the drag-handle rule `outerBlockRule` (`@ecsplico/editor/block-ui`). Nested paragraphs keep their block IDs. `handleLeftOf` no longer takes a node; `gutterShiftOf` is removed.
187
+ - UI labels in the agreed vocabulary. English: „Building block“ → „Typed block“, „Kind“ → „Block type“ (inspector, table, filter, icon setting, default type), the rendition type → „Readable rendition“, „Darstellung“ → „Theme“ with „Default appearance“, the inspector's document section → „Document facts“, the structure setting → „Structure mode“ / „Flat mode“, „Baustein“ in reference chips → „block“. German: Baustein → Block (palette group „Typisierte Blöcke“), Bausteinart / Art → Blocktyp; Korb and Lesefassung stay. Message keys are unchanged.
188
+ - The library, the reference app, the examples and the docs use only the new names. The tree command `createBausteinFolder` is now `createFolderBlock` (`TreeCommand`, `@ecsplico/editor/tree`); a host executor that switches on the command type must use the new string. German demo and error strings that said Baustein now say Block or Dokument (`Keine gültige Dokumentdatei`).
189
+ - **Persisted names (documents).** The node `composite` is stored as `typedBlock`, its chrome nodes `compositeTitle`/`compositeDescription`/`compositeTags` as `typedBlockTitle`/`typedBlockDescription`/`typedBlockTags`, and the attribute `kind` of a Typed block and of `opaqueFence` as `blockType` (block IDs, `meta` and the `::: <Block type id>` Markdown fences are unchanged). HTML: `section[data-type="typedBlock"][data-block-type]`; the old `data-type="composite"` / `data-kind` markup and the legacy `section` markup still parse. `BlockTransfer.kind` is `BlockTransfer.blockType` (an old drag payload is read). The editor's node storage is `editor.storage.typedBlock` (was `composite`); the `ConvertTarget` of a Typed block is `{ type: 'typedBlock', blockType }` (id `typedBlock:<id>`); `data-kind-tone` is `data-block-type-tone`. Everything stored before loads through one migration (`migratePersistedNames` in `core/schema/persisted-names.ts`, run by `migrateLegacyContent`, `defineEditor` ahead of any contributed `migrateContent`, the server's `contentNode` and, for Yjs state, by `onLoadDocument` before any client syncs); old names are read, never written; the Yjs migration is idempotent and keeps block IDs and content ([migration guide](https://skaile-ai.github.io/skaile-editor/guides/migration), "Persisted names").
190
+ - **Persisted names (settings).** Settings version 2: `ai.slots` is `ai.roles`, `blocks.defaultKind` is `blocks.defaultBlockType`, `blocks.kindIcon` is `blocks.blockTypeIcon`, and the `blocks.structure` value `'composite'` is `'structured'` (`STRUCTURE_MODES = ['flat', 'structured']`). Saved settings (server store, `localStorage`) migrate on load through `migrateEditorSettings` and are rewritten once. `KIND_ICON_VISIBILITIES` / `KindIconVisibility` are `BLOCK_TYPE_ICON_VISIBILITIES` / `BlockTypeIconVisibility` (`/settings`). Host config: `ai.slots` is `ai.roles` (`EditorConfig`, `publicConfig`, `serverConfig`, `DirectAiOptions`); this needs a code change, there is no migration. `GET /api/ai/models` answers `{ presets, roles }` (was `slots`); client and server ship in the same package.
191
+ - The rename of old persisted names always runs: `defineEditor` applies it ahead of any contributed `migrateContent`, so a host hook receives current names and can no longer drop it.
192
+ - Further vocabulary renames (migration guide, "Block vocabulary"): `aiKindsOf` → `aiBlockTypesOf`, `derivableKindsOf` → `derivableBlockTypesOf`, `AiContextKind` → `AiContextBlockType`, `AiContext.kinds` / `ChatBlockModel.kinds` / the AI chat request field `kinds` → `blockTypes`, `ConvertTarget.kind` → `blockType`, `BlockProperties.fields` → `definitions`, the settings tab prop `kinds` → `blockTypes`, CSS `--sk-kind-tone` / `--sk-kind-tone-mix` → `--sk-block-type-tone` / `--sk-block-type-tone-mix`. One helper each for a Block type's capabilities: `listsCapability(type, id)` and `blockTypeConfigOf(type, id)` in `/core` (replacing `listsBlockTypeCapability` and the `(ctx, node, id)` form); `configOf` and `capabilityConfigOf` return `undefined` when absent (was `null`). `BlockTypeSpec` is gone; use `BlockType`.
193
+ - The Derivation helpers and `PropertyDefinition` are exported only from `@ecsplico/editor/core` (no longer re-exported from `/composites` and `/composites/schema`).
194
+
195
+ ### Removed
196
+
197
+ **Breaking.** The deprecated aliases and the remaining old names are gone; migrate to the new names ([migration guide](https://skaile-ai.github.io/skaile-editor/guides/migration), "Block vocabulary"). Persisted names are covered under Changed ("Persisted names").
198
+
199
+ | Removed | Use | Entry |
200
+ |---|---|---|
201
+ | `CompositeKind`, `CompositeKindAi`, `CompositeMetaField` | `BlockType`, `BlockTypeAi`, `PropertyDefinition` | `/composites`, `/composites/schema`; `PropertyDefinition` from `/core` |
202
+ | `CompositeKind.nestedAfterContent` (3.6.0) | `nestedAfterContent` in the Block type's `container` config (`{ id: 'container', config: { accepts, nestedAfterContent: true } }`; `nestedAfterContentOf(type)`) | `/composites`, `/composites/schema` |
203
+ | `defaultCompositeKinds`, `fallbackCompositeKinds`, `compositeKind`, `kindAccepts` | `defaultBlockTypes`, `fallbackBlockTypes`, `blockTypeOf`, `acceptsChild` | `/composites`, `/composites/schema` |
204
+ | `compositeKindsOf(editor)` | `blockTypesOf(editor)` | `/composites`, `/composites/schema` |
205
+ | `setCompositeKind(kind, pos?)` (editor command) | `changeBlockType(blockTypeId, pos?)` (not `setBlockType`: ProseMirror uses that name for node-type changes) | editor commands |
206
+ | `CompositeKindCount`, `CompositeKindOption`, `ChatCompositeKind` | `BlockTypeCount`, `BlockTypeOption`, `ChatBlockType` | `/composites`, `/ai` |
207
+ | `renditionsOf` | `derivedChildrenOf` | `/core` |
208
+ | `compositeMetaWith`, `setCompositeMetaField` | `metaWithProperty`, `setBlockProperty` | `/composites` |
209
+ | the `kinds` and `compositeKinds` options (`compositeFeature`, `compositeSchemaExtensions`, `composeEditor`, `AdvancedEditor`, `ComposedSurface`) | `blockTypes` | |
210
+ | `skeleton` in the `ai-brief` config and `BlockTypeAi`; the AI wire field `block.skeleton` (`AI_LIMITS.block.skeleton`, the server schema) | `contentTemplate` | `/composites`, `/ai`, `/server` |
211
+ | `ModelSlot`, `MODEL_SLOTS`, `MODEL_SLOT_KEYS` | `ModelRole`, `MODEL_ROLES`, `MODEL_ROLE_KEYS` | `/settings` |
212
+ | `PresetConfig` | `ModelPresetConfig` | `/config`, `/server` |
213
+ | `Identity`, `DocumentStore` (server ports) | `AccessControl`, `DocumentContentStore` | `/server` |
214
+
215
+ The Document tree's own `DocumentStore` (`/tree`) keeps its name.
216
+
217
+ ## 3.6.0 - 2026-10-21
218
+
219
+ ### Added
220
+
221
+ - `CompositeKind.nestedAfterContent?: boolean` (default `false`): the sub-Bausteine of a Baustein of that kind follow its own content, and `mergeCompositeWithNext` keeps that order. Merging A = `[Ca, Na]` and B = `[Cb, Nb]` (C the leading blocks of the body that are not Bausteine, N the rest from the first sub-Baustein on) gives `[Ca, Cb, Na, Nb]`; without the flag the result stays `[Ca, Na, Cb, Nb]`. Still one undo step, the empty-paragraph rule and the `accepts` check are unchanged.
222
+
223
+ ## 3.5.1 - 2026-10-21
224
+
225
+ ### Added
226
+
227
+ - React entry of the Bild-Studio, `@ecsplico/editor/image-studio/react`: `imageStudioFeature()` (the `imageStudio` block with its shadcn node view), `ImageStudioDialog` (props `open`, `onOpenChange`, `store`, `title?`; same behaviour and texts as the Vue dialog) and `ImageStudioReactStore`, the dialog's contract with plain values instead of refs (`state`, `promptBlocks`, `problem`, `update`, `generate`, `upload`; the host re-renders with the new `state` after `update`). `useImageStudioNodeStore({ editor, getPos, backend, documentId })` is the store of one node.
228
+ - `createImageStudioNodeCore(options)` (`ImageStudioNodeCore`, `ImageStudioNodeSnapshot`, `ImageStudioNodeCoreOptions`, exported from `/image-studio/react`): the framework-free store of one `imageStudio` node (`get()`, `subscribe(listener)`, `update`, `generate`, `upload`, `dispose()`). `createImageStudioNodeStore` (Vue) is now a wrapper over it; its public API is unchanged.
229
+
230
+ ## 3.5.0 - 2026-10-21
231
+
232
+ ### Added
233
+
234
+ - Bild-Studio (`@ecsplico/editor/image-studio`, `/image-studio/vue`, `/image-studio/schema`): an atom block `imageStudio` (attrs `src`, `alt`, `studio`; ability `ABILITY.imageStudio` = `insert.imageStudio`, revokes text abilities) that holds the text describing an image, the active Prompt-Bausteine, references, previous generations, the selected image and a chat log (`ImageStudioState`, `ImageStudioImage`, `ImageStudioTurn`, `ImageStudioPromptBlock`). `src` always mirrors the selected image. Markdown form `[Bild-Studio: <alt>](<src>) <!-- {"studio": …} -->`, round-trip stable; HTML `<img data-image-studio data-studio>`. Commands `insertImageStudio(attrs?)` and `setImageStudioState(pos, state)` (one transaction, `src` follows), `/` entry „Bild-Studio“, block action `image-studio.open` „Im Bild-Studio öffnen“ (placement `both`, event `IMAGE_STUDIO_OPEN`). Pure reducers `EMPTY_IMAGE_STUDIO_STATE`, `setDescription`, `togglePromptBlock`, `toggleImage`, `select`, `removeImage`, `addReference`, `addGeneration` (appends and selects), `selectedImage`, `normalizeImageStudioState`, `isEmptyImageStudioState`.
235
+ - `ImageStudioDialog` (Vue): three columns (description and Prompt-Bausteine as switches; references with upload and drop zone, previous generations, tiles to activate, select or remove; the selected image with a chat that generates, `Enter` sends, closing aborts) driven by an `ImageStudioStore` (`state`, `promptBlocks`, `update`, `generate`, `upload`, `problem`), so a host can keep the state outside the document. `imageStudioFeature()` adds the node view (`ImageStudioView`) and the node's own store `createImageStudioNodeStore({ editor, getPos, backend, documentId })`.
236
+ - Backend port `EditorBackend.images?` (`promptBlocks()`, `generate(body: ImageStudioGenerateBody, signal?)`, `upload(documentId, file)`), capability `images` (probed by the HTTP backend; the memory backend has none and the node view shows „Bildgenerierung ist nicht eingerichtet“). Server port `EditorPorts.images?: ImageProvider` with routes `GET /api/editor/images/prompt-blocks`, `POST /api/editor/images/generate`, `POST /api/editor/images/upload`, mounted and listed in the capabilities only with the port. Guide „Bild-Studio“.
237
+
238
+ ### Changed
239
+
240
+ - `attrComment` and `mediaTokenizer` are exported from `@ecsplico/editor/media/schema` (shared with the Bild-Studio's Markdown form); `attrComment` escapes U+2028 and U+2029 in the JSON comment so such text survives a Markdown round trip.
241
+
242
+ ## 3.4.0 - 2026-10-21
243
+
244
+ ### Added
245
+
246
+ - `CompositeKind.chrome.controls?: boolean` (default `true`). With `controls: false` the chrome of a Baustein of that kind is read-only although the editor is editable (Vue and React `CompositeChrome`; `CompositeRow.controls`): no basket menu, status menu, title-visibility button, tag removal or `+` chip and no drag handle on the kind icon, and a read-only details popover; existing basket, status and tags stay visible as chips. `mergeCompositeWithNext` also refuses (so `TreeModel.canMerge`, the row button and the block action disappear) when the Baustein or the one it would absorb has such a kind. For kinds whose attributes a host guard refuses to change.
247
+
248
+ ### Changed
249
+
250
+ - Outline label of a Baustein without a title: instead of „(ohne Titel)“ the document tree (Vue and React rows) shows the text of the first heading of the Baustein's own body, else the start of the first non-empty text of its own body (cut at 60 characters with „…“); text inside a nested Baustein is not used, and only a Baustein with an empty body keeps „(ohne Titel)“. `compositeOutline` marks such a label with `OutlineNode.labelFromBody` and `TreeItem.labelFromBody` (rows render it muted and italic, `data-label-from-body`), and the title filter matches the derived label too. A Baustein with a title is unchanged.
251
+
252
+ ## 3.3.0 - 2026-10-21
253
+
254
+ ### Added
255
+
256
+ - Kind tone: `CompositeKind.chrome.tone` (a CSS colour or `var(...)`). A Baustein of such a kind gets `data-kind-tone` and `--sk-kind-tone` on its wrapper (Vue and React `CompositeView`), a tinted surface and a left border in the tone (`composites.css`; strength `--sk-kind-tone-mix`, `8%` under `:where(:root)`, `14%` under `:where(.dark)`), and its document-tree rows tint the kind icon (`TreeItem.tone`). Kinds without a tone are unchanged.
257
+ - Merging a Baustein with the next one (`@ecsplico/editor/composites`): the command `mergeCompositeWithNext(pos?)` makes a Baustein absorb the Baustein that directly follows it (body and sub-Bausteine appended; the first keeps title, description, tags, id, kind and meta) in one undo step, refused without a following Baustein, when the first kind does not accept a nested kind, or when read-only. Block action „Mit nächstem zusammenführen“, a merge button on `DocumentTree` rows (Vue and React; `TreeCommand` `{ type: 'mergeBlock', id }`, `TreeModel.canMerge(item)` / `merge(item)`; a host-built `TreeEditor` must now provide `canMerge(id)`), exported `CompositeMerge` and `mergeBody`.
258
+
259
+ ## 3.2.0 - 2026-10-20
260
+
261
+ ### Added
262
+
263
+ - `basketById(baskets, id)` (`/composites`, `/composites/schema`); `basketOf` and `titleHiddenOf` also accept a `CompositeRow`.
264
+ - `clampSplitTargetChars(typed, current)` (`/settings`), shared by both `SettingsEditingTab` files.
265
+ - Block transfer between editor surfaces (`@ecsplico/editor/transfer`, `/transfer/vue`, `/transfer/react`): `transferFeature({ transforms?, defaultTransform? })`, a `BlockDropTarget` extension that accepts a Baustein dragged out of another editor or document tree (`BLOCK_MIME`). A plain drop runs the default transform `copyTransform` (fresh ids on the block and everything inside it, `meta.derivation` with `from: { block, document }`, method `copy`); Shift at the drop opens a menu at the drop point (`TransferMenu`, mounted as an overlay) with the available transforms: `copyTransform`, `summaryTransform` and `bulletsTransform` (exported from `@ecsplico/editor/integrations/composite-ai`, not from `/transfer`: the transfer feature imports no AI code and `requires` `composites`; `composeEditor` adds both to the `transfer` row when `ai` is on, `transferFeature()` alone offers the copy; `TransformContext` and `TransferEnv` carry `app: EditorContext` instead of `modelRef`; new Baustein whose body the model streams in, recorded as a derivation; available only with an AI backend and Markdown, tasks `transfer-summary` / `transfer-bullets`). A host passes its own `BlockTransform` list (`id`, `label`, `available`, `creates`, `run`). Insert guards apply (refusal toast, document unchanged), a drop onto the dragged block's own position in the same document is refused, a same-editor move stays native. Commands `transferBlock({ payload, pos, menu, x?, y? })` and `cancelTransfer()`; `runTransform`, `transferRequest` (pure request-body builder) and `isSelfDrop` are exported. `composeEditor` knows the catalog id `transfer` (in no level list: `interaction: [...INTERACTION.full, 'transfer']`, option `transfer`). `deriveComposite` shares its write-back with the transforms as `writeDerivedBody` (`@ecsplico/editor/integrations/composite-ai`).
266
+ - Document tree: basket filter and focus (`@ecsplico/editor/tree`, Vue and React `DocumentTree`). A paint-bucket button next to the title filter (only with a live editor that offers baskets) shows only the Bausteine of the checked baskets (none checked = all) plus their ancestors, which are dimmed; documents, folders and headings are never hidden. The choice persists under `tip-tree:basket-filter` (`TreeViewModel.basketFilter`, `setBasketShown`, `clearBasketFilter`; `TreeState.basketFilter`, `TreeRowState.dimmed`). Every Baustein row gets a focus button: `TreeModel.focus(key)` / `defocus()` list only the children of the focused row under a breadcrumb (`TreeState.focusKey`, `focusPath`; the first crumb is the document and leaves focus, the others refocus), emit the new `TreeCommand` `{ type: 'focusBlock', id }` after the state changed, and the executor runs `focusComposite(id)` on the editor, so the editor hides everything else. A focused Baustein that disappears (or another editor) resets the focus.
267
+ - Colour baskets and hidden titles on Bausteine. A Baustein can sit in one of the host's baskets (`meta.basket`, an id of `compositeFeature({ baskets })` / `composeEditor({ compositeBaskets })`; default `defaultBaskets(t)`: red, orange, yellow, green, blue, coloured by the `--sk-basket-<id>` CSS variables) and its title can be hidden (`meta.titleHidden`); a hidden title reappears for the rest of the editor session once the caret enters it (`CompositeStorage.revealedTitles`). Both keys are kept by every kind and survive Markdown round trips (`BASKET_KEY`, `TITLE_HIDDEN_KEY`, `keepsMetaKey`). New commands `setCompositeBasket(basket | null, pos?)` (refuses an unknown id, `null` removes the key) and `setCompositeTitleHidden(hidden, pos?)` (showing also ends the reveal); new exports `Basket`, `BASKET_IDS`, `defaultBaskets`, `basketOf`, `titleHiddenOf`, `compositeBasketsOf`; de/en keys `composites.basket.*` and `composites.titleHidden.*`.
268
+ - Block-action placement: `BlockAction.placement` (`'hover' | 'toolbar' | 'both'`, default `'both'`) and `BlockUiOptions.actions` (`'hover'` default, `'toolbar'`, `'both'`, `'none'`) chosen with `blockUiFeature(options)`, `blockUiFeatureCore(ui, options)` or `composeEditor({ blockUi })`. The new toolbar surface shows the actions of the block holding the selection at its corner (`block-actions-toolbar` class; Vue and React); with `'both'` the hover bar yields on the selected block, so one bar shows per block; `'none'` leaves the drag handle and targeting only. Abilities stay permissions: the option only chooses where allowed actions appear. Also exported from `@ecsplico/editor/block-ui`: `selectedBlockOf`, `sameBlock`, `actionSurfacesOf`; `blockActionsFor` takes the `surface` as a fourth argument. `EditorFeature.blockUi` and `EditorEntry.blockUi` carry the options to the overlay. Hosts passing nothing see no change.
269
+ - Editor focus mode on a Baustein (`@ecsplico/editor/composites`): the command `focusComposite(id | null)` hides every sibling of the focused Baustein and of each of its ancestors, so only the Baustein and the titles around it stay (decorations `sk-focus-hidden`, `sk-focus-target`, `sk-focus-ancestor` from the `CompositeFocus` extension; exported `compositeFocusKey`, `compositeFocusOf`, `focusDecorations`). The focus resets by itself when the Baustein is deleted. New block action „Fokussieren“ on every Baustein and a focus chip „Fokus: <Titel> · Aufheben“ (`FocusChip`, Vue and React; `CompositesUi` gains `focusChip`, mounted as an overlay of `compositeFeature`).
270
+ - `CoreContentOptions` (`headings: false | { levels }`, `lists`, `blockquote`, `codeBlock`, `rule`: each `false` to drop it) for the content base: `coreContentFeature(options)`, `coreContentSchemaExtensions(options)` and `composeEditor({ coreContent })`. One options object feeds the editor and the server schema (`starterKitOf` is the shared StarterKit mapping), so they cannot drift; everything stays on by default. A command whose created node type is not in the schema is hidden (`commandState` → `visible: false`) in the toolbar, the `/` menu and the ⌘K palette instead of greyed out; with `headings: { levels }` the heading commands of other levels are hidden.
271
+ - `AdvancedEditor` (Vue and React) and the React `ComposedSurface` take `blockUi` and `coreContent` and pass them to `composeEditor` (read once at setup, like the other composition props).
272
+ - AI splitting and outline cleanup (`@ecsplico/editor/integrations/composite-ai`): the block actions „Mit KI in Unter-Bausteine teilen“ / „Mit KI in Bausteine teilen“ (`splitCompositeWithAi(editor, pos, mode, ai, modelRef, notify, t, { targetChars, defaultKind })`) ask the model (task `split-block`) to insert `##` headings into a Baustein's body and split it at them; the model may only insert headings, so a result whose text minus those headings differs from the original (`bodyUnchanged`) writes nothing and shows a warning. „Gliederung bereinigen (KI)“ (`sanitizeOutline(editor, ai, modelRef, notify, t)`, ⌘K entry and block action on headings; task `outline-sanitize`) sends all headings of the document and applies the repaired outline (no skipped levels, numbering and trailing punctuation removed, empty headings merged into the next) in one undoable step, or nothing when the answer is malformed. The pure parts are exported (`bodyUnchanged`, `splitByInsertedHeadings`, `collectHeadings`, `parseOutlineResponse`, `applyOutline`). Both tasks are in `AI_TASK_IDS` and carry the new `AiTask.programmatic` flag, which keeps tasks that only a block action or command sends out of the AI sidebar.
273
+ - Splitting a Baustein (`@ecsplico/editor/composites`): the commands `splitCompositeAtCaret({ mode })` (in front of the body block holding the caret; refused at the first body block) and `splitCompositeByLength({ mode, targetChars?, pos? })` (parts of about `blocks.splitTargetChars` characters, never cutting inside a block; refused with fewer than two parts) cut a Baustein into sibling Bausteine (`'siblings'`: the original keeps the first part) or sub-Bausteine (`'children'`: of the default kind, else the parent's own kind, refused when neither is accepted). Generated parts get a title from their first sentence and hide it (`meta.titleHidden`). The pure parts are exported (`splitBodyByLength`, `generatedTitle`, `childKindFor`, `splitComposite`, `SplitMode`), the four block actions „Baustein hier teilen“, „In Unter-Bausteine teilen“, „Nach Länge in Unter-Bausteine teilen“ and „Nach Länge in Bausteine teilen“ are offered on Bausteine, and the new setting `blocks.splitTargetChars` (default 1500, 200–20000) has a field in the „Bearbeiten“ tab (Vue and React).
274
+ - Client-safe AI run modules in `@ecsplico/editor/ai/protocol`: `generateBodySchema`, `completeBodySchema` (moved from the server handlers, which keep re-exporting them), `ChatMessage`, `ChatStream`, `GenerateInput`, `generateProblem`, `runGenerate` and `runCompletion`; `runTranscriptCleanup` and `TranscriptCleanupUnreadableError` in the transcript-AI protocol. They take a `ChatStream` and hold the validation, streaming, early-stop and chunk policy, so the server handlers (AI SDK stream) and a browser-direct adapter share one implementation. Server behaviour is unchanged; `ChatMessage` of `@ecsplico/editor/server` is the same type.
275
+ - `@ecsplico/editor/adapters/direct-ai`: `createDirectAi({ presets, slots?, users?, fetch? })`, an `EditorBackend['ai']` that calls OpenAI-compatible chat-completion endpoints (`<endpoint>/chat/completions`, base URL like `PresetConfig.endpoint`) straight from the browser, so `{ ...createMemoryBackend(), ai: createDirectAi({ presets }) }` is an editor with AI and no server. It serves `models`, `complete`, `stream('generate')` and `transcriptCleanup` through the shared protocol modules (same prompts, limits and results as the handlers) over a plain `fetch` and a small SSE reader, with no AI SDK in the bundle. A refused model request rejects with a `BackendError` carrying the upstream status before anything streams. Limits: `stream('chat')` (tool calls) and `extract` (transcription, OCR) answer `BackendError` 501 (use the HTTP backend's `ai` for them); the preset keys are readable by the page; the per-user rate limit exists in the server handlers only. Bundle-isolation fixture `adapters-direct-ai`. The guides document the capability locality (`local`, `relay`, `session`) and the new adapter.
276
+ - Block payload for drags between editors and document trees (`@ecsplico/editor/core`): `startBlockDrag` writes the Baustein as `application/x-tip-block` (`BLOCK_MIME`, `BlockTransfer`: document id, block id, kind, title, JSON, Markdown) after `text/plain`; `writeBlockTransfer`, `readBlockTransfer` (null for a missing, unparsable or misshapen payload) and `blockTransferOf(editor, pos)` (Markdown empty without `editor.markdown`). The new `BlockTransferStorage` extension of `coreContentFeature` carries the editor's `documentId` (`editor.storage.blockTransfer`).
277
+ - Foreign Bausteine in the document tree (`@ecsplico/editor/tree`, Vue and React `DocumentTree`): a Baustein dragged in from another editor surface or tree (`BLOCK_MIME`) is accepted on the document root or on a Baustein row in the open document (`DragPayload` `{ type: 'foreign-block' }`, `TreeModel.foreignDragOver(item)`, `TreeModel.dropForeign(item, payload, menu, x, y)`); other targets show the refusal „Hier lassen sich keine Bausteine ablegen“, and an open editor without the transfer feature (no `blockDropTarget` storage or `transferBlock` command: `TreeEditor.canTransfer`, `DropEnv.canTransfer`) refuses every foreign drop (the executor returns `false` instead of throwing, `dropForeign` never rejects). The model emits `TreeCommand` `transferBlock { payload, targetId, menu, x, y }` and the executor runs `editor.commands.transferBlock` at the end of that Baustein (Shift = transform menu). A Baustein row now also writes its block payload (`BLOCK_MIME`) when dragged, so it can be dropped into another surface or tree.
278
+ - Example `examples/vue-two-pane` (`bun run example:two-pane`, port 3047): two document trees over two editors on the bare Nitro server of `vue-nitro-json`, showing nested Bausteine from a Markdown import with AI outline repair, splitting by length, colour baskets with filter and focus in the trees, and dragging Bausteine from one pane into the other with a transform. New guide „Content tree mechanics“ and additions to the composites, document-tree, AI and composition guides and the exports reference.
279
+
280
+ ### Fixed
281
+
282
+ - `--sk-basket-*` now live under `:where(:root)` with dark values under `:where(.dark)` (like `tokens.css`); a host's override now wins at any specificity.
283
+
284
+ ### Changed
285
+
286
+ - Internal: the composition catalog of `presets/compose` is one table (`CATALOG`, one row per feature: dimension, level lists, builder; its key order is the canonical order). `CONTENT`, `INTERACTION` and `AI` are derived from it with unchanged names and values; `composeEditor` output is identical. Adding a catalog feature is one row, plus a `UiBindings` key and both binding records when the feature is UI-bound.
287
+ - `TreeCommand` gains `focusBlock` and `transferBlock`, and `DragPayload` gains `{ type: 'foreign-block' }`: a host that switches exhaustively over either needs the new cases. `TreeEditor` gains `canTransfer` and `DropEnv` gains `canTransfer`; `TransferDrop` `{ payload, pos, menu, x, y }` is the one type of a drop (`PendingDrop` is `TransferDrop` with `menu` on).
288
+ - `CompositesUi.focusChip` is optional: without it `compositeFeatureCore` mounts no focus chip (the focus mode and its block action stay).
289
+ - `DEFAULT_TRANSFORMS` of `/transfer` is `[copyTransform]`; hosts that built `transferFeature()` by hand and want the AI transforms pass `transforms: [copyTransform, summaryTransform, bulletsTransform]`. `UiBindings` of `presets/compose` gains `transfer-ai`, the AI transforms the layer binds (bound only with `ai` on and no own `transfer.transforms`).
290
+ - `DerivationSource` `{ block }` may carry `document` (the document the source block lives in); the details card reports `stale: null` for a source in another document (it is not looked up here), and the badge shows „aus anderem Dokument“ (`composites.derivation.foreign`, `derivationIsForeign`, `isForeignSource`, `DerivationDetails.foreign`) instead of comparing hashes.
291
+ - A Baustein row of the document tree, and every block dragged with `startBlockDrag`, now writes its block payload (`BLOCK_MIME`) besides `text/plain`, so it can be dropped into another surface or tree. Hosts that read only `text/plain` see no change.
292
+
293
+
294
+ ## 3.1.1
295
+
296
+ ### Fixed
297
+
298
+ - Composites: picking an option of a `multiselect` field in the Vue meta panel stores it. The Nuxt UI `InputMenu` emitted the whole option objects, which the field dropped, so nothing could be chosen; it now picks by `value` (`value-key="value"`). The kit's `InputMenuProps` gains `valueKey`. React was not affected.
299
+
300
+ ## 3.1.0
301
+
302
+ ### Added
303
+
304
+ - Composites: field type `multiselect` (`CompositeMetaField`; `options` required, value stored as `string[]`; the key is removed when none is chosen). It is rendered in the details popover and inspector (Vue `InputMenu`, React checkbox list), in table cells and sort keys, in the AI brief and in the chat block model.
305
+ - Composites: `CompositeKind.chrome?: { tags?: boolean }`; `chrome: { tags: false }` hides that kind's tag chips, `+` chip and inspector tags field (`CompositeRow.tagsVisible`).
306
+ - `EditorFeature.transactionGuards(ctx)` and the `TransactionGuard` type: features can refuse a whole document-changing transaction by returning a notice string. The first refusal wins and the string is shown through `notify`. The `TransactionGuards` extension and `transactionGuardExtensions(preset, ctx)` are exported from `core`.
307
+ - `EditorServerOptions.routes` (`installEditorServer`): a function that filters or reorders the route table before it is mounted, so a host that serves some paths itself (for example `/api/editor/assets/*`) can drop them. The `RouteDef` type is exported from `@ecsplico/editor/server/nitro`.
308
+ - `@ecsplico/editor/comments/server` exports the pure discussion operations `createThread`, `addComment`, `editComment`, `removeComment`, `setThreadStatus`, `updateAnchor`, `removeThread` and `emptyDiscussion`, so a host `CommentStore` over its own database applies them to a stored `Discussion` instead of reimplementing the rules (guide „Storage adapters“, section „Your own store“).
309
+
310
+ ## 3.0.0
311
+
312
+ ### Added
313
+
314
+ - Asset hashes: `POST /api/editor/assets/:id` answers `{ url, name, sha256 }` and stores `sha256` in the `AssetRecord`; `backend.assets.upload` may resolve `{ url, sha256? }`. Image, audio, video and file nodes have a `hash` attribute (`data-hash`), set by every upload path; the memory backend leaves it empty. `composite-media` imports audio/video as `recording`, images as `figure`, other files as `document`, and adds the block action „Quelle ersetzen“ (`source-replace`).
315
+ - Source-holding Bausteine: the composite kinds `recording` (audio/video; `recordedAt`, `participants`, `durationSeconds`), `paper` and `book` (PDF; `bib`, `doi` / `isbn`), `figure` (image; `credit`) and `rendition` („Lesefassung“: derived readable content; `derivation`, `language`), next to `document`. `CompositeKind.source` (with `SOURCE_MEDIA_TYPES`) names the media block types of a source-holding kind; `sourceOf(composite, kinds)` finds the source block (`{ node, index, asset, hash }`), `renditionsOf(composite)` its derived children. The source is the `audio|video|image|file` block in the Baustein's body, the readable form a child `rendition` Baustein whose body is the derived block tree (chapters as nested `section` Bausteine in composite structure). No new container node and no new feature.
316
+ - Provenance: `meta.derivation` (`Derivation`: `from` (`{ asset }` or `{ block }`), `method`, `model?`, `createdAt`, `inputHash`, `outputHash`, `output?`) on any Baustein, with `DERIVATION_KEY`, `derivationOf`, `derivationState` (`stale`/`edited`), `bodyMarkdown` and `sha256Hex` (`core`, pure JS via `@noble/hashes`). A derived Baustein starts collapsed to a faded preview (chevron with `aria-expanded`, expands with the caret), shows an „abgeleitet“ badge and, for an asset source, „Quelle geändert“ when the source block's `hash` differs from `inputHash`; the details card adds method, model, date, „bearbeitet“ (body differs from `outputHash`), „Quelle geändert“ for block-derived Bausteine (the source block's Markdown hash differs from `inputHash`) and a link to the stored raw output. Provenance and `bib` survive Markdown fences of every kind.
317
+ - Bibliographic data: `meta.bib` as CSL-JSON (`CslItem`, `CslName`, `CslDate`, `CslType`, `CSL_TYPES`, `BIB_KEY`) with `bibOf`, `cslOf`, `citeShort` („Doe et al. 2024“), `citeFull`, `bibtexOf`, `yearOf`, `cslTypeOptions`. The Baustein title is the work's title; `bib` never stores one. Block action „Literaturangabe exportieren (BibTeX)“ (`.bib` download) on every Baustein with `bib`.
318
+ - Composite field types `reference` (a Baustein of the document, optionally restricted by `CompositeMetaField.targets`), `bibliography` (form editor for `meta.bib` with „BibTeX kopieren“ and, with the AI capability, „DOI abrufen“) and `derivation` (read-only provenance), in the Baustein table, the details card (Vue and React), the AI brief (`compositeAiBrief`) and the chat prompt.
319
+ - Inline `reference` chip (`ReferenceNode`, `REFERENCE_NODE`, ability `insert.reference`, `/verweis`): `[@` opens a suggestion over the document's Bausteine; the chip shows the live `citeShort` (or the title), has a „Stelle“ locator (`S. 12`, `3:07`) and reveals the target on click. Markdown is `[@<block id>]` or `[@<block id>, <locator>]` (`referencesFromText`, `normalizeReferences`, `compositeIdsOf`); AI-written `[@id]` text becomes chips through the `normalize` stage, and the chat knows the syntax. The details card lists backlinks („Verweise“: `compositeBacklinks`, `CompositeBacklink`, `CompositeReference`).
320
+ - Markdown fences carry the block id of a referenced Baustein: `::: kind #<block id> {meta}` is written only for Bausteine that a `reference` chip or field points at, so `[@id]` survives a Markdown round trip (source mode, import); other fences are unchanged. The pre-pass runs through the new `NodeConfig.markdownPrepare(json, editor)` hook of the document Markdown serializer.
321
+ - Transcript segments carry `start`/`end` (seconds; `data-start`/`data-end`, JSON/Yjs only, not in Markdown); the segment shows a `mm:ss` button that seeks and plays the source audio/video. `revealSource(editor, targetId, locator)`, `seekSource`, `parseLocator`, `SourceLocator` and the `SourceReveal` extension (command `seekSource`) show a Baustein's source at a locator: a time seeks the media, a page opens the PDF viewer at `#page=N`; a `reference` chip with a locator does this on click.
322
+ - `POST /api/ai/extract` (`extractPost`, `extractBodySchema`) and `backend.ai.extract(body, signal)`: one route for the readable form of a stored asset, `method` `auto` (by MIME type), `transcription` (timestamped segments, `verbose_json`), `pdf-text` (pdf.js, page markers `<!-- page N -->`), `ocr` (rasterised pages through the `generate` model; falls back to the text layer with `warnings: ['ocr-unavailable']`), `description` (image) or `bibliography` (Crossref by DOI, else model extraction); the response carries `markdown`, `segments?`, `bib?`, `inputHash`, `outputHash` and the asset name of the stored raw output (`output`), plus `warnings`. New dependencies `pdfjs-dist` and `@noble/hashes`, optional dependency `@napi-rs/canvas` (OCR page rasterisation).
323
+ - Deepgram speech-to-text: `TranscriptionConfig.provider: 'deepgram'` sends the raw audio to `<endpoint>/listen` (e.g. `https://api.deepgram.com/v1`, model `nova-3`, key as `Token`) and turns Deepgram's utterances into the timed transcript segments; `'openai'` (default) keeps the OpenAI-compatible `/audio/transcriptions`. `TranscriptionConfig.language` fixes the spoken language (else OpenAI guesses and Deepgram detects it). `ExtractResponse.model` names the speech-to-text model, which `meta.derivation.model` of a transcript records; the PDF text layer records no model. The repository's Nuxt host enables Deepgram when `NUXT_TIPTAP_EDITOR_AI_TRANSCRIPTION_API_KEY` is set.
324
+ - `composite-ai` actions (all behind the ability `composite.derive`): „Lesefassung erzeugen“ (`createRendition`, `canCreateRendition`: a new `rendition` child after the source block, transcript segments with timestamps, structured full text, or an image description; fills an empty `bib` and title from `bibliography`), „Neu erzeugen (ersetzen)“ (`regenerateRendition`, `canRegenerateRendition`, `RenditionOptions`; warns when the body was edited since generation, keeps the block id), „Ableiten (KI)“ (`deriveComposite`, `canDeriveAfter`, `derivableKindsOf`, `isDerivableSource`: a sibling Baustein of any kind with `ai` generated from the Baustein's body, `derivation.from.block`, so a translation or summary is a rendition of a rendition) and „Literaturangaben abrufen“ (`fetchBibliography`, `canFetchBibliography`, `doiOf`; the editor command `fetchCompositeBibliography` is behind the bibliography editor's „DOI abrufen“). `generateCompositeBody` is the request part of `fillComposite`, reused by `deriveComposite`.
325
+ - The ⌘K command palette: `core-ui` binds `Mod-k` and mounts `EditorCommandPalette` (`@ecsplico/editor/vue` on Nuxt UI `UCommandPalette` in a `UModal`, `@ecsplico/editor/react` on shadcn `CommandDialog`) as an overlay of the surface. It lists every command with `palette !== false` (features' and the host's `commands` transformer), grouped like the toolbar (`ToolbarGroupDef.labelKey` names the heading's i18n key), disabled where `commandState` disables it, filtered by label or id; a `menu` command opens its rows as a second level; selecting runs the command and closes. `coreUiFeature(ui?: CoreUi<C>)` takes the palette component (`advancedEditor()`, `composeEditor()` of `/vue/advanced` and `/react/advanced`, `SimpleEditor` and `AdvancedEditor` pass it; the framework-free `simpleEditor()` has no palette); `EditorUi` gains `togglePalette()` and `paletteOpen` (implemented by the Vue and React `EditorSurface`, exposed by `useEditorUi`); the framework-free model is `paletteGroupsOf`/`filterPalette` (`core`). The Nuxt UI kit gains the `CommandPalette` widget (`VueUiKit.CommandPalette`, `CommandPaletteProps`). Message keys `palette.*` (de/en).
326
+ - The client port `EditorBackend` (`core`: `EditorBackend`, `BackendCapability`, `BackendError`, `AiStreamEvent`, `CollaborationToken`) and its HTTP adapter `createHttpBackend({ fetch?, base? })` (`/adapters/http`), which owns the editor's paths. `createEditorContext({ backend })` and `FeatureContext.backend` carry it (default: the HTTP backend over `fetch`); the Nuxt module installs it over `$fetch`.
327
+ - Bundle-isolation fixture `adapters-http`.
328
+ - The in-memory backend `createMemoryBackend({ documents?, users?, tags? })` (`/adapters/memory`, name `'memory'`): documents, `blob:` asset URLs, seeded `@`/`#` lookups and settings, for hosts without a data layer; the simple and markdown examples run on it without any `/api` request. Bundle-isolation fixture `adapters-memory`.
329
+ - `EditorFeature.backend`: the backend capabilities a feature cannot work without (`ai`: `ai`, `media`: `assets`, `themes`: `themes`, `collab`: `collaboration`). A surface session over a backend that lacks one throws `feature "<id>" needs backend capability "<cap>", which "<name>" lacks` (the collaboration capability is never required by a session: the surface only consumes the session the host opened, through its own provider or `useEditorDocument`).
330
+ - `serverRoutesOf(ports, { ai })` (`server/routes.ts`): the editor's HTTP routes as one table, each served only when its port is present; `installEditorServer` mounts it for Nuxt and plain Nitro hosts alike. `collab.authenticateUpgrade` (refuse the `/collab/:id` upgrade with HTTP 401) is available on `installEditorServer`.
331
+ - One editor configuration with three views (`/config`): `defineEditorConfig(input)` applies every default once (locale `'de'`, the `sonnet` and `flashLite` OpenRouter presets and their slots, 30 AI requests per user and minute, `collab.authenticateUpgrade: false`, empty `apiKey`s so env variables can override them); `serverConfig(config)` is the server view (presets with keys, shared key, slots, transcription, rate limit, collab; spread it into `installEditorServer`), `publicConfig(config)` the browser view (locale, messages, slots, `transcription` flag; `createEditor({ ...publicConfig })`). `PresetConfig`/`TranscriptionConfig` live there (the server entry re-exports them); `EditorAiConfig` is `EditorPublicConfig['ai']`. The Nuxt module options are `EditorConfigInput` and both runtime configs come from the two views, so `ai.transcription` is typed without a cast. The rate limit now sits at `runtimeConfig.tiptapEditor.rateLimit` (was `…ai.rateLimit`; the module option stays `ai.rateLimit`).
332
+ - `useEditorDocument` for React (`/adapters/react`, the twin of the Vue composable: `modelValue`, `onChange`, `ready`, `dirty`, `save`, `reload`, `error`, `collaboration`, `comments`, `bind`), reading its backend from `EditorContextProvider`; a `null`/`undefined` id keeps it idle. Bundle-isolation fixture `adapters-react`; the entry name is no longer reserved. The react-advanced example opens its collaboration session with it.
333
+ - `GET /api/editor/capabilities` (`CAPABILITIES_ROUTE`, handler `capabilitiesGet`): lists what the installed server serves (`serverCapabilities(ports, { ai?, collaboration? })`: `ai` and `collaboration` follow what the installer really mounted), behind `authenticate`. `createHttpBackend({ probe: true })` asks it once, drops the capabilities the server lacks and exposes the request as `EditorBackend.ready`, which `createEditorContext` awaits before its `ready` store turns true; a failed probe keeps every capability and warns once. Default `probe: false` (no request). The Nuxt module installs its backend with `probe: true`, and its client plugin finishes only after the probe, so no editor mounts before the capabilities are known. `BACKEND_CAPABILITIES` (`core/backend-capability`) lists the capability names.
334
+ - `AdvancedEditor` (Vue and React) takes the composition: `content`, `interaction`, `ai`, `add`, `remove`, `backend` (defaults `'rich'`/`'full'`/`true`; `backend` defaults to the editor context's), builds its preset with `composeEditor` once at setup and exposes it (`preset` on the Vue component instance, on the React ref handle `AdvancedEditorHandle`, with `omitted`). `<AdvancedEditor :remove="['tables']" />` and `<AdvancedEditor content="basic" interaction="minimal" :ai="true" />` need no hand-built preset. `SimpleEditor` takes `add` (host features after `core-content` and `core-ui`, e.g. `aiFeature()`) and exposes the `preset` it mounts (React: `SimpleEditorHandle`); it does not use `composeEditor`, which keeps the simple entry's bundle free of every catalog feature.
335
+
336
+ ### Changed
337
+
338
+ - Documentation moved to https://skaile-ai.github.io/skaile-editor/; the package no longer ships `docs/`.
339
+ - `composeEditor` takes `collaboration?: boolean`: with a host-supplied collaboration session (the surface's `collaboration` prop; `AdvancedEditor` on Vue and React sets it itself) `collab` and `comments` stay whatever capabilities the backend offers, so a host with its own Hocuspocus provider works over the default backend. Without it a backend lacking `collaboration` still prunes both (`omitted`).
340
+ - The comment mark belongs to the document model: `composeEditor` adds `CommentMark` (schema and extension, inert) to the `authors` feature when the final list has no `comments`, so every rich composition, including viewers and ones over a backend without collaboration, loads documents that carry comments and has the schema of the server. The features themselves stay independent: `authors` does not import the comments feature.
341
+ - `composeEditor` throws `"core-content" cannot be removed` instead of silently ignoring `remove: ['core-content']`.
342
+ - The React `AdvancedEditor` waits for `backend.ready` before composing and renders nothing until then, like the Vue surface and the Nuxt plugin.
343
+ - Settings persistence, the media upload, `@`/`#` lookups and the theme list, stylesheet, upload and delete go through the backend (`settings`, `assets`, `users`, `tags`, `themes`) instead of `ctx.fetch`; a backend without a capability offers no mention suggestions.
344
+ - The Nuxt module no longer ships per-route files (`runtime/server/api/**`, `routes/collab/[id].ts`); its server plugin calls `installEditorServer` on first request (after the host's plugins have registered the ports). Nuxt hosts now answer `GET`/`PUT /api/editor/documents/:id` and, with a `comments` port, `GET`/`POST /api/editor/comments/:id`. Routes of a port the host did not register are no longer mounted (404) instead of answering 501.
345
+ - The process-wide server of `@ecsplico/editor/server` is what `installEditorServer` adopted: `configureEditorServer` and `EditorServerConfig` are gone (pass `ai`/`rateLimit`/`collab` to `installEditorServer`, e.g. `...serverConfig(defineEditorConfig(...))`). `useCollabServer`, `useAiModels`, `useRateLimiter`, `resolveModel`, `listAiModels`, `enforceAiRateLimit`, `liveContent`, `collabStats` and `collabContentChanged` throw `@ecsplico/editor: server not installed` before installation; `useAiModels`/`useRateLimiter` also throw when it was installed without `ai`, `useCollabServer` with `collab: false`. `setEditorPorts` only records the ports (and schema) a later installer reads. `installEditorServer`'s rate-limit default is the one of `defineEditorConfig`.
346
+ - `useEditorDocument` (`/adapters/vue`) loads, saves, connects collaboration and builds the comments model through the backend: `useEditorDocument(id, { backend?, user?, canComment?, collaboration?: boolean | { token? } })`, the backend defaulting to the editor context's. The `fetch` option and the `collaboration: { url, token }` option are gone (the HTTP backend derives the websocket URL from its `base`). The default context backend has neither collaboration nor comments: install `createHttpBackend()` (`createEditor({ backend })`) or pass `backend`.
347
+ - `ai.transcribe` is replaced by `ai.extract` (see Removed); `EditorPublicConfig.ai.transcription` stays the „transcription configured“ signal and gates „Lesefassung erzeugen“ for audio/video.
348
+ - Imported audio/video land in a `recording` Baustein and images in a `figure` Baustein (before: `document` for every file); PDFs and other files stay `document` until the user switches the kind to `paper` or `book`. `document` accepts every source media type.
349
+ - „Zusammenfassung erzeugen (KI)“ (`compositeSourceText`) summarises the Baustein body only, which now holds the rendition children, instead of falling back to a transcript field.
350
+
351
+ ### Removed (breaking)
352
+
353
+ - `@ecsplico/editor/presets/simple` and `@ecsplico/editor/presets/advanced` are one module now: import `composeEditor`, `simpleEditor`, `CONTENT`, `INTERACTION`, `AI` and the types from `@ecsplico/editor/presets/compose`. `simpleEditor` is no longer re-exported by `@ecsplico/editor/vue/advanced` or `/react/advanced`.
354
+
355
+ - `EditorContextOptions.fetch`, `EditorContextOptions.settings.remote`, `EditorContext.fetch` and `FeatureContext.fetch`: pass `backend` instead (`createEditorContext({ backend })`, `createEditor({ backend })`; to send through your own HTTP client use `createHttpBackend({ fetch })`). Settings sync per account whenever the backend offers `settings` (the default backend does); use `createMemoryBackend()` for local-only settings.
356
+ - `FeatureContext.upload`, `FeatureContextOptions.upload`, `UploadFn` and the `upload` prop of `EditorSurface`, `AdvancedEditor` (Vue and React): uploads go through `backend.assets.upload(documentId, file)`; provide it in a custom `EditorBackend`.
357
+ - `createRestCommentsModel` and the entry `@ecsplico/editor/comments/client` (with its fixture `headless-comments-client`): the REST comments model is `backend.comments(documentId, …)` of `createHttpBackend()` (`/adapters/http`).
358
+ - The `preset` prop of `EditorToolbar`, `EditorSettingsPanel` and `EditorSettingsModal` (Vue and React): they take the `editor` (from the surface's `ready`/`onReady`) and read its preset through the registered editor entry. Without an editor the toolbar renders no groups and the panel/modal nothing (before, `preset` rendered a disabled toolbar). The `preset` prop of `SimpleEditor` and `AdvancedEditor` is gone as well (compose with the dimension props, or mount an `EditorSurface` over `advancedEditor(...)`).
359
+ - `EditorFeature.toolbar`, `EditorFeature.slashCommands`, the surface prop `slashCommands` (now `commands`), `ToolbarItem`, `ToolbarItemBase`, `SlashCommandItem`, `commandItem`, `mergeToolbarGroups` and the adapter `core/legacy-commands.ts`: a feature contributes `commands(ctx)` (`CommandDef`, one declaration per command with `toolbar: { group, order? }` and/or `slash: { id? }` placements, `creates`, `ability`, `can`) plus `toolbarGroups`; build chain commands with `command({ ..., command: chain => ... })`. Every built-in feature (composites, tables, media, transcript, ai, comments, authors, composite-media) and the app callout are migrated; the callout's toolbar button and `/hinweis` entry are one command. Host commands that were `SlashCommandItem`s become `CommandDef`s with `slash: {}`.
360
+ - `ai.transcribe`, `POST /api/ai/transcribe` (`transcribePost`, `transcribeBodySchema`) and `transcribeDocument`: use `backend.ai.extract({ documentId, name, method: 'transcription', model })` / `POST /api/ai/extract` (the HTTP backend maps it; a custom `EditorBackend` or server must provide `extract`). `mediaAssetOf` is gone as well: `sourceOf(composite, kinds)` finds the source block by the kind's `source` types, not by position.
361
+ - The `transcript` field of the `document` kind (`meta.transcript`): stored documents are migrated on load (`migrateLegacyContent`) into a `rendition` child titled „Transkript“ with `meta.derivation` (`method: 'transcription'`, the source asset's name, empty hashes) and one paragraph per blank-line-separated chunk; the summary no longer reads the field.
362
+ - The ability `composite.transcribe` (`ABILITY.compositeTranscribe`) is renamed `composite.derive` (`ABILITY.compositeDerive`); hosts that grant or deny it through `abilities` must use the new id.
363
+
364
+ ### Changed (commands)
365
+
366
+ - Creating a Baustein respects Accepted children everywhere: the composites feature contributes an insert guard over `kindAccepts` (the rule `AcceptedChildren` enforces on transactions), so `/` lists no Baustein kind a parent refuses (inside an `Aufgabe`, for example) and the toolbar greys the insert button there. Commands with `creates` (tables, task lists, composites, callout, core blocks) are also greyed or hidden where the schema does not allow the node, e.g. `Tabelle einfügen` inside a table. `canGroup`/`canFlatten` are defined once for the toolbar menu and `/` entries.
367
+ - The surface session warns once per command, when it mounts, whose `ability` is neither in `ROOT_ABILITIES` nor granted by `abilities.root` (`@ecsplico/editor: command "<id>" needs ability "<a>", ...`); such a command never shows.
368
+ - „In Baustein umwandeln“ follows the same rule: `convertBlockTo` (and with it the toolbar's and the palette's „In Baustein umwandeln“ menu and the block action) refuses a Baustein kind the parent Baustein does not accept (`guardsAccept`, exported from `core/commands`, runs the registered insert guards for the node the target creates). The conversion of a Baustein with nested Bausteine into a kind that refuses them is still caught only by `AcceptedChildren` on the transaction.
369
+ - Two commands with the same `id` in one editor now fail at session creation (`@ecsplico/editor: command "<id>" is declared by "<a>" and "<b>"`; a command added by the host's `commands` transformer counts as `"host"`).
370
+ - The Vue ⌘K palette filters with `filterPalette` like the React one (prefix matches first, then substring, on label and command id; no search in `description`) instead of Nuxt UI's own matching: `CommandPaletteGroup.ignoreFilter` and `CommandPaletteProps.searchTerm` are new on the Vue kit contract.
371
+
372
+ ### Changed (transport)
373
+
374
+ - The default backend (`createFetchBackend`, `createHttpBackend`) sends through the platform `fetch` and no longer imports `ofetch`; a host hands in `$fetch` explicitly (`createHttpBackend({ fetch })`, as the Nuxt plugin does). The `simple` entries fixture asserts its bundle holds no `ofetch`.
375
+ - Core no longer imports features, integrations or adapters: the wire and model types `EditorBackend` names (`MentionUser`, `ModelProfile`, `ModelRef`, `ThemeRecord`, the transcript-cleanup request/response, the comment thread and `CommentsModel` types) are defined in `core/backend-types.ts` and exported by the same public entries as before (`/mentions/schema`, `/ai/protocol`, `/themes/schema`, `/comments/schema`, `/integrations/transcript-ai/protocol`); the route constants moved from `adapters/routes` to `core/api-routes`, and `server/adapter.ts` (only `AuthenticateRequest`) to `server/auth.ts`. The `setEditorPorts` error reads `@ecsplico/editor: setEditorPorts() was not called`.
376
+
377
+ ## 2.1.2
378
+
379
+ ### Added
380
+
381
+ - `BLOCK_CORNER_ATTR` (`data-block-corner`), `blockCornerOf(dom)` and the type `BlockCorner` from `/block-ui`: a block marks the icons in its top-right corner with the attribute, and the hover action bar (Vue and React `BlockActionsOverlay`) docks immediately left of them, vertically centred, instead of covering them. Blocks without marked elements keep the bar at the editor's right edge.
382
+
383
+ ## 2.1.1
384
+
385
+ ### Changed
386
+
387
+ - The comment stores and `handleCommentsRequest` (`/comments/server`, `/comments/json`, `/comments/drizzle`) answer refused requests (`400`/`404`/`405`/`409`) with German `error` texts, like the editor's other server routes (e.g. `Kommentar-Thread „t1“ nicht gefunden`). Status codes and `CommentStoreError.code` are unchanged; clients that matched the old English texts must match the status or code instead.
388
+ - Errors thrown by `useEditorDocument` (`/adapters/vue`) and `createRestCommentsModel` (`/comments/client`) start with `@ecsplico/editor:` like the editor's other developer errors.
389
+
390
+ ## 2.1.0
391
+
392
+ ### Added
393
+
394
+ - The storage and connection layer of the former `@ecsplico/editor-adapters`, as 11 subpath entries (guide: https://skaile-ai.github.io/skaile-editor/guides/storage-adapters): `@ecsplico/editor/adapters` (types only), `/adapters/json`, `/adapters/drizzle`, `/adapters/forge`, `/adapters/vue` (`useEditorDocument`), `/anchors`, `/comments/server`, `/comments/json`, `/comments/drizzle`, `/comments/client` and `/server/nitro` (`installEditorServer`, the Nuxt-free Nitro host). Exported names are unchanged.
395
+ - Optional peer dependency `drizzle-orm` (`^0.45.0`), needed only by `/adapters/drizzle` and `/comments/drizzle`.
396
+ - Bundle-isolation fixtures `adapters-node`, `adapters-drizzle`, `adapters-nitro`, `adapters-vue` and `headless-comments-client`: Vue is reachable only from `/adapters/vue`, Nitro only from `/server/nitro`, drizzle only from the two drizzle entries, React from none.
397
+ - Example `examples/vue-nitro-json` (`bun run proto:vue-nitro-json`): a Vue editor on a bare Nitro server with JSON-file storage.
398
+ - Framework-free models behind the Vue and React components: `createCompositeInspector` (`/composites`), `createAiSelectionFlow` (`/ai`) and the comments margin (`createMarginController`, `layoutMargin`, `marginCards` in `/comments`; orphaned threads sit at their deletion point). The document tree reports why a drop is refused and filters by title.
399
+ - Accepted children per Baustein kind, enforced in the editor: `AcceptedChildren`, `kindAccepts`, `moveIntoVerdict` (`/composites`).
400
+ - The block-lines module owning the `[id] …` line format the AI sees (`readBlockLines`, `BlockLines` and the `BLOCK_LINE_*` texts in `/ai` and `/ai/protocol`): IDs inside fenced code are ignored, `add` requires `afterId`, operations on a block inside a block another operation replaces or deletes are dropped (`AgentOpProblemReason` `inside`), and operations on blocks deleted since the document went to the model are reported as `stale` (`AgentOpOutcome`).
401
+
402
+ ### Changed (breaking)
403
+
404
+ These shipped in a minor release by mistake; the only known consumer (skaile-forge) is migrated.
405
+
406
+ - `documentBlockIds(text)` is removed from `/ai` and `/ai/protocol`: use `readBlockLines(text).ids`.
407
+ - `AgentOpContext` (`checkAgentOps`): `known: (id) => boolean` is replaced by `lines: BlockLines`; pass `lines: readBlockLines(documentChatText(editor))`.
408
+ - `CommentsSnapshot` has a required `orphanAt` (thread id → deletion position); a host's own `CommentsModel` must fill it (an empty map is valid).
409
+ - `AgentOpOutcome` and `AgentOpProblemReason` gained `stale` and `inside`; exhaustive maps over them need the new keys.
410
+
411
+ ### Notes
412
+
413
+ - `@ecsplico/editor-adapters` is deprecated and will receive no further releases. `@ecsplico/editor-adapters/vue` is now `@ecsplico/editor/adapters/vue`; every other subpath keeps its name under `@ecsplico/editor` (for example `@ecsplico/editor-adapters/adapters/json` → `@ecsplico/editor/adapters/json`, `@ecsplico/editor-adapters/server/nitro` → `@ecsplico/editor/server/nitro`, `@ecsplico/editor-adapters/anchors` → `@ecsplico/editor/anchors`). The root entry of the old package (types) is `@ecsplico/editor/adapters`.
414
+ - `./adapters/react`, `./server/nest` and `./adapters/prisma` are reserved names and not exported.
415
+
416
+ ### Fixed
417
+
418
+ - `createEditor()` without arguments threw a `TypeError` (destructuring `undefined`); `app.use(createEditor())` now installs with the default `nuxtUiKit()` as documented.
419
+
420
+ ## 2.0.0
421
+
422
+ ### Removed (breaking)
423
+
424
+ - The PrimeVue kit: `@ecsplico/editor/vue/kit/primevue` (`primeVueKit()`) and the stylesheet `@ecsplico/editor/vue/kit/primevue.css`. The Vue binding renders through Nuxt UI only; hosts that used `primeVueKit()` move to `nuxtUiKit()` (`@ecsplico/editor/vue/kit/nuxt-ui`) and import `@ecsplico/editor/vue/kit/nuxt-ui.css`.
425
+ - The Nuxt module option `kit` (`tiptapEditor: { kit: 'nuxt-ui' | 'primevue' }`). The module always adds `vue/kit/nuxt-ui.css`, patches Nuxt UI's `ui.css` so Tailwind scans the package and registers the Nuxt UI context plugin; `@nuxt/ui` must be registered before it.
426
+ - The peer dependency `primevue` (and its optional peer metadata).
427
+ - The `advanced-primevue` bundle-isolation fixture and the `examples/vue-primevue` example.
428
+
429
+ ### Changed
430
+
431
+ - `createEditor({ kit })`: `kit` is optional and defaults to `nuxtUiKit()`. `app.use(createEditor())` is enough; pass a `VueUiKit` only to render the chrome with another library.
432
+ - React: `react/styles/ui-vars.css` sets `--sk-success` from `--color-success` (the `@skaile/brand` token), falling back to the former `oklch(0.72 0.19 150)`.
433
+
434
+ ## 1.0.0
435
+
436
+ First release on npmjs as `@ecsplico/editor` (Vue: Nuxt UI or PrimeVue kit; React: shadcn/ui; optional React and Vue peers).