@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
@@ -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
+ }
@@ -19,7 +19,7 @@ import {
19
19
  ChannelType,
20
20
  ThreadAction,
21
21
  ThreadType
22
- } from "./chunk-J323VQ4P.mjs";
22
+ } from "./chunk-UJMPYKT3.mjs";
23
23
  import {
24
24
  AppGraphBuilder,
25
25
  CallManager as CallManager2,
@@ -28,7 +28,7 @@ import {
28
28
  ReactRoot,
29
29
  ReactSurface,
30
30
  ThreadState
31
- } from "./chunk-ODUB4GAB.mjs";
31
+ } from "./chunk-O63QJPQX.mjs";
32
32
  import {
33
33
  ThreadCapabilities
34
34
  } from "./chunk-K4KAUOKT.mjs";
@@ -44,21 +44,26 @@ import {
44
44
  } from "./chunk-ESQC6SYE.mjs";
45
45
 
46
46
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
47
+ import { Effect } from "effect";
47
48
  import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from "@dxos/app-framework";
49
+ import { Ref, Type as Type2 } from "@dxos/echo";
48
50
  import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
49
51
  import { MarkdownEvents } from "@dxos/plugin-markdown";
50
- import { SpaceCapabilities } from "@dxos/plugin-space";
51
- import { defineObjectForm } from "@dxos/plugin-space/types";
52
- import { RefArray } from "@dxos/react-client/echo";
52
+ import { SpaceCapabilities, SpaceEvents } from "@dxos/plugin-space";
53
+ import { CollectionAction, defineObjectForm } from "@dxos/plugin-space/types";
53
54
  import { translations as threadTranslations } from "@dxos/react-ui-thread";
54
55
  import { AnchoredTo, DataType } from "@dxos/schema";
55
56
 
56
57
  // packages/plugins/plugin-thread/src/translations.ts
58
+ import { Type } from "@dxos/echo";
57
59
  var translations_default = [
58
60
  {
59
61
  "en-US": {
60
- [ChannelType.typename]: {
62
+ [Type.getTypename(ChannelType)]: {
61
63
  "typename label": "Channel",
64
+ "typename label_zero": "Channels",
65
+ "typename label_one": "Channel",
66
+ "typename label_other": "Channels",
62
67
  "object name placeholder": "New channel"
63
68
  },
64
69
  [THREAD_PLUGIN]: {
@@ -87,7 +92,7 @@ var translations_default = [
87
92
  "open comments panel label": "Show Comments",
88
93
  "comments label": "Comments",
89
94
  "show all label": "All comments",
90
- "show unresolved label": "Unresolved only",
95
+ "show unresolved label": "Unresolved comments",
91
96
  "channel companion label": "Channel",
92
97
  "call panel label": "Active Call",
93
98
  "display name label": "Display name",
@@ -169,7 +174,7 @@ var ThreadPlugin = () => definePlugin(meta, [
169
174
  id: ThreadType.typename,
170
175
  metadata: {
171
176
  // TODO(wittjosiah): Move out of metadata.
172
- loadReferences: async (thread) => await RefArray.loadAll(thread.messages ?? [])
177
+ loadReferences: async (thread) => await Ref.Array.loadAll(thread.messages ?? [])
173
178
  }
174
179
  }),
175
180
  contributes(Capabilities.Metadata, {
@@ -187,7 +192,7 @@ var ThreadPlugin = () => definePlugin(meta, [
187
192
  case "node":
188
193
  return {
189
194
  id: item.id,
190
- label: item.title,
195
+ label: item.name,
191
196
  data: item
192
197
  };
193
198
  case "object":
@@ -230,6 +235,27 @@ var ThreadPlugin = () => definePlugin(meta, [
230
235
  DataType.MessageV1ToV2
231
236
  ])
232
237
  }),
238
+ defineModule({
239
+ id: `${meta.id}/module/on-space-created`,
240
+ activatesOn: SpaceEvents.SpaceCreated,
241
+ activate: (context) => {
242
+ const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
243
+ return contributes(SpaceCapabilities.OnSpaceCreated, async ({ space, rootCollection }) => {
244
+ const program = Effect.gen(function* () {
245
+ const { object: collection } = yield* dispatch(createIntent(CollectionAction.CreateQueryCollection, {
246
+ typename: Type2.getTypename(ChannelType)
247
+ }));
248
+ rootCollection.objects.push(Ref.make(collection));
249
+ const { object: channel } = yield* dispatch(createIntent(ThreadAction.CreateChannel, {
250
+ name: "General",
251
+ spaceId: space.id
252
+ }));
253
+ space.db.add(channel);
254
+ });
255
+ await Effect.runPromise(program);
256
+ });
257
+ }
258
+ }),
233
259
  defineModule({
234
260
  id: `${meta.id}/module/markdown`,
235
261
  activatesOn: MarkdownEvents.SetupExtensions,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ThreadPlugin.tsx", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { defineObjectForm } from '@dxos/plugin-space/types';\nimport { type AnyLiveObject, RefArray } from '@dxos/react-client/echo';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { AnchoredTo, DataType } from '@dxos/schema';\n\nimport {\n AppGraphBuilder,\n CallManager,\n IntentResolver,\n Markdown,\n ReactRoot,\n ReactSurface,\n ThreadState,\n} from './capabilities';\nimport { meta, THREAD_ITEM } from './meta';\nimport translations from './translations';\nimport { ChannelType, ThreadAction, ThreadType } from './types';\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\n// NOTE(burdon): Review/discuss CursorConverter semantics.\n\n// TODO(wittjosiah): Rename to ChatPlugin.\n// TODO(wittjosiah): Enabling comments should likely be factored out of this plugin but depend on it's capabilities.\nexport const ThreadPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/call-manager`,\n activatesOn: ClientEvents.ClientReady,\n activate: CallManager,\n }),\n // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.\n // defineModule({\n // id: `${meta.id}/module/settings`,\n // activatesOn: Events.SetupSettings,\n // activate: ThreadSettings,\n // }),\n defineModule({\n id: `${meta.id}/module/state`,\n // TODO(wittjosiah): Does not integrate with settings store.\n // Should this be a different event?\n // Should settings store be renamed to be more generic?\n activatesOn: Events.SetupSettings,\n activate: ThreadState,\n }),\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () => [\n contributes(Capabilities.Metadata, {\n id: ChannelType.typename,\n metadata: {\n icon: 'ph--hash--regular',\n },\n }),\n contributes(Capabilities.Metadata, {\n id: ThreadType.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: async (thread: ThreadType) => await RefArray.loadAll(thread.messages ?? []),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: DataType.Message.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: THREAD_ITEM,\n metadata: {\n parse: (item: AnyLiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n }),\n ],\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: ChannelType,\n getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(ClientCapabilities.Schema, [AnchoredTo, ThreadType, DataType.Message, DataType.MessageV1]),\n }),\n defineModule({\n id: `${meta.id}/module/migration`,\n activatesOn: ClientEvents.SetupMigration,\n activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),\n }),\n defineModule({\n id: `${meta.id}/module/markdown`,\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n defineModule({\n id: `${meta.id}/module/react-root`,\n activatesOn: Events.Startup,\n activate: ReactRoot,\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { THREAD_PLUGIN } from './meta';\nimport { ChannelType } from './types';\n\nexport default [\n {\n 'en-US': {\n [ChannelType.typename]: {\n 'typename label': 'Channel',\n 'object name placeholder': 'New channel',\n },\n [THREAD_PLUGIN]: {\n 'plugin name': 'Chat',\n 'channel title label': 'Title',\n 'message placeholder': 'Reply…',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'Comments',\n 'no comments message':\n 'Click on the <commentIcon></commentIcon> button in the document toolbar to create a comment thread on the selected text.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n 'open comments panel label': 'Show Comments',\n 'comments label': 'Comments',\n 'show all label': 'All comments',\n 'show unresolved label': 'Unresolved only',\n\n 'channel companion label': 'Channel',\n 'call panel label': 'Active Call',\n\n 'display name label': 'Display name',\n 'display name description': 'Set your display name before joining a meeting.',\n 'display name input placeholder': 'Enter your name',\n 'set display name label': 'Continue',\n\n 'call tab label': 'Call',\n 'meeting status title': 'Meeting',\n 'share meeting link label': 'Share meeting',\n 'show webrtc stats title': 'Detailed WebRTC Stats',\n\n 'meeting summary label': 'Summary',\n 'summarize label': 'Summarize',\n 'summarizing label': 'Creating summary...',\n 'create summary message': 'A summary doesn’t exist for this meeting yet. Create one now?',\n\n 'join call': 'Join',\n 'leave call': 'Leave',\n\n 'lobby participants_zero': 'No participants',\n 'lobby participants_one': '1 participant',\n 'lobby participants_other': '{{count}} participants',\n\n 'icon pin': 'Pin video',\n 'icon unpin': 'Unpin video',\n 'icon wave': 'Waving',\n 'icon muted': 'Muted',\n 'icon speaking': 'Speaking',\n\n 'mic on': 'Unmute',\n 'mic off': 'Mute',\n 'camera on': 'Turn camera on',\n 'camera off': 'Turn camera off',\n 'camera off label': 'Camera off',\n\n 'raise hand': 'Raise hand',\n 'lower hand': 'Lower hand',\n 'screenshare on': 'Share screen',\n 'screenshare off': 'Stop streaming',\n },\n },\n },\n];\n"],
5
- "mappings": "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",
6
- "names": ["Capabilities", "contributes", "createIntent", "defineModule", "definePlugin", "Events", "ClientCapabilities", "ClientEvents", "MarkdownEvents", "SpaceCapabilities", "defineObjectForm", "RefArray", "translations", "threadTranslations", "AnchoredTo", "DataType", "ChannelType", "typename", "THREAD_PLUGIN", "ThreadPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "ClientEvents", "ClientReady", "activate", "CallManager", "Events", "SetupSettings", "ThreadState", "SetupTranslations", "contributes", "Capabilities", "Translations", "translations", "threadTranslations", "SetupMetadata", "Metadata", "ChannelType", "typename", "metadata", "icon", "ThreadType", "loadReferences", "thread", "RefArray", "loadAll", "messages", "DataType", "Message", "message", "THREAD_ITEM", "parse", "item", "type", "label", "title", "data", "object", "SetupSchema", "SpaceCapabilities", "ObjectForm", "defineObjectForm", "objectSchema", "getIntent", "_", "options", "createIntent", "ThreadAction", "CreateChannel", "spaceId", "space", "ClientCapabilities", "Schema", "AnchoredTo", "MessageV1", "SetupMigration", "Migration", "MessageV1ToV2", "MarkdownEvents", "SetupExtensions", "Markdown", "Startup", "ReactRoot", "SetupReactSurface", "ReactSurface", "SetupIntentResolver", "IntentResolver", "SetupAppGraph", "AppGraphBuilder"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Effect } from 'effect';\n\nimport { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';\nimport { Ref, Type } from '@dxos/echo';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';\nimport { CollectionAction, defineObjectForm } from '@dxos/plugin-space/types';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { AnchoredTo, DataType } from '@dxos/schema';\n\nimport {\n AppGraphBuilder,\n CallManager,\n IntentResolver,\n Markdown,\n ReactRoot,\n ReactSurface,\n ThreadState,\n} from './capabilities';\nimport { meta, THREAD_ITEM } from './meta';\nimport translations from './translations';\nimport { ChannelType, ThreadAction, ThreadType } from './types';\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\n// NOTE(burdon): Review/discuss CursorConverter semantics.\n\n// TODO(wittjosiah): Rename to ChatPlugin.\n// TODO(wittjosiah): Enabling comments should likely be factored out of this plugin but depend on it's capabilities.\nexport const ThreadPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/call-manager`,\n activatesOn: ClientEvents.ClientReady,\n activate: CallManager,\n }),\n // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.\n // defineModule({\n // id: `${meta.id}/module/settings`,\n // activatesOn: Events.SetupSettings,\n // activate: ThreadSettings,\n // }),\n defineModule({\n id: `${meta.id}/module/state`,\n // TODO(wittjosiah): Does not integrate with settings store.\n // Should this be a different event?\n // Should settings store be renamed to be more generic?\n activatesOn: Events.SetupSettings,\n activate: ThreadState,\n }),\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () => [\n contributes(Capabilities.Metadata, {\n id: ChannelType.typename,\n metadata: {\n icon: 'ph--hash--regular',\n },\n }),\n contributes(Capabilities.Metadata, {\n id: ThreadType.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: async (thread: ThreadType) => await Ref.Array.loadAll(thread.messages ?? []),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: DataType.Message.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: THREAD_ITEM,\n metadata: {\n parse: (item: ThreadType, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.name, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n }),\n ],\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: ChannelType,\n getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(ClientCapabilities.Schema, [AnchoredTo, ThreadType, DataType.Message, DataType.MessageV1]),\n }),\n defineModule({\n id: `${meta.id}/module/migration`,\n activatesOn: ClientEvents.SetupMigration,\n activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),\n }),\n defineModule({\n id: `${meta.id}/module/on-space-created`,\n activatesOn: SpaceEvents.SpaceCreated,\n activate: (context) => {\n const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n return contributes(SpaceCapabilities.OnSpaceCreated, async ({ space, rootCollection }) => {\n const program = Effect.gen(function* () {\n const { object: collection } = yield* dispatch(\n createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),\n );\n rootCollection.objects.push(Ref.make(collection));\n\n const { object: channel } = yield* dispatch(\n createIntent(ThreadAction.CreateChannel, { name: 'General', spaceId: space.id }),\n );\n space.db.add(channel);\n });\n await Effect.runPromise(program);\n });\n },\n }),\n defineModule({\n id: `${meta.id}/module/markdown`,\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n defineModule({\n id: `${meta.id}/module/react-root`,\n activatesOn: Events.Startup,\n activate: ReactRoot,\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Type } from '@dxos/echo';\n\nimport { THREAD_PLUGIN } from './meta';\nimport { ChannelType } from './types';\n\nexport default [\n {\n 'en-US': {\n [Type.getTypename(ChannelType)]: {\n 'typename label': 'Channel',\n 'typename label_zero': 'Channels',\n 'typename label_one': 'Channel',\n 'typename label_other': 'Channels',\n 'object name placeholder': 'New channel',\n },\n [THREAD_PLUGIN]: {\n 'plugin name': 'Chat',\n 'channel title label': 'Title',\n 'message placeholder': 'Reply…',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'Comments',\n 'no comments message':\n 'Click on the <commentIcon></commentIcon> button in the document toolbar to create a comment thread on the selected text.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n 'open comments panel label': 'Show Comments',\n 'comments label': 'Comments',\n 'show all label': 'All comments',\n 'show unresolved label': 'Unresolved comments',\n\n 'channel companion label': 'Channel',\n 'call panel label': 'Active Call',\n\n 'display name label': 'Display name',\n 'display name description': 'Set your display name before joining a meeting.',\n 'display name input placeholder': 'Enter your name',\n 'set display name label': 'Continue',\n\n 'call tab label': 'Call',\n 'meeting status title': 'Meeting',\n 'share meeting link label': 'Share meeting',\n 'show webrtc stats title': 'Detailed WebRTC Stats',\n\n 'meeting summary label': 'Summary',\n 'summarize label': 'Summarize',\n 'summarizing label': 'Creating summary...',\n 'create summary message': 'A summary doesn’t exist for this meeting yet. Create one now?',\n\n 'join call': 'Join',\n 'leave call': 'Leave',\n\n 'lobby participants_zero': 'No participants',\n 'lobby participants_one': '1 participant',\n 'lobby participants_other': '{{count}} participants',\n\n 'icon pin': 'Pin video',\n 'icon unpin': 'Unpin video',\n 'icon wave': 'Waving',\n 'icon muted': 'Muted',\n 'icon speaking': 'Speaking',\n\n 'mic on': 'Unmute',\n 'mic off': 'Mute',\n 'camera on': 'Turn camera on',\n 'camera off': 'Turn camera off',\n 'camera off label': 'Camera off',\n\n 'raise hand': 'Raise hand',\n 'lower hand': 'Lower hand',\n 'screenshare on': 'Share screen',\n 'screenshare off': 'Stop streaming',\n },\n },\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["Effect", "Capabilities", "contributes", "createIntent", "defineModule", "definePlugin", "Events", "Ref", "Type", "ClientCapabilities", "ClientEvents", "MarkdownEvents", "SpaceCapabilities", "SpaceEvents", "CollectionAction", "defineObjectForm", "translations", "threadTranslations", "AnchoredTo", "DataType", "Type", "Type", "getTypename", "ChannelType", "THREAD_PLUGIN", "ThreadPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "ClientEvents", "ClientReady", "activate", "CallManager", "Events", "SetupSettings", "ThreadState", "SetupTranslations", "contributes", "Capabilities", "Translations", "translations", "threadTranslations", "SetupMetadata", "Metadata", "ChannelType", "typename", "metadata", "icon", "ThreadType", "loadReferences", "thread", "Ref", "Array", "loadAll", "messages", "DataType", "Message", "message", "THREAD_ITEM", "parse", "item", "type", "label", "name", "data", "object", "SetupSchema", "SpaceCapabilities", "ObjectForm", "defineObjectForm", "objectSchema", "getIntent", "_", "options", "createIntent", "ThreadAction", "CreateChannel", "spaceId", "space", "ClientCapabilities", "Schema", "AnchoredTo", "MessageV1", "SetupMigration", "Migration", "MessageV1ToV2", "SpaceEvents", "SpaceCreated", "context", "dispatch", "getCapability", "IntentDispatcher", "OnSpaceCreated", "rootCollection", "program", "Effect", "gen", "collection", "CollectionAction", "CreateQueryCollection", "Type", "getTypename", "objects", "push", "make", "channel", "db", "add", "runPromise", "MarkdownEvents", "SetupExtensions", "Markdown", "Startup", "ReactRoot", "SetupReactSurface", "ReactSurface", "SetupIntentResolver", "IntentResolver", "SetupAppGraph", "AppGraphBuilder"]
7
7
  }
@@ -3,7 +3,7 @@ import {
3
3
  ChannelType,
4
4
  ThreadAction,
5
5
  ThreadType
6
- } from "./chunk-J323VQ4P.mjs";
6
+ } from "./chunk-UJMPYKT3.mjs";
7
7
  import {
8
8
  ThreadCapabilities
9
9
  } from "./chunk-K4KAUOKT.mjs";
@@ -12,14 +12,14 @@ import {
12
12
  } from "./chunk-ESQC6SYE.mjs";
13
13
 
14
14
  // packages/plugins/plugin-thread/src/capabilities/intent-resolver.ts
15
- import { batch } from "@preact/signals-core";
16
15
  import { Capabilities, contributes, createIntent, createResolver } from "@dxos/app-framework";
17
- import { RelationSourceId, RelationTargetId } from "@dxos/echo-schema";
16
+ import { sleep } from "@dxos/async";
17
+ import { Obj, Relation } from "@dxos/echo";
18
18
  import { invariant } from "@dxos/invariant";
19
19
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from "@dxos/plugin-deck/types";
20
20
  import { ObservabilityAction } from "@dxos/plugin-observability/types";
21
21
  import { SpaceAction } from "@dxos/plugin-space/types";
22
- import { live, fullyQualifiedId, getSpace, Ref } from "@dxos/react-client/echo";
22
+ import { fullyQualifiedId, getSpace, Ref } from "@dxos/react-client/echo";
23
23
  import { AnchoredTo, DataType } from "@dxos/schema";
24
24
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/capabilities/intent-resolver.ts";
25
25
  var intent_resolver_default = (context) => contributes(Capabilities.IntentResolver, [
@@ -27,9 +27,9 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
27
27
  intent: ThreadAction.CreateChannel,
28
28
  resolve: ({ name }) => ({
29
29
  data: {
30
- object: live(ChannelType, {
30
+ object: Obj.make(ChannelType, {
31
31
  name,
32
- defaultThread: Ref.make(live(ThreadType, {
32
+ defaultThread: Ref.make(Obj.make(ThreadType, {
33
33
  messages: [],
34
34
  status: "active"
35
35
  })),
@@ -41,7 +41,7 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
41
41
  createResolver({
42
42
  intent: ThreadAction.CreateChannelThread,
43
43
  resolve: ({ channel }) => {
44
- const thread = live(ThreadType, {
44
+ const thread = Obj.make(ThreadType, {
45
45
  messages: [],
46
46
  status: "active"
47
47
  });
@@ -60,7 +60,7 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
60
60
  const space = getSpace(subject);
61
61
  invariant(space, "Space not found", {
62
62
  F: __dxlog_file,
63
- L: 51,
63
+ L: 50,
64
64
  S: void 0,
65
65
  A: [
66
66
  "space",
@@ -69,14 +69,14 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
69
69
  });
70
70
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
71
71
  const subjectId = fullyQualifiedId(subject);
72
- const thread = live(ThreadType, {
72
+ const thread = Obj.make(ThreadType, {
73
73
  name,
74
74
  messages: [],
75
75
  status: "staged"
76
76
  });
77
- const anchor = live(AnchoredTo, {
78
- [RelationSourceId]: thread,
79
- [RelationTargetId]: subject,
77
+ const anchor = Relation.make(AnchoredTo, {
78
+ [Relation.Source]: thread,
79
+ [Relation.Target]: subject,
80
80
  anchor: _anchor
81
81
  });
82
82
  const draft = state.drafts[subjectId];
@@ -141,8 +141,8 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
141
141
  }),
142
142
  createResolver({
143
143
  intent: ThreadAction.Delete,
144
- resolve: ({ subject, anchor, thread: _thread }, undo) => {
145
- const thread = _thread ?? anchor[RelationSourceId];
144
+ resolve: async ({ subject, anchor, thread: _thread }, undo) => {
145
+ const thread = _thread ?? Relation.getSource(anchor);
146
146
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
147
147
  const subjectId = fullyQualifiedId(subject);
148
148
  const draft = state.drafts[subjectId];
@@ -158,10 +158,9 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
158
158
  return;
159
159
  }
160
160
  if (!undo) {
161
- batch(() => {
162
- space.db.remove(thread);
163
- space.db.remove(anchor);
164
- });
161
+ space.db.remove(anchor);
162
+ await sleep(100);
163
+ space.db.remove(thread);
165
164
  return {
166
165
  undoable: {
167
166
  message: [
@@ -186,10 +185,9 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
186
185
  ]
187
186
  };
188
187
  } else {
189
- batch(() => {
190
- space.db.add(thread);
191
- space.db.add(anchor);
192
- });
188
+ space.db.add(thread);
189
+ await sleep(100);
190
+ space.db.add(anchor);
193
191
  return {
194
192
  intents: [
195
193
  createIntent(ObservabilityAction.SendEvent, {
@@ -207,7 +205,7 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
207
205
  createResolver({
208
206
  intent: ThreadAction.AddMessage,
209
207
  resolve: ({ anchor, subject, sender, text }) => {
210
- const thread = anchor[RelationSourceId];
208
+ const thread = Relation.getSource(anchor);
211
209
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
212
210
  const subjectId = fullyQualifiedId(subject);
213
211
  const space = getSpace(subject);
@@ -221,7 +219,7 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
221
219
  ]
222
220
  });
223
221
  const intents = [];
224
- const message = live(DataType.Message, {
222
+ const message = Obj.make(DataType.Message, {
225
223
  sender,
226
224
  created: (/* @__PURE__ */ new Date()).toISOString(),
227
225
  blocks: [
@@ -276,7 +274,7 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
276
274
  createResolver({
277
275
  intent: ThreadAction.DeleteMessage,
278
276
  resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
279
- const thread = anchor[RelationSourceId];
277
+ const thread = Relation.getSource(anchor);
280
278
  const space = getSpace(subject);
281
279
  invariant(space, "Space not found", {
282
280
  F: __dxlog_file,
@@ -353,4 +351,4 @@ var intent_resolver_default = (context) => contributes(Capabilities.IntentResolv
353
351
  export {
354
352
  intent_resolver_default as default
355
353
  };
356
- //# sourceMappingURL=intent-resolver-CU22OPAH.mjs.map
354
+ //# sourceMappingURL=intent-resolver-BU73VYW3.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, createResolver, type PluginContext } from '@dxos/app-framework';\nimport { sleep } from '@dxos/async';\nimport { Obj, Relation } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, getSpace, Ref } from '@dxos/react-client/echo';\nimport { AnchoredTo, DataType } from '@dxos/schema';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction, ThreadType } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: ThreadAction.CreateChannel,\n resolve: ({ name }) => ({\n data: {\n object: Obj.make(ChannelType, {\n name,\n defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),\n threads: [],\n }),\n },\n }),\n }),\n createResolver({\n intent: ThreadAction.CreateChannelThread,\n resolve: ({ channel }) => {\n const thread = Obj.make(ThreadType, { messages: [], status: 'active' });\n channel.threads.push(Ref.make(thread));\n return {\n data: {\n object: thread,\n },\n };\n },\n }),\n // TODO(wittjosiah): Break this up into more composable pieces.\n createResolver({\n intent: ThreadAction.Create,\n resolve: ({ name, anchor: _anchor, subject }) => {\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const thread = Obj.make(ThreadType, { name, messages: [], status: 'staged' });\n const anchor = Relation.make(AnchoredTo, {\n [Relation.Source]: thread,\n [Relation.Target]: subject,\n anchor: _anchor,\n });\n\n const draft = state.drafts[subjectId];\n if (draft) {\n draft.push(anchor);\n } else {\n state.drafts[subjectId] = [anchor];\n }\n\n return {\n intents: [\n createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),\n createIntent(DeckAction.ChangeCompanion, {\n primary: subjectId,\n companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,\n }),\n ],\n };\n },\n }),\n createResolver({\n intent: ThreadAction.Select,\n resolve: ({ current }) => {\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n state.current = current;\n },\n }),\n createResolver({\n intent: ThreadAction.ToggleResolved,\n resolve: ({ thread }) => {\n if (thread.status === 'active' || thread.status === undefined) {\n thread.status = 'resolved';\n } else if (thread.status === 'resolved') {\n thread.status = 'active';\n }\n\n const space = getSpace(thread);\n invariant(space, 'Space not found');\n const spaceId = space.id;\n\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.toggle-resolved',\n properties: {\n spaceId,\n threadId: thread.id,\n },\n }),\n ],\n };\n },\n }),\n createResolver({\n intent: ThreadAction.Delete,\n resolve: async ({ subject, anchor, thread: _thread }, undo) => {\n const thread = _thread ?? (Relation.getSource(anchor) as ThreadType);\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const draft = state.drafts[subjectId];\n if (draft) {\n // Check if we're deleting a draft; if so, remo ve it.\n const index = draft.findIndex((a) => a.id === anchor.id);\n if (index !== -1) {\n draft.splice(index, 1);\n return;\n }\n }\n\n const space = getSpace(anchor);\n if (!space) {\n return;\n }\n\n if (!undo) {\n // TODO(wittjosiah): Without sleep, rendering crashes at `Relation.setSource(anchor)`.\n space.db.remove(anchor);\n await sleep(100);\n space.db.remove(thread);\n\n return {\n undoable: {\n message: ['thread deleted label', { ns: THREAD_PLUGIN }],\n data: { thread, anchor },\n },\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n ],\n };\n } else {\n // TODO(wittjosiah): Without sleep, rendering crashes at `Relation.setSource(anchor)`.\n space.db.add(thread);\n await sleep(100);\n space.db.add(anchor);\n\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.undo-delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n ],\n };\n }\n },\n }),\n createResolver({\n intent: ThreadAction.AddMessage,\n resolve: ({ anchor, subject, sender, text }) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n const intents = [];\n\n const message = Obj.make(DataType.Message, {\n sender,\n created: new Date().toISOString(),\n blocks: [{ type: 'text', text }],\n // TODO(wittjosiah): Context based on attention.\n // context: context ? Ref.make(context) : undefined,\n });\n thread.messages.push(Ref.make(message));\n\n const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);\n if (draft) {\n // Move draft to document.\n thread.status = 'active';\n // TODO(wittjosiah): This causes the thread to flash as it transitions from draft to db.\n state.drafts[subjectId] = state.drafts[subjectId]?.filter((a) => a.id !== anchor.id);\n intents.push(createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }));\n intents.push(\n createIntent(SpaceAction.AddRelation, {\n space,\n schema: AnchoredTo,\n source: thread,\n target: subject,\n fields: { anchor: draft.anchor },\n }),\n );\n intents.push(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.create',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n );\n }\n\n intents.push(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.add',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n threadLength: thread.messages.length,\n messageId: message.id,\n messageLength: text.length,\n },\n }),\n );\n\n return { intents };\n },\n }),\n createResolver({\n intent: ThreadAction.DeleteMessage,\n resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n\n if (!undo) {\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));\n const message = thread.messages[messageIndex]?.target;\n if (!message) {\n return;\n }\n\n if (messageIndex === 0 && thread.messages.length === 1) {\n // If the message is the only message in the thread, delete the thread.\n return {\n intents: [createIntent(ThreadAction.Delete, { subject, anchor })],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: ['message deleted label', { ns: THREAD_PLUGIN }],\n data: { message, messageIndex },\n },\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n messageId: message.id,\n },\n }),\n ],\n };\n } else {\n if (messageIndex === undefined || !message) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, Ref.make(message));\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.undo-delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n messageId: message.id,\n },\n }),\n ],\n };\n }\n },\n }),\n ]);\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "createIntent", "createResolver", "sleep", "Obj", "Relation", "invariant", "ATTENDABLE_PATH_SEPARATOR", "DeckAction", "ObservabilityAction", "SpaceAction", "fullyQualifiedId", "getSpace", "Ref", "AnchoredTo", "DataType", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "ThreadAction", "CreateChannel", "resolve", "name", "data", "object", "Obj", "make", "ChannelType", "defaultThread", "Ref", "ThreadType", "messages", "status", "threads", "CreateChannelThread", "channel", "thread", "push", "Create", "anchor", "_anchor", "subject", "space", "getSpace", "invariant", "state", "getCapability", "ThreadCapabilities", "MutableState", "subjectId", "fullyQualifiedId", "Relation", "AnchoredTo", "Source", "Target", "draft", "drafts", "intents", "createIntent", "Select", "current", "DeckAction", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "ToggleResolved", "undefined", "spaceId", "id", "ObservabilityAction", "SendEvent", "properties", "threadId", "Delete", "_thread", "undo", "getSource", "index", "findIndex", "a", "splice", "db", "remove", "sleep", "undoable", "message", "ns", "THREAD_PLUGIN", "add", "AddMessage", "sender", "text", "DataType", "Message", "created", "Date", "toISOString", "blocks", "type", "find", "filter", "SpaceAction", "AddObject", "target", "hidden", "AddRelation", "schema", "source", "fields", "threadLength", "length", "messageId", "messageLength", "DeleteMessage", "messageIndex", "hasObjectId"]
7
+ }
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  ThreadAction,
4
4
  ThreadType
5
- } from "./chunk-J323VQ4P.mjs";
5
+ } from "./chunk-UJMPYKT3.mjs";
6
6
  import {
7
7
  ThreadCapabilities
8
8
  } from "./chunk-K4KAUOKT.mjs";
@@ -20,7 +20,7 @@ import { commentClickedEffect, commentsState, overlap } from "@dxos/react-ui-edi
20
20
  import { EditorView } from "@codemirror/view";
21
21
  import { computed, effect } from "@preact/signals-core";
22
22
  import { createIntent } from "@dxos/app-framework";
23
- import { Filter, isInstanceOf, Query, RelationSourceId } from "@dxos/echo-schema";
23
+ import { Filter, Obj, Query, Relation } from "@dxos/echo";
24
24
  import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from "@dxos/react-client/echo";
25
25
  import { comments, createExternalCommentSync } from "@dxos/react-ui-editor";
26
26
  import { AnchoredTo } from "@dxos/schema";
@@ -42,8 +42,8 @@ var threads = (state, doc, dispatch) => {
42
42
  const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo));
43
43
  const unsubscribe = query.subscribe();
44
44
  const anchors = computed(() => query.objects.filter((anchor) => {
45
- const thread = anchor[RelationSourceId];
46
- return isInstanceOf(ThreadType, thread) && thread.status !== "resolved";
45
+ const thread = Relation.getSource(anchor);
46
+ return Obj.instanceOf(ThreadType, thread) && thread.status !== "resolved";
47
47
  }).concat(state.drafts[fullyQualifiedId(doc)] ?? []));
48
48
  return [
49
49
  EditorView.domEventHandlers({
@@ -56,7 +56,7 @@ var threads = (state, doc, dispatch) => {
56
56
  anchors.value.forEach((anchor) => {
57
57
  if (anchor.anchor) {
58
58
  const name = getName(doc, anchor.anchor);
59
- const thread = anchor[RelationSourceId];
59
+ const thread = Relation.getSource(anchor);
60
60
  if (name && name !== thread.name) {
61
61
  thread.name = name;
62
62
  }
@@ -65,7 +65,7 @@ var threads = (state, doc, dispatch) => {
65
65
  }
66
66
  }),
67
67
  createExternalCommentSync(fullyQualifiedId(doc), (sink) => effect(() => sink()), () => anchors.value.filter((anchor) => anchor.anchor).map((anchor) => ({
68
- id: fullyQualifiedId(anchor[RelationSourceId]),
68
+ id: fullyQualifiedId(Relation.getSource(anchor)),
69
69
  cursor: anchor.anchor
70
70
  }))),
71
71
  comments({
@@ -94,14 +94,14 @@ var threads = (state, doc, dispatch) => {
94
94
  onUpdate: ({ id, cursor }) => {
95
95
  const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);
96
96
  if (draft) {
97
- const thread = draft[RelationSourceId];
97
+ const thread = Relation.getSource(draft);
98
98
  thread.name = getName(doc, cursor);
99
99
  draft.anchor = cursor;
100
100
  }
101
101
  const relation = query.objects.find((object) => getSource(object).id === id);
102
102
  if (relation) {
103
103
  const thread = getSource(relation);
104
- if (isInstanceOf(ThreadType, thread)) {
104
+ if (Obj.instanceOf(ThreadType, thread)) {
105
105
  thread.name = getName(doc, cursor);
106
106
  relation.anchor = cursor;
107
107
  }
@@ -167,4 +167,4 @@ var selectionOverlapsComment = (state) => {
167
167
  export {
168
168
  markdown_default as default
169
169
  };
170
- //# sourceMappingURL=markdown-HRGGO7IA.mjs.map
170
+ //# sourceMappingURL=markdown-HJUWNBLS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/markdown.ts", "../../../src/extensions/threads.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { commentClickedEffect, commentsState, type EditorState, overlap } from '@dxos/react-ui-editor';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { threads } from '../extensions';\n\nexport default (context: PluginContext) =>\n contributes(MarkdownCapabilities.Extensions, [\n ({ document: doc }) => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n return threads(state, doc, dispatch);\n },\n ({ document: doc }) => {\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n\n return EditorView.updateListener.of((update) => {\n if (update.docChanged || update.selectionSet) {\n state.toolbar[fullyQualifiedId(doc)] = selectionOverlapsComment(update.state);\n }\n });\n },\n ({ document: doc }) => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const id = fullyQualifiedId(doc);\n\n return EditorView.updateListener.of((update) => {\n update.transactions.forEach((transaction) => {\n transaction.effects.forEach(async (effect) => {\n if (effect.is(commentClickedEffect)) {\n void dispatch(\n createIntent(DeckAction.ChangeCompanion, {\n primary: id,\n companion: `${id}${ATTENDABLE_PATH_SEPARATOR}comments`,\n }),\n );\n }\n });\n });\n });\n },\n ]);\n\nconst selectionOverlapsComment = (state: EditorState): boolean => {\n // May not be defined if thread plugin not installed.\n const commentState = state.field(commentsState, false);\n if (commentState === undefined) {\n return false;\n }\n\n const { selection } = state;\n for (const range of selection.ranges) {\n if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {\n return true;\n }\n }\n\n return false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { computed, effect } from '@preact/signals-core';\n\nimport { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { type DocumentType } from '@dxos/plugin-markdown/types';\nimport { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';\nimport { comments, createExternalCommentSync } from '@dxos/react-ui-editor';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadAction, ThreadType, type ThreadState } from '../types';\n\n// TODO(burdon): Factor out.\nconst getName = (doc: DocumentType, anchor: string): string | undefined => {\n if (doc.content) {\n const [start, end] = anchor.split(':');\n return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);\n }\n};\n\n/**\n * Construct plugins.\n */\nexport const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {\n const space = doc && getSpace(doc);\n if (!doc || !space || !dispatch) {\n // Include no-op comments extension here to ensure that the facets are always present when they are expected.\n // TODO(wittjosiah): The Editor should only look for these facets when comments are available.\n return [comments()];\n }\n\n const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo));\n const unsubscribe = query.subscribe();\n\n const anchors = computed(() =>\n query.objects\n .filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return Obj.instanceOf(ThreadType, thread) && thread.status !== 'resolved';\n })\n .concat(state.drafts[fullyQualifiedId(doc)] ?? []),\n );\n\n return [\n EditorView.domEventHandlers({\n destroy: () => {\n unsubscribe();\n },\n }),\n\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n anchors.value.forEach((anchor) => {\n if (anchor.anchor) {\n // Only update if the name has changed, otherwise this will cause an infinite loop.\n // Skip if the name is empty; this means comment text was deleted, but thread name should remain.\n const name = getName(doc, anchor.anchor);\n const thread = Relation.getSource(anchor) as ThreadType;\n if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n }\n }),\n\n createExternalCommentSync(\n fullyQualifiedId(doc),\n (sink) => effect(() => sink()),\n () =>\n anchors.value\n .filter((anchor) => anchor.anchor)\n .map((anchor) => ({ id: fullyQualifiedId(Relation.getSource(anchor)), cursor: anchor.anchor })),\n ),\n\n comments({\n id: fullyQualifiedId(doc),\n onCreate: ({ cursor }) => {\n const name = getName(doc, cursor);\n void dispatch(createIntent(ThreadAction.Create, { anchor: cursor, name, subject: doc }));\n },\n onDelete: ({ id }) => {\n const draft = state.drafts[fullyQualifiedId(doc)];\n if (draft) {\n const index = draft.findIndex((thread) => fullyQualifiedId(thread) === id);\n if (index !== -1) {\n draft.splice(index, 1);\n }\n }\n\n const thread = query.objects.find((object) => getSource(object).id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);\n if (draft) {\n const thread = Relation.getSource(draft) as ThreadType;\n thread.name = getName(doc, cursor);\n draft.anchor = cursor;\n }\n\n const relation = query.objects.find((object) => getSource(object).id === id);\n if (relation) {\n const thread = getSource(relation);\n if (Obj.instanceOf(ThreadType, thread)) {\n thread.name = getName(doc, cursor);\n relation.anchor = cursor;\n }\n }\n },\n onSelect: ({ selection }) => {\n const current = selection.current ?? selection.closest;\n if (current) {\n void dispatch(createIntent(ThreadAction.Select, { current }));\n }\n },\n }),\n ];\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["EditorView", "Capabilities", "contributes", "createIntent", "ATTENDABLE_PATH_SEPARATOR", "DeckAction", "MarkdownCapabilities", "fullyQualifiedId", "commentClickedEffect", "commentsState", "overlap", "EditorView", "computed", "effect", "createIntent", "Filter", "Obj", "Query", "Relation", "getSpace", "getTextInRange", "createDocAccessor", "fullyQualifiedId", "getSource", "comments", "createExternalCommentSync", "AnchoredTo", "getName", "doc", "anchor", "content", "start", "end", "split", "getTextInRange", "createDocAccessor", "target", "threads", "state", "dispatch", "space", "getSpace", "comments", "query", "db", "Query", "select", "Filter", "ids", "id", "targetOf", "AnchoredTo", "unsubscribe", "subscribe", "anchors", "computed", "objects", "filter", "thread", "Relation", "getSource", "Obj", "instanceOf", "ThreadType", "status", "concat", "drafts", "fullyQualifiedId", "EditorView", "domEventHandlers", "destroy", "updateListener", "of", "update", "docChanged", "value", "forEach", "name", "createExternalCommentSync", "sink", "effect", "map", "cursor", "onCreate", "createIntent", "ThreadAction", "Create", "subject", "onDelete", "draft", "index", "findIndex", "splice", "find", "object", "undefined", "onUpdate", "relation", "onSelect", "selection", "current", "closest", "Select", "context", "contributes", "MarkdownCapabilities", "Extensions", "document", "doc", "dispatchPromise", "dispatch", "getCapability", "Capabilities", "IntentDispatcher", "state", "ThreadCapabilities", "MutableState", "threads", "EditorView", "updateListener", "of", "update", "docChanged", "selectionSet", "toolbar", "fullyQualifiedId", "selectionOverlapsComment", "id", "transactions", "forEach", "transaction", "effects", "effect", "is", "commentClickedEffect", "createIntent", "DeckAction", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "commentState", "field", "commentsState", "undefined", "selection", "range", "ranges", "comments", "some", "commentRange", "overlap"]
7
+ }