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

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 (81) hide show
  1. package/dist/lib/browser/{ThreadContainer-4VLBSBI7.mjs → ThreadContainer-6OP5AG2W.mjs} +2 -2
  2. package/dist/lib/browser/{app-graph-builder-Q7A2ZRUA.mjs → app-graph-builder-IANFWFYN.mjs} +1 -1
  3. package/dist/lib/browser/{app-graph-builder-Q7A2ZRUA.mjs.map → app-graph-builder-IANFWFYN.mjs.map} +2 -2
  4. package/dist/lib/browser/{chunk-2B3EXYZ7.mjs → chunk-CQ3NH4RJ.mjs} +4 -4
  5. package/dist/lib/browser/{chunk-GQONSZ3J.mjs → chunk-UPKU23DA.mjs} +11 -23
  6. package/dist/lib/browser/chunk-UPKU23DA.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +5 -5
  8. package/dist/lib/browser/index.mjs.map +3 -3
  9. package/dist/lib/browser/intent-resolver-QFP6L3AF.mjs +287 -0
  10. package/dist/lib/browser/intent-resolver-QFP6L3AF.mjs.map +7 -0
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/{react-surface-CHCZO4TI.mjs → react-surface-YDKOPRQP.mjs} +48 -36
  13. package/dist/lib/browser/react-surface-YDKOPRQP.mjs.map +7 -0
  14. package/dist/lib/node/{ThreadContainer-VOYLV4UL.cjs → ThreadContainer-LTKKLPXX.cjs} +6 -6
  15. package/dist/lib/node/{app-graph-builder-ZXW5KUDK.cjs → app-graph-builder-LFEDPJLK.cjs} +4 -4
  16. package/dist/lib/node/{app-graph-builder-ZXW5KUDK.cjs.map → app-graph-builder-LFEDPJLK.cjs.map} +2 -2
  17. package/dist/lib/node/{chunk-6PUGKCPR.cjs → chunk-RQR5Z23G.cjs} +13 -24
  18. package/dist/lib/node/chunk-RQR5Z23G.cjs.map +7 -0
  19. package/dist/lib/node/{chunk-ZRN7B26W.cjs → chunk-ZJTWNCFQ.cjs} +7 -7
  20. package/dist/lib/node/index.cjs +10 -10
  21. package/dist/lib/node/index.cjs.map +3 -3
  22. package/dist/lib/node/intent-resolver-ZSOQILPJ.cjs +299 -0
  23. package/dist/lib/node/intent-resolver-ZSOQILPJ.cjs.map +7 -0
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/{react-surface-LO7S2HPR.cjs → react-surface-AX644GMQ.cjs} +48 -36
  26. package/dist/lib/node/react-surface-AX644GMQ.cjs.map +7 -0
  27. package/dist/lib/node-esm/{ThreadContainer-7DZY2MWA.mjs → ThreadContainer-SV74JFRH.mjs} +2 -2
  28. package/dist/lib/node-esm/{app-graph-builder-ATS6HGE6.mjs → app-graph-builder-IXHFRMCY.mjs} +1 -1
  29. package/dist/lib/node-esm/{app-graph-builder-ATS6HGE6.mjs.map → app-graph-builder-IXHFRMCY.mjs.map} +2 -2
  30. package/dist/lib/node-esm/{chunk-GS2OILYF.mjs → chunk-4PZTMSVF.mjs} +4 -4
  31. package/dist/lib/node-esm/{chunk-DYFIKKDT.mjs → chunk-CISLDOH7.mjs} +11 -23
  32. package/dist/lib/node-esm/chunk-CISLDOH7.mjs.map +7 -0
  33. package/dist/lib/node-esm/index.mjs +5 -5
  34. package/dist/lib/node-esm/index.mjs.map +3 -3
  35. package/dist/lib/node-esm/intent-resolver-MHP4C2NZ.mjs +288 -0
  36. package/dist/lib/node-esm/intent-resolver-MHP4C2NZ.mjs.map +7 -0
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/{react-surface-LAF3QIPB.mjs → react-surface-74X2TKEZ.mjs} +48 -36
  39. package/dist/lib/node-esm/react-surface-74X2TKEZ.mjs.map +7 -0
  40. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  42. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/index.d.ts +30 -30
  44. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  46. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  47. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  49. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  50. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  51. package/dist/types/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +29 -30
  53. package/src/ThreadPlugin.tsx +3 -4
  54. package/src/capabilities/app-graph-builder.ts +0 -1
  55. package/src/capabilities/intent-resolver.ts +180 -164
  56. package/src/capabilities/react-surface.tsx +19 -18
  57. package/src/components/Chat.stories.tsx +1 -5
  58. package/src/components/ChatContainer.tsx +2 -2
  59. package/src/components/CommentContainer.tsx +2 -2
  60. package/src/components/MessageContainer.tsx +6 -19
  61. package/src/components/ThreadComplementary.tsx +9 -6
  62. package/src/components/ThreadSettings.tsx +3 -3
  63. package/src/components/command-extension.ts +2 -5
  64. package/dist/lib/browser/chunk-GQONSZ3J.mjs.map +0 -7
  65. package/dist/lib/browser/intent-resolver-PIEZ3LKQ.mjs +0 -275
  66. package/dist/lib/browser/intent-resolver-PIEZ3LKQ.mjs.map +0 -7
  67. package/dist/lib/browser/react-surface-CHCZO4TI.mjs.map +0 -7
  68. package/dist/lib/node/chunk-6PUGKCPR.cjs.map +0 -7
  69. package/dist/lib/node/intent-resolver-X5O3SVLF.cjs +0 -287
  70. package/dist/lib/node/intent-resolver-X5O3SVLF.cjs.map +0 -7
  71. package/dist/lib/node/react-surface-LO7S2HPR.cjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-DYFIKKDT.mjs.map +0 -7
  73. package/dist/lib/node-esm/intent-resolver-XJWT5X6T.mjs +0 -276
  74. package/dist/lib/node-esm/intent-resolver-XJWT5X6T.mjs.map +0 -7
  75. package/dist/lib/node-esm/react-surface-LAF3QIPB.mjs.map +0 -7
  76. /package/dist/lib/browser/{ThreadContainer-4VLBSBI7.mjs.map → ThreadContainer-6OP5AG2W.mjs.map} +0 -0
  77. /package/dist/lib/browser/{chunk-2B3EXYZ7.mjs.map → chunk-CQ3NH4RJ.mjs.map} +0 -0
  78. /package/dist/lib/node/{ThreadContainer-VOYLV4UL.cjs.map → ThreadContainer-LTKKLPXX.cjs.map} +0 -0
  79. /package/dist/lib/node/{chunk-ZRN7B26W.cjs.map → chunk-ZJTWNCFQ.cjs.map} +0 -0
  80. /package/dist/lib/node-esm/{ThreadContainer-7DZY2MWA.mjs.map → ThreadContainer-SV74JFRH.mjs.map} +0 -0
  81. /package/dist/lib/node-esm/{chunk-GS2OILYF.mjs.map → chunk-4PZTMSVF.mjs.map} +0 -0
@@ -1,4 +1,4 @@
1
- import "./chunk-2B3EXYZ7.mjs";
1
+ import "./chunk-CQ3NH4RJ.mjs";
2
2
  import {
3
3
  ThreadCapabilities
4
4
  } from "./chunk-NAO3LZMZ.mjs";
@@ -6,7 +6,7 @@ import {
6
6
  MessageContainer,
7
7
  command,
8
8
  getMessageMetadata
9
- } from "./chunk-GQONSZ3J.mjs";
9
+ } from "./chunk-UPKU23DA.mjs";
10
10
  import {
11
11
  useStatus
12
12
  } from "./chunk-BNEWNQBO.mjs";
@@ -19,7 +19,9 @@ import {
19
19
 
20
20
  // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
21
21
  import React5 from "react";
22
- import { Capabilities, contributes, createSurface, isLayoutParts, useCapability as useCapability2 } from "@dxos/app-framework";
22
+ import { Capabilities, contributes, createSurface, useLayout } from "@dxos/app-framework";
23
+ import { SettingsStore } from "@dxos/local-storage";
24
+ import { log } from "@dxos/log";
23
25
  import { ChannelType } from "@dxos/plugin-space/types";
24
26
  import { getSpace as getSpace2 } from "@dxos/react-client/echo";
25
27
 
@@ -36,7 +38,7 @@ import { Button, Tag, Tooltip, useThemeContext, useTranslation } from "@dxos/rea
36
38
  import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
37
39
  import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
38
40
  import { MessageTextbox, Thread, ThreadFooter, ThreadHeading } from "@dxos/react-ui-thread";
39
- import { nonNullable } from "@dxos/util";
41
+ import { isNonNullable } from "@dxos/util";
40
42
  var sizeClass = getSize(4);
41
43
  var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
42
44
  var ToggleResolvedButton = ({ isResolved, onResolve }) => {
@@ -165,7 +167,7 @@ var CommentContainer = ({ thread, detached, current, onAttend, onComment, onReso
165
167
  onResolve: handleResolve
166
168
  }), onThreadDelete && /* @__PURE__ */ React.createElement(DeleteThreadButton, {
167
169
  onDelete: handleThreadDelete
168
- }))), RefArray.allResolvedTargets(thread.messages?.filter(nonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
170
+ }))), RefArray.allResolvedTargets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
169
171
  key: message.id,
170
172
  message,
171
173
  members,
@@ -229,13 +231,13 @@ var CommentsContainer = ({ threads, detached = [], currentId, showResolvedThread
229
231
 
230
232
  // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
231
233
  import React3, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2 } from "react";
232
- import { createIntent, LayoutAction, useCapabilities, useCapability, useIntentDispatcher } from "@dxos/app-framework";
234
+ import { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
233
235
  import { ThreadCapabilities as ThreadCapabilities2 } from "@dxos/plugin-space";
234
236
  import { MessageType } from "@dxos/plugin-space/types";
235
237
  import { create, fullyQualifiedId as fullyQualifiedId3, makeRef, RefArray as RefArray2 } from "@dxos/react-client/echo";
236
238
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
237
239
  import { useAttended } from "@dxos/react-ui-attention";
238
- import { nonNullable as nonNullable2 } from "@dxos/util";
240
+ import { isNonNullable as isNonNullable2 } from "@dxos/util";
239
241
  var ThreadComplementary = ({ subject }) => {
240
242
  const { dispatchPromise: dispatch } = useIntentDispatcher();
241
243
  const identity = useIdentity2();
@@ -253,7 +255,7 @@ var ThreadComplementary = ({ subject }) => {
253
255
  ]);
254
256
  const threadObjects = RefArray2.allResolvedTargets(subject.threads ?? []);
255
257
  const threads = useMemo2(() => {
256
- return threadObjects.concat(drafts ?? []).filter(nonNullable2);
258
+ return threadObjects.concat(drafts ?? []).filter(isNonNullable2);
257
259
  }, [
258
260
  JSON.stringify(threadObjects),
259
261
  JSON.stringify(drafts)
@@ -279,9 +281,12 @@ var ThreadComplementary = ({ subject }) => {
279
281
  if (state.current !== threadId) {
280
282
  state.current = threadId;
281
283
  void dispatch(createIntent(LayoutAction.ScrollIntoView, {
282
- id: fullyQualifiedId3(subject),
283
- cursor: thread.anchor,
284
- ref: threadId
284
+ part: "current",
285
+ subject: fullyQualifiedId3(subject),
286
+ options: {
287
+ cursor: thread.anchor,
288
+ ref: threadId
289
+ }
285
290
  }));
286
291
  }
287
292
  }, [
@@ -343,10 +348,10 @@ var ThreadComplementary = ({ subject }) => {
343
348
  // packages/plugins/plugin-thread/src/components/ThreadSettings.tsx
344
349
  import React4 from "react";
345
350
  import { Input, useTranslation as useTranslation3 } from "@dxos/react-ui";
346
- import { DeprecatedFormInput } from "@dxos/react-ui-form";
351
+ import { DeprecatedFormContainer, DeprecatedFormInput } from "@dxos/react-ui-form";
347
352
  var ThreadSettings = ({ settings }) => {
348
353
  const { t } = useTranslation3(THREAD_PLUGIN);
349
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(DeprecatedFormInput, {
354
+ return /* @__PURE__ */ React4.createElement(DeprecatedFormContainer, null, /* @__PURE__ */ React4.createElement(DeprecatedFormInput, {
350
355
  label: t("settings standalone label")
351
356
  }, /* @__PURE__ */ React4.createElement(Input.Switch, {
352
357
  checked: settings.standalone,
@@ -355,30 +360,40 @@ var ThreadSettings = ({ settings }) => {
355
360
  };
356
361
 
357
362
  // packages/plugins/plugin-thread/src/components/index.ts
358
- var ThreadContainer = lazy(() => import("./ThreadContainer-4VLBSBI7.mjs"));
363
+ var ThreadContainer = lazy(() => import("./ThreadContainer-6OP5AG2W.mjs"));
359
364
 
360
365
  // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
366
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/capabilities/react-surface.tsx";
361
367
  var react_surface_default = () => contributes(Capabilities.ReactSurface, [
362
368
  createSurface({
363
369
  id: `${THREAD_PLUGIN}/channel`,
364
370
  role: "article",
365
371
  filter: (data) => data.subject instanceof ChannelType && !!data.subject.threads[0],
366
372
  component: ({ data, role }) => {
367
- const location = useCapability2(Capabilities.Location);
373
+ const layout = useLayout();
368
374
  const channel = data.subject;
375
+ void channel.threads[0].load();
369
376
  const thread = channel.threads[0].target;
370
- if (isLayoutParts(location?.active) && location.active.main) {
371
- const layoutEntries = location.active.main;
372
- const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);
373
- if (currentPosition > 0) {
374
- const objectToTheLeft = layoutEntries[currentPosition - 1];
375
- const context = getSpace2(channel)?.db.getObjectById(objectToTheLeft.id);
376
- return /* @__PURE__ */ React5.createElement(ThreadContainer, {
377
- role,
378
- thread,
379
- context
380
- });
381
- }
377
+ if (!thread) {
378
+ return null;
379
+ }
380
+ log.info("thread", {
381
+ thread
382
+ }, {
383
+ F: __dxlog_file,
384
+ L: 33,
385
+ S: void 0,
386
+ C: (f, a) => f(...a)
387
+ });
388
+ const currentPosition = layout.active.findIndex((id) => id === channel.id);
389
+ if (currentPosition > 0) {
390
+ const objectToTheLeft = layout.active[currentPosition - 1];
391
+ const context = getSpace2(channel)?.db.getObjectById(objectToTheLeft);
392
+ return /* @__PURE__ */ React5.createElement(ThreadContainer, {
393
+ role,
394
+ thread,
395
+ context
396
+ });
382
397
  }
383
398
  return /* @__PURE__ */ React5.createElement(ThreadContainer, {
384
399
  role,
@@ -396,17 +411,14 @@ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
396
411
  }),
397
412
  createSurface({
398
413
  id: `${THREAD_PLUGIN}/settings`,
399
- role: "settings",
400
- filter: (data) => data.subject === THREAD_PLUGIN,
401
- component: () => {
402
- const settings = useCapability2(Capabilities.SettingsStore).getStore(THREAD_PLUGIN).value;
403
- return /* @__PURE__ */ React5.createElement(ThreadSettings, {
404
- settings
405
- });
406
- }
414
+ role: "article",
415
+ filter: (data) => data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
416
+ component: ({ data: { subject } }) => /* @__PURE__ */ React5.createElement(ThreadSettings, {
417
+ settings: subject.value
418
+ })
407
419
  })
408
420
  ]);
409
421
  export {
410
422
  react_surface_default as default
411
423
  };
412
- //# sourceMappingURL=react-surface-CHCZO4TI.mjs.map
424
+ //# sourceMappingURL=react-surface-YDKOPRQP.mjs.map
@@ -0,0 +1,7 @@
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
+ }
@@ -26,12 +26,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var ThreadContainer_VOYLV4UL_exports = {};
30
- __export(ThreadContainer_VOYLV4UL_exports, {
29
+ var ThreadContainer_LTKKLPXX_exports = {};
30
+ __export(ThreadContainer_LTKKLPXX_exports, {
31
31
  default: () => ThreadContainer_default
32
32
  });
33
- module.exports = __toCommonJS(ThreadContainer_VOYLV4UL_exports);
34
- var import_chunk_6PUGKCPR = require("./chunk-6PUGKCPR.cjs");
33
+ module.exports = __toCommonJS(ThreadContainer_LTKKLPXX_exports);
34
+ var import_chunk_RQR5Z23G = require("./chunk-RQR5Z23G.cjs");
35
35
  var import_chunk_AWSTZ2KN = require("./chunk-AWSTZ2KN.cjs");
36
36
  var import_chunk_F735VMTN = require("./chunk-F735VMTN.cjs");
37
37
  var import_react = __toESM(require("react"));
@@ -39,7 +39,7 @@ var import_react_ui_stack = require("@dxos/react-ui-stack");
39
39
  var ThreadContainer = ({ role, ...props }) => {
40
40
  return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
41
41
  toolbar: false
42
- }, /* @__PURE__ */ import_react.default.createElement(import_chunk_6PUGKCPR.ChatContainer, props));
42
+ }, /* @__PURE__ */ import_react.default.createElement(import_chunk_RQR5Z23G.ChatContainer, props));
43
43
  };
44
44
  var ThreadContainer_default = ThreadContainer;
45
- //# sourceMappingURL=ThreadContainer-VOYLV4UL.cjs.map
45
+ //# sourceMappingURL=ThreadContainer-LTKKLPXX.cjs.map
@@ -16,11 +16,11 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var app_graph_builder_ZXW5KUDK_exports = {};
20
- __export(app_graph_builder_ZXW5KUDK_exports, {
19
+ var app_graph_builder_LFEDPJLK_exports = {};
20
+ __export(app_graph_builder_LFEDPJLK_exports, {
21
21
  default: () => app_graph_builder_default
22
22
  });
23
- module.exports = __toCommonJS(app_graph_builder_ZXW5KUDK_exports);
23
+ module.exports = __toCommonJS(app_graph_builder_LFEDPJLK_exports);
24
24
  var import_chunk_FPWNZ6TB = require("./chunk-FPWNZ6TB.cjs");
25
25
  var import_chunk_F735VMTN = require("./chunk-F735VMTN.cjs");
26
26
  var import_app_framework = require("@dxos/app-framework");
@@ -132,4 +132,4 @@ var app_graph_builder_default = (context) => {
132
132
  }
133
133
  }));
134
134
  };
135
- //# sourceMappingURL=app-graph-builder-ZXW5KUDK.cjs.map
135
+ //# sourceMappingURL=app-graph-builder-LFEDPJLK.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 // TODO(Zan): Find util (or make one).\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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",
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
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
7
  }
@@ -26,14 +26,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_6PUGKCPR_exports = {};
30
- __export(chunk_6PUGKCPR_exports, {
29
+ var chunk_RQR5Z23G_exports = {};
30
+ __export(chunk_RQR5Z23G_exports, {
31
31
  ChatContainer: () => ChatContainer,
32
32
  MessageContainer: () => MessageContainer,
33
33
  command: () => command,
34
34
  getMessageMetadata: () => getMessageMetadata
35
35
  });
36
- module.exports = __toCommonJS(chunk_6PUGKCPR_exports);
36
+ module.exports = __toCommonJS(chunk_RQR5Z23G_exports);
37
37
  var import_chunk_AWSTZ2KN = require("./chunk-AWSTZ2KN.cjs");
38
38
  var import_chunk_F735VMTN = require("./chunk-F735VMTN.cjs");
39
39
  var import_react = __toESM(require("react"));
@@ -56,7 +56,6 @@ var import_react_client = require("@dxos/react-client");
56
56
  var import_halo2 = require("@dxos/react-client/halo");
57
57
  var import_react_ui2 = require("@dxos/react-ui");
58
58
  var import_react_ui_editor2 = require("@dxos/react-ui-editor");
59
- var import_react_ui_mosaic = require("@dxos/react-ui-mosaic");
60
59
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
61
60
  var import_react_ui_thread2 = require("@dxos/react-ui-thread");
62
61
  var import_language = require("@codemirror/language");
@@ -83,9 +82,7 @@ var parser = import_language.StreamLanguage.define({
83
82
  var styles = import_language.HighlightStyle.define([
84
83
  {
85
84
  tag: import_react_ui_editor3.tags.tagName,
86
- class: (0, import_react_ui_theme3.mx)((0, import_react_ui_theme3.tagRoot)({
87
- palette: "cyan"
88
- }), "text-baseText font-medium")
85
+ class: (0, import_react_ui_theme3.mx)("dx-tag dx-tag--indigo text-baseText font-medium")
89
86
  }
90
87
  ]);
91
88
  var command = [
@@ -165,14 +162,9 @@ var MessageContainer = ({ message, members, onDelete }) => {
165
162
  })));
166
163
  };
167
164
  var MessagePart = ({ part }) => {
168
- return /* @__PURE__ */ import_react3.default.createElement(import_react_ui_mosaic.Mosaic.Container, {
169
- id: part.id
170
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_mosaic.Mosaic.DraggableTile, {
171
- type: import_chunk_F735VMTN.THREAD_ITEM,
172
- path: part.id,
173
- item: part,
174
- Component: MessageBlockObjectTile
175
- }));
165
+ return /* @__PURE__ */ import_react3.default.createElement(MessageBlockObjectTile, {
166
+ subject: part
167
+ });
176
168
  };
177
169
  var TextboxBlock = ({ message, isAuthor, editing }) => {
178
170
  const { themeMode } = (0, import_react_ui2.useThemeContext)();
@@ -223,25 +215,22 @@ var TextboxBlock = ({ message, isAuthor, editing }) => {
223
215
  ...focusAttributes
224
216
  });
225
217
  };
226
- var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react3.forwardRef)(({ draggableStyle, draggableProps, item, active, ref: _ref, ...props }, forwardedRef) => {
227
- let title = item.name ?? item.title ?? item.type ?? "Object";
218
+ var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react3.forwardRef)(({ subject }, forwardedRef) => {
219
+ let title = subject.name ?? subject.title ?? subject.type ?? "Object";
228
220
  if (typeof title !== "string") {
229
221
  title = title?.content ?? "";
230
222
  }
231
223
  return /* @__PURE__ */ import_react3.default.createElement("div", {
232
224
  role: "group",
233
225
  className: (0, import_react_ui_theme2.mx)("grid col-span-3 py-1 pr-4", import_react_ui_theme2.hoverableControls, import_react_ui_theme2.hoverableFocusedWithinControls),
234
- style: draggableStyle,
235
226
  ref: forwardedRef
236
227
  }, /* @__PURE__ */ import_react3.default.createElement(import_app_framework.Surface, {
237
228
  role: "card",
238
229
  limit: 1,
239
230
  data: {
240
- subject: item
231
+ subject
241
232
  },
242
- draggableProps,
243
- fallback: title,
244
- ...props
233
+ fallback: title
245
234
  }));
246
235
  });
247
236
  var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
@@ -289,7 +278,7 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
289
278
  },
290
279
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
291
280
  text: messageRef.current,
292
- context: (0, import_live_object.makeRef)(context)
281
+ context: context ? (0, import_live_object.makeRef)(context) : void 0
293
282
  })));
294
283
  messageRef.current = "";
295
284
  setAutoFocus(true);
@@ -339,4 +328,4 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
339
328
  command,
340
329
  getMessageMetadata
341
330
  });
342
- //# sourceMappingURL=chunk-6PUGKCPR.cjs.map
331
+ //# sourceMappingURL=chunk-RQR5Z23G.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/util.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Ref } from '@dxos/echo-schema';\nimport { create, makeRef, RefArray } from '@dxos/live-object';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\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\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport const ChatContainer = ({ thread, context, current, autoFocusTextbox }: 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 // 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 [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\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 [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n makeRef(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context: context ? makeRef(context) : undefined,\n }),\n ),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n const handleDelete = (id: string) => {\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(id));\n if (messageIndex !== -1) {\n thread.messages.splice(messageIndex, 1);\n }\n };\n\n return (\n <Thread\n current={current}\n id={fullyQualifiedId(thread)}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {RefArray.allResolvedTargets(thread.messages ?? []).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />\n ))}\n </div>\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 <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { RefArray } from '@dxos/live-object';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type ReactiveEchoObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\n// TODO(thure): #8149\nconst messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];\n\nexport const MessageContainer = ({\n message,\n members,\n onDelete,\n}: {\n message: MessageType;\n members: SpaceMember[];\n onDelete?: (id: string) => void;\n}) => {\n const senderIdentity = members.find(\n (member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.identityKey.toHex() === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n <TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />\n {RefArray.allResolvedTargets(message.parts ?? []).map((part, index) => (\n <MessagePart key={index} part={part} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n message,\n isAuthor,\n editing,\n}: {\n message: MessageType;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(message.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n message.text = inMemoryContentRef.current;\n }, [message]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: message.text,\n extensions: [\n createBasicExtensions({ readonly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [message.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n useOnEditAnalytics(message, !!editing);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: ReactiveEchoObject<any> }>(\n ({ subject }, forwardedRef) => {\n let title = subject.name ?? subject.title ?? subject.type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.identityKey.toHex(),\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_live_object", "import_halo", "import_react_ui", "import_react_ui_editor", "import_react_ui_theme", "import_react_ui_thread", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "onDelete", "senderIdentity", "find", "member", "sender", "PublicKey", "equals", "messageMetadata", "userIsAuthor", "useIdentity", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "timestamp", "ButtonGroup", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "Portal", "Content", "Arrow", "X", "TextboxBlock", "isAuthor", "RefArray", "allResolvedTargets", "parts", "map", "part", "index", "MessagePart", "key", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readonly", "createThemeExtensions", "EditorView", "updateListener", "of", "update", "docChanged", "doc", "toString", "useEffect", "focus", "useOnEditAnalytics", "div", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "Surface", "limit", "ChatContainer", "thread", "context", "autoFocusTextbox", "space", "getSpace", "useMembers", "activity", "useStatus", "fullyQualifiedId", "_count", "_setCount", "rerenderEditor", "autoFocus", "setAutoFocus", "threadScrollRef", "textboxMetadata", "messageRef", "useMemo", "placeholder", "listener", "onChange", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "makeRef", "create", "MessageType", "Date", "toISOString", "messageIndex", "findIndex", "Ref", "hasObjectId", "splice", "Thread", "ScrollArea", "Viewport", "threadLayout", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
7
+ }
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_ZRN7B26W_exports = {};
30
- __export(chunk_ZRN7B26W_exports, {
29
+ var chunk_ZJTWNCFQ_exports = {};
30
+ __export(chunk_ZJTWNCFQ_exports, {
31
31
  AppGraphBuilder: () => AppGraphBuilder,
32
32
  IntentResolver: () => IntentResolver,
33
33
  Markdown: () => Markdown,
@@ -35,12 +35,12 @@ __export(chunk_ZRN7B26W_exports, {
35
35
  ThreadSettings: () => ThreadSettings,
36
36
  ThreadState: () => ThreadState
37
37
  });
38
- module.exports = __toCommonJS(chunk_ZRN7B26W_exports);
38
+ module.exports = __toCommonJS(chunk_ZJTWNCFQ_exports);
39
39
  var import_app_framework = require("@dxos/app-framework");
40
- var AppGraphBuilder = (0, import_app_framework.lazy)(() => import("./app-graph-builder-ZXW5KUDK.cjs"));
41
- var IntentResolver = (0, import_app_framework.lazy)(() => import("./intent-resolver-X5O3SVLF.cjs"));
40
+ var AppGraphBuilder = (0, import_app_framework.lazy)(() => import("./app-graph-builder-LFEDPJLK.cjs"));
41
+ var IntentResolver = (0, import_app_framework.lazy)(() => import("./intent-resolver-ZSOQILPJ.cjs"));
42
42
  var Markdown = (0, import_app_framework.lazy)(() => import("./markdown-FWRKMSKV.cjs"));
43
- var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-LO7S2HPR.cjs"));
43
+ var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-AX644GMQ.cjs"));
44
44
  var ThreadSettings = (0, import_app_framework.lazy)(() => import("./settings-TH4YSUVU.cjs"));
45
45
  var ThreadState = (0, import_app_framework.lazy)(() => import("./state-TQWEZ6B3.cjs"));
46
46
  // Annotate the CommonJS export names for ESM import in node:
@@ -52,4 +52,4 @@ var ThreadState = (0, import_app_framework.lazy)(() => import("./state-TQWEZ6B3.
52
52
  ThreadSettings,
53
53
  ThreadState
54
54
  });
55
- //# sourceMappingURL=chunk-ZRN7B26W.cjs.map
55
+ //# sourceMappingURL=chunk-ZJTWNCFQ.cjs.map