@dxos/plugin-markdown 0.7.5-main.499c70c → 0.7.5-main.5ae2ba8

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 (184) hide show
  1. package/dist/lib/browser/{MarkdownContainer-XY6NEUOA.mjs → MarkdownContainer-TTRIEPSE.mjs} +157 -94
  2. package/dist/lib/browser/MarkdownContainer-TTRIEPSE.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-serializer-BG3MHYI4.mjs +51 -0
  4. package/dist/lib/browser/app-graph-serializer-BG3MHYI4.mjs.map +7 -0
  5. package/dist/lib/browser/artifact-definition-7CNIKNQT.mjs +110 -0
  6. package/dist/lib/browser/artifact-definition-7CNIKNQT.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-EZ65DY2X.mjs +16 -0
  8. package/dist/lib/browser/chunk-EZ65DY2X.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-R4MG2DP2.mjs → chunk-GPKIUDG2.mjs} +22 -9
  10. package/dist/lib/browser/chunk-GPKIUDG2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-6FIHBJRV.mjs → chunk-P4K367ZX.mjs} +17 -12
  12. package/dist/lib/browser/chunk-P4K367ZX.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-ROJ4VUZB.mjs +47 -0
  14. package/dist/lib/browser/chunk-ROJ4VUZB.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-YTHIPV5Q.mjs +22 -0
  16. package/dist/lib/browser/chunk-YTHIPV5Q.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +124 -366
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/intent-resolver-CIFJVGAU.mjs +43 -0
  20. package/dist/lib/browser/intent-resolver-CIFJVGAU.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/react-surface-LG2MTHC7.mjs +149 -0
  23. package/dist/lib/browser/react-surface-LG2MTHC7.mjs.map +7 -0
  24. package/dist/lib/browser/settings-U7E4DUWJ.mjs +28 -0
  25. package/dist/lib/browser/settings-U7E4DUWJ.mjs.map +7 -0
  26. package/dist/lib/browser/state-QMQXUPSI.mjs +37 -0
  27. package/dist/lib/browser/state-QMQXUPSI.mjs.map +7 -0
  28. package/dist/lib/browser/thread-Y4WMNFBC.mjs +36 -0
  29. package/dist/lib/browser/thread-Y4WMNFBC.mjs.map +7 -0
  30. package/dist/lib/browser/types/index.mjs +4 -4
  31. package/dist/lib/node/{MarkdownContainer-EX6YDF6J.cjs → MarkdownContainer-2R6WRR5T.cjs} +160 -99
  32. package/dist/lib/node/MarkdownContainer-2R6WRR5T.cjs.map +7 -0
  33. package/dist/lib/node/app-graph-serializer-QZWERV4M.cjs +62 -0
  34. package/dist/lib/node/app-graph-serializer-QZWERV4M.cjs.map +7 -0
  35. package/dist/lib/node/artifact-definition-E6EQTWBS.cjs +124 -0
  36. package/dist/lib/node/artifact-definition-E6EQTWBS.cjs.map +7 -0
  37. package/dist/lib/node/{meta.cjs → chunk-23NQGZX3.cjs} +13 -8
  38. package/dist/lib/node/chunk-23NQGZX3.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-CQMXZ54Z.cjs → chunk-CZXXBKMN.cjs} +21 -16
  40. package/dist/lib/node/chunk-CZXXBKMN.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-PHHIPRJC.cjs → chunk-QZ4XQYNC.cjs} +16 -9
  42. package/dist/lib/node/chunk-QZ4XQYNC.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-SXQAPZZU.cjs → chunk-VFE34V2L.cjs} +40 -12
  44. package/dist/lib/node/chunk-VFE34V2L.cjs.map +7 -0
  45. package/dist/lib/node/chunk-ZO5ABSHT.cjs +64 -0
  46. package/dist/lib/node/chunk-ZO5ABSHT.cjs.map +7 -0
  47. package/dist/lib/node/index.cjs +113 -364
  48. package/dist/lib/node/index.cjs.map +4 -4
  49. package/dist/lib/node/intent-resolver-6COP7TEQ.cjs +56 -0
  50. package/dist/lib/node/intent-resolver-6COP7TEQ.cjs.map +7 -0
  51. package/dist/lib/node/meta.json +1 -1
  52. package/dist/lib/node/react-surface-JJ2DHTCW.cjs +162 -0
  53. package/dist/lib/node/react-surface-JJ2DHTCW.cjs.map +7 -0
  54. package/dist/lib/node/settings-4OYDMRVY.cjs +42 -0
  55. package/dist/lib/node/settings-4OYDMRVY.cjs.map +7 -0
  56. package/dist/lib/node/state-QSA5AOLH.cjs +51 -0
  57. package/dist/lib/node/state-QSA5AOLH.cjs.map +7 -0
  58. package/dist/lib/node/thread-BZE6RKFE.cjs +52 -0
  59. package/dist/lib/node/thread-BZE6RKFE.cjs.map +7 -0
  60. package/dist/lib/node/types/index.cjs +7 -7
  61. package/dist/lib/node/types/index.cjs.map +1 -1
  62. package/dist/lib/node-esm/{MarkdownContainer-E7W623A7.mjs → MarkdownContainer-WXTODKI4.mjs} +157 -94
  63. package/dist/lib/node-esm/MarkdownContainer-WXTODKI4.mjs.map +7 -0
  64. package/dist/lib/node-esm/app-graph-serializer-H7LI476D.mjs +52 -0
  65. package/dist/lib/node-esm/app-graph-serializer-H7LI476D.mjs.map +7 -0
  66. package/dist/lib/node-esm/artifact-definition-S64WTOFK.mjs +111 -0
  67. package/dist/lib/node-esm/artifact-definition-S64WTOFK.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-Y76MM22C.mjs → chunk-7I4X2C7G.mjs} +22 -9
  69. package/dist/lib/node-esm/chunk-7I4X2C7G.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-BBVPC53M.mjs +24 -0
  71. package/dist/lib/node-esm/chunk-BBVPC53M.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-ZVFBKBSA.mjs → chunk-MMVIEZ43.mjs} +17 -12
  73. package/dist/lib/node-esm/chunk-MMVIEZ43.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-OXPPXUUU.mjs +48 -0
  75. package/dist/lib/node-esm/chunk-OXPPXUUU.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-Y5QKDC4V.mjs +17 -0
  77. package/dist/lib/node-esm/chunk-Y5QKDC4V.mjs.map +7 -0
  78. package/dist/lib/node-esm/index.mjs +124 -366
  79. package/dist/lib/node-esm/index.mjs.map +4 -4
  80. package/dist/lib/node-esm/intent-resolver-GF3EHDYE.mjs +44 -0
  81. package/dist/lib/node-esm/intent-resolver-GF3EHDYE.mjs.map +7 -0
  82. package/dist/lib/node-esm/meta.json +1 -1
  83. package/dist/lib/node-esm/react-surface-O2WYA2AU.mjs +150 -0
  84. package/dist/lib/node-esm/react-surface-O2WYA2AU.mjs.map +7 -0
  85. package/dist/lib/node-esm/settings-MEN2YBLA.mjs +29 -0
  86. package/dist/lib/node-esm/settings-MEN2YBLA.mjs.map +7 -0
  87. package/dist/lib/node-esm/state-FF4NXLWU.mjs +38 -0
  88. package/dist/lib/node-esm/state-FF4NXLWU.mjs.map +7 -0
  89. package/dist/lib/node-esm/thread-O2YDKT77.mjs +37 -0
  90. package/dist/lib/node-esm/thread-O2YDKT77.mjs.map +7 -0
  91. package/dist/lib/node-esm/types/index.mjs +4 -4
  92. package/dist/types/src/MarkdownPlugin.d.ts +1 -3
  93. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/app-graph-serializer.d.ts +4 -0
  95. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/artifact-definition.d.ts +11 -0
  97. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/capabilities.d.ts +12 -0
  99. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/index.d.ts +17 -0
  101. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  103. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  105. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/settings.d.ts +4 -0
  107. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/state.d.ts +11 -0
  109. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/thread.d.ts +6 -0
  111. package/dist/types/src/capabilities/thread.d.ts.map +1 -0
  112. package/dist/types/src/components/MarkdownContainer.d.ts +2 -3
  113. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  114. package/dist/types/src/components/MarkdownEditor.d.ts +16 -2
  115. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  116. package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
  117. package/dist/types/src/components/MarkdownSettings.d.ts +1 -2
  118. package/dist/types/src/components/MarkdownSettings.d.ts.map +1 -1
  119. package/dist/types/src/components/Toolbar.stories.d.ts +2 -2
  120. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/index.d.ts +1 -1
  122. package/dist/types/src/components/index.d.ts.map +1 -1
  123. package/dist/types/src/events.d.ts +4 -0
  124. package/dist/types/src/events.d.ts.map +1 -0
  125. package/dist/types/src/extensions.d.ts +2 -2
  126. package/dist/types/src/extensions.d.ts.map +1 -1
  127. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  128. package/dist/types/src/index.d.ts +3 -3
  129. package/dist/types/src/index.d.ts.map +1 -1
  130. package/dist/types/src/meta.d.ts +2 -2
  131. package/dist/types/src/meta.d.ts.map +1 -1
  132. package/dist/types/src/translations.d.ts +3 -0
  133. package/dist/types/src/translations.d.ts.map +1 -1
  134. package/dist/types/src/types/schema.d.ts +18 -25
  135. package/dist/types/src/types/schema.d.ts.map +1 -1
  136. package/dist/types/src/types/types.d.ts +12 -26
  137. package/dist/types/src/types/types.d.ts.map +1 -1
  138. package/dist/types/src/util.d.ts +1 -5
  139. package/dist/types/src/util.d.ts.map +1 -1
  140. package/dist/types/tsconfig.tsbuildinfo +1 -1
  141. package/package.json +34 -38
  142. package/src/MarkdownPlugin.tsx +95 -215
  143. package/src/capabilities/app-graph-serializer.ts +50 -0
  144. package/src/capabilities/artifact-definition.ts +85 -0
  145. package/src/capabilities/capabilities.ts +20 -0
  146. package/src/capabilities/index.ts +15 -0
  147. package/src/capabilities/intent-resolver.ts +33 -0
  148. package/src/capabilities/react-surface.tsx +71 -0
  149. package/src/capabilities/settings.ts +25 -0
  150. package/src/capabilities/state.ts +31 -0
  151. package/src/capabilities/thread.ts +34 -0
  152. package/src/components/MarkdownContainer.tsx +6 -7
  153. package/src/components/MarkdownEditor.stories.tsx +16 -5
  154. package/src/components/MarkdownEditor.tsx +91 -53
  155. package/src/components/MarkdownSettings.tsx +3 -3
  156. package/src/components/Toolbar.stories.tsx +16 -22
  157. package/src/events.ts +11 -0
  158. package/src/extensions.tsx +18 -14
  159. package/src/hooks/useSelectCurrentThread.tsx +13 -8
  160. package/src/index.ts +3 -5
  161. package/src/meta.ts +7 -2
  162. package/src/translations.ts +1 -0
  163. package/src/types/schema.ts +1 -5
  164. package/src/types/types.ts +16 -44
  165. package/src/util.tsx +2 -8
  166. package/dist/lib/browser/MarkdownContainer-XY6NEUOA.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-4X6YX3KU.mjs +0 -15
  168. package/dist/lib/browser/chunk-4X6YX3KU.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-6FIHBJRV.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-R4MG2DP2.mjs.map +0 -7
  171. package/dist/lib/browser/meta.mjs +0 -9
  172. package/dist/lib/browser/meta.mjs.map +0 -7
  173. package/dist/lib/node/MarkdownContainer-EX6YDF6J.cjs.map +0 -7
  174. package/dist/lib/node/chunk-CQMXZ54Z.cjs.map +0 -7
  175. package/dist/lib/node/chunk-PHHIPRJC.cjs.map +0 -7
  176. package/dist/lib/node/chunk-SXQAPZZU.cjs.map +0 -7
  177. package/dist/lib/node/meta.cjs.map +0 -7
  178. package/dist/lib/node-esm/MarkdownContainer-E7W623A7.mjs.map +0 -7
  179. package/dist/lib/node-esm/chunk-BABK7FMW.mjs +0 -17
  180. package/dist/lib/node-esm/chunk-BABK7FMW.mjs.map +0 -7
  181. package/dist/lib/node-esm/chunk-Y76MM22C.mjs.map +0 -7
  182. package/dist/lib/node-esm/chunk-ZVFBKBSA.mjs.map +0 -7
  183. package/dist/lib/node-esm/meta.mjs +0 -10
  184. package/dist/lib/node-esm/meta.mjs.map +0 -7
package/package.json CHANGED
@@ -1,23 +1,19 @@
1
1
  {
2
2
  "name": "@dxos/plugin-markdown",
3
- "version": "0.7.5-main.499c70c",
3
+ "version": "0.7.5-main.5ae2ba8",
4
4
  "description": "DXOS Surface plugin for interacting with Markdown",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
8
8
  "author": "DXOS.org",
9
9
  "sideEffects": true,
10
+ "type": "module",
10
11
  "exports": {
11
12
  ".": {
12
13
  "types": "./dist/types/src/index.d.ts",
13
14
  "browser": "./dist/lib/browser/index.mjs",
14
15
  "node": "./dist/lib/node-esm/index.mjs"
15
16
  },
16
- "./meta": {
17
- "types": "./dist/types/src/meta.d.ts",
18
- "browser": "./dist/lib/browser/meta.mjs",
19
- "node": "./dist/lib/node-esm/meta.mjs"
20
- },
21
17
  "./types": {
22
18
  "types": "./dist/types/src/types/index.d.ts",
23
19
  "browser": "./dist/lib/browser/types/index.mjs",
@@ -27,9 +23,6 @@
27
23
  "types": "dist/types/src/index.d.ts",
28
24
  "typesVersions": {
29
25
  "*": {
30
- "meta": [
31
- "dist/types/src/meta.d.ts"
32
- ],
33
26
  "types": [
34
27
  "dist/types/src/types/index.d.ts"
35
28
  ]
@@ -44,29 +37,31 @@
44
37
  "@codemirror/view": "^6.34.1",
45
38
  "@effect/schema": "^0.75.5",
46
39
  "@preact/signals-core": "^1.6.0",
47
- "effect": "^3.9.2",
48
- "@dxos/app-framework": "0.7.5-main.499c70c",
49
- "@dxos/echo-schema": "0.7.5-main.499c70c",
50
- "@dxos/invariant": "0.7.5-main.499c70c",
51
- "@dxos/async": "0.7.5-main.499c70c",
52
- "@dxos/keys": "0.7.5-main.499c70c",
53
- "@dxos/log": "0.7.5-main.499c70c",
54
- "@dxos/plugin-attention": "0.7.5-main.499c70c",
55
- "@dxos/live-object": "0.7.5-main.499c70c",
56
- "@dxos/local-storage": "0.7.5-main.499c70c",
57
- "@dxos/plugin-client": "0.7.5-main.499c70c",
58
- "@dxos/plugin-graph": "0.7.5-main.499c70c",
59
- "@dxos/plugin-theme": "0.7.5-main.499c70c",
60
- "@dxos/react-client": "0.7.5-main.499c70c",
61
- "@dxos/react-ui-attention": "0.7.5-main.499c70c",
62
- "@dxos/plugin-space": "0.7.5-main.499c70c",
63
- "@dxos/react-ui-card": "0.7.5-main.499c70c",
64
- "@dxos/react-hooks": "0.7.5-main.499c70c",
65
- "@dxos/react-ui-editor": "0.7.5-main.499c70c",
66
- "@dxos/react-ui-form": "0.7.5-main.499c70c",
67
- "@dxos/react-ui-mosaic": "0.7.5-main.499c70c",
68
- "@dxos/react-ui-stack": "0.7.5-main.499c70c",
69
- "@dxos/util": "0.7.5-main.499c70c"
40
+ "effect": "^3.12.3",
41
+ "react-dropzone": "^14.2.3",
42
+ "@dxos/app-framework": "0.7.5-main.5ae2ba8",
43
+ "@dxos/artifact": "0.7.5-main.5ae2ba8",
44
+ "@dxos/echo-schema": "0.7.5-main.5ae2ba8",
45
+ "@dxos/async": "0.7.5-main.5ae2ba8",
46
+ "@dxos/keys": "0.7.5-main.5ae2ba8",
47
+ "@dxos/live-object": "0.7.5-main.5ae2ba8",
48
+ "@dxos/invariant": "0.7.5-main.5ae2ba8",
49
+ "@dxos/local-storage": "0.7.5-main.5ae2ba8",
50
+ "@dxos/log": "0.7.5-main.5ae2ba8",
51
+ "@dxos/plugin-client": "0.7.5-main.5ae2ba8",
52
+ "@dxos/plugin-attention": "0.7.5-main.5ae2ba8",
53
+ "@dxos/plugin-graph": "0.7.5-main.5ae2ba8",
54
+ "@dxos/plugin-theme": "0.7.5-main.5ae2ba8",
55
+ "@dxos/plugin-space": "0.7.5-main.5ae2ba8",
56
+ "@dxos/react-hooks": "0.7.5-main.5ae2ba8",
57
+ "@dxos/react-client": "0.7.5-main.5ae2ba8",
58
+ "@dxos/react-ui-card": "0.7.5-main.5ae2ba8",
59
+ "@dxos/react-ui-attention": "0.7.5-main.5ae2ba8",
60
+ "@dxos/react-ui-editor": "0.7.5-main.5ae2ba8",
61
+ "@dxos/react-ui-form": "0.7.5-main.5ae2ba8",
62
+ "@dxos/schema": "0.7.5-main.5ae2ba8",
63
+ "@dxos/react-ui-stack": "0.7.5-main.5ae2ba8",
64
+ "@dxos/util": "0.7.5-main.5ae2ba8"
70
65
  },
71
66
  "devDependencies": {
72
67
  "@phosphor-icons/react": "^2.1.5",
@@ -75,17 +70,18 @@
75
70
  "react": "~18.2.0",
76
71
  "react-dom": "~18.2.0",
77
72
  "vite": "5.4.7",
78
- "@dxos/react-ui": "0.7.5-main.499c70c",
79
- "@dxos/random": "0.7.5-main.499c70c",
80
- "@dxos/react-ui-theme": "0.7.5-main.499c70c",
81
- "@dxos/storybook-utils": "0.7.5-main.499c70c"
73
+ "@dxos/debug": "0.7.5-main.5ae2ba8",
74
+ "@dxos/react-ui": "0.7.5-main.5ae2ba8",
75
+ "@dxos/storybook-utils": "0.7.5-main.5ae2ba8",
76
+ "@dxos/random": "0.7.5-main.5ae2ba8",
77
+ "@dxos/react-ui-theme": "0.7.5-main.5ae2ba8"
82
78
  },
83
79
  "peerDependencies": {
84
80
  "@phosphor-icons/react": "^2.1.5",
85
81
  "react": "~18.2.0",
86
82
  "react-dom": "~18.2.0",
87
- "@dxos/react-ui": "0.7.5-main.499c70c",
88
- "@dxos/react-ui-theme": "0.7.5-main.499c70c"
83
+ "@dxos/react-ui": "0.7.5-main.5ae2ba8",
84
+ "@dxos/react-ui-theme": "0.7.5-main.5ae2ba8"
89
85
  },
90
86
  "publishConfig": {
91
87
  "access": "public"
@@ -1,86 +1,58 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { pipe } from 'effect';
6
- import React from 'react';
5
+ import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
6
+ import { type BaseObject } from '@dxos/echo-schema';
7
+ import { RefArray } from '@dxos/live-object';
8
+ import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
9
+ import { SpaceCapabilities, ThreadEvents } from '@dxos/plugin-space';
10
+ import { defineObjectForm } from '@dxos/plugin-space/types';
11
+ import { translations as editorTranslations } from '@dxos/react-ui-editor';
12
+ import { TextType } from '@dxos/schema';
7
13
 
8
14
  import {
9
- parseIntentPlugin,
10
- resolvePlugin,
11
- type PluginDefinition,
12
- createSurface,
13
- createResolver,
14
- createIntent,
15
- chain,
16
- } from '@dxos/app-framework';
17
- import type { BaseObject } from '@dxos/echo-schema';
18
- import { create, makeRef, RefArray } from '@dxos/live-object';
19
- import { LocalStorageStore } from '@dxos/local-storage';
20
- import { SpaceAction } from '@dxos/plugin-space';
21
- import { CollectionType } from '@dxos/plugin-space/types';
22
- import { createDocAccessor, fullyQualifiedId, getRangeFromCursor, isSpace } from '@dxos/react-client/echo';
23
- import {
24
- type EditorInputMode,
25
- type EditorViewMode,
26
- translations as editorTranslations,
27
- createEditorStateStore,
28
- } from '@dxos/react-ui-editor';
29
-
30
- import { MarkdownContainer, MarkdownSettings } from './components';
31
- import meta, { MARKDOWN_PLUGIN } from './meta';
15
+ MarkdownState,
16
+ MarkdownSettings,
17
+ ReactSurface,
18
+ IntentResolver,
19
+ AppGraphSerializer,
20
+ Thread,
21
+ ArtifactDefinition,
22
+ } from './capabilities';
23
+ import { MarkdownEvents } from './events';
24
+ import { MARKDOWN_PLUGIN, meta } from './meta';
32
25
  import translations from './translations';
33
- import { DocumentType, isEditorModel, TextType } from './types';
34
- import {
35
- type MarkdownPluginProvides,
36
- type MarkdownSettingsProps,
37
- MarkdownAction,
38
- type MarkdownPluginState,
39
- } from './types';
40
- import { markdownExtensionPlugins, serializer } from './util';
41
-
42
- export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
43
- const settings = new LocalStorageStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN, {
44
- defaultViewMode: 'preview',
45
- toolbar: true,
46
- numberedHeadings: true,
47
- folding: true,
48
- experimental: false,
49
- });
50
-
51
- const editorStateStore = createEditorStateStore(`${MARKDOWN_PLUGIN}/editor`);
52
-
53
- const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });
54
-
55
- const getViewMode = (id: string) => (id && state.values.viewMode[id]) || settings.values.defaultViewMode;
56
- const setViewMode = (id: string, viewMode: EditorViewMode) => (state.values.viewMode[id] = viewMode);
57
-
58
- return {
59
- meta,
60
- ready: async ({ plugins }) => {
61
- settings
62
- .prop({ key: 'defaultViewMode', type: LocalStorageStore.enum<EditorViewMode>() })
63
- .prop({ key: 'editorInputMode', type: LocalStorageStore.enum<EditorInputMode>({ allowUndefined: true }) })
64
- .prop({ key: 'toolbar', type: LocalStorageStore.bool({ allowUndefined: true }) })
65
- .prop({ key: 'experimental', type: LocalStorageStore.bool({ allowUndefined: true }) })
66
- .prop({ key: 'debug', type: LocalStorageStore.bool({ allowUndefined: true }) })
67
- .prop({ key: 'typewriter', type: LocalStorageStore.string({ allowUndefined: true }) })
68
- .prop({ key: 'numberedHeadings', type: LocalStorageStore.bool({ allowUndefined: true }) })
69
- .prop({ key: 'folding', type: LocalStorageStore.bool({ allowUndefined: true }) });
70
-
71
- state.prop({ key: 'viewMode', type: LocalStorageStore.json<{ [key: string]: EditorViewMode }>() });
72
-
73
- markdownExtensionPlugins(plugins).forEach((plugin) => {
74
- const { extensions } = plugin.provides.markdown;
75
- state.values.extensionProviders?.push(extensions);
76
- });
77
- },
78
- provides: {
79
- settings: settings.values,
80
- metadata: {
81
- records: {
82
- [DocumentType.typename]: {
83
- createObject: (props: { name?: string }) => createIntent(MarkdownAction.Create, props),
26
+ import { DocumentType, MarkdownAction } from './types';
27
+ import { serializer } from './util';
28
+
29
+ export const MarkdownPlugin = () =>
30
+ definePlugin(meta, [
31
+ defineModule({
32
+ id: `${meta.id}/module/translations`,
33
+ activatesOn: Events.SetupTranslations,
34
+ activate: () => contributes(Capabilities.Translations, [...translations, ...editorTranslations]),
35
+ }),
36
+ defineModule({
37
+ id: `${meta.id}/module/settings`,
38
+ activatesOn: Events.SetupSettings,
39
+ activate: MarkdownSettings,
40
+ }),
41
+ defineModule({
42
+ id: `${meta.id}/module/state`,
43
+ // TODO(wittjosiah): Does not integrate with settings store.
44
+ // Should this be a different event?
45
+ // Should settings store be renamed to be more generic?
46
+ activatesOn: Events.SetupSettings,
47
+ activate: MarkdownState,
48
+ }),
49
+ defineModule({
50
+ id: `${meta.id}/module/metadata`,
51
+ activatesOn: Events.SetupMetadata,
52
+ activate: () =>
53
+ contributes(Capabilities.Metadata, {
54
+ id: DocumentType.typename,
55
+ metadata: {
84
56
  label: (object: any) => (object instanceof DocumentType ? object.name || object.fallbackName : undefined),
85
57
  placeholder: ['document title placeholder', { ns: MARKDOWN_PLUGIN }],
86
58
  icon: 'ph--text-aa--regular',
@@ -92,142 +64,50 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
92
64
  await RefArray.loadAll<BaseObject>([doc.content, ...doc.threads]),
93
65
  serializer,
94
66
  },
95
- },
96
- },
97
- translations: [...translations, ...editorTranslations],
98
- echo: {
99
- schema: [DocumentType],
100
- system: [TextType],
101
- },
102
- graph: {
103
- serializer: (plugins) => {
104
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
105
- if (!dispatch) {
106
- return [];
107
- }
108
-
109
- return [
110
- {
111
- inputType: DocumentType.typename,
112
- outputType: 'text/markdown',
113
- // Reconcile with metadata serializers.
114
- serialize: async (node) => {
115
- const doc = node.data;
116
- const content = await doc.content.load();
117
- return {
118
- name:
119
- doc.name ||
120
- doc.fallbackName ||
121
- translations[0]['en-US'][MARKDOWN_PLUGIN]['document title placeholder'],
122
- data: content.content,
123
- type: 'text/markdown',
124
- };
125
- },
126
- deserialize: async (data, ancestors) => {
127
- const space = ancestors.find(isSpace);
128
- const target =
129
- ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ??
130
- space?.properties[CollectionType.typename]?.target;
131
- if (!space || !target) {
132
- return;
133
- }
134
-
135
- const result = await dispatch(
136
- pipe(
137
- createIntent(MarkdownAction.Create, { name: data.name, content: data.data }),
138
- chain(SpaceAction.AddObject, { target }),
139
- ),
140
- );
141
-
142
- return result.data?.object;
143
- },
144
- },
145
- ];
146
- },
147
- },
148
- thread: {
149
- predicate: (obj) => obj instanceof DocumentType,
150
- createSort: (doc: DocumentType) => {
151
- const accessor = doc.content.target ? createDocAccessor(doc.content.target, ['content']) : undefined;
152
- if (!accessor) {
153
- return (_) => 0;
154
- }
155
-
156
- const getStartPosition = (cursor: string | undefined) => {
157
- const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;
158
- return range?.start ?? Number.MAX_SAFE_INTEGER;
159
- };
160
-
161
- return (anchorA: string | undefined, anchorB: string | undefined): number => {
162
- if (anchorA === undefined || anchorB === undefined) {
163
- return 0;
164
- }
165
- const posA = getStartPosition(anchorA);
166
- const posB = getStartPosition(anchorB);
167
- return posA - posB;
168
- };
169
- },
170
- },
171
- surface: {
172
- definitions: () => [
173
- createSurface({
174
- id: `${MARKDOWN_PLUGIN}/document`,
175
- role: ['article', 'section'],
176
- filter: (data): data is { subject: DocumentType } => data.subject instanceof DocumentType,
177
- component: ({ data, role }) => (
178
- <MarkdownContainer
179
- id={fullyQualifiedId(data.subject)}
180
- object={data.subject}
181
- role={role}
182
- settings={settings.values}
183
- extensionProviders={state.values.extensionProviders}
184
- viewMode={getViewMode(fullyQualifiedId(data.subject))}
185
- editorStateStore={editorStateStore}
186
- onViewModeChange={setViewMode}
187
- />
188
- ),
189
- }),
190
- createSurface({
191
- id: `${MARKDOWN_PLUGIN}/editor`,
192
- role: ['article', 'section'],
193
- filter: (data): data is { subject: { id: string; text: string } } => isEditorModel(data.subject),
194
- component: ({ data, role }) => (
195
- <MarkdownContainer
196
- id={data.subject.id}
197
- object={data.subject}
198
- role={role}
199
- settings={settings.values}
200
- extensionProviders={state.values.extensionProviders}
201
- viewMode={getViewMode(data.subject.id)}
202
- editorStateStore={editorStateStore}
203
- onViewModeChange={setViewMode}
204
- />
205
- ),
206
- }),
207
- createSurface({
208
- id: `${MARKDOWN_PLUGIN}/settings`,
209
- role: 'settings',
210
- filter: (data): data is any => data.subject === MARKDOWN_PLUGIN,
211
- component: () => <MarkdownSettings settings={settings.values} />,
212
- }),
213
- ],
214
- },
215
- intent: {
216
- resolvers: () => [
217
- createResolver(MarkdownAction.Create, ({ name, content }) => {
218
- const doc = create(DocumentType, {
219
- name,
220
- content: makeRef(create(TextType, { content: content ?? '' })),
221
- threads: [],
222
- });
223
-
224
- return { data: { object: doc } };
225
- }),
226
- createResolver(MarkdownAction.SetViewMode, ({ id, viewMode }) => {
227
- state.values.viewMode[id] = viewMode;
67
+ }),
68
+ }),
69
+ defineModule({
70
+ id: `${meta.id}/module/object-form`,
71
+ activatesOn: ClientEvents.SetupSchema,
72
+ activate: () =>
73
+ contributes(
74
+ SpaceCapabilities.ObjectForm,
75
+ defineObjectForm({
76
+ objectSchema: DocumentType,
77
+ getIntent: () => createIntent(MarkdownAction.Create),
228
78
  }),
229
- ],
230
- },
231
- },
232
- };
233
- };
79
+ ),
80
+ }),
81
+ defineModule({
82
+ id: `${meta.id}/module/schema`,
83
+ activatesOn: ClientEvents.SetupSchema,
84
+ activate: () => contributes(ClientCapabilities.Schema, [TextType]),
85
+ }),
86
+ defineModule({
87
+ id: `${meta.id}/module/react-surface`,
88
+ activatesOn: Events.SetupReactSurface,
89
+ // TODO(wittjosiah): Should occur before the editor is loaded when surfaces activation is more granular.
90
+ activatesBefore: [MarkdownEvents.SetupExtensions],
91
+ activate: ReactSurface,
92
+ }),
93
+ defineModule({
94
+ id: `${meta.id}/module/intent-resolver`,
95
+ activatesOn: Events.SetupIntentResolver,
96
+ activate: IntentResolver,
97
+ }),
98
+ defineModule({
99
+ id: `${meta.id}/module/app-graph-serializer`,
100
+ activatesOn: Events.AppGraphReady,
101
+ activate: AppGraphSerializer,
102
+ }),
103
+ defineModule({
104
+ id: `${meta.id}/module/thread`,
105
+ activatesOn: ThreadEvents.SetupThread,
106
+ activate: Thread,
107
+ }),
108
+ defineModule({
109
+ id: `${meta.id}/module/artifact-definition`,
110
+ activatesOn: Events.SetupArtifactDefinition,
111
+ activate: ArtifactDefinition,
112
+ }),
113
+ ]);
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { pipe } from 'effect';
6
+
7
+ import { contributes, Capabilities, type PluginsContext, chain, createIntent } from '@dxos/app-framework';
8
+ import { SpaceAction, CollectionType } from '@dxos/plugin-space/types';
9
+ import { isSpace } from '@dxos/react-client/echo';
10
+
11
+ import { MARKDOWN_PLUGIN } from '../meta';
12
+ import translations from '../translations';
13
+ import { MarkdownAction, DocumentType } from '../types';
14
+
15
+ export default (context: PluginsContext) =>
16
+ contributes(Capabilities.AppGraphSerializer, [
17
+ {
18
+ inputType: DocumentType.typename,
19
+ outputType: 'text/markdown',
20
+ // Reconcile with metadata serializers.
21
+ serialize: async (node) => {
22
+ const doc = node.data;
23
+ const content = await doc.content.load();
24
+ return {
25
+ name: doc.name || doc.fallbackName || translations[0]['en-US'][MARKDOWN_PLUGIN]['document title placeholder'],
26
+ data: content.content,
27
+ type: 'text/markdown',
28
+ };
29
+ },
30
+ deserialize: async (data, ancestors) => {
31
+ const space = ancestors.find(isSpace);
32
+ const target =
33
+ ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ??
34
+ space?.properties[CollectionType.typename]?.target;
35
+ if (!space || !target) {
36
+ return;
37
+ }
38
+
39
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
40
+ const result = await dispatch(
41
+ pipe(
42
+ createIntent(MarkdownAction.Create, { name: data.name, content: data.data }),
43
+ chain(SpaceAction.AddObject, { target }),
44
+ ),
45
+ );
46
+
47
+ return result.data?.object;
48
+ },
49
+ },
50
+ ]);
@@ -0,0 +1,85 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capabilities, contributes, type PromiseIntentDispatcher } from '@dxos/app-framework';
6
+ import { defineArtifact, defineTool, ToolResult } from '@dxos/artifact';
7
+ import { isInstanceOf, S } from '@dxos/echo-schema';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { fullyQualifiedId, Filter, type Space } from '@dxos/react-client/echo';
10
+
11
+ import { meta } from '../meta';
12
+ import { DocumentType } from '../types';
13
+
14
+ // TODO(burdon): Factor out.
15
+ declare global {
16
+ interface ToolContextExtensions {
17
+ space?: Space;
18
+ dispatch?: PromiseIntentDispatcher;
19
+ }
20
+ }
21
+
22
+ export default () => {
23
+ const definition = defineArtifact({
24
+ id: meta.id,
25
+ name: meta.name,
26
+ instructions: `
27
+ - The markdown plugin allows you to work with text documents in the current space.
28
+ - Use these tools to interact with documents, including listing available documents and retrieving their content.
29
+ - Documents are stored in Markdown format.
30
+ `,
31
+ schema: DocumentType,
32
+ tools: [
33
+ defineTool(meta.id, {
34
+ name: 'list',
35
+ description: 'List all markdown documents in the current space.',
36
+ caption: 'Listing markdown documents...',
37
+ schema: S.Struct({}),
38
+ execute: async (_input, { extensions }) => {
39
+ invariant(extensions?.space, 'No space');
40
+ const space = extensions.space;
41
+ const { objects: documents } = await space.db.query(Filter.schema(DocumentType)).run();
42
+ const documentInfo = documents.map((doc) => {
43
+ invariant(isInstanceOf(DocumentType, doc));
44
+ return {
45
+ id: fullyQualifiedId(doc),
46
+ name: doc.name || doc.fallbackName || 'Unnamed Document',
47
+ // TODO(ZaymonFC): Include updatedAt?
48
+ };
49
+ });
50
+
51
+ return ToolResult.Success(documentInfo);
52
+ },
53
+ }),
54
+ defineTool(meta.id, {
55
+ name: 'inspect',
56
+ description: 'Read the content of a markdown document.',
57
+ caption: 'Inspecting markdown document...',
58
+ schema: S.Struct({
59
+ id: S.String.annotations({
60
+ description: 'The fully qualified ID of the document `spaceID:objectID`',
61
+ }),
62
+ }),
63
+ execute: async ({ id }, { extensions }) => {
64
+ invariant(extensions?.space, 'No space');
65
+ const space = extensions.space;
66
+ const { objects: documents } = await space.db.query(Filter.schema(DocumentType)).run();
67
+ const document = documents.find((doc) => fullyQualifiedId(doc) === id);
68
+ if (!document) {
69
+ return ToolResult.Error(`Document not found: ${id}`);
70
+ }
71
+
72
+ invariant(isInstanceOf(DocumentType, document));
73
+ const { content } = await document.content?.load();
74
+ return ToolResult.Success({
75
+ id: fullyQualifiedId(document),
76
+ name: document.name || document.fallbackName || 'Unnamed Document',
77
+ content,
78
+ });
79
+ },
80
+ }),
81
+ ],
82
+ });
83
+
84
+ return contributes(Capabilities.ArtifactDefinition, definition);
85
+ };
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { defineCapability } from '@dxos/app-framework';
6
+ import { type EditorViewMode, type EditorStateStore } from '@dxos/react-ui-editor';
7
+
8
+ import { MARKDOWN_PLUGIN } from '../meta';
9
+ import { type MarkdownExtensionProvider, type MarkdownPluginState } from '../types';
10
+
11
+ export namespace MarkdownCapabilities {
12
+ export const State = defineCapability<{
13
+ state: MarkdownPluginState;
14
+ editorState: EditorStateStore;
15
+ getViewMode: (id: string) => EditorViewMode;
16
+ setViewMode: (id: string, viewMode: EditorViewMode) => void;
17
+ }>(`${MARKDOWN_PLUGIN}/capability/state`);
18
+
19
+ export const Extensions = defineCapability<MarkdownExtensionProvider[]>(`${MARKDOWN_PLUGIN}/capability/extensions`);
20
+ }
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { lazy } from '@dxos/app-framework';
6
+
7
+ export const AppGraphSerializer = lazy(() => import('./app-graph-serializer'));
8
+ export const ArtifactDefinition = lazy(() => import('./artifact-definition'));
9
+ export const IntentResolver = lazy(() => import('./intent-resolver'));
10
+ export const ReactSurface = lazy(() => import('./react-surface'));
11
+ export const MarkdownSettings = lazy(() => import('./settings'));
12
+ export const MarkdownState = lazy(() => import('./state'));
13
+ export const Thread = lazy(() => import('./thread'));
14
+
15
+ export * from './capabilities';
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';
6
+ import { makeRef, create } from '@dxos/live-object';
7
+ import { TextType } from '@dxos/schema';
8
+
9
+ import { MarkdownCapabilities } from './capabilities';
10
+ import { DocumentType, MarkdownAction } from '../types';
11
+
12
+ export default (context: PluginsContext) =>
13
+ contributes(Capabilities.IntentResolver, [
14
+ createResolver({
15
+ intent: MarkdownAction.Create,
16
+ resolve: ({ name, content }) => {
17
+ const doc = create(DocumentType, {
18
+ name,
19
+ content: makeRef(create(TextType, { content: content ?? '' })),
20
+ threads: [],
21
+ });
22
+
23
+ return { data: { object: doc } };
24
+ },
25
+ }),
26
+ createResolver({
27
+ intent: MarkdownAction.SetViewMode,
28
+ resolve: ({ id, viewMode }) => {
29
+ const { state } = context.requestCapability(MarkdownCapabilities.State);
30
+ state.viewMode[id] = viewMode;
31
+ },
32
+ }),
33
+ ]);