@dxos/plugin-thread 0.7.4 → 0.7.5-labs.401163d

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 (200) hide show
  1. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs +19 -0
  2. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-builder-IANFWFYN.mjs +121 -0
  4. package/dist/lib/browser/app-graph-builder-IANFWFYN.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-ENERBDYI.mjs → chunk-636QDHE3.mjs} +3 -3
  6. package/dist/lib/browser/chunk-636QDHE3.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-BNEWNQBO.mjs +71 -0
  8. package/dist/lib/browser/chunk-BNEWNQBO.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-CQ3NH4RJ.mjs +18 -0
  10. package/dist/lib/browser/chunk-CQ3NH4RJ.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-NAO3LZMZ.mjs +16 -0
  12. package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-NO5AZLUZ.mjs +81 -0
  14. package/dist/lib/browser/chunk-NO5AZLUZ.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-52HWDLBR.mjs → chunk-UPKU23DA.mjs} +39 -137
  16. package/dist/lib/browser/chunk-UPKU23DA.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +147 -1094
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/intent-resolver-QFP6L3AF.mjs +287 -0
  20. package/dist/lib/browser/intent-resolver-QFP6L3AF.mjs.map +7 -0
  21. package/dist/lib/browser/markdown-2NBXKXCY.mjs +112 -0
  22. package/dist/lib/browser/markdown-2NBXKXCY.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/react-surface-YDKOPRQP.mjs +424 -0
  25. package/dist/lib/browser/react-surface-YDKOPRQP.mjs.map +7 -0
  26. package/dist/lib/browser/settings-TKOPRXSU.mjs +22 -0
  27. package/dist/lib/browser/settings-TKOPRXSU.mjs.map +7 -0
  28. package/dist/lib/browser/state-GNFUURIC.mjs +33 -0
  29. package/dist/lib/browser/state-GNFUURIC.mjs.map +7 -0
  30. package/dist/lib/browser/types.mjs +6 -4
  31. package/dist/lib/node/{ThreadArticle-I7ADXDW3.cjs → ThreadContainer-LTKKLPXX.cjs} +14 -13
  32. package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs.map +7 -0
  33. package/dist/lib/node/app-graph-builder-LFEDPJLK.cjs +135 -0
  34. package/dist/lib/node/app-graph-builder-LFEDPJLK.cjs.map +7 -0
  35. package/dist/lib/node/chunk-AUVKOX5Q.cjs +101 -0
  36. package/dist/lib/node/chunk-AUVKOX5Q.cjs.map +7 -0
  37. package/dist/lib/node/chunk-AWSTZ2KN.cjs +93 -0
  38. package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-IC2NICNC.cjs → chunk-F735VMTN.cjs} +7 -7
  40. package/dist/lib/node/chunk-F735VMTN.cjs.map +7 -0
  41. package/dist/lib/node/{meta.cjs → chunk-FPWNZ6TB.cjs} +13 -10
  42. package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-YCDM2SZM.cjs → chunk-RQR5Z23G.cjs} +79 -179
  44. package/dist/lib/node/chunk-RQR5Z23G.cjs.map +7 -0
  45. package/dist/lib/node/{ThreadMain-MRNJC3TI.cjs → chunk-ZJTWNCFQ.cjs} +26 -23
  46. package/dist/lib/node/chunk-ZJTWNCFQ.cjs.map +7 -0
  47. package/dist/lib/node/index.cjs +142 -1083
  48. package/dist/lib/node/index.cjs.map +4 -4
  49. package/dist/lib/node/intent-resolver-ZSOQILPJ.cjs +299 -0
  50. package/dist/lib/node/intent-resolver-ZSOQILPJ.cjs.map +7 -0
  51. package/dist/lib/node/markdown-FWRKMSKV.cjs +122 -0
  52. package/dist/lib/node/markdown-FWRKMSKV.cjs.map +7 -0
  53. package/dist/lib/node/meta.json +1 -1
  54. package/dist/lib/node/react-surface-AX644GMQ.cjs +426 -0
  55. package/dist/lib/node/react-surface-AX644GMQ.cjs.map +7 -0
  56. package/dist/lib/node/settings-TH4YSUVU.cjs +36 -0
  57. package/dist/lib/node/settings-TH4YSUVU.cjs.map +7 -0
  58. package/dist/lib/node/state-TQWEZ6B3.cjs +49 -0
  59. package/dist/lib/node/state-TQWEZ6B3.cjs.map +7 -0
  60. package/dist/lib/node/types.cjs +6 -4
  61. package/dist/lib/node/types.cjs.map +2 -2
  62. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs +20 -0
  63. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs.map +7 -0
  64. package/dist/lib/node-esm/app-graph-builder-IXHFRMCY.mjs +122 -0
  65. package/dist/lib/node-esm/app-graph-builder-IXHFRMCY.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-4PZTMSVF.mjs +20 -0
  67. package/dist/lib/node-esm/chunk-4PZTMSVF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-B3CF35MY.mjs +82 -0
  69. package/dist/lib/node-esm/chunk-B3CF35MY.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-JG7MXH6O.mjs → chunk-CISLDOH7.mjs} +39 -137
  71. package/dist/lib/node-esm/chunk-CISLDOH7.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-7QRGG25F.mjs → chunk-FXUATCLW.mjs} +3 -3
  73. package/dist/lib/node-esm/chunk-FXUATCLW.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs +73 -0
  75. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs +17 -0
  77. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs.map +7 -0
  78. package/dist/lib/node-esm/index.mjs +147 -1094
  79. package/dist/lib/node-esm/index.mjs.map +4 -4
  80. package/dist/lib/node-esm/intent-resolver-MHP4C2NZ.mjs +288 -0
  81. package/dist/lib/node-esm/intent-resolver-MHP4C2NZ.mjs.map +7 -0
  82. package/dist/lib/node-esm/markdown-6AQFDAW3.mjs +113 -0
  83. package/dist/lib/node-esm/markdown-6AQFDAW3.mjs.map +7 -0
  84. package/dist/lib/node-esm/meta.json +1 -1
  85. package/dist/lib/node-esm/react-surface-74X2TKEZ.mjs +425 -0
  86. package/dist/lib/node-esm/react-surface-74X2TKEZ.mjs.map +7 -0
  87. package/dist/lib/node-esm/settings-KEDRR7RM.mjs +23 -0
  88. package/dist/lib/node-esm/settings-KEDRR7RM.mjs.map +7 -0
  89. package/dist/lib/node-esm/state-7MLR27YG.mjs +34 -0
  90. package/dist/lib/node-esm/state-7MLR27YG.mjs.map +7 -0
  91. package/dist/lib/node-esm/types.mjs +6 -4
  92. package/dist/types/src/ThreadPlugin.d.ts +1 -3
  93. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
  95. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/capabilities.d.ts +15 -0
  97. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/index.d.ts +187 -0
  99. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  101. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/markdown.d.ts +4 -0
  103. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  105. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/settings.d.ts +4 -0
  107. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/state.d.ts +7 -0
  109. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  110. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  112. package/dist/types/src/components/CommentContainer.d.ts +1 -1
  113. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  114. package/dist/types/src/components/CommentsContainer.d.ts +2 -7
  115. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  116. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  117. package/dist/types/src/components/ThreadComplementary.d.ts +1 -6
  118. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  119. package/dist/types/src/components/ThreadContainer.d.ts +7 -0
  120. package/dist/types/src/components/ThreadContainer.d.ts.map +1 -0
  121. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  122. package/dist/types/src/components/index.d.ts +3 -15
  123. package/dist/types/src/components/index.d.ts.map +1 -1
  124. package/dist/types/src/components/testing.d.ts +50 -66
  125. package/dist/types/src/components/testing.d.ts.map +1 -1
  126. package/dist/types/src/components/types.d.ts +5 -5
  127. package/dist/types/src/components/types.d.ts.map +1 -1
  128. package/dist/types/src/extensions/threads.d.ts +2 -2
  129. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  130. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  131. package/dist/types/src/index.d.ts +1 -3
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/meta.d.ts +1 -2
  134. package/dist/types/src/meta.d.ts.map +1 -1
  135. package/dist/types/src/translations.d.ts +3 -0
  136. package/dist/types/src/translations.d.ts.map +1 -1
  137. package/dist/types/src/types.d.ts +86 -22
  138. package/dist/types/src/types.d.ts.map +1 -1
  139. package/dist/types/tsconfig.tsbuildinfo +1 -0
  140. package/package.json +29 -38
  141. package/src/ThreadPlugin.tsx +108 -620
  142. package/src/capabilities/app-graph-builder.ts +119 -0
  143. package/src/capabilities/capabilities.ts +19 -0
  144. package/src/capabilities/index.ts +14 -0
  145. package/src/capabilities/intent-resolver.ts +239 -0
  146. package/src/capabilities/markdown.ts +18 -0
  147. package/src/capabilities/react-surface.tsx +62 -0
  148. package/src/capabilities/settings.ts +14 -0
  149. package/src/capabilities/state.ts +25 -0
  150. package/src/components/Chat.stories.tsx +23 -23
  151. package/src/components/ChatContainer.tsx +12 -10
  152. package/src/components/CommentContainer.tsx +22 -33
  153. package/src/components/CommentsContainer.tsx +1 -17
  154. package/src/components/MessageContainer.tsx +12 -23
  155. package/src/components/ThreadComplementary.tsx +92 -69
  156. package/src/components/ThreadContainer.tsx +22 -0
  157. package/src/components/ThreadSettings.tsx +3 -3
  158. package/src/components/command-extension.ts +2 -5
  159. package/src/components/index.ts +1 -2
  160. package/src/components/testing.ts +26 -22
  161. package/src/components/types.ts +5 -5
  162. package/src/extensions/threads.ts +16 -25
  163. package/src/hooks/analytics.ts +6 -10
  164. package/src/index.ts +1 -5
  165. package/src/meta.ts +1 -1
  166. package/src/translations.ts +1 -0
  167. package/src/types.ts +70 -38
  168. package/dist/lib/browser/ThreadArticle-6IXTL7CH.mjs +0 -18
  169. package/dist/lib/browser/ThreadArticle-6IXTL7CH.mjs.map +0 -7
  170. package/dist/lib/browser/ThreadMain-4IAS67KE.mjs +0 -26
  171. package/dist/lib/browser/ThreadMain-4IAS67KE.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-52HWDLBR.mjs.map +0 -7
  173. package/dist/lib/browser/chunk-ENERBDYI.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-XUHNZID5.mjs +0 -20
  175. package/dist/lib/browser/chunk-XUHNZID5.mjs.map +0 -7
  176. package/dist/lib/browser/meta.mjs +0 -11
  177. package/dist/lib/browser/meta.mjs.map +0 -7
  178. package/dist/lib/node/ThreadArticle-I7ADXDW3.cjs.map +0 -7
  179. package/dist/lib/node/ThreadMain-MRNJC3TI.cjs.map +0 -7
  180. package/dist/lib/node/chunk-IC2NICNC.cjs.map +0 -7
  181. package/dist/lib/node/chunk-XFO6D2LG.cjs +0 -39
  182. package/dist/lib/node/chunk-XFO6D2LG.cjs.map +0 -7
  183. package/dist/lib/node/chunk-YCDM2SZM.cjs.map +0 -7
  184. package/dist/lib/node/meta.cjs.map +0 -7
  185. package/dist/lib/node-esm/ThreadArticle-CJHYMF2W.mjs +0 -19
  186. package/dist/lib/node-esm/ThreadArticle-CJHYMF2W.mjs.map +0 -7
  187. package/dist/lib/node-esm/ThreadMain-VISGW4IF.mjs +0 -27
  188. package/dist/lib/node-esm/ThreadMain-VISGW4IF.mjs.map +0 -7
  189. package/dist/lib/node-esm/chunk-7QRGG25F.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-I5MU54RT.mjs +0 -21
  191. package/dist/lib/node-esm/chunk-I5MU54RT.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-JG7MXH6O.mjs.map +0 -7
  193. package/dist/lib/node-esm/meta.mjs +0 -12
  194. package/dist/lib/node-esm/meta.mjs.map +0 -7
  195. package/dist/types/src/components/ThreadArticle.d.ts +0 -5
  196. package/dist/types/src/components/ThreadArticle.d.ts.map +0 -1
  197. package/dist/types/src/components/ThreadMain.d.ts +0 -7
  198. package/dist/types/src/components/ThreadMain.d.ts.map +0 -1
  199. package/src/components/ThreadArticle.tsx +0 -18
  200. package/src/components/ThreadMain.tsx +0 -27
@@ -0,0 +1,20 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ ChatContainer
4
+ } from "./chunk-CISLDOH7.mjs";
5
+ import "./chunk-HLWJTUWZ.mjs";
6
+ import "./chunk-FXUATCLW.mjs";
7
+
8
+ // packages/plugins/plugin-thread/src/components/ThreadContainer.tsx
9
+ import React from "react";
10
+ import { StackItem } from "@dxos/react-ui-stack";
11
+ var ThreadContainer = ({ role, ...props }) => {
12
+ return /* @__PURE__ */ React.createElement(StackItem.Content, {
13
+ toolbar: false
14
+ }, /* @__PURE__ */ React.createElement(ChatContainer, props));
15
+ };
16
+ var ThreadContainer_default = ThreadContainer;
17
+ export {
18
+ ThreadContainer_default as default
19
+ };
20
+ //# sourceMappingURL=ThreadContainer-SV74JFRH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ThreadContainer.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ComponentProps } from 'react';\n\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { ChatContainer } from './ChatContainer';\n\nconst ThreadContainer = ({\n role,\n ...props\n}: Pick<ComponentProps<typeof ChatContainer>, 'thread' | 'context'> & { role: string }) => {\n return (\n <StackItem.Content toolbar={false}>\n <ChatContainer {...props} />\n </StackItem.Content>\n );\n};\n\nexport default ThreadContainer;\n"],
5
+ "mappings": ";;;;;;;;AAIA,OAAOA,WAAoC;AAE3C,SAASC,iBAAiB;AAI1B,IAAMC,kBAAkB,CAAC,EACvBC,MACA,GAAGC,MAAAA,MACiF;AACpF,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,SAAS;KAC1B,sBAAA,cAACC,eAAkBJ,KAAAA,CAAAA;AAGzB;AAEA,IAAA,0BAAeF;",
6
+ "names": ["React", "StackItem", "ThreadContainer", "role", "props", "StackItem", "Content", "toolbar", "ChatContainer"]
7
+ }
@@ -0,0 +1,122 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ ThreadCapabilities
4
+ } from "./chunk-ZJITX3TO.mjs";
5
+ import {
6
+ THREAD_PLUGIN
7
+ } from "./chunk-FXUATCLW.mjs";
8
+
9
+ // packages/plugins/plugin-thread/src/capabilities/app-graph-builder.ts
10
+ import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
11
+ import { ClientCapabilities } from "@dxos/plugin-client";
12
+ import { createExtension, toSignal } from "@dxos/plugin-graph";
13
+ import { ObservabilityAction } from "@dxos/plugin-observability/types";
14
+ import { memoizeQuery } from "@dxos/plugin-space";
15
+ import { getTypename, parseId, SpaceState } from "@dxos/react-client/echo";
16
+ var type = "orphan-comments-for-subject";
17
+ var icon = "ph--chat-text--regular";
18
+ var app_graph_builder_default = (context) => {
19
+ const resolver = (typename) => context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
20
+ return contributes(Capabilities.AppGraphBuilder, createExtension({
21
+ id: `${THREAD_PLUGIN}/comments-for-subject`,
22
+ resolver: ({ id }) => {
23
+ if (!id.endsWith("~comments")) {
24
+ return;
25
+ }
26
+ const client = context.requestCapability(ClientCapabilities.Client);
27
+ const [subjectId] = id.split("~");
28
+ const { spaceId, objectId } = parseId(subjectId);
29
+ const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
30
+ const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
31
+ if (!objectId) {
32
+ return {
33
+ id,
34
+ type,
35
+ data: null,
36
+ properties: {
37
+ icon,
38
+ label: [
39
+ "unnamed object threads label",
40
+ {
41
+ ns: THREAD_PLUGIN
42
+ }
43
+ ],
44
+ showResolvedThreads: false,
45
+ object: null,
46
+ space
47
+ }
48
+ };
49
+ }
50
+ const [object] = memoizeQuery(space, {
51
+ id: objectId
52
+ });
53
+ if (!object || !subjectId) {
54
+ return;
55
+ }
56
+ const meta = resolver(getTypename(object) ?? "");
57
+ const label = meta.label?.(object) || object.name || meta.placeholder || [
58
+ "unnamed object threads label",
59
+ {
60
+ ns: THREAD_PLUGIN
61
+ }
62
+ ];
63
+ const { getViewState } = context.requestCapability(ThreadCapabilities.State);
64
+ const viewState = getViewState(subjectId);
65
+ return {
66
+ id,
67
+ type,
68
+ data: null,
69
+ properties: {
70
+ icon,
71
+ label,
72
+ showResolvedThreads: viewState.showResolvedThreads,
73
+ object
74
+ }
75
+ };
76
+ },
77
+ actions: ({ node }) => {
78
+ const dataId = node.id.split("~").at(0);
79
+ if (!node.id.endsWith("~comments") || !dataId) {
80
+ return;
81
+ }
82
+ const [spaceId, objectId] = dataId.split(":");
83
+ const { getViewState } = context.requestCapability(ThreadCapabilities.State);
84
+ const viewState = getViewState(dataId);
85
+ const toggle = async () => {
86
+ const newToggleState = !viewState.showResolvedThreads;
87
+ viewState.showResolvedThreads = newToggleState;
88
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
89
+ await dispatch(createIntent(ObservabilityAction.SendEvent, {
90
+ name: "threads.toggle-show-resolved",
91
+ properties: {
92
+ spaceId,
93
+ threadId: objectId,
94
+ showResolved: newToggleState
95
+ }
96
+ }));
97
+ };
98
+ return [
99
+ {
100
+ id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,
101
+ data: toggle,
102
+ properties: {
103
+ label: [
104
+ "toggle show resolved",
105
+ {
106
+ ns: THREAD_PLUGIN
107
+ }
108
+ ],
109
+ menuItemType: "toggle",
110
+ isChecked: viewState.showResolvedThreads,
111
+ testId: "threadPlugin.toggleShowResolved",
112
+ icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
113
+ }
114
+ }
115
+ ];
116
+ }
117
+ }));
118
+ };
119
+ export {
120
+ app_graph_builder_default as default
121
+ };
122
+ //# sourceMappingURL=app-graph-builder-IXHFRMCY.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 { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, toSignal } from '@dxos/plugin-graph';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { getTypename, parseId, SpaceState } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { THREAD_PLUGIN } from '../meta';\n\nconst type = 'orphan-comments-for-subject';\nconst icon = 'ph--chat-text--regular';\n\nexport default (context: PluginsContext) => {\n const resolver = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label: ['unnamed object threads label', { ns: THREAD_PLUGIN }],\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolver(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(subjectId);\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n object,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(dataId);\n const toggle = async () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n }),\n );\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n icon: viewState.showResolvedThreads ? 'ph--eye-slash--regular' : 'ph--eye--regular',\n },\n },\n ];\n },\n }),\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "createIntent", "ClientCapabilities", "createExtension", "toSignal", "ObservabilityAction", "memoizeQuery", "getTypename", "parseId", "SpaceState", "type", "icon", "context", "resolver", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "endsWith", "client", "requestCapability", "ClientCapabilities", "Client", "subjectId", "split", "spaceId", "objectId", "parseId", "spaces", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "space", "state", "SpaceState", "SPACE_READY", "data", "properties", "label", "ns", "showResolvedThreads", "object", "memoizeQuery", "meta", "getTypename", "name", "placeholder", "getViewState", "ThreadCapabilities", "State", "viewState", "actions", "node", "dataId", "at", "toggle", "newToggleState", "dispatchPromise", "dispatch", "IntentDispatcher", "createIntent", "ObservabilityAction", "SendEvent", "threadId", "showResolved", "menuItemType", "isChecked", "testId"]
7
+ }
@@ -0,0 +1,20 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/plugin-thread/src/capabilities/index.ts
4
+ import { lazy } from "@dxos/app-framework";
5
+ var AppGraphBuilder = lazy(() => import("./app-graph-builder-IXHFRMCY.mjs"));
6
+ var IntentResolver = lazy(() => import("./intent-resolver-MHP4C2NZ.mjs"));
7
+ var Markdown = lazy(() => import("./markdown-6AQFDAW3.mjs"));
8
+ var ReactSurface = lazy(() => import("./react-surface-74X2TKEZ.mjs"));
9
+ var ThreadSettings = lazy(() => import("./settings-KEDRR7RM.mjs"));
10
+ var ThreadState = lazy(() => import("./state-7MLR27YG.mjs"));
11
+
12
+ export {
13
+ AppGraphBuilder,
14
+ IntentResolver,
15
+ Markdown,
16
+ ReactSurface,
17
+ ThreadSettings,
18
+ ThreadState
19
+ };
20
+ //# sourceMappingURL=chunk-4PZTMSVF.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 { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const Markdown = lazy(() => import('./markdown'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const ThreadSettings = lazy(() => import('./settings'));\nexport const ThreadState = lazy(() => import('./state'));\n\nexport * from './capabilities';\n"],
5
+ "mappings": ";;;AAIA,SAASA,YAAY;AAEd,IAAMC,kBAAkBC,KAAK,MAAM,OAAO,kCAAA,CAAA;AAC1C,IAAMC,iBAAiBD,KAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAME,WAAWF,KAAK,MAAM,OAAO,yBAAA,CAAA;AACnC,IAAMG,eAAeH,KAAK,MAAM,OAAO,8BAAA,CAAA;AACvC,IAAMI,iBAAiBJ,KAAK,MAAM,OAAO,yBAAA,CAAA;AACzC,IAAMK,cAAcL,KAAK,MAAM,OAAO,sBAAA,CAAA;",
6
+ "names": ["lazy", "AppGraphBuilder", "lazy", "IntentResolver", "Markdown", "ReactSurface", "ThreadSettings", "ThreadState"]
7
+ }
@@ -0,0 +1,82 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ THREAD_PLUGIN
4
+ } from "./chunk-FXUATCLW.mjs";
5
+
6
+ // packages/plugins/plugin-thread/src/types.ts
7
+ import { S } from "@dxos/echo-schema";
8
+ import { ChannelType, MessageType, ThreadType } from "@dxos/plugin-space/types";
9
+ import { EchoObjectSchema } from "@dxos/react-client/echo";
10
+ var ThreadAction;
11
+ (function(ThreadAction2) {
12
+ const THREAD_ACTION = `${THREAD_PLUGIN}/action`;
13
+ class Create extends S.TaggedClass()(`${THREAD_ACTION}/create`, {
14
+ input: S.Struct({
15
+ name: S.optional(S.String),
16
+ cursor: S.optional(S.String),
17
+ subject: S.optional(EchoObjectSchema)
18
+ }),
19
+ output: S.Struct({
20
+ object: S.Union(ChannelType, ThreadType)
21
+ })
22
+ }) {
23
+ }
24
+ ThreadAction2.Create = Create;
25
+ class Select extends S.TaggedClass()(`${THREAD_ACTION}/select`, {
26
+ input: S.Struct({
27
+ current: S.String,
28
+ skipOpen: S.optional(S.Boolean)
29
+ }),
30
+ output: S.Void
31
+ }) {
32
+ }
33
+ ThreadAction2.Select = Select;
34
+ class ToggleResolved extends S.TaggedClass()(`${THREAD_ACTION}/toggle-resolved`, {
35
+ input: S.Struct({
36
+ thread: ThreadType
37
+ }),
38
+ output: S.Void
39
+ }) {
40
+ }
41
+ ThreadAction2.ToggleResolved = ToggleResolved;
42
+ class Delete extends S.TaggedClass()(`${THREAD_ACTION}/delete`, {
43
+ input: S.Struct({
44
+ thread: ThreadType,
45
+ subject: EchoObjectSchema,
46
+ cursor: S.optional(S.String)
47
+ }),
48
+ output: S.Void
49
+ }) {
50
+ }
51
+ ThreadAction2.Delete = Delete;
52
+ class OnMessageAdd extends S.TaggedClass()(`${THREAD_ACTION}/on-message-add`, {
53
+ input: S.Struct({
54
+ thread: ThreadType,
55
+ subject: EchoObjectSchema
56
+ }),
57
+ output: S.Void
58
+ }) {
59
+ }
60
+ ThreadAction2.OnMessageAdd = OnMessageAdd;
61
+ class DeleteMessage extends S.TaggedClass()(`${THREAD_ACTION}/delete-message`, {
62
+ input: S.Struct({
63
+ thread: ThreadType,
64
+ subject: EchoObjectSchema,
65
+ messageId: S.String,
66
+ message: S.optional(MessageType),
67
+ messageIndex: S.optional(S.Number)
68
+ }),
69
+ output: S.Void
70
+ }) {
71
+ }
72
+ ThreadAction2.DeleteMessage = DeleteMessage;
73
+ })(ThreadAction || (ThreadAction = {}));
74
+ var ThreadSettingsSchema = S.mutable(S.Struct({
75
+ standalone: S.optional(S.Boolean)
76
+ }));
77
+
78
+ export {
79
+ ThreadAction,
80
+ ThreadSettingsSchema
81
+ };
82
+ //# sourceMappingURL=chunk-B3CF35MY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { S } from '@dxos/echo-schema';\nimport { ChannelType, MessageType, ThreadType } from '@dxos/plugin-space/types';\nimport { EchoObjectSchema } from '@dxos/react-client/echo';\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport namespace ThreadAction {\n const THREAD_ACTION = `${THREAD_PLUGIN}/action`;\n\n export class Create extends S.TaggedClass<Create>()(`${THREAD_ACTION}/create`, {\n input: S.Struct({\n name: S.optional(S.String),\n cursor: S.optional(S.String),\n subject: S.optional(EchoObjectSchema),\n }),\n output: S.Struct({\n object: S.Union(ChannelType, ThreadType),\n }),\n }) {}\n\n export class Select extends S.TaggedClass<Select>()(`${THREAD_ACTION}/select`, {\n input: S.Struct({\n current: S.String,\n skipOpen: S.optional(S.Boolean),\n }),\n output: S.Void,\n }) {}\n\n export class ToggleResolved extends S.TaggedClass<ToggleResolved>()(`${THREAD_ACTION}/toggle-resolved`, {\n input: S.Struct({\n thread: ThreadType,\n }),\n output: S.Void,\n }) {}\n\n export class Delete extends S.TaggedClass<Delete>()(`${THREAD_ACTION}/delete`, {\n input: S.Struct({\n thread: ThreadType,\n subject: EchoObjectSchema,\n cursor: S.optional(S.String),\n }),\n output: S.Void,\n }) {}\n\n // TODO(wittjosiah): Rename?\n export class OnMessageAdd extends S.TaggedClass<OnMessageAdd>()(`${THREAD_ACTION}/on-message-add`, {\n input: S.Struct({\n thread: ThreadType,\n subject: EchoObjectSchema,\n }),\n output: S.Void,\n }) {}\n\n export class DeleteMessage extends S.TaggedClass<DeleteMessage>()(`${THREAD_ACTION}/delete-message`, {\n input: S.Struct({\n thread: ThreadType,\n subject: EchoObjectSchema,\n messageId: S.String,\n message: S.optional(MessageType),\n messageIndex: S.optional(S.Number),\n }),\n output: S.Void,\n }) {}\n}\n\nexport const ThreadSettingsSchema = S.mutable(\n S.Struct({\n standalone: S.optional(S.Boolean),\n }),\n);\n\nexport type ThreadSettingsProps = S.Schema.Type<typeof ThreadSettingsSchema>;\n\nexport interface ThreadModel {\n root: ThreadType;\n}\n\ntype SubjectId = string;\nexport type ViewState = { showResolvedThreads: boolean };\nexport type ViewStore = Record<SubjectId, ViewState>;\n\nexport type ThreadState = {\n /** In-memory draft threads. */\n drafts: Record<string, ThreadType[]>;\n current?: string | undefined;\n};\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,SAAS;AAClB,SAASC,aAAaC,aAAaC,kBAAkB;AACrD,SAASC,wBAAwB;;UAIhBC,eAAAA;AACf,QAAMC,gBAAgB,GAAGC,aAAAA;EAElB,MAAMC,eAAeC,EAAEC,YAAW,EAAW,GAAGJ,aAAAA,WAAwB;IAC7EK,OAAOF,EAAEG,OAAO;MACdC,MAAMJ,EAAEK,SAASL,EAAEM,MAAM;MACzBC,QAAQP,EAAEK,SAASL,EAAEM,MAAM;MAC3BE,SAASR,EAAEK,SAASI,gBAAAA;IACtB,CAAA;IACAC,QAAQV,EAAEG,OAAO;MACfQ,QAAQX,EAAEY,MAAMC,aAAaC,UAAAA;IAC/B,CAAA;EACF,CAAA,EAAA;EAAI;gBATSf,SAAAA;EAWN,MAAMgB,eAAef,EAAEC,YAAW,EAAW,GAAGJ,aAAAA,WAAwB;IAC7EK,OAAOF,EAAEG,OAAO;MACda,SAAShB,EAAEM;MACXW,UAAUjB,EAAEK,SAASL,EAAEkB,OAAO;IAChC,CAAA;IACAR,QAAQV,EAAEmB;EACZ,CAAA,EAAA;EAAI;gBANSJ,SAAAA;EAQN,MAAMK,uBAAuBpB,EAAEC,YAAW,EAAmB,GAAGJ,aAAAA,oBAAiC;IACtGK,OAAOF,EAAEG,OAAO;MACdkB,QAAQP;IACV,CAAA;IACAJ,QAAQV,EAAEmB;EACZ,CAAA,EAAA;EAAI;gBALSC,iBAAAA;EAON,MAAME,eAAetB,EAAEC,YAAW,EAAW,GAAGJ,aAAAA,WAAwB;IAC7EK,OAAOF,EAAEG,OAAO;MACdkB,QAAQP;MACRN,SAASC;MACTF,QAAQP,EAAEK,SAASL,EAAEM,MAAM;IAC7B,CAAA;IACAI,QAAQV,EAAEmB;EACZ,CAAA,EAAA;EAAI;gBAPSG,SAAAA;EAUN,MAAMC,qBAAqBvB,EAAEC,YAAW,EAAiB,GAAGJ,aAAAA,mBAAgC;IACjGK,OAAOF,EAAEG,OAAO;MACdkB,QAAQP;MACRN,SAASC;IACX,CAAA;IACAC,QAAQV,EAAEmB;EACZ,CAAA,EAAA;EAAI;gBANSI,eAAAA;EAQN,MAAMC,sBAAsBxB,EAAEC,YAAW,EAAkB,GAAGJ,aAAAA,mBAAgC;IACnGK,OAAOF,EAAEG,OAAO;MACdkB,QAAQP;MACRN,SAASC;MACTgB,WAAWzB,EAAEM;MACboB,SAAS1B,EAAEK,SAASsB,WAAAA;MACpBC,cAAc5B,EAAEK,SAASL,EAAE6B,MAAM;IACnC,CAAA;IACAnB,QAAQV,EAAEmB;EACZ,CAAA,EAAA;EAAI;gBATSK,gBAAAA;AAUf,GAzDiB5B,iBAAAA,eAAAA,CAAAA,EAAAA;AA2DV,IAAMkC,uBAAuB9B,EAAE+B,QACpC/B,EAAEG,OAAO;EACP6B,YAAYhC,EAAEK,SAASL,EAAEkB,OAAO;AAClC,CAAA,CAAA;",
6
+ "names": ["S", "ChannelType", "MessageType", "ThreadType", "EchoObjectSchema", "ThreadAction", "THREAD_ACTION", "THREAD_PLUGIN", "Create", "S", "TaggedClass", "input", "Struct", "name", "optional", "String", "cursor", "subject", "EchoObjectSchema", "output", "object", "Union", "ChannelType", "ThreadType", "Select", "current", "skipOpen", "Boolean", "Void", "ToggleResolved", "thread", "Delete", "OnMessageAdd", "DeleteMessage", "messageId", "message", "MessageType", "messageIndex", "Number", "ThreadSettingsSchema", "mutable", "standalone"]
7
+ }
@@ -1,108 +1,42 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- THREAD_ITEM,
3
+ useOnEditAnalytics,
4
+ useStatus
5
+ } from "./chunk-HLWJTUWZ.mjs";
6
+ import {
4
7
  THREAD_PLUGIN
5
- } from "./chunk-7QRGG25F.mjs";
6
-
7
- // packages/plugins/plugin-thread/src/hooks/useStatus.ts
8
- import { useEffect, useState } from "react";
9
- var useStatus = (space, channel) => {
10
- const [processing, setProcessing] = useState(false);
11
- useEffect(() => {
12
- if (!space || !channel) {
13
- return;
14
- }
15
- const unsubscribe = space.listen(`status/${channel}`, (status) => {
16
- const { event } = status.payload ?? {};
17
- setProcessing(event === "processing");
18
- });
19
- const t = setInterval(() => {
20
- setProcessing((prev) => {
21
- if (typeof prev?.ts === "number" && Date.now() - prev.ts > 3e4) {
22
- return void 0;
23
- } else {
24
- return prev;
25
- }
26
- });
27
- }, 1e3);
28
- return () => {
29
- unsubscribe();
30
- clearInterval(t);
31
- };
32
- }, [
33
- space,
34
- channel
35
- ]);
36
- return processing;
37
- };
38
-
39
- // packages/plugins/plugin-thread/src/hooks/analytics.ts
40
- import { useCallback } from "react";
41
- import { useIntentDispatcher } from "@dxos/app-framework";
42
- import { ObservabilityAction } from "@dxos/plugin-observability/meta";
43
- import { getSpace } from "@dxos/react-client/echo";
44
- import { useOnTransition } from "@dxos/react-ui";
45
- var useAnalyticsCallback = (spaceId, name, meta) => {
46
- const dispatch = useIntentDispatcher();
47
- return useCallback((dynamicMeta) => {
48
- void dispatch({
49
- action: ObservabilityAction.SEND_EVENT,
50
- data: {
51
- name,
52
- properties: {
53
- ...meta,
54
- ...dynamicMeta,
55
- spaceId
56
- }
57
- }
58
- });
59
- }, [
60
- dispatch,
61
- name,
62
- meta,
63
- spaceId
64
- ]);
65
- };
66
- var useOnEditAnalytics = (message, editing) => {
67
- const space = getSpace(message);
68
- const onEditAnalytics = useAnalyticsCallback(space?.id, "threads.comment-edited", {
69
- messageId: message.id,
70
- messageLength: message.text.length
71
- });
72
- useOnTransition(editing, true, false, onEditAnalytics);
73
- };
8
+ } from "./chunk-FXUATCLW.mjs";
74
9
 
75
10
  // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
76
- import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState3 } from "react";
77
- import { create } from "@dxos/live-object";
11
+ import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState2 } from "react";
12
+ import { Ref } from "@dxos/echo-schema";
13
+ import { create, makeRef, RefArray as RefArray2 } from "@dxos/live-object";
78
14
  import { MessageType } from "@dxos/plugin-space/types";
79
- import { fullyQualifiedId, getSpace as getSpace2, useMembers } from "@dxos/react-client/echo";
15
+ import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
80
16
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
81
17
  import { Icon, ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
82
18
  import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, listener } from "@dxos/react-ui-editor";
83
19
  import { StackItem } from "@dxos/react-ui-stack";
84
20
  import { mx as mx3 } from "@dxos/react-ui-theme";
85
21
  import { MessageTextbox, Thread, ThreadFooter, threadLayout } from "@dxos/react-ui-thread";
86
- import { nonNullable as nonNullable2 } from "@dxos/util";
87
22
 
88
23
  // packages/plugins/plugin-thread/src/components/MessageContainer.tsx
89
24
  import { EditorView } from "@codemirror/view";
90
25
  import { Check, PencilSimple, X } from "@phosphor-icons/react";
91
- import React, { forwardRef, useCallback as useCallback2, useEffect as useEffect2, useRef, useState as useState2 } from "react";
26
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from "react";
92
27
  import { Surface } from "@dxos/app-framework";
28
+ import { RefArray } from "@dxos/live-object";
93
29
  import { PublicKey } from "@dxos/react-client";
94
30
  import { useIdentity } from "@dxos/react-client/halo";
95
- import { Button, ButtonGroup, Tooltip, useOnTransition as useOnTransition2, useThemeContext, useTranslation } from "@dxos/react-ui";
31
+ import { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from "@dxos/react-ui";
96
32
  import { createBasicExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
97
- import { Mosaic } from "@dxos/react-ui-mosaic";
98
33
  import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx as mx2 } from "@dxos/react-ui-theme";
99
34
  import { MessageHeading, MessageRoot } from "@dxos/react-ui-thread";
100
- import { nonNullable } from "@dxos/util";
101
35
 
102
36
  // packages/plugins/plugin-thread/src/components/command-extension.ts
103
37
  import { StreamLanguage, HighlightStyle, syntaxHighlighting } from "@codemirror/language";
104
38
  import { tags } from "@dxos/react-ui-editor";
105
- import { mx, tagRoot } from "@dxos/react-ui-theme";
39
+ import { mx } from "@dxos/react-ui-theme";
106
40
  var parser = StreamLanguage.define({
107
41
  startState: () => ({
108
42
  count: 0
@@ -122,9 +56,7 @@ var parser = StreamLanguage.define({
122
56
  var styles = HighlightStyle.define([
123
57
  {
124
58
  tag: tags.tagName,
125
- class: mx(tagRoot({
126
- palette: "cyan"
127
- }), "text-baseText font-medium")
59
+ class: mx("dx-tag dx-tag--indigo text-baseText font-medium")
128
60
  }
129
61
  ]);
130
62
  var command = [
@@ -157,8 +89,8 @@ var MessageContainer = ({ message, members, onDelete }) => {
157
89
  const senderIdentity = members.find((member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
158
90
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
159
91
  const userIsAuthor = useIdentity()?.identityKey.toHex() === messageMetadata.authorId;
160
- const [editing, setEditing] = useState2(false);
161
- const handleDelete = useCallback2(() => onDelete?.(message.id), [
92
+ const [editing, setEditing] = useState(false);
93
+ const handleDelete = useCallback(() => onDelete?.(message.id), [
162
94
  message,
163
95
  onDelete
164
96
  ]);
@@ -189,9 +121,7 @@ var MessageContainer = ({ message, members, onDelete }) => {
189
121
  className: getSize(4)
190
122
  }) : /* @__PURE__ */ React.createElement(PencilSimple, {
191
123
  className: getSize(4)
192
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
193
- classNames: "z-[21]"
194
- }, editLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
124
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, editLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
195
125
  asChild: true
196
126
  }, /* @__PURE__ */ React.createElement(Button, {
197
127
  variant: "ghost",
@@ -202,39 +132,32 @@ var MessageContainer = ({ message, members, onDelete }) => {
202
132
  className: "sr-only"
203
133
  }, deleteLabel), /* @__PURE__ */ React.createElement(X, {
204
134
  className: getSize(4)
205
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
206
- classNames: "z-[21]"
207
- }, deleteLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))))), /* @__PURE__ */ React.createElement(TextboxBlock, {
135
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, deleteLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))))), /* @__PURE__ */ React.createElement(TextboxBlock, {
208
136
  message,
209
137
  isAuthor: userIsAuthor,
210
138
  editing
211
- }), message.parts?.filter(nonNullable).map((part, index) => /* @__PURE__ */ React.createElement(MessagePart, {
139
+ }), RefArray.allResolvedTargets(message.parts ?? []).map((part, index) => /* @__PURE__ */ React.createElement(MessagePart, {
212
140
  key: index,
213
141
  part
214
142
  })));
215
143
  };
216
144
  var MessagePart = ({ part }) => {
217
- return /* @__PURE__ */ React.createElement(Mosaic.Container, {
218
- id: part.id
219
- }, /* @__PURE__ */ React.createElement(Mosaic.DraggableTile, {
220
- type: THREAD_ITEM,
221
- path: part.id,
222
- item: part,
223
- Component: MessageBlockObjectTile
224
- }));
145
+ return /* @__PURE__ */ React.createElement(MessageBlockObjectTile, {
146
+ subject: part
147
+ });
225
148
  };
226
149
  var TextboxBlock = ({ message, isAuthor, editing }) => {
227
150
  const { themeMode } = useThemeContext();
228
151
  const inMemoryContentRef = useRef(message.text);
229
- const handleDocumentChange = useCallback2((newState) => {
152
+ const handleDocumentChange = useCallback((newState) => {
230
153
  inMemoryContentRef.current = newState;
231
154
  }, []);
232
- const saveDocumentChange = useCallback2(() => {
155
+ const saveDocumentChange = useCallback(() => {
233
156
  message.text = inMemoryContentRef.current;
234
157
  }, [
235
158
  message
236
159
  ]);
237
- useOnTransition2(editing, true, false, saveDocumentChange);
160
+ useOnTransition(editing, true, false, saveDocumentChange);
238
161
  const { parentRef, focusAttributes, view } = useTextEditor(() => ({
239
162
  initialValue: message.text,
240
163
  extensions: [
@@ -258,7 +181,7 @@ var TextboxBlock = ({ message, isAuthor, editing }) => {
258
181
  themeMode,
259
182
  handleDocumentChange
260
183
  ]);
261
- useEffect2(() => {
184
+ useEffect(() => {
262
185
  editing && view?.focus();
263
186
  }, [
264
187
  editing,
@@ -272,52 +195,35 @@ var TextboxBlock = ({ message, isAuthor, editing }) => {
272
195
  ...focusAttributes
273
196
  });
274
197
  };
275
- var MessageBlockObjectTile = /* @__PURE__ */ forwardRef(({ draggableStyle, draggableProps, item, active, ref: _ref, ...props }, forwardedRef) => {
276
- let title = item.name ?? item.title ?? item.type ?? "Object";
198
+ var MessageBlockObjectTile = /* @__PURE__ */ forwardRef(({ subject }, forwardedRef) => {
199
+ let title = subject.name ?? subject.title ?? subject.type ?? "Object";
277
200
  if (typeof title !== "string") {
278
201
  title = title?.content ?? "";
279
202
  }
280
203
  return /* @__PURE__ */ React.createElement("div", {
281
204
  role: "group",
282
205
  className: mx2("grid col-span-3 py-1 pr-4", hoverableControls, hoverableFocusedWithinControls),
283
- style: draggableStyle,
284
206
  ref: forwardedRef
285
207
  }, /* @__PURE__ */ React.createElement(Surface, {
286
208
  role: "card",
287
209
  limit: 1,
288
210
  data: {
289
- content: item
211
+ subject
290
212
  },
291
- draggableProps,
292
- fallback: title,
293
- ...props
213
+ fallback: title
294
214
  }));
295
215
  });
296
216
 
297
217
  // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
298
- var ChatHeading = ({ attendableId }) => {
299
- const { t } = useTranslation2(THREAD_PLUGIN);
300
- return /* @__PURE__ */ React2.createElement("div", {
301
- role: "none",
302
- className: "flex items-center"
303
- }, /* @__PURE__ */ React2.createElement(StackItem.SigilButton, {
304
- attendableId
305
- }, /* @__PURE__ */ React2.createElement(Icon, {
306
- icon: "ph--chat--regular",
307
- size: 5
308
- })), /* @__PURE__ */ React2.createElement(StackItem.HeadingLabel, {
309
- attendableId
310
- }, t("chat heading")));
311
- };
312
218
  var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
313
219
  const identity = useIdentity2();
314
- const space = getSpace2(thread);
220
+ const space = getSpace(thread);
315
221
  const members = useMembers(space?.key);
316
222
  const activity = useStatus(space, fullyQualifiedId(thread));
317
223
  const { t } = useTranslation2(THREAD_PLUGIN);
318
- const [_count, _setCount] = useState3(0);
224
+ const [_count, _setCount] = useState2(0);
319
225
  const rerenderEditor = () => _setCount((count) => count + 1);
320
- const [autoFocus, setAutoFocus] = useState3(autoFocusTextbox);
226
+ const [autoFocus, setAutoFocus] = useState2(autoFocusTextbox);
321
227
  const threadScrollRef = useRef2(null);
322
228
  const { themeMode } = useThemeContext2();
323
229
  const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
@@ -348,14 +254,14 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
348
254
  if (!messageRef.current?.length) {
349
255
  return false;
350
256
  }
351
- thread.messages.push(create(MessageType, {
257
+ thread.messages.push(makeRef(create(MessageType, {
352
258
  sender: {
353
259
  identityKey: identity.identityKey.toHex()
354
260
  },
355
261
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
356
262
  text: messageRef.current,
357
- context
358
- }));
263
+ context: context ? makeRef(context) : void 0
264
+ })));
359
265
  messageRef.current = "";
360
266
  setAutoFocus(true);
361
267
  scrollToEnd("smooth");
@@ -363,7 +269,7 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
363
269
  return true;
364
270
  };
365
271
  const handleDelete = (id) => {
366
- const messageIndex = thread.messages.filter(nonNullable2).findIndex((message) => message.id === id);
272
+ const messageIndex = thread.messages.findIndex(Ref.hasObjectId(id));
367
273
  if (messageIndex !== -1) {
368
274
  thread.messages.splice(messageIndex, 1);
369
275
  }
@@ -379,7 +285,7 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
379
285
  }, /* @__PURE__ */ React2.createElement("div", {
380
286
  role: "none",
381
287
  className: mx3(threadLayout, "place-self-end")
382
- }, thread.messages.filter(nonNullable2).map((message) => /* @__PURE__ */ React2.createElement(MessageContainer, {
288
+ }, RefArray2.allResolvedTargets(thread.messages ?? []).map((message) => /* @__PURE__ */ React2.createElement(MessageContainer, {
383
289
  key: message.id,
384
290
  message,
385
291
  members,
@@ -400,12 +306,8 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
400
306
 
401
307
  export {
402
308
  command,
403
- useStatus,
404
- useAnalyticsCallback,
405
- useOnEditAnalytics,
406
309
  getMessageMetadata,
407
310
  MessageContainer,
408
- ChatHeading,
409
311
  ChatContainer
410
312
  };
411
- //# sourceMappingURL=chunk-JG7MXH6O.mjs.map
313
+ //# sourceMappingURL=chunk-CISLDOH7.mjs.map