@dxos/plugin-markdown 0.9.0 → 0.9.1-staging.ee54ba693a

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 (255) hide show
  1. package/dist/lib/neutral/{MarkdownArticle-LWT5RFFJ.mjs → MarkdownArticle-ZHBXH7YF.mjs} +5 -7
  2. package/dist/lib/neutral/MarkdownArticle-ZHBXH7YF.mjs.map +7 -0
  3. package/dist/lib/neutral/{MarkdownCard-TBLIRDBO.mjs → MarkdownCard-2HUXCGZP.mjs} +3 -3
  4. package/dist/lib/neutral/MarkdownCard-2HUXCGZP.mjs.map +7 -0
  5. package/dist/lib/neutral/MarkdownPlugin.mjs +8 -15
  6. package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
  7. package/dist/lib/neutral/MarkdownPlugin.node.mjs +4 -2
  8. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +3 -3
  9. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs +6 -17
  10. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs.map +4 -4
  11. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs +43 -0
  12. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs.map +7 -0
  13. package/dist/lib/neutral/{anchor-sort-UXN4RHFX.mjs → anchor-sort-QF7UDG2A.mjs} +4 -3
  14. package/dist/lib/neutral/anchor-sort-QF7UDG2A.mjs.map +7 -0
  15. package/dist/lib/neutral/capabilities/index.mjs +10 -16
  16. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  17. package/dist/lib/neutral/capabilities/node.mjs +5 -3
  18. package/dist/lib/neutral/capabilities/node.mjs.map +3 -3
  19. package/dist/lib/neutral/chunk-2V6A5NDQ.mjs +8 -0
  20. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs → chunk-ANHHOTCD.mjs} +3 -4
  21. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs.map → chunk-ANHHOTCD.mjs.map} +1 -1
  22. package/dist/lib/neutral/chunk-CNYFGIDS.mjs +32 -0
  23. package/dist/lib/neutral/chunk-CNYFGIDS.mjs.map +7 -0
  24. package/dist/lib/neutral/{chunk-LXNSKCPD.mjs → chunk-EV4ZOL4P.mjs} +12 -11
  25. package/dist/lib/neutral/chunk-EV4ZOL4P.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-OC3JD73N.mjs +43 -0
  27. package/dist/lib/neutral/chunk-OC3JD73N.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-YJF6XOXX.mjs +175 -0
  29. package/dist/lib/neutral/chunk-YJF6XOXX.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-YMBC62S7.mjs +14 -0
  31. package/dist/lib/neutral/chunk-YMBC62S7.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-Y2LQRUU7.mjs → chunk-ZJ3GWRUJ.mjs} +24 -23
  33. package/dist/lib/neutral/chunk-ZJ3GWRUJ.mjs.map +7 -0
  34. package/dist/lib/neutral/{comment-config-EGY7RPPW.mjs → comment-config-M5OGFULS.mjs} +6 -4
  35. package/dist/lib/neutral/comment-config-M5OGFULS.mjs.map +7 -0
  36. package/dist/lib/neutral/components/index.mjs +19 -57
  37. package/dist/lib/neutral/components/index.mjs.map +4 -4
  38. package/dist/lib/neutral/containers/index.mjs +5 -3
  39. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  40. package/dist/lib/neutral/{create-JK35XC4R.mjs → create-OQUMKL5I.mjs} +2 -2
  41. package/dist/lib/neutral/{create-markdown-7MLE625M.mjs → create-markdown-4O5FDA77.mjs} +2 -2
  42. package/dist/lib/neutral/{create-object-MU2LGXG6.mjs → create-object-RSEWTCMM.mjs} +2 -6
  43. package/dist/lib/neutral/create-object-RSEWTCMM.mjs.map +7 -0
  44. package/dist/lib/neutral/hooks/index.mjs +53 -23
  45. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  46. package/dist/lib/neutral/index.mjs +10 -16
  47. package/dist/lib/neutral/meta.json +1 -1
  48. package/dist/lib/neutral/meta.mjs +1 -1
  49. package/dist/lib/neutral/{open-5YC77C4O.mjs → open-BAZIRXII.mjs} +2 -2
  50. package/dist/lib/neutral/operation-handler-SDCXGMGK.mjs +8 -0
  51. package/dist/lib/neutral/operations/index.mjs +1 -1
  52. package/dist/lib/neutral/plugin.mjs +2 -2
  53. package/dist/lib/neutral/plugin.workerd.mjs +12 -0
  54. package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
  55. package/dist/lib/neutral/{react-surface-XYZJBKHZ.mjs → react-surface-37GL3UVG.mjs} +10 -15
  56. package/dist/lib/neutral/react-surface-37GL3UVG.mjs.map +7 -0
  57. package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs → scroll-to-anchor-I6HFE5AH.mjs} +2 -2
  58. package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs → set-view-mode-NY5OYYIM.mjs} +2 -2
  59. package/dist/lib/neutral/{settings-TDGDLCUR.mjs → settings-O6O6HT3I.mjs} +3 -3
  60. package/dist/lib/neutral/settings-O6O6HT3I.mjs.map +7 -0
  61. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs +8 -0
  62. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs.map +7 -0
  63. package/dist/lib/neutral/skills/index.mjs +8 -0
  64. package/dist/lib/neutral/skills/index.mjs.map +7 -0
  65. package/dist/lib/neutral/state-3BR7L6CW.mjs +69 -0
  66. package/dist/lib/neutral/state-3BR7L6CW.mjs.map +7 -0
  67. package/dist/lib/neutral/testing.mjs +2 -2
  68. package/dist/lib/neutral/testing.mjs.map +3 -3
  69. package/dist/lib/neutral/translations.mjs +1 -1
  70. package/dist/lib/neutral/translations.mjs.map +3 -3
  71. package/dist/lib/neutral/types/index.mjs +1 -1
  72. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs +24 -0
  73. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs.map +7 -0
  74. package/dist/types/dx.config.d.ts +28 -0
  75. package/dist/types/dx.config.d.ts.map +1 -0
  76. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  77. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -1
  78. package/dist/types/src/MarkdownPlugin.workerd.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/anchor-sort.d.ts +1 -2
  80. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/comment-config.d.ts +1 -2
  82. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/create-object.d.ts +1 -7
  84. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/editor-view-state.d.ts +7 -0
  86. package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/index.d.ts +7 -16
  88. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/node.d.ts +2 -6
  90. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  92. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/settings.d.ts +1 -2
  94. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  96. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/state.d.ts +1 -2
  98. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
  100. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +5 -6
  102. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  103. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -2
  104. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  106. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +2 -2
  107. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  108. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts +17 -0
  109. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts.map +1 -0
  110. package/dist/types/src/components/PreviewComponent/index.d.ts +2 -0
  111. package/dist/types/src/components/PreviewComponent/index.d.ts.map +1 -0
  112. package/dist/types/src/components/index.d.ts +1 -2
  113. package/dist/types/src/components/index.d.ts.map +1 -1
  114. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +6 -17
  115. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
  116. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -1
  117. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts +1 -1
  118. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  119. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -1
  120. package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts.map +1 -1
  121. package/dist/types/src/containers/index.d.ts +1 -0
  122. package/dist/types/src/containers/index.d.ts.map +1 -1
  123. package/dist/types/src/hooks/useExtensions.d.ts +5 -5
  124. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  125. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  126. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  127. package/dist/types/src/index.d.ts +1 -2
  128. package/dist/types/src/index.d.ts.map +1 -1
  129. package/dist/types/src/meta.d.ts +32 -2
  130. package/dist/types/src/meta.d.ts.map +1 -1
  131. package/dist/types/src/operations/update-markdown.d.ts.map +1 -1
  132. package/dist/types/src/plugin.workerd.d.ts +2 -0
  133. package/dist/types/src/plugin.workerd.d.ts.map +1 -0
  134. package/dist/types/src/skills/index.d.ts +2 -0
  135. package/dist/types/src/skills/index.d.ts.map +1 -0
  136. package/dist/types/src/skills/markdown-skill.d.ts +4 -0
  137. package/dist/types/src/skills/markdown-skill.d.ts.map +1 -0
  138. package/dist/types/src/types/Markdown.d.ts +12 -20
  139. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  140. package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -1
  141. package/dist/types/src/types/MarkdownOperation.d.ts +5 -28
  142. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -1
  143. package/dist/types/src/types/types.d.ts +2 -0
  144. package/dist/types/src/types/types.d.ts.map +1 -1
  145. package/dist/types/tsconfig.tsbuildinfo +1 -1
  146. package/dx.config.ts +31 -0
  147. package/package.json +67 -59
  148. package/src/MarkdownPlugin.node.ts +2 -1
  149. package/src/MarkdownPlugin.test.ts +1 -1
  150. package/src/MarkdownPlugin.tsx +7 -16
  151. package/src/MarkdownPlugin.workerd.ts +5 -2
  152. package/src/capabilities/anchor-sort.ts +3 -2
  153. package/src/capabilities/comment-config.ts +6 -9
  154. package/src/capabilities/create-object.ts +1 -4
  155. package/src/capabilities/editor-view-state.ts +28 -0
  156. package/src/capabilities/index.ts +2 -16
  157. package/src/capabilities/node.ts +1 -0
  158. package/src/capabilities/react-surface.tsx +29 -13
  159. package/src/capabilities/settings.ts +2 -2
  160. package/src/capabilities/skill-definition.ts +14 -0
  161. package/src/capabilities/state.ts +8 -4
  162. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  163. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +72 -30
  164. package/src/components/MarkdownEditor/MarkdownEditor.tsx +14 -40
  165. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +7 -6
  166. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +2 -2
  167. package/src/components/PreviewComponent/PreviewComponent.tsx +195 -0
  168. package/src/components/PreviewComponent/index.ts +5 -0
  169. package/src/components/index.ts +1 -4
  170. package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +3 -4
  171. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +6 -6
  172. package/src/containers/MarkdownCard/MarkdownCard.tsx +2 -2
  173. package/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.tsx +1 -1
  174. package/src/containers/MarkdownSettings/MarkdownSettings.tsx +54 -0
  175. package/src/containers/index.ts +1 -0
  176. package/src/hooks/useEditorMenuOptions.ts +2 -2
  177. package/src/hooks/useExtensions.tsx +42 -22
  178. package/src/hooks/useLinkQuery.ts +5 -3
  179. package/src/index.ts +1 -2
  180. package/src/meta.ts +2 -22
  181. package/src/operations/create.conversations.json +1 -1
  182. package/src/operations/create.test.ts +5 -12
  183. package/src/operations/update-markdown.ts +7 -27
  184. package/src/operations/update.conversations.json +1 -1
  185. package/src/operations/update.test.ts +86 -16
  186. package/src/plugin.workerd.ts +5 -0
  187. package/src/skills/index.ts +5 -0
  188. package/src/{blueprints/markdown-blueprint.ts → skills/markdown-skill.ts} +8 -7
  189. package/src/testing.ts +2 -2
  190. package/src/translations.ts +1 -1
  191. package/src/types/Markdown.ts +20 -19
  192. package/src/types/MarkdownCapabilities.ts +7 -5
  193. package/src/types/MarkdownEvents.ts +1 -1
  194. package/src/types/MarkdownOperation.ts +12 -6
  195. package/src/types/types.ts +2 -7
  196. package/dist/lib/neutral/MarkdownArticle-LWT5RFFJ.mjs.map +0 -7
  197. package/dist/lib/neutral/MarkdownCard-TBLIRDBO.mjs.map +0 -7
  198. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs +0 -32
  199. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs.map +0 -7
  200. package/dist/lib/neutral/anchor-sort-UXN4RHFX.mjs.map +0 -7
  201. package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs +0 -67
  202. package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs.map +0 -7
  203. package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs +0 -56
  204. package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs.map +0 -7
  205. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs +0 -15
  206. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs.map +0 -7
  207. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  208. package/dist/lib/neutral/chunk-36QFEVOZ.mjs +0 -30
  209. package/dist/lib/neutral/chunk-36QFEVOZ.mjs.map +0 -7
  210. package/dist/lib/neutral/chunk-67DKWOKF.mjs +0 -10
  211. package/dist/lib/neutral/chunk-67DKWOKF.mjs.map +0 -7
  212. package/dist/lib/neutral/chunk-CIJD7P6X.mjs +0 -8
  213. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +0 -7
  214. package/dist/lib/neutral/chunk-Y2LQRUU7.mjs.map +0 -7
  215. package/dist/lib/neutral/comment-config-EGY7RPPW.mjs.map +0 -7
  216. package/dist/lib/neutral/create-object-MU2LGXG6.mjs.map +0 -7
  217. package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs +0 -14
  218. package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs.map +0 -7
  219. package/dist/lib/neutral/react-surface-XYZJBKHZ.mjs.map +0 -7
  220. package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +0 -7
  221. package/dist/lib/neutral/state-5COCF5PN.mjs +0 -44
  222. package/dist/lib/neutral/state-5COCF5PN.mjs.map +0 -7
  223. package/dist/lib/neutral/update-markdown-NNINDDV5.mjs +0 -44
  224. package/dist/lib/neutral/update-markdown-NNINDDV5.mjs.map +0 -7
  225. package/dist/types/src/blueprints/index.d.ts +0 -2
  226. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  227. package/dist/types/src/blueprints/markdown-blueprint.d.ts +0 -4
  228. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +0 -1
  229. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
  230. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  231. package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -5
  232. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
  233. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
  234. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  235. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -6
  236. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  237. package/dist/types/src/paths.d.ts +0 -3
  238. package/dist/types/src/paths.d.ts.map +0 -1
  239. package/src/blueprints/index.ts +0 -5
  240. package/src/capabilities/app-graph-builder.ts +0 -63
  241. package/src/capabilities/app-graph-serializer.ts +0 -64
  242. package/src/capabilities/blueprint-definition.ts +0 -19
  243. package/src/capabilities/navigation-resolver.ts +0 -19
  244. package/src/components/MarkdownSettings/MarkdownSettings.tsx +0 -35
  245. package/src/paths.ts +0 -11
  246. /package/dist/lib/neutral/{chunk-CIJD7P6X.mjs.map → chunk-2V6A5NDQ.mjs.map} +0 -0
  247. /package/dist/lib/neutral/{create-JK35XC4R.mjs.map → create-OQUMKL5I.mjs.map} +0 -0
  248. /package/dist/lib/neutral/{create-markdown-7MLE625M.mjs.map → create-markdown-4O5FDA77.mjs.map} +0 -0
  249. /package/dist/lib/neutral/{open-5YC77C4O.mjs.map → open-BAZIRXII.mjs.map} +0 -0
  250. /package/dist/lib/neutral/{blueprints/index.mjs.map → operation-handler-SDCXGMGK.mjs.map} +0 -0
  251. /package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs.map → scroll-to-anchor-I6HFE5AH.mjs.map} +0 -0
  252. /package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs.map → set-view-mode-NY5OYYIM.mjs.map} +0 -0
  253. /package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts +0 -0
  254. /package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts +0 -0
  255. /package/src/{components → containers}/MarkdownSettings/index.ts +0 -0
@@ -7,7 +7,7 @@ import * as Effect from 'effect/Effect';
7
7
 
8
8
  import { MemoizedAiService } from '@dxos/ai/testing';
9
9
  import { SpaceProperties } from '@dxos/client-protocol';
10
- import { Blueprint, Operation } from '@dxos/compute';
10
+ import { Operation, Skill } from '@dxos/compute';
11
11
  import { Collection, Database, Feed, Obj, Query, Ref } from '@dxos/echo';
12
12
  import { TestHelpers } from '@dxos/effect/testing';
13
13
  import { AgentService } from '@dxos/functions-runtime';
@@ -20,7 +20,7 @@ import { trim } from '@dxos/util';
20
20
 
21
21
  import { WithProperties } from '#testing';
22
22
 
23
- import MarkdownBlueprint from '../blueprints/markdown-blueprint';
23
+ import MarkdownSkill from '../skills/markdown-skill';
24
24
  import { MarkdownOperation } from '../types';
25
25
  import { MarkdownOperationHandlerSet } from './index';
26
26
 
@@ -29,15 +29,8 @@ EntityId.dangerouslyDisableRandomness();
29
29
  const TestLayer = AssistantTestLayer({
30
30
  aiServicePreset: 'edge-remote',
31
31
  operationHandlers: MarkdownOperationHandlerSet,
32
- types: [
33
- SpaceProperties,
34
- Collection.Collection,
35
- Blueprint.Blueprint,
36
- Markdown.Document,
37
- HasSubject.HasSubject,
38
- Feed.Feed,
39
- ],
40
- blueprints: [MarkdownBlueprint.make()],
32
+ types: [SpaceProperties, Collection.Collection, Skill.Skill, Markdown.Document, HasSubject.HasSubject, Feed.Feed],
33
+ skills: [MarkdownSkill.make()],
41
34
  tracing: 'pretty',
42
35
  });
43
36
 
@@ -68,12 +61,87 @@ describe('update', () => {
68
61
  ),
69
62
  );
70
63
 
64
+ it.effect(
65
+ 'append to empty document when oldString is omitted',
66
+ Effect.fnUntraced(
67
+ function* (_) {
68
+ const doc = Markdown.make({
69
+ name: 'Empty Doc',
70
+ content: '',
71
+ });
72
+ yield* Database.add(doc);
73
+
74
+ yield* Operation.invoke(MarkdownOperation.Update, {
75
+ doc: Ref.make(doc),
76
+ edits: [{ newString: '# Hello' }],
77
+ });
78
+
79
+ const updatedDoc = yield* Database.resolve(Obj.getURI(doc), Markdown.Document);
80
+ const text = yield* Database.load(updatedDoc.content);
81
+ expect(text.content).toBe('# Hello');
82
+ },
83
+ WithProperties,
84
+ Effect.provide(TestLayer),
85
+ TestHelpers.provideTestContext,
86
+ ),
87
+ );
88
+
89
+ it.effect(
90
+ 'append to empty document when oldString is empty',
91
+ Effect.fnUntraced(
92
+ function* (_) {
93
+ const doc = Markdown.make({
94
+ name: 'Empty Doc',
95
+ content: '',
96
+ });
97
+ yield* Database.add(doc);
98
+
99
+ yield* Operation.invoke(MarkdownOperation.Update, {
100
+ doc: Ref.make(doc),
101
+ edits: [{ oldString: '', newString: '# Hello' }],
102
+ });
103
+
104
+ const updatedDoc = yield* Database.resolve(Obj.getURI(doc), Markdown.Document);
105
+ const text = yield* Database.load(updatedDoc.content);
106
+ expect(text.content).toBe('# Hello');
107
+ },
108
+ WithProperties,
109
+ Effect.provide(TestLayer),
110
+ TestHelpers.provideTestContext,
111
+ ),
112
+ );
113
+
114
+ it.effect(
115
+ 'append to non-empty document when oldString is omitted',
116
+ Effect.fnUntraced(
117
+ function* (_) {
118
+ const doc = Markdown.make({
119
+ name: 'Shopping list',
120
+ content: '# Shopping list',
121
+ });
122
+ yield* Database.add(doc);
123
+
124
+ yield* Operation.invoke(MarkdownOperation.Update, {
125
+ doc: Ref.make(doc),
126
+ edits: [{ newString: '\n- milk' }],
127
+ });
128
+
129
+ const updatedDoc = yield* Database.resolve(Obj.getURI(doc), Markdown.Document);
130
+ const text = yield* Database.load(updatedDoc.content);
131
+ expect(text.content).toBe('# Shopping list\n- milk');
132
+ },
133
+ WithProperties,
134
+ Effect.provide(TestLayer),
135
+ TestHelpers.provideTestContext,
136
+ ),
137
+ );
138
+
71
139
  it.effect(
72
140
  'create and update a markdown document',
73
141
  Effect.fnUntraced(
74
142
  function* (_) {
75
143
  const agent = yield* AgentService.createSession({
76
- blueprints: [MarkdownBlueprint.make()],
144
+ skills: [MarkdownSkill.make()],
77
145
  });
78
146
 
79
147
  yield* agent.submitPrompt('Create a document with a cookie recipe.');
@@ -132,7 +200,7 @@ describe('update', () => {
132
200
  }),
133
201
  );
134
202
  const agent = yield* AgentService.createSession({
135
- blueprints: [MarkdownBlueprint.make()],
203
+ skills: [MarkdownSkill.make()],
136
204
  context: [Ref.make(document)],
137
205
  });
138
206
 
@@ -175,14 +243,16 @@ describe('update', () => {
175
243
  }),
176
244
  );
177
245
  const agent = yield* AgentService.createSession({
178
- blueprints: [MarkdownBlueprint.make()],
246
+ skills: [MarkdownSkill.make()],
179
247
  context: [Ref.make(document)],
180
248
  });
181
249
 
250
+ // The agent process completes once its input queue drains (maybeComplete → succeed), so all
251
+ // prompts must be enqueued before awaiting completion; the agent then drains them in order,
252
+ // each turn building on the previous edit. Awaiting between submits would let the process
253
+ // succeed after the first turn, dropping the rest.
182
254
  yield* agent.submitPrompt('Add milk to the shopping list.');
183
- yield* agent.waitForCompletion();
184
255
  yield* agent.submitPrompt('Add bread to the shopping list.');
185
- yield* agent.waitForCompletion();
186
256
  yield* agent.submitPrompt('Add eggs to the shopping list.');
187
257
  yield* agent.waitForCompletion();
188
258
 
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { MarkdownPlugin, default } from './MarkdownPlugin.workerd';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { default as MarkdownSkill } from './markdown-skill';
@@ -2,17 +2,17 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Blueprint, Template } from '@dxos/compute';
5
+ import { Skill, Template } from '@dxos/compute';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
8
  import { Markdown, MarkdownOperation } from '#types';
9
9
 
10
10
  const make = () =>
11
- Blueprint.make({
12
- key: Markdown.BLUEPRINT_KEY,
11
+ Skill.make({
12
+ key: Markdown.SKILL_KEY,
13
13
  name: 'Markdown',
14
14
  description: 'Work with markdown documents. Preferred over raw database operations.',
15
- tools: Blueprint.toolDefinitions({
15
+ tools: Skill.toolDefinitions({
16
16
  operations: [MarkdownOperation.Create, MarkdownOperation.Open, MarkdownOperation.Update],
17
17
  }),
18
18
  instructions: Template.make({
@@ -33,11 +33,12 @@ const make = () =>
33
33
  ${'```'}
34
34
  `,
35
35
  }),
36
+ agentCanEnable: true,
36
37
  });
37
38
 
38
- const blueprint: Blueprint.Definition = {
39
- key: Markdown.BLUEPRINT_KEY,
39
+ const skill: Skill.Definition = {
40
+ key: Markdown.SKILL_KEY,
40
41
  make,
41
42
  };
42
43
 
43
- export default blueprint;
44
+ export default skill;
package/src/testing.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  import * as Toolkit from '@effect/ai/Toolkit';
6
6
  import * as Effect from 'effect/Effect';
7
7
 
8
- import { RootCollectionAnnotation } from '@dxos/app-toolkit';
8
+ import { AppAnnotation } from '@dxos/app-toolkit';
9
9
  import { SpaceProperties } from '@dxos/client-protocol';
10
10
  import { Annotation, Collection, Database, Obj, Ref } from '@dxos/echo';
11
11
 
@@ -31,7 +31,7 @@ export const WithProperties = <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.
31
31
  if (!meta.annotations) {
32
32
  meta.annotations = {};
33
33
  }
34
- Annotation.setDictionary(meta.annotations, RootCollectionAnnotation, Ref.make(collection));
34
+ Annotation.setDictionary(meta.annotations, AppAnnotation.RootCollectionAnnotation, Ref.make(collection));
35
35
  });
36
36
  }),
37
37
  effect,
@@ -23,7 +23,7 @@ export const translations = [
23
23
  'delete-object.label': 'Delete document',
24
24
  'object-deleted.label': 'Document deleted',
25
25
  },
26
- [meta.id]: {
26
+ [meta.profile.key]: {
27
27
  'plugin.name': 'Editor',
28
28
  'choose-markdown-from-space-dialog.title': 'Choose one or more documents to add',
29
29
  'empty-choose-markdown-from-space.message': 'None available; try creating a new one instead?',
@@ -4,12 +4,12 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { BlueprintsAnnotation, GraphPropsAnnotation } from '@dxos/app-toolkit';
8
- import { DXN, Annotation, Obj, Ref, Type } from '@dxos/echo';
7
+ import { AppAnnotation } from '@dxos/app-toolkit';
8
+ import { Annotation, DXN, Obj, Ref, Type } from '@dxos/echo';
9
9
  import { DescriptionAnnotation, FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';
10
- import { Text } from '@dxos/schema';
10
+ import { CollectionItemAnnotation, Text } from '@dxos/schema';
11
11
 
12
- export const BLUEPRINT_KEY = 'org.dxos.blueprint.markdown';
12
+ export const SKILL_KEY = 'org.dxos.skill.markdown';
13
13
 
14
14
  // Re-export Settings as merged const/type (not as namespace).
15
15
  import * as SettingsModule from './Settings';
@@ -19,21 +19,22 @@ export type Settings = SettingsModule.Settings;
19
19
  /**
20
20
  * Document Item type.
21
21
  */
22
- export const Document = Schema.Struct({
23
- name: Schema.optional(Schema.String),
24
- description: Schema.optional(Schema.String),
25
- fallbackName: Schema.String.pipe(FormInputAnnotation.set(false), Schema.optional),
26
- content: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),
27
- }).pipe(
28
- LabelAnnotation.set(['name', 'fallbackName']),
29
- DescriptionAnnotation.set('description'),
30
- Annotation.IconAnnotation.set({ icon: 'ph--text-aa--regular', hue: 'indigo' }),
31
- BlueprintsAnnotation.set([BLUEPRINT_KEY]),
32
- GraphPropsAnnotation.set({ managesAutofocus: true }),
33
- Type.makeObject(DXN.make('org.dxos.type.document', '0.1.0')),
34
- );
35
-
36
- export type Document = Type.InstanceType<typeof Document>;
22
+ export class Document extends Type.makeObject<Document>(DXN.make('org.dxos.type.document', '0.1.0'))(
23
+ Schema.Struct({
24
+ name: Schema.optional(Schema.String),
25
+ description: Schema.optional(Schema.String),
26
+ fallbackName: Schema.String.pipe(FormInputAnnotation.set(false), Schema.optional),
27
+ content: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),
28
+ }).pipe(
29
+ LabelAnnotation.set(['name', 'fallbackName']),
30
+ DescriptionAnnotation.set('description'),
31
+ Annotation.IconAnnotation.set({ icon: 'ph--text-aa--regular', hue: 'indigo' }),
32
+ AppAnnotation.SkillsAnnotation.set([SKILL_KEY]),
33
+ AppAnnotation.GraphPropsAnnotation.set({ managesAutofocus: true }),
34
+ AppAnnotation.CardAnnotation.set(true),
35
+ CollectionItemAnnotation.set(true),
36
+ ),
37
+ ) {}
37
38
 
38
39
  /**
39
40
  * Document factory.
@@ -36,16 +36,18 @@ export type EditorViewRegistry = {
36
36
  get: (attendableId: string) => EditorViewEntry | undefined;
37
37
  };
38
38
 
39
- export const Settings = Capability.make<Atom.Writable<Markdown.Settings>>(`${meta.id}.capability.settings`);
39
+ export const Settings = Capability.make<Atom.Writable<Markdown.Settings>>(`${meta.profile.key}.capability.settings`);
40
40
 
41
41
  /** Persisted state atom for view mode per document. */
42
- export const State = Capability.make<Atom.Writable<MarkdownState>>(`${meta.id}.capability.state`);
42
+ export const State = Capability.make<Atom.Writable<MarkdownState>>(`${meta.profile.key}.capability.state`);
43
43
 
44
44
  /** Editor state store for cursor positions, scroll state, etc. */
45
- export const EditorState = Capability.make<EditorStateStore>(`${meta.id}.capability.editor-state`);
45
+ export const EditorState = Capability.make<EditorStateStore>(`${meta.profile.key}.capability.editor-state`);
46
46
 
47
47
  /** Registry of active EditorView instances keyed by attendable ID. */
48
- export const EditorViews = Capability.make<EditorViewRegistry>(`${meta.id}.capability.editor-views`);
48
+ export const EditorViews = Capability.make<EditorViewRegistry>(`${meta.profile.key}.capability.editor-views`);
49
49
 
50
50
  // TODO(burdon): Move to ./types (external API)?
51
- export const ExtensionProvider = Capability.make<MarkdownExtensionProvider[]>(`${meta.id}.capability.extensions`);
51
+ export const ExtensionProvider = Capability.make<MarkdownExtensionProvider[]>(
52
+ `${meta.profile.key}.capability.extensions`,
53
+ );
@@ -10,5 +10,5 @@ import { AppActivationEvents } from '@dxos/app-toolkit';
10
10
  import { meta } from '#meta';
11
11
 
12
12
  export const SetupExtensions: ActivationEvent.ActivationEvent = AppActivationEvents.createStateEvent(
13
- `${meta.id}.event.setup-extensions`,
13
+ `${meta.profile.key}.event.setup-extensions`,
14
14
  );
@@ -8,7 +8,7 @@ import * as Schema from 'effect/Schema';
8
8
 
9
9
  import { Capability } from '@dxos/app-framework';
10
10
  import { Operation } from '@dxos/compute';
11
- import { Database, Ref, Type, DXN } from '@dxos/echo';
11
+ import { Database, DXN, Ref, Type } from '@dxos/echo';
12
12
  import { EditorViewMode } from '@dxos/ui-editor/types';
13
13
  import { trim } from '@dxos/util';
14
14
 
@@ -16,12 +16,17 @@ import { meta } from '#meta';
16
16
 
17
17
  import * as Markdown from './Markdown';
18
18
 
19
- const makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);
19
+ const makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);
20
20
 
21
+ // The edit descriptions feed the markdown skill's LLM tool definition (and its memoized
22
+ // fixtures), so the schema stays local and context-tuned; the apply logic is shared via `Text.apply`.
21
23
  const Edit = Schema.Struct({
22
- oldString: Schema.String.annotations({
23
- description: 'The text to find in the document.',
24
- }),
24
+ oldString: Schema.optional(
25
+ Schema.String.annotations({
26
+ description:
27
+ 'The text to find in the document. Set to undefined to append the newString to the end of the document.',
28
+ }),
29
+ ),
25
30
  newString: Schema.String.annotations({
26
31
  description: 'The text to replace it with.',
27
32
  }),
@@ -123,7 +128,8 @@ export const Update = Operation.make({
123
128
  description: 'The ID of the markdown document.',
124
129
  }),
125
130
  edits: Schema.Array(Edit).annotations({
126
- description: 'The edits to apply to the document. Each edit finds oldString and replaces it with newString.',
131
+ description:
132
+ 'The edits to apply to the document. Each edit finds oldString and replaces it with newString; omit oldString to append newString to the end.',
127
133
  }),
128
134
  }),
129
135
  output: Schema.Struct({
@@ -8,20 +8,15 @@ import { type EditorViewMode } from '@dxos/ui-editor/types';
8
8
 
9
9
  import { type Document } from './Markdown';
10
10
 
11
- // TODO(burdon): Remove these from ./types since not part of plugin-markdown API?
12
- // TODO(wittjosiah): MarkdownExtensionProvider is a part of the MarkdownCapabilities api which should be in ./types.
13
-
14
- // TODO(burdon): Async?
15
11
  export type MarkdownExtensionProvider = (props: {
16
12
  document?: Document;
17
13
  viewMode?: EditorViewMode;
18
14
  }) => Extension | undefined;
19
15
 
20
16
  export type MarkdownPluginState = {
21
- // Codemirror extensions provided by other plugins.
17
+ /** Codemirror extensions provided by other plugins. */
22
18
  extensionProviders?: MarkdownExtensionProvider[];
23
19
 
24
- // TODO(burdon): Extend view mode per document to include scroll position, etc.
25
- // View mode per document.
20
+ /** View mode per document. */
26
21
  viewMode: Record<string, EditorViewMode>;
27
22
  };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/containers/MarkdownArticle/MarkdownArticle.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { Atom } from '@effect-atom/atom-react';\nimport React, { forwardRef, useCallback, useMemo } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';\nimport { AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { useActionRunner } from '@dxos/plugin-graph';\nimport { useObject } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { type SelectionManager } from '@dxos/react-ui-attention';\nimport { Editor } from '@dxos/react-ui-editor';\nimport { Text } from '@dxos/schema';\n\nimport {\n MarkdownEditor,\n MarkdownEditorProvider,\n type MarkdownEditorContentProps,\n type MarkdownEditorProviderProps,\n} from '#components';\nimport { useLinkQuery } from '#hooks';\nimport { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '#types';\n\nexport type MarkdownArticleProps = AppSurface.ObjectArticleProps<\n Markdown.Document | Text.Text,\n {\n id: string;\n settings: Markdown.Settings;\n selectionManager?: SelectionManager;\n } & Pick<MarkdownPluginState, 'extensionProviders'> &\n Pick<MarkdownEditorProviderProps, 'viewMode' | 'onSelectObject' | 'onViewModeChange'> &\n Pick<MarkdownEditorContentProps, 'editorStateStore'>\n>;\n\nexport const MarkdownArticle = forwardRef<HTMLDivElement, MarkdownArticleProps>(\n (\n { role, subject: object, id, attendableId, settings, extensionProviders, onSelectObject, viewMode, ...props },\n forwardedRef,\n ) => {\n const db = Obj.isObject(object) ? Obj.getDatabase(object) : undefined;\n const [docContent] = useObject(Obj.instanceOf(Markdown.Document, object) ? object.content : undefined, 'content');\n const [textContent] = useObject(Obj.instanceOf(Text.Text, object) ? object : undefined, 'content');\n const initialValue = docContent ?? textContent;\n\n // Extensions from other plugins.\n const otherExtensionProviders = useCapabilities(MarkdownCapabilities.ExtensionProvider);\n const extensions = useMemo<Extension[]>(() => {\n if (!Obj.instanceOf(Markdown.Document, object) && !Obj.instanceOf(Text.Text, object)) {\n return [];\n }\n\n const document = Obj.instanceOf(Markdown.Document, object) ? object : undefined;\n return [...(otherExtensionProviders ?? []), ...(extensionProviders ?? [])]\n .flat()\n .reduce((acc: Extension[], provider) => {\n const extension = typeof provider === 'function' ? provider({ document, viewMode }) : provider;\n if (extension) {\n acc.push(extension);\n }\n\n return acc;\n }, []);\n }, [extensionProviders, otherExtensionProviders, object, viewMode]);\n\n // Toolbar actions from app graph.\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const customActions = useMemo(() => {\n return Atom.make((get) => {\n const actions = get(graph.actions(attendableId ?? id));\n const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');\n const edges = nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' }));\n return { nodes, edges };\n });\n }, [graph]);\n\n // File upload.\n const [upload] = useCapabilities(AppCapabilities.FileUploader);\n const handleFileUpload = useMemo(() => {\n if (!db || !upload) {\n return undefined;\n }\n\n return async (file: File) => upload(db, file);\n }, [db, upload]);\n\n // Query for @ refs.\n const handleLinkQuery = useLinkQuery(db);\n\n // Open linked objects.\n const { invokePromise } = useOperationInvoker();\n const handleSelectObject = useCallback(\n (targetId: string) => {\n if (onSelectObject) {\n onSelectObject(targetId);\n } else {\n void invokePromise?.(LayoutOperation.Open, {\n subject: [targetId],\n pivotId: attendableId,\n // TODO(wittjosiah): This should probably pre-validate.\n navigation: 'immediate',\n });\n }\n },\n [onSelectObject, invokePromise, attendableId],\n );\n\n return (\n <MarkdownEditorProvider\n id={id}\n attendableId={attendableId}\n object={object}\n compact={role !== 'article'}\n extensions={extensions}\n settings={settings}\n viewMode={viewMode}\n onAction={runAction}\n onFileUpload={handleFileUpload}\n onLinkQuery={handleLinkQuery}\n onSelectObject={handleSelectObject}\n {...props}\n >\n {(editorRootProps) => (\n <Editor.Root {...editorRootProps}>\n <Panel.Root role={role} ref={forwardedRef}>\n {settings.toolbar && (\n <Panel.Toolbar classNames='bg-toolbar-surface'>\n <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />\n </Panel.Toolbar>\n )}\n <Panel.Content>\n <MarkdownEditor.Content initialValue={initialValue} />\n <MarkdownEditor.Blocks />\n </Panel.Content>\n </Panel.Root>\n </Editor.Root>\n )}\n </MarkdownEditorProvider>\n );\n },\n);\n"],
5
- "mappings": "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",
6
- "names": ["Atom", "React", "forwardRef", "useCallback", "useMemo", "useCapabilities", "useOperationInvoker", "AppCapabilities", "LayoutOperation", "useAppGraph", "Obj", "useActionRunner", "useObject", "Panel", "Editor", "Text", "MarkdownEditor", "MarkdownEditorProvider", "useLinkQuery", "Markdown", "MarkdownCapabilities", "MarkdownArticle", "role", "subject", "object", "id", "attendableId", "settings", "extensionProviders", "onSelectObject", "viewMode", "props", "forwardedRef", "db", "isObject", "getDatabase", "undefined", "docContent", "instanceOf", "Document", "content", "textContent", "initialValue", "otherExtensionProviders", "ExtensionProvider", "extensions", "document", "flat", "reduce", "acc", "provider", "extension", "push", "graph", "runAction", "customActions", "make", "get", "actions", "nodes", "filter", "action", "properties", "disposition", "edges", "map", "node", "source", "target", "relation", "upload", "FileUploader", "handleFileUpload", "file", "handleLinkQuery", "invokePromise", "handleSelectObject", "targetId", "Open", "pivotId", "navigation", "compact", "onAction", "onFileUpload", "onLinkQuery", "editorRootProps", "Root", "ref", "toolbar", "Toolbar", "classNames", "Content", "Blocks"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/containers/MarkdownCard/MarkdownCard.tsx", "../../../src/containers/MarkdownCard/snippet.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { Card, useTranslation } from '@dxos/react-ui';\nimport { Editor } from '@dxos/react-ui-editor';\nimport { Text } from '@dxos/schema';\nimport { mx } from '@dxos/ui-theme';\n\nimport { MarkdownEditor, MarkdownEditorProvider } from '#components';\nimport { meta } from '#meta';\nimport { Markdown } from '#types';\n\nimport { getContentSnippet } from '../../util';\nimport { snippet as snippetExtension } from './snippet';\n\nexport type MarkdownCardProps = { subject: Markdown.Document | Text.Text };\n\nexport const MarkdownCard = ({ subject }: MarkdownCardProps) => {\n const { t } = useTranslation(meta.id);\n // NOTE: Newline is added so that Fade does not obscure the last line.\n const snippet = useMemo(() => getSnippet(subject) + '\\n', [subject]);\n const extensions = useMemo(() => [snippetExtension({ height: 300, scale: 0.8 })], []);\n const info = getInfo(subject);\n\n return (\n <Card.Body>\n {snippet && (\n <Card.Section className='relative'>\n <Card.Row fullWidth>\n <MarkdownEditorProvider id={subject.id} viewMode='readonly' extensions={extensions}>\n {(editorRootProps) => (\n <Editor.Root {...editorRootProps}>\n <MarkdownEditor.Content initialValue={snippet} slots={{ content: { className: 'px-2!' } }} compact />\n </Editor.Root>\n )}\n </MarkdownEditorProvider>\n <Fade />\n </Card.Row>\n </Card.Section>\n )}\n <Card.Section>\n <Card.Row fullWidth>\n <Card.Text classNames='px-2 text-xs text-description'>\n {info.words} {t('words.label', { count: info.words })}\n </Card.Text>\n </Card.Row>\n </Card.Section>\n </Card.Body>\n );\n};\n\nconst Fade = () => (\n <div\n className={mx(\n 'z-10 absolute bottom-0 inset-x-0 h-6 w-full',\n 'bg-gradient-to-b from-transparent to-(--surface-bg) pointer-events-none',\n )}\n />\n);\n\nconst getSnippet = (subject: Markdown.Document | Text.Text, fallback?: string, maxLines = 16) => {\n if (Obj.instanceOf(Markdown.Document, subject)) {\n return Obj.getDescription(subject) || getContentSnippet(subject.content?.target?.content ?? fallback, maxLines);\n } else if (Obj.instanceOf(Text.Text, subject)) {\n return getContentSnippet(subject.content ?? fallback, maxLines);\n }\n};\n\nconst getInfo = (subject: Markdown.Document | Text.Text) => {\n const text = (Obj.instanceOf(Markdown.Document, subject) ? subject.content?.target?.content : subject.content) ?? '';\n return { words: text.split(' ').length };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { EditorState } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type SnippetOptions = {\n /** Maximum height of the editor in pixels. Overflowing content is hidden. */\n height: number;\n /** Zoom factor applied to the editor (e.g. 0.5 renders at 50%). @default 1 */\n scale?: number;\n};\n\n/**\n * CodeMirror extension for rendering a non-scrollable snippet of editor content.\n * Constrains the editor to the given height via CSS `max-height`, wraps long\n * lines (`pre-wrap`), and disables scrolling entirely.\n *\n * NOTE: Uses CSS `zoom` rather than `transform: scale` because `zoom` affects\n * layout, so line wrapping fills the full visual width of the container.\n * `transform: scale` only scales paint output, leaving empty space on the right.\n */\nexport const snippet = ({ height, scale = 1 }: SnippetOptions) => {\n return [\n EditorState.readOnly.of(true),\n EditorView.editable.of(false),\n EditorState.transactionFilter.of((tr) => {\n if (tr.selection) {\n return [];\n } // Drop any selection changes.\n return tr;\n }),\n EditorView.theme({\n // Outer editor element: clip to the caller-specified height.\n '&': {\n maxHeight: `${height}px`,\n overflow: 'hidden',\n },\n '.cm-scroller': {\n // Prevent scroll; scale up the inner clip so the final pixel height matches `height`.\n maxHeight: `${height / scale}px`,\n overflow: 'hidden !important',\n padding: '0',\n },\n '.cm-content': {\n // zoom (unlike transform: scale) affects layout, so line-wrapping fills the full visual width of the container.\n zoom: scale,\n margin: '0',\n padding: '0',\n },\n }),\n ];\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useMemo", "Obj", "Card", "useTranslation", "Editor", "Text", "mx", "MarkdownEditor", "MarkdownEditorProvider", "meta", "Markdown", "EditorState", "EditorView", "snippet", "height", "scale", "readOnly", "of", "editable", "transactionFilter", "tr", "selection", "theme", "maxHeight", "overflow", "padding", "zoom", "margin", "MarkdownCard", "subject", "t", "useTranslation", "meta", "id", "snippet", "useMemo", "getSnippet", "extensions", "snippetExtension", "height", "scale", "info", "getInfo", "Card", "Body", "Section", "className", "Row", "fullWidth", "MarkdownEditorProvider", "viewMode", "editorRootProps", "Editor", "Root", "MarkdownEditor", "Content", "initialValue", "slots", "content", "compact", "Fade", "Text", "classNames", "words", "count", "div", "mx", "fallback", "maxLines", "Obj", "instanceOf", "Markdown", "Document", "getDescription", "getContentSnippet", "target", "text", "split", "length"]
7
- }
@@ -1,32 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/components/MarkdownSettings/MarkdownSettings.tsx
4
- import React from "react";
5
- import { Input } from "@dxos/react-ui";
6
- import { Settings as SettingsForm } from "@dxos/react-ui-form";
7
- import { meta } from "#meta";
8
- import { Markdown } from "#types";
9
- var SnippetsField = ({ value, onChange, readonly }) => /* @__PURE__ */ React.createElement(Input.TextArea, {
10
- disabled: readonly,
11
- rows: 5,
12
- value: value ?? "",
13
- onChange: (event) => onChange(event.target.value)
14
- });
15
- var MarkdownSettings = ({ settings, onSettingsChange }) => {
16
- return /* @__PURE__ */ React.createElement(SettingsForm.Viewport, null, /* @__PURE__ */ React.createElement(SettingsForm.Section, {
17
- title: meta.name ?? "Editor"
18
- }, /* @__PURE__ */ React.createElement(SettingsForm.FieldSet, {
19
- readonly: !onSettingsChange,
20
- schema: Markdown.Settings,
21
- visible: (path, values) => path !== "snippets" || !!values.debug,
22
- fieldMap: {
23
- snippets: SnippetsField
24
- },
25
- values: settings,
26
- onValuesChanged: (values) => onSettingsChange?.(() => values)
27
- })));
28
- };
29
- export {
30
- MarkdownSettings as default
31
- };
32
- //# sourceMappingURL=MarkdownSettings-YCTZJL5V.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/MarkdownSettings/MarkdownSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Input } from '@dxos/react-ui';\nimport { Settings as SettingsForm, type SettingsFieldProps } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Markdown } from '#types';\n\nexport type MarkdownSettingsProps = AppSurface.SettingsArticleProps<Markdown.Settings>;\n\nconst SnippetsField = ({ value, onChange, readonly }: SettingsFieldProps<string | undefined>) => (\n <Input.TextArea disabled={readonly} rows={5} value={value ?? ''} onChange={(event) => onChange(event.target.value)} />\n);\n\nexport const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSettingsProps) => {\n return (\n <SettingsForm.Viewport>\n <SettingsForm.Section title={meta.name ?? 'Editor'}>\n <SettingsForm.FieldSet\n readonly={!onSettingsChange}\n schema={Markdown.Settings}\n visible={(path, values) => path !== 'snippets' || !!values.debug}\n fieldMap={{ snippets: SnippetsField }}\n values={settings}\n onValuesChanged={(values) => onSettingsChange?.(() => values)}\n />\n </SettingsForm.Section>\n </SettingsForm.Viewport>\n );\n};\n"],
5
- "mappings": ";;;AAIA,OAAOA,WAAW;AAGlB,SAASC,aAAa;AACtB,SAASC,YAAYC,oBAA6C;AAElE,SAASC,YAAY;AACrB,SAASC,gBAAgB;AAIzB,IAAMC,gBAAgB,CAAC,EAAEC,OAAOC,UAAUC,SAAQ,MAChD,sBAAA,cAACR,MAAMS,UAAQ;EAACC,UAAUF;EAAUG,MAAM;EAAGL,OAAOA,SAAS;EAAIC,UAAU,CAACK,UAAUL,SAASK,MAAMC,OAAOP,KAAK;;AAG5G,IAAMQ,mBAAmB,CAAC,EAAEC,UAAUC,iBAAgB,MAAyB;AACpF,SACE,sBAAA,cAACd,aAAae,UAAQ,MACpB,sBAAA,cAACf,aAAagB,SAAO;IAACC,OAAOhB,KAAKiB,QAAQ;KACxC,sBAAA,cAAClB,aAAamB,UAAQ;IACpBb,UAAU,CAACQ;IACXM,QAAQlB,SAASH;IACjBsB,SAAS,CAACC,MAAMC,WAAWD,SAAS,cAAc,CAAC,CAACC,OAAOC;IAC3DC,UAAU;MAAEC,UAAUvB;IAAc;IACpCoB,QAAQV;IACRc,iBAAiB,CAACJ,WAAWT,mBAAmB,MAAMS,MAAAA;;AAKhE;",
6
- "names": ["React", "Input", "Settings", "SettingsForm", "meta", "Markdown", "SnippetsField", "value", "onChange", "readonly", "TextArea", "disabled", "rows", "event", "target", "MarkdownSettings", "settings", "onSettingsChange", "Viewport", "Section", "title", "name", "FieldSet", "schema", "visible", "path", "values", "debug", "fieldMap", "snippets", "onValuesChanged"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/anchor-sort.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Relation, Type } from '@dxos/echo';\nimport { createDocAccessor, getRangeFromCursor } from '@dxos/echo-client';\nimport { type AnchoredTo } from '@dxos/types';\n\nimport { Markdown } from '#types';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(AppCapabilities.AnchorSort, {\n key: Type.getTypename(Markdown.Document),\n sort: (anchorA: AnchoredTo.AnchoredTo, anchorB: AnchoredTo.AnchoredTo) => {\n const doc = Relation.getTarget(anchorA) as Markdown.Document;\n const accessor = doc.content.target ? createDocAccessor(doc.content.target, ['content']) : undefined;\n if (doc !== Relation.getTarget(anchorB) || !accessor) {\n return 0;\n }\n\n const getStartPosition = (cursor: string | undefined) => {\n const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;\n return range?.start ?? Number.MAX_SAFE_INTEGER;\n };\n\n const posA = getStartPosition(anchorA.anchor);\n const posB = getStartPosition(anchorB.anchor);\n return posA - posB;\n },\n }),\n ),\n);\n"],
5
- "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,UAAUC,YAAY;AAC/B,SAASC,mBAAmBC,0BAA0B;AAGtD,SAASC,gBAAgB;AAEzB,IAAA,sBAAeN,WAAWO,WAAW,MAC5BC,eACLR,WAAWS,YAAYR,gBAAgBS,YAAY;EACjDC,KAAKR,KAAKS,YAAYN,SAASO,QAAQ;EACvCC,MAAM,CAACC,SAAgCC,YAAAA;AACrC,UAAMC,MAAMf,SAASgB,UAAUH,OAAAA;AAC/B,UAAMI,WAAWF,IAAIG,QAAQC,SAASjB,kBAAkBa,IAAIG,QAAQC,QAAQ;MAAC;KAAU,IAAIC;AAC3F,QAAIL,QAAQf,SAASgB,UAAUF,OAAAA,KAAY,CAACG,UAAU;AACpD,aAAO;IACT;AAEA,UAAMI,mBAAmB,CAACC,WAAAA;AACxB,YAAMC,QAAQD,SAASnB,mBAAmBc,UAAUK,MAAAA,IAAUF;AAC9D,aAAOG,OAAOC,SAASC,OAAOC;IAChC;AAEA,UAAMC,OAAON,iBAAiBR,QAAQe,MAAM;AAC5C,UAAMC,OAAOR,iBAAiBP,QAAQc,MAAM;AAC5C,WAAOD,OAAOE;EAChB;AACF,CAAA,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "AppCapabilities", "Relation", "Type", "createDocAccessor", "getRangeFromCursor", "Markdown", "makeModule", "succeed", "contributes", "AnchorSort", "key", "getTypename", "Document", "sort", "anchorA", "anchorB", "doc", "getTarget", "accessor", "content", "target", "undefined", "getStartPosition", "cursor", "range", "start", "Number", "MAX_SAFE_INTEGER", "posA", "anchor", "posB"]
7
- }
@@ -1,67 +0,0 @@
1
- import {
2
- getDocumentsPath
3
- } from "./chunk-67DKWOKF.mjs";
4
- import "./chunk-J5LGTIGS.mjs";
5
-
6
- // src/capabilities/app-graph-builder.ts
7
- import * as Effect from "effect/Effect";
8
- import * as Option from "effect/Option";
9
- import { Capability } from "@dxos/app-framework";
10
- import { AppCapabilities, LayoutOperation, createTypeSectionExtension } from "@dxos/app-toolkit";
11
- import { isSpace } from "@dxos/client/echo";
12
- import { Operation } from "@dxos/compute";
13
- import { Type } from "@dxos/echo";
14
- import { GraphBuilder, Node } from "@dxos/plugin-graph";
15
- import { SpaceOperation } from "@dxos/plugin-space";
16
- import { Markdown } from "#types";
17
- var documentTypename = Type.getTypename(Markdown.Document);
18
- var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
19
- const extensions = yield* Effect.all([
20
- createTypeSectionExtension(Markdown.Document),
21
- GraphBuilder.createExtension({
22
- id: "documentsSectionActions",
23
- match: (node) => {
24
- const space = isSpace(node.properties.space) ? node.properties.space : void 0;
25
- return node.type === documentTypename && space ? Option.some(space) : Option.none();
26
- },
27
- actions: (space) => Effect.succeed([
28
- Node.makeAction({
29
- id: "create-document",
30
- data: () => Effect.gen(function* () {
31
- const doc = Markdown.make({});
32
- const { subject } = yield* Operation.invoke(SpaceOperation.AddObject, {
33
- object: doc,
34
- target: space.db,
35
- hidden: true,
36
- targetNodeId: getDocumentsPath(space.db.spaceId)
37
- }, {
38
- spaceId: space.db.spaceId
39
- });
40
- yield* Operation.invoke(LayoutOperation.Open, {
41
- subject: [
42
- ...subject
43
- ]
44
- }, {
45
- spaceId: space.db.spaceId
46
- });
47
- }),
48
- properties: {
49
- label: [
50
- "add-object.label",
51
- {
52
- ns: documentTypename
53
- }
54
- ],
55
- icon: "ph--plus--regular",
56
- disposition: "list-item-primary"
57
- }
58
- })
59
- ])
60
- })
61
- ]);
62
- return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
63
- }));
64
- export {
65
- app_graph_builder_default as default
66
- };
67
- //# sourceMappingURL=app-graph-builder-BWBA23FF.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities, LayoutOperation, createTypeSectionExtension } from '@dxos/app-toolkit';\nimport { isSpace } from '@dxos/client/echo';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { GraphBuilder, Node } from '@dxos/plugin-graph';\nimport { SpaceOperation } from '@dxos/plugin-space';\n\nimport { Markdown } from '#types';\n\nimport { getDocumentsPath } from '../paths';\n\nconst documentTypename = Type.getTypename(Markdown.Document);\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* Effect.all([\n createTypeSectionExtension(Markdown.Document),\n\n GraphBuilder.createExtension({\n id: 'documentsSectionActions',\n match: (node) => {\n const space = isSpace(node.properties.space) ? node.properties.space : undefined;\n return node.type === documentTypename && space ? Option.some(space) : Option.none();\n },\n actions: (space) =>\n Effect.succeed([\n Node.makeAction({\n id: 'create-document',\n data: () =>\n Effect.gen(function* () {\n const doc = Markdown.make({});\n const { subject } = yield* Operation.invoke(\n SpaceOperation.AddObject,\n { object: doc, target: space.db, hidden: true, targetNodeId: getDocumentsPath(space.db.spaceId) },\n { spaceId: space.db.spaceId },\n );\n yield* Operation.invoke(\n LayoutOperation.Open,\n { subject: [...subject] },\n { spaceId: space.db.spaceId },\n );\n }),\n properties: {\n label: ['add-object.label', { ns: documentTypename }],\n icon: 'ph--plus--regular',\n disposition: 'list-item-primary',\n },\n }),\n ]),\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
- "mappings": ";;;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiBC,iBAAiBC,kCAAkC;AAC7E,SAASC,eAAe;AACxB,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,cAAcC,YAAY;AACnC,SAASC,sBAAsB;AAE/B,SAASC,gBAAgB;AAIzB,IAAMC,mBAAmBC,KAAKC,YAAYC,SAASC,QAAQ;AAE3D,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAcC,WAAI;IACnCC,2BAA2BP,SAASC,QAAQ;IAE5CO,aAAaC,gBAAgB;MAC3BC,IAAI;MACJC,OAAO,CAACC,SAAAA;AACN,cAAMC,QAAQC,QAAQF,KAAKG,WAAWF,KAAK,IAAID,KAAKG,WAAWF,QAAQG;AACvE,eAAOJ,KAAKK,SAASpB,oBAAoBgB,QAAeK,YAAKL,KAAAA,IAAgBM,YAAI;MACnF;MACAC,SAAS,CAACP,UACDQ,eAAQ;QACbC,KAAKC,WAAW;UACdb,IAAI;UACJc,MAAM,MACGC,WAAI,aAAA;AACT,kBAAMC,MAAM1B,SAAS2B,KAAK,CAAC,CAAA;AAC3B,kBAAM,EAAEC,QAAO,IAAK,OAAOC,UAAUC,OACnCC,eAAeC,WACf;cAAEC,QAAQP;cAAKQ,QAAQrB,MAAMsB;cAAIC,QAAQ;cAAMC,cAAcC,iBAAiBzB,MAAMsB,GAAGI,OAAO;YAAE,GAChG;cAAEA,SAAS1B,MAAMsB,GAAGI;YAAQ,CAAA;AAE9B,mBAAOV,UAAUC,OACfU,gBAAgBC,MAChB;cAAEb,SAAS;mBAAIA;;YAAS,GACxB;cAAEW,SAAS1B,MAAMsB,GAAGI;YAAQ,CAAA;UAEhC,CAAA;UACFxB,YAAY;YACV2B,OAAO;cAAC;cAAoB;gBAAEC,IAAI9C;cAAiB;;YACnD+C,MAAM;YACNC,aAAa;UACf;QACF,CAAA;OACD;IACL,CAAA;GACD;AAED,SAAO3C,WAAW4C,YAAYC,gBAAgBC,iBAAiB3C,UAAAA;AACjE,CAAA,CAAA;",
6
- "names": ["Effect", "Option", "Capability", "AppCapabilities", "LayoutOperation", "createTypeSectionExtension", "isSpace", "Operation", "Type", "GraphBuilder", "Node", "SpaceOperation", "Markdown", "documentTypename", "Type", "getTypename", "Markdown", "Document", "Capability", "makeModule", "fnUntraced", "extensions", "all", "createTypeSectionExtension", "GraphBuilder", "createExtension", "id", "match", "node", "space", "isSpace", "properties", "undefined", "type", "some", "none", "actions", "succeed", "Node", "makeAction", "data", "gen", "doc", "make", "subject", "Operation", "invoke", "SpaceOperation", "AddObject", "object", "target", "db", "hidden", "targetNodeId", "getDocumentsPath", "spaceId", "LayoutOperation", "Open", "label", "ns", "icon", "disposition", "contributes", "AppCapabilities", "AppGraphBuilder"]
7
- }