@dxos/plugin-markdown 0.8.4-main.70d3990 → 0.8.4-main.7996785055

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 (452) hide show
  1. package/dist/lib/browser/MarkdownCard-ZHQBD4AV.mjs +122 -0
  2. package/dist/lib/browser/MarkdownCard-ZHQBD4AV.mjs.map +7 -0
  3. package/dist/lib/browser/MarkdownContainer-XEUOYBPA.mjs +125 -0
  4. package/dist/lib/browser/MarkdownContainer-XEUOYBPA.mjs.map +7 -0
  5. package/dist/lib/browser/MarkdownSettings-OD7AJSSJ.mjs +106 -0
  6. package/dist/lib/browser/MarkdownSettings-OD7AJSSJ.mjs.map +7 -0
  7. package/dist/lib/browser/{anchor-sort-3MYLO74J.mjs → anchor-sort-PSCEA6EJ.mjs} +9 -7
  8. package/dist/lib/browser/anchor-sort-PSCEA6EJ.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-serializer-DAVFEX7R.mjs +63 -0
  10. package/dist/lib/browser/app-graph-serializer-DAVFEX7R.mjs.map +7 -0
  11. package/dist/lib/browser/blueprint-definition-LHVNOMJT.mjs +19 -0
  12. package/dist/lib/browser/blueprint-definition-LHVNOMJT.mjs.map +7 -0
  13. package/dist/lib/browser/blueprints/index.mjs +10 -0
  14. package/dist/lib/browser/chunk-5VT6IW5B.mjs +84 -0
  15. package/dist/lib/browser/chunk-5VT6IW5B.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-NXT2E2BG.mjs → chunk-CJSWKCKU.mjs} +7 -4
  17. package/dist/lib/browser/chunk-CJSWKCKU.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-G6BRWY3G.mjs +158 -0
  19. package/dist/lib/browser/chunk-G6BRWY3G.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-M2XFCKXA.mjs +8 -0
  21. package/dist/lib/browser/chunk-M2XFCKXA.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-BQTYJOFB.mjs → chunk-RYZHVXZ5.mjs} +2 -2
  23. package/dist/lib/browser/chunk-RYZHVXZ5.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-XWYF5LFE.mjs +8 -0
  25. package/dist/lib/browser/chunk-XWYF5LFE.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-YALLVET2.mjs +757 -0
  27. package/dist/lib/browser/chunk-YALLVET2.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-ZN75YHSV.mjs +50 -0
  29. package/dist/lib/browser/chunk-ZN75YHSV.mjs.map +7 -0
  30. package/dist/lib/browser/cli/index.mjs +44 -0
  31. package/dist/lib/browser/cli/index.mjs.map +7 -0
  32. package/dist/lib/browser/create-QD27F6E7.mjs +30 -0
  33. package/dist/lib/browser/create-QD27F6E7.mjs.map +7 -0
  34. package/dist/lib/browser/create-markdown-LEAJPLHT.mjs +22 -0
  35. package/dist/lib/browser/create-markdown-LEAJPLHT.mjs.map +7 -0
  36. package/dist/lib/browser/index.mjs +132 -128
  37. package/dist/lib/browser/index.mjs.map +4 -4
  38. package/dist/lib/browser/meta.json +1 -1
  39. package/dist/lib/browser/open-YDABYPCA.mjs +21 -0
  40. package/dist/lib/browser/open-YDABYPCA.mjs.map +7 -0
  41. package/dist/lib/browser/operation-handler-W3QXMMMQ.mjs +17 -0
  42. package/dist/lib/browser/operation-handler-W3QXMMMQ.mjs.map +7 -0
  43. package/dist/lib/browser/operations/index.mjs +13 -0
  44. package/dist/lib/browser/react-surface-N7FV3PXH.mjs +120 -0
  45. package/dist/lib/browser/react-surface-N7FV3PXH.mjs.map +7 -0
  46. package/dist/lib/browser/scroll-to-anchor-3CGV3XI7.mjs +49 -0
  47. package/dist/lib/browser/scroll-to-anchor-3CGV3XI7.mjs.map +7 -0
  48. package/dist/lib/browser/set-view-mode-XLD3RXW4.mjs +26 -0
  49. package/dist/lib/browser/set-view-mode-XLD3RXW4.mjs.map +7 -0
  50. package/dist/lib/browser/settings-3UMXG4TP.mjs +38 -0
  51. package/dist/lib/browser/settings-3UMXG4TP.mjs.map +7 -0
  52. package/dist/lib/browser/state-IYKJ6EV3.mjs +48 -0
  53. package/dist/lib/browser/state-IYKJ6EV3.mjs.map +7 -0
  54. package/dist/lib/browser/types/index.mjs +8 -4
  55. package/dist/lib/browser/update-WKAMI4AD.mjs +45 -0
  56. package/dist/lib/browser/update-WKAMI4AD.mjs.map +7 -0
  57. package/dist/lib/node-esm/MarkdownCard-VB3NHVX4.mjs +123 -0
  58. package/dist/lib/node-esm/MarkdownCard-VB3NHVX4.mjs.map +7 -0
  59. package/dist/lib/node-esm/MarkdownContainer-25WFZLCC.mjs +126 -0
  60. package/dist/lib/node-esm/MarkdownContainer-25WFZLCC.mjs.map +7 -0
  61. package/dist/lib/node-esm/MarkdownSettings-U7GJ4OP3.mjs +107 -0
  62. package/dist/lib/node-esm/MarkdownSettings-U7GJ4OP3.mjs.map +7 -0
  63. package/dist/lib/node-esm/{anchor-sort-W4HCTYUQ.mjs → anchor-sort-6GD4SGQL.mjs} +9 -7
  64. package/dist/lib/node-esm/anchor-sort-6GD4SGQL.mjs.map +7 -0
  65. package/dist/lib/node-esm/app-graph-serializer-JURUUUBI.mjs +64 -0
  66. package/dist/lib/node-esm/app-graph-serializer-JURUUUBI.mjs.map +7 -0
  67. package/dist/lib/node-esm/blueprint-definition-3LUZEJ4Z.mjs +20 -0
  68. package/dist/lib/node-esm/blueprint-definition-3LUZEJ4Z.mjs.map +7 -0
  69. package/dist/lib/node-esm/blueprints/index.mjs +11 -0
  70. package/dist/lib/node-esm/chunk-6LHNAAMP.mjs +159 -0
  71. package/dist/lib/node-esm/chunk-6LHNAAMP.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-CRUJMQR2.mjs +758 -0
  73. package/dist/lib/node-esm/chunk-CRUJMQR2.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-SHAMSMKQ.mjs → chunk-CW4FZNMZ.mjs} +2 -2
  75. package/dist/lib/node-esm/chunk-CW4FZNMZ.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-EPNCYA73.mjs +85 -0
  77. package/dist/lib/node-esm/chunk-EPNCYA73.mjs.map +7 -0
  78. package/dist/lib/node-esm/{chunk-I5JSQBPI.mjs → chunk-FC3GPLJG.mjs} +7 -4
  79. package/dist/lib/node-esm/chunk-FC3GPLJG.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-G6W4DJBM.mjs +51 -0
  81. package/dist/lib/node-esm/chunk-G6W4DJBM.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-JLOCBILO.mjs +10 -0
  83. package/dist/lib/node-esm/chunk-JLOCBILO.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-YWQQYV76.mjs +10 -0
  85. package/dist/lib/node-esm/chunk-YWQQYV76.mjs.map +7 -0
  86. package/dist/lib/node-esm/cli/index.mjs +45 -0
  87. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  88. package/dist/lib/node-esm/create-X7H4LYI5.mjs +31 -0
  89. package/dist/lib/node-esm/create-X7H4LYI5.mjs.map +7 -0
  90. package/dist/lib/node-esm/create-markdown-7POKQDVQ.mjs +23 -0
  91. package/dist/lib/node-esm/create-markdown-7POKQDVQ.mjs.map +7 -0
  92. package/dist/lib/node-esm/index.mjs +132 -128
  93. package/dist/lib/node-esm/index.mjs.map +4 -4
  94. package/dist/lib/node-esm/meta.json +1 -1
  95. package/dist/lib/node-esm/open-FZVFWXC7.mjs +22 -0
  96. package/dist/lib/node-esm/open-FZVFWXC7.mjs.map +7 -0
  97. package/dist/lib/node-esm/operation-handler-TP26H7QE.mjs +18 -0
  98. package/dist/lib/node-esm/operation-handler-TP26H7QE.mjs.map +7 -0
  99. package/dist/lib/node-esm/operations/index.mjs +14 -0
  100. package/dist/lib/node-esm/react-surface-XSKLSF6A.mjs +121 -0
  101. package/dist/lib/node-esm/react-surface-XSKLSF6A.mjs.map +7 -0
  102. package/dist/lib/node-esm/scroll-to-anchor-KWBJLM5Q.mjs +50 -0
  103. package/dist/lib/node-esm/scroll-to-anchor-KWBJLM5Q.mjs.map +7 -0
  104. package/dist/lib/node-esm/set-view-mode-FFEKYLU3.mjs +27 -0
  105. package/dist/lib/node-esm/set-view-mode-FFEKYLU3.mjs.map +7 -0
  106. package/dist/lib/node-esm/settings-UAN22O42.mjs +39 -0
  107. package/dist/lib/node-esm/settings-UAN22O42.mjs.map +7 -0
  108. package/dist/lib/node-esm/state-62IBFPTK.mjs +49 -0
  109. package/dist/lib/node-esm/state-62IBFPTK.mjs.map +7 -0
  110. package/dist/lib/node-esm/types/index.mjs +8 -4
  111. package/dist/lib/node-esm/update-WPEFBY4M.mjs +46 -0
  112. package/dist/lib/node-esm/update-WPEFBY4M.mjs.map +7 -0
  113. package/dist/types/src/MarkdownPlugin.d.ts +2 -1
  114. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  115. package/dist/types/src/blueprints/index.d.ts +2 -0
  116. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  117. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  118. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +6 -0
  120. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/anchor-sort/index.d.ts +3 -0
  122. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +5 -0
  124. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +3 -0
  126. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +5 -0
  128. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/artifact-definition/index.d.ts +3 -0
  130. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
  132. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  134. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/index.d.ts +6 -13
  136. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  137. package/dist/types/src/capabilities/operation-handler/index.d.ts +4 -0
  138. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +6 -0
  140. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  141. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  142. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  143. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  144. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  145. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  146. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  147. package/dist/types/src/capabilities/settings/settings.d.ts +7 -0
  148. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  149. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  150. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  151. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  152. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  153. package/dist/types/src/cli/index.d.ts +2 -0
  154. package/dist/types/src/cli/index.d.ts.map +1 -0
  155. package/dist/types/src/cli/plugin.d.ts +3 -0
  156. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  157. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +1 -1
  158. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  159. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +17 -11
  160. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  161. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +2 -2
  162. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  163. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +16 -10
  164. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  165. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +10 -5
  166. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  167. package/dist/types/src/components/index.d.ts +1 -5
  168. package/dist/types/src/components/index.d.ts.map +1 -1
  169. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  170. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  171. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  172. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  173. package/dist/types/src/{components → containers}/MarkdownCard/index.d.ts +0 -1
  174. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  175. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +15 -0
  176. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  177. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +30 -0
  178. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  179. package/dist/types/src/{components → containers/MarkdownContainer}/MarkdownContainer.stories.d.ts +31 -1
  180. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  181. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  182. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/MarkdownSettings/MarkdownSettings.d.ts +8 -0
  184. package/dist/types/src/containers/MarkdownSettings/MarkdownSettings.d.ts.map +1 -0
  185. package/dist/types/src/containers/MarkdownSettings/index.d.ts +3 -0
  186. package/dist/types/src/containers/MarkdownSettings/index.d.ts.map +1 -0
  187. package/dist/types/src/containers/index.d.ts +6 -0
  188. package/dist/types/src/containers/index.d.ts.map +1 -0
  189. package/dist/types/src/hooks/index.d.ts +0 -1
  190. package/dist/types/src/hooks/index.d.ts.map +1 -1
  191. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useExtensions.d.ts +7 -5
  193. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  194. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  195. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  196. package/dist/types/src/index.d.ts +2 -2
  197. package/dist/types/src/index.d.ts.map +1 -1
  198. package/dist/types/src/meta.d.ts +2 -2
  199. package/dist/types/src/meta.d.ts.map +1 -1
  200. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  201. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  202. package/dist/types/src/operations/create.d.ts +5 -0
  203. package/dist/types/src/operations/create.d.ts.map +1 -0
  204. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  205. package/dist/types/src/operations/definitions.d.ts +61 -0
  206. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  207. package/dist/types/src/operations/index.d.ts +4 -0
  208. package/dist/types/src/operations/index.d.ts.map +1 -0
  209. package/dist/types/src/operations/open.d.ts +5 -0
  210. package/dist/types/src/operations/open.d.ts.map +1 -0
  211. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  212. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  213. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  214. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  215. package/dist/types/src/operations/update.d.ts +5 -0
  216. package/dist/types/src/operations/update.d.ts.map +1 -0
  217. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  218. package/dist/types/src/testing.d.ts +2 -2
  219. package/dist/types/src/testing.d.ts.map +1 -1
  220. package/dist/types/src/translations.d.ts +30 -0
  221. package/dist/types/src/translations.d.ts.map +1 -1
  222. package/dist/types/src/types/Markdown.d.ts +13 -13
  223. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  224. package/dist/types/src/types/capabilities.d.ts +34 -0
  225. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  226. package/dist/types/src/types/events.d.ts +5 -0
  227. package/dist/types/src/types/events.d.ts.map +1 -0
  228. package/dist/types/src/types/index.d.ts +2 -1
  229. package/dist/types/src/types/index.d.ts.map +1 -1
  230. package/dist/types/src/types/types.d.ts +2 -2
  231. package/dist/types/src/types/types.d.ts.map +1 -1
  232. package/dist/types/src/util.d.ts +4 -1
  233. package/dist/types/src/util.d.ts.map +1 -1
  234. package/dist/types/src/util.test.d.ts +2 -0
  235. package/dist/types/src/util.test.d.ts.map +1 -0
  236. package/dist/types/tsconfig.tsbuildinfo +1 -1
  237. package/package.json +98 -67
  238. package/src/MarkdownPlugin.tsx +70 -79
  239. package/src/blueprints/index.ts +5 -0
  240. package/src/blueprints/markdown-blueprint.ts +44 -0
  241. package/src/capabilities/anchor-sort/anchor-sort.ts +37 -0
  242. package/src/capabilities/anchor-sort/index.ts +7 -0
  243. package/src/capabilities/app-graph-serializer/app-graph-serializer.ts +64 -0
  244. package/src/capabilities/app-graph-serializer/index.ts +7 -0
  245. package/src/capabilities/artifact-definition/artifact-definition.ts +110 -0
  246. package/src/capabilities/artifact-definition/index.ts +7 -0
  247. package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
  248. package/src/capabilities/blueprint-definition/index.ts +7 -0
  249. package/src/capabilities/index.ts +6 -11
  250. package/src/capabilities/operation-handler/index.ts +11 -0
  251. package/src/capabilities/operation-handler/operation-handler.ts +16 -0
  252. package/src/capabilities/react-surface/index.ts +7 -0
  253. package/src/capabilities/react-surface/react-surface.tsx +120 -0
  254. package/src/capabilities/settings/index.ts +7 -0
  255. package/src/capabilities/settings/settings.ts +37 -0
  256. package/src/capabilities/state/index.ts +7 -0
  257. package/src/capabilities/state/state.ts +47 -0
  258. package/src/cli/index.ts +5 -0
  259. package/src/cli/plugin.ts +40 -0
  260. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  261. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +35 -36
  262. package/src/components/MarkdownEditor/MarkdownEditor.tsx +74 -44
  263. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +62 -25
  264. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +48 -53
  265. package/src/components/index.ts +2 -9
  266. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +68 -0
  267. package/src/containers/MarkdownCard/MarkdownCard.tsx +57 -0
  268. package/src/{components → containers}/MarkdownCard/index.ts +0 -2
  269. package/src/containers/MarkdownCard/snippet.ts +75 -0
  270. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +133 -0
  271. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +134 -0
  272. package/src/containers/MarkdownContainer/index.ts +6 -0
  273. package/src/containers/MarkdownSettings/MarkdownSettings.tsx +122 -0
  274. package/src/containers/MarkdownSettings/index.ts +7 -0
  275. package/src/containers/index.ts +11 -0
  276. package/src/hooks/index.ts +0 -1
  277. package/src/hooks/useEditorMenuOptions.ts +10 -13
  278. package/src/hooks/useExtensions.tsx +88 -106
  279. package/src/hooks/useLinkQuery.ts +16 -14
  280. package/src/index.ts +3 -2
  281. package/src/meta.ts +3 -3
  282. package/src/operations/create-markdown.ts +21 -0
  283. package/src/operations/create.conversations.json +1 -0
  284. package/src/operations/create.test.ts +93 -0
  285. package/src/operations/create.ts +27 -0
  286. package/src/operations/definitions.ts +119 -0
  287. package/src/operations/index.ts +16 -0
  288. package/src/operations/open.ts +25 -0
  289. package/src/operations/scroll-to-anchor.ts +40 -0
  290. package/src/operations/set-view-mode.ts +25 -0
  291. package/src/operations/update.conversations.json +1 -0
  292. package/src/operations/update.test.ts +216 -0
  293. package/src/operations/update.ts +51 -0
  294. package/src/testing.ts +4 -4
  295. package/src/translations.ts +3 -0
  296. package/src/types/Markdown.ts +15 -7
  297. package/src/types/capabilities.ts +50 -0
  298. package/src/types/events.ts +14 -0
  299. package/src/types/index.ts +2 -1
  300. package/src/types/types.ts +3 -2
  301. package/src/util.test.ts +44 -0
  302. package/src/util.tsx +76 -6
  303. package/dist/lib/browser/MarkdownCard-TC3GGUSX.mjs +0 -12
  304. package/dist/lib/browser/MarkdownContainer-YF22DV4M.mjs +0 -15
  305. package/dist/lib/browser/anchor-sort-3MYLO74J.mjs.map +0 -7
  306. package/dist/lib/browser/app-graph-serializer-BZJ4TQOE.mjs +0 -51
  307. package/dist/lib/browser/app-graph-serializer-BZJ4TQOE.mjs.map +0 -7
  308. package/dist/lib/browser/blueprint-definition-HED54GGW.mjs +0 -13
  309. package/dist/lib/browser/chunk-3IPVL3E4.mjs +0 -20
  310. package/dist/lib/browser/chunk-3IPVL3E4.mjs.map +0 -7
  311. package/dist/lib/browser/chunk-BE3IO2CM.mjs +0 -150
  312. package/dist/lib/browser/chunk-BE3IO2CM.mjs.map +0 -7
  313. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-CN35HEBX.mjs +0 -79
  315. package/dist/lib/browser/chunk-CN35HEBX.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-DLZ5RR3P.mjs +0 -96
  317. package/dist/lib/browser/chunk-DLZ5RR3P.mjs.map +0 -7
  318. package/dist/lib/browser/chunk-IBCHVMZW.mjs +0 -16
  319. package/dist/lib/browser/chunk-IBCHVMZW.mjs.map +0 -7
  320. package/dist/lib/browser/chunk-NXT2E2BG.mjs.map +0 -7
  321. package/dist/lib/browser/chunk-OKNQ57GF.mjs +0 -51
  322. package/dist/lib/browser/chunk-OKNQ57GF.mjs.map +0 -7
  323. package/dist/lib/browser/chunk-V7P7EIWG.mjs +0 -829
  324. package/dist/lib/browser/chunk-V7P7EIWG.mjs.map +0 -7
  325. package/dist/lib/browser/intent-resolver-55ASQRIW.mjs +0 -62
  326. package/dist/lib/browser/intent-resolver-55ASQRIW.mjs.map +0 -7
  327. package/dist/lib/browser/react-surface-GPD6T435.mjs +0 -211
  328. package/dist/lib/browser/react-surface-GPD6T435.mjs.map +0 -7
  329. package/dist/lib/browser/settings-G3ZOXJQY.mjs +0 -28
  330. package/dist/lib/browser/settings-G3ZOXJQY.mjs.map +0 -7
  331. package/dist/lib/browser/state-BTUKVZHY.mjs +0 -37
  332. package/dist/lib/browser/state-BTUKVZHY.mjs.map +0 -7
  333. package/dist/lib/browser/toolkit.mjs +0 -13
  334. package/dist/lib/node-esm/MarkdownCard-FTEHVH7P.mjs +0 -13
  335. package/dist/lib/node-esm/MarkdownCard-FTEHVH7P.mjs.map +0 -7
  336. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs +0 -16
  337. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs.map +0 -7
  338. package/dist/lib/node-esm/anchor-sort-W4HCTYUQ.mjs.map +0 -7
  339. package/dist/lib/node-esm/app-graph-serializer-OCTHXWLF.mjs +0 -52
  340. package/dist/lib/node-esm/app-graph-serializer-OCTHXWLF.mjs.map +0 -7
  341. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs +0 -14
  342. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs +0 -151
  344. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs.map +0 -7
  345. package/dist/lib/node-esm/chunk-7GN66TDQ.mjs +0 -52
  346. package/dist/lib/node-esm/chunk-7GN66TDQ.mjs.map +0 -7
  347. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs +0 -17
  348. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs.map +0 -7
  349. package/dist/lib/node-esm/chunk-I5JSQBPI.mjs.map +0 -7
  350. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +0 -7
  351. package/dist/lib/node-esm/chunk-TYUGABTD.mjs +0 -22
  352. package/dist/lib/node-esm/chunk-TYUGABTD.mjs.map +0 -7
  353. package/dist/lib/node-esm/chunk-UVLACSAE.mjs +0 -830
  354. package/dist/lib/node-esm/chunk-UVLACSAE.mjs.map +0 -7
  355. package/dist/lib/node-esm/chunk-YFRTKXTB.mjs +0 -80
  356. package/dist/lib/node-esm/chunk-YFRTKXTB.mjs.map +0 -7
  357. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs +0 -97
  358. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs.map +0 -7
  359. package/dist/lib/node-esm/intent-resolver-DTBVWCNO.mjs +0 -63
  360. package/dist/lib/node-esm/intent-resolver-DTBVWCNO.mjs.map +0 -7
  361. package/dist/lib/node-esm/react-surface-QWG7CJ5U.mjs +0 -212
  362. package/dist/lib/node-esm/react-surface-QWG7CJ5U.mjs.map +0 -7
  363. package/dist/lib/node-esm/settings-IBFFCGNL.mjs +0 -29
  364. package/dist/lib/node-esm/settings-IBFFCGNL.mjs.map +0 -7
  365. package/dist/lib/node-esm/state-K6EH7SRZ.mjs +0 -38
  366. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +0 -7
  367. package/dist/lib/node-esm/toolkit.mjs +0 -14
  368. package/dist/lib/node-esm/toolkit.mjs.map +0 -7
  369. package/dist/types/src/capabilities/anchor-sort.d.ts +0 -4
  370. package/dist/types/src/capabilities/anchor-sort.d.ts.map +0 -1
  371. package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -4
  372. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
  373. package/dist/types/src/capabilities/artifact-definition.d.ts +0 -3
  374. package/dist/types/src/capabilities/artifact-definition.d.ts.map +0 -1
  375. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -7
  376. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  377. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  378. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  379. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  380. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  381. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  382. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  383. package/dist/types/src/capabilities/settings.d.ts +0 -4
  384. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  385. package/dist/types/src/capabilities/state.d.ts +0 -11
  386. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  387. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  388. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  389. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  390. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  391. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  392. package/dist/types/src/components/MarkdownContainer.d.ts +0 -14
  393. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  394. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  395. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +0 -6
  396. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +0 -1
  397. package/dist/types/src/components/MarkdownSettings/index.d.ts +0 -2
  398. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +0 -1
  399. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  400. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  401. package/dist/types/src/events.d.ts +0 -4
  402. package/dist/types/src/events.d.ts.map +0 -1
  403. package/dist/types/src/functions/create.d.ts +0 -8
  404. package/dist/types/src/functions/create.d.ts.map +0 -1
  405. package/dist/types/src/functions/create.test.d.ts.map +0 -1
  406. package/dist/types/src/functions/index.d.ts +0 -18
  407. package/dist/types/src/functions/index.d.ts.map +0 -1
  408. package/dist/types/src/functions/open.d.ts +0 -7
  409. package/dist/types/src/functions/open.d.ts.map +0 -1
  410. package/dist/types/src/functions/update.d.ts +0 -6
  411. package/dist/types/src/functions/update.d.ts.map +0 -1
  412. package/dist/types/src/functions/update.test.d.ts.map +0 -1
  413. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  414. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  415. package/dist/types/src/toolkit.d.ts +0 -3
  416. package/dist/types/src/toolkit.d.ts.map +0 -1
  417. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  418. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  419. package/src/capabilities/anchor-sort.ts +0 -31
  420. package/src/capabilities/app-graph-serializer.ts +0 -54
  421. package/src/capabilities/artifact-definition.ts +0 -112
  422. package/src/capabilities/blueprint-definition.ts +0 -43
  423. package/src/capabilities/capabilities.ts +0 -22
  424. package/src/capabilities/intent-resolver.ts +0 -58
  425. package/src/capabilities/react-surface.tsx +0 -93
  426. package/src/capabilities/settings.ts +0 -25
  427. package/src/capabilities/state.ts +0 -31
  428. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  429. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -89
  430. package/src/components/MarkdownContainer.stories.tsx +0 -136
  431. package/src/components/MarkdownContainer.tsx +0 -113
  432. package/src/components/MarkdownSettings/MarkdownSettings.tsx +0 -108
  433. package/src/components/MarkdownSettings/index.ts +0 -5
  434. package/src/components/Suggestions.stories.tsx +0 -226
  435. package/src/events.ts +0 -11
  436. package/src/functions/create.conversations.json +0 -1
  437. package/src/functions/create.test.ts +0 -128
  438. package/src/functions/create.ts +0 -34
  439. package/src/functions/index.ts +0 -13
  440. package/src/functions/open.ts +0 -32
  441. package/src/functions/update.conversations.json +0 -1
  442. package/src/functions/update.test.ts +0 -151
  443. package/src/functions/update.ts +0 -37
  444. package/src/hooks/useSelectCurrentThread.tsx +0 -66
  445. package/src/toolkit.ts +0 -6
  446. package/src/types/MarkdownAction.ts +0 -29
  447. /package/dist/lib/browser/{MarkdownCard-TC3GGUSX.mjs.map → blueprints/index.mjs.map} +0 -0
  448. /package/dist/lib/browser/{MarkdownContainer-YF22DV4M.mjs.map → operations/index.mjs.map} +0 -0
  449. /package/dist/lib/{browser/blueprint-definition-HED54GGW.mjs.map → node-esm/blueprints/index.mjs.map} +0 -0
  450. /package/dist/lib/{browser/toolkit.mjs.map → node-esm/operations/index.mjs.map} +0 -0
  451. /package/dist/types/src/{functions → operations}/create.test.d.ts +0 -0
  452. /package/dist/types/src/{functions → operations}/update.test.d.ts +0 -0
@@ -3,19 +3,16 @@
3
3
  //
4
4
 
5
5
  import { type ViewUpdate } from '@codemirror/view';
6
- import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
7
- import { createRoot } from 'react-dom/client';
8
-
9
- import { LayoutAction, type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
10
- import { useIntentDispatcher } from '@dxos/app-framework/react';
6
+ import { useMemo } from 'react';
11
7
  import { debounceAndThrottle } from '@dxos/async';
12
8
  import { Obj } from '@dxos/echo';
13
9
  import { createDocAccessor } from '@dxos/echo-db';
14
10
  import { invariant } from '@dxos/invariant';
15
- import { getSpace } from '@dxos/react-client/echo';
11
+ import { getSpace, useObject } from '@dxos/react-client/echo';
16
12
  import { useIdentity } from '@dxos/react-client/halo';
17
- import { Icon, ThemeProvider } from '@dxos/react-ui';
18
13
  import { type SelectionManager } from '@dxos/react-ui-attention';
14
+ import { Text } from '@dxos/schema';
15
+ import { Domino } from '@dxos/ui';
19
16
  import {
20
17
  Cursor,
21
18
  type EditorStateStore,
@@ -36,25 +33,28 @@ import {
36
33
  replacer,
37
34
  selectionState,
38
35
  typewriter,
39
- } from '@dxos/react-ui-editor';
40
- import { defaultTx } from '@dxos/react-ui-theme';
41
- import { Text } from '@dxos/schema';
42
- import { isTruthy } from '@dxos/util';
36
+ } from '@dxos/ui-editor';
37
+ import { useThemeContext } from '@dxos/react-ui';
38
+ import { isTruthy, safeUrl } from '@dxos/util';
43
39
 
44
40
  import { Markdown } from '../types';
45
41
  import { setFallbackName } from '../util';
42
+ import { fromUrlPath } from '@dxos/app-toolkit';
46
43
 
47
44
  export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
48
45
 
49
46
  export type ExtensionsOptions = {
50
47
  id: string;
51
48
  object?: DocumentType;
52
- dispatch?: PromiseIntentDispatcher;
53
49
  settings?: Markdown.Settings;
54
- selectionManager?: SelectionManager;
50
+ compact?: boolean;
55
51
  viewMode?: EditorViewMode;
52
+ selectionManager?: SelectionManager;
56
53
  editorStateStore?: EditorStateStore;
57
54
  previewOptions?: PreviewOptions;
55
+ platform?: 'mobile' | 'desktop';
56
+ /** Callback when an internal link is clicked. */
57
+ onSelectObject?: (objectId: string) => void;
58
58
  };
59
59
 
60
60
  // TODO(burdon): Merge with createBaseExtensions below.
@@ -62,21 +62,23 @@ export const useExtensions = ({
62
62
  id,
63
63
  object,
64
64
  settings,
65
- selectionManager,
65
+ compact,
66
66
  viewMode,
67
+ selectionManager,
67
68
  editorStateStore,
68
69
  previewOptions,
70
+ onSelectObject,
69
71
  }: ExtensionsOptions): Extension[] => {
70
- const { dispatchPromise: dispatch } = useIntentDispatcher();
72
+ const { platform } = useThemeContext();
71
73
  const identity = useIdentity();
72
74
  const space = getSpace(object);
73
75
 
74
- let target: Obj.Any | undefined;
75
- if (Obj.instanceOf(Markdown.Document, object)) {
76
- target = (object as Markdown.Document).content.target;
77
- } else if (Obj.instanceOf(Text.Text, object)) {
78
- target = object;
79
- }
76
+ // Get the content reference from Document objects.
77
+ const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;
78
+ // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).
79
+ useObject(contentRef);
80
+ // Get the actual live object target via .target (needed for createDocAccessor).
81
+ const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);
80
82
 
81
83
  // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
82
84
  // TODO(burdon): Unsubscribe.
@@ -89,24 +91,28 @@ export const useExtensions = ({
89
91
  id,
90
92
  object,
91
93
  settings,
92
- selectionManager,
94
+ compact,
93
95
  viewMode,
96
+ selectionManager,
94
97
  previewOptions,
95
- dispatch,
98
+ onSelectObject,
99
+ platform,
96
100
  }),
97
101
  [
98
102
  id,
99
103
  object,
104
+ compact,
100
105
  viewMode,
101
- dispatch,
106
+ selectionManager,
102
107
  previewOptions,
108
+ onSelectObject,
103
109
  settings,
104
110
  settings?.debug,
105
111
  settings?.editorInputMode,
106
112
  settings?.folding,
107
113
  settings?.numberedHeadings,
114
+ platform,
108
115
  settings?.typewriter,
109
- selectionManager,
110
116
  ],
111
117
  );
112
118
 
@@ -144,16 +150,18 @@ export const useExtensions = ({
144
150
  const createBaseExtensions = ({
145
151
  id,
146
152
  object,
147
- dispatch,
153
+ onSelectObject,
148
154
  settings,
149
- selectionManager,
155
+ compact,
150
156
  viewMode,
157
+ selectionManager,
151
158
  previewOptions,
159
+ platform,
152
160
  }: ExtensionsOptions): Extension[] => {
153
161
  const extensions: Extension[] = [
154
162
  selectionManager && selectionChange(selectionManager),
155
163
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
156
- settings?.folding && folding(),
164
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
157
165
  ].filter(isTruthy);
158
166
 
159
167
  //
@@ -166,22 +174,8 @@ const createBaseExtensions = ({
166
174
  decorateMarkdown({
167
175
  selectionChangeDelay: 100,
168
176
  numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
169
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
170
- // TODO(burdon): Create dx-tag.
171
- renderLinkButton:
172
- dispatch && (object || id)
173
- ? createLinkRenderer((id: string) => {
174
- void dispatch(
175
- createIntent(LayoutAction.Open, {
176
- part: 'main',
177
- subject: [id],
178
- options: {
179
- pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id,
180
- },
181
- }),
182
- );
183
- })
184
- : undefined,
177
+ // TODO(wittjosiah): For internal links render the label of the object.
178
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
185
179
  }),
186
180
  linkTooltip(renderLinkTooltip),
187
181
  preview(previewOptions),
@@ -201,79 +195,67 @@ const createBaseExtensions = ({
201
195
  };
202
196
 
203
197
  const selectionChange = (selectionManager: SelectionManager) => {
204
- return EditorView.updateListener.of(
205
- debounceAndThrottle((update: ViewUpdate) => {
206
- if (update.selectionSet) {
207
- const id = update.state.facet(documentId);
208
- const cursorConverter = update.state.facet(Cursor.converter);
209
- const selection = update.state.selection;
210
- const ranges = selection.ranges
211
- .map((range) => ({
212
- from: cursorConverter.toCursor(range.from),
213
- to: cursorConverter.toCursor(range.to),
214
- }))
215
- .filter(({ from, to }) => to > from);
198
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
199
+ const id = update.state.facet(documentId);
200
+ const cursorConverter = update.state.facet(Cursor.converter);
201
+ const selection = update.state.selection;
202
+ const ranges = selection.ranges
203
+ .map((range) => ({
204
+ from: cursorConverter.toCursor(range.from),
205
+ to: cursorConverter.toCursor(range.to),
206
+ }))
207
+ .filter(({ from, to }) => to > from);
216
208
 
217
- selectionManager.updateMultiRange(id, ranges);
218
- }
219
- }, 100),
220
- );
221
- };
209
+ selectionManager.updateMultiRange(id, ranges);
210
+ }, 100);
222
211
 
223
- // TODO(burdon): Factor out styles.
224
- const style = {
225
- hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
226
- icon: 'inline-block leading-none mis-1 cursor-pointer',
212
+ return EditorView.updateListener.of((update: ViewUpdate) => {
213
+ if (update.selectionSet) {
214
+ debouncedHandler(update);
215
+ }
216
+ });
227
217
  };
228
218
 
229
- const createLinkRenderer =
219
+ const createRenderLink =
230
220
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
231
221
  (el, { url }) => {
232
222
  // TODO(burdon): Formalize/document internal link format.
233
- const isInternal =
234
- url.startsWith('/') ||
235
- // TODO(wittjosiah): This should probably be parsed out on paste?
236
- url.startsWith(window.location.origin);
223
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
224
+ const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;
225
+ const icon = Domino.of('span')
226
+ .classNames('dx-link ms-1 inline-block align-[-0.125em]')
227
+ .children(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
237
228
 
238
- const options: AnchorHTMLAttributes<any> = isInternal
239
- ? {
240
- onClick: () => {
241
- const qualifiedId = url.split('/').at(-1);
242
- invariant(qualifiedId, 'Invalid link format.');
243
- onSelectObject(qualifiedId);
244
- },
245
- }
246
- : {
247
- href: url,
248
- rel: 'noreferrer',
249
- target: '_blank',
250
- };
229
+ if (isInternal) {
230
+ invariant(qualifiedId, 'Invalid link format.');
231
+ icon
232
+ .attributes({ role: 'button', tabindex: '0' })
233
+ .on('click', (event) => {
234
+ event.preventDefault();
235
+ event.stopPropagation();
236
+ onSelectObject(qualifiedId);
237
+ })
238
+ .on('keydown', (event) => {
239
+ const keyboardEvent = event as KeyboardEvent;
240
+ if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {
241
+ return;
242
+ }
251
243
 
252
- renderRoot(
253
- el,
254
- <a {...options} className={style.hover}>
255
- <Icon
256
- icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
257
- size={4}
258
- classNames={style.icon}
259
- />
260
- </a>,
261
- );
244
+ keyboardEvent.preventDefault();
245
+ keyboardEvent.stopPropagation();
246
+ onSelectObject(qualifiedId);
247
+ });
248
+ }
249
+
250
+ el.appendChild(icon.root);
262
251
  };
263
252
 
264
253
  const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
265
- const web = new URL(url);
266
- renderRoot(
267
- el,
268
- <a href={url} rel='noreferrer' target='_blank' className={style.hover}>
269
- {web.origin}
270
- <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />
271
- </a>,
254
+ el.appendChild(
255
+ Domino.of('a')
256
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
257
+ .classNames('dx-link flex items-center gap-2')
258
+ .text(safeUrl(url)?.toString() ?? url)
259
+ .children(Domino.svg('ph--arrow-square-out--regular')).root,
272
260
  );
273
261
  };
274
-
275
- // TODO(burdon): REMOVE.
276
- const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
277
- createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
278
- return root;
279
- };
@@ -5,41 +5,42 @@
5
5
  import * as Option from 'effect/Option';
6
6
  import { useCallback, useMemo } from 'react';
7
7
 
8
- import { Capabilities } from '@dxos/app-framework';
9
- import { usePluginManager } from '@dxos/app-framework/react';
10
- import { Filter, Obj, Query, Type } from '@dxos/echo';
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
11
  import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
12
- import { type Space } from '@dxos/react-client/echo';
13
12
  import { toLocalizedString, useTranslation } from '@dxos/react-ui';
14
- import { type EditorMenuGroup, type EditorMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
13
+ import { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';
14
+ import { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';
15
15
 
16
- export const useLinkQuery = (space: Space | undefined) => {
16
+ export const useLinkQuery = (db: Database.Database | undefined) => {
17
17
  const { t } = useTranslation();
18
18
 
19
19
  const manager = usePluginManager();
20
20
  const resolve = useCallback(
21
21
  (typename: string) =>
22
- manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
22
+ manager.capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
23
23
  [manager],
24
24
  );
25
25
 
26
26
  const filter = useMemo(
27
27
  () =>
28
28
  Filter.or(
29
- ...(space?.db.schemaRegistry.query({ location: ['database', 'runtime'] }).runSync() ?? [])
29
+ ...(db?.schemaRegistry.query({ location: ['database', 'runtime'] }).runSync() ?? [])
30
30
  .filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation)
31
31
  .filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
32
32
  .map((schema) => Filter.typename(Type.getTypename(schema))),
33
33
  ),
34
- [space],
34
+ [db],
35
35
  );
36
36
 
37
37
  const handleLinkQuery = useCallback(
38
38
  async (query?: string): Promise<EditorMenuGroup[]> => {
39
+ // A second "@" switches the link query into block-embed mode, so "@@foo" searches for "foo".
39
40
  const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
40
- const results = await space?.db.query(Query.select(filter)).run();
41
+ const results = await db?.query(Query.select(filter)).run();
41
42
 
42
- // TODO(wittjosiah): Use `Obj.Any` type.
43
+ // TODO(wittjosiah): Use `Obj.Unknown` type.
43
44
  const getLabel = (object: any) => {
44
45
  const label = Obj.getLabel(object);
45
46
  if (label) {
@@ -53,8 +54,8 @@ export const useLinkQuery = (space: Space | undefined) => {
53
54
  };
54
55
 
55
56
  const items =
56
- results?.objects
57
- .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
57
+ results
58
+ ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
58
59
  // TODO(wittjosiah): Remove `any` type.
59
60
  .map((object: any): EditorMenuItem => {
60
61
  const metadata = resolve(Obj.getTypename(object)!);
@@ -65,6 +66,7 @@ export const useLinkQuery = (space: Space | undefined) => {
65
66
  icon: metadata.icon,
66
67
  onSelect: ({ view, head }) => {
67
68
  const link = `[${label}](${Obj.getDXN(object)})`;
69
+ // "@@" inserts a block embed on its own line instead of an inline link.
68
70
  if (query?.startsWith('@')) {
69
71
  insertAtLineStart(view, head, `!${link}\n`);
70
72
  } else {
@@ -76,7 +78,7 @@ export const useLinkQuery = (space: Space | undefined) => {
76
78
 
77
79
  return [{ id: 'echo', items }];
78
80
  },
79
- [space, filter, resolve],
81
+ [db, filter, resolve],
80
82
  );
81
83
 
82
84
  return handleLinkQuery;
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
8
  export * from './types';
10
9
  export * from './util';
11
10
 
12
11
  export * from './MarkdownPlugin';
12
+
13
+ export { MarkdownEditor } from './components';
package/src/meta.ts CHANGED
@@ -2,11 +2,11 @@
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
12
  Full-featured collaborative markdown editor with real-time editing, inline comments, and rich formatting.
@@ -0,0 +1,21 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/operation';
8
+
9
+ import { CreateMarkdown } from './definitions';
10
+
11
+ import { Markdown } from '../types';
12
+
13
+ const handler: Operation.WithHandler<typeof CreateMarkdown> = CreateMarkdown.pipe(
14
+ Operation.withHandler(({ name, content }) =>
15
+ Effect.succeed({
16
+ object: Markdown.make({ name, content }),
17
+ }),
18
+ ),
19
+ );
20
+
21
+ 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_012u3Dc1U1Ajz41Sbdi3Ki7x","modelId":"claude-opus-4-20250514","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The user wants me to create a ","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"document with a cookie recipe. I'll","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" use the create function to make a new","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" markdown document containing","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" a cookie recipe.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" I need to provide a name","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" an","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"d content for the document.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"EvUCCkYICxgCKkC5nwEtq9qckQ423iHc9Ln0OFnVtHRR7sUEV4ICNF8g2BxjGyutcobSpcWevhOsMSriOUhG2jxfh6c4rx/oA5SXEgzdSd4wUO5MEMKtBncaDMZiA93auhLoVS7bcCIwzYQWtY5OzjsTnzu9wwdqpV/0uFXqL/GYGchJCX+KoBmMRO+ze2WWOMbJA1+DTWKAKtwBfEcuem7ZDKl6SOwSe+zkgauQnFNAA4SwCuYOuH6Avqk3Jb/7Em3Y979foER8EyRLLrhlZGWDQsQ+4S0gF/5V4t1A/pSAwrejLYBfXE4QoLtMQcgfThDvH5h/ADe4DvPuVY3opqKc3/LcurvAeqf3ak5F4uiLpRs5VKL3fZVWEMeU4S/7fMGRaAiBKw6tYPFJUi+YUdL/26f0lw3nkqZV/f1QyhdYKf3uhfCZ1ljHDgwhBdGM1fQBzZqWmJk8C1jl8fouWHtX79ZbGVncuD2G00hUNdxIUfCXlQtYzBgB"}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"text-start","id":"1","metadata":{}},{"type":"text-delta","id":"1","delta":"I'll create","metadata":{}},{"type":"text-delta","id":"1","delta":" a ","metadata":{}},{"type":"text-delta","id":"1","delta":"document with a del","metadata":{}},{"type":"text-delta","id":"1","delta":"icious chocolate","metadata":{}},{"type":"text-delta","id":"1","delta":" chip cookie recipe for you.","metadata":{}},{"type":"text-end","id":"1","metadata":{}},{"type":"tool-params-start","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","providerExecuted":false,"metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"{\"na","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"me\": \"Choco","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"la","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"te Ch","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ip","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" Cookie R","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ecipe\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":", \"co","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nt","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ent\":","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" \"# Clas","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"sic Choco","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"late Chip","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" Cookies","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n\\n## Ingr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"edients\\n\\n#","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"## Dry ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Ingredients","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n- 2","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"¼ ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"cup","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s al","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"l-purpos","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"e flour\\n-","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" 1","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"sp ba","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"king ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"soda\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n-","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" 1 ts","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"p salt","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n\\n### We","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"t Ingr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"edients\\n- 1","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" cup ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"(2 sti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"cks) butter","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":", soften","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ed\\n- ¾ cup ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"granulated s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ugar\\n- ¾ c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"up packed","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" brown su","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"gar\\n- 2 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"large eggs\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n- 2 tsp van","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"illa ext","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ract\\n\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"### Mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"x-ins\\n- 2 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"cups chocola","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"te ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"chi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ps (s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"emi-sweet ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"or ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"milk cho","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"colat","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"e)\\n-","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" 1 cup c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"hopped w","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"alnut","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s (optional","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":")\\n\\n#","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"# In","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"structions","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n\\n1. **Pr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"eheat oven*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"* to 375","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"°F ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"(190","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"°C).\\n\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"2. **Mix ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"dry ingr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ed","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ie","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nts**: I","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n a mediu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"m ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"bowl, whisk ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"toget","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"her flour,","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" baking so","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"da","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":", and s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"al","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"t. Set asi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"de.\\n\\n3. ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**C","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ream","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" butte","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"r and sug","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ars**: In","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" a large bow","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"l, beat soft","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ened","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" butter, gr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"anulat","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ed su","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"gar, ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"and brown s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ugar ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"until","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" creamy ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"(about 3","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"-4 mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nutes).\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n\\n4. **Add","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" egg","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s and va","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nil","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"la*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*: Beat ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"in eggs","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" one at a ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"me, t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"hen add ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"vanilla e","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"xtrac","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"t.\\n\\n5. *","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*Combi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ne wet a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nd dry**: ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Gradually be","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"at in ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"the ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"flour","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" mixture ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"unti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"l just combi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ned.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" Do","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n't ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"overmix.\\n\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"6. *","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*Fold ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"in chocola","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"te chips**: ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Stir in cho","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"colate ch","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ip","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s and ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nuts (if u","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"si","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ng).\\n\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"7. *","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*S","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"hape cookie","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s**: Drop r","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ounded tab","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"lespoons ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"of dough ont","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"o ungreased","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" cookie shee","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ts, s","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"pacing t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"he","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"m a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"bout 2 inche","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s apart.\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n8. ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**B","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ake**","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":": Bake f","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"or 9-11 m","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"inutes, or ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"until gol","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"den brown ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"aroun","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"d the","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" edges. Th","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"e cent","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ers may lo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ok slight","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ly under","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"done.\\n\\","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n9","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":". **Cool**: ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Let co","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"okies cool o","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n the","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" bak","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ing sheet fo","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"r 2 minute","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s, then tra","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nsfe","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"r to a ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"wir","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"e rack.","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n\\n##","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" Tip","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s for Perf","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ect Co","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"okies\\n\\n-","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" **Room ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"temp","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"era","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ture i","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ngredients**","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" mix be","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"tter and c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"reate a ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"smooth","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"er do","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ugh\\n- **","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Don't","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" ov","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"erbake**","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" - ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"cookie","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s will con","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"tin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ue cooking o","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"n the hot p","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"an ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"after r","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"emoval\\n- ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**Chill ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"dou","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"gh","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"** for 30","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" minute","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s before ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"baking","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" for thick","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"er co","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"okies\\n- **","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"Use parch","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ment paper*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"* ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"for ea","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"sy clea","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"nu","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"p and even","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" ba","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"kin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"g\\n\\n## Stor","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ag","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"e\\n\\n- St","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ore ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"in an airt","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ight c","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ontainer a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"t room t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"emp","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"erat","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ure for u","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"p to 1 we","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ek","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n- Freeze ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"bak","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ed cookies","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" for up to 3","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" months\\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"- Cookie do","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ug","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"h can be fro","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"zen for ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"up to 3 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"mon","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ths","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"\\n\\n*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*Yield","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**: About 4","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"8 cookie","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" \\n**Pre","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"p ti","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"me","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**: 15 min","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"utes \\n","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"**Bake time*","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"*:","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" 9-11 ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"minute","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"s per batch","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" \\n\\nEnjoy","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":" your homem","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"ade cookies","metadata":{}},{"type":"tool-params-delta","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","delta":"! 🍪\"}","metadata":{}},{"type":"tool-params-end","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","metadata":{}},{"type":"tool-call","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","params":{"name":"Chocolate Chip Cookie Recipe","content":"# Classic Chocolate Chip Cookies\n\n## Ingredients\n\n### Dry Ingredients\n- 2¼ cups all-purpose flour\n- 1 tsp baking soda\n- 1 tsp salt\n\n### Wet Ingredients\n- 1 cup (2 sticks) butter, softened\n- ¾ cup granulated sugar\n- ¾ cup packed brown sugar\n- 2 large eggs\n- 2 tsp vanilla extract\n\n### Mix-ins\n- 2 cups chocolate chips (semi-sweet or milk chocolate)\n- 1 cup chopped walnuts (optional)\n\n## Instructions\n\n1. **Preheat oven** to 375°F (190°C).\n\n2. **Mix dry ingredients**: In a medium bowl, whisk together flour, baking soda, and salt. Set aside.\n\n3. **Cream butter and sugars**: In a large bowl, beat softened butter, granulated sugar, and brown sugar until creamy (about 3-4 minutes).\n\n4. **Add eggs and vanilla**: Beat in eggs one at a time, then add vanilla extract.\n\n5. **Combine wet and dry**: Gradually beat in the flour mixture until just combined. Don't overmix.\n\n6. **Fold in chocolate chips**: Stir in chocolate chips and nuts (if using).\n\n7. **Shape cookies**: Drop rounded tablespoons of dough onto ungreased cookie sheets, spacing them about 2 inches apart.\n\n8. **Bake**: Bake for 9-11 minutes, or until golden brown around the edges. The centers may look slightly underdone.\n\n9. **Cool**: Let cookies cool on the baking sheet for 2 minutes, then transfer to a wire rack.\n\n## Tips for Perfect Cookies\n\n- **Room temperature ingredients** mix better and create a smoother dough\n- **Don't overbake** - cookies will continue cooking on the hot pan after removal\n- **Chill dough** for 30 minutes before baking for thicker cookies\n- **Use parchment paper** for easy cleanup and even baking\n\n## Storage\n\n- Store in an airtight container at room temperature for up to 1 week\n- Freeze baked cookies for up to 3 months\n- Cookie dough can be frozen for up to 3 months\n\n**Yield**: About 48 cookies \n**Prep time**: 15 minutes \n**Bake time**: 9-11 minutes per batch \n\nEnjoy your homemade cookies! 🍪"},"providerExecuted":false,"metadata":{}},{"type":"finish","reason":"tool-calls","usage":{"inputTokens":10,"outputTokens":721,"totalTokens":731},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":1400},"cache_creation_input_tokens":1400,"cache_read_input_tokens":0,"input_tokens":10,"output_tokens":8,"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. I'll use the create function to make a new markdown document containing a cookie recipe. I need to provide a name and content for the document.","options":{}},{"type":"text","text":"I'll create a document with a delicious chocolate chip cookie recipe for you.","options":{}},{"type":"tool-call","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","params":{"name":"Chocolate Chip Cookie Recipe","content":"# Classic Chocolate Chip Cookies\n\n## Ingredients\n\n### Dry Ingredients\n- 2¼ cups all-purpose flour\n- 1 tsp baking soda\n- 1 tsp salt\n\n### Wet Ingredients\n- 1 cup (2 sticks) butter, softened\n- ¾ cup granulated sugar\n- ¾ cup packed brown sugar\n- 2 large eggs\n- 2 tsp vanilla extract\n\n### Mix-ins\n- 2 cups chocolate chips (semi-sweet or milk chocolate)\n- 1 cup chopped walnuts (optional)\n\n## Instructions\n\n1. **Preheat oven** to 375°F (190°C).\n\n2. **Mix dry ingredients**: In a medium bowl, whisk together flour, baking soda, and salt. Set aside.\n\n3. **Cream butter and sugars**: In a large bowl, beat softened butter, granulated sugar, and brown sugar until creamy (about 3-4 minutes).\n\n4. **Add eggs and vanilla**: Beat in eggs one at a time, then add vanilla extract.\n\n5. **Combine wet and dry**: Gradually beat in the flour mixture until just combined. Don't overmix.\n\n6. **Fold in chocolate chips**: Stir in chocolate chips and nuts (if using).\n\n7. **Shape cookies**: Drop rounded tablespoons of dough onto ungreased cookie sheets, spacing them about 2 inches apart.\n\n8. **Bake**: Bake for 9-11 minutes, or until golden brown around the edges. The centers may look slightly underdone.\n\n9. **Cool**: Let cookies cool on the baking sheet for 2 minutes, then transfer to a wire rack.\n\n## Tips for Perfect Cookies\n\n- **Room temperature ingredients** mix better and create a smoother dough\n- **Don't overbake** - cookies will continue cooking on the hot pan after removal\n- **Chill dough** for 30 minutes before baking for thicker cookies\n- **Use parchment paper** for easy cleanup and even baking\n\n## Storage\n\n- Store in an airtight container at room temperature for up to 1 week\n- Freeze baked cookies for up to 3 months\n- Cookie dough can be frozen for up to 3 months\n\n**Yield**: About 48 cookies \n**Prep time**: 15 minutes \n**Bake time**: 9-11 minutes per batch \n\nEnjoy your homemade cookies! 🍪"},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","isFailure":false,"result":{"id":"dxn:echo:BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U:01JGFJJZ00G0WKQSJGMAKCNT8X"},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01WzwZqUk2X7iaec8CSSXgt7","modelId":"claude-opus-4-20250514","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"text-start","id":"0","metadata":{}},{"type":"text-delta","id":"0","delta":"I","metadata":{}},{"type":"text-delta","id":"0","delta":"'ve create","metadata":{}},{"type":"text-delta","id":"0","delta":"d a ","metadata":{}},{"type":"text-delta","id":"0","delta":"document with a classic chocolate chip cookie recipe!","metadata":{}},{"type":"text-delta","id":"0","delta":" The recipe","metadata":{}},{"type":"text-delta","id":"0","delta":" includes:\n\n- A complete ingredient list","metadata":{}},{"type":"text-delta","id":"0","delta":" with measurements\n- Step-by-","metadata":{}},{"type":"text-delta","id":"0","delta":"step instructions\n- Helpful tips for","metadata":{}},{"type":"text-delta","id":"0","delta":" getting","metadata":{}},{"type":"text-delta","id":"0","delta":" perfect cookies\n- Storage instructions","metadata":{}},{"type":"text-delta","id":"0","delta":"\n- Yield an","metadata":{}},{"type":"text-delta","id":"0","delta":"d timing information\n\nThe recipe","metadata":{}},{"type":"text-delta","id":"0","delta":" is for","metadata":{}},{"type":"text-delta","id":"0","delta":" traditional","metadata":{}},{"type":"text-delta","id":"0","delta":" chocolate chip cookies that","metadata":{}},{"type":"text-delta","id":"0","delta":" yiel","metadata":{}},{"type":"text-delta","id":"0","delta":"d about 48 cookies. It","metadata":{}},{"type":"text-delta","id":"0","delta":" includes","metadata":{}},{"type":"text-delta","id":"0","delta":" optional","metadata":{}},{"type":"text-delta","id":"0","delta":" w","metadata":{}},{"type":"text-delta","id":"0","delta":"alnuts and tips","metadata":{}},{"type":"text-delta","id":"0","delta":" for achieving","metadata":{}},{"type":"text-delta","id":"0","delta":" the best texture","metadata":{}},{"type":"text-delta","id":"0","delta":".","metadata":{}},{"type":"text-delta","id":"0","delta":" Would you like me to modify anything in","metadata":{}},{"type":"text-delta","id":"0","delta":" the recipe or add any additional sections?","metadata":{}},{"type":"text-end","id":"0","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":6,"outputTokens":103,"totalTokens":109},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":2116},"cache_creation_input_tokens":2116,"cache_read_input_tokens":0,"input_tokens":6,"output_tokens":1,"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. I'll use the create function to make a new markdown document containing a cookie recipe. I need to provide a name and content for the document.","options":{}},{"type":"text","text":"I'll create a document with a delicious chocolate chip cookie recipe for you.","options":{}},{"type":"tool-call","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","params":{"name":"Chocolate Chip Cookie Recipe","content":"# Classic Chocolate Chip Cookies\n\n## Ingredients\n\n### Dry Ingredients\n- 2¼ cups all-purpose flour\n- 1 tsp baking soda\n- 1 tsp salt\n\n### Wet Ingredients\n- 1 cup (2 sticks) butter, softened\n- ¾ cup granulated sugar\n- ¾ cup packed brown sugar\n- 2 large eggs\n- 2 tsp vanilla extract\n\n### Mix-ins\n- 2 cups chocolate chips (semi-sweet or milk chocolate)\n- 1 cup chopped walnuts (optional)\n\n## Instructions\n\n1. **Preheat oven** to 375°F (190°C).\n\n2. **Mix dry ingredients**: In a medium bowl, whisk together flour, baking soda, and salt. Set aside.\n\n3. **Cream butter and sugars**: In a large bowl, beat softened butter, granulated sugar, and brown sugar until creamy (about 3-4 minutes).\n\n4. **Add eggs and vanilla**: Beat in eggs one at a time, then add vanilla extract.\n\n5. **Combine wet and dry**: Gradually beat in the flour mixture until just combined. Don't overmix.\n\n6. **Fold in chocolate chips**: Stir in chocolate chips and nuts (if using).\n\n7. **Shape cookies**: Drop rounded tablespoons of dough onto ungreased cookie sheets, spacing them about 2 inches apart.\n\n8. **Bake**: Bake for 9-11 minutes, or until golden brown around the edges. The centers may look slightly underdone.\n\n9. **Cool**: Let cookies cool on the baking sheet for 2 minutes, then transfer to a wire rack.\n\n## Tips for Perfect Cookies\n\n- **Room temperature ingredients** mix better and create a smoother dough\n- **Don't overbake** - cookies will continue cooking on the hot pan after removal\n- **Chill dough** for 30 minutes before baking for thicker cookies\n- **Use parchment paper** for easy cleanup and even baking\n\n## Storage\n\n- Store in an airtight container at room temperature for up to 1 week\n- Freeze baked cookies for up to 3 months\n- Cookie dough can be frozen for up to 3 months\n\n**Yield**: About 48 cookies \n**Prep time**: 15 minutes \n**Bake time**: 9-11 minutes per batch \n\nEnjoy your homemade cookies! 🍪"},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_01HuKer6SH3fbApR4kTiyNPH","name":"create","isFailure":false,"result":{"id":"dxn:echo:BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U:01JGFJJZ00G0WKQSJGMAKCNT90"},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01NHwfxknTwKcQC1P8hrbg6Z","modelId":"claude-opus-4-20250514","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"text-start","id":"0","metadata":{}},{"type":"text-delta","id":"0","delta":"I've create","metadata":{}},{"type":"text-delta","id":"0","delta":"d a ","metadata":{}},{"type":"text-delta","id":"0","delta":"document with a classic chocolate chip cookie recipe!","metadata":{}},{"type":"text-delta","id":"0","delta":" The recipe","metadata":{}},{"type":"text-delta","id":"0","delta":" includes:\n\n- A complete list","metadata":{}},{"type":"text-delta","id":"0","delta":" of ingredients with measurements\n- Step-","metadata":{}},{"type":"text-delta","id":"0","delta":"by-step instructions that","metadata":{}},{"type":"text-delta","id":"0","delta":" are easy to follow\n- Helpful","metadata":{}},{"type":"text-delta","id":"0","delta":" tips for achieving","metadata":{}},{"type":"text-delta","id":"0","delta":" perfect cookies\n- Storage instructions for both","metadata":{}},{"type":"text-delta","id":"0","delta":" cookies","metadata":{}},{"type":"text-delta","id":"0","delta":" and dough\n- Recipe","metadata":{}},{"type":"text-delta","id":"0","delta":" yield and timing information","metadata":{}},{"type":"text-delta","id":"0","delta":"\n\nThe recipe","metadata":{}},{"type":"text-delta","id":"0","delta":" makes","metadata":{}},{"type":"text-delta","id":"0","delta":" about 48 cookies an","metadata":{}},{"type":"text-delta","id":"0","delta":"d includes","metadata":{}},{"type":"text-delta","id":"0","delta":" optional","metadata":{}},{"type":"text-delta","id":"0","delta":" w","metadata":{}},{"type":"text-delta","id":"0","delta":"alnuts for those","metadata":{}},{"type":"text-delta","id":"0","delta":" who enjoy","metadata":{}},{"type":"text-delta","id":"0","delta":" nuts","metadata":{}},{"type":"text-delta","id":"0","delta":" in","metadata":{}},{"type":"text-delta","id":"0","delta":" their cookies. Feel","metadata":{}},{"type":"text-delta","id":"0","delta":" free to let","metadata":{}},{"type":"text-delta","id":"0","delta":" me know if you'd like me","metadata":{}},{"type":"text-delta","id":"0","delta":" to modify the","metadata":{}},{"type":"text-delta","id":"0","delta":" recipe in any way,","metadata":{}},{"type":"text-delta","id":"0","delta":" such","metadata":{}},{"type":"text-delta","id":"0","delta":" as making","metadata":{}},{"type":"text-delta","id":"0","delta":" it gl","metadata":{}},{"type":"text-delta","id":"0","delta":"uten-free,","metadata":{}},{"type":"text-delta","id":"0","delta":" adding different","metadata":{}},{"type":"text-delta","id":"0","delta":" mix-ins, or adjust","metadata":{}},{"type":"text-delta","id":"0","delta":"ing the batch","metadata":{}},{"type":"text-delta","id":"0","delta":" size!","metadata":{}},{"type":"text-end","id":"0","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":6,"outputTokens":133,"totalTokens":139},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":2115},"cache_creation_input_tokens":2115,"cache_read_input_tokens":0,"input_tokens":6,"output_tokens":3,"server_tool_use":null,"service_tier":"standard"}}}}]}]}