@dxos/plugin-thread 0.8.3-main.672df60 → 0.8.3-staging.0fa589b

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 (158) hide show
  1. package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs → ChannelContainer-PKFBVENP.mjs} +4 -4
  2. package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs → ChatContainer-RSOKYAMK.mjs} +2 -2
  3. package/dist/lib/browser/{app-graph-builder-K3CFBN7V.mjs → app-graph-builder-OY7R7EJP.mjs} +11 -11
  4. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-6NBVNXTM.mjs +21 -0
  6. package/dist/lib/browser/{chunk-WDOQXTI2.mjs → chunk-AEXWNS6Z.mjs} +5 -3
  7. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-KMVGJG23.mjs → chunk-PG5CTFKK.mjs} +50 -45
  9. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-G3TS64FP.mjs → chunk-TAFSCSUR.mjs} +4 -4
  11. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-5PGLGDIP.mjs → chunk-XZKBN3NS.mjs} +35 -35
  13. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +7 -0
  14. package/dist/lib/browser/index.mjs +35 -9
  15. package/dist/lib/browser/index.mjs.map +3 -3
  16. package/dist/lib/browser/{intent-resolver-YUYZCTLF.mjs → intent-resolver-FK2MDVDT.mjs} +24 -26
  17. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +7 -0
  18. package/dist/lib/browser/{markdown-4EC3OCF2.mjs → markdown-TE5SWWNJ.mjs} +9 -9
  19. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-EECCWHCW.mjs → react-root-NK3A4VG7.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-5QLZAFDL.mjs → react-surface-VXUJKSOG.mjs} +12 -12
  23. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-KVBQQSO5.mjs → settings-RB2RSLXV.mjs} +4 -4
  25. package/dist/lib/browser/settings-RB2RSLXV.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +1 -1
  27. package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs → ChannelContainer-YS5YT2ML.cjs} +9 -9
  28. package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs.map → ChannelContainer-YS5YT2ML.cjs.map} +2 -2
  29. package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs → ChatContainer-GCOM3M56.cjs} +8 -8
  30. package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs.map → ChatContainer-GCOM3M56.cjs.map} +2 -2
  31. package/dist/lib/node/{app-graph-builder-IRE3GYKE.cjs → app-graph-builder-PBHJNDQY.cjs} +21 -21
  32. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +7 -0
  33. package/dist/lib/node/{chunk-4B3PPXA6.cjs → chunk-E3WBZTTI.cjs} +12 -12
  34. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-U7NOIXN6.cjs → chunk-ERG7G6FF.cjs} +10 -10
  36. package/dist/lib/node/{chunk-JLHENFGK.cjs → chunk-IP533AMV.cjs} +76 -71
  37. package/dist/lib/node/chunk-IP533AMV.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-6B3M6XRE.cjs → chunk-UM36TPCT.cjs} +37 -37
  39. package/dist/lib/node/chunk-UM36TPCT.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-TKHJVC2C.cjs → chunk-ZGDN3XBR.cjs} +8 -6
  41. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +7 -0
  42. package/dist/lib/node/index.cjs +45 -19
  43. package/dist/lib/node/index.cjs.map +3 -3
  44. package/dist/lib/node/{intent-resolver-MZ3HADNY.cjs → intent-resolver-SYSJ5SJG.cjs} +50 -52
  45. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +7 -0
  46. package/dist/lib/node/{markdown-NJDPXIKD.cjs → markdown-GQIPJS2F.cjs} +27 -27
  47. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-IAYQ2DBO.cjs → react-root-6HHDMULJ.cjs} +10 -10
  50. package/dist/lib/node/{react-surface-AVC5VVIS.cjs → react-surface-NBH42NN2.cjs} +24 -24
  51. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +7 -0
  52. package/dist/lib/node/{settings-H45P5YO2.cjs → settings-4LQSFEDK.cjs} +7 -7
  53. package/dist/lib/node/settings-4LQSFEDK.cjs.map +7 -0
  54. package/dist/lib/node/types/index.cjs +6 -6
  55. package/dist/lib/node/types/index.cjs.map +1 -1
  56. package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs → ChannelContainer-O4QJII2P.mjs} +4 -4
  57. package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs → ChatContainer-F6CSADV7.mjs} +2 -2
  58. package/dist/lib/node-esm/{app-graph-builder-I5VMPLE4.mjs → app-graph-builder-BAHBHYWI.mjs} +11 -11
  59. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-X6AUQDTE.mjs → chunk-2RNIPFDA.mjs} +35 -35
  61. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs → chunk-O63QJPQX.mjs} +7 -7
  63. package/dist/lib/node-esm/{chunk-POKXRTII.mjs → chunk-P6RLFCNT.mjs} +4 -4
  64. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-J323VQ4P.mjs → chunk-UJMPYKT3.mjs} +5 -3
  66. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-MNJ3V4XM.mjs → chunk-UZWVVFT3.mjs} +50 -45
  68. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +35 -9
  70. package/dist/lib/node-esm/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{intent-resolver-CU22OPAH.mjs → intent-resolver-BU73VYW3.mjs} +24 -26
  72. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +7 -0
  73. package/dist/lib/node-esm/{markdown-HRGGO7IA.mjs → markdown-HJUWNBLS.mjs} +9 -9
  74. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs → react-root-RUXOAQNW.mjs} +6 -6
  77. package/dist/lib/node-esm/{react-surface-Z4X5VLMY.mjs → react-surface-ELXFYKP6.mjs} +12 -12
  78. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-IJGUOU3F.mjs → settings-EA7DFSM6.mjs} +4 -4
  80. package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +7 -0
  81. package/dist/lib/node-esm/types/index.mjs +1 -1
  82. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  85. package/dist/types/src/components/ChatContainer.d.ts +3 -2
  86. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  87. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/CommentsContainer.d.ts +1 -1
  89. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  90. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  91. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  92. package/dist/types/src/components/testing.d.ts +2 -103
  93. package/dist/types/src/components/testing.d.ts.map +1 -1
  94. package/dist/types/src/translations.d.ts +128 -2
  95. package/dist/types/src/translations.d.ts.map +1 -1
  96. package/dist/types/src/types/schema.d.ts +117 -301
  97. package/dist/types/src/types/schema.d.ts.map +1 -1
  98. package/dist/types/src/types/types.d.ts +153 -828
  99. package/dist/types/src/types/types.d.ts.map +1 -1
  100. package/package.json +42 -42
  101. package/src/ThreadPlugin.tsx +29 -6
  102. package/src/capabilities/app-graph-builder.ts +9 -9
  103. package/src/capabilities/intent-resolver.ts +26 -26
  104. package/src/capabilities/react-surface.tsx +7 -7
  105. package/src/capabilities/settings.ts +7 -2
  106. package/src/components/Call/Toolbar.tsx +3 -3
  107. package/src/components/ChannelContainer.tsx +18 -22
  108. package/src/components/Chat.stories.tsx +4 -4
  109. package/src/components/ChatContainer.tsx +6 -6
  110. package/src/components/CommentContainer.tsx +2 -2
  111. package/src/components/Comments.stories.tsx +15 -5
  112. package/src/components/CommentsContainer.tsx +21 -24
  113. package/src/components/MessageContainer.tsx +20 -20
  114. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  115. package/src/components/ThreadComplementary.tsx +19 -15
  116. package/src/components/testing.ts +5 -5
  117. package/src/extensions/threads.ts +7 -7
  118. package/src/testing/stories.ts +3 -3
  119. package/src/translations.ts +7 -2
  120. package/src/types/schema.ts +8 -4
  121. package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-CF2MXRCH.mjs +0 -21
  124. package/dist/lib/browser/chunk-G3TS64FP.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-KMVGJG23.mjs.map +0 -7
  126. package/dist/lib/browser/chunk-WDOQXTI2.mjs.map +0 -7
  127. package/dist/lib/browser/intent-resolver-YUYZCTLF.mjs.map +0 -7
  128. package/dist/lib/browser/markdown-4EC3OCF2.mjs.map +0 -7
  129. package/dist/lib/browser/react-surface-5QLZAFDL.mjs.map +0 -7
  130. package/dist/lib/browser/settings-KVBQQSO5.mjs.map +0 -7
  131. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +0 -7
  132. package/dist/lib/node/chunk-4B3PPXA6.cjs.map +0 -7
  133. package/dist/lib/node/chunk-6B3M6XRE.cjs.map +0 -7
  134. package/dist/lib/node/chunk-JLHENFGK.cjs.map +0 -7
  135. package/dist/lib/node/chunk-TKHJVC2C.cjs.map +0 -7
  136. package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +0 -7
  137. package/dist/lib/node/markdown-NJDPXIKD.cjs.map +0 -7
  138. package/dist/lib/node/react-surface-AVC5VVIS.cjs.map +0 -7
  139. package/dist/lib/node/settings-H45P5YO2.cjs.map +0 -7
  140. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-J323VQ4P.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs.map +0 -7
  143. package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +0 -7
  144. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +0 -7
  145. package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +0 -7
  146. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +0 -7
  147. package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs.map +0 -7
  148. package/dist/lib/node-esm/settings-IJGUOU3F.mjs.map +0 -7
  149. /package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs.map → ChannelContainer-PKFBVENP.mjs.map} +0 -0
  150. /package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs.map → ChatContainer-RSOKYAMK.mjs.map} +0 -0
  151. /package/dist/lib/browser/{chunk-CF2MXRCH.mjs.map → chunk-6NBVNXTM.mjs.map} +0 -0
  152. /package/dist/lib/browser/{react-root-EECCWHCW.mjs.map → react-root-NK3A4VG7.mjs.map} +0 -0
  153. /package/dist/lib/node/{chunk-U7NOIXN6.cjs.map → chunk-ERG7G6FF.cjs.map} +0 -0
  154. /package/dist/lib/node/{react-root-IAYQ2DBO.cjs.map → react-root-6HHDMULJ.cjs.map} +0 -0
  155. /package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs.map → ChannelContainer-O4QJII2P.mjs.map} +0 -0
  156. /package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs.map → ChatContainer-F6CSADV7.mjs.map} +0 -0
  157. /package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs.map → chunk-O63QJPQX.mjs.map} +0 -0
  158. /package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs.map → react-root-RUXOAQNW.mjs.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  ChannelContainer,
3
3
  ChannelContainer_default
4
- } from "./chunk-5PGLGDIP.mjs";
5
- import "./chunk-CF2MXRCH.mjs";
4
+ } from "./chunk-XZKBN3NS.mjs";
5
+ import "./chunk-6NBVNXTM.mjs";
6
6
  import "./chunk-R5MDLUPC.mjs";
7
- import "./chunk-G3TS64FP.mjs";
7
+ import "./chunk-TAFSCSUR.mjs";
8
8
  import "./chunk-5P5BH5GE.mjs";
9
9
  import "./chunk-JKQUJOTX.mjs";
10
10
  import "./chunk-IIUTBDVB.mjs";
@@ -12,4 +12,4 @@ export {
12
12
  ChannelContainer,
13
13
  ChannelContainer_default as default
14
14
  };
15
- //# sourceMappingURL=ChannelContainer-LGYSQMC7.mjs.map
15
+ //# sourceMappingURL=ChannelContainer-PKFBVENP.mjs.map
@@ -2,7 +2,7 @@ import {
2
2
  ChatContainer,
3
3
  ChatContainer_default,
4
4
  ChatHeading
5
- } from "./chunk-G3TS64FP.mjs";
5
+ } from "./chunk-TAFSCSUR.mjs";
6
6
  import "./chunk-5P5BH5GE.mjs";
7
7
  import "./chunk-JKQUJOTX.mjs";
8
8
  import "./chunk-IIUTBDVB.mjs";
@@ -11,4 +11,4 @@ export {
11
11
  ChatHeading,
12
12
  ChatContainer_default as default
13
13
  };
14
- //# sourceMappingURL=ChatContainer-JWRI73OG.mjs.map
14
+ //# sourceMappingURL=ChatContainer-RSOKYAMK.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ChannelType,
3
3
  ThreadAction
4
- } from "./chunk-WDOQXTI2.mjs";
4
+ } from "./chunk-AEXWNS6Z.mjs";
5
5
  import {
6
6
  ThreadCapabilities
7
7
  } from "./chunk-R5MDLUPC.mjs";
@@ -17,11 +17,11 @@ import {
17
17
  import { Rx } from "@effect-rx/rx-react";
18
18
  import { Option, pipe } from "effect";
19
19
  import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
20
- import { getTypename, isInstanceOf } from "@dxos/echo-schema";
20
+ import { Obj } from "@dxos/echo";
21
21
  import { AttentionCapabilities } from "@dxos/plugin-attention";
22
22
  import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
23
23
  import { createExtension, ROOT_ID, rxFromSignal } from "@dxos/plugin-graph";
24
- import { fullyQualifiedId, isEchoObject } from "@dxos/react-client/echo";
24
+ import { fullyQualifiedId } from "@dxos/react-client/echo";
25
25
  var app_graph_builder_default = (context) => {
26
26
  const resolve = (typename) => context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
27
27
  return contributes(Capabilities.AppGraphBuilder, [
@@ -55,7 +55,7 @@ var app_graph_builder_default = (context) => {
55
55
  id: `${THREAD_PLUGIN}/channel-chat-companion`,
56
56
  connector: (node) => {
57
57
  return Rx.make((get) => {
58
- return pipe(get(node), Option.flatMap((node2) => isInstanceOf(ChannelType, node2.data) ? Option.some(node2.data) : Option.none()), Option.map((channel) => {
58
+ return pipe(get(node), Option.flatMap((node2) => Obj.instanceOf(ChannelType, node2.data) ? Option.some(node2.data) : Option.none()), Option.map((channel) => {
59
59
  const callManager = context.getCapability(ThreadCapabilities.CallManager);
60
60
  const joined = get(rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)));
61
61
  if (!joined) {
@@ -86,10 +86,10 @@ var app_graph_builder_default = (context) => {
86
86
  createExtension({
87
87
  id: `${meta.id}/comments-companion`,
88
88
  connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => {
89
- if (!isEchoObject(node2.data) || isInstanceOf(ChannelType, node2.data)) {
89
+ if (!Obj.isObject(node2.data) || Obj.instanceOf(ChannelType, node2.data)) {
90
90
  return Option.none();
91
91
  }
92
- const metadata = resolve(getTypename(node2.data));
92
+ const metadata = resolve(Obj.getTypename(node2.data));
93
93
  return typeof metadata.comments === "string" ? Option.some(node2) : Option.none();
94
94
  }), Option.map((node2) => [
95
95
  {
@@ -116,16 +116,16 @@ var app_graph_builder_default = (context) => {
116
116
  createExtension({
117
117
  id: `${meta.id}/comment-toolbar`,
118
118
  actions: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => {
119
- if (!isEchoObject(node2.data) || isInstanceOf(ChannelType, node2.data)) {
119
+ if (!Obj.isObject(node2.data) || Obj.instanceOf(ChannelType, node2.data)) {
120
120
  return Option.none();
121
121
  }
122
- const metadata = resolve(getTypename(node2.data));
122
+ const metadata = resolve(Obj.getTypename(node2.data));
123
123
  return typeof metadata.comments === "string" ? Option.some(node2.data) : Option.none();
124
124
  }), Option.map((object) => {
125
125
  const selectionManager = context.getCapability(AttentionCapabilities.Selection);
126
126
  const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
127
127
  const disabled = get(rxFromSignal(() => {
128
- const metadata = resolve(getTypename(object));
128
+ const metadata = resolve(Obj.getTypename(object));
129
129
  const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);
130
130
  const anchor = getAnchor(selection);
131
131
  const invalidSelection = !anchor;
@@ -137,7 +137,7 @@ var app_graph_builder_default = (context) => {
137
137
  id: `${fullyQualifiedId(object)}/comment`,
138
138
  data: () => {
139
139
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
140
- const metadata = resolve(getTypename(object));
140
+ const metadata = resolve(Obj.getTypename(object));
141
141
  const selection = selectionManager.getSelection(fullyQualifiedId(object));
142
142
  const anchor = metadata.comments === "anchored" ? getAnchor(selection) : Date.now().toString();
143
143
  const name = metadata.getAnchorLabel?.(object, anchor);
@@ -168,4 +168,4 @@ var app_graph_builder_default = (context) => {
168
168
  export {
169
169
  app_graph_builder_default as default
170
170
  };
171
- //# sourceMappingURL=app-graph-builder-K3CFBN7V.mjs.map
171
+ //# sourceMappingURL=app-graph-builder-OY7R7EJP.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 { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { meta, THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction } from '../types';\nimport { getAnchor } from '../util';\n\nexport default (context: PluginContext) => {\n const resolve = (typename: string) =>\n context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${THREAD_PLUGIN}/active-call`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map((node) => {\n const [call] = get(context.capabilities(ThreadCapabilities.CallManager));\n return get(\n rxFromSignal(() =>\n call?.joined\n ? [\n {\n id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,\n type: DECK_COMPANION_TYPE,\n data: null,\n properties: {\n label: ['call panel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--video-conference--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ]\n : [],\n ),\n );\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n // TODO(wittjosiah): The channel shouldn't become the companion during a call.\n // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.\n createExtension({\n id: `${THREAD_PLUGIN}/channel-chat-companion`,\n connector: (node) => {\n return Rx.make((get) => {\n return pipe(\n get(node),\n Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),\n Option.map((channel) => {\n const callManager = context.getCapability(ThreadCapabilities.CallManager);\n const joined = get(\n rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),\n );\n if (!joined) {\n return [];\n }\n\n return [\n {\n id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,\n type: PLANK_COMPANION_TYPE,\n data: 'chat',\n properties: {\n label: ['channel companion label', { ns: THREAD_PLUGIN }],\n icon: 'ph--hash--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n );\n });\n },\n }),\n createExtension({\n id: `${meta.id}/comments-companion`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(Obj.getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();\n }),\n Option.map((node) => [\n {\n id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'comments',\n properties: {\n label: ['comments label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'hidden',\n position: 'hoist',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/comment-toolbar`,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(Obj.getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();\n }),\n Option.map((object) => {\n const selectionManager = context.getCapability(AttentionCapabilities.Selection);\n const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};\n const disabled = get(\n rxFromSignal(() => {\n const metadata = resolve(Obj.getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);\n const anchor = getAnchor(selection);\n const invalidSelection = !anchor;\n const overlappingComment = toolbar[fullyQualifiedId(object)];\n return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;\n }),\n );\n\n return [\n {\n id: `${fullyQualifiedId(object)}/comment`,\n data: () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const metadata = resolve(Obj.getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object));\n // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.\n // Requires all components which support selection (e.g. table/kanban) to support anchored comments.\n const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();\n const name = metadata.getAnchorLabel?.(object, anchor);\n void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));\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 Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAIA,SAASA,UAAU;AACnB,SAASC,QAAQC,YAAY;AAE7B,SAASC,cAAcC,aAAaC,oBAAwC;AAC5E,SAASC,WAAW;AACpB,SAASC,6BAA6B;AACtC,SAASC,sBAAsBC,2BAA2BC,2BAA2B;AACrF,SAASC,iBAAiBC,SAASC,oBAAoB;AACvD,SAASC,wBAAwB;AAOjC,IAAA,4BAAe,CAACC,YAAAA;AACd,QAAMC,UAAU,CAACC,aACfF,QAAQG,gBAAgBC,aAAaC,QAAQ,EAAEC,KAAK,CAAC,EAAEC,GAAE,MAAOA,OAAOL,QAAAA,GAAWM,YAAY,CAAC;AAEjG,SAAOC,YAAYL,aAAaM,iBAAiB;IAC/CC,gBAAgB;MACdJ,IAAI,GAAGK,aAAAA;MACPC,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKP,OAAOc,UAAUF,OAAOG,KAAKR,KAAAA,IAAQK,OAAOI,KAAI,CAAA,GAC/EJ,OAAOK,IAAI,CAACV,UAAAA;AACV,cAAM,CAACW,IAAAA,IAAQR,IAAIjB,QAAQ0B,aAAaC,mBAAmBC,WAAW,CAAA;AACtE,eAAOX,IACLY,aAAa,MACXJ,MAAMK,SACF;UACE;YACEvB,IAAI,GAAGO,MAAKP,EAAE,GAAGwB,yBAAAA;YACjBC,MAAMC;YACNC,MAAM;YACNC,YAAY;cACVC,OAAO;gBAAC;gBAAoB;kBAAEC,IAAIzB;gBAAc;;cAChD0B,MAAM;cACNC,UAAU;cACVC,aAAa;YACf;UACF;YAEF,CAAA,CAAE,CAAA;MAGZ,CAAA,GACArB,OAAOsB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;IAGjC,CAAA;;;IAGA9B,gBAAgB;MACdJ,IAAI,GAAGK,aAAAA;MACPC,WAAW,CAACC,SAAAA;AACV,eAAOC,GAAGC,KAAK,CAACC,QAAAA;AACd,iBAAOC,KACLD,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAU4B,IAAIC,WAAWC,aAAa9B,MAAKoB,IAAI,IAAIf,OAAOG,KAAKR,MAAKoB,IAAI,IAAIf,OAAOI,KAAI,CAAA,GACvGJ,OAAOK,IAAI,CAACqB,YAAAA;AACV,kBAAMC,cAAc9C,QAAQ+C,cAAcpB,mBAAmBC,WAAW;AACxE,kBAAME,SAASb,IACbY,aAAa,MAAMiB,YAAYhB,UAAUgB,YAAYE,WAAWC,iBAAiBJ,OAAAA,CAAAA,CAAAA;AAEnF,gBAAI,CAACf,QAAQ;AACX,qBAAO,CAAA;YACT;AAEA,mBAAO;cACL;gBACEvB,IAAI,GAAG0C,iBAAiBJ,OAAAA,CAAAA,GAAWd,yBAAAA;gBACnCC,MAAMkB;gBACNhB,MAAM;gBACNC,YAAY;kBACVC,OAAO;oBAAC;oBAA2B;sBAAEC,IAAIzB;oBAAc;;kBACvD0B,MAAM;kBACNC,UAAU;kBACVC,aAAa;gBACf;cACF;;UAEJ,CAAA,GACArB,OAAOsB,UAAU,MAAM,CAAA,CAAE,CAAA;QAE7B,CAAA;MACF;IACF,CAAA;IACA9B,gBAAgB;MACdJ,IAAI,GAAG4C,KAAK5C,EAAE;MACdM,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAAA;AACd,YAAI,CAAC4B,IAAIU,SAAStC,MAAKoB,IAAI,KAAKQ,IAAIC,WAAWC,aAAa9B,MAAKoB,IAAI,GAAG;AACtE,iBAAOf,OAAOI,KAAI;QACpB;AACA,cAAMf,WAAWP,QAAQyC,IAAIW,YAAYvC,MAAKoB,IAAI,CAAA;AAClD,eAAO,OAAO1B,SAAS8C,aAAa,WAAWnC,OAAOG,KAAKR,KAAAA,IAAQK,OAAOI,KAAI;MAChF,CAAA,GACAJ,OAAOK,IAAI,CAACV,UAAS;QACnB;UACEP,IAAI;YAACO,MAAKP;YAAI;YAAYgD,KAAKxB,yBAAAA;UAC/BC,MAAMkB;UACNhB,MAAM;UACNC,YAAY;YACVC,OAAO;cAAC;cAAkB;gBAAEC,IAAIc,KAAK5C;cAAG;;YACxC+B,MAAM;YACNE,aAAa;YACbD,UAAU;UACZ;QACF;OACD,GACDpB,OAAOsB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;IAGjC,CAAA;IACA9B,gBAAgB;MACdJ,IAAI,GAAG4C,KAAK5C,EAAE;MACdiD,SAAS,CAAC1C,SACRC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAAA;AACd,YAAI,CAAC4B,IAAIU,SAAStC,MAAKoB,IAAI,KAAKQ,IAAIC,WAAWC,aAAa9B,MAAKoB,IAAI,GAAG;AACtE,iBAAOf,OAAOI,KAAI;QACpB;AACA,cAAMf,WAAWP,QAAQyC,IAAIW,YAAYvC,MAAKoB,IAAI,CAAA;AAClD,eAAO,OAAO1B,SAAS8C,aAAa,WAAWnC,OAAOG,KAAKR,MAAKoB,IAAI,IAAIf,OAAOI,KAAI;MACrF,CAAA,GACAJ,OAAOK,IAAI,CAACiC,WAAAA;AACV,cAAMC,mBAAmB1D,QAAQ+C,cAAcY,sBAAsBC,SAAS;AAC9E,cAAMC,UAAU5C,IAAIjB,QAAQ0B,aAAaC,mBAAmBmC,KAAK,CAAA,EAAG,CAAA,GAAIC,MAAMF,WAAW,CAAC;AAC1F,cAAMG,WAAW/C,IACfY,aAAa,MAAA;AACX,gBAAMrB,WAAWP,QAAQyC,IAAIW,YAAYI,MAAAA,CAAAA;AACzC,gBAAMQ,YAAYP,iBAAiBQ,aAAajB,iBAAiBQ,MAAAA,GAASjD,SAAS2D,aAAa;AAChG,gBAAMC,SAASC,UAAUJ,SAAAA;AACzB,gBAAMK,mBAAmB,CAACF;AAC1B,gBAAMG,qBAAqBV,QAAQZ,iBAAiBQ,MAAAA,CAAAA;AACpD,iBAAQjD,SAAS8C,aAAa,cAAcgB,oBAAqBC;QACnE,CAAA,CAAA;AAGF,eAAO;UACL;YACEhE,IAAI,GAAG0C,iBAAiBQ,MAAAA,CAAAA;YACxBvB,MAAM,MAAA;AACJ,oBAAM,EAAEsC,iBAAiBC,SAAQ,IAAKzE,QAAQ+C,cAAc3C,aAAasE,gBAAgB;AACzF,oBAAMlE,WAAWP,QAAQyC,IAAIW,YAAYI,MAAAA,CAAAA;AACzC,oBAAMQ,YAAYP,iBAAiBQ,aAAajB,iBAAiBQ,MAAAA,CAAAA;AAGjE,oBAAMW,SAAS5D,SAAS8C,aAAa,aAAae,UAAUJ,SAAAA,IAAaU,KAAKC,IAAG,EAAGC,SAAQ;AAC5F,oBAAMC,OAAOtE,SAASuE,iBAAiBtB,QAAQW,MAAAA;AAC/C,mBAAKK,SAASO,aAAaC,aAAaC,QAAQ;gBAAEd;gBAAQU;gBAAMK,SAAS1B;cAAO,CAAA,CAAA;YAClF;YACAtB,YAAY;cACVC,OAAO;gBAAC;gBAAqB;kBAAEC,IAAIc,KAAK5C;gBAAG;;cAC3C+B,MAAM;cACNE,aAAa;cACbwB;cACAoB,QAAQ;YACV;UACF;;MAEJ,CAAA,GACAjE,OAAOsB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;IAGjC,CAAA;GACD;AACH;",
6
+ "names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "createIntent", "Obj", "AttentionCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "createExtension", "ROOT_ID", "rxFromSignal", "fullyQualifiedId", "context", "resolve", "typename", "getCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "call", "capabilities", "ThreadCapabilities", "CallManager", "rxFromSignal", "joined", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "position", "disposition", "getOrElse", "Obj", "instanceOf", "ChannelType", "channel", "callManager", "getCapability", "roomId", "fullyQualifiedId", "PLANK_COMPANION_TYPE", "meta", "isObject", "getTypename", "comments", "join", "actions", "object", "selectionManager", "AttentionCapabilities", "Selection", "toolbar", "State", "state", "disabled", "selection", "getSelection", "selectionMode", "anchor", "getAnchor", "invalidSelection", "overlappingComment", "dispatchPromise", "dispatch", "IntentDispatcher", "Date", "now", "toString", "name", "getAnchorLabel", "createIntent", "ThreadAction", "Create", "subject", "testId"]
7
+ }
@@ -0,0 +1,21 @@
1
+ // packages/plugins/plugin-thread/src/capabilities/index.ts
2
+ import { lazy } from "@dxos/app-framework";
3
+ var AppGraphBuilder = lazy(() => import("./app-graph-builder-OY7R7EJP.mjs"));
4
+ var CallManager = lazy(() => import("./call-manager-APQAZWHT.mjs"));
5
+ var IntentResolver = lazy(() => import("./intent-resolver-FK2MDVDT.mjs"));
6
+ var Markdown = lazy(() => import("./markdown-TE5SWWNJ.mjs"));
7
+ var ReactRoot = lazy(() => import("./react-root-NK3A4VG7.mjs"));
8
+ var ReactSurface = lazy(() => import("./react-surface-VXUJKSOG.mjs"));
9
+ var ThreadSettings = lazy(() => import("./settings-RB2RSLXV.mjs"));
10
+ var ThreadState = lazy(() => import("./state-RKL5MSDP.mjs"));
11
+
12
+ export {
13
+ AppGraphBuilder,
14
+ CallManager,
15
+ IntentResolver,
16
+ Markdown,
17
+ ReactRoot,
18
+ ReactSurface,
19
+ ThreadState
20
+ };
21
+ //# sourceMappingURL=chunk-6NBVNXTM.mjs.map
@@ -7,7 +7,7 @@ import { Schema } from "effect";
7
7
  import { Type } from "@dxos/echo";
8
8
  import { DataType } from "@dxos/schema";
9
9
  var ThreadStatus = Schema.Union(Schema.Literal("staged"), Schema.Literal("active"), Schema.Literal("resolved"));
10
- var ThreadType = Schema.Struct({
10
+ var _ThreadType = Schema.Struct({
11
11
  name: Schema.optional(Schema.String),
12
12
  status: Schema.optional(ThreadStatus),
13
13
  messages: Schema.mutable(Schema.Array(Type.Ref(DataType.Message)))
@@ -15,7 +15,8 @@ var ThreadType = Schema.Struct({
15
15
  typename: "dxos.org/type/Thread",
16
16
  version: "0.1.0"
17
17
  }));
18
- var ChannelType = Schema.Struct({
18
+ var ThreadType = _ThreadType;
19
+ var _ChannelType = Schema.Struct({
19
20
  name: Schema.optional(Schema.String),
20
21
  defaultThread: Type.Ref(ThreadType),
21
22
  // TODO(wittjosiah): Should be an "ordered collection".
@@ -24,6 +25,7 @@ var ChannelType = Schema.Struct({
24
25
  typename: "dxos.org/type/Channel",
25
26
  version: "0.1.0"
26
27
  }));
28
+ var ChannelType = _ChannelType;
27
29
 
28
30
  // packages/plugins/plugin-thread/src/types/types.ts
29
31
  import { Schema as Schema2 } from "effect";
@@ -123,4 +125,4 @@ export {
123
125
  ThreadSettingsSchema,
124
126
  ThreadAction
125
127
  };
126
- //# sourceMappingURL=chunk-WDOQXTI2.mjs.map
128
+ //# sourceMappingURL=chunk-AEXWNS6Z.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { Type } from '@dxos/echo';\nimport { DataType } from '@dxos/schema';\n\nexport const ThreadStatus = Schema.Union(\n Schema.Literal('staged'),\n Schema.Literal('active'),\n Schema.Literal('resolved'),\n);\n\nconst _ThreadType = Schema.Struct({\n name: Schema.optional(Schema.String),\n status: Schema.optional(ThreadStatus),\n messages: Schema.mutable(Schema.Array(Type.Ref(DataType.Message))),\n}).pipe(Type.Obj({ typename: 'dxos.org/type/Thread', version: '0.1.0' }));\nexport interface ThreadType extends Schema.Schema.Type<typeof _ThreadType> {}\nexport const ThreadType: Type.obj<Schema.Schema<ThreadType, Schema.Schema.Encoded<typeof _ThreadType>, never>> =\n _ThreadType;\n\nconst _ChannelType = Schema.Struct({\n name: Schema.optional(Schema.String),\n defaultThread: Type.Ref(ThreadType),\n // TODO(wittjosiah): Should be an \"ordered collection\".\n threads: Schema.mutable(Schema.Array(Type.Ref(ThreadType))),\n}).pipe(Type.Obj({ typename: 'dxos.org/type/Channel', version: '0.1.0' }));\nexport interface ChannelType extends Schema.Schema.Type<typeof _ChannelType> {}\nexport const ChannelType: Type.obj<Schema.Schema<ChannelType, Schema.Schema.Encoded<typeof _ChannelType>, never>> =\n _ChannelType;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { Type } from '@dxos/echo';\nimport { EchoObjectSchema } from '@dxos/react-client/echo';\nimport { AnchoredTo, DataType } from '@dxos/schema';\n\nimport { ChannelType, ThreadType } from './schema';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport namespace ThreadAction {\n const THREAD_ACTION = `${THREAD_PLUGIN}/action`;\n\n export class CreateChannel extends Schema.TaggedClass<CreateChannel>()(`${THREAD_ACTION}/create-channel`, {\n input: Schema.Struct({\n spaceId: Type.SpaceId,\n name: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: ChannelType,\n }),\n }) {}\n\n export class CreateChannelThread extends Schema.TaggedClass<CreateChannelThread>()(\n `${THREAD_ACTION}/create-channel-thread`,\n {\n input: Schema.Struct({\n channel: ChannelType,\n }),\n output: Schema.Struct({\n object: ThreadType,\n }),\n },\n ) {}\n\n export class Create extends Schema.TaggedClass<Create>()(`${THREAD_ACTION}/create`, {\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n anchor: Schema.optional(Schema.String),\n subject: EchoObjectSchema,\n }),\n output: Schema.Void,\n }) {}\n\n export class Delete extends Schema.TaggedClass<Delete>()(`${THREAD_ACTION}/delete`, {\n input: Schema.Struct({\n anchor: AnchoredTo,\n subject: EchoObjectSchema,\n thread: Schema.optional(ThreadType),\n }),\n output: Schema.Void,\n }) {}\n\n export class Select extends Schema.TaggedClass<Select>()(`${THREAD_ACTION}/select`, {\n input: Schema.Struct({\n current: Schema.String,\n }),\n output: Schema.Void,\n }) {}\n\n export class ToggleResolved extends Schema.TaggedClass<ToggleResolved>()(`${THREAD_ACTION}/toggle-resolved`, {\n input: Schema.Struct({\n thread: ThreadType,\n }),\n output: Schema.Void,\n }) {}\n\n export class AddMessage extends Schema.TaggedClass<AddMessage>()(`${THREAD_ACTION}/add-message`, {\n input: Schema.Struct({\n subject: EchoObjectSchema,\n anchor: AnchoredTo,\n sender: DataType.Actor,\n text: Schema.String,\n }),\n output: Schema.Void,\n }) {}\n\n export class DeleteMessage extends Schema.TaggedClass<DeleteMessage>()(`${THREAD_ACTION}/delete-message`, {\n input: Schema.Struct({\n anchor: AnchoredTo,\n subject: EchoObjectSchema,\n messageId: Schema.String,\n message: Schema.optional(DataType.Message),\n messageIndex: Schema.optional(Schema.Number),\n }),\n output: Schema.Void,\n }) {}\n}\n\nexport const ThreadSettingsSchema = Schema.mutable(Schema.Struct({}));\nexport type ThreadSettingsProps = Schema.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 /** Object toolbar state. */\n toolbar: Record<string, boolean>;\n /** In-memory draft threads. */\n drafts: Record<string, AnchoredTo[]>;\n current?: string | undefined;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "Type", "DataType", "ThreadStatus", "Schema", "Union", "Literal", "_ThreadType", "Struct", "name", "optional", "String", "status", "messages", "mutable", "Array", "Type", "Ref", "DataType", "Message", "pipe", "Obj", "typename", "version", "ThreadType", "_ChannelType", "defaultThread", "threads", "ChannelType", "Schema", "Type", "EchoObjectSchema", "AnchoredTo", "DataType", "ThreadAction", "THREAD_ACTION", "THREAD_PLUGIN", "CreateChannel", "Schema", "TaggedClass", "input", "Struct", "spaceId", "Type", "SpaceId", "name", "optional", "String", "output", "object", "ChannelType", "CreateChannelThread", "channel", "ThreadType", "Create", "anchor", "subject", "EchoObjectSchema", "Void", "Delete", "AnchoredTo", "thread", "Select", "current", "ToggleResolved", "AddMessage", "sender", "DataType", "Actor", "text", "DeleteMessage", "messageId", "message", "Message", "messageIndex", "Number", "ThreadSettingsSchema", "mutable"]
7
+ }
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  ThreadAction,
3
3
  ThreadType
4
- } from "./chunk-WDOQXTI2.mjs";
4
+ } from "./chunk-AEXWNS6Z.mjs";
5
5
  import {
6
6
  ChannelContainer
7
- } from "./chunk-5PGLGDIP.mjs";
7
+ } from "./chunk-XZKBN3NS.mjs";
8
8
  import {
9
9
  ThreadCapabilities
10
10
  } from "./chunk-R5MDLUPC.mjs";
11
11
  import {
12
12
  MessageContainer,
13
13
  command
14
- } from "./chunk-G3TS64FP.mjs";
14
+ } from "./chunk-TAFSCSUR.mjs";
15
15
  import {
16
16
  useStatus
17
17
  } from "./chunk-5P5BH5GE.mjs";
@@ -158,11 +158,11 @@ var CallSidebar = () => {
158
158
  // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
159
159
  import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
160
160
  import React6, { useCallback as useCallback2, useMemo as useMemo3 } from "react";
161
- import { createIntent, LayoutAction, useCapability as useCapability2, useCapabilities, useIntentDispatcher, Capabilities } from "@dxos/app-framework";
162
- import { Filter, getTypename, isInstanceOf, Query, RelationSourceId as RelationSourceId3 } from "@dxos/echo-schema";
161
+ import { Capabilities, LayoutAction, createIntent, useCapability as useCapability2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
162
+ import { Filter, Obj, Query, Relation as Relation3 } from "@dxos/echo";
163
163
  import { fullyQualifiedId as fullyQualifiedId3, getSpace as getSpace2, useQuery } from "@dxos/react-client/echo";
164
164
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
165
- import { useTranslation as useTranslation4 } from "@dxos/react-ui";
165
+ import { useThemeContext as useThemeContext2, useTranslation as useTranslation4 } from "@dxos/react-ui";
166
166
  import { useAttended } from "@dxos/react-ui-attention";
167
167
  import { StackItem } from "@dxos/react-ui-stack";
168
168
  import { Tabs } from "@dxos/react-ui-tabs";
@@ -175,7 +175,7 @@ import { lazy } from "react";
175
175
  import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
176
176
  import { CheckCircle, X } from "@phosphor-icons/react";
177
177
  import React3, { useCallback, useMemo as useMemo2, useRef, useState as useState2 } from "react";
178
- import { RelationSourceId } from "@dxos/echo-schema";
178
+ import { Relation } from "@dxos/echo";
179
179
  import { RefArray } from "@dxos/live-object";
180
180
  import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
181
181
  import { useIdentity } from "@dxos/react-client/halo";
@@ -246,7 +246,7 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
246
246
  const space = getSpace(anchor);
247
247
  const members = useMembers(space?.key);
248
248
  const detached = !anchor.anchor;
249
- const thread = anchor[RelationSourceId];
249
+ const thread = Relation.getSource(anchor);
250
250
  const activity = useStatus(space, fullyQualifiedId(thread));
251
251
  const { t } = useTranslation2(THREAD_PLUGIN);
252
252
  const threadScrollRef = useRef(null);
@@ -349,18 +349,16 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
349
349
 
350
350
  // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
351
351
  import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
352
- import { ChatText } from "@phosphor-icons/react";
353
352
  import React4, { useEffect as useEffect2 } from "react";
354
- import { RelationSourceId as RelationSourceId2 } from "@dxos/echo-schema";
353
+ import { Relation as Relation2 } from "@dxos/echo";
355
354
  import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
356
- import { useTranslation as useTranslation3, Trans } from "@dxos/react-ui";
357
- import { descriptionMessage, mx as mx2 } from "@dxos/react-ui-theme";
355
+ import { Callout, Icon, Trans, useTranslation as useTranslation3 } from "@dxos/react-ui";
358
356
  var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }) => {
359
357
  var _effect = _useSignals4();
360
358
  try {
361
359
  const { t } = useTranslation3(THREAD_PLUGIN);
362
- const filteredAnchors = showResolvedThreads ? anchors.filter((anchor) => !!anchor[RelationSourceId2]) : anchors.filter((anchor) => {
363
- const thread = anchor[RelationSourceId2];
360
+ const filteredAnchors = showResolvedThreads ? anchors.filter((anchor) => !!Relation2.getSource(anchor)) : anchors.filter((anchor) => {
361
+ const thread = Relation2.getSource(anchor);
364
362
  return thread && thread.status !== "resolved";
365
363
  });
366
364
  useEffect2(() => {
@@ -373,8 +371,24 @@ var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props })
373
371
  }, [
374
372
  currentId
375
373
  ]);
376
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, filteredAnchors.length > 0 ? filteredAnchors.map((anchor) => {
377
- const thread = anchor[RelationSourceId2];
374
+ if (filteredAnchors.length === 0) {
375
+ return /* @__PURE__ */ React4.createElement("div", {
376
+ role: "none",
377
+ className: "plb-cardSpacingBlock pli-cardSpacingInline"
378
+ }, /* @__PURE__ */ React4.createElement(Callout.Root, null, /* @__PURE__ */ React4.createElement(Callout.Title, null, /* @__PURE__ */ React4.createElement(Trans, {
379
+ t,
380
+ i18nKey: "no comments message",
381
+ components: {
382
+ commentIcon: /* @__PURE__ */ React4.createElement(Icon, {
383
+ icon: "ph--chat-text--regular",
384
+ size: 4,
385
+ classNames: "inline-block"
386
+ })
387
+ }
388
+ }))));
389
+ }
390
+ return filteredAnchors.map((anchor) => {
391
+ const thread = Relation2.getSource(anchor);
378
392
  const threadId = fullyQualifiedId2(thread);
379
393
  return /* @__PURE__ */ React4.createElement(CommentContainer, {
380
394
  key: threadId,
@@ -382,20 +396,7 @@ var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props })
382
396
  current: currentId === threadId,
383
397
  ...props
384
398
  });
385
- }) : /* @__PURE__ */ React4.createElement("div", {
386
- role: "alert",
387
- className: mx2(descriptionMessage, "place-self-center rounded-lg text-center m-4")
388
- }, /* @__PURE__ */ React4.createElement("h2", {
389
- className: "mbe-2 font-medium text-baseText"
390
- }, t("no comments title")), /* @__PURE__ */ React4.createElement("p", null, /* @__PURE__ */ React4.createElement(Trans, {
391
- t,
392
- i18nKey: "no comments message",
393
- components: {
394
- commentIcon: /* @__PURE__ */ React4.createElement(ChatText, {
395
- className: "inline-block"
396
- })
397
- }
398
- }))));
399
+ });
399
400
  } finally {
400
401
  _effect.f();
401
402
  }
@@ -415,8 +416,8 @@ var ThreadSettings = ({ settings }) => {
415
416
  };
416
417
 
417
418
  // packages/plugins/plugin-thread/src/components/index.ts
418
- var ChannelContainer2 = lazy(() => import("./ChannelContainer-LGYSQMC7.mjs"));
419
- var ChatContainer = lazy(() => import("./ChatContainer-JWRI73OG.mjs"));
419
+ var ChannelContainer2 = lazy(() => import("./ChannelContainer-PKFBVENP.mjs"));
420
+ var ChatContainer = lazy(() => import("./ChatContainer-RSOKYAMK.mjs"));
420
421
 
421
422
  // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
422
423
  var ThreadComplementary = ({ subject }) => {
@@ -425,27 +426,31 @@ var ThreadComplementary = ({ subject }) => {
425
426
  const { dispatchPromise: dispatch } = useIntentDispatcher();
426
427
  const identity = useIdentity2();
427
428
  const { t } = useTranslation4(THREAD_PLUGIN);
429
+ const { tx } = useThemeContext2();
430
+ const subjectId = fullyQualifiedId3(subject);
428
431
  const { state, getViewState } = useCapability2(ThreadCapabilities.MutableState);
429
- const viewState = getViewState(fullyQualifiedId3(subject));
432
+ const drafts = state.drafts[subjectId];
433
+ const viewState = useMemo3(() => getViewState(subjectId), [
434
+ getViewState,
435
+ subjectId
436
+ ]);
430
437
  const { showResolvedThreads } = viewState;
431
438
  const onChangeViewState = useCallback2((nextValue) => {
432
439
  viewState.showResolvedThreads = nextValue === "all";
433
440
  }, [
434
441
  viewState
435
442
  ]);
436
- const drafts = state.drafts[fullyQualifiedId3(subject)];
437
443
  const anchorSorts = useCapabilities(Capabilities.AnchorSort);
438
- const sort = useMemo3(() => anchorSorts.find(({ key }) => key === getTypename(subject))?.sort, [
444
+ const sort = useMemo3(() => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort, [
439
445
  anchorSorts,
440
446
  subject
441
447
  ]);
442
448
  const space = getSpace2(subject);
443
449
  const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
444
- const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => isInstanceOf(ThreadType, anchor[RelationSourceId3])).concat(drafts ?? []);
450
+ const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => Obj.instanceOf(ThreadType, Relation3.getSource(anchor))).concat(drafts ?? []);
445
451
  const attended = useAttended();
446
- const qualifiedSubjectId = fullyQualifiedId3(subject);
447
452
  const handleAttend = useCallback2((anchor) => {
448
- const thread = anchor[RelationSourceId3];
453
+ const thread = Relation3.getSource(anchor);
449
454
  const threadId = fullyQualifiedId3(thread);
450
455
  if (state.current !== threadId) {
451
456
  state.current = threadId;
@@ -472,7 +477,7 @@ var ThreadComplementary = ({ subject }) => {
472
477
  },
473
478
  text
474
479
  }));
475
- const thread = anchor[RelationSourceId3];
480
+ const thread = Relation3.getSource(anchor);
476
481
  state.current = fullyQualifiedId3(thread);
477
482
  }, [
478
483
  dispatch,
@@ -480,7 +485,7 @@ var ThreadComplementary = ({ subject }) => {
480
485
  subject
481
486
  ]);
482
487
  const handleResolve = useCallback2((anchor) => dispatch(createIntent(ThreadAction.ToggleResolved, {
483
- thread: anchor[RelationSourceId3]
488
+ thread: Relation3.getSource(anchor)
484
489
  })), [
485
490
  dispatch
486
491
  ]);
@@ -501,7 +506,7 @@ var ThreadComplementary = ({ subject }) => {
501
506
  ]);
502
507
  const comments = /* @__PURE__ */ React6.createElement(CommentsContainer, {
503
508
  anchors,
504
- currentId: attended.includes(qualifiedSubjectId) ? state.current : void 0,
509
+ currentId: attended.includes(subjectId) ? state.current : void 0,
505
510
  showResolvedThreads,
506
511
  onAttend: handleAttend,
507
512
  onComment: handleComment,
@@ -513,11 +518,11 @@ var ThreadComplementary = ({ subject }) => {
513
518
  toolbar: true
514
519
  }, /* @__PURE__ */ React6.createElement(Tabs.Root, {
515
520
  value: showResolvedThreads ? "all" : "unresolved",
516
- onValueChange: onChangeViewState,
517
521
  orientation: "horizontal",
518
- classNames: 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
522
+ classNames: 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
523
+ onValueChange: onChangeViewState
519
524
  }, /* @__PURE__ */ React6.createElement(Tabs.Tablist, {
520
- classNames: "p-1 gap-1 bs-[--rail-action] border-be border-separator"
525
+ classNames: tx("toolbar.root", "toolbar", {})
521
526
  }, /* @__PURE__ */ React6.createElement(Tabs.Tab, {
522
527
  value: "unresolved",
523
528
  classNames: "text-sm"
@@ -542,4 +547,4 @@ export {
542
547
  ChannelContainer2 as ChannelContainer,
543
548
  ChatContainer
544
549
  };
545
- //# sourceMappingURL=chunk-KMVGJG23.mjs.map
550
+ //# sourceMappingURL=chunk-PG5CTFKK.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/CallDebugPanel.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\n\nimport { type GlobalState } from '../calls';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{\n state?: GlobalState;\n}>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const users = state?.call?.users;\n const self = state?.call?.self;\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n\n const [stats, setStats] = useState<Record<string, any>>({});\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: Record<string, any>) => setStats(stats.data);\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n maxHeight={false}\n info={\n <div className='flex items-center gap-2'>\n <span title='Joined'>{self?.joined ? 'Active' : 'Inactive'}</span>\n {users?.length !== undefined && <span title='Users'>{users?.length ?? 0} User(s)</span>}\n </div>\n }\n >\n <div className='flex flex-col gap-2 overflow-y-auto'>\n <div className='flex items-row gap-2'>\n <Input.Root>\n <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>\n <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n </Input.Root>\n </div>\n <Json\n classNames='text-sm'\n data={{\n users,\n activities: state?.call?.activities,\n ...(showDetailedWebRTCStats\n ? {\n webrtc: {\n connectionState: state?.media.peer?.session?.peerConnection.connectionState,\n iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,\n stats,\n },\n }\n : {}),\n tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {\n const track =\n transceiver.direction === 'recvonly' ? transceiver.receiver.track : transceiver.sender.track;\n return {\n id: track?.id,\n kind: track?.kind,\n direction: transceiver.direction,\n enabled: track?.enabled,\n muted: track?.muted,\n readyState: track?.readyState,\n settings: track?.getSettings(),\n };\n }),\n callsServiceHistory: state?.media.peer?.history.get(),\n }}\n />\n </div>\n </Panel>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { ChannelContainer } from './ChannelContainer';\nimport { ThreadCapabilities } from '../capabilities';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n return <ChannelContainer roomId={call.roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Capabilities,\n LayoutAction,\n createIntent,\n useCapability,\n useCapabilities,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction, ThreadType } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { t } = useTranslation(THREAD_PLUGIN);\n const { tx } = useThemeContext();\n const subjectId = fullyQualifiedId(subject);\n\n const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);\n const drafts = state.drafts[subjectId];\n const viewState = useMemo(() => getViewState(subjectId), [getViewState, subjectId]);\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n\n const anchorSorts = useCapabilities(Capabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const space = getSpace(subject);\n const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(ThreadType, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const threadId = fullyQualifiedId(thread);\n\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: anchor.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo, text: string) => {\n await dispatch(\n createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),\n );\n\n const thread = Relation.getSource(anchor) as ThreadType;\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo) =>\n dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as ThreadType })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(subjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n />\n );\n\n return (\n <StackItem.Content toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n orientation='horizontal'\n classNames='contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin'\n onValueChange={onChangeViewState}\n >\n <Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </Tabs.Root>\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChannelContainer = lazy(() => import('./ChannelContainer'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './Call';\nexport * from './CallDebugPanel';\nexport * from './CallSidebar';\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Relation } from '@dxos/echo';\nimport { RefArray } from '@dxos/live-object';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n ThreadFooter,\n ThreadHeading,\n type ThreadProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\n\n// TODO(thure): #8149\nconst commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={[commentControlClassNames, hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nexport type CommentContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadProps, 'current'>;\n\nexport const CommentContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n ) : (\n <ThreadHeading>{thread.name}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}\n </div>\n </div>\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n />\n ))}\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Relation } from '@dxos/echo';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo } from '@dxos/schema';\n\nimport { CommentContainer, type CommentContainerProps } from './CommentContainer';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\n\nexport type ThreadsContainerProps = Omit<CommentContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>\n <Callout.Root>\n <Callout.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,\n },\n }}\n />\n </Callout.Title>\n </Callout.Root>\n </div>\n );\n }\n\n return filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const threadId = fullyQualifiedId(thread);\n return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// import { useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\n// import { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n // const { t } = useTranslation(THREAD_PLUGIN);\n\n return <DeprecatedFormContainer></DeprecatedFormContainer>;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["WebRTCStats", "React", "useEffect", "useMemo", "useState", "Panel", "log", "Input", "useTranslation", "Json", "CallDebugPanel", "state", "users", "call", "self", "t", "useTranslation", "THREAD_PLUGIN", "open", "setOpen", "useState", "handleToggle", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "stats", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "Panel", "id", "icon", "onToggle", "title", "maxHeight", "info", "div", "className", "span", "joined", "length", "undefined", "Input", "Root", "Label", "classNames", "Checkbox", "checked", "onCheckedChange", "Json", "activities", "webrtc", "connectionState", "iceConnectionState", "tracks", "getTransceivers", "map", "transceiver", "track", "direction", "receiver", "sender", "kind", "enabled", "muted", "readyState", "settings", "getSettings", "callsServiceHistory", "history", "get", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "React", "ChannelContainer", "roomId", "React", "useCallback", "useMemo", "Capabilities", "LayoutAction", "createIntent", "useCapability", "useCapabilities", "useIntentDispatcher", "Filter", "Obj", "Query", "Relation", "fullyQualifiedId", "getSpace", "useQuery", "useIdentity", "useThemeContext", "useTranslation", "useAttended", "StackItem", "Tabs", "AnchoredTo", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "Relation", "RefArray", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "isNonNullable", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "anchor", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "id", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "side", "ThreadHeading", "name", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "MessageTextbox", "onSend", "ThreadFooter", "ref", "React", "useEffect", "Relation", "fullyQualifiedId", "Callout", "Icon", "Trans", "useTranslation", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Callout", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "React", "DeprecatedFormContainer", "ThreadSettings", "settings", "React", "DeprecatedFormContainer", "ChannelContainer", "lazy", "ChatContainer", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "t", "useTranslation", "THREAD_PLUGIN", "tx", "useThemeContext", "subjectId", "fullyQualifiedId", "state", "getViewState", "useCapability", "ThreadCapabilities", "MutableState", "drafts", "viewState", "useMemo", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "anchorSorts", "useCapabilities", "Capabilities", "AnchorSort", "sort", "find", "key", "Obj", "getTypename", "space", "getSpace", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "id", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "ThreadType", "Relation", "getSource", "concat", "attended", "useAttended", "handleAttend", "thread", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "text", "ThreadAction", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "StackItem", "Content", "toolbar", "Tabs", "Root", "value", "orientation", "classNames", "onValueChange", "Tablist", "Tab", "Tabpanel"]
7
+ }
@@ -12,7 +12,7 @@ import {
12
12
  // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
13
13
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
14
14
  import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState2 } from "react";
15
- import { live, makeRef } from "@dxos/live-object";
15
+ import { Obj, Ref } from "@dxos/echo";
16
16
  import { fullyQualifiedId, useMembers } from "@dxos/react-client/echo";
17
17
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
18
18
  import { Icon, ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
@@ -287,7 +287,7 @@ var ChatContainer = ({ space, thread, context, current, autoFocusTextbox }) => {
287
287
  if (!messageRef.current?.length) {
288
288
  return false;
289
289
  }
290
- thread.messages.push(makeRef(live(DataType.Message, {
290
+ thread.messages.push(Ref.make(Obj.make(DataType.Message, {
291
291
  sender: {
292
292
  identityDid: identity.did
293
293
  },
@@ -299,7 +299,7 @@ var ChatContainer = ({ space, thread, context, current, autoFocusTextbox }) => {
299
299
  }
300
300
  ],
301
301
  properties: context ? {
302
- context: makeRef(context)
302
+ context: Ref.make(context)
303
303
  } : void 0
304
304
  })));
305
305
  messageRef.current = "";
@@ -348,4 +348,4 @@ export {
348
348
  ChatContainer,
349
349
  ChatContainer_default
350
350
  };
351
- //# sourceMappingURL=chunk-G3TS64FP.mjs.map
351
+ //# sourceMappingURL=chunk-TAFSCSUR.mjs.map