@dxos/plugin-thread 0.7.5-labs.c0e040f → 0.7.5-labs.d199c0f

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 (105) hide show
  1. package/dist/lib/browser/chunk-VOMIDDNO.mjs +15 -0
  2. package/dist/lib/browser/chunk-VOMIDDNO.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-NO5AZLUZ.mjs → chunk-YK3ICB7G.mjs} +2 -4
  4. package/dist/lib/browser/{chunk-NO5AZLUZ.mjs.map → chunk-YK3ICB7G.mjs.map} +3 -3
  5. package/dist/lib/browser/index.mjs +43 -45
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/{intent-resolver-QFP6L3AF.mjs → intent-resolver-FAFQ54NP.mjs} +4 -4
  8. package/dist/lib/browser/{intent-resolver-QFP6L3AF.mjs.map → intent-resolver-FAFQ54NP.mjs.map} +1 -1
  9. package/dist/lib/browser/{markdown-2NBXKXCY.mjs → markdown-RPYOUBVR.mjs} +4 -4
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/{react-surface-YDKOPRQP.mjs → react-surface-Y4MUSICN.mjs} +36 -27
  12. package/dist/lib/browser/react-surface-Y4MUSICN.mjs.map +7 -0
  13. package/dist/lib/browser/{settings-TKOPRXSU.mjs → settings-WQTE5AEZ.mjs} +2 -2
  14. package/dist/lib/browser/types.mjs +1 -1
  15. package/dist/lib/node/{chunk-ZJTWNCFQ.cjs → chunk-BHFHFTHO.cjs} +8 -13
  16. package/dist/lib/node/chunk-BHFHFTHO.cjs.map +7 -0
  17. package/dist/lib/node/{chunk-AUVKOX5Q.cjs → chunk-CMEMMYDL.cjs} +5 -7
  18. package/dist/lib/node/{chunk-AUVKOX5Q.cjs.map → chunk-CMEMMYDL.cjs.map} +3 -3
  19. package/dist/lib/node/index.cjs +44 -44
  20. package/dist/lib/node/index.cjs.map +3 -3
  21. package/dist/lib/node/{intent-resolver-ZSOQILPJ.cjs → intent-resolver-DVBEXJ33.cjs} +13 -13
  22. package/dist/lib/node/{intent-resolver-ZSOQILPJ.cjs.map → intent-resolver-DVBEXJ33.cjs.map} +1 -1
  23. package/dist/lib/node/{markdown-FWRKMSKV.cjs → markdown-ELRGISXE.cjs} +7 -7
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/{react-surface-AX644GMQ.cjs → react-surface-7HLTN5XS.cjs} +40 -31
  26. package/dist/lib/node/react-surface-7HLTN5XS.cjs.map +7 -0
  27. package/dist/lib/node/{settings-TH4YSUVU.cjs → settings-7VQYARM5.cjs} +6 -6
  28. package/dist/lib/node/types.cjs +3 -3
  29. package/dist/lib/node/types.cjs.map +1 -1
  30. package/dist/lib/node-esm/{chunk-B3CF35MY.mjs → chunk-33NDMQQQ.mjs} +2 -4
  31. package/dist/lib/node-esm/{chunk-B3CF35MY.mjs.map → chunk-33NDMQQQ.mjs.map} +3 -3
  32. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs +17 -0
  33. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs.map +7 -0
  34. package/dist/lib/node-esm/index.mjs +43 -45
  35. package/dist/lib/node-esm/index.mjs.map +3 -3
  36. package/dist/lib/node-esm/{intent-resolver-MHP4C2NZ.mjs → intent-resolver-DHVLBNCC.mjs} +4 -4
  37. package/dist/lib/node-esm/{intent-resolver-MHP4C2NZ.mjs.map → intent-resolver-DHVLBNCC.mjs.map} +1 -1
  38. package/dist/lib/node-esm/{markdown-6AQFDAW3.mjs → markdown-23OB7EZG.mjs} +4 -4
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/{react-surface-74X2TKEZ.mjs → react-surface-AZHTTR6J.mjs} +36 -27
  41. package/dist/lib/node-esm/react-surface-AZHTTR6J.mjs.map +7 -0
  42. package/dist/lib/node-esm/{settings-KEDRR7RM.mjs → settings-SGMM7UDT.mjs} +2 -2
  43. package/dist/lib/node-esm/types.mjs +1 -1
  44. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/index.d.ts +2 -179
  46. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  48. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/state.d.ts +1 -1
  50. package/dist/types/src/components/ChatContainer.d.ts +2 -3
  51. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  52. package/dist/types/src/components/CommentContainer.d.ts +1 -2
  53. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  54. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  55. package/dist/types/src/components/CommentsContainer.d.ts +1 -2
  56. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  57. package/dist/types/src/components/MessageContainer.d.ts +1 -2
  58. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  59. package/dist/types/src/components/ThreadComplementary.d.ts +1 -2
  60. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  61. package/dist/types/src/components/ThreadContainer.d.ts +2 -2
  62. package/dist/types/src/components/ThreadContainer.d.ts.map +1 -1
  63. package/dist/types/src/components/ThreadSettings.d.ts +1 -2
  64. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  65. package/dist/types/src/components/index.d.ts +1 -1
  66. package/dist/types/src/components/index.d.ts.map +1 -1
  67. package/dist/types/src/components/testing.d.ts +12 -12
  68. package/dist/types/src/components/testing.d.ts.map +1 -1
  69. package/dist/types/src/translations.d.ts +6 -3
  70. package/dist/types/src/translations.d.ts.map +1 -1
  71. package/dist/types/src/types.d.ts +5 -7
  72. package/dist/types/src/types.d.ts.map +1 -1
  73. package/package.json +31 -29
  74. package/src/ThreadPlugin.tsx +44 -47
  75. package/src/capabilities/index.ts +0 -1
  76. package/src/capabilities/intent-resolver.ts +1 -1
  77. package/src/capabilities/react-surface.tsx +1 -2
  78. package/src/components/Comments.stories.tsx +8 -2
  79. package/src/components/ThreadComplementary.tsx +32 -2
  80. package/src/components/ThreadSettings.tsx +5 -11
  81. package/src/translations.ts +2 -1
  82. package/src/types.ts +1 -5
  83. package/dist/lib/browser/app-graph-builder-IANFWFYN.mjs +0 -121
  84. package/dist/lib/browser/app-graph-builder-IANFWFYN.mjs.map +0 -7
  85. package/dist/lib/browser/chunk-CQ3NH4RJ.mjs +0 -18
  86. package/dist/lib/browser/chunk-CQ3NH4RJ.mjs.map +0 -7
  87. package/dist/lib/browser/react-surface-YDKOPRQP.mjs.map +0 -7
  88. package/dist/lib/node/app-graph-builder-LFEDPJLK.cjs +0 -135
  89. package/dist/lib/node/app-graph-builder-LFEDPJLK.cjs.map +0 -7
  90. package/dist/lib/node/chunk-ZJTWNCFQ.cjs.map +0 -7
  91. package/dist/lib/node/react-surface-AX644GMQ.cjs.map +0 -7
  92. package/dist/lib/node-esm/app-graph-builder-IXHFRMCY.mjs +0 -122
  93. package/dist/lib/node-esm/app-graph-builder-IXHFRMCY.mjs.map +0 -7
  94. package/dist/lib/node-esm/chunk-4PZTMSVF.mjs +0 -20
  95. package/dist/lib/node-esm/chunk-4PZTMSVF.mjs.map +0 -7
  96. package/dist/lib/node-esm/react-surface-74X2TKEZ.mjs.map +0 -7
  97. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -180
  98. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  99. package/src/capabilities/app-graph-builder.ts +0 -119
  100. /package/dist/lib/browser/{markdown-2NBXKXCY.mjs.map → markdown-RPYOUBVR.mjs.map} +0 -0
  101. /package/dist/lib/browser/{settings-TKOPRXSU.mjs.map → settings-WQTE5AEZ.mjs.map} +0 -0
  102. /package/dist/lib/node/{markdown-FWRKMSKV.cjs.map → markdown-ELRGISXE.cjs.map} +0 -0
  103. /package/dist/lib/node/{settings-TH4YSUVU.cjs.map → settings-7VQYARM5.cjs.map} +0 -0
  104. /package/dist/lib/node-esm/{markdown-6AQFDAW3.mjs.map → markdown-23OB7EZG.mjs.map} +0 -0
  105. /package/dist/lib/node-esm/{settings-KEDRR7RM.mjs.map → settings-SGMM7UDT.mjs.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/ThreadSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useLayout } from '@dxos/app-framework';\nimport { type Ref } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { log } from '@dxos/log';\nimport { ChannelType, type ThreadType } from '@dxos/plugin-space/types';\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { ThreadContainer, ThreadComplementary, ThreadSettings } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${THREAD_PLUGIN}/channel`,\n role: 'article',\n filter: (data): data is { subject: ChannelType } =>\n data.subject instanceof ChannelType && !!data.subject.threads[0],\n component: ({ data, role }) => {\n const layout = useLayout();\n const channel = data.subject;\n void channel.threads[0].load();\n const thread = channel.threads[0].target;\n if (!thread) {\n return null;\n }\n log.info('thread', { thread });\n const currentPosition = layout.active.findIndex((id) => id === channel.id);\n if (currentPosition > 0) {\n const objectToTheLeft = layout.active[currentPosition - 1];\n const context = getSpace(channel)?.db.getObjectById(objectToTheLeft);\n return <ThreadContainer role={role} thread={thread} context={context} />;\n }\n\n return <ThreadContainer role={role} thread={thread} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/thread`,\n role: 'complementary--comments',\n filter: (data): data is { subject: { threads: Ref<ThreadType>[] } } =>\n !!data.subject &&\n typeof data.subject === 'object' &&\n 'threads' in data.subject &&\n Array.isArray(data.subject.threads) &&\n !(data.subject instanceof ChannelType),\n component: ({ data }) => <ThreadComplementary subject={data.subject} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,\n component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ThreadContainer = lazy(() => import('./ThreadContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\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 { 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 { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\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.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-30'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\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?.(thread), [onAttend, thread]);\n const handleResolve = useCallback(() => onResolve?.(thread), [onResolve, thread]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(thread, id), [onMessageDelete, thread]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(thread), [onThreadDelete, thread]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(thread, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [thread, 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.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-30' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.allResolvedTargets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleMessageDelete} />\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 { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<ThreadContainerProps, 'thread' | 'detached' | 'current' | 'autoFocus'> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n showResolvedThreads,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n {...props}\n />\n );\n })\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from '@dxos/app-framework';\nimport { ThreadCapabilities } from '@dxos/plugin-space';\nimport { MessageType, type ThreadType } from '@dxos/plugin-space/types';\nimport { create, fullyQualifiedId, makeRef, RefArray } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { isNonNullable } from '@dxos/util';\n\nimport { ThreadCapabilities as LocalThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { ThreadAction } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n\n const { state, getViewState } = useCapability(LocalThreadCapabilities.MutableState);\n const { showResolvedThreads } = getViewState(fullyQualifiedId(subject));\n const drafts = state.drafts[fullyQualifiedId(subject)];\n\n const threadsIntegrators = useCapabilities(ThreadCapabilities.Thread);\n const createSort = useMemo(\n () => threadsIntegrators.find((p) => p.predicate(subject))?.createSort,\n [threadsIntegrators, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threadObjects = RefArray.allResolvedTargets(subject.threads ?? []);\n\n const threads = useMemo(() => {\n return threadObjects.concat(drafts ?? []).filter(isNonNullable) as ThreadType[];\n }, [JSON.stringify(threadObjects), JSON.stringify(drafts)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const handleAttend = useCallback(\n (thread: ThreadType) => {\n const threadId = fullyQualifiedId(thread);\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: thread.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (thread: ThreadType, message: string) => {\n thread.messages.push(\n makeRef(\n create(MessageType, {\n sender: { identityKey: identity?.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: message,\n // TODO(wittjosiah): Context based on attention.\n // context: context ? makeRef(context) : undefined,\n }),\n ),\n );\n\n await dispatch(createIntent(ThreadAction.OnMessageAdd, { thread, subject }));\n\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.ToggleResolved, { thread })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.Delete, { thread, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (thread: ThreadType, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { thread, subject, messageId })),\n [dispatch, subject],\n );\n\n return (\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.includes(qualifiedSubjectId) ? 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { 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 (\n <DeprecatedFormContainer>\n <DeprecatedFormInput label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "useLayout", "SettingsStore", "log", "ChannelType", "getSpace", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "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", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "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", "ThreadHeading", "name", "side", "status", "Tag", "palette", "RefArray", "allResolvedTargets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "fullyQualifiedId", "useTranslation", "Trans", "descriptionText", "mx", "CommentsContainer", "threads", "detached", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "React", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "includes", "div", "role", "className", "mx", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "React", "useCallback", "useEffect", "useMemo", "createIntent", "LayoutAction", "useCapability", "useCapabilities", "useIntentDispatcher", "ThreadCapabilities", "MessageType", "create", "fullyQualifiedId", "makeRef", "RefArray", "useIdentity", "useAttended", "isNonNullable", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "state", "getViewState", "useCapability", "LocalThreadCapabilities", "MutableState", "showResolvedThreads", "fullyQualifiedId", "drafts", "threadsIntegrators", "useCapabilities", "ThreadCapabilities", "Thread", "createSort", "useMemo", "find", "p", "predicate", "sort", "threadObjects", "RefArray", "allResolvedTargets", "threads", "concat", "filter", "isNonNullable", "JSON", "stringify", "detachedIds", "anchor", "map", "thread", "useEffect", "a", "b", "attended", "useAttended", "qualifiedSubjectId", "handleAttend", "useCallback", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "message", "messages", "push", "makeRef", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "text", "ThreadAction", "OnMessageAdd", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "React", "CommentsContainer", "detached", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "React", "Input", "useTranslation", "DeprecatedFormContainer", "DeprecatedFormInput", "ThreadSettings", "settings", "t", "useTranslation", "THREAD_PLUGIN", "React", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Input", "Switch", "checked", "standalone", "onCheckedChange", "ThreadContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "THREAD_PLUGIN", "role", "filter", "data", "subject", "ChannelType", "threads", "component", "layout", "useLayout", "channel", "load", "thread", "target", "log", "info", "currentPosition", "active", "findIndex", "objectToTheLeft", "context", "getSpace", "db", "getObjectById", "React", "ThreadContainer", "Array", "isArray", "ThreadComplementary", "SettingsStore", "prefix", "ThreadSettings", "settings", "value"]
7
- }
@@ -1,135 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var app_graph_builder_LFEDPJLK_exports = {};
20
- __export(app_graph_builder_LFEDPJLK_exports, {
21
- default: () => app_graph_builder_default
22
- });
23
- module.exports = __toCommonJS(app_graph_builder_LFEDPJLK_exports);
24
- var import_chunk_FPWNZ6TB = require("./chunk-FPWNZ6TB.cjs");
25
- var import_chunk_F735VMTN = require("./chunk-F735VMTN.cjs");
26
- var import_app_framework = require("@dxos/app-framework");
27
- var import_plugin_client = require("@dxos/plugin-client");
28
- var import_plugin_graph = require("@dxos/plugin-graph");
29
- var import_types = require("@dxos/plugin-observability/types");
30
- var import_plugin_space = require("@dxos/plugin-space");
31
- var import_echo = require("@dxos/react-client/echo");
32
- var type = "orphan-comments-for-subject";
33
- var icon = "ph--chat-text--regular";
34
- var app_graph_builder_default = (context) => {
35
- const resolver = (typename) => context.requestCapabilities(import_app_framework.Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
36
- return (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphBuilder, (0, import_plugin_graph.createExtension)({
37
- id: `${import_chunk_F735VMTN.THREAD_PLUGIN}/comments-for-subject`,
38
- resolver: ({ id }) => {
39
- if (!id.endsWith("~comments")) {
40
- return;
41
- }
42
- const client = context.requestCapability(import_plugin_client.ClientCapabilities.Client);
43
- const [subjectId] = id.split("~");
44
- const { spaceId, objectId } = (0, import_echo.parseId)(subjectId);
45
- const spaces = (0, import_plugin_graph.toSignal)((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
46
- const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === import_echo.SpaceState.SPACE_READY);
47
- if (!objectId) {
48
- return {
49
- id,
50
- type,
51
- data: null,
52
- properties: {
53
- icon,
54
- label: [
55
- "unnamed object threads label",
56
- {
57
- ns: import_chunk_F735VMTN.THREAD_PLUGIN
58
- }
59
- ],
60
- showResolvedThreads: false,
61
- object: null,
62
- space
63
- }
64
- };
65
- }
66
- const [object] = (0, import_plugin_space.memoizeQuery)(space, {
67
- id: objectId
68
- });
69
- if (!object || !subjectId) {
70
- return;
71
- }
72
- const meta = resolver((0, import_echo.getTypename)(object) ?? "");
73
- const label = meta.label?.(object) || object.name || meta.placeholder || [
74
- "unnamed object threads label",
75
- {
76
- ns: import_chunk_F735VMTN.THREAD_PLUGIN
77
- }
78
- ];
79
- const { getViewState } = context.requestCapability(import_chunk_FPWNZ6TB.ThreadCapabilities.State);
80
- const viewState = getViewState(subjectId);
81
- return {
82
- id,
83
- type,
84
- data: null,
85
- properties: {
86
- icon,
87
- label,
88
- showResolvedThreads: viewState.showResolvedThreads,
89
- object
90
- }
91
- };
92
- },
93
- actions: ({ node }) => {
94
- const dataId = node.id.split("~").at(0);
95
- if (!node.id.endsWith("~comments") || !dataId) {
96
- return;
97
- }
98
- const [spaceId, objectId] = dataId.split(":");
99
- const { getViewState } = context.requestCapability(import_chunk_FPWNZ6TB.ThreadCapabilities.State);
100
- const viewState = getViewState(dataId);
101
- const toggle = async () => {
102
- const newToggleState = !viewState.showResolvedThreads;
103
- viewState.showResolvedThreads = newToggleState;
104
- const { dispatchPromise: dispatch } = context.requestCapability(import_app_framework.Capabilities.IntentDispatcher);
105
- await dispatch((0, import_app_framework.createIntent)(import_types.ObservabilityAction.SendEvent, {
106
- name: "threads.toggle-show-resolved",
107
- properties: {
108
- spaceId,
109
- threadId: objectId,
110
- showResolved: newToggleState
111
- }
112
- }));
113
- };
114
- return [
115
- {
116
- id: `${import_chunk_F735VMTN.THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,
117
- data: toggle,
118
- properties: {
119
- label: [
120
- "toggle show resolved",
121
- {
122
- ns: import_chunk_F735VMTN.THREAD_PLUGIN
123
- }
124
- ],
125
- menuItemType: "toggle",
126
- isChecked: viewState.showResolvedThreads,
127
- testId: "threadPlugin.toggleShowResolved",
128
- icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
129
- }
130
- }
131
- ];
132
- }
133
- }));
134
- };
135
- //# sourceMappingURL=app-graph-builder-LFEDPJLK.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, toSignal } from '@dxos/plugin-graph';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { getTypename, parseId, SpaceState } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { THREAD_PLUGIN } from '../meta';\n\nconst type = 'orphan-comments-for-subject';\nconst icon = 'ph--chat-text--regular';\n\nexport default (context: PluginsContext) => {\n const resolver = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label: ['unnamed object threads label', { ns: THREAD_PLUGIN }],\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolver(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(subjectId);\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n object,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(dataId);\n const toggle = async () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n }),\n );\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n icon: viewState.showResolvedThreads ? 'ph--eye-slash--regular' : 'ph--eye--regular',\n },\n },\n ];\n },\n }),\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["type", "icon", "context", "resolver", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "endsWith", "client", "requestCapability", "ClientCapabilities", "Client", "subjectId", "split", "spaceId", "objectId", "parseId", "spaces", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "space", "state", "SpaceState", "SPACE_READY", "data", "properties", "label", "ns", "showResolvedThreads", "object", "memoizeQuery", "meta", "getTypename", "name", "placeholder", "getViewState", "ThreadCapabilities", "State", "viewState", "actions", "node", "dataId", "at", "toggle", "newToggleState", "dispatchPromise", "dispatch", "IntentDispatcher", "createIntent", "ObservabilityAction", "SendEvent", "threadId", "showResolved", "menuItemType", "isChecked", "testId"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const Markdown = lazy(() => import('./markdown'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const ThreadSettings = lazy(() => import('./settings'));\nexport const ThreadState = lazy(() => import('./state'));\n\nexport * from './capabilities';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAAqB;AAEd,IAAMA,sBAAkBC,2BAAK,MAAM,OAAO,kCAAA,CAAA;AAC1C,IAAMC,qBAAiBD,2BAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAME,eAAWF,2BAAK,MAAM,OAAO,yBAAA,CAAA;AACnC,IAAMG,mBAAeH,2BAAK,MAAM,OAAO,8BAAA,CAAA;AACvC,IAAMI,qBAAiBJ,2BAAK,MAAM,OAAO,yBAAA,CAAA;AACzC,IAAMK,kBAAcL,2BAAK,MAAM,OAAO,sBAAA,CAAA;",
6
- "names": ["AppGraphBuilder", "lazy", "IntentResolver", "Markdown", "ReactSurface", "ThreadSettings", "ThreadState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/ThreadSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useLayout } from '@dxos/app-framework';\nimport { type Ref } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { log } from '@dxos/log';\nimport { ChannelType, type ThreadType } from '@dxos/plugin-space/types';\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { ThreadContainer, ThreadComplementary, ThreadSettings } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${THREAD_PLUGIN}/channel`,\n role: 'article',\n filter: (data): data is { subject: ChannelType } =>\n data.subject instanceof ChannelType && !!data.subject.threads[0],\n component: ({ data, role }) => {\n const layout = useLayout();\n const channel = data.subject;\n void channel.threads[0].load();\n const thread = channel.threads[0].target;\n if (!thread) {\n return null;\n }\n log.info('thread', { thread });\n const currentPosition = layout.active.findIndex((id) => id === channel.id);\n if (currentPosition > 0) {\n const objectToTheLeft = layout.active[currentPosition - 1];\n const context = getSpace(channel)?.db.getObjectById(objectToTheLeft);\n return <ThreadContainer role={role} thread={thread} context={context} />;\n }\n\n return <ThreadContainer role={role} thread={thread} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/thread`,\n role: 'complementary--comments',\n filter: (data): data is { subject: { threads: Ref<ThreadType>[] } } =>\n !!data.subject &&\n typeof data.subject === 'object' &&\n 'threads' in data.subject &&\n Array.isArray(data.subject.threads) &&\n !(data.subject instanceof ChannelType),\n component: ({ data }) => <ThreadComplementary subject={data.subject} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,\n component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ThreadContainer = lazy(() => import('./ThreadContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\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 { 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 { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\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.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-30'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\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?.(thread), [onAttend, thread]);\n const handleResolve = useCallback(() => onResolve?.(thread), [onResolve, thread]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(thread, id), [onMessageDelete, thread]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(thread), [onThreadDelete, thread]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(thread, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [thread, 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.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-30' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.allResolvedTargets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleMessageDelete} />\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 { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<ThreadContainerProps, 'thread' | 'detached' | 'current' | 'autoFocus'> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n showResolvedThreads,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n {...props}\n />\n );\n })\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from '@dxos/app-framework';\nimport { ThreadCapabilities } from '@dxos/plugin-space';\nimport { MessageType, type ThreadType } from '@dxos/plugin-space/types';\nimport { create, fullyQualifiedId, makeRef, RefArray } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { isNonNullable } from '@dxos/util';\n\nimport { ThreadCapabilities as LocalThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { ThreadAction } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n\n const { state, getViewState } = useCapability(LocalThreadCapabilities.MutableState);\n const { showResolvedThreads } = getViewState(fullyQualifiedId(subject));\n const drafts = state.drafts[fullyQualifiedId(subject)];\n\n const threadsIntegrators = useCapabilities(ThreadCapabilities.Thread);\n const createSort = useMemo(\n () => threadsIntegrators.find((p) => p.predicate(subject))?.createSort,\n [threadsIntegrators, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threadObjects = RefArray.allResolvedTargets(subject.threads ?? []);\n\n const threads = useMemo(() => {\n return threadObjects.concat(drafts ?? []).filter(isNonNullable) as ThreadType[];\n }, [JSON.stringify(threadObjects), JSON.stringify(drafts)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const handleAttend = useCallback(\n (thread: ThreadType) => {\n const threadId = fullyQualifiedId(thread);\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: thread.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (thread: ThreadType, message: string) => {\n thread.messages.push(\n makeRef(\n create(MessageType, {\n sender: { identityKey: identity?.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: message,\n // TODO(wittjosiah): Context based on attention.\n // context: context ? makeRef(context) : undefined,\n }),\n ),\n );\n\n await dispatch(createIntent(ThreadAction.OnMessageAdd, { thread, subject }));\n\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.ToggleResolved, { thread })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.Delete, { thread, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (thread: ThreadType, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { thread, subject, messageId })),\n [dispatch, subject],\n );\n\n return (\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.includes(qualifiedSubjectId) ? 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { 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 (\n <DeprecatedFormContainer>\n <DeprecatedFormInput label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_echo", "import_react_ui", "import_react_ui_theme", "import_app_framework", "import_types", "import_halo", "import_util", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "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", "ThreadHeading", "name", "side", "status", "Tag", "palette", "RefArray", "allResolvedTargets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "CommentsContainer", "threads", "currentId", "showResolvedThreads", "props", "filteredThreads", "useEffect", "document", "getElementById", "length", "threadId", "includes", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "state", "getViewState", "useCapability", "LocalThreadCapabilities", "MutableState", "drafts", "threadsIntegrators", "useCapabilities", "ThreadCapabilities", "createSort", "find", "predicate", "sort", "threadObjects", "concat", "JSON", "stringify", "detachedIds", "anchor", "a", "b", "attended", "useAttended", "qualifiedSubjectId", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "push", "makeRef", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "ThreadAction", "OnMessageAdd", "ToggleResolved", "Delete", "messageId", "DeleteMessage", "undefined", "ThreadSettings", "settings", "DeprecatedFormContainer", "DeprecatedFormInput", "Input", "Switch", "checked", "standalone", "onCheckedChange", "ThreadContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "data", "ChannelType", "component", "layout", "useLayout", "channel", "load", "target", "log", "info", "currentPosition", "active", "findIndex", "objectToTheLeft", "context", "db", "getObjectById", "Array", "isArray", "SettingsStore", "prefix", "value"]
7
- }
@@ -1,122 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- ThreadCapabilities
4
- } from "./chunk-ZJITX3TO.mjs";
5
- import {
6
- THREAD_PLUGIN
7
- } from "./chunk-FXUATCLW.mjs";
8
-
9
- // packages/plugins/plugin-thread/src/capabilities/app-graph-builder.ts
10
- import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
11
- import { ClientCapabilities } from "@dxos/plugin-client";
12
- import { createExtension, toSignal } from "@dxos/plugin-graph";
13
- import { ObservabilityAction } from "@dxos/plugin-observability/types";
14
- import { memoizeQuery } from "@dxos/plugin-space";
15
- import { getTypename, parseId, SpaceState } from "@dxos/react-client/echo";
16
- var type = "orphan-comments-for-subject";
17
- var icon = "ph--chat-text--regular";
18
- var app_graph_builder_default = (context) => {
19
- const resolver = (typename) => context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
20
- return contributes(Capabilities.AppGraphBuilder, createExtension({
21
- id: `${THREAD_PLUGIN}/comments-for-subject`,
22
- resolver: ({ id }) => {
23
- if (!id.endsWith("~comments")) {
24
- return;
25
- }
26
- const client = context.requestCapability(ClientCapabilities.Client);
27
- const [subjectId] = id.split("~");
28
- const { spaceId, objectId } = parseId(subjectId);
29
- const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
30
- const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
31
- if (!objectId) {
32
- return {
33
- id,
34
- type,
35
- data: null,
36
- properties: {
37
- icon,
38
- label: [
39
- "unnamed object threads label",
40
- {
41
- ns: THREAD_PLUGIN
42
- }
43
- ],
44
- showResolvedThreads: false,
45
- object: null,
46
- space
47
- }
48
- };
49
- }
50
- const [object] = memoizeQuery(space, {
51
- id: objectId
52
- });
53
- if (!object || !subjectId) {
54
- return;
55
- }
56
- const meta = resolver(getTypename(object) ?? "");
57
- const label = meta.label?.(object) || object.name || meta.placeholder || [
58
- "unnamed object threads label",
59
- {
60
- ns: THREAD_PLUGIN
61
- }
62
- ];
63
- const { getViewState } = context.requestCapability(ThreadCapabilities.State);
64
- const viewState = getViewState(subjectId);
65
- return {
66
- id,
67
- type,
68
- data: null,
69
- properties: {
70
- icon,
71
- label,
72
- showResolvedThreads: viewState.showResolvedThreads,
73
- object
74
- }
75
- };
76
- },
77
- actions: ({ node }) => {
78
- const dataId = node.id.split("~").at(0);
79
- if (!node.id.endsWith("~comments") || !dataId) {
80
- return;
81
- }
82
- const [spaceId, objectId] = dataId.split(":");
83
- const { getViewState } = context.requestCapability(ThreadCapabilities.State);
84
- const viewState = getViewState(dataId);
85
- const toggle = async () => {
86
- const newToggleState = !viewState.showResolvedThreads;
87
- viewState.showResolvedThreads = newToggleState;
88
- const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
89
- await dispatch(createIntent(ObservabilityAction.SendEvent, {
90
- name: "threads.toggle-show-resolved",
91
- properties: {
92
- spaceId,
93
- threadId: objectId,
94
- showResolved: newToggleState
95
- }
96
- }));
97
- };
98
- return [
99
- {
100
- id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,
101
- data: toggle,
102
- properties: {
103
- label: [
104
- "toggle show resolved",
105
- {
106
- ns: THREAD_PLUGIN
107
- }
108
- ],
109
- menuItemType: "toggle",
110
- isChecked: viewState.showResolvedThreads,
111
- testId: "threadPlugin.toggleShowResolved",
112
- icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
113
- }
114
- }
115
- ];
116
- }
117
- }));
118
- };
119
- export {
120
- app_graph_builder_default as default
121
- };
122
- //# sourceMappingURL=app-graph-builder-IXHFRMCY.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, toSignal } from '@dxos/plugin-graph';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { getTypename, parseId, SpaceState } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { THREAD_PLUGIN } from '../meta';\n\nconst type = 'orphan-comments-for-subject';\nconst icon = 'ph--chat-text--regular';\n\nexport default (context: PluginsContext) => {\n const resolver = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label: ['unnamed object threads label', { ns: THREAD_PLUGIN }],\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolver(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(subjectId);\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n object,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const { getViewState } = context.requestCapability(ThreadCapabilities.State);\n const viewState = getViewState(dataId);\n const toggle = async () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n }),\n );\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n icon: viewState.showResolvedThreads ? 'ph--eye-slash--regular' : 'ph--eye--regular',\n },\n },\n ];\n },\n }),\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["Capabilities", "contributes", "createIntent", "ClientCapabilities", "createExtension", "toSignal", "ObservabilityAction", "memoizeQuery", "getTypename", "parseId", "SpaceState", "type", "icon", "context", "resolver", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "endsWith", "client", "requestCapability", "ClientCapabilities", "Client", "subjectId", "split", "spaceId", "objectId", "parseId", "spaces", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "space", "state", "SpaceState", "SPACE_READY", "data", "properties", "label", "ns", "showResolvedThreads", "object", "memoizeQuery", "meta", "getTypename", "name", "placeholder", "getViewState", "ThreadCapabilities", "State", "viewState", "actions", "node", "dataId", "at", "toggle", "newToggleState", "dispatchPromise", "dispatch", "IntentDispatcher", "createIntent", "ObservabilityAction", "SendEvent", "threadId", "showResolved", "menuItemType", "isChecked", "testId"]
7
- }
@@ -1,20 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // packages/plugins/plugin-thread/src/capabilities/index.ts
4
- import { lazy } from "@dxos/app-framework";
5
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-IXHFRMCY.mjs"));
6
- var IntentResolver = lazy(() => import("./intent-resolver-MHP4C2NZ.mjs"));
7
- var Markdown = lazy(() => import("./markdown-6AQFDAW3.mjs"));
8
- var ReactSurface = lazy(() => import("./react-surface-74X2TKEZ.mjs"));
9
- var ThreadSettings = lazy(() => import("./settings-KEDRR7RM.mjs"));
10
- var ThreadState = lazy(() => import("./state-7MLR27YG.mjs"));
11
-
12
- export {
13
- AppGraphBuilder,
14
- IntentResolver,
15
- Markdown,
16
- ReactSurface,
17
- ThreadSettings,
18
- ThreadState
19
- };
20
- //# sourceMappingURL=chunk-4PZTMSVF.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const Markdown = lazy(() => import('./markdown'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const ThreadSettings = lazy(() => import('./settings'));\nexport const ThreadState = lazy(() => import('./state'));\n\nexport * from './capabilities';\n"],
5
- "mappings": ";;;AAIA,SAASA,YAAY;AAEd,IAAMC,kBAAkBC,KAAK,MAAM,OAAO,kCAAA,CAAA;AAC1C,IAAMC,iBAAiBD,KAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAME,WAAWF,KAAK,MAAM,OAAO,yBAAA,CAAA;AACnC,IAAMG,eAAeH,KAAK,MAAM,OAAO,8BAAA,CAAA;AACvC,IAAMI,iBAAiBJ,KAAK,MAAM,OAAO,yBAAA,CAAA;AACzC,IAAMK,cAAcL,KAAK,MAAM,OAAO,sBAAA,CAAA;",
6
- "names": ["lazy", "AppGraphBuilder", "lazy", "IntentResolver", "Markdown", "ReactSurface", "ThreadSettings", "ThreadState"]
7
- }