@dxos/plugin-thread 0.8.4-main.c4373fc → 0.8.4-main.d9fc60f731

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 (602) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +271 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  5. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  6. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  7. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs +208 -0
  8. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs.map +7 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  10. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs +109 -0
  12. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  14. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  16. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  18. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  19. package/dist/lib/neutral/add-message-RDIABSIX.mjs +122 -0
  20. package/dist/lib/neutral/add-message-RDIABSIX.mjs.map +7 -0
  21. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs +244 -0
  22. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs.map +7 -0
  23. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs +120 -0
  24. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs.map +7 -0
  25. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs +40 -0
  26. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs.map +7 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  28. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  29. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  30. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  31. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-35GUWXBB.mjs +48 -0
  33. package/dist/lib/neutral/chunk-35GUWXBB.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
  35. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  37. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-HQZWTDJC.mjs +164 -0
  39. package/dist/lib/neutral/chunk-HQZWTDJC.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-IQBZZAMX.mjs +335 -0
  41. package/dist/lib/neutral/chunk-IQBZZAMX.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  43. package/dist/lib/neutral/chunk-JJETHBAZ.mjs +8 -0
  44. package/dist/lib/neutral/chunk-JJETHBAZ.mjs.map +7 -0
  45. package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
  46. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  48. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  49. package/dist/lib/neutral/components/index.mjs +541 -0
  50. package/dist/lib/neutral/components/index.mjs.map +7 -0
  51. package/dist/lib/neutral/containers/index.mjs +15 -0
  52. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  53. package/dist/lib/neutral/create-VXM6HJMN.mjs +61 -0
  54. package/dist/lib/neutral/create-VXM6HJMN.mjs.map +7 -0
  55. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs +19 -0
  56. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs.map +7 -0
  57. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  58. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  59. package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs +56 -0
  60. package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs.map +7 -0
  61. package/dist/lib/neutral/delete-6KZERY6K.mjs +57 -0
  62. package/dist/lib/neutral/delete-6KZERY6K.mjs.map +7 -0
  63. package/dist/lib/neutral/delete-message-PATSHW36.mjs +54 -0
  64. package/dist/lib/neutral/delete-message-PATSHW36.mjs.map +7 -0
  65. package/dist/lib/neutral/hooks/index.mjs +10 -0
  66. package/dist/lib/neutral/index.mjs +32 -0
  67. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs +83 -0
  68. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs.map +7 -0
  69. package/dist/lib/neutral/meta.json +1 -0
  70. package/dist/lib/neutral/meta.mjs +10 -0
  71. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs +23 -0
  72. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs.map +7 -0
  73. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  74. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  75. package/dist/lib/neutral/operations/index.mjs +8 -0
  76. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  77. package/dist/lib/neutral/plugin.mjs +16 -0
  78. package/dist/lib/neutral/plugin.mjs.map +7 -0
  79. package/dist/lib/neutral/react-surface-TUMXARMI.mjs +76 -0
  80. package/dist/lib/neutral/react-surface-TUMXARMI.mjs.map +7 -0
  81. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs +32 -0
  82. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs.map +7 -0
  83. package/dist/lib/neutral/restore-SP4HADCE.mjs +32 -0
  84. package/dist/lib/neutral/restore-SP4HADCE.mjs.map +7 -0
  85. package/dist/lib/neutral/restore-message-TVIC66VL.mjs +33 -0
  86. package/dist/lib/neutral/restore-message-TVIC66VL.mjs.map +7 -0
  87. package/dist/lib/neutral/select-DLHPEKEA.mjs +24 -0
  88. package/dist/lib/neutral/select-DLHPEKEA.mjs.map +7 -0
  89. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs +20 -0
  90. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs.map +7 -0
  91. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  92. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  93. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  94. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  95. package/dist/lib/neutral/testing/index.mjs +58 -0
  96. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  97. package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs +36 -0
  98. package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs.map +7 -0
  99. package/dist/lib/neutral/translations.mjs +91 -0
  100. package/dist/lib/neutral/translations.mjs.map +7 -0
  101. package/dist/lib/neutral/types/index.mjs +16 -0
  102. package/dist/lib/neutral/types/index.mjs.map +7 -0
  103. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  104. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  105. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  106. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  107. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  108. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  109. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  110. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  111. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  112. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  113. package/dist/types/src/blueprints/index.d.ts +2 -0
  114. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  116. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  118. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  120. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  122. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  124. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/index.d.ts +16 -15
  126. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  127. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  128. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  129. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  130. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  132. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  133. package/dist/types/src/capabilities/settings.d.ts +5 -2
  134. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  135. package/dist/types/src/capabilities/state.d.ts +5 -5
  136. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  137. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  138. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  139. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  140. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  141. package/dist/types/src/components/Chat/index.d.ts +2 -0
  142. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  143. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  144. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  145. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  146. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  148. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  149. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  150. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  152. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  153. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  154. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  155. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  156. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  157. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  158. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  160. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  161. package/dist/types/src/components/index.d.ts +5 -10
  162. package/dist/types/src/components/index.d.ts.map +1 -1
  163. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  164. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  165. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  166. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  167. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  168. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  169. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  170. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  171. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  172. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  173. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  174. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  175. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  176. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  177. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  178. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  179. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  180. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  181. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  182. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  183. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  184. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  185. package/dist/types/src/containers/index.d.ts +6 -0
  186. package/dist/types/src/containers/index.d.ts.map +1 -0
  187. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  188. package/dist/types/src/extensions/command.d.ts.map +1 -0
  189. package/dist/types/src/extensions/index.d.ts +1 -0
  190. package/dist/types/src/extensions/index.d.ts.map +1 -1
  191. package/dist/types/src/extensions/threads.d.ts +9 -4
  192. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  193. package/dist/types/src/hooks/analytics.d.ts +2 -3
  194. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +0 -4
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  198. package/dist/types/src/index.d.ts +2 -3
  199. package/dist/types/src/index.d.ts.map +1 -1
  200. package/dist/types/src/meta.d.ts +2 -2
  201. package/dist/types/src/meta.d.ts.map +1 -1
  202. package/dist/types/src/operations/add-message.d.ts +5 -0
  203. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  204. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  205. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  206. package/dist/types/src/operations/create-channel.d.ts +5 -0
  207. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  208. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  209. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  210. package/dist/types/src/operations/create.d.ts +5 -0
  211. package/dist/types/src/operations/create.d.ts.map +1 -0
  212. package/dist/types/src/operations/delete-message.d.ts +5 -0
  213. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  214. package/dist/types/src/operations/delete.d.ts +5 -0
  215. package/dist/types/src/operations/delete.d.ts.map +1 -0
  216. package/dist/types/src/operations/index.d.ts +3 -0
  217. package/dist/types/src/operations/index.d.ts.map +1 -0
  218. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  219. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  220. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  221. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  222. package/dist/types/src/operations/restore-message.d.ts +5 -0
  223. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  224. package/dist/types/src/operations/restore.d.ts +5 -0
  225. package/dist/types/src/operations/restore.d.ts.map +1 -0
  226. package/dist/types/src/operations/select.d.ts +5 -0
  227. package/dist/types/src/operations/select.d.ts.map +1 -0
  228. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  229. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  230. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  231. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  232. package/dist/types/src/plugin.d.ts +4 -0
  233. package/dist/types/src/plugin.d.ts.map +1 -0
  234. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  235. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  236. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  237. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  238. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
  239. package/dist/types/src/testing/data.d.ts.map +1 -0
  240. package/dist/types/src/testing/index.d.ts +1 -1
  241. package/dist/types/src/testing/index.d.ts.map +1 -1
  242. package/dist/types/src/translations.d.ts +142 -74
  243. package/dist/types/src/translations.d.ts.map +1 -1
  244. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  245. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  246. package/dist/types/src/types/Settings.d.ts +5 -0
  247. package/dist/types/src/types/Settings.d.ts.map +1 -0
  248. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  249. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  250. package/dist/types/src/types/ThreadOperation.d.ts +2745 -0
  251. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  252. package/dist/types/src/types/index.d.ts +4 -1
  253. package/dist/types/src/types/index.d.ts.map +1 -1
  254. package/dist/types/src/types/types.d.ts +3 -458
  255. package/dist/types/src/types/types.d.ts.map +1 -1
  256. package/dist/types/src/util.d.ts +6 -3
  257. package/dist/types/src/util.d.ts.map +1 -1
  258. package/dist/types/tsconfig.tsbuildinfo +1 -1
  259. package/package.json +150 -83
  260. package/src/ThreadPlugin.node.ts +39 -0
  261. package/src/ThreadPlugin.test.ts +37 -0
  262. package/src/ThreadPlugin.tsx +63 -123
  263. package/src/ThreadPlugin.workerd.ts +20 -0
  264. package/src/blueprints/index.ts +5 -0
  265. package/src/blueprints/thread-blueprint.ts +36 -0
  266. package/src/capabilities/agent-runner.ts +291 -0
  267. package/src/capabilities/app-graph-builder.ts +124 -165
  268. package/src/capabilities/blueprint-definition.ts +19 -0
  269. package/src/capabilities/create-object.ts +30 -0
  270. package/src/capabilities/index.ts +16 -12
  271. package/src/capabilities/markdown.ts +53 -36
  272. package/src/capabilities/operation-handler.ts +16 -0
  273. package/src/capabilities/react-surface.tsx +64 -78
  274. package/src/capabilities/settings.ts +26 -12
  275. package/src/capabilities/state.ts +14 -18
  276. package/src/capabilities/undo-mappings.ts +46 -0
  277. package/src/components/Chat/Chat.tsx +259 -0
  278. package/src/components/Chat/index.ts +5 -0
  279. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  280. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  281. package/src/components/CommentsPanel/CommentsThread.tsx +176 -0
  282. package/src/components/CommentsPanel/index.ts +6 -0
  283. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +83 -47
  284. package/src/components/MessagePanel/index.ts +5 -0
  285. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  286. package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
  287. package/src/components/ThreadSettings/index.ts +5 -0
  288. package/src/components/index.ts +5 -12
  289. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  290. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  291. package/src/containers/ChannelArticle/index.ts +5 -0
  292. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  293. package/src/containers/ChannelChat/index.ts +8 -0
  294. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +355 -0
  295. package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
  296. package/src/containers/CommentsCompanion/index.ts +5 -0
  297. package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
  298. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  299. package/src/containers/ThreadContainer/index.ts +8 -0
  300. package/src/containers/index.ts +10 -0
  301. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  302. package/src/extensions/index.ts +1 -0
  303. package/src/extensions/threads.ts +88 -43
  304. package/src/hooks/analytics.ts +22 -21
  305. package/src/hooks/index.ts +0 -4
  306. package/src/index.ts +4 -4
  307. package/src/meta.ts +39 -8
  308. package/src/operations/add-message.ts +94 -0
  309. package/src/operations/append-channel-message.ts +37 -0
  310. package/src/operations/create-channel.ts +20 -0
  311. package/src/operations/create-proposals.ts +49 -0
  312. package/src/operations/create.ts +63 -0
  313. package/src/operations/delete-message.ts +53 -0
  314. package/src/operations/delete.ts +63 -0
  315. package/src/operations/index.ts +22 -0
  316. package/src/operations/on-create-space.ts +27 -0
  317. package/src/operations/respond-to-thread.ts +32 -0
  318. package/src/operations/restore-message.ts +38 -0
  319. package/src/operations/restore.ts +38 -0
  320. package/src/operations/select.ts +24 -0
  321. package/src/operations/set-agent-config.ts +24 -0
  322. package/src/operations/toggle-resolved.ts +41 -0
  323. package/src/plugin.ts +11 -0
  324. package/src/should-trigger-agent.test.ts +72 -0
  325. package/src/should-trigger-agent.ts +50 -0
  326. package/src/testing/data.ts +49 -0
  327. package/src/testing/index.ts +1 -1
  328. package/src/translations.ts +75 -75
  329. package/src/types/AgentIdentity.ts +35 -0
  330. package/src/types/Settings.ts +10 -0
  331. package/src/types/ThreadCapabilities.ts +46 -0
  332. package/src/types/ThreadOperation.ts +225 -0
  333. package/src/types/index.ts +5 -1
  334. package/src/types/types.ts +4 -109
  335. package/src/util.ts +37 -5
  336. package/src/vite-env.d.ts +10 -0
  337. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  338. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  339. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  340. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  341. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  342. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  344. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  346. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  348. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  349. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  351. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  353. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  355. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  357. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  359. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  361. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
  363. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  364. package/dist/lib/browser/index.mjs +0 -311
  365. package/dist/lib/browser/index.mjs.map +0 -7
  366. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  367. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  368. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  369. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  370. package/dist/lib/browser/meta.json +0 -1
  371. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  372. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  373. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  374. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  375. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  376. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  377. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  378. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  379. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  380. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  381. package/dist/lib/browser/types/index.mjs +0 -16
  382. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  383. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  384. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  385. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  386. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  387. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  389. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  391. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  393. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  395. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  397. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  399. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  401. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  403. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  405. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  407. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
  409. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  410. package/dist/lib/node-esm/index.mjs +0 -312
  411. package/dist/lib/node-esm/index.mjs.map +0 -7
  412. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  413. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  414. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  415. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  416. package/dist/lib/node-esm/meta.json +0 -1
  417. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  418. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  419. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  420. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  421. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  422. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  423. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  424. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  425. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  426. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  427. package/dist/lib/node-esm/types/index.mjs +0 -17
  428. package/dist/types/src/calls/call-manager.d.ts +0 -77
  429. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  430. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  431. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  432. package/dist/types/src/calls/index.d.ts +0 -7
  433. package/dist/types/src/calls/index.d.ts.map +0 -1
  434. package/dist/types/src/calls/media-manager.d.ts +0 -60
  435. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  436. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  437. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  438. package/dist/types/src/calls/types.d.ts +0 -45
  439. package/dist/types/src/calls/types.d.ts.map +0 -1
  440. package/dist/types/src/calls/util/audio.d.ts +0 -6
  441. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  442. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  443. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  444. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  445. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  446. package/dist/types/src/calls/util/index.d.ts +0 -5
  447. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  448. package/dist/types/src/calls/util/media.d.ts +0 -6
  449. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  450. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  451. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  452. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  453. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  454. package/dist/types/src/calls-service.stories.d.ts +0 -23
  455. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  456. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  457. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  458. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  459. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  460. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  461. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  462. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  463. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  464. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  465. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  466. package/dist/types/src/components/Call/Call.d.ts +0 -17
  467. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  468. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  469. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  470. package/dist/types/src/components/Call/index.d.ts +0 -3
  471. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  472. package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
  473. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  474. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  475. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  476. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  477. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  478. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -94
  479. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  480. package/dist/types/src/components/Chat.stories.d.ts +0 -93
  481. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  482. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  483. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  484. package/dist/types/src/components/Comments.stories.d.ts +0 -162
  485. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  486. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  487. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  488. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  489. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  490. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  491. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  492. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  493. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  494. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  495. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  496. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  497. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  498. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  499. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  500. package/dist/types/src/components/Media/index.d.ts +0 -3
  501. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  502. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  503. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  504. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  505. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  506. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  507. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  508. package/dist/types/src/components/Participant/index.d.ts +0 -3
  509. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  510. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  511. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  512. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  513. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  514. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  515. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  516. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
  517. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  518. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  519. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  520. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  521. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  522. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  523. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  524. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  525. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  526. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  527. package/dist/types/src/components/testing.d.ts.map +0 -1
  528. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  529. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  530. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  531. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  532. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  533. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  534. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  535. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  536. package/dist/types/src/testing/stories.d.ts +0 -2
  537. package/dist/types/src/testing/stories.d.ts.map +0 -1
  538. package/dist/types/src/types/schema.d.ts +0 -179
  539. package/dist/types/src/types/schema.d.ts.map +0 -1
  540. package/src/calls/call-manager.ts +0 -246
  541. package/src/calls/call-swarm-synchronizer.ts +0 -350
  542. package/src/calls/index.ts +0 -10
  543. package/src/calls/media-manager.ts +0 -375
  544. package/src/calls/speaking-monitor.ts +0 -85
  545. package/src/calls/types.ts +0 -74
  546. package/src/calls/util/audio.ts +0 -58
  547. package/src/calls/util/calls-service.ts +0 -581
  548. package/src/calls/util/history-cache.ts +0 -27
  549. package/src/calls/util/index.ts +0 -8
  550. package/src/calls/util/media.ts +0 -52
  551. package/src/calls/util/stub-media-streams.ts +0 -127
  552. package/src/calls/util/task-scheduling.ts +0 -92
  553. package/src/calls-service.stories.tsx +0 -229
  554. package/src/capabilities/call-manager.ts +0 -20
  555. package/src/capabilities/capabilities.ts +0 -33
  556. package/src/capabilities/intent-resolver.ts +0 -348
  557. package/src/capabilities/react-root.tsx +0 -17
  558. package/src/capabilities/toolkit.ts +0 -82
  559. package/src/components/Call/Call.tsx +0 -89
  560. package/src/components/Call/Toolbar.tsx +0 -182
  561. package/src/components/Call/index.ts +0 -6
  562. package/src/components/CallDebugPanel.tsx +0 -174
  563. package/src/components/CallSidebar.tsx +0 -18
  564. package/src/components/ChannelContainer.stories.tsx +0 -59
  565. package/src/components/ChannelContainer.tsx +0 -201
  566. package/src/components/Chat.stories.tsx +0 -91
  567. package/src/components/ChatContainer.tsx +0 -145
  568. package/src/components/Comments.stories.tsx +0 -93
  569. package/src/components/CommentsContainer.tsx +0 -72
  570. package/src/components/CommentsThreadContainer.tsx +0 -169
  571. package/src/components/Lobby/Lobby.tsx +0 -119
  572. package/src/components/Lobby/index.ts +0 -5
  573. package/src/components/Media/AudioStream.tsx +0 -67
  574. package/src/components/Media/VideoObject.stories.tsx +0 -60
  575. package/src/components/Media/VideoObject.tsx +0 -58
  576. package/src/components/Media/index.ts +0 -6
  577. package/src/components/Participant/Participant.tsx +0 -63
  578. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  579. package/src/components/Participant/index.ts +0 -6
  580. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
  581. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  582. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  583. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  584. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  585. package/src/components/ResponsiveGrid/index.ts +0 -7
  586. package/src/components/ThreadComplementary.tsx +0 -181
  587. package/src/components/ThreadSettings.tsx +0 -16
  588. package/src/components/testing.ts +0 -51
  589. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  590. package/src/hooks/useDebugMode.ts +0 -25
  591. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  592. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  593. package/src/testing/stories.ts +0 -54
  594. package/src/types/schema.ts +0 -33
  595. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  596. package/src/typings.d.ts +0 -8
  597. /package/dist/lib/{browser/ChannelContainer-BGDGZHV4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  598. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  599. /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  600. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  601. /package/dist/lib/{node-esm/ChannelContainer-OXC6BTU7.mjs.map → neutral/index.mjs.map} +0 -0
  602. /package/dist/lib/{node-esm/ChatContainer-SH6LTFQL.mjs.map → neutral/meta.mjs.map} +0 -0
@@ -0,0 +1,244 @@
1
+ import {
2
+ AgentIdentity,
3
+ ThreadCapabilities_exports
4
+ } from "./chunk-IQBZZAMX.mjs";
5
+ import "./chunk-J5LGTIGS.mjs";
6
+
7
+ // src/capabilities/agent-runner.ts
8
+ import * as LanguageModel from "@effect/ai/LanguageModel";
9
+ import * as Tool from "@effect/ai/Tool";
10
+ import * as Toolkit from "@effect/ai/Toolkit";
11
+ import * as Effect from "effect/Effect";
12
+ import * as Layer from "effect/Layer";
13
+ import * as Schema from "effect/Schema";
14
+ import { AiPreprocessor, AiService } from "@dxos/ai";
15
+ import { Capability } from "@dxos/app-framework";
16
+ import { AppCapabilities } from "@dxos/app-toolkit";
17
+ import { Filter, Obj, Ref, Relation } from "@dxos/echo";
18
+ import { createDocAccessor, getRangeFromCursor, toCursorRange, updateText } from "@dxos/echo-db";
19
+ import { log } from "@dxos/log";
20
+ import { Markdown } from "@dxos/plugin-markdown";
21
+ import { AnchoredTo, Message } from "@dxos/types";
22
+ import { trim } from "@dxos/util";
23
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/capabilities/agent-runner.ts";
24
+ var DEFAULT_MODEL = "@anthropic/claude-sonnet-4-5";
25
+ var baseInstructions = trim`
26
+ You are a helpful assistant participating in a comment thread on a document.
27
+ Read the document and the conversation history; the user's requests usually
28
+ refer to the document content.
29
+
30
+ When the user asks you to MODIFY the document (translate, rewrite, edit, fix,
31
+ refactor, etc.) call ONE of the edit tools. Do NOT paste the new content into
32
+ chat — always use the tool.
33
+
34
+ - If the thread has an anchored selection (shown in <selection>...</selection>
35
+ below), use \`editAnchoredRange\` with ONLY the replacement text for that
36
+ span. Leave the rest of the document untouched.
37
+ - If there is no anchored selection, use \`updateDocument\` with the FULL new
38
+ markdown content.
39
+
40
+ AFTER calling an edit tool you MUST also produce a chat reply that:
41
+ 1. States in one line what you changed (e.g. "Translated the selection to
42
+ Japanese.");
43
+ 2. Optionally adds one or two sentences explaining notable choices,
44
+ caveats, or suggesting a follow-up. Keep the whole reply under 60 words.
45
+ 3. Does NOT repeat the new document content — it's already shown in the
46
+ editor on the left.
47
+
48
+ When the user asks a QUESTION (or just chats), reply in plain text under
49
+ 80 words and do not call any edit tool.
50
+
51
+ Do not address the user as 'user'; use their name if known. Never call yourself.
52
+ `;
53
+ var EditAnchoredRangeTool = Tool.make("editAnchoredRange", {
54
+ description: "Replace the text of the anchored selection in the markdown document. Call this for in-place edits when a <selection> is provided.",
55
+ parameters: {
56
+ replacement: Schema.String.annotations({
57
+ description: "The new text for the anchored range. Only this span will be replaced."
58
+ })
59
+ },
60
+ success: Schema.String
61
+ });
62
+ var UpdateDocumentTool = Tool.make("updateDocument", {
63
+ description: "Replace the entire markdown content of the document. Call this for in-place edits when there is no anchored selection.",
64
+ parameters: {
65
+ content: Schema.String.annotations({
66
+ description: "The full new markdown content of the document."
67
+ })
68
+ },
69
+ success: Schema.String
70
+ });
71
+ var resolveEditTarget = (thread, subject) => {
72
+ if (!Obj.instanceOf(Markdown.Document, subject)) {
73
+ return {
74
+ kind: "none"
75
+ };
76
+ }
77
+ const text = subject.content?.target;
78
+ if (!text) {
79
+ return {
80
+ kind: "none"
81
+ };
82
+ }
83
+ const db = Obj.getDatabase(thread);
84
+ if (!db) {
85
+ return {
86
+ kind: "document",
87
+ text
88
+ };
89
+ }
90
+ const relations = db.query(Filter.type(AnchoredTo.AnchoredTo)).runSync();
91
+ const ours = relations.find((relation) => Relation.getSource(relation) === thread && Relation.getTarget(relation) === subject);
92
+ if (!ours?.anchor) {
93
+ return {
94
+ kind: "document",
95
+ text
96
+ };
97
+ }
98
+ try {
99
+ const accessor = createDocAccessor(text, [
100
+ "content"
101
+ ]);
102
+ const range = getRangeFromCursor(accessor, ours.anchor);
103
+ if (!range || range.start === range.end) {
104
+ return {
105
+ kind: "document",
106
+ text
107
+ };
108
+ }
109
+ const content = text.content ?? "";
110
+ return {
111
+ kind: "anchored",
112
+ text,
113
+ from: range.start,
114
+ to: range.end,
115
+ snippet: content.slice(range.start, range.end),
116
+ relation: ours
117
+ };
118
+ } catch (err) {
119
+ log.warn("failed to resolve anchored range; falling back to whole-document edit", {
120
+ error: err
121
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 122, S: void 0 });
122
+ return {
123
+ kind: "document",
124
+ text
125
+ };
126
+ }
127
+ };
128
+ var buildInstructions = (subject, target) => {
129
+ if (!Obj.instanceOf(Markdown.Document, subject)) {
130
+ return baseInstructions;
131
+ }
132
+ const content = subject.content?.target?.content ?? "";
133
+ if (!content) {
134
+ return baseInstructions;
135
+ }
136
+ const selectionBlock = target.kind === "anchored" ? `
137
+
138
+ <selection>
139
+ ${target.snippet}
140
+ </selection>` : "";
141
+ return trim`
142
+ ${baseInstructions}
143
+
144
+ <document name="${subject.name ?? "untitled"}">
145
+ ${content}
146
+ </document>${selectionBlock}
147
+ `;
148
+ };
149
+ var normalizeRoles = (messages) => messages.map((message) => message.sender.role === "assistant" ? message : {
150
+ ...message,
151
+ sender: {
152
+ ...message.sender,
153
+ role: "user"
154
+ }
155
+ });
156
+ var agent_runner_default = Capability.makeModule(Effect.fnUntraced(function* () {
157
+ const runner = {
158
+ run: ({ thread, subject }) => Effect.gen(function* () {
159
+ const aiServiceLayers = yield* Capability.getAll(AppCapabilities.AiServiceLayer);
160
+ const aiServiceLayer = aiServiceLayers[0];
161
+ if (!aiServiceLayer) {
162
+ log.warn("comment-thread agent runner: no AiServiceLayer contributed; skipping turn", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 186, S: this });
163
+ return;
164
+ }
165
+ const identity = yield* Capability.get(AgentIdentity);
166
+ const loaded = yield* Effect.forEach(thread.messages, (messageRef) => Effect.promise(() => messageRef.load()), {
167
+ concurrency: "unbounded"
168
+ });
169
+ const history = normalizeRoles(loaded);
170
+ const target = resolveEditTarget(thread, subject);
171
+ const prompt = yield* AiPreprocessor.preprocessPrompt(history, {
172
+ system: buildInstructions(subject, target)
173
+ });
174
+ let editOutcome;
175
+ const toolkit = Toolkit.make(EditAnchoredRangeTool, UpdateDocumentTool);
176
+ const toolkitLayer = toolkit.toLayer({
177
+ editAnchoredRange: ({ replacement }) => Effect.sync(() => {
178
+ if (target.kind !== "anchored") {
179
+ return "No anchored selection on this thread; use updateDocument instead.";
180
+ }
181
+ const original = target.text.content ?? "";
182
+ const next = original.slice(0, target.from) + replacement + original.slice(target.to);
183
+ updateText(target.text, [
184
+ "content"
185
+ ], next);
186
+ const newTo = target.from + replacement.length;
187
+ const accessor = createDocAccessor(target.text, [
188
+ "content"
189
+ ]);
190
+ const newAnchor = toCursorRange(accessor, target.from, newTo);
191
+ Relation.update(target.relation, (relation) => {
192
+ relation.anchor = newAnchor;
193
+ });
194
+ editOutcome = "anchored";
195
+ return "Anchored range replaced.";
196
+ }),
197
+ updateDocument: ({ content }) => Effect.sync(() => {
198
+ if (target.kind === "none") {
199
+ return "No editable document in scope.";
200
+ }
201
+ updateText(target.text, [
202
+ "content"
203
+ ], content);
204
+ editOutcome = "document";
205
+ return "Document updated.";
206
+ })
207
+ });
208
+ const response = yield* LanguageModel.generateText({
209
+ prompt,
210
+ toolkit
211
+ }).pipe(Effect.scoped, Effect.provide(AiService.model(DEFAULT_MODEL).pipe(Layer.provide(aiServiceLayer))), Effect.provide(toolkitLayer));
212
+ const fallbackByOutcome = {
213
+ anchored: "Updated the highlighted selection.",
214
+ document: "Updated the document."
215
+ };
216
+ const text = response.text.trim().length > 0 ? response.text : editOutcome ? fallbackByOutcome[editOutcome] : "";
217
+ if (text.length === 0) {
218
+ return;
219
+ }
220
+ const reply = Obj.make(Message.Message, {
221
+ created: (/* @__PURE__ */ new Date()).toISOString(),
222
+ sender: {
223
+ role: "assistant",
224
+ name: identity.name,
225
+ identityDid: identity.identityDid
226
+ },
227
+ blocks: [
228
+ {
229
+ _tag: "text",
230
+ text
231
+ }
232
+ ]
233
+ });
234
+ Obj.update(thread, (thread2) => {
235
+ thread2.messages.push(Ref.make(reply));
236
+ });
237
+ })
238
+ };
239
+ return Capability.contributes(ThreadCapabilities_exports.AgentRunner, runner);
240
+ }));
241
+ export {
242
+ agent_runner_default as default
243
+ };
244
+ //# sourceMappingURL=agent-runner-RB7N5HLD.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/agent-runner.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Tool from '@effect/ai/Tool';\nimport * as Toolkit from '@effect/ai/Toolkit';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Schema from 'effect/Schema';\n\nimport { AiPreprocessor, AiService } from '@dxos/ai';\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Filter, Obj, Ref, Relation } from '@dxos/echo';\nimport { createDocAccessor, getRangeFromCursor, toCursorRange, updateText } from '@dxos/echo-db';\nimport { log } from '@dxos/log';\nimport { Markdown } from '@dxos/plugin-markdown';\nimport { AnchoredTo, Message } from '@dxos/types';\nimport { trim } from '@dxos/util';\n\nimport { AgentIdentity, ThreadCapabilities } from '../types';\n\nconst DEFAULT_MODEL = '@anthropic/claude-sonnet-4-5';\n\nconst baseInstructions = trim`\n You are a helpful assistant participating in a comment thread on a document.\n Read the document and the conversation history; the user's requests usually\n refer to the document content.\n\n When the user asks you to MODIFY the document (translate, rewrite, edit, fix,\n refactor, etc.) call ONE of the edit tools. Do NOT paste the new content into\n chat — always use the tool.\n\n - If the thread has an anchored selection (shown in <selection>...</selection>\n below), use \\`editAnchoredRange\\` with ONLY the replacement text for that\n span. Leave the rest of the document untouched.\n - If there is no anchored selection, use \\`updateDocument\\` with the FULL new\n markdown content.\n\n AFTER calling an edit tool you MUST also produce a chat reply that:\n 1. States in one line what you changed (e.g. \"Translated the selection to\n Japanese.\");\n 2. Optionally adds one or two sentences explaining notable choices,\n caveats, or suggesting a follow-up. Keep the whole reply under 60 words.\n 3. Does NOT repeat the new document content — it's already shown in the\n editor on the left.\n\n When the user asks a QUESTION (or just chats), reply in plain text under\n 80 words and do not call any edit tool.\n\n Do not address the user as 'user'; use their name if known. Never call yourself.\n`;\n\nconst EditAnchoredRangeTool = Tool.make('editAnchoredRange', {\n description:\n 'Replace the text of the anchored selection in the markdown document. Call this for in-place edits when a <selection> is provided.',\n parameters: {\n replacement: Schema.String.annotations({\n description: 'The new text for the anchored range. Only this span will be replaced.',\n }),\n },\n success: Schema.String,\n});\n\nconst UpdateDocumentTool = Tool.make('updateDocument', {\n description:\n 'Replace the entire markdown content of the document. Call this for in-place edits when there is no anchored selection.',\n parameters: {\n content: Schema.String.annotations({\n description: 'The full new markdown content of the document.',\n }),\n },\n success: Schema.String,\n});\n\ntype EditTarget =\n | {\n kind: 'anchored';\n text: Obj.Any;\n snippet: string;\n from: number;\n to: number;\n relation: AnchoredTo.AnchoredTo;\n }\n | { kind: 'document'; text: Obj.Any }\n | { kind: 'none' };\n\n/**\n * Resolve the agent's edit target for this turn:\n * - 'anchored' when the thread is anchored to a span of the doc — agent edits\n * only that span via `editAnchoredRange`.\n * - 'document' when the subject is a Markdown.Document but the thread has no\n * anchor — agent may replace the whole doc via `updateDocument`.\n * - 'none' when the subject isn't editable text — no edit tools wired.\n */\nconst resolveEditTarget = (thread: Obj.Any, subject: Obj.Any): EditTarget => {\n if (!Obj.instanceOf(Markdown.Document, subject)) {\n return { kind: 'none' };\n }\n const text = subject.content?.target;\n if (!text) {\n return { kind: 'none' };\n }\n const db = Obj.getDatabase(thread);\n if (!db) {\n return { kind: 'document', text };\n }\n const relations = db.query(Filter.type(AnchoredTo.AnchoredTo)).runSync();\n const ours = relations.find(\n (relation: AnchoredTo.AnchoredTo) =>\n Relation.getSource(relation) === thread && Relation.getTarget(relation) === subject,\n );\n if (!ours?.anchor) {\n return { kind: 'document', text };\n }\n try {\n const accessor = createDocAccessor(text, ['content']);\n const range = getRangeFromCursor(accessor, ours.anchor);\n if (!range || range.start === range.end) {\n return { kind: 'document', text };\n }\n const content = (text as unknown as { content: string }).content ?? '';\n return {\n kind: 'anchored',\n text,\n from: range.start,\n to: range.end,\n snippet: content.slice(range.start, range.end),\n relation: ours,\n };\n } catch (err) {\n log.warn('failed to resolve anchored range; falling back to whole-document edit', { error: err });\n return { kind: 'document', text };\n }\n};\n\n/**\n * Build the system prompt for a turn. Inlines the doc content and, when the\n * thread is anchored, the highlighted snippet so the agent can target just\n * that span.\n */\nconst buildInstructions = (subject: Obj.Any, target: EditTarget): string => {\n if (!Obj.instanceOf(Markdown.Document, subject)) {\n return baseInstructions;\n }\n const content = subject.content?.target?.content ?? '';\n if (!content) {\n return baseInstructions;\n }\n const selectionBlock = target.kind === 'anchored' ? `\\n\\n<selection>\\n${target.snippet}\\n</selection>` : '';\n return trim`\n ${baseInstructions}\n\n <document name=\"${subject.name ?? 'untitled'}\">\n ${content}\n </document>${selectionBlock}\n `;\n};\n\n/**\n * Normalises messages for the LLM prompt: user-authored messages in comment\n * threads carry no explicit role (only assistant messages do), but the prompt\n * preprocessor switches on `role` and drops anything that isn't 'user' or\n * 'assistant'. Stamp `role: 'user'` on every non-assistant turn before\n * preprocessing.\n */\nconst normalizeRoles = (messages: readonly Message.Message[]): Message.Message[] =>\n messages.map((message) =>\n message.sender.role === 'assistant'\n ? message\n : { ...message, sender: { ...message.sender, role: 'user' as const } },\n );\n\n/**\n * Default AgentRunner implementation. One-shot LLM call per scheduled turn —\n * loads the thread, builds a prompt from the message history, generates a\n * reply via `LanguageModel.generateText`, and appends the response as an\n * assistant message on the same thread.\n *\n * Edit tools (`editAnchoredRange`, `updateDocument`) are wired per turn based\n * on whether the thread has an anchored range. Splicing uses `updateText`\n * (Automerge-diff based) so cursors on other comment threads stay valid.\n *\n * The `AiServiceLayer` capability is resolved per turn (not at module\n * activation) so plugin order doesn't matter for live wiring. When no host\n * has contributed an `AppCapabilities.AiServiceLayer`, the runner logs a\n * warning and returns; storybook stub paths contribute their own\n * `AgentRunner` earlier in plugin order to short-circuit this module entirely.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const runner: ThreadCapabilities.AgentRunner = {\n run: ({ thread, subject }) =>\n Effect.gen(function* () {\n const aiServiceLayers = yield* Capability.getAll(AppCapabilities.AiServiceLayer);\n const aiServiceLayer = aiServiceLayers[0];\n if (!aiServiceLayer) {\n log.warn('comment-thread agent runner: no AiServiceLayer contributed; skipping turn');\n return;\n }\n const identity = yield* Capability.get(AgentIdentity);\n\n // Load every referenced message into a plain Message.Message[].\n const loaded = yield* Effect.forEach(\n thread.messages,\n (messageRef) => Effect.promise(() => messageRef.load()),\n { concurrency: 'unbounded' },\n );\n const history = normalizeRoles(loaded);\n\n const target = resolveEditTarget(thread, subject);\n const prompt = yield* AiPreprocessor.preprocessPrompt(history, {\n system: buildInstructions(subject, target),\n });\n\n // Capture which edit tool fired so we can synthesize a fallback chat\n // ack when the model elides the post-tool message.\n let editOutcome: 'anchored' | 'document' | undefined;\n\n const toolkit = Toolkit.make(EditAnchoredRangeTool, UpdateDocumentTool);\n const toolkitLayer = toolkit.toLayer({\n editAnchoredRange: ({ replacement }) =>\n Effect.sync(() => {\n if (target.kind !== 'anchored') {\n return 'No anchored selection on this thread; use updateDocument instead.';\n }\n const original = (target.text as unknown as { content: string }).content ?? '';\n const next = original.slice(0, target.from) + replacement + original.slice(target.to);\n updateText(target.text, ['content'], next);\n\n // Cursor at `to` (left-associated) can collapse to `from` after a\n // delete-and-insert at that range, leaving the comment's anchor\n // pointing at a zero-width span. Rewrite AnchoredTo.anchor to\n // span the newly-inserted text so the editor marker continues\n // to highlight the replaced range.\n const newTo = target.from + replacement.length;\n const accessor = createDocAccessor(target.text, ['content']);\n const newAnchor = toCursorRange(accessor, target.from, newTo);\n Relation.update(target.relation, (relation) => {\n (relation as Relation.Mutable<AnchoredTo.AnchoredTo>).anchor = newAnchor;\n });\n editOutcome = 'anchored';\n return 'Anchored range replaced.';\n }),\n updateDocument: ({ content }) =>\n Effect.sync(() => {\n if (target.kind === 'none') {\n return 'No editable document in scope.';\n }\n updateText(target.text, ['content'], content);\n editOutcome = 'document';\n return 'Document updated.';\n }),\n });\n\n const response = yield* LanguageModel.generateText({ prompt, toolkit }).pipe(\n Effect.scoped,\n Effect.provide(AiService.model(DEFAULT_MODEL).pipe(Layer.provide(aiServiceLayer))),\n Effect.provide(toolkitLayer),\n );\n\n // The chat message defaults to whatever the model returned, but when\n // the model elided its post-tool reply (some providers do) fall back\n // to a synthesized ack so the thread always reflects that something\n // happened.\n const fallbackByOutcome: Record<'anchored' | 'document', string> = {\n anchored: 'Updated the highlighted selection.',\n document: 'Updated the document.',\n };\n const text =\n response.text.trim().length > 0 ? response.text : editOutcome ? fallbackByOutcome[editOutcome] : '';\n if (text.length === 0) {\n // Nothing to say and nothing was edited — don't post a hollow bubble.\n return;\n }\n\n const reply = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { role: 'assistant', name: identity.name, identityDid: identity.identityDid },\n blocks: [{ _tag: 'text', text }],\n });\n Obj.update(thread, (thread) => {\n (thread.messages as Ref.Ref<Message.Message>[]).push(Ref.make(reply));\n });\n }),\n };\n\n return Capability.contributes(ThreadCapabilities.AgentRunner, runner);\n }),\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["LanguageModel", "Tool", "Toolkit", "Effect", "Layer", "Schema", "AiPreprocessor", "AiService", "Capability", "AppCapabilities", "Filter", "Obj", "Ref", "Relation", "createDocAccessor", "getRangeFromCursor", "toCursorRange", "updateText", "log", "Markdown", "AnchoredTo", "Message", "trim", "DEFAULT_MODEL", "parameters", "replacement", "description", "success", "UpdateDocumentTool", "Schema", "kind", "text", "ours", "anchor", "from", "range", "to", "snippet", "content", "relation", "log", "error", "baseInstructions", "selectionBlock", "subject", "role", "run", "thread", "aiServiceLayer", "aiServiceLayers", "loaded", "Effect", "forEach", "normalizeRoles", "prompt", "AiPreprocessor", "preprocessPrompt", "system", "buildInstructions", "target", "editAnchoredRange", "sync", "original", "updateText", "next", "Relation", "newAnchor", "editOutcome", "updateDocument", "response", "toolkit", "pipe", "document", "sender", "name", "identityDid", "blocks", "_tag", "update", "Capability"]
7
+ }
@@ -0,0 +1,120 @@
1
+ import {
2
+ getAnchor
3
+ } from "./chunk-JLY4NVTA.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/capabilities/app-graph-builder.ts
7
+ import { Atom } from "@effect-atom/atom-react";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Option from "effect/Option";
10
+ import { Capability } from "@dxos/app-framework";
11
+ import { AppCapabilities, AppNode } from "@dxos/app-toolkit";
12
+ import { Operation } from "@dxos/compute";
13
+ import { Obj } from "@dxos/echo";
14
+ import { AttentionCapabilities } from "@dxos/plugin-attention";
15
+ import { GraphBuilder, NodeMatcher } from "@dxos/plugin-graph";
16
+ import { linkedSegment } from "@dxos/react-ui-attention";
17
+ import { defaultSelection } from "@dxos/react-ui-attention";
18
+ import { Channel } from "@dxos/types";
19
+ import { meta } from "#meta";
20
+ import { ThreadOperation } from "#types";
21
+ import { ThreadCapabilities } from "#types";
22
+ var commentDisabledFamily = Atom.family(({ stateAtom, selectionManager, objectId, commentsType, selectionMode }) => Atom.make((get) => {
23
+ const stateAtoms = get(stateAtom);
24
+ const state = stateAtoms[0] ? get(stateAtoms[0]) : void 0;
25
+ const toolbar = state?.toolbar ?? {};
26
+ const selectionState = get(selectionManager.state);
27
+ const selection = selectionState.selections[objectId] ?? (selectionMode ? defaultSelection(selectionMode) : void 0);
28
+ const anchor = getAnchor(selection);
29
+ const invalidSelection = !anchor;
30
+ const overlappingComment = toolbar[objectId];
31
+ return commentsType === "anchored" && invalidSelection || overlappingComment;
32
+ }));
33
+ var whenCommentableObject = NodeMatcher.whenAll(NodeMatcher.whenEchoObjectMatches, NodeMatcher.whenNot(NodeMatcher.whenEchoTypeMatches(Channel.Channel)));
34
+ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
35
+ const capabilities = yield* Capability.Service;
36
+ const getCommentConfig = (typename) => capabilities.getAll(AppCapabilities.CommentConfig).find(({ id }) => id === typename);
37
+ const extensions = yield* Effect.all([
38
+ GraphBuilder.createExtension({
39
+ id: "commentsCompanion",
40
+ match: (node) => {
41
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
42
+ return Option.none();
43
+ }
44
+ const commentConfig = getCommentConfig(Obj.getTypename(node.data));
45
+ return commentConfig ? Option.some(node) : Option.none();
46
+ },
47
+ connector: () => Effect.succeed([
48
+ AppNode.makeCompanion({
49
+ id: linkedSegment("comments"),
50
+ label: [
51
+ "comments.label",
52
+ {
53
+ ns: meta.id
54
+ }
55
+ ],
56
+ icon: "ph--chat-text--regular",
57
+ data: "comments",
58
+ position: "first"
59
+ })
60
+ ])
61
+ }),
62
+ GraphBuilder.createExtension({
63
+ id: "commentToolbar",
64
+ match: (node) => {
65
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
66
+ return Option.none();
67
+ }
68
+ const commentConfig = getCommentConfig(Obj.getTypename(node.data));
69
+ return commentConfig ? Option.some(node) : Option.none();
70
+ },
71
+ actions: (matched, get) => {
72
+ const object = matched.data;
73
+ const objectUri = Obj.getURI(object);
74
+ const stateAtom = capabilities.atom(ThreadCapabilities.State);
75
+ const selectionManager = capabilities.get(AttentionCapabilities.Selection);
76
+ const commentConfig = getCommentConfig(Obj.getTypename(object));
77
+ const disabled = get(commentDisabledFamily({
78
+ stateAtom,
79
+ selectionManager,
80
+ objectId: objectUri,
81
+ commentsType: commentConfig.comments,
82
+ selectionMode: commentConfig.selectionMode
83
+ }));
84
+ return Effect.succeed([
85
+ {
86
+ id: "comment",
87
+ data: Effect.fnUntraced(function* () {
88
+ const config = getCommentConfig(Obj.getTypename(object));
89
+ const selection = selectionManager.getSelection(objectUri);
90
+ const anchor = (config.comments === "anchored" ? getAnchor(selection) : void 0) ?? Date.now().toString();
91
+ const name = config.getAnchorLabel?.(object, anchor);
92
+ yield* Operation.invoke(ThreadOperation.Create, {
93
+ anchor,
94
+ name,
95
+ subject: object
96
+ });
97
+ }),
98
+ properties: {
99
+ label: [
100
+ "add-comment.label",
101
+ {
102
+ ns: meta.id
103
+ }
104
+ ],
105
+ icon: "ph--chat-text--regular",
106
+ disposition: "toolbar",
107
+ disabled,
108
+ testId: "thread.comment.add"
109
+ }
110
+ }
111
+ ]);
112
+ }
113
+ })
114
+ ]);
115
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
116
+ }));
117
+ export {
118
+ app_graph_builder_default as default
119
+ };
120
+ //# sourceMappingURL=app-graph-builder-PDLRFYSI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities, AppNode } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\nimport { linkedSegment } from '@dxos/react-ui-attention';\nimport { type SelectionManager, type SelectionMode, defaultSelection } from '@dxos/react-ui-attention';\nimport { Channel } from '@dxos/types';\n\nimport { meta } from '#meta';\nimport { ThreadOperation } from '#types';\nimport { ThreadCapabilities, type ThreadState } from '#types';\n\nimport { getAnchor } from '../util';\n\ntype CommentDisabledParams = {\n stateAtom: Atom.Atom<Atom.Writable<ThreadState>[]>;\n selectionManager: SelectionManager;\n objectId: string;\n commentsType: string;\n selectionMode: SelectionMode | undefined;\n};\n\n/**\n * Atom family to derive whether the comment button should be disabled.\n * Uses a composite key to ensure proper caching.\n */\nconst commentDisabledFamily = Atom.family(\n ({ stateAtom, selectionManager, objectId, commentsType, selectionMode }: CommentDisabledParams) =>\n Atom.make((get) => {\n const stateAtoms = get(stateAtom);\n const state = stateAtoms[0] ? get(stateAtoms[0]) : undefined;\n const toolbar = state?.toolbar ?? {};\n const selectionState = get(selectionManager.state);\n const selection =\n selectionState.selections[objectId] ?? (selectionMode ? defaultSelection(selectionMode) : undefined);\n const anchor = getAnchor(selection);\n const invalidSelection = !anchor;\n const overlappingComment = toolbar[objectId];\n return (commentsType === 'anchored' && invalidSelection) || overlappingComment;\n }),\n);\n\n/** Match ECHO objects that are NOT Channels (i.e. objects that can have comments). */\nconst whenCommentableObject = NodeMatcher.whenAll(\n NodeMatcher.whenEchoObjectMatches,\n NodeMatcher.whenNot(NodeMatcher.whenEchoTypeMatches(Channel.Channel)),\n);\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n\n const getCommentConfig = (typename: string) =>\n capabilities.getAll(AppCapabilities.CommentConfig).find(({ id }) => id === typename);\n\n const extensions = yield* Effect.all([\n GraphBuilder.createExtension({\n id: 'commentsCompanion',\n match: (node) => {\n if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {\n return Option.none();\n }\n const commentConfig = getCommentConfig(Obj.getTypename(node.data)!);\n return commentConfig ? Option.some(node) : Option.none();\n },\n connector: () =>\n Effect.succeed([\n AppNode.makeCompanion({\n id: linkedSegment('comments'),\n label: ['comments.label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n data: 'comments',\n position: 'first',\n }),\n ]),\n }),\n GraphBuilder.createExtension({\n id: 'commentToolbar',\n match: (node) => {\n if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {\n return Option.none();\n }\n const commentConfig = getCommentConfig(Obj.getTypename(node.data)!);\n return commentConfig ? Option.some(node) : Option.none();\n },\n actions: (matched, get) => {\n const object = matched.data;\n const objectUri = Obj.getURI(object);\n const stateAtom = capabilities.atom(ThreadCapabilities.State);\n const selectionManager = capabilities.get(AttentionCapabilities.Selection);\n const commentConfig = getCommentConfig(Obj.getTypename(object)!)!;\n\n const disabled = get(\n commentDisabledFamily({\n stateAtom,\n selectionManager,\n objectId: objectUri,\n commentsType: commentConfig.comments,\n selectionMode: commentConfig.selectionMode as SelectionMode | undefined,\n }),\n );\n\n return Effect.succeed([\n {\n id: 'comment',\n data: Effect.fnUntraced(function* () {\n const config = getCommentConfig(Obj.getTypename(object)!)!;\n const selection = selectionManager.getSelection(objectUri);\n const anchor =\n (config.comments === 'anchored' ? getAnchor(selection) : undefined) ?? Date.now().toString();\n const name = config.getAnchorLabel?.(object, anchor);\n yield* Operation.invoke(ThreadOperation.Create, {\n anchor,\n name,\n subject: object,\n });\n }),\n properties: {\n label: ['add-comment.label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'toolbar',\n disabled,\n testId: 'thread.comment.add',\n },\n },\n ]);\n },\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,YAAY;AACrB,YAAYC,YAAY;AACxB,YAAYC,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiBC,eAAe;AACzC,SAASC,iBAAiB;AAC1B,SAASC,WAAW;AACpB,SAASC,6BAA6B;AACtC,SAASC,cAAcC,mBAAmB;AAC1C,SAASC,qBAAqB;AAC9B,SAAoDC,wBAAwB;AAC5E,SAASC,eAAe;AAExB,SAASC,YAAY;AACrB,SAASC,uBAAuB;AAChC,SAASC,0BAA4C;AAgBrD,IAAMC,wBAAwBC,KAAKC,OACjC,CAAC,EAAEC,WAAWC,kBAAkBC,UAAUC,cAAcC,cAAa,MACnEN,KAAKO,KAAK,CAACC,QAAAA;AACT,QAAMC,aAAaD,IAAIN,SAAAA;AACvB,QAAMQ,QAAQD,WAAW,CAAA,IAAKD,IAAIC,WAAW,CAAA,CAAE,IAAIE;AACnD,QAAMC,UAAUF,OAAOE,WAAW,CAAC;AACnC,QAAMC,iBAAiBL,IAAIL,iBAAiBO,KAAK;AACjD,QAAMI,YACJD,eAAeE,WAAWX,QAAAA,MAAcE,gBAAgBU,iBAAiBV,aAAAA,IAAiBK;AAC5F,QAAMM,SAASC,UAAUJ,SAAAA;AACzB,QAAMK,mBAAmB,CAACF;AAC1B,QAAMG,qBAAqBR,QAAQR,QAAAA;AACnC,SAAQC,iBAAiB,cAAcc,oBAAqBC;AAC9D,CAAA,CAAA;AAIJ,IAAMC,wBAAwBC,YAAYC,QACxCD,YAAYE,uBACZF,YAAYG,QAAQH,YAAYI,oBAAoBC,QAAQA,OAAO,CAAA,CAAA;AAGrE,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,eAAe,OAAOH,WAAWI;AAEvC,QAAMC,mBAAmB,CAACC,aACxBH,aAAaI,OAAOC,gBAAgBC,aAAa,EAAEC,KAAK,CAAC,EAAEC,GAAE,MAAOA,OAAOL,QAAAA;AAE7E,QAAMM,aAAa,OAAcC,WAAI;IACnCC,aAAaC,gBAAgB;MAC3BJ,IAAI;MACJK,OAAO,CAACC,SAAAA;AACN,YAAI,CAACC,IAAIC,SAASF,KAAKG,IAAI,KAAYC,cAAO5B,sBAAsBwB,IAAAA,CAAAA,GAAQ;AAC1E,iBAAcK,YAAI;QACpB;AACA,cAAMC,gBAAgBlB,iBAAiBa,IAAIM,YAAYP,KAAKG,IAAI,CAAA;AAChE,eAAOG,gBAAuBE,YAAKR,IAAAA,IAAeK,YAAI;MACxD;MACAI,WAAW,MACFC,eAAQ;QACbC,QAAQC,cAAc;UACpBlB,IAAImB,cAAc,UAAA;UAClBC,OAAO;YAAC;YAAkB;cAAEC,IAAIC,KAAKtB;YAAG;;UACxCuB,MAAM;UACNd,MAAM;UACNe,UAAU;QACZ,CAAA;OACD;IACL,CAAA;IACArB,aAAaC,gBAAgB;MAC3BJ,IAAI;MACJK,OAAO,CAACC,SAAAA;AACN,YAAI,CAACC,IAAIC,SAASF,KAAKG,IAAI,KAAYC,cAAO5B,sBAAsBwB,IAAAA,CAAAA,GAAQ;AAC1E,iBAAcK,YAAI;QACpB;AACA,cAAMC,gBAAgBlB,iBAAiBa,IAAIM,YAAYP,KAAKG,IAAI,CAAA;AAChE,eAAOG,gBAAuBE,YAAKR,IAAAA,IAAeK,YAAI;MACxD;MACAc,SAAS,CAACC,SAASzD,QAAAA;AACjB,cAAM0D,SAASD,QAAQjB;AACvB,cAAMmB,YAAYrB,IAAIsB,OAAOF,MAAAA;AAC7B,cAAMhE,YAAY6B,aAAasC,KAAKC,mBAAmBC,KAAK;AAC5D,cAAMpE,mBAAmB4B,aAAavB,IAAIgE,sBAAsBC,SAAS;AACzE,cAAMtB,gBAAgBlB,iBAAiBa,IAAIM,YAAYc,MAAAA,CAAAA;AAEvD,cAAMQ,WAAWlE,IACfT,sBAAsB;UACpBG;UACAC;UACAC,UAAU+D;UACV9D,cAAc8C,cAAcwB;UAC5BrE,eAAe6C,cAAc7C;QAC/B,CAAA,CAAA;AAGF,eAAciD,eAAQ;UACpB;YACEhB,IAAI;YACJS,MAAalB,kBAAW,aAAA;AACtB,oBAAM8C,SAAS3C,iBAAiBa,IAAIM,YAAYc,MAAAA,CAAAA;AAChD,oBAAMpD,YAAYX,iBAAiB0E,aAAaV,SAAAA;AAChD,oBAAMlD,UACH2D,OAAOD,aAAa,aAAazD,UAAUJ,SAAAA,IAAaH,WAAcmE,KAAKC,IAAG,EAAGC,SAAQ;AAC5F,oBAAMC,OAAOL,OAAOM,iBAAiBhB,QAAQjD,MAAAA;AAC7C,qBAAOkE,UAAUC,OAAOC,gBAAgBC,QAAQ;gBAC9CrE;gBACAgE;gBACAM,SAASrB;cACX,CAAA;YACF,CAAA;YACAsB,YAAY;cACV7B,OAAO;gBAAC;gBAAqB;kBAAEC,IAAIC,KAAKtB;gBAAG;;cAC3CuB,MAAM;cACN2B,aAAa;cACbf;cACAgB,QAAQ;YACV;UACF;SACD;MACH;IACF,CAAA;GACD;AAED,SAAO9D,WAAW+D,YAAYvD,gBAAgBwD,iBAAiBpD,UAAAA;AACjE,CAAA,CAAA;",
6
+ "names": ["Atom", "Effect", "Option", "Capability", "AppCapabilities", "AppNode", "Operation", "Obj", "AttentionCapabilities", "GraphBuilder", "NodeMatcher", "linkedSegment", "defaultSelection", "Channel", "meta", "ThreadOperation", "ThreadCapabilities", "commentDisabledFamily", "Atom", "family", "stateAtom", "selectionManager", "objectId", "commentsType", "selectionMode", "make", "get", "stateAtoms", "state", "undefined", "toolbar", "selectionState", "selection", "selections", "defaultSelection", "anchor", "getAnchor", "invalidSelection", "overlappingComment", "whenCommentableObject", "NodeMatcher", "whenAll", "whenEchoObjectMatches", "whenNot", "whenEchoTypeMatches", "Channel", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "getCommentConfig", "typename", "getAll", "AppCapabilities", "CommentConfig", "find", "id", "extensions", "all", "GraphBuilder", "createExtension", "match", "node", "Obj", "isObject", "data", "isNone", "none", "commentConfig", "getTypename", "some", "connector", "succeed", "AppNode", "makeCompanion", "linkedSegment", "label", "ns", "meta", "icon", "position", "actions", "matched", "object", "objectUri", "getURI", "atom", "ThreadCapabilities", "State", "AttentionCapabilities", "Selection", "disabled", "comments", "config", "getSelection", "Date", "now", "toString", "name", "getAnchorLabel", "Operation", "invoke", "ThreadOperation", "Create", "subject", "properties", "disposition", "testId", "contributes", "AppGraphBuilder"]
7
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ ThreadOperation_exports
3
+ } from "./chunk-IQBZZAMX.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/append-channel-message.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Capability } from "@dxos/app-framework";
9
+ import { Operation } from "@dxos/compute";
10
+ import { Database, Feed, Obj } from "@dxos/echo";
11
+ import { createFeedServiceLayer } from "@dxos/echo-db";
12
+ import { invariant } from "@dxos/invariant";
13
+ import { ClientCapabilities } from "@dxos/plugin-client";
14
+ import { Message } from "@dxos/types";
15
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/operations/append-channel-message.ts";
16
+ var handler = ThreadOperation_exports.AppendChannelMessage.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ channel, sender, text }) {
17
+ const db = Obj.getDatabase(channel);
18
+ invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 15, S: this, A: ["db", "'Database not found'"] });
19
+ const client = yield* Capability.get(ClientCapabilities.Client);
20
+ const space = client.spaces.get(db.spaceId);
21
+ invariant(space, "Space not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 18, S: this, A: ["space", "'Space not found'"] });
22
+ const feed = yield* Database.load(channel.feed);
23
+ const message = Message.make({
24
+ sender,
25
+ blocks: [
26
+ {
27
+ _tag: "text",
28
+ text
29
+ }
30
+ ]
31
+ });
32
+ yield* Feed.append(feed, [
33
+ message
34
+ ]).pipe(Effect.provide(createFeedServiceLayer(space.queues)));
35
+ })));
36
+ var append_channel_message_default = handler;
37
+ export {
38
+ append_channel_message_default as default
39
+ };
40
+ //# sourceMappingURL=append-channel-message-TBBQUVMH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/append-channel-message.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Database, Feed, Obj } from '@dxos/echo';\nimport { createFeedServiceLayer } from '@dxos/echo-db';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { Message } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.AppendChannelMessage> =\n ThreadOperation.AppendChannelMessage.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ channel, sender, text }) {\n const db = Obj.getDatabase(channel);\n invariant(db, 'Database not found');\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found');\n\n const feed = yield* Database.load(channel.feed);\n const message = Message.make({\n sender,\n blocks: [{ _tag: 'text', text }],\n });\n yield* Feed.append(feed, [message]).pipe(Effect.provide(createFeedServiceLayer(space.queues)));\n }),\n ),\n );\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,MAAMC,WAAW;AACpC,SAASC,8BAA8B;AACvC,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,eAAe;AAIxB,IAAA,eACEC;IAIMC,UAAUC,wBAAI,qBAAA,KAAA,UAAA,YAAA,kBAAA,WAAA,EAAA,SAAA,QAAA,KAAA,GAAA;AACd,QAAMC,KAAAA,IAAS,YAAOC,OAAWC;AACjC,YAAMC,IAAQH,sBAAqBI,EAAAA,YAAO,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;AAC1CN,QAAAA,SAAUK,OAAO,WAAA,IAAA,mBAAA,MAAA;AAEjB,QAAME,QAAO,OAAOC,OAAAA,IAASC,GAAKC,OAAQH;AAC1C,YAAMI,OAAUC,mBAAa,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,SAAA,mBAAA,EAAA,CAAA;QAC3BC,OAAAA,OAAAA,SAAAA,KAAAA,QAAAA,IAAAA;QACAC,UAAQ,QAAA,KAAA;;YAAGC;;QAAmB,MAAA;QAAE;MAClC;IACA;;SAAwC,KAACC,OAAOC,MAAQC;IAC1D;EAIN,CAAA,EAAA,KAAeC,eAAQ,uBAAA,MAAA,MAAA,CAAA,CAAA;;;",
6
+ "names": ["Effect", "Capability", "Operation", "Database", "Feed", "Obj", "createFeedServiceLayer", "invariant", "ClientCapabilities", "Message", "ThreadOperation", "invariant", "db", "client", "Capability", "get", "space", "spaceId", "feed", "Database", "load", "channel", "message", "Message", "sender", "blocks", "_tag", "Effect", "provide", "createFeedServiceLayer", "handler"]
7
+ }
@@ -0,0 +1,15 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/blueprint-definition.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { Capability } from "@dxos/app-framework";
6
+ import { AppCapabilities } from "@dxos/app-toolkit";
7
+ import { ThreadBlueprint } from "#blueprints";
8
+ var blueprintDefinition = Capability.makeModule(() => Effect.succeed([
9
+ Capability.contributes(AppCapabilities.BlueprintDefinition, ThreadBlueprint)
10
+ ]));
11
+ var blueprint_definition_default = blueprintDefinition;
12
+ export {
13
+ blueprint_definition_default as default
14
+ };
15
+ //# sourceMappingURL=blueprint-definition-S3EBOH4R.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/blueprint-definition.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { Blueprint } from '@dxos/compute';\n\nimport { ThreadBlueprint } from '#blueprints';\n\nconst blueprintDefinition = Capability.makeModule<\n [],\n Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[]\n>(() => Effect.succeed([Capability.contributes(AppCapabilities.BlueprintDefinition, ThreadBlueprint)]));\n\nexport default blueprintDefinition;\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAIhC,SAASC,uBAAuB;AAEhC,IAAMC,sBAAsBH,WAAWI,WAGrC,MAAaC,eAAQ;EAACL,WAAWM,YAAYL,gBAAgBM,qBAAqBL,eAAAA;CAAiB,CAAA;AAErG,IAAA,+BAAeC;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "ThreadBlueprint", "blueprintDefinition", "makeModule", "succeed", "contributes", "BlueprintDefinition"]
7
+ }
@@ -0,0 +1,8 @@
1
+ import {
2
+ thread_blueprint_default
3
+ } from "../chunk-5T5LPLBN.mjs";
4
+ import "../chunk-J5LGTIGS.mjs";
5
+ export {
6
+ thread_blueprint_default as ThreadBlueprint
7
+ };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,27 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/index.ts
4
+ import { Capability } from "@dxos/app-framework";
5
+ var AgentRunner = Capability.lazy("AgentRunner", () => import("../agent-runner-RB7N5HLD.mjs"));
6
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-PDLRFYSI.mjs"));
7
+ var BlueprintDefinition = Capability.lazy("BlueprintDefinition", () => import("../blueprint-definition-S3EBOH4R.mjs"));
8
+ var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-D5XEG7MQ.mjs"));
9
+ var Markdown = Capability.lazy("Markdown", () => import("../markdown-5UHAAC5Z.mjs"));
10
+ var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-RU6K2S4L.mjs"));
11
+ var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-TUMXARMI.mjs"));
12
+ var ThreadSettings = Capability.lazy("ThreadSettings", () => import("../settings-HK4EB6TF.mjs"));
13
+ var ThreadState = Capability.lazy("ThreadState", () => import("../state-UU7VEAKV.mjs"));
14
+ var UndoMappings = Capability.lazy("UndoMappings", () => import("../undo-mappings-HOKL2L3M.mjs"));
15
+ export {
16
+ AgentRunner,
17
+ AppGraphBuilder,
18
+ BlueprintDefinition,
19
+ CreateObject,
20
+ Markdown,
21
+ OperationHandler,
22
+ ReactSurface,
23
+ ThreadSettings,
24
+ ThreadState,
25
+ UndoMappings
26
+ };
27
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/capabilities/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { Blueprint, OperationHandlerSet } from '@dxos/compute';\n\nexport const AgentRunner = Capability.lazy('AgentRunner', () => import('./agent-runner'));\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\nexport const BlueprintDefinition = Capability.lazy('BlueprintDefinition', () => import('./blueprint-definition'));\nexport const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));\nexport const Markdown = Capability.lazy('Markdown', () => import('./markdown'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\nexport const ThreadSettings = Capability.lazy('ThreadSettings', () => import('./settings'));\nexport const ThreadState = Capability.lazy('ThreadState', () => import('./state'));\nexport const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));\n"],
5
+ "mappings": ";;;AAIA,SAASA,kBAAkB;AAIpB,IAAMC,cAAcD,WAAWE,KAAK,eAAe,MAAM,OAAO,8BAAA,CAAA;AAChE,IAAMC,kBAAkBH,WAAWE,KAAK,mBAAmB,MAAM,OAAO,mCAAA,CAAA;AACxE,IAAME,sBAAsBJ,WAAWE,KAAK,uBAAuB,MAAM,OAAO,sCAAA,CAAA;AAChF,IAAMG,eAAeL,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMI,WAAWN,WAAWE,KAAK,YAAY,MAAM,OAAO,0BAAA,CAAA;AAC1D,IAAMK,mBAAmBP,WAAWE,KACzC,oBACA,MAAM,OAAO,mCAAA,CAAA;AAER,IAAMM,eAAeR,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMO,iBAAiBT,WAAWE,KAAK,kBAAkB,MAAM,OAAO,0BAAA,CAAA;AACtE,IAAMQ,cAAcV,WAAWE,KAAK,eAAe,MAAM,OAAO,uBAAA,CAAA;AAChE,IAAMS,eAAeX,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;",
6
+ "names": ["Capability", "AgentRunner", "lazy", "AppGraphBuilder", "BlueprintDefinition", "CreateObject", "Markdown", "OperationHandler", "ReactSurface", "ThreadSettings", "ThreadState", "UndoMappings"]
7
+ }
@@ -0,0 +1,48 @@
1
+ // src/meta.ts
2
+ import { Plugin } from "@dxos/app-framework";
3
+ import { DXN } from "@dxos/keys";
4
+ import { trim } from "@dxos/util";
5
+ var meta = Plugin.makeMeta({
6
+ key: DXN.make("org.dxos.plugin.thread"),
7
+ name: "Threads",
8
+ author: "DXOS",
9
+ description: trim`
10
+ ThreadPlugin renders comment threads anchored to ECHO objects and provides a
11
+ persistent chat channel attached to every workspace. Threads can be created
12
+ inline on any Markdown document, letting collaborators leave contextual
13
+ comments and hold focused discussions without leaving the document surface.
14
+
15
+ Each thread carries an optional AI agent configuration that controls how the
16
+ built-in assistant participates in the conversation. Threads can be set to
17
+ off, mention-only (the agent responds only when @-mentioned by name), or
18
+ auto mode (the agent replies to every new user message). The agent identity —
19
+ display name, DID, and avatar — is resolved at runtime from a pluggable
20
+ Effect capability so host applications can substitute their own assistant
21
+ persona.
22
+
23
+ When the agent is enabled, it executes one LLM turn per trigger via the
24
+ AgentRunner capability. The runner has access to edit tools that can splice
25
+ a replacement range into the anchored document span or replace the entire
26
+ document content, so the assistant can propose inline edits in addition to
27
+ posting chat replies. A self-loop guard prevents the agent from responding
28
+ to its own messages, and resolved threads are excluded from triggering.
29
+
30
+ The toggle UI appears as a per-thread icon button in the CommentsPanel
31
+ header. Clicking it opens a popover with three radio options (off / mention /
32
+ auto) and a read-only label showing the active agent name. All state changes
33
+ go through the SetAgentConfig operation rather than direct schema writes,
34
+ keeping mutation logic in one place and making the feature testable with
35
+ stub runners in storybook.
36
+ `,
37
+ icon: "ph--video-conference--regular",
38
+ iconHue: "rose",
39
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread",
40
+ spec: "PLUGIN.mdl"
41
+ });
42
+ var THREAD_ITEM = `${meta.id}.item`;
43
+
44
+ export {
45
+ meta,
46
+ THREAD_ITEM
47
+ };
48
+ //# sourceMappingURL=chunk-35GUWXBB.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { DXN } from '@dxos/keys';\nimport { trim } from '@dxos/util';\n\nexport const meta = Plugin.makeMeta({\n key: DXN.make('org.dxos.plugin.thread'),\n name: 'Threads',\n author: 'DXOS',\n description: trim`\n ThreadPlugin renders comment threads anchored to ECHO objects and provides a\n persistent chat channel attached to every workspace. Threads can be created\n inline on any Markdown document, letting collaborators leave contextual\n comments and hold focused discussions without leaving the document surface.\n\n Each thread carries an optional AI agent configuration that controls how the\n built-in assistant participates in the conversation. Threads can be set to\n off, mention-only (the agent responds only when @-mentioned by name), or\n auto mode (the agent replies to every new user message). The agent identity —\n display name, DID, and avatar — is resolved at runtime from a pluggable\n Effect capability so host applications can substitute their own assistant\n persona.\n\n When the agent is enabled, it executes one LLM turn per trigger via the\n AgentRunner capability. The runner has access to edit tools that can splice\n a replacement range into the anchored document span or replace the entire\n document content, so the assistant can propose inline edits in addition to\n posting chat replies. A self-loop guard prevents the agent from responding\n to its own messages, and resolved threads are excluded from triggering.\n\n The toggle UI appears as a per-thread icon button in the CommentsPanel\n header. Clicking it opens a popover with three radio options (off / mention /\n auto) and a read-only label showing the active agent name. All state changes\n go through the SetAgentConfig operation rather than direct schema writes,\n keeping mutation logic in one place and making the feature testable with\n stub runners in storybook.\n `,\n icon: 'ph--video-conference--regular',\n iconHue: 'rose',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread',\n spec: 'PLUGIN.mdl',\n});\n\nexport const THREAD_ITEM = `${meta.id}.item`;\n"],
5
+ "mappings": ";AAIA,SAASA,cAAc;AACvB,SAASC,WAAW;AACpB,SAASC,YAAY;AAEd,IAAMC,OAAOH,OAAOI,SAAS;EAClCC,KAAKJ,IAAIK,KAAK,wBAAA;EACdC,MAAM;EACNC,QAAQ;EACRC,aAAaP;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BbQ,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;AACR,CAAA;AAEO,IAAMC,cAAc,GAAGX,KAAKY,EAAE;",
6
+ "names": ["Plugin", "DXN", "trim", "meta", "makeMeta", "key", "make", "name", "author", "description", "icon", "iconHue", "source", "spec", "THREAD_ITEM", "id"]
7
+ }