@dxos/plugin-thread 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 (600) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  6. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs +208 -0
  7. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +96 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  18. package/dist/lib/neutral/add-message-DATVSMVU.mjs +122 -0
  19. package/dist/lib/neutral/add-message-DATVSMVU.mjs.map +7 -0
  20. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs +244 -0
  21. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs.map +7 -0
  22. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs +120 -0
  23. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs.map +7 -0
  24. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs +40 -0
  25. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs.map +7 -0
  26. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  28. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  29. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  30. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
  32. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-6HC3NAXD.mjs +164 -0
  34. package/dist/lib/neutral/chunk-6HC3NAXD.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-D3SCNWLT.mjs +335 -0
  38. package/dist/lib/neutral/chunk-D3SCNWLT.mjs.map +7 -0
  39. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  40. package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
  41. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  43. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-TT6PWRR5.mjs +8 -0
  45. package/dist/lib/neutral/chunk-TT6PWRR5.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-WMP3QCOR.mjs +46 -0
  47. package/dist/lib/neutral/chunk-WMP3QCOR.mjs.map +7 -0
  48. package/dist/lib/neutral/components/index.mjs +541 -0
  49. package/dist/lib/neutral/components/index.mjs.map +7 -0
  50. package/dist/lib/neutral/containers/index.mjs +15 -0
  51. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  52. package/dist/lib/neutral/create-2NJDD73M.mjs +61 -0
  53. package/dist/lib/neutral/create-2NJDD73M.mjs.map +7 -0
  54. package/dist/lib/neutral/create-channel-RYSV44N3.mjs +19 -0
  55. package/dist/lib/neutral/create-channel-RYSV44N3.mjs.map +7 -0
  56. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  57. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  58. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs +56 -0
  59. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs.map +7 -0
  60. package/dist/lib/neutral/delete-JVGAPD46.mjs +57 -0
  61. package/dist/lib/neutral/delete-JVGAPD46.mjs.map +7 -0
  62. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs +54 -0
  63. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs.map +7 -0
  64. package/dist/lib/neutral/hooks/index.mjs +10 -0
  65. package/dist/lib/neutral/index.mjs +32 -0
  66. package/dist/lib/neutral/markdown-B6RNVR2H.mjs +83 -0
  67. package/dist/lib/neutral/markdown-B6RNVR2H.mjs.map +7 -0
  68. package/dist/lib/neutral/meta.json +1 -0
  69. package/dist/lib/neutral/meta.mjs +10 -0
  70. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs +23 -0
  71. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs.map +7 -0
  72. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  73. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  74. package/dist/lib/neutral/operations/index.mjs +8 -0
  75. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  76. package/dist/lib/neutral/plugin.mjs +16 -0
  77. package/dist/lib/neutral/plugin.mjs.map +7 -0
  78. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs +76 -0
  79. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs.map +7 -0
  80. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs +32 -0
  81. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs.map +7 -0
  82. package/dist/lib/neutral/restore-Z5PYV7I2.mjs +32 -0
  83. package/dist/lib/neutral/restore-Z5PYV7I2.mjs.map +7 -0
  84. package/dist/lib/neutral/restore-message-B263PLUH.mjs +33 -0
  85. package/dist/lib/neutral/restore-message-B263PLUH.mjs.map +7 -0
  86. package/dist/lib/neutral/select-GXDEAH5D.mjs +24 -0
  87. package/dist/lib/neutral/select-GXDEAH5D.mjs.map +7 -0
  88. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs +20 -0
  89. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs.map +7 -0
  90. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  91. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  92. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  93. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  94. package/dist/lib/neutral/testing/index.mjs +58 -0
  95. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  96. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs +36 -0
  97. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs.map +7 -0
  98. package/dist/lib/neutral/translations.mjs +91 -0
  99. package/dist/lib/neutral/translations.mjs.map +7 -0
  100. package/dist/lib/neutral/types/index.mjs +16 -0
  101. package/dist/lib/neutral/types/index.mjs.map +7 -0
  102. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  103. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  104. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  105. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  106. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  107. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  108. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  109. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  110. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  111. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  112. package/dist/types/src/blueprints/index.d.ts +2 -0
  113. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  114. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  117. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  119. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  121. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  123. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/index.d.ts +16 -15
  125. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  126. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  127. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  128. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  129. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  131. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/settings.d.ts +5 -2
  133. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  134. package/dist/types/src/capabilities/state.d.ts +5 -5
  135. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  137. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  138. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  139. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  140. package/dist/types/src/components/Chat/index.d.ts +2 -0
  141. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  142. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  143. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  144. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  145. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  146. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  147. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  148. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  149. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  150. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  151. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  152. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  153. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  154. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  155. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  156. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  157. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  158. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  159. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  160. package/dist/types/src/components/index.d.ts +5 -10
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  163. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  164. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  165. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  166. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  167. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  168. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  169. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  170. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  171. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  172. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  173. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  174. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  175. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  176. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  177. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  178. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  179. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  180. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  181. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  182. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  183. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  184. package/dist/types/src/containers/index.d.ts +6 -0
  185. package/dist/types/src/containers/index.d.ts.map +1 -0
  186. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  187. package/dist/types/src/extensions/command.d.ts.map +1 -0
  188. package/dist/types/src/extensions/index.d.ts +1 -0
  189. package/dist/types/src/extensions/index.d.ts.map +1 -1
  190. package/dist/types/src/extensions/threads.d.ts +9 -4
  191. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  192. package/dist/types/src/hooks/analytics.d.ts +2 -3
  193. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  194. package/dist/types/src/hooks/index.d.ts +0 -4
  195. package/dist/types/src/hooks/index.d.ts.map +1 -1
  196. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  197. package/dist/types/src/index.d.ts +2 -3
  198. package/dist/types/src/index.d.ts.map +1 -1
  199. package/dist/types/src/meta.d.ts +2 -2
  200. package/dist/types/src/meta.d.ts.map +1 -1
  201. package/dist/types/src/operations/add-message.d.ts +5 -0
  202. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  203. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  204. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  205. package/dist/types/src/operations/create-channel.d.ts +5 -0
  206. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  207. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  208. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  209. package/dist/types/src/operations/create.d.ts +5 -0
  210. package/dist/types/src/operations/create.d.ts.map +1 -0
  211. package/dist/types/src/operations/delete-message.d.ts +5 -0
  212. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  213. package/dist/types/src/operations/delete.d.ts +5 -0
  214. package/dist/types/src/operations/delete.d.ts.map +1 -0
  215. package/dist/types/src/operations/index.d.ts +3 -0
  216. package/dist/types/src/operations/index.d.ts.map +1 -0
  217. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  218. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  219. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  220. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  221. package/dist/types/src/operations/restore-message.d.ts +5 -0
  222. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  223. package/dist/types/src/operations/restore.d.ts +5 -0
  224. package/dist/types/src/operations/restore.d.ts.map +1 -0
  225. package/dist/types/src/operations/select.d.ts +5 -0
  226. package/dist/types/src/operations/select.d.ts.map +1 -0
  227. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  228. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  229. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  230. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  231. package/dist/types/src/plugin.d.ts +4 -0
  232. package/dist/types/src/plugin.d.ts.map +1 -0
  233. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  234. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  235. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  236. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  237. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
  238. package/dist/types/src/testing/data.d.ts.map +1 -0
  239. package/dist/types/src/testing/index.d.ts +1 -1
  240. package/dist/types/src/testing/index.d.ts.map +1 -1
  241. package/dist/types/src/translations.d.ts +142 -74
  242. package/dist/types/src/translations.d.ts.map +1 -1
  243. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  244. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  245. package/dist/types/src/types/Settings.d.ts +5 -0
  246. package/dist/types/src/types/Settings.d.ts.map +1 -0
  247. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  248. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  249. package/dist/types/src/types/ThreadOperation.d.ts +2409 -0
  250. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  251. package/dist/types/src/types/index.d.ts +4 -1
  252. package/dist/types/src/types/index.d.ts.map +1 -1
  253. package/dist/types/src/types/types.d.ts +3 -458
  254. package/dist/types/src/types/types.d.ts.map +1 -1
  255. package/dist/types/src/util.d.ts +6 -3
  256. package/dist/types/src/util.d.ts.map +1 -1
  257. package/dist/types/tsconfig.tsbuildinfo +1 -1
  258. package/package.json +156 -85
  259. package/src/ThreadPlugin.node.ts +39 -0
  260. package/src/ThreadPlugin.test.ts +37 -0
  261. package/src/ThreadPlugin.tsx +58 -125
  262. package/src/ThreadPlugin.workerd.ts +20 -0
  263. package/src/blueprints/index.ts +5 -0
  264. package/src/blueprints/thread-blueprint.ts +36 -0
  265. package/src/capabilities/agent-runner.ts +291 -0
  266. package/src/capabilities/app-graph-builder.ts +124 -165
  267. package/src/capabilities/blueprint-definition.ts +19 -0
  268. package/src/capabilities/create-object.ts +30 -0
  269. package/src/capabilities/index.ts +16 -12
  270. package/src/capabilities/markdown.ts +53 -36
  271. package/src/capabilities/operation-handler.ts +16 -0
  272. package/src/capabilities/react-surface.tsx +64 -78
  273. package/src/capabilities/settings.ts +26 -12
  274. package/src/capabilities/state.ts +14 -18
  275. package/src/capabilities/undo-mappings.ts +46 -0
  276. package/src/components/Chat/Chat.tsx +259 -0
  277. package/src/components/Chat/index.ts +5 -0
  278. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  279. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  280. package/src/components/CommentsPanel/CommentsThread.tsx +176 -0
  281. package/src/components/CommentsPanel/index.ts +6 -0
  282. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +83 -47
  283. package/src/components/MessagePanel/index.ts +5 -0
  284. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  285. package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
  286. package/src/components/ThreadSettings/index.ts +5 -0
  287. package/src/components/index.ts +5 -12
  288. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  289. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  290. package/src/containers/ChannelArticle/index.ts +5 -0
  291. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  292. package/src/containers/ChannelChat/index.ts +8 -0
  293. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +339 -0
  294. package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
  295. package/src/containers/CommentsCompanion/index.ts +5 -0
  296. package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
  297. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  298. package/src/containers/ThreadContainer/index.ts +8 -0
  299. package/src/containers/index.ts +10 -0
  300. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  301. package/src/extensions/index.ts +1 -0
  302. package/src/extensions/threads.ts +88 -43
  303. package/src/hooks/analytics.ts +22 -21
  304. package/src/hooks/index.ts +0 -4
  305. package/src/index.ts +4 -4
  306. package/src/meta.ts +37 -7
  307. package/src/operations/add-message.ts +94 -0
  308. package/src/operations/append-channel-message.ts +37 -0
  309. package/src/operations/create-channel.ts +20 -0
  310. package/src/operations/create-proposals.ts +49 -0
  311. package/src/operations/create.ts +63 -0
  312. package/src/operations/delete-message.ts +53 -0
  313. package/src/operations/delete.ts +63 -0
  314. package/src/operations/index.ts +22 -0
  315. package/src/operations/on-create-space.ts +27 -0
  316. package/src/operations/respond-to-thread.ts +32 -0
  317. package/src/operations/restore-message.ts +38 -0
  318. package/src/operations/restore.ts +38 -0
  319. package/src/operations/select.ts +24 -0
  320. package/src/operations/set-agent-config.ts +24 -0
  321. package/src/operations/toggle-resolved.ts +41 -0
  322. package/src/plugin.ts +11 -0
  323. package/src/should-trigger-agent.test.ts +72 -0
  324. package/src/should-trigger-agent.ts +50 -0
  325. package/src/testing/data.ts +49 -0
  326. package/src/testing/index.ts +1 -1
  327. package/src/translations.ts +75 -75
  328. package/src/types/AgentIdentity.ts +35 -0
  329. package/src/types/Settings.ts +10 -0
  330. package/src/types/ThreadCapabilities.ts +46 -0
  331. package/src/types/ThreadOperation.ts +217 -0
  332. package/src/types/index.ts +5 -1
  333. package/src/types/types.ts +4 -109
  334. package/src/util.ts +37 -5
  335. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  336. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  337. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  338. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  339. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  340. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  341. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  342. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  344. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  346. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  348. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  349. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  351. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  353. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  355. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  357. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  359. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
  361. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  362. package/dist/lib/browser/index.mjs +0 -312
  363. package/dist/lib/browser/index.mjs.map +0 -7
  364. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  365. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  366. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  367. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  368. package/dist/lib/browser/meta.json +0 -1
  369. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  370. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  371. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  372. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  373. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  374. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  375. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  376. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  377. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  378. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  379. package/dist/lib/browser/types/index.mjs +0 -16
  380. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  381. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  382. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  383. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  384. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  385. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  387. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  389. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  391. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  393. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  395. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  397. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  399. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  401. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  403. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  405. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
  407. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  408. package/dist/lib/node-esm/index.mjs +0 -313
  409. package/dist/lib/node-esm/index.mjs.map +0 -7
  410. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  411. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  412. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  413. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  414. package/dist/lib/node-esm/meta.json +0 -1
  415. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  416. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  417. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  418. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  419. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  420. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  421. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  422. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  423. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  424. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  425. package/dist/lib/node-esm/types/index.mjs +0 -17
  426. package/dist/types/src/calls/call-manager.d.ts +0 -77
  427. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  428. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  429. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  430. package/dist/types/src/calls/index.d.ts +0 -7
  431. package/dist/types/src/calls/index.d.ts.map +0 -1
  432. package/dist/types/src/calls/media-manager.d.ts +0 -60
  433. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  434. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  435. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  436. package/dist/types/src/calls/types.d.ts +0 -45
  437. package/dist/types/src/calls/types.d.ts.map +0 -1
  438. package/dist/types/src/calls/util/audio.d.ts +0 -6
  439. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  440. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  441. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  442. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  443. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  444. package/dist/types/src/calls/util/index.d.ts +0 -5
  445. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  446. package/dist/types/src/calls/util/media.d.ts +0 -6
  447. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  448. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  449. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  450. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  451. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  452. package/dist/types/src/calls-service.stories.d.ts +0 -23
  453. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  454. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  455. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  456. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  457. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  458. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  459. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  460. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  461. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  462. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  463. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  464. package/dist/types/src/components/Call/Call.d.ts +0 -17
  465. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  466. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  467. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  468. package/dist/types/src/components/Call/index.d.ts +0 -3
  469. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  470. package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
  471. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  472. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  473. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  474. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  475. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  476. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -93
  477. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  478. package/dist/types/src/components/Chat.stories.d.ts +0 -93
  479. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  480. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  481. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  482. package/dist/types/src/components/Comments.stories.d.ts +0 -158
  483. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  484. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  485. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  486. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  487. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  488. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  489. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  490. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  491. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  492. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  493. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  494. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  495. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  496. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  497. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  498. package/dist/types/src/components/Media/index.d.ts +0 -3
  499. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  500. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  501. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  502. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  503. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  504. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  505. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  506. package/dist/types/src/components/Participant/index.d.ts +0 -3
  507. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  508. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  509. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  510. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  511. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  512. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  513. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  514. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
  515. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  516. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  517. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  518. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  519. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  520. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  521. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  522. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  523. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  524. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  525. package/dist/types/src/components/testing.d.ts.map +0 -1
  526. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  527. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  528. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  529. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  530. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  531. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  532. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  533. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  534. package/dist/types/src/testing/stories.d.ts +0 -2
  535. package/dist/types/src/testing/stories.d.ts.map +0 -1
  536. package/dist/types/src/types/schema.d.ts +0 -179
  537. package/dist/types/src/types/schema.d.ts.map +0 -1
  538. package/src/calls/call-manager.ts +0 -246
  539. package/src/calls/call-swarm-synchronizer.ts +0 -350
  540. package/src/calls/index.ts +0 -10
  541. package/src/calls/media-manager.ts +0 -375
  542. package/src/calls/speaking-monitor.ts +0 -85
  543. package/src/calls/types.ts +0 -74
  544. package/src/calls/util/audio.ts +0 -58
  545. package/src/calls/util/calls-service.ts +0 -581
  546. package/src/calls/util/history-cache.ts +0 -27
  547. package/src/calls/util/index.ts +0 -8
  548. package/src/calls/util/media.ts +0 -52
  549. package/src/calls/util/stub-media-streams.ts +0 -127
  550. package/src/calls/util/task-scheduling.ts +0 -92
  551. package/src/calls-service.stories.tsx +0 -229
  552. package/src/capabilities/call-manager.ts +0 -20
  553. package/src/capabilities/capabilities.ts +0 -33
  554. package/src/capabilities/intent-resolver.ts +0 -348
  555. package/src/capabilities/react-root.tsx +0 -17
  556. package/src/capabilities/toolkit.ts +0 -82
  557. package/src/components/Call/Call.tsx +0 -89
  558. package/src/components/Call/Toolbar.tsx +0 -182
  559. package/src/components/Call/index.ts +0 -6
  560. package/src/components/CallDebugPanel.tsx +0 -174
  561. package/src/components/CallSidebar.tsx +0 -18
  562. package/src/components/ChannelContainer.stories.tsx +0 -59
  563. package/src/components/ChannelContainer.tsx +0 -201
  564. package/src/components/Chat.stories.tsx +0 -91
  565. package/src/components/ChatContainer.tsx +0 -145
  566. package/src/components/Comments.stories.tsx +0 -91
  567. package/src/components/CommentsContainer.tsx +0 -72
  568. package/src/components/CommentsThreadContainer.tsx +0 -169
  569. package/src/components/Lobby/Lobby.tsx +0 -119
  570. package/src/components/Lobby/index.ts +0 -5
  571. package/src/components/Media/AudioStream.tsx +0 -67
  572. package/src/components/Media/VideoObject.stories.tsx +0 -60
  573. package/src/components/Media/VideoObject.tsx +0 -58
  574. package/src/components/Media/index.ts +0 -6
  575. package/src/components/Participant/Participant.tsx +0 -63
  576. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  577. package/src/components/Participant/index.ts +0 -6
  578. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
  579. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  580. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  581. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  582. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  583. package/src/components/ResponsiveGrid/index.ts +0 -7
  584. package/src/components/ThreadComplementary.tsx +0 -181
  585. package/src/components/ThreadSettings.tsx +0 -16
  586. package/src/components/testing.ts +0 -51
  587. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  588. package/src/hooks/useDebugMode.ts +0 -25
  589. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  590. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  591. package/src/testing/stories.ts +0 -54
  592. package/src/types/schema.ts +0 -33
  593. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  594. package/src/typings.d.ts +0 -8
  595. /package/dist/lib/{browser/ChannelContainer-BGDGZHV4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  596. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  597. /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  598. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  599. /package/dist/lib/{node-esm/ChannelContainer-OXC6BTU7.mjs.map → neutral/index.mjs.map} +0 -0
  600. /package/dist/lib/{node-esm/ChatContainer-SH6LTFQL.mjs.map → neutral/meta.mjs.map} +0 -0
@@ -0,0 +1,291 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as LanguageModel from '@effect/ai/LanguageModel';
6
+ import * as Tool from '@effect/ai/Tool';
7
+ import * as Toolkit from '@effect/ai/Toolkit';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Layer from 'effect/Layer';
10
+ import * as Schema from 'effect/Schema';
11
+
12
+ import { AiPreprocessor, AiService } from '@dxos/ai';
13
+ import { Capability } from '@dxos/app-framework';
14
+ import { AppCapabilities } from '@dxos/app-toolkit';
15
+ import { Filter, Obj, Ref, Relation } from '@dxos/echo';
16
+ import { createDocAccessor, getRangeFromCursor, toCursorRange, updateText } from '@dxos/echo-db';
17
+ import { log } from '@dxos/log';
18
+ import { Markdown } from '@dxos/plugin-markdown';
19
+ import { AnchoredTo, Message } from '@dxos/types';
20
+ import { trim } from '@dxos/util';
21
+
22
+ import { AgentIdentity, ThreadCapabilities } from '../types';
23
+
24
+ const DEFAULT_MODEL = '@anthropic/claude-sonnet-4-5';
25
+
26
+ const baseInstructions = trim`
27
+ You are a helpful assistant participating in a comment thread on a document.
28
+ Read the document and the conversation history; the user's requests usually
29
+ refer to the document content.
30
+
31
+ When the user asks you to MODIFY the document (translate, rewrite, edit, fix,
32
+ refactor, etc.) call ONE of the edit tools. Do NOT paste the new content into
33
+ chat — always use the tool.
34
+
35
+ - If the thread has an anchored selection (shown in <selection>...</selection>
36
+ below), use \`editAnchoredRange\` with ONLY the replacement text for that
37
+ span. Leave the rest of the document untouched.
38
+ - If there is no anchored selection, use \`updateDocument\` with the FULL new
39
+ markdown content.
40
+
41
+ AFTER calling an edit tool you MUST also produce a chat reply that:
42
+ 1. States in one line what you changed (e.g. "Translated the selection to
43
+ Japanese.");
44
+ 2. Optionally adds one or two sentences explaining notable choices,
45
+ caveats, or suggesting a follow-up. Keep the whole reply under 60 words.
46
+ 3. Does NOT repeat the new document content — it's already shown in the
47
+ editor on the left.
48
+
49
+ When the user asks a QUESTION (or just chats), reply in plain text under
50
+ 80 words and do not call any edit tool.
51
+
52
+ Do not address the user as 'user'; use their name if known. Never call yourself.
53
+ `;
54
+
55
+ const EditAnchoredRangeTool = Tool.make('editAnchoredRange', {
56
+ description:
57
+ 'Replace the text of the anchored selection in the markdown document. Call this for in-place edits when a <selection> is provided.',
58
+ parameters: {
59
+ replacement: Schema.String.annotations({
60
+ description: 'The new text for the anchored range. Only this span will be replaced.',
61
+ }),
62
+ },
63
+ success: Schema.String,
64
+ });
65
+
66
+ const UpdateDocumentTool = Tool.make('updateDocument', {
67
+ description:
68
+ 'Replace the entire markdown content of the document. Call this for in-place edits when there is no anchored selection.',
69
+ parameters: {
70
+ content: Schema.String.annotations({
71
+ description: 'The full new markdown content of the document.',
72
+ }),
73
+ },
74
+ success: Schema.String,
75
+ });
76
+
77
+ type EditTarget =
78
+ | {
79
+ kind: 'anchored';
80
+ text: Obj.Any;
81
+ snippet: string;
82
+ from: number;
83
+ to: number;
84
+ relation: AnchoredTo.AnchoredTo;
85
+ }
86
+ | { kind: 'document'; text: Obj.Any }
87
+ | { kind: 'none' };
88
+
89
+ /**
90
+ * Resolve the agent's edit target for this turn:
91
+ * - 'anchored' when the thread is anchored to a span of the doc — agent edits
92
+ * only that span via `editAnchoredRange`.
93
+ * - 'document' when the subject is a Markdown.Document but the thread has no
94
+ * anchor — agent may replace the whole doc via `updateDocument`.
95
+ * - 'none' when the subject isn't editable text — no edit tools wired.
96
+ */
97
+ const resolveEditTarget = (thread: Obj.Any, subject: Obj.Any): EditTarget => {
98
+ if (!Obj.instanceOf(Markdown.Document, subject)) {
99
+ return { kind: 'none' };
100
+ }
101
+ const text = subject.content?.target;
102
+ if (!text) {
103
+ return { kind: 'none' };
104
+ }
105
+ const db = Obj.getDatabase(thread);
106
+ if (!db) {
107
+ return { kind: 'document', text };
108
+ }
109
+ const relations = db.query(Filter.type(AnchoredTo.AnchoredTo)).runSync();
110
+ const ours = relations.find(
111
+ (relation: AnchoredTo.AnchoredTo) =>
112
+ Relation.getSource(relation) === thread && Relation.getTarget(relation) === subject,
113
+ );
114
+ if (!ours?.anchor) {
115
+ return { kind: 'document', text };
116
+ }
117
+ try {
118
+ const accessor = createDocAccessor(text, ['content']);
119
+ const range = getRangeFromCursor(accessor, ours.anchor);
120
+ if (!range || range.start === range.end) {
121
+ return { kind: 'document', text };
122
+ }
123
+ const content = (text as unknown as { content: string }).content ?? '';
124
+ return {
125
+ kind: 'anchored',
126
+ text,
127
+ from: range.start,
128
+ to: range.end,
129
+ snippet: content.slice(range.start, range.end),
130
+ relation: ours,
131
+ };
132
+ } catch (err) {
133
+ log.warn('failed to resolve anchored range; falling back to whole-document edit', { error: err });
134
+ return { kind: 'document', text };
135
+ }
136
+ };
137
+
138
+ /**
139
+ * Build the system prompt for a turn. Inlines the doc content and, when the
140
+ * thread is anchored, the highlighted snippet so the agent can target just
141
+ * that span.
142
+ */
143
+ const buildInstructions = (subject: Obj.Any, target: EditTarget): string => {
144
+ if (!Obj.instanceOf(Markdown.Document, subject)) {
145
+ return baseInstructions;
146
+ }
147
+ const content = subject.content?.target?.content ?? '';
148
+ if (!content) {
149
+ return baseInstructions;
150
+ }
151
+ const selectionBlock = target.kind === 'anchored' ? `\n\n<selection>\n${target.snippet}\n</selection>` : '';
152
+ return trim`
153
+ ${baseInstructions}
154
+
155
+ <document name="${subject.name ?? 'untitled'}">
156
+ ${content}
157
+ </document>${selectionBlock}
158
+ `;
159
+ };
160
+
161
+ /**
162
+ * Normalises messages for the LLM prompt: user-authored messages in comment
163
+ * threads carry no explicit role (only assistant messages do), but the prompt
164
+ * preprocessor switches on `role` and drops anything that isn't 'user' or
165
+ * 'assistant'. Stamp `role: 'user'` on every non-assistant turn before
166
+ * preprocessing.
167
+ */
168
+ const normalizeRoles = (messages: readonly Message.Message[]): Message.Message[] =>
169
+ messages.map((message) =>
170
+ message.sender.role === 'assistant'
171
+ ? message
172
+ : { ...message, sender: { ...message.sender, role: 'user' as const } },
173
+ );
174
+
175
+ /**
176
+ * Default AgentRunner implementation. One-shot LLM call per scheduled turn —
177
+ * loads the thread, builds a prompt from the message history, generates a
178
+ * reply via `LanguageModel.generateText`, and appends the response as an
179
+ * assistant message on the same thread.
180
+ *
181
+ * Edit tools (`editAnchoredRange`, `updateDocument`) are wired per turn based
182
+ * on whether the thread has an anchored range. Splicing uses `updateText`
183
+ * (Automerge-diff based) so cursors on other comment threads stay valid.
184
+ *
185
+ * The `AiServiceLayer` capability is resolved per turn (not at module
186
+ * activation) so plugin order doesn't matter for live wiring. When no host
187
+ * has contributed an `AppCapabilities.AiServiceLayer`, the runner logs a
188
+ * warning and returns; storybook stub paths contribute their own
189
+ * `AgentRunner` earlier in plugin order to short-circuit this module entirely.
190
+ */
191
+ export default Capability.makeModule(
192
+ Effect.fnUntraced(function* () {
193
+ const runner: ThreadCapabilities.AgentRunner = {
194
+ run: ({ thread, subject }) =>
195
+ Effect.gen(function* () {
196
+ const aiServiceLayers = yield* Capability.getAll(AppCapabilities.AiServiceLayer);
197
+ const aiServiceLayer = aiServiceLayers[0];
198
+ if (!aiServiceLayer) {
199
+ log.warn('comment-thread agent runner: no AiServiceLayer contributed; skipping turn');
200
+ return;
201
+ }
202
+ const identity = yield* Capability.get(AgentIdentity);
203
+
204
+ // Load every referenced message into a plain Message.Message[].
205
+ const loaded = yield* Effect.forEach(
206
+ thread.messages,
207
+ (messageRef) => Effect.promise(() => messageRef.load()),
208
+ { concurrency: 'unbounded' },
209
+ );
210
+ const history = normalizeRoles(loaded);
211
+
212
+ const target = resolveEditTarget(thread, subject);
213
+ const prompt = yield* AiPreprocessor.preprocessPrompt(history, {
214
+ system: buildInstructions(subject, target),
215
+ });
216
+
217
+ // Capture which edit tool fired so we can synthesize a fallback chat
218
+ // ack when the model elides the post-tool message.
219
+ let editOutcome: 'anchored' | 'document' | undefined;
220
+
221
+ const toolkit = Toolkit.make(EditAnchoredRangeTool, UpdateDocumentTool);
222
+ const toolkitLayer = toolkit.toLayer({
223
+ editAnchoredRange: ({ replacement }) =>
224
+ Effect.sync(() => {
225
+ if (target.kind !== 'anchored') {
226
+ return 'No anchored selection on this thread; use updateDocument instead.';
227
+ }
228
+ const original = (target.text as unknown as { content: string }).content ?? '';
229
+ const next = original.slice(0, target.from) + replacement + original.slice(target.to);
230
+ updateText(target.text, ['content'], next);
231
+
232
+ // Cursor at `to` (left-associated) can collapse to `from` after a
233
+ // delete-and-insert at that range, leaving the comment's anchor
234
+ // pointing at a zero-width span. Rewrite AnchoredTo.anchor to
235
+ // span the newly-inserted text so the editor marker continues
236
+ // to highlight the replaced range.
237
+ const newTo = target.from + replacement.length;
238
+ const accessor = createDocAccessor(target.text, ['content']);
239
+ const newAnchor = toCursorRange(accessor, target.from, newTo);
240
+ Relation.update(target.relation, (relation) => {
241
+ (relation as Relation.Mutable<AnchoredTo.AnchoredTo>).anchor = newAnchor;
242
+ });
243
+ editOutcome = 'anchored';
244
+ return 'Anchored range replaced.';
245
+ }),
246
+ updateDocument: ({ content }) =>
247
+ Effect.sync(() => {
248
+ if (target.kind === 'none') {
249
+ return 'No editable document in scope.';
250
+ }
251
+ updateText(target.text, ['content'], content);
252
+ editOutcome = 'document';
253
+ return 'Document updated.';
254
+ }),
255
+ });
256
+
257
+ const response = yield* LanguageModel.generateText({ prompt, toolkit }).pipe(
258
+ Effect.scoped,
259
+ Effect.provide(AiService.model(DEFAULT_MODEL).pipe(Layer.provide(aiServiceLayer))),
260
+ Effect.provide(toolkitLayer),
261
+ );
262
+
263
+ // The chat message defaults to whatever the model returned, but when
264
+ // the model elided its post-tool reply (some providers do) fall back
265
+ // to a synthesized ack so the thread always reflects that something
266
+ // happened.
267
+ const fallbackByOutcome: Record<'anchored' | 'document', string> = {
268
+ anchored: 'Updated the highlighted selection.',
269
+ document: 'Updated the document.',
270
+ };
271
+ const text =
272
+ response.text.trim().length > 0 ? response.text : editOutcome ? fallbackByOutcome[editOutcome] : '';
273
+ if (text.length === 0) {
274
+ // Nothing to say and nothing was edited — don't post a hollow bubble.
275
+ return;
276
+ }
277
+
278
+ const reply = Obj.make(Message.Message, {
279
+ created: new Date().toISOString(),
280
+ sender: { role: 'assistant', name: identity.name, identityDid: identity.identityDid },
281
+ blocks: [{ _tag: 'text', text }],
282
+ });
283
+ Obj.update(thread, (thread) => {
284
+ (thread.messages as Ref.Ref<Message.Message>[]).push(Ref.make(reply));
285
+ });
286
+ }),
287
+ };
288
+
289
+ return Capability.contributes(ThreadCapabilities.AgentRunner, runner);
290
+ }),
291
+ );
@@ -2,183 +2,142 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import * as Function from 'effect/Function';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
7
  import * as Option from 'effect/Option';
8
8
 
9
- import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
+ import { Capability } from '@dxos/app-framework';
10
+ import { AppCapabilities, AppNode } from '@dxos/app-toolkit';
11
+ import { Operation } from '@dxos/compute';
10
12
  import { Obj } from '@dxos/echo';
11
13
  import { AttentionCapabilities } from '@dxos/plugin-attention';
12
- import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
13
- import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
14
- import { fullyQualifiedId } from '@dxos/react-client/echo';
14
+ import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
15
+ import { linkedSegment } from '@dxos/react-ui-attention';
16
+ import { type SelectionManager, type SelectionMode, defaultSelection } from '@dxos/react-ui-attention';
17
+ import { Channel } from '@dxos/types';
18
+
19
+ import { meta } from '#meta';
20
+ import { ThreadOperation } from '#types';
21
+ import { ThreadCapabilities, type ThreadState } from '#types';
15
22
 
16
- import { meta } from '../meta';
17
- import { ChannelType, ThreadAction } from '../types';
18
23
  import { getAnchor } from '../util';
19
24
 
20
- import { ThreadCapabilities } from './capabilities';
25
+ type CommentDisabledParams = {
26
+ stateAtom: Atom.Atom<Atom.Writable<ThreadState>[]>;
27
+ selectionManager: SelectionManager;
28
+ objectId: string;
29
+ commentsType: string;
30
+ selectionMode: SelectionMode | undefined;
31
+ };
32
+
33
+ /**
34
+ * Atom family to derive whether the comment button should be disabled.
35
+ * Uses a composite key to ensure proper caching.
36
+ */
37
+ const commentDisabledFamily = Atom.family(
38
+ ({ stateAtom, selectionManager, objectId, commentsType, selectionMode }: CommentDisabledParams) =>
39
+ Atom.make((get) => {
40
+ const stateAtoms = get(stateAtom);
41
+ const state = stateAtoms[0] ? get(stateAtoms[0]) : undefined;
42
+ const toolbar = state?.toolbar ?? {};
43
+ const selectionState = get(selectionManager.state);
44
+ const selection =
45
+ selectionState.selections[objectId] ?? (selectionMode ? defaultSelection(selectionMode) : undefined);
46
+ const anchor = getAnchor(selection);
47
+ const invalidSelection = !anchor;
48
+ const overlappingComment = toolbar[objectId];
49
+ return (commentsType === 'anchored' && invalidSelection) || overlappingComment;
50
+ }),
51
+ );
52
+
53
+ /** Match ECHO objects that are NOT Channels (i.e. objects that can have comments). */
54
+ const whenCommentableObject = NodeMatcher.whenAll(
55
+ NodeMatcher.whenEchoObjectMatches,
56
+ NodeMatcher.whenNot(NodeMatcher.whenEchoTypeMatches(Channel.Channel)),
57
+ );
58
+
59
+ export default Capability.makeModule(
60
+ Effect.fnUntraced(function* () {
61
+ const capabilities = yield* Capability.Service;
21
62
 
22
- // TODO(wittjosiah): Highlight active calls in L1.
23
- // Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
24
- export default (context: PluginContext) => {
25
- const resolve = (typename: string) =>
26
- context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
63
+ const getCommentConfig = (typename: string) =>
64
+ capabilities.getAll(AppCapabilities.CommentConfig).find(({ id }) => id === typename);
27
65
 
28
- return contributes(Capabilities.AppGraphBuilder, [
29
- createExtension({
30
- id: `${meta.id}/active-call`,
31
- connector: (node) =>
32
- Rx.make((get) =>
33
- Function.pipe(
34
- get(node),
35
- Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
36
- Option.map((node) => {
37
- const [call] = get(context.capabilities(ThreadCapabilities.CallManager));
38
- return get(
39
- rxFromSignal(() =>
40
- call?.joined
41
- ? [
42
- {
43
- id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,
44
- type: DECK_COMPANION_TYPE,
45
- data: null,
46
- properties: {
47
- label: ['call panel label', { ns: meta.id }],
48
- icon: 'ph--video-conference--regular',
49
- position: 'hoist',
50
- disposition: 'hidden',
51
- },
52
- },
53
- ]
54
- : [],
55
- ),
56
- );
66
+ const extensions = yield* Effect.all([
67
+ GraphBuilder.createExtension({
68
+ id: 'comments-companion',
69
+ match: (node) => {
70
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
71
+ return Option.none();
72
+ }
73
+ const commentConfig = getCommentConfig(Obj.getTypename(node.data)!);
74
+ return commentConfig ? Option.some(node) : Option.none();
75
+ },
76
+ connector: () =>
77
+ Effect.succeed([
78
+ AppNode.makeCompanion({
79
+ id: linkedSegment('comments'),
80
+ label: ['comments.label', { ns: meta.id }],
81
+ icon: 'ph--chat-text--regular',
82
+ data: 'comments',
83
+ position: 'first',
57
84
  }),
58
- Option.getOrElse(() => []),
59
- ),
60
- ),
61
- }),
62
- // TODO(wittjosiah): The channel shouldn't become the companion during a call.
63
- // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
64
- createExtension({
65
- id: `${meta.id}/channel-chat-companion`,
66
- connector: (node) => {
67
- return Rx.make((get) => {
68
- return Function.pipe(
69
- get(node),
70
- Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),
71
- Option.map((channel) => {
72
- const callManager = context.getCapability(ThreadCapabilities.CallManager);
73
- const joined = get(
74
- rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),
75
- );
76
- if (!joined) {
77
- return [];
78
- }
85
+ ]),
86
+ }),
87
+ GraphBuilder.createExtension({
88
+ id: 'comment-toolbar',
89
+ match: (node) => {
90
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
91
+ return Option.none();
92
+ }
93
+ const commentConfig = getCommentConfig(Obj.getTypename(node.data)!);
94
+ return commentConfig ? Option.some(node) : Option.none();
95
+ },
96
+ actions: (matched, get) => {
97
+ const object = matched.data;
98
+ const objectUri = Obj.getURI(object);
99
+ const stateAtom = capabilities.atom(ThreadCapabilities.State);
100
+ const selectionManager = capabilities.get(AttentionCapabilities.Selection);
101
+ const commentConfig = getCommentConfig(Obj.getTypename(object)!)!;
79
102
 
80
- return [
81
- {
82
- id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,
83
- type: PLANK_COMPANION_TYPE,
84
- data: 'chat',
85
- properties: {
86
- label: ['channel companion label', { ns: meta.id }],
87
- icon: 'ph--hash--regular',
88
- position: 'hoist',
89
- disposition: 'hidden',
90
- },
91
- },
92
- ];
103
+ const disabled = get(
104
+ commentDisabledFamily({
105
+ stateAtom,
106
+ selectionManager,
107
+ objectId: objectUri,
108
+ commentsType: commentConfig.comments,
109
+ selectionMode: commentConfig.selectionMode as SelectionMode | undefined,
93
110
  }),
94
- Option.getOrElse(() => []),
95
111
  );
96
- });
97
- },
98
- }),
99
- createExtension({
100
- id: `${meta.id}/comments-companion`,
101
- connector: (node) =>
102
- Rx.make((get) =>
103
- Function.pipe(
104
- get(node),
105
- Option.flatMap((node) => {
106
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
107
- return Option.none();
108
- }
109
- const metadata = resolve(Obj.getTypename(node.data)!);
110
- return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();
111
- }),
112
- Option.map((node) => [
113
- {
114
- id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),
115
- type: PLANK_COMPANION_TYPE,
116
- data: 'comments',
117
- properties: {
118
- label: ['comments label', { ns: meta.id }],
119
- icon: 'ph--chat-text--regular',
120
- disposition: 'hidden',
121
- position: 'hoist',
122
- },
112
+
113
+ return Effect.succeed([
114
+ {
115
+ id: 'comment',
116
+ data: Effect.fnUntraced(function* () {
117
+ const config = getCommentConfig(Obj.getTypename(object)!)!;
118
+ const selection = selectionManager.getSelection(objectUri);
119
+ const anchor =
120
+ (config.comments === 'anchored' ? getAnchor(selection) : undefined) ?? Date.now().toString();
121
+ const name = config.getAnchorLabel?.(object, anchor);
122
+ yield* Operation.invoke(ThreadOperation.Create, {
123
+ anchor,
124
+ name,
125
+ subject: object,
126
+ });
127
+ }),
128
+ properties: {
129
+ label: ['add-comment.label', { ns: meta.id }],
130
+ icon: 'ph--chat-text--regular',
131
+ disposition: 'toolbar',
132
+ disabled,
133
+ testId: 'thread.comment.add',
123
134
  },
124
- ]),
125
- Option.getOrElse(() => []),
126
- ),
127
- ),
128
- }),
129
- createExtension({
130
- id: `${meta.id}/comment-toolbar`,
131
- actions: (node) =>
132
- Rx.make((get) =>
133
- Function.pipe(
134
- get(node),
135
- Option.flatMap((node) => {
136
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
137
- return Option.none();
138
- }
139
- const metadata = resolve(Obj.getTypename(node.data)!);
140
- return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();
141
- }),
142
- Option.map((object) => {
143
- const selectionManager = context.getCapability(AttentionCapabilities.Selection);
144
- const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
145
- const disabled = get(
146
- rxFromSignal(() => {
147
- const metadata = resolve(Obj.getTypename(object)!);
148
- const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);
149
- const anchor = getAnchor(selection);
150
- const invalidSelection = !anchor;
151
- const overlappingComment = toolbar[fullyQualifiedId(object)];
152
- return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;
153
- }),
154
- );
135
+ },
136
+ ]);
137
+ },
138
+ }),
139
+ ]);
155
140
 
156
- return [
157
- {
158
- id: `${fullyQualifiedId(object)}/comment`,
159
- data: () => {
160
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
161
- const metadata = resolve(Obj.getTypename(object)!);
162
- const selection = selectionManager.getSelection(fullyQualifiedId(object));
163
- // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.
164
- // Requires all components which support selection (e.g. table/kanban) to support anchored comments.
165
- const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
166
- const name = metadata.getAnchorLabel?.(object, anchor);
167
- void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));
168
- },
169
- properties: {
170
- label: ['add comment label', { ns: meta.id }],
171
- icon: 'ph--chat-text--regular',
172
- disposition: 'toolbar',
173
- disabled,
174
- testId: 'thread.comment.add',
175
- },
176
- },
177
- ];
178
- }),
179
- Option.getOrElse(() => []),
180
- ),
181
- ),
182
- }),
183
- ]);
184
- };
141
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
142
+ }),
143
+ );
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities } from '@dxos/app-toolkit';
9
+ // eslint-disable-next-line unused-imports/no-unused-imports
10
+ import type { Blueprint } from '@dxos/compute';
11
+
12
+ import { ThreadBlueprint } from '#blueprints';
13
+
14
+ const blueprintDefinition = Capability.makeModule<
15
+ [],
16
+ Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[]
17
+ >(() => Effect.succeed([Capability.contributes(AppCapabilities.BlueprintDefinition, ThreadBlueprint)]));
18
+
19
+ export default blueprintDefinition;
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { Operation } from '@dxos/compute';
9
+ import { Type } from '@dxos/echo';
10
+ import { SpaceOperation } from '@dxos/plugin-space';
11
+ import { SpaceCapabilities } from '@dxos/plugin-space';
12
+ import { Channel } from '@dxos/types';
13
+
14
+ export default Capability.makeModule(
15
+ Effect.fnUntraced(function* () {
16
+ return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
17
+ id: Type.getTypename(Channel.Channel),
18
+ createObject: (props, options) =>
19
+ Effect.gen(function* () {
20
+ const object = Channel.make(props);
21
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
22
+ object,
23
+ target: options.target,
24
+ hidden: true,
25
+ targetNodeId: options.targetNodeId,
26
+ });
27
+ }),
28
+ });
29
+ }),
30
+ );