@dxos/plugin-markdown 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33

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 (340) hide show
  1. package/dist/lib/browser/MarkdownSettings-YCTZJL5V.mjs +32 -0
  2. package/dist/lib/browser/MarkdownSettings-YCTZJL5V.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +51 -0
  4. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-5T3SYJIP.mjs +158 -0
  6. package/dist/lib/browser/chunk-5T3SYJIP.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-FG2ZL4PE.mjs +121 -0
  8. package/dist/lib/browser/chunk-FG2ZL4PE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  10. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  11. package/dist/lib/browser/cli/index.mjs +39 -0
  12. package/dist/lib/browser/cli/index.mjs.map +7 -0
  13. package/dist/lib/browser/create-VSHCHZS4.mjs +30 -0
  14. package/dist/lib/browser/create-VSHCHZS4.mjs.map +7 -0
  15. package/dist/lib/browser/create-markdown-6LRG62W3.mjs +22 -0
  16. package/dist/lib/browser/create-markdown-6LRG62W3.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +569 -140
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/open-TKTPEN3D.mjs +21 -0
  21. package/dist/lib/browser/open-TKTPEN3D.mjs.map +7 -0
  22. package/dist/lib/browser/operations/index.mjs +14 -0
  23. package/dist/lib/browser/operations/index.mjs.map +7 -0
  24. package/dist/lib/browser/scroll-to-anchor-HWERBJKN.mjs +49 -0
  25. package/dist/lib/browser/scroll-to-anchor-HWERBJKN.mjs.map +7 -0
  26. package/dist/lib/browser/set-view-mode-Z7HGT7TY.mjs +26 -0
  27. package/dist/lib/browser/set-view-mode-Z7HGT7TY.mjs.map +7 -0
  28. package/dist/lib/browser/translations.mjs +43 -0
  29. package/dist/lib/browser/translations.mjs.map +7 -0
  30. package/dist/lib/browser/types/index.mjs +11 -5
  31. package/dist/lib/browser/update-markdown-EJSHQRSC.mjs +45 -0
  32. package/dist/lib/browser/update-markdown-EJSHQRSC.mjs.map +7 -0
  33. package/dist/lib/node-esm/MarkdownSettings-LE66LODL.mjs +33 -0
  34. package/dist/lib/node-esm/MarkdownSettings-LE66LODL.mjs.map +7 -0
  35. package/dist/lib/node-esm/blueprints/index.mjs +52 -0
  36. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-43GF7QLH.mjs +159 -0
  38. package/dist/lib/node-esm/chunk-43GF7QLH.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  40. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-IHC6DFTK.mjs +122 -0
  42. package/dist/lib/node-esm/chunk-IHC6DFTK.mjs.map +7 -0
  43. package/dist/lib/node-esm/cli/index.mjs +40 -0
  44. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  45. package/dist/lib/node-esm/create-PDW42WOY.mjs +31 -0
  46. package/dist/lib/node-esm/create-PDW42WOY.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-markdown-BBPZPLQN.mjs +23 -0
  48. package/dist/lib/node-esm/create-markdown-BBPZPLQN.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +569 -140
  50. package/dist/lib/node-esm/index.mjs.map +4 -4
  51. package/dist/lib/node-esm/meta.json +1 -1
  52. package/dist/lib/node-esm/open-B6GFN5DR.mjs +22 -0
  53. package/dist/lib/node-esm/open-B6GFN5DR.mjs.map +7 -0
  54. package/dist/lib/node-esm/operations/index.mjs +15 -0
  55. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  56. package/dist/lib/node-esm/scroll-to-anchor-CWEWWIS7.mjs +50 -0
  57. package/dist/lib/node-esm/scroll-to-anchor-CWEWWIS7.mjs.map +7 -0
  58. package/dist/lib/node-esm/set-view-mode-OMNNTSNM.mjs +27 -0
  59. package/dist/lib/node-esm/set-view-mode-OMNNTSNM.mjs.map +7 -0
  60. package/dist/lib/node-esm/translations.mjs +44 -0
  61. package/dist/lib/node-esm/translations.mjs.map +7 -0
  62. package/dist/lib/node-esm/types/index.mjs +11 -5
  63. package/dist/lib/node-esm/update-markdown-TAEAHVD2.mjs +46 -0
  64. package/dist/lib/node-esm/update-markdown-TAEAHVD2.mjs.map +7 -0
  65. package/dist/types/src/MarkdownPlugin.d.ts +2 -1
  66. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  67. package/dist/types/src/blueprints/index.d.ts +2 -0
  68. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  69. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  70. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -4
  72. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  74. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -9
  76. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  78. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/index.d.ts +9 -15
  80. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/node.d.ts +4 -0
  82. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  84. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  86. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/settings.d.ts +4 -2
  88. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/state.d.ts +4 -9
  90. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  91. package/dist/types/src/cli/index.d.ts +2 -0
  92. package/dist/types/src/cli/index.d.ts.map +1 -0
  93. package/dist/types/src/cli/plugin.d.ts +3 -0
  94. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  95. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
  96. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +52 -21
  98. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +8 -15
  100. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +33 -0
  102. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  103. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +13 -0
  104. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  105. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  106. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  107. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +94 -0
  108. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  110. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  111. package/dist/types/src/components/index.d.ts +3 -3
  112. package/dist/types/src/components/index.d.ts.map +1 -1
  113. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  114. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  115. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  116. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  117. package/dist/types/src/containers/MarkdownCard/MarkdownEditableCard.d.ts +15 -0
  118. package/dist/types/src/containers/MarkdownCard/MarkdownEditableCard.d.ts.map +1 -0
  119. package/dist/types/src/containers/MarkdownCard/index.d.ts +3 -0
  120. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  121. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +17 -0
  122. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  123. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  124. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  125. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +97 -0
  126. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  127. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  128. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  129. package/dist/types/src/containers/index.d.ts +6 -0
  130. package/dist/types/src/containers/index.d.ts.map +1 -0
  131. package/dist/types/src/hooks/index.d.ts +3 -1
  132. package/dist/types/src/hooks/index.d.ts.map +1 -1
  133. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  134. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  135. package/dist/types/src/hooks/useExtensions.d.ts +25 -0
  136. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  137. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  138. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +3 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/meta.d.ts +2 -3
  142. package/dist/types/src/meta.d.ts.map +1 -1
  143. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  144. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  145. package/dist/types/src/operations/create.d.ts +5 -0
  146. package/dist/types/src/operations/create.d.ts.map +1 -0
  147. package/dist/types/src/operations/create.test.d.ts +2 -0
  148. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  149. package/dist/types/src/operations/definitions.d.ts +64 -0
  150. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  151. package/dist/types/src/operations/index.d.ts +4 -0
  152. package/dist/types/src/operations/index.d.ts.map +1 -0
  153. package/dist/types/src/operations/open.d.ts +5 -0
  154. package/dist/types/src/operations/open.d.ts.map +1 -0
  155. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  156. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  157. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  158. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  159. package/dist/types/src/operations/update-markdown.d.ts +5 -0
  160. package/dist/types/src/operations/update-markdown.d.ts.map +1 -0
  161. package/dist/types/src/operations/update.test.d.ts +2 -0
  162. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  163. package/dist/types/src/testing.d.ts +6 -0
  164. package/dist/types/src/testing.d.ts.map +1 -0
  165. package/dist/types/src/translations.d.ts +74 -32
  166. package/dist/types/src/translations.d.ts.map +1 -1
  167. package/dist/types/src/types/Markdown.d.ts +31 -30
  168. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  169. package/dist/types/src/types/Settings.d.ts +17 -0
  170. package/dist/types/src/types/Settings.d.ts.map +1 -0
  171. package/dist/types/src/types/capabilities.d.ts +34 -0
  172. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  173. package/dist/types/src/types/events.d.ts +5 -0
  174. package/dist/types/src/types/events.d.ts.map +1 -0
  175. package/dist/types/src/types/index.d.ts +4 -2
  176. package/dist/types/src/types/index.d.ts.map +1 -1
  177. package/dist/types/src/types/types.d.ts +3 -2
  178. package/dist/types/src/types/types.d.ts.map +1 -1
  179. package/dist/types/src/util.d.ts +7 -4
  180. package/dist/types/src/util.d.ts.map +1 -1
  181. package/dist/types/src/util.test.d.ts +2 -0
  182. package/dist/types/src/util.test.d.ts.map +1 -0
  183. package/dist/types/tsconfig.tsbuildinfo +1 -1
  184. package/package.json +118 -63
  185. package/src/MarkdownPlugin.tsx +91 -102
  186. package/src/blueprints/index.ts +5 -0
  187. package/src/blueprints/markdown-blueprint.ts +43 -0
  188. package/src/capabilities/anchor-sort.ts +29 -22
  189. package/src/capabilities/app-graph-serializer.ts +52 -42
  190. package/src/capabilities/artifact-definition.ts +87 -96
  191. package/src/capabilities/blueprint-definition.ts +17 -0
  192. package/src/capabilities/index.ts +12 -9
  193. package/src/capabilities/node.ts +11 -0
  194. package/src/capabilities/operation-handler.ts +16 -0
  195. package/src/capabilities/react-surface.tsx +116 -104
  196. package/src/capabilities/settings.ts +30 -18
  197. package/src/capabilities/state.ts +41 -25
  198. package/src/cli/index.ts +5 -0
  199. package/src/cli/plugin.ts +39 -0
  200. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  201. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +64 -38
  202. package/src/components/MarkdownEditor/MarkdownEditor.tsx +251 -267
  203. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +170 -0
  204. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +47 -0
  205. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +40 -0
  206. package/src/components/MarkdownSettings/MarkdownSettings.tsx +22 -92
  207. package/src/components/MarkdownSettings/index.ts +1 -1
  208. package/src/components/index.ts +4 -5
  209. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +68 -0
  210. package/src/containers/MarkdownCard/MarkdownCard.tsx +68 -0
  211. package/src/containers/MarkdownCard/MarkdownEditableCard.tsx +42 -0
  212. package/src/containers/MarkdownCard/index.ts +6 -0
  213. package/src/containers/MarkdownCard/snippet.ts +54 -0
  214. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +135 -0
  215. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +146 -0
  216. package/src/containers/MarkdownContainer/index.ts +6 -0
  217. package/src/containers/index.ts +13 -0
  218. package/src/hooks/index.ts +3 -1
  219. package/src/hooks/useEditorMenuOptions.ts +68 -0
  220. package/src/hooks/useExtensions.tsx +262 -0
  221. package/src/hooks/useLinkQuery.ts +108 -0
  222. package/src/index.ts +4 -3
  223. package/src/meta.ts +6 -9
  224. package/src/operations/create-markdown.ts +20 -0
  225. package/src/operations/create.conversations.json +1 -0
  226. package/src/operations/create.test.ts +98 -0
  227. package/src/operations/create.ts +27 -0
  228. package/src/operations/definitions.ts +120 -0
  229. package/src/operations/index.ts +16 -0
  230. package/src/operations/open.ts +25 -0
  231. package/src/operations/scroll-to-anchor.ts +39 -0
  232. package/src/operations/set-view-mode.ts +24 -0
  233. package/src/operations/update-markdown.ts +51 -0
  234. package/src/operations/update.conversations.json +1 -0
  235. package/src/operations/update.test.ts +215 -0
  236. package/src/testing.ts +27 -0
  237. package/src/translations.ts +26 -31
  238. package/src/types/Markdown.ts +26 -31
  239. package/src/types/Settings.ts +65 -0
  240. package/src/types/capabilities.ts +51 -0
  241. package/src/types/events.ts +14 -0
  242. package/src/types/index.ts +5 -2
  243. package/src/types/types.ts +8 -3
  244. package/src/util.test.ts +44 -0
  245. package/src/util.tsx +83 -8
  246. package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs +0 -80
  247. package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs.map +0 -7
  248. package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs +0 -780
  249. package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs.map +0 -7
  250. package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs +0 -32
  251. package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs.map +0 -7
  252. package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs +0 -52
  253. package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-IKPZHFTW.mjs +0 -30
  255. package/dist/lib/browser/chunk-IKPZHFTW.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-JHH7VL52.mjs +0 -18
  257. package/dist/lib/browser/chunk-JHH7VL52.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-JMBQG2ZC.mjs +0 -50
  259. package/dist/lib/browser/chunk-JMBQG2ZC.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-JTIGSUMB.mjs +0 -80
  261. package/dist/lib/browser/chunk-JTIGSUMB.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-LMJPXTPL.mjs +0 -16
  263. package/dist/lib/browser/chunk-LMJPXTPL.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-MVL4K3OD.mjs +0 -52
  265. package/dist/lib/browser/chunk-MVL4K3OD.mjs.map +0 -7
  266. package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs +0 -60
  267. package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs.map +0 -7
  268. package/dist/lib/browser/react-surface-NL3BZR6H.mjs +0 -208
  269. package/dist/lib/browser/react-surface-NL3BZR6H.mjs.map +0 -7
  270. package/dist/lib/browser/settings-Z7ZV7SLC.mjs +0 -28
  271. package/dist/lib/browser/settings-Z7ZV7SLC.mjs.map +0 -7
  272. package/dist/lib/browser/state-ORTZIEJU.mjs +0 -37
  273. package/dist/lib/browser/state-ORTZIEJU.mjs.map +0 -7
  274. package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs +0 -81
  275. package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs.map +0 -7
  276. package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs +0 -781
  277. package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs.map +0 -7
  278. package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs +0 -33
  279. package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs.map +0 -7
  280. package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs +0 -53
  281. package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-AYWAYBAY.mjs +0 -17
  283. package/dist/lib/node-esm/chunk-AYWAYBAY.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs +0 -31
  285. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-H6TITL7A.mjs +0 -20
  287. package/dist/lib/node-esm/chunk-H6TITL7A.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-JDMMLOB6.mjs +0 -51
  289. package/dist/lib/node-esm/chunk-JDMMLOB6.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs +0 -81
  291. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs +0 -53
  293. package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs.map +0 -7
  294. package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs +0 -61
  295. package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs.map +0 -7
  296. package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs +0 -209
  297. package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs.map +0 -7
  298. package/dist/lib/node-esm/settings-UCXEWBCT.mjs +0 -29
  299. package/dist/lib/node-esm/settings-UCXEWBCT.mjs.map +0 -7
  300. package/dist/lib/node-esm/state-47WSZG54.mjs +0 -38
  301. package/dist/lib/node-esm/state-47WSZG54.mjs.map +0 -7
  302. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  303. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  304. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  305. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  306. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  307. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  308. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -42
  309. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  310. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  311. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  312. package/dist/types/src/components/MarkdownContainer.d.ts +0 -18
  313. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  314. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -9
  315. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  316. package/dist/types/src/components/Suggestions.stories.d.ts +0 -12
  317. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  318. package/dist/types/src/components/Toolbar.stories.d.ts +0 -11
  319. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  320. package/dist/types/src/events.d.ts +0 -4
  321. package/dist/types/src/events.d.ts.map +0 -1
  322. package/dist/types/src/extensions.d.ts +0 -24
  323. package/dist/types/src/extensions.d.ts.map +0 -1
  324. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  325. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  326. package/dist/types/src/types/MarkdownAction.d.ts +0 -42
  327. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  328. package/src/capabilities/capabilities.ts +0 -21
  329. package/src/capabilities/intent-resolver.ts +0 -58
  330. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -79
  331. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -75
  332. package/src/components/MarkdownCard/index.ts +0 -9
  333. package/src/components/MarkdownContainer.stories.tsx +0 -100
  334. package/src/components/MarkdownContainer.tsx +0 -255
  335. package/src/components/Suggestions.stories.tsx +0 -221
  336. package/src/components/Toolbar.stories.tsx +0 -112
  337. package/src/events.ts +0 -11
  338. package/src/extensions.tsx +0 -328
  339. package/src/hooks/useSelectCurrentThread.tsx +0 -56
  340. package/src/types/MarkdownAction.ts +0 -31
@@ -0,0 +1,108 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Option from 'effect/Option';
6
+ import { useCallback, useMemo } from 'react';
7
+
8
+ import { usePluginManager } from '@dxos/app-framework/ui';
9
+ import { AppCapabilities } from '@dxos/app-toolkit';
10
+ import { type Database, Filter, Obj, Query, Type } from '@dxos/echo';
11
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
12
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
13
+ import { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';
14
+ import { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';
15
+
16
+ import { Markdown } from '../types';
17
+
18
+ export const useLinkQuery = (db: Database.Database | undefined) => {
19
+ const { t } = useTranslation();
20
+
21
+ const manager = usePluginManager();
22
+ const resolve = useCallback(
23
+ (typename: string) =>
24
+ manager.capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
25
+ [manager],
26
+ );
27
+
28
+ const filter = useMemo(
29
+ () =>
30
+ Filter.or(
31
+ ...(db?.schemaRegistry.query({ location: ['database', 'runtime'] }).runSync() ?? [])
32
+ .filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation)
33
+ .filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
34
+ .map((schema) => Filter.typename(Type.getTypename(schema))),
35
+ ),
36
+ [db],
37
+ );
38
+
39
+ const handleLinkQuery = useCallback(
40
+ async (query?: string): Promise<EditorMenuGroup[]> => {
41
+ // A second "@" switches the link query into block-embed mode, so "@@foo" searches for "foo".
42
+ const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
43
+ const results = await db?.query(Query.select(filter)).run();
44
+
45
+ // TODO(wittjosiah): Use `Obj.Unknown` type.
46
+ const getLabel = (object: any) => {
47
+ const label = Obj.getLabel(object);
48
+ if (label) {
49
+ return label;
50
+ }
51
+
52
+ // TODO(wittjosiah): Remove metadata labels.
53
+ const type = Obj.getTypename(object)!;
54
+ const metadata = resolve(type);
55
+ return metadata.label?.(object) || ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];
56
+ };
57
+
58
+ const items =
59
+ results
60
+ ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
61
+ // TODO(wittjosiah): Remove `any` type.
62
+ .map((object: any): EditorMenuItem => {
63
+ const metadata = resolve(Obj.getTypename(object)!);
64
+ const label = toLocalizedString(getLabel(object), t);
65
+ return {
66
+ id: object.id,
67
+ label,
68
+ icon: metadata.icon,
69
+ onSelect: ({ view, head }) => {
70
+ const link = `[${label}](${Obj.getDXN(object)})`;
71
+ // "@@" inserts a block embed on its own line instead of an inline link.
72
+ if (query?.startsWith('@')) {
73
+ insertAtLineStart(view, head, `!${link}\n`);
74
+ } else {
75
+ insertAtCursor(view, head, `${link} `);
76
+ }
77
+ },
78
+ };
79
+ }) ?? [];
80
+
81
+ // Add "Create new document" option at the end.
82
+ const createItem: EditorMenuItem = {
83
+ id: 'create-document',
84
+ label: ['add-object.label', { ns: Markdown.Document.typename }],
85
+ icon: 'ph--plus--regular',
86
+ onSelect: ({ view, head }) => {
87
+ const doc = Markdown.make({ name: name || undefined });
88
+ db?.add(doc);
89
+ const label = name || t('object-name.placeholder', { ns: Markdown.Document.typename });
90
+ const link = `[${label}](${Obj.getDXN(doc)})`;
91
+ if (query?.startsWith('@')) {
92
+ insertAtLineStart(view, head, `!${link}\n`);
93
+ } else {
94
+ insertAtCursor(view, head, `${link} `);
95
+ }
96
+ },
97
+ };
98
+
99
+ return [
100
+ { id: 'echo', items },
101
+ { id: 'create', items: [createItem] },
102
+ ];
103
+ },
104
+ [db, filter, resolve, t],
105
+ );
106
+
107
+ return handleLinkQuery;
108
+ };
package/src/index.ts CHANGED
@@ -2,11 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { MarkdownCapabilities } from './capabilities';
6
- export { MarkdownEvents } from './events';
5
+ export { MarkdownCapabilities, MarkdownEvents } from './types';
7
6
 
8
7
  export * from './meta';
9
- export * from './types';
10
8
  export * from './util';
11
9
 
12
10
  export * from './MarkdownPlugin';
11
+
12
+ export { MarkdownEditor, MarkdownEditorProvider } from './components';
13
+ export type { MarkdownEditorEditorRootProps } from './components';
package/src/meta.ts CHANGED
@@ -2,21 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import { type Plugin } from '@dxos/app-framework';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
- export const meta: PluginMeta = {
9
- id: 'dxos.org/plugin/markdown',
8
+ export const meta: Plugin.Meta = {
9
+ id: 'org.dxos.plugin.markdown',
10
10
  name: 'Markdown',
11
11
  description: trim`
12
- A collaborative and extensible Markdown editor.
13
- In addition to markdown capabilities, the plugin supports collaborative in-line comments.
14
- You can use documents to extend the memory of your personal agents and add context for automated workflows.
12
+ Full-featured collaborative markdown editor with real-time editing, inline comments, and rich formatting.
13
+ Supports AI-powered editing assistance and seamlessly integrates with other workspace objects.
15
14
  `,
16
15
  icon: 'ph--text-aa--regular',
16
+ iconHue: 'indigo',
17
17
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
18
18
  screenshots: ['https://dxos.network/plugin-details-markdown-dark.png'],
19
19
  };
20
-
21
- // TODO(burdon): Workaround for suspected vitest bug? Update vitest?
22
- export const not_meta = meta;
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+
9
+ import { Markdown } from '../types';
10
+ import { CreateMarkdown } from './definitions';
11
+
12
+ const handler: Operation.WithHandler<typeof CreateMarkdown> = CreateMarkdown.pipe(
13
+ Operation.withHandler(({ name, content }) =>
14
+ Effect.succeed({
15
+ object: Markdown.make({ name, content }),
16
+ }),
17
+ ),
18
+ );
19
+
20
+ export default handler;
@@ -0,0 +1 @@
1
+ {"conversations":[{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"create","description":"Creates a new markdown document and adds it to the space.","inputSchema":{"type":"object","required":["name","content"],"properties":{"name":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false}},{"name":"open","description":"Opens and reads the contents of a new markdown document.","inputSchema":{"type":"object","required":["doc"],"properties":{"doc":{"type":"string","description":"The ID of the referenced object. Formats accepted:\n- DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.\n- space ID, object ID tuple (spaceID:objectID)\n- Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)","examples":["dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","01KG7R1ZXWFMWQ4DA1Q6TN1DG4"]}},"additionalProperties":false}},{"name":"update","description":"Applies a set of edits to the markdown document.","inputSchema":{"type":"object","required":["doc","edits"],"properties":{"doc":{"type":"string","description":"The ID of the referenced object. Formats accepted:\n- DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.\n- space ID, object ID tuple (spaceID:objectID)\n- Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)","examples":["dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","01KG7R1ZXWFMWQ4DA1Q6TN1DG4"]},"edits":{"type":"array","items":{"type":"object","required":["oldString","newString"],"properties":{"oldString":{"type":"string","description":"The text to find in the document."},"newString":{"type":"string","description":"The text to replace it with."},"replaceAll":{"type":"boolean","description":"If true, replaces all occurrences. Defaults to false (first occurrence only)."}},"additionalProperties":false},"description":"The edits to apply to the document. Each edit finds oldString and replaces it with newString."}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"## Blueprints Definitions\n\n<blueprint>\n You can create, read and update markdown documents.\n When asked to edit or update documents return updates as a set of compact diff string pairs.\n For each diff, respond with the smallest possible matching span.\n \n Example:\n ```diff\n - \"There is a tyop in this sentence.\"\n + \"There is a typo in this sentence.\"\n - \"This id good.\"\n + \"This sentence is really good.\"\n ```\n</blueprint>","options":{}},{"role":"user","content":"Create a document with a cookie recipe.","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01F1DHCfToUWf3DrTAunt5pc","modelId":"claude-opus-4-6","timestamp":"2026-05-03T07:20:13.678Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The user wants me to create a document with a cookie recipe. Let me create a nice markdown document with a classic cookie recipe.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Er0CClkIDRgCKkAy43GfB0+dbRMkfoVt2xpO0Chn5/g7c7dPprx3PV9+Z7iiBGhoRS54CpYtz+0wxdGKZKXYjkv0fAS94B7ulrYlMg9jbGF1ZGUtb3B1cy00LTY4ABIM82+vSXT30xIv+nnOGgwXMNU3B3eVy0j7PX4iMHa+zb1Aui+scRF1lWFHUaZEfOKM+3x3PS04iAsAnKViR7xaJjGR9hRLt20VAb76rSqRAShphjzGyUhuUfzRY711UzPbb+S/yj2DvsVqrCBbUUdgT9JXmPF8/Zxd/s793FKJvAHpEPTiXUJIhK+guMxr0y78KAwwtrk5PVPRrWxHsJWUSGQbXYY6JlnP6cO3z2tjF51Z5GQLOWwrlKu7jrsr932gvgdeCmLZZv9XyQN3fFkZQO3sDxXrKO8MOIFwcjta9CAYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","name":"create","providerExecuted":false,"metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"{\"name\": \"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"Classic Cho","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"colate Chip ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"Cookies\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":", \"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"content\": \"#","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" Cl","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"assic Choc","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"olate Chip","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" C","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ookies\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nA ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"timeless","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" recipe for","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" soft, ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"chewy ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"chocolate c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"hip cookies ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"at are ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"crispy","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" on the ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"edges ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"and ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gooey","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" in th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"e center.\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n## Ing","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"re","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"dients\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n- 2 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"¼ cups al","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"l-purpo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"se fl","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ou","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"r\\n- 1 tsp b","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ak","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ing soda\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"- ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"1 tsp salt\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n- 1","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" cup (2 stic","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ks) unsalte","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"d butter, so","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ftened\\n- ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"¾ cu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"p granulated","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" su","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gar\\n- ¾ cu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"p p","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"acked ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"brown sugar\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n- 2 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"large eg","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gs\\n- ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"2 tsp v","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"anilla ex","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"tract\\n- 2 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"cups s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"emi-swe","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"et c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"hocolate chi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ps\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n\\n#","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"# I","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nstruct","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"io","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ns\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n1. **P","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"reheat** th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"e oven to","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" 375°F (19","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"0°C). Lin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"e b","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"aking sheets","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" wit","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"h parchment","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" pa","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"per.\\n2. *","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"*Comb","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ine dry in","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gredients:**","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" In a mediu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"m bowl, whis","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"k toge","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ther the f","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"lour, baki","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ng soda, a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nd ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"salt. ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"Set a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"side.\\n3.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" **Cream","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" butter ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"and s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"uga","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"rs:** I","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n a lar","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ge bo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"wl, beat th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"e s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"oftene","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"d butter, g","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ran","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ulated","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" suga","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"r, and brow","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n suga","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"r toget","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"her until","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" light an","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"d fluffy","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":", ab","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"out 3–4 mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nutes.\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"4. **Add","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" egg","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"s and va","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nilla:** B","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"eat ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"in ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"the ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"eggs one a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"t a time","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":", th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"en mix in","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" the v","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"anilla","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" extract ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"until c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ombined.\\n5.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" **Mix in","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" dry in","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"edient","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"s:** Gradu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ally a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"dd the","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" flour mix","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ture to the","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" wet ingred","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ients, mixin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"g ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"on ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"low speed u","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ntil just ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"combi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ned.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" Do ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"not overmi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"x.\\n6.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" **Fold in c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"hocolate chi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ps:** Stir","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" in the ch","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"oc","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"olate chips","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" with a spat","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ula or woode","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n spoo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n.\\n7. **Sco","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"op the dou","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gh:** Drop r","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ou","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"nded tab","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"lespoo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ns of do","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ugh onto ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"the prepar","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ed ba","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"king sheets,","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" spacin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"g t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"he","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"m about","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" 2 inches","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" apart","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":".\\n8. **","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"Bake","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":":** B","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ake ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"for 9–11 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"minutes, or","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" un","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"til the ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"edge","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"s are g","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"olde","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n brown ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"but ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"the centers","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" still l","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ook slig","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"htly underdo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ne.\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n9. **C","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ool:** L","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"et the cooki","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"es cool o","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"he b","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"aking sh","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"eet f","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"or","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" 5 minu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"tes, then ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"transfer ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"to a ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"wi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"re rack t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"o coo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"l comple","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"tely.\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n#","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"# Tips\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n\\n- **Chill","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"he dough","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"** for at","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" least ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"30 min","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"utes (","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"or up to 2","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"4 hours) for","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"hicker, c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"hewier","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" cookies.\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n- **Don","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"'t o","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"verba","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ke","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"!** The","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" coo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"kies w","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ill cont","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"inue to","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" set as th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ey coo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"l.\\n- ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"For e","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"xtra f","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"lavo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"r, s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"prinkle a ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"pinch of","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" **fla","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ky ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"sea s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"alt** on to","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"p of","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" ea","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ch ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"cooki","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"e before ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"baking.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"\\n-","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" Store ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"in an airti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"gh","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"t conta","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"iner at room","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" te","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"mperature f","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"or up to","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":" 5 days.\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n**Y","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ield:*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"* ~4","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"8 cookies ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"| ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"**Prep Ti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"me:** 15 mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"n | **Ba","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"ke Time:","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"** 10 min","metadata":{}},{"type":"tool-params-delta","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","delta":"\\n\"}","metadata":{}},{"type":"tool-params-end","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","metadata":{}},{"type":"finish","reason":"tool-calls","usage":{"inputTokens":1564,"outputTokens":690,"totalTokens":2254},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"input_tokens":1564,"output_tokens":34,"server_tool_use":null,"service_tier":"standard"}}}}]},{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"create","description":"Creates a new markdown document and adds it to the space.","inputSchema":{"type":"object","required":["name","content"],"properties":{"name":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false}},{"name":"open","description":"Opens and reads the contents of a new markdown document.","inputSchema":{"type":"object","required":["doc"],"properties":{"doc":{"type":"string","description":"The ID of the referenced object. Formats accepted:\n- DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.\n- space ID, object ID tuple (spaceID:objectID)\n- Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)","examples":["dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","01KG7R1ZXWFMWQ4DA1Q6TN1DG4"]}},"additionalProperties":false}},{"name":"update","description":"Applies a set of edits to the markdown document.","inputSchema":{"type":"object","required":["doc","edits"],"properties":{"doc":{"type":"string","description":"The ID of the referenced object. Formats accepted:\n- DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.\n- space ID, object ID tuple (spaceID:objectID)\n- Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)","examples":["dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4","01KG7R1ZXWFMWQ4DA1Q6TN1DG4"]},"edits":{"type":"array","items":{"type":"object","required":["oldString","newString"],"properties":{"oldString":{"type":"string","description":"The text to find in the document."},"newString":{"type":"string","description":"The text to replace it with."},"replaceAll":{"type":"boolean","description":"If true, replaces all occurrences. Defaults to false (first occurrence only)."}},"additionalProperties":false},"description":"The edits to apply to the document. Each edit finds oldString and replaces it with newString."}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"## Blueprints Definitions\n\n<blueprint>\n You can create, read and update markdown documents.\n When asked to edit or update documents return updates as a set of compact diff string pairs.\n For each diff, respond with the smallest possible matching span.\n \n Example:\n ```diff\n - \"There is a tyop in this sentence.\"\n + \"There is a typo in this sentence.\"\n - \"This id good.\"\n + \"This sentence is really good.\"\n ```\n</blueprint>","options":{}},{"role":"user","content":"Create a document with a cookie recipe.","options":{}},{"role":"assistant","content":[{"type":"reasoning","text":"The user wants me to create a document with a cookie recipe. Let me create a nice markdown document with a classic cookie recipe.","options":{}},{"type":"tool-call","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","name":"create","params":{"name":"Classic Chocolate Chip Cookies","content":"# Classic Chocolate Chip Cookies\n\nA timeless recipe for soft, chewy chocolate chip cookies that are crispy on the edges and gooey in the center.\n\n## Ingredients\n\n- 2 ¼ cups all-purpose flour\n- 1 tsp baking soda\n- 1 tsp salt\n- 1 cup (2 sticks) unsalted butter, softened\n- ¾ cup granulated sugar\n- ¾ cup packed brown sugar\n- 2 large eggs\n- 2 tsp vanilla extract\n- 2 cups semi-sweet chocolate chips\n\n## Instructions\n\n1. **Preheat** the oven to 375°F (190°C). Line baking sheets with parchment paper.\n2. **Combine dry ingredients:** In a medium bowl, whisk together the flour, baking soda, and salt. Set aside.\n3. **Cream butter and sugars:** In a large bowl, beat the softened butter, granulated sugar, and brown sugar together until light and fluffy, about 3–4 minutes.\n4. **Add eggs and vanilla:** Beat in the eggs one at a time, then mix in the vanilla extract until combined.\n5. **Mix in dry ingredients:** Gradually add the flour mixture to the wet ingredients, mixing on low speed until just combined. Do not overmix.\n6. **Fold in chocolate chips:** Stir in the chocolate chips with a spatula or wooden spoon.\n7. **Scoop the dough:** Drop rounded tablespoons of dough onto the prepared baking sheets, spacing them about 2 inches apart.\n8. **Bake:** Bake for 9–11 minutes, or until the edges are golden brown but the centers still look slightly underdone.\n9. **Cool:** Let the cookies cool on the baking sheet for 5 minutes, then transfer to a wire rack to cool completely.\n\n## Tips\n\n- **Chill the dough** for at least 30 minutes (or up to 24 hours) for thicker, chewier cookies.\n- **Don't overbake!** The cookies will continue to set as they cool.\n- For extra flavor, sprinkle a pinch of **flaky sea salt** on top of each cookie before baking.\n- Store in an airtight container at room temperature for up to 5 days.\n\n**Yield:** ~48 cookies | **Prep Time:** 15 min | **Bake Time:** 10 min\n"},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_01CdPcLdDgCGJ8kiHBjMtfWP","name":"create","isFailure":false,"result":{"_id":"Exit","_tag":"Success","value":{"id":"dxn:echo:BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U:01JGFJJZ00G0WKQSJGMAKCNTJ6"}},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01DSZ37AGqiyUrLBuKPDUkQA","modelId":"claude-opus-4-6","timestamp":"2026-05-03T07:20:25.201Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" document was created successfully.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"EuEBClkIDRgCKkDYqIGzymGgehnxneo7UHzpnlm8a0tPpXlILeVnfXH6ESWFT2yPNAKo7VXEFmHMiD7GK+j83i4I8Ok4es2dgweUMg9jbGF1ZGUtb3B1cy00LTY4ABIMFLwl3vY963IwqkouGgwijVHPdJ4oSW1CdvQiMIEsYY9tEN8r1R9sItwhYrn16tAKkO1XvdVvmJRlDD7qM4MXFCZjRZpxyA1R0r3uQCo2Z+X4tcWI1KGSRgLmK8nxjycBBE9rCuG02DetkepTKTyAAwXhmc0nP0rAPZw2aFQPgxgmNZ4nGAE="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"text-start","id":"1","metadata":{}},{"type":"text-delta","id":"1","delta":"Your cookie recipe document has been created! 🍪 It includes","metadata":{}},{"type":"text-delta","id":"1","delta":":\n\n- **Title:** Classic Chocolate Chip Cookies\n- **Ingredients** list with all the essentials (","metadata":{}},{"type":"text-delta","id":"1","delta":"flour, butter, sugars, eggs, vanilla, and chocolate chips)\n- **Step-by-step instructions** for mixing, scooping, and baking\n- **","metadata":{}},{"type":"text-delta","id":"1","delta":"Helpful tips** like chilling the dough for thicker cookies and adding flaky sea salt for extra flavor\n\nLet","metadata":{}},{"type":"text-delta","id":"1","delta":" me know if you'd like to make any changes — like swapping in a different type of cookie or","metadata":{}},{"type":"text-delta","id":"1","delta":" adjusting the recipe!","metadata":{}},{"type":"text-end","id":"1","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2297,"outputTokens":154,"totalTokens":2451},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"input_tokens":2297,"output_tokens":8,"server_tool_use":null,"service_tier":"standard"}}}}]}]}
@@ -0,0 +1,98 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { MemoizedAiService } from '@dxos/ai/testing';
9
+ import { SpaceProperties } from '@dxos/client-protocol';
10
+ import { Blueprint } from '@dxos/compute';
11
+ import { Operation } from '@dxos/compute';
12
+ import { DXN, Database, Feed, Obj, Query } from '@dxos/echo';
13
+ import { Collection } from '@dxos/echo';
14
+ import { TestHelpers } from '@dxos/effect/testing';
15
+ import { AgentService } from '@dxos/functions-runtime';
16
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
17
+ import { invariant } from '@dxos/invariant';
18
+ import { ObjectId } from '@dxos/keys';
19
+ import { Markdown } from '@dxos/plugin-markdown/types';
20
+ import { HasSubject } from '@dxos/types';
21
+
22
+ import { WithProperties } from '#testing';
23
+
24
+ import MarkdownBlueprint from '../blueprints/markdown-blueprint';
25
+ import { Create } from './definitions';
26
+ import { MarkdownOperationHandlerSet } from './index';
27
+
28
+ ObjectId.dangerouslyDisableRandomness();
29
+
30
+ const TestLayer = AssistantTestLayer({
31
+ aiServicePreset: 'edge-remote',
32
+ operationHandlers: MarkdownOperationHandlerSet,
33
+ types: [
34
+ SpaceProperties,
35
+ Collection.Collection,
36
+ Blueprint.Blueprint,
37
+ Markdown.Document,
38
+ HasSubject.HasSubject,
39
+ Feed.Feed,
40
+ ],
41
+ blueprints: [MarkdownBlueprint.make()],
42
+ tracing: 'pretty',
43
+ });
44
+
45
+ describe('create', () => {
46
+ it.effect(
47
+ 'call a function to create a markdown document',
48
+ Effect.fnUntraced(
49
+ function* (_) {
50
+ const name = 'BlueYard';
51
+ const content = 'Founders and portfolio of BlueYard.';
52
+ const result = yield* Operation.invoke(Create, {
53
+ name,
54
+ content,
55
+ });
56
+
57
+ const doc = yield* Database.resolve(DXN.parse(result.id), Markdown.Document);
58
+ expect(doc.name).toBe(name);
59
+ const text = yield* Database.load(doc.content);
60
+ expect(text.content).toBe(content);
61
+ },
62
+ WithProperties,
63
+ Effect.provide(TestLayer),
64
+ TestHelpers.provideTestContext,
65
+ ),
66
+ );
67
+
68
+ it.effect(
69
+ 'create a markdown document',
70
+ Effect.fnUntraced(
71
+ function* (_) {
72
+ const agent = yield* AgentService.createSession({
73
+ blueprints: [MarkdownBlueprint.make()],
74
+ });
75
+ yield* agent.submitPrompt('Create a document with a cookie recipe.');
76
+ yield* agent.waitForCompletion();
77
+
78
+ {
79
+ const docs = yield* Database.runQuery(Query.type(Markdown.Document));
80
+ if (docs.length !== 1) {
81
+ throw new Error(`Expected 1 document; got ${docs.length}: ${docs.map((_) => _.name)}`);
82
+ }
83
+
84
+ const doc = docs[0];
85
+ invariant(Obj.instanceOf(Markdown.Document, doc));
86
+ console.log({
87
+ name: doc.name,
88
+ content: yield* Database.load(doc.content).pipe(Effect.map((_) => _.content)),
89
+ });
90
+ }
91
+ },
92
+ WithProperties,
93
+ Effect.provide(TestLayer),
94
+ TestHelpers.provideTestContext,
95
+ ),
96
+ MemoizedAiService.isGenerationEnabled() ? 240_000 : 30_000,
97
+ );
98
+ });
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+ import { Obj } from '@dxos/echo';
9
+ import { CollectionModel } from '@dxos/schema';
10
+
11
+ import { Markdown } from '../types';
12
+ import { Create } from './definitions';
13
+
14
+ const handler: Operation.WithHandler<typeof Create> = Create.pipe(
15
+ Operation.withHandler(
16
+ Effect.fn(function* ({ name, content }) {
17
+ const object = Markdown.make({ name, content });
18
+ yield* CollectionModel.add({ object });
19
+
20
+ return {
21
+ id: Obj.getDXN(object).toString(),
22
+ };
23
+ }),
24
+ ),
25
+ );
26
+
27
+ export default handler;
@@ -0,0 +1,120 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { Operation } from '@dxos/compute';
9
+ import { Database, Ref } from '@dxos/echo';
10
+ import { EditorViewMode } from '@dxos/ui-editor/types';
11
+ import { trim } from '@dxos/util';
12
+
13
+ import { meta } from '#meta';
14
+
15
+ import { Markdown } from '../types';
16
+
17
+ const MARKDOWN_OPERATION = `${meta.id}.operation`;
18
+
19
+ const Edit = Schema.Struct({
20
+ oldString: Schema.String.annotations({
21
+ description: 'The text to find in the document.',
22
+ }),
23
+ newString: Schema.String.annotations({
24
+ description: 'The text to replace it with.',
25
+ }),
26
+ replaceAll: Schema.optional(Schema.Boolean).annotations({
27
+ description: 'If true, replaces all occurrences. Defaults to false (first occurrence only).',
28
+ }),
29
+ });
30
+
31
+ export const Create = Operation.make({
32
+ meta: {
33
+ key: 'org.dxos.function.markdown.create',
34
+ name: 'Create',
35
+ description: 'Creates a new markdown document and adds it to the space.',
36
+ },
37
+ input: Schema.Struct({
38
+ name: Schema.String,
39
+ content: Schema.String,
40
+ }),
41
+ output: Schema.Struct({
42
+ id: Schema.String.annotations({
43
+ description: 'The DXN of the created document.',
44
+ }),
45
+ }),
46
+ services: [Database.Service],
47
+ });
48
+
49
+ export const CreateMarkdown = Operation.make({
50
+ meta: { key: `${MARKDOWN_OPERATION}.create`, name: 'Create Markdown Document' },
51
+ services: [Capability.Service],
52
+ input: Schema.Struct({
53
+ name: Schema.optional(Schema.String),
54
+ content: Schema.optional(Schema.String),
55
+ }),
56
+ output: Schema.Struct({
57
+ object: Markdown.Document,
58
+ }),
59
+ });
60
+
61
+ export const Open = Operation.make({
62
+ meta: {
63
+ key: 'org.dxos.function.markdown.open',
64
+ name: 'Open',
65
+ description: 'Opens and reads the contents of a new markdown document.',
66
+ },
67
+ input: Schema.Struct({
68
+ doc: Ref.Ref(Markdown.Document).annotations({
69
+ description: 'The ID of the markdown document.',
70
+ }),
71
+ }),
72
+ output: Schema.Struct({
73
+ content: Schema.String,
74
+ }),
75
+ services: [Database.Service],
76
+ });
77
+
78
+ export const ScrollToAnchor = Operation.make({
79
+ meta: { key: `${MARKDOWN_OPERATION}.scroll-to-anchor`, name: 'Scroll To Anchor' },
80
+ services: [Capability.Service],
81
+ input: Schema.Struct({
82
+ subject: Schema.String.annotations({ description: 'Attendable ID of the markdown editor.' }),
83
+ cursor: Schema.String.annotations({ description: 'Cursor position to scroll to.' }),
84
+ ref: Schema.optional(Schema.String.annotations({ description: 'Reference ID (e.g. thread ID).' })),
85
+ }),
86
+ output: Schema.Void,
87
+ });
88
+
89
+ // TODO(wittjosiah): This appears to be unused.
90
+ export const SetViewMode = Operation.make({
91
+ meta: { key: `${MARKDOWN_OPERATION}.set-view-mode`, name: 'Set View Mode' },
92
+ services: [Capability.Service],
93
+ input: Schema.Struct({
94
+ id: Schema.String,
95
+ viewMode: EditorViewMode,
96
+ }),
97
+ output: Schema.Void,
98
+ });
99
+
100
+ export const Update = Operation.make({
101
+ meta: {
102
+ key: 'org.dxos.function.markdown.update',
103
+ name: 'Update',
104
+ description: trim`
105
+ Applies a set of edits to the markdown document.
106
+ `,
107
+ },
108
+ input: Schema.Struct({
109
+ doc: Ref.Ref(Markdown.Document).annotations({
110
+ description: 'The ID of the markdown document.',
111
+ }),
112
+ edits: Schema.Array(Edit).annotations({
113
+ description: 'The edits to apply to the document. Each edit finds oldString and replaces it with newString.',
114
+ }),
115
+ }),
116
+ output: Schema.Struct({
117
+ newContent: Schema.String,
118
+ }),
119
+ services: [Database.Service],
120
+ });
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { OperationHandlerSet } from '@dxos/compute';
6
+
7
+ export * as MarkdownOperation from './definitions';
8
+
9
+ export const MarkdownOperationHandlerSet = OperationHandlerSet.lazy(
10
+ () => import('./create'),
11
+ () => import('./create-markdown'),
12
+ () => import('./open'),
13
+ () => import('./scroll-to-anchor'),
14
+ () => import('./set-view-mode'),
15
+ () => import('./update-markdown'),
16
+ );
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+ import { Database } from '@dxos/echo';
9
+
10
+ import { Open } from './definitions';
11
+
12
+ const handler: Operation.WithHandler<typeof Open> = Open.pipe(
13
+ Operation.withHandler(
14
+ Effect.fn(function* ({ doc }) {
15
+ const { content } = yield* doc.pipe(
16
+ Database.load,
17
+ Effect.map((_) => _.content),
18
+ Effect.flatMap(Database.load),
19
+ );
20
+ return { content };
21
+ }),
22
+ ),
23
+ );
24
+
25
+ export default handler;
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorView } from '@codemirror/view';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { Capability } from '@dxos/app-framework';
9
+ import { Operation } from '@dxos/compute';
10
+ import { Cursor, setSelection } from '@dxos/ui-editor';
11
+
12
+ import { MarkdownCapabilities } from '../types';
13
+ import { ScrollToAnchor } from './definitions';
14
+
15
+ const handler: Operation.WithHandler<typeof ScrollToAnchor> = ScrollToAnchor.pipe(
16
+ Operation.withHandler(
17
+ Effect.fnUntraced(function* ({ subject, cursor }) {
18
+ const editorViews = yield* Capability.get(MarkdownCapabilities.EditorViews);
19
+ const entry = editorViews.get(subject);
20
+ if (!entry) {
21
+ return;
22
+ }
23
+ const range = Cursor.getRangeFromCursor(entry.view.state, cursor);
24
+ if (range) {
25
+ const selection = entry.view.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;
26
+ const effects: any[] = [EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 })];
27
+ if (selection) {
28
+ effects.push(setSelection.of({ current: entry.documentId }));
29
+ }
30
+ entry.view.dispatch({
31
+ effects,
32
+ selection: selection ? { anchor: range.from } : undefined,
33
+ });
34
+ }
35
+ }),
36
+ ),
37
+ );
38
+
39
+ export default handler;