@dxos/plugin-thread 0.7.5-main.9d26e3a → 0.7.5-main.e9bb01b

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 (185) hide show
  1. package/dist/lib/browser/ThreadContainer-OI5M262D.mjs +19 -0
  2. package/dist/lib/browser/ThreadContainer-OI5M262D.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-builder-Q7A2ZRUA.mjs +121 -0
  4. package/dist/lib/browser/app-graph-builder-Q7A2ZRUA.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-BD3J6HEY.mjs +18 -0
  8. package/dist/lib/browser/chunk-BD3J6HEY.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BNEWNQBO.mjs +71 -0
  10. package/dist/lib/browser/chunk-BNEWNQBO.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-OD2IZKRP.mjs → chunk-GQVZK3BQ.mjs} +21 -87
  12. package/dist/lib/browser/chunk-GQVZK3BQ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-NAO3LZMZ.mjs +16 -0
  14. package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-6KTMQPL4.mjs → chunk-NO5AZLUZ.mjs} +7 -3
  16. package/dist/lib/browser/chunk-NO5AZLUZ.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +149 -939
  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-PXYCYPWA.mjs +410 -0
  25. package/dist/lib/browser/react-surface-PXYCYPWA.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-ZCNMFBAO.cjs → ThreadContainer-L6TPQJWA.cjs} +14 -13
  32. package/dist/lib/node/ThreadContainer-L6TPQJWA.cjs.map +7 -0
  33. package/dist/lib/node/app-graph-builder-ZXW5KUDK.cjs +135 -0
  34. package/dist/lib/node/app-graph-builder-ZXW5KUDK.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-2CB5AVBL.cjs → chunk-2TK6J6BN.cjs} +70 -138
  36. package/dist/lib/node/chunk-2TK6J6BN.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-VW2P26MZ.cjs → chunk-AUVKOX5Q.cjs} +13 -8
  38. package/dist/lib/node/chunk-AUVKOX5Q.cjs.map +7 -0
  39. package/dist/lib/node/chunk-AWSTZ2KN.cjs +93 -0
  40. package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-IC2NICNC.cjs → chunk-F735VMTN.cjs} +7 -7
  42. package/dist/lib/node/chunk-F735VMTN.cjs.map +7 -0
  43. package/dist/lib/node/{meta.cjs → chunk-FPWNZ6TB.cjs} +13 -10
  44. package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +7 -0
  45. package/dist/lib/node/{ThreadMain-5AYGCXXP.cjs → chunk-S5LH7AIT.cjs} +26 -23
  46. package/dist/lib/node/chunk-S5LH7AIT.cjs.map +7 -0
  47. package/dist/lib/node/index.cjs +147 -933
  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-CPDCOLUZ.cjs +412 -0
  55. package/dist/lib/node/react-surface-CPDCOLUZ.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-HE46AQJH.mjs +20 -0
  63. package/dist/lib/node-esm/ThreadContainer-HE46AQJH.mjs.map +7 -0
  64. package/dist/lib/node-esm/app-graph-builder-ATS6HGE6.mjs +122 -0
  65. package/dist/lib/node-esm/app-graph-builder-ATS6HGE6.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-7YYL6QVU.mjs +20 -0
  67. package/dist/lib/node-esm/chunk-7YYL6QVU.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-AQ74G3GY.mjs → chunk-AZCU7SHI.mjs} +21 -87
  69. package/dist/lib/node-esm/chunk-AZCU7SHI.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-RMYATBXM.mjs → chunk-B3CF35MY.mjs} +7 -3
  71. package/dist/lib/node-esm/chunk-B3CF35MY.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 +149 -939
  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-RD4F2LRT.mjs +411 -0
  86. package/dist/lib/node-esm/react-surface-RD4F2LRT.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/CommentContainer.d.ts +1 -1
  112. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  113. package/dist/types/src/components/CommentsContainer.d.ts +2 -7
  114. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  115. package/dist/types/src/components/ThreadComplementary.d.ts +1 -5
  116. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  117. package/dist/types/src/components/ThreadContainer.d.ts +7 -0
  118. package/dist/types/src/components/ThreadContainer.d.ts.map +1 -0
  119. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  120. package/dist/types/src/components/index.d.ts +3 -15
  121. package/dist/types/src/components/index.d.ts.map +1 -1
  122. package/dist/types/src/components/types.d.ts +5 -5
  123. package/dist/types/src/components/types.d.ts.map +1 -1
  124. package/dist/types/src/index.d.ts +1 -3
  125. package/dist/types/src/index.d.ts.map +1 -1
  126. package/dist/types/src/meta.d.ts +1 -2
  127. package/dist/types/src/meta.d.ts.map +1 -1
  128. package/dist/types/src/translations.d.ts +3 -0
  129. package/dist/types/src/translations.d.ts.map +1 -1
  130. package/dist/types/src/types.d.ts +10 -14
  131. package/dist/types/src/types.d.ts.map +1 -1
  132. package/dist/types/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +30 -38
  134. package/src/ThreadPlugin.tsx +104 -470
  135. package/src/capabilities/app-graph-builder.ts +120 -0
  136. package/src/capabilities/capabilities.ts +19 -0
  137. package/src/capabilities/index.ts +14 -0
  138. package/src/capabilities/intent-resolver.ts +239 -0
  139. package/src/capabilities/markdown.ts +18 -0
  140. package/src/capabilities/react-surface.tsx +56 -0
  141. package/src/capabilities/settings.ts +14 -0
  142. package/src/capabilities/state.ts +25 -0
  143. package/src/components/Chat.stories.tsx +25 -23
  144. package/src/components/CommentContainer.tsx +16 -30
  145. package/src/components/CommentsContainer.tsx +1 -17
  146. package/src/components/ThreadComplementary.tsx +85 -48
  147. package/src/components/ThreadContainer.tsx +22 -0
  148. package/src/components/ThreadSettings.tsx +3 -3
  149. package/src/components/command-extension.ts +2 -5
  150. package/src/components/index.ts +1 -2
  151. package/src/components/types.ts +5 -5
  152. package/src/index.ts +1 -5
  153. package/src/meta.ts +1 -1
  154. package/src/translations.ts +1 -0
  155. package/src/types.ts +10 -29
  156. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs +0 -18
  157. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs.map +0 -7
  158. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs +0 -26
  159. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-6KTMQPL4.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-ENERBDYI.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-OD2IZKRP.mjs.map +0 -7
  163. package/dist/lib/browser/meta.mjs +0 -11
  164. package/dist/lib/browser/meta.mjs.map +0 -7
  165. package/dist/lib/node/ThreadArticle-ZCNMFBAO.cjs.map +0 -7
  166. package/dist/lib/node/ThreadMain-5AYGCXXP.cjs.map +0 -7
  167. package/dist/lib/node/chunk-2CB5AVBL.cjs.map +0 -7
  168. package/dist/lib/node/chunk-IC2NICNC.cjs.map +0 -7
  169. package/dist/lib/node/chunk-VW2P26MZ.cjs.map +0 -7
  170. package/dist/lib/node/meta.cjs.map +0 -7
  171. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs +0 -19
  172. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs.map +0 -7
  173. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs +0 -27
  174. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-7QRGG25F.mjs.map +0 -7
  176. package/dist/lib/node-esm/chunk-AQ74G3GY.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-RMYATBXM.mjs.map +0 -7
  178. package/dist/lib/node-esm/meta.mjs +0 -12
  179. package/dist/lib/node-esm/meta.mjs.map +0 -7
  180. package/dist/types/src/components/ThreadArticle.d.ts +0 -5
  181. package/dist/types/src/components/ThreadArticle.d.ts.map +0 -1
  182. package/dist/types/src/components/ThreadMain.d.ts +0 -7
  183. package/dist/types/src/components/ThreadMain.d.ts.map +0 -1
  184. package/src/components/ThreadArticle.tsx +0 -18
  185. package/src/components/ThreadMain.tsx +0 -27
@@ -1,429 +1,35 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- ThreadAction
4
- } from "./chunk-RMYATBXM.mjs";
3
+ AppGraphBuilder,
4
+ IntentResolver,
5
+ Markdown,
6
+ ReactSurface,
7
+ ThreadSettings,
8
+ ThreadState
9
+ } from "./chunk-7YYL6QVU.mjs";
10
+ import "./chunk-ZJITX3TO.mjs";
5
11
  import {
6
- MessageContainer,
7
- command,
8
- getMessageMetadata,
9
12
  useAnalyticsCallback,
10
13
  useOnEditAnalytics,
11
14
  useStatus
12
- } from "./chunk-AQ74G3GY.mjs";
15
+ } from "./chunk-HLWJTUWZ.mjs";
16
+ import {
17
+ ThreadAction
18
+ } from "./chunk-B3CF35MY.mjs";
13
19
  import {
14
20
  THREAD_ITEM,
15
21
  THREAD_PLUGIN,
16
- meta_default
17
- } from "./chunk-7QRGG25F.mjs";
22
+ meta
23
+ } from "./chunk-FXUATCLW.mjs";
18
24
 
19
25
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
20
- import React5 from "react";
21
- import { createIntent as createIntent3, createResolver, createSurface, isLayoutParts, LayoutAction as LayoutAction2, NavigationAction, parseIntentPlugin, parseMetadataResolverPlugin, parseNavigationPlugin, resolvePlugin } from "@dxos/app-framework";
22
- import { Ref as Ref2 } from "@dxos/echo-schema";
23
- import { LocalStorageStore } from "@dxos/local-storage";
24
- import { log } from "@dxos/log";
25
- import { parseClientPlugin } from "@dxos/plugin-client/types";
26
- import { createExtension, toSignal } from "@dxos/plugin-graph";
27
- import { ObservabilityAction } from "@dxos/plugin-observability/types";
28
- import { memoizeQuery } from "@dxos/plugin-space";
29
- import { ChannelType as ChannelType2, MessageType as MessageType2, ThreadType as ThreadType2 } from "@dxos/plugin-space/types";
30
- import { create as create2, fullyQualifiedId as fullyQualifiedId5, getSpace as getSpace3, getTypename, makeRef as makeRef2, parseId, RefArray as RefArray4, SpaceState } from "@dxos/react-client/echo";
26
+ import { allOf, Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from "@dxos/app-framework";
27
+ import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
28
+ import { DeckCapabilities } from "@dxos/plugin-deck";
29
+ import { ChannelType as ChannelType2, MessageType, ThreadType } from "@dxos/plugin-space/types";
30
+ import { RefArray } from "@dxos/react-client/echo";
31
31
  import { translations as threadTranslations } from "@dxos/react-ui-thread";
32
32
 
33
- // packages/plugins/plugin-thread/src/components/index.ts
34
- import { lazy } from "react";
35
-
36
- // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
37
- import { CheckCircle, X } from "@phosphor-icons/react";
38
- import React, { useCallback, useMemo, useRef, useState } from "react";
39
- import { create, makeRef, RefArray } from "@dxos/live-object";
40
- import { MessageType } from "@dxos/plugin-space/types";
41
- import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
42
- import { useIdentity } from "@dxos/react-client/halo";
43
- import { Button, Tag, Tooltip, useThemeContext, useTranslation } from "@dxos/react-ui";
44
- import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
45
- import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
46
- import { MessageTextbox, Thread, ThreadFooter, ThreadHeading } from "@dxos/react-ui-thread";
47
- import { nonNullable } from "@dxos/util";
48
- var sizeClass = getSize(4);
49
- var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
50
- var ToggleResolvedButton = ({ isResolved, onResolve }) => {
51
- const { t } = useTranslation(THREAD_PLUGIN);
52
- const label = t(isResolved ? "mark as unresolved label" : "mark as resolved label");
53
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
54
- asChild: true
55
- }, /* @__PURE__ */ React.createElement(Button, {
56
- variant: "ghost",
57
- "data-testid": "thread.toggle-resolved",
58
- onClick: onResolve,
59
- classNames: [
60
- commentControlClassNames,
61
- !isResolved && hoverableControlItem
62
- ]
63
- }, /* @__PURE__ */ React.createElement("span", {
64
- className: "sr-only"
65
- }, label), isResolved ? /* @__PURE__ */ React.createElement(CheckCircle, {
66
- className: sizeClass,
67
- weight: "fill"
68
- }) : /* @__PURE__ */ React.createElement(CheckCircle, {
69
- className: sizeClass
70
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
71
- };
72
- var DeleteThreadButton = ({ onDelete }) => {
73
- const { t } = useTranslation(THREAD_PLUGIN);
74
- const label = t("delete thread label");
75
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
76
- asChild: true
77
- }, /* @__PURE__ */ React.createElement(Button, {
78
- variant: "ghost",
79
- "data-testid": "thread.delete",
80
- onClick: onDelete,
81
- classNames: [
82
- commentControlClassNames,
83
- hoverableControlItem
84
- ]
85
- }, /* @__PURE__ */ React.createElement("span", {
86
- className: "sr-only"
87
- }, label), /* @__PURE__ */ React.createElement(X, {
88
- className: sizeClass
89
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
90
- classNames: "z-30"
91
- }, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
92
- };
93
- var CommentContainer = ({ thread, detached, context, current, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
94
- const identity = useIdentity();
95
- const space = getSpace(thread);
96
- const members = useMembers(space?.key);
97
- const activity = useStatus(space, fullyQualifiedId(thread));
98
- const { t } = useTranslation(THREAD_PLUGIN);
99
- const threadScrollRef = useRef(null);
100
- const { themeMode } = useThemeContext();
101
- const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
102
- const [_count, _setCount] = useState(0);
103
- const rerenderEditor = () => _setCount((count) => count + 1);
104
- const messageRef = useRef("");
105
- const extensions = useMemo(() => [
106
- createBasicExtensions({
107
- placeholder: t("message placeholder")
108
- }),
109
- createThemeExtensions({
110
- themeMode
111
- }),
112
- listener({
113
- onChange: (text) => messageRef.current = text
114
- }),
115
- command
116
- ], [
117
- _count
118
- ]);
119
- const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
120
- behavior,
121
- block: "end"
122
- }), 10);
123
- const handleCreate = useCallback(() => {
124
- if (!messageRef.current) {
125
- return false;
126
- }
127
- thread.messages.push(makeRef(create(MessageType, {
128
- sender: {
129
- identityKey: identity.identityKey.toHex()
130
- },
131
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
132
- text: messageRef.current,
133
- context: context ? makeRef(context) : void 0
134
- })));
135
- onComment?.(thread);
136
- messageRef.current = "";
137
- scrollToEnd("instant");
138
- rerenderEditor();
139
- return true;
140
- }, [
141
- thread,
142
- identity
143
- ]);
144
- return /* @__PURE__ */ React.createElement(Thread, {
145
- onClickCapture: onAttend,
146
- onFocusCapture: onAttend,
147
- current,
148
- id: fullyQualifiedId(thread)
149
- }, /* @__PURE__ */ React.createElement("div", {
150
- role: "none",
151
- className: mx("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
152
- }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
153
- asChild: true
154
- }, /* @__PURE__ */ React.createElement(ThreadHeading, {
155
- detached: true
156
- }, thread.name)), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
157
- classNames: "z-30",
158
- side: "top"
159
- }, t("detached thread label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))) : /* @__PURE__ */ React.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React.createElement("div", {
160
- className: "flex flex-row items-center pli-1"
161
- }, thread.status === "staged" && /* @__PURE__ */ React.createElement(Tag, {
162
- palette: "neutral"
163
- }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React.createElement(ToggleResolvedButton, {
164
- isResolved: thread?.status === "resolved",
165
- onResolve
166
- }), onThreadDelete && /* @__PURE__ */ React.createElement(DeleteThreadButton, {
167
- onDelete: onThreadDelete
168
- }))), RefArray.allResolvedTargets(thread.messages?.filter(nonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
169
- key: message.id,
170
- message,
171
- members,
172
- onDelete: (id) => onMessageDelete?.(id)
173
- })), /* @__PURE__ */ React.createElement(MessageTextbox, {
174
- extensions,
175
- onSend: handleCreate,
176
- ...textboxMetadata
177
- }), /* @__PURE__ */ React.createElement(ThreadFooter, {
178
- activity
179
- }, t("activity message")), /* @__PURE__ */ React.createElement("div", {
180
- role: "none",
181
- className: "bs-px -mbs-px",
182
- ref: threadScrollRef
183
- }));
184
- };
185
-
186
- // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
187
- import { ChatText } from "@phosphor-icons/react";
188
- import React2, { useEffect } from "react";
189
- import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
190
- import { useTranslation as useTranslation2, Trans } from "@dxos/react-ui";
191
- import { descriptionText, mx as mx2 } from "@dxos/react-ui-theme";
192
- var CommentsContainer = ({ threads: threads2, detached = [], currentId, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
193
- const { t } = useTranslation2(THREAD_PLUGIN);
194
- const filteredThreads = showResolvedThreads ? threads2 : threads2.filter((thread) => !(thread?.status === "resolved"));
195
- useEffect(() => {
196
- if (currentId) {
197
- document.getElementById(currentId)?.scrollIntoView({
198
- behavior: "smooth",
199
- block: "end"
200
- });
201
- }
202
- }, [
203
- currentId
204
- ]);
205
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, filteredThreads.length > 0 ? filteredThreads.map((thread) => {
206
- const threadId = fullyQualifiedId2(thread);
207
- return /* @__PURE__ */ React2.createElement(CommentContainer, {
208
- key: threadId,
209
- thread,
210
- current: currentId === threadId,
211
- detached: detached.includes(threadId),
212
- ...onThreadAttend && {
213
- onAttend: () => onThreadAttend(thread)
214
- },
215
- ...onThreadDelete && {
216
- onThreadDelete: () => onThreadDelete(thread)
217
- },
218
- ...onMessageDelete && {
219
- onMessageDelete: (messageId) => onMessageDelete(thread, messageId)
220
- },
221
- ...onThreadToggleResolved && {
222
- onResolve: () => onThreadToggleResolved(thread)
223
- },
224
- ...props
225
- });
226
- }) : /* @__PURE__ */ React2.createElement("div", {
227
- role: "alert",
228
- className: mx2(descriptionText, "place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4")
229
- }, /* @__PURE__ */ React2.createElement("h2", {
230
- className: "mbe-2 font-medium text-baseText"
231
- }, t("no comments title")), /* @__PURE__ */ React2.createElement("p", null, /* @__PURE__ */ React2.createElement(Trans, {
232
- t,
233
- i18nKey: "no comments message",
234
- components: {
235
- commentIcon: /* @__PURE__ */ React2.createElement(ChatText, {
236
- className: "inline-block"
237
- })
238
- }
239
- }))));
240
- };
241
-
242
- // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
243
- import React3, { useEffect as useEffect2, useMemo as useMemo2 } from "react";
244
- import { createIntent, LayoutAction, useIntentDispatcher, useResolvePlugins } from "@dxos/app-framework";
245
- import { fullyQualifiedId as fullyQualifiedId3, RefArray as RefArray2 } from "@dxos/react-client/echo";
246
- import { useAttended } from "@dxos/react-ui-attention";
247
- import { nonNullable as nonNullable2 } from "@dxos/util";
248
- var providesThreadsConfig = (plugin) => "thread" in plugin.provides ? plugin : void 0;
249
- var ThreadComplementary = ({ subject, drafts, current, showResolvedThreads }) => {
250
- const { dispatchPromise: dispatch } = useIntentDispatcher();
251
- const threadsIntegrators = useResolvePlugins(providesThreadsConfig);
252
- const threadProvides = useMemo2(() => threadsIntegrators.map((p) => p.provides.thread), [
253
- threadsIntegrators
254
- ]);
255
- const createSort = useMemo2(() => threadProvides.find((p) => p.predicate(subject))?.createSort, [
256
- threadProvides,
257
- subject
258
- ]);
259
- const sort = useMemo2(() => createSort?.(subject), [
260
- createSort,
261
- subject
262
- ]);
263
- const threadObjects = RefArray2.allResolvedTargets(subject.threads ?? []);
264
- const threads2 = useMemo2(() => {
265
- return threadObjects.concat(drafts ?? []).filter(nonNullable2);
266
- }, [
267
- JSON.stringify(threadObjects),
268
- JSON.stringify(drafts)
269
- ]);
270
- const detachedIds = useMemo2(() => {
271
- return threads2.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId3(thread));
272
- }, [
273
- threads2
274
- ]);
275
- useEffect2(() => {
276
- if (!sort) {
277
- return;
278
- }
279
- threads2.sort((a, b) => sort(a?.anchor, b?.anchor));
280
- }, [
281
- sort,
282
- threads2
283
- ]);
284
- const attended = useAttended();
285
- const qualifiedSubjectId = fullyQualifiedId3(subject);
286
- return /* @__PURE__ */ React3.createElement(CommentsContainer, {
287
- threads: threads2,
288
- detached: detachedIds,
289
- currentId: attended.includes(qualifiedSubjectId) ? current : void 0,
290
- showResolvedThreads,
291
- onThreadAttend: (thread) => {
292
- const threadId = fullyQualifiedId3(thread);
293
- if (current !== threadId) {
294
- current = threadId;
295
- void dispatch?.(createIntent(LayoutAction.ScrollIntoView, {
296
- id: fullyQualifiedId3(subject),
297
- cursor: thread.anchor,
298
- ref: threadId
299
- }));
300
- }
301
- },
302
- onThreadDelete: (thread) => dispatch(createIntent(ThreadAction.Delete, {
303
- thread,
304
- subject
305
- })),
306
- onMessageDelete: (thread, messageId) => dispatch(createIntent(ThreadAction.DeleteMessage, {
307
- thread,
308
- subject,
309
- messageId
310
- })),
311
- onThreadToggleResolved: (thread) => dispatch(createIntent(ThreadAction.ToggleResolved, {
312
- thread
313
- })),
314
- onComment: (thread) => dispatch(createIntent(ThreadAction.OnMessageAdd, {
315
- thread,
316
- subject
317
- }))
318
- });
319
- };
320
-
321
- // packages/plugins/plugin-thread/src/components/ThreadSettings.tsx
322
- import React4 from "react";
323
- import { Input, useTranslation as useTranslation3 } from "@dxos/react-ui";
324
- import { DeprecatedFormInput } from "@dxos/react-ui-form";
325
- var ThreadSettings = ({ settings }) => {
326
- const { t } = useTranslation3(THREAD_PLUGIN);
327
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(DeprecatedFormInput, {
328
- label: t("settings standalone label")
329
- }, /* @__PURE__ */ React4.createElement(Input.Switch, {
330
- checked: settings.standalone,
331
- onCheckedChange: (checked) => settings.standalone = !!checked
332
- })));
333
- };
334
-
335
- // packages/plugins/plugin-thread/src/components/index.ts
336
- var ThreadMain = lazy(() => import("./ThreadMain-OL6ZHNZY.mjs"));
337
- var ThreadArticle = lazy(() => import("./ThreadArticle-F37HYTOU.mjs"));
338
-
339
- // packages/plugins/plugin-thread/src/extensions/threads.ts
340
- import { EditorView } from "@codemirror/view";
341
- import { computed, effect } from "@preact/signals-core";
342
- import { createIntent as createIntent2 } from "@dxos/app-framework";
343
- import { Ref } from "@dxos/echo-schema";
344
- import { RefArray as RefArray3 } from "@dxos/live-object";
345
- import { ThreadType } from "@dxos/plugin-space/types";
346
- import { getSpace as getSpace2, getTextInRange, createDocAccessor, fullyQualifiedId as fullyQualifiedId4 } from "@dxos/react-client/echo";
347
- import { comments, createExternalCommentSync } from "@dxos/react-ui-editor";
348
- var getName = (doc, anchor) => {
349
- if (doc.content) {
350
- const [start, end] = anchor.split(":");
351
- return getTextInRange(createDocAccessor(doc.content.target, [
352
- "content"
353
- ]), start, end);
354
- }
355
- };
356
- var threads = (state, doc, dispatch) => {
357
- const space = doc && getSpace2(doc);
358
- if (!doc || !space || !dispatch) {
359
- return [
360
- comments()
361
- ];
362
- }
363
- const threads2 = computed(() => [
364
- ...RefArray3.allResolvedTargets(doc.threads),
365
- ...state.drafts[fullyQualifiedId4(doc)] ?? []
366
- ].filter((thread) => !(thread?.status === "resolved")));
367
- return [
368
- EditorView.updateListener.of((update) => {
369
- if (update.docChanged) {
370
- RefArray3.allResolvedTargets(doc.threads).forEach((thread) => {
371
- if (thread.anchor) {
372
- const name = getName(doc, thread.anchor);
373
- if (name && name !== thread.name) {
374
- thread.name = name;
375
- }
376
- }
377
- });
378
- }
379
- }),
380
- createExternalCommentSync(fullyQualifiedId4(doc), (sink) => effect(() => sink()), () => threads2.value.filter((thread) => thread?.anchor).map((thread) => ({
381
- id: fullyQualifiedId4(thread),
382
- cursor: thread.anchor
383
- }))),
384
- comments({
385
- id: fullyQualifiedId4(doc),
386
- onCreate: ({ cursor }) => {
387
- const name = getName(doc, cursor);
388
- void dispatch(createIntent2(ThreadAction.Create, {
389
- cursor,
390
- name,
391
- subject: doc
392
- }));
393
- },
394
- onDelete: ({ id }) => {
395
- const draft = state.drafts[fullyQualifiedId4(doc)];
396
- if (draft) {
397
- const index = draft.findIndex((thread2) => fullyQualifiedId4(thread2) === id);
398
- if (index !== -1) {
399
- draft.splice(index, 1);
400
- }
401
- }
402
- const thread = doc.threads.find(Ref.hasObjectId(id))?.target;
403
- if (thread) {
404
- thread.anchor = void 0;
405
- }
406
- },
407
- onUpdate: ({ id, cursor }) => {
408
- const thread = state.drafts[fullyQualifiedId4(doc)]?.find((thread2) => fullyQualifiedId4(thread2) === id) ?? doc.threads.find(Ref.hasObjectId(id))?.target;
409
- if (thread instanceof ThreadType && thread.anchor) {
410
- thread.name = getName(doc, thread.anchor);
411
- thread.anchor = cursor;
412
- }
413
- },
414
- onSelect: ({ selection }) => {
415
- const current = selection.current ?? selection.closest;
416
- if (current) {
417
- void dispatch(createIntent2(ThreadAction.Select, {
418
- current,
419
- skipOpen: true
420
- }));
421
- }
422
- }
423
- })
424
- ];
425
- };
426
-
427
33
  // packages/plugins/plugin-thread/src/translations.ts
428
34
  import { ChannelType } from "@dxos/plugin-space/types";
429
35
  var translations_default = [
@@ -459,551 +65,155 @@ var translations_default = [
459
65
  "save message label": "Save",
460
66
  "edit message label": "Edit",
461
67
  "delete message label": "Delete message",
462
- "open comments panel label": "Show Comments"
68
+ "open comments panel label": "Show Comments",
69
+ "comments panel label": "Comments"
463
70
  }
464
71
  }
465
72
  }
466
73
  ];
467
74
 
468
75
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
469
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/ThreadPlugin.tsx";
470
- var initialViewState = {
471
- showResolvedThreads: false
472
- };
473
- var ThreadPlugin = () => {
474
- const settings = new LocalStorageStore(THREAD_PLUGIN);
475
- const state = create2({
476
- drafts: {}
477
- });
478
- const viewStore = create2({});
479
- const getViewState = (subjectId) => {
480
- if (!viewStore[subjectId]) {
481
- viewStore[subjectId] = {
482
- ...initialViewState
483
- };
484
- }
485
- return viewStore[subjectId];
486
- };
487
- let intentPlugin;
488
- const unsubscribeCallbacks = [];
489
- return {
490
- meta: meta_default,
491
- initialize: async () => {
492
- settings.prop({
493
- key: "standalone",
494
- type: LocalStorageStore.bool({
495
- allowUndefined: true
496
- })
497
- });
498
- return {
499
- echo: {
500
- system: [
501
- ThreadType2,
502
- MessageType2
76
+ var ThreadPlugin = () => definePlugin(meta, [
77
+ defineModule({
78
+ id: `${meta.id}/module/settings`,
79
+ activatesOn: Events.SetupSettings,
80
+ activate: ThreadSettings
81
+ }),
82
+ defineModule({
83
+ id: `${meta.id}/module/state`,
84
+ activatesOn: Events.Startup,
85
+ activate: ThreadState
86
+ }),
87
+ defineModule({
88
+ id: `${meta.id}/module/translations`,
89
+ activatesOn: Events.SetupTranslations,
90
+ activate: () => contributes(Capabilities.Translations, [
91
+ ...translations_default,
92
+ ...threadTranslations
93
+ ])
94
+ }),
95
+ defineModule({
96
+ id: `${meta.id}/module/metadata`,
97
+ activatesOn: Events.SetupMetadata,
98
+ activate: () => [
99
+ contributes(Capabilities.Metadata, {
100
+ id: ChannelType2.typename,
101
+ metadata: {
102
+ createObject: (props) => createIntent(ThreadAction.Create, props),
103
+ placeholder: [
104
+ "channel name placeholder",
105
+ {
106
+ ns: THREAD_PLUGIN
107
+ }
503
108
  ],
504
- // TODO(wittjosiah): Requires reload.
505
- ...settings.values.standalone ? {
506
- schema: [
507
- ChannelType2
508
- ]
509
- } : {}
109
+ icon: "ph--chat--regular",
110
+ // TODO(wittjosiah): Move out of metadata.
111
+ loadReferences: async (channel) => await RefArray.loadAll(channel.threads ?? [])
510
112
  }
511
- };
512
- },
513
- ready: async ({ plugins }) => {
514
- intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
515
- },
516
- unload: async () => {
517
- unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());
518
- },
519
- provides: {
520
- settings: settings.values,
521
- metadata: {
522
- records: {
523
- [ChannelType2.typename]: {
524
- createObject: (props) => createIntent3(ThreadAction.Create, props),
525
- placeholder: [
526
- "channel name placeholder",
527
- {
528
- ns: THREAD_PLUGIN
529
- }
530
- ],
531
- icon: "ph--chat--regular",
532
- // TODO(wittjosiah): Move out of metadata.
533
- loadReferences: async (channel) => await RefArray4.loadAll(channel.threads ?? [])
534
- },
535
- [ThreadType2.typename]: {
536
- // TODO(wittjosiah): Move out of metadata.
537
- loadReferences: async (thread) => await RefArray4.loadAll(thread.messages ?? [])
538
- },
539
- [MessageType2.typename]: {
540
- // TODO(wittjosiah): Move out of metadata.
541
- loadReferences: (message) => []
542
- },
543
- [THREAD_ITEM]: {
544
- parse: (item, type) => {
545
- switch (type) {
546
- case "node":
547
- return {
548
- id: item.id,
549
- label: item.title,
550
- data: item
551
- };
552
- case "object":
553
- return item;
554
- case "view-object":
555
- return {
556
- id: `${item.id}-view`,
557
- object: item
558
- };
559
- }
560
- }
561
- }
113
+ }),
114
+ contributes(Capabilities.Metadata, {
115
+ id: ThreadType.typename,
116
+ metadata: {
117
+ // TODO(wittjosiah): Move out of metadata.
118
+ loadReferences: async (thread) => await RefArray.loadAll(thread.messages ?? [])
562
119
  }
563
- },
564
- translations: [
565
- ...translations_default,
566
- ...threadTranslations
567
- ],
568
- complementary: {
569
- panels: [
570
- {
571
- id: "comments",
572
- label: [
573
- "open comments panel label",
574
- {
575
- ns: THREAD_PLUGIN
576
- }
577
- ],
578
- icon: "ph--chat-text--regular"
579
- }
580
- ]
581
- },
582
- graph: {
583
- builder: (plugins) => {
584
- const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
585
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
586
- const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;
587
- if (!client || !dispatch || !metadataResolver) {
588
- return [];
589
- }
590
- const type = "orphan-comments-for-subject";
591
- const icon = "ph--chat-text--regular";
592
- return [
593
- createExtension({
594
- id: `${THREAD_PLUGIN}/comments-for-subject`,
595
- resolver: ({ id }) => {
596
- if (!id.endsWith("~comments")) {
597
- return;
598
- }
599
- const [subjectId] = id.split("~");
600
- const { spaceId, objectId } = parseId(subjectId);
601
- const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
602
- const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
603
- if (!objectId) {
604
- return {
605
- id,
606
- type,
607
- data: null,
608
- properties: {
609
- icon,
610
- label: [
611
- "unnamed object threads label",
612
- {
613
- ns: THREAD_PLUGIN
614
- }
615
- ],
616
- showResolvedThreads: false,
617
- object: null,
618
- space
619
- }
620
- };
621
- }
622
- const [object] = memoizeQuery(space, {
623
- id: objectId
624
- });
625
- if (!object || !subjectId) {
626
- return;
627
- }
628
- const meta = metadataResolver(getTypename(object) ?? "");
629
- const label = meta.label?.(object) || object.name || meta.placeholder || [
630
- "unnamed object threads label",
631
- {
632
- ns: THREAD_PLUGIN
633
- }
634
- ];
635
- const viewState = getViewState(subjectId);
120
+ }),
121
+ contributes(Capabilities.Metadata, {
122
+ id: MessageType.typename,
123
+ metadata: {
124
+ // TODO(wittjosiah): Move out of metadata.
125
+ loadReferences: (message) => []
126
+ }
127
+ }),
128
+ contributes(Capabilities.Metadata, {
129
+ id: THREAD_ITEM,
130
+ metadata: {
131
+ parse: (item, type) => {
132
+ switch (type) {
133
+ case "node":
636
134
  return {
637
- id,
638
- type,
639
- data: null,
640
- properties: {
641
- icon,
642
- label,
643
- showResolvedThreads: viewState.showResolvedThreads,
644
- object
645
- }
646
- };
647
- },
648
- actions: ({ node }) => {
649
- const dataId = node.id.split("~").at(0);
650
- if (!node.id.endsWith("~comments") || !dataId) {
651
- return;
652
- }
653
- const [spaceId, objectId] = dataId.split(":");
654
- const viewState = getViewState(dataId);
655
- const toggle = async () => {
656
- const newToggleState = !viewState.showResolvedThreads;
657
- viewState.showResolvedThreads = newToggleState;
658
- await dispatch(createIntent3(ObservabilityAction.SendEvent, {
659
- name: "threads.toggle-show-resolved",
660
- properties: {
661
- spaceId,
662
- threadId: objectId,
663
- showResolved: newToggleState
664
- }
665
- }));
135
+ id: item.id,
136
+ label: item.title,
137
+ data: item
666
138
  };
667
- return [
668
- {
669
- id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,
670
- data: toggle,
671
- properties: {
672
- label: [
673
- "toggle show resolved",
674
- {
675
- ns: THREAD_PLUGIN
676
- }
677
- ],
678
- menuItemType: "toggle",
679
- isChecked: viewState.showResolvedThreads,
680
- testId: "threadPlugin.toggleShowResolved",
681
- icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
682
- }
683
- }
684
- ];
685
- }
686
- })
687
- ];
688
- }
689
- },
690
- surface: {
691
- definitions: ({ plugins }) => {
692
- const location = resolvePlugin(plugins, parseNavigationPlugin)?.provides.location;
693
- return [
694
- createSurface({
695
- id: `${THREAD_PLUGIN}/channel`,
696
- role: "article",
697
- filter: (data) => data.subject instanceof ChannelType2 && !!data.subject.threads[0],
698
- component: ({ data }) => {
699
- const channel = data.subject;
700
- const thread = channel.threads[0].target;
701
- if (isLayoutParts(location?.active) && location.active.main) {
702
- const layoutEntries = location.active.main;
703
- const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);
704
- if (currentPosition > 0) {
705
- const objectToTheLeft = layoutEntries[currentPosition - 1];
706
- const context = getSpace3(channel)?.db.getObjectById(objectToTheLeft.id);
707
- return /* @__PURE__ */ React5.createElement(ThreadArticle, {
708
- thread,
709
- context
710
- });
711
- }
712
- }
713
- return /* @__PURE__ */ React5.createElement(ThreadArticle, {
714
- thread
715
- });
716
- }
717
- }),
718
- createSurface({
719
- id: `${THREAD_PLUGIN}/thread`,
720
- role: "complementary--comments",
721
- filter: (data) => !!data.subject && typeof data.subject === "object" && "threads" in data.subject && Array.isArray(data.subject.threads) && !(data.subject instanceof ChannelType2),
722
- component: ({ data }) => {
723
- const { showResolvedThreads } = getViewState(fullyQualifiedId5(data.subject));
724
- return /* @__PURE__ */ React5.createElement(ThreadComplementary, {
725
- subject: data.subject,
726
- drafts: state.drafts[fullyQualifiedId5(data.subject)],
727
- current: state.current,
728
- showResolvedThreads
729
- });
730
- }
731
- }),
732
- createSurface({
733
- id: `${THREAD_PLUGIN}/settings`,
734
- role: "settings",
735
- filter: (data) => data.plugin === THREAD_PLUGIN,
736
- component: () => /* @__PURE__ */ React5.createElement(ThreadSettings, {
737
- settings: settings.values
738
- })
739
- })
740
- ];
741
- }
742
- },
743
- intent: {
744
- resolvers: () => [
745
- createResolver(ThreadAction.Create, ({ name, cursor, subject }) => {
746
- if (cursor && subject) {
747
- if (subject?.threads === void 0) {
748
- try {
749
- subject.threads = [];
750
- } catch (err) {
751
- log.error("Subject does not support threads array", subject?.typename, {
752
- F: __dxlog_file,
753
- L: 314,
754
- S: void 0,
755
- C: (f, a) => f(...a)
756
- });
757
- return;
758
- }
759
- }
760
- const subjectId = fullyQualifiedId5(subject);
761
- const thread = create2(ThreadType2, {
762
- name,
763
- anchor: cursor,
764
- messages: [],
765
- status: "staged"
766
- });
767
- const draft = state.drafts[subjectId];
768
- if (draft) {
769
- draft.push(thread);
770
- } else {
771
- state.drafts[subjectId] = [
772
- thread
773
- ];
774
- }
775
- return {
776
- data: {
777
- object: thread
778
- },
779
- intents: [
780
- createIntent3(ThreadAction.Select, {
781
- current: fullyQualifiedId5(thread)
782
- }),
783
- createIntent3(NavigationAction.Open, {
784
- activeParts: {
785
- complementary: "comments"
786
- }
787
- }),
788
- createIntent3(LayoutAction2.SetLayout, {
789
- element: "complementary",
790
- state: true
791
- })
792
- ]
793
- };
794
- } else {
795
- return {
796
- data: {
797
- object: create2(ChannelType2, {
798
- threads: [
799
- makeRef2(create2(ThreadType2, {
800
- messages: []
801
- }))
802
- ]
803
- })
804
- }
805
- };
806
- }
807
- }),
808
- createResolver(ThreadAction.Select, ({ current, skipOpen }) => {
809
- state.current = current;
810
- return {
811
- intents: !skipOpen ? [
812
- createIntent3(NavigationAction.Open, {
813
- activeParts: {
814
- complementary: "comments"
815
- }
816
- })
817
- ] : void 0
818
- };
819
- }),
820
- createResolver(ThreadAction.ToggleResolved, ({ thread }) => {
821
- if (thread.status === "active" || thread.status === void 0) {
822
- thread.status = "resolved";
823
- } else if (thread.status === "resolved") {
824
- thread.status = "active";
825
- }
826
- const space = getSpace3(thread);
827
- const spaceId = space?.id;
828
- return {
829
- intents: [
830
- createIntent3(ObservabilityAction.SendEvent, {
831
- name: "threads.toggle-resolved",
832
- properties: {
833
- threadId: thread.id,
834
- spaceId
835
- }
836
- })
837
- ]
838
- };
839
- }),
840
- createResolver(ThreadAction.Delete, ({ subject, thread }, undo) => {
841
- const subjectId = fullyQualifiedId5(subject);
842
- const draft = state.drafts[subjectId];
843
- if (draft) {
844
- const index = draft.findIndex((t) => t.id === thread.id);
845
- if (index !== -1) {
846
- draft.splice(index, 1);
847
- return;
848
- }
849
- }
850
- const space = getSpace3(thread);
851
- if (!space || !subject.threads) {
852
- return;
853
- }
854
- if (!undo) {
855
- const index = subject.threads.findIndex((t) => t?.id === thread.id);
856
- const cursor = subject.threads[index]?.anchor;
857
- if (index !== -1) {
858
- subject.threads?.splice(index, 1);
859
- }
860
- space.db.remove(thread);
861
- return {
862
- undoable: {
863
- message: [
864
- "thread deleted label",
865
- {
866
- ns: THREAD_PLUGIN
867
- }
868
- ],
869
- data: {
870
- cursor
871
- }
872
- },
873
- intents: [
874
- createIntent3(ObservabilityAction.SendEvent, {
875
- name: "threads.delete",
876
- properties: {
877
- threadId: thread.id,
878
- spaceId: space.id
879
- }
880
- })
881
- ]
882
- };
883
- } else {
884
- const savedThread = space.db.add(thread);
885
- subject.threads.push(savedThread);
886
- return {
887
- intents: [
888
- createIntent3(ObservabilityAction.SendEvent, {
889
- name: "threads.undo-delete",
890
- properties: {
891
- threadId: thread.id,
892
- spaceId: space.id
893
- }
894
- })
895
- ]
896
- };
897
- }
898
- }),
899
- createResolver(ThreadAction.OnMessageAdd, ({ thread, subject }) => {
900
- const subjectId = fullyQualifiedId5(subject);
901
- const space = getSpace3(subject);
902
- const intents = [];
903
- const analyticsProperties = {
904
- threadId: thread.id,
905
- spaceId: space?.id
906
- };
907
- if (state.drafts[subjectId]?.find((t) => t === thread)) {
908
- thread.status = "active";
909
- subject.threads ? subject.threads.push(makeRef2(thread)) : subject.threads = [
910
- makeRef2(thread)
911
- ];
912
- state.drafts[subjectId] = state.drafts[subjectId]?.filter(({ id }) => id !== thread.id);
913
- intents.push(createIntent3(ObservabilityAction.SendEvent, {
914
- name: "threads.thread-created",
915
- properties: analyticsProperties
916
- }));
917
- }
918
- intents.push(createIntent3(ObservabilityAction.SendEvent, {
919
- name: "threads.message-added",
920
- properties: {
921
- ...analyticsProperties,
922
- threadLength: thread.messages.length
923
- }
924
- }));
925
- return {
926
- intents
927
- };
928
- }),
929
- createResolver(ThreadAction.DeleteMessage, ({ subject, thread, messageId, message, messageIndex }, undo) => {
930
- const space = getSpace3(subject);
931
- if (!undo) {
932
- const messageIndex2 = thread.messages.findIndex(Ref2.hasObjectId(messageId));
933
- const message2 = thread.messages[messageIndex2]?.target;
934
- if (!message2) {
935
- return;
936
- }
937
- if (messageIndex2 === 0 && thread.messages.length === 1) {
139
+ case "object":
140
+ return item;
141
+ case "view-object":
938
142
  return {
939
- intents: [
940
- createIntent3(ThreadAction.Delete, {
941
- subject,
942
- thread
943
- })
944
- ]
143
+ id: `${item.id}-view`,
144
+ object: item
945
145
  };
946
- } else {
947
- thread.messages.splice(messageIndex2, 1);
948
- }
949
- return {
950
- undoable: {
951
- message: [
952
- "message deleted label",
953
- {
954
- ns: THREAD_PLUGIN
955
- }
956
- ],
957
- data: {
958
- message: message2,
959
- messageIndex: messageIndex2
960
- }
961
- },
962
- intents: [
963
- createIntent3(ObservabilityAction.SendEvent, {
964
- name: "threads.message.delete",
965
- properties: {
966
- threadId: thread.id,
967
- spaceId: space?.id
968
- }
969
- })
970
- ]
971
- };
972
- } else {
973
- if (!messageIndex || !message) {
974
- return;
975
- }
976
- thread.messages.splice(messageIndex, 0, makeRef2(message));
977
- return {
978
- intents: [
979
- createIntent3(ObservabilityAction.SendEvent, {
980
- name: "threads.message.undo-delete",
981
- properties: {
982
- threadId: thread.id,
983
- spaceId: space?.id
984
- }
985
- })
986
- ]
987
- };
988
146
  }
989
- })
990
- ]
991
- },
992
- markdown: {
993
- extensions: ({ document: doc }) => {
994
- return threads(state, doc, intentPlugin?.provides.intent.dispatchPromise);
147
+ }
995
148
  }
149
+ })
150
+ ]
151
+ }),
152
+ defineModule({
153
+ id: `${meta.id}/module/schema`,
154
+ activatesOn: ClientEvents.SetupSchema,
155
+ activate: () => contributes(ClientCapabilities.SystemSchema, [
156
+ ThreadType,
157
+ MessageType
158
+ ])
159
+ }),
160
+ defineModule({
161
+ id: `${meta.id}/module/channel-schema`,
162
+ activatesOn: allOf(Events.SettingsReady, ClientEvents.ClientReady),
163
+ activate: (context) => {
164
+ const client = context.requestCapability(ClientCapabilities.Client);
165
+ const settings = context.requestCapability(Capabilities.SettingsStore).getStore(THREAD_PLUGIN).value;
166
+ if (settings.standalone) {
167
+ client.addTypes([
168
+ ChannelType2
169
+ ]);
170
+ return contributes(ClientCapabilities.Schema, [
171
+ ChannelType2
172
+ ]);
996
173
  }
174
+ return [];
997
175
  }
998
- };
999
- };
1000
-
1001
- // packages/plugins/plugin-thread/src/index.ts
1002
- var src_default = ThreadPlugin;
176
+ }),
177
+ defineModule({
178
+ id: `${meta.id}/module/complementary-panel`,
179
+ activatesOn: Events.Startup,
180
+ activate: () => contributes(DeckCapabilities.ComplementaryPanel, {
181
+ id: "comments",
182
+ label: [
183
+ "comments panel label",
184
+ {
185
+ ns: THREAD_PLUGIN
186
+ }
187
+ ],
188
+ icon: "ph--chat-text--regular"
189
+ })
190
+ }),
191
+ defineModule({
192
+ id: `${meta.id}/module/markdown`,
193
+ activatesOn: Events.Startup,
194
+ activate: Markdown
195
+ }),
196
+ defineModule({
197
+ id: `${meta.id}/module/react-surface`,
198
+ activatesOn: Events.SetupSurfaces,
199
+ activate: ReactSurface
200
+ }),
201
+ defineModule({
202
+ id: `${meta.id}/module/intent-resolver`,
203
+ activatesOn: Events.SetupIntents,
204
+ activate: IntentResolver
205
+ }),
206
+ defineModule({
207
+ id: `${meta.id}/module/app-graph-builder`,
208
+ activatesOn: Events.SetupAppGraph,
209
+ activate: AppGraphBuilder
210
+ })
211
+ ]);
1003
212
  export {
1004
- ThreadAction,
213
+ THREAD_ITEM,
214
+ THREAD_PLUGIN,
1005
215
  ThreadPlugin,
1006
- src_default as default,
216
+ meta,
1007
217
  useAnalyticsCallback,
1008
218
  useOnEditAnalytics,
1009
219
  useStatus