@dxos/plugin-thread 0.8.4-main.c4373fc → 0.8.4-main.d9fc60f731
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.
- package/LICENSE +102 -5
- package/PLUGIN.mdl +271 -0
- package/README.md +1 -1
- package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
- package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
- package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
- package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs +208 -0
- package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs.map +7 -0
- package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
- package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.mjs +109 -0
- package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
- package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
- package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
- package/dist/lib/neutral/add-message-RDIABSIX.mjs +122 -0
- package/dist/lib/neutral/add-message-RDIABSIX.mjs.map +7 -0
- package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs +244 -0
- package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs +120 -0
- package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs.map +7 -0
- package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs +40 -0
- package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs.map +7 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
- package/dist/lib/neutral/blueprints/index.mjs +8 -0
- package/dist/lib/neutral/capabilities/index.mjs +27 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-35GUWXBB.mjs +48 -0
- package/dist/lib/neutral/chunk-35GUWXBB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
- package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
- package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-HQZWTDJC.mjs +164 -0
- package/dist/lib/neutral/chunk-HQZWTDJC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-IQBZZAMX.mjs +335 -0
- package/dist/lib/neutral/chunk-IQBZZAMX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-JJETHBAZ.mjs +8 -0
- package/dist/lib/neutral/chunk-JJETHBAZ.mjs.map +7 -0
- package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
- package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
- package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +541 -0
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +15 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/create-VXM6HJMN.mjs +61 -0
- package/dist/lib/neutral/create-VXM6HJMN.mjs.map +7 -0
- package/dist/lib/neutral/create-channel-FSJOMRHF.mjs +19 -0
- package/dist/lib/neutral/create-channel-FSJOMRHF.mjs.map +7 -0
- package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
- package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
- package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs +56 -0
- package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs.map +7 -0
- package/dist/lib/neutral/delete-6KZERY6K.mjs +57 -0
- package/dist/lib/neutral/delete-6KZERY6K.mjs.map +7 -0
- package/dist/lib/neutral/delete-message-PATSHW36.mjs +54 -0
- package/dist/lib/neutral/delete-message-PATSHW36.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +10 -0
- package/dist/lib/neutral/index.mjs +32 -0
- package/dist/lib/neutral/markdown-5UHAAC5Z.mjs +83 -0
- package/dist/lib/neutral/markdown-5UHAAC5Z.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +10 -0
- package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs +23 -0
- package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/operations/index.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-TUMXARMI.mjs +76 -0
- package/dist/lib/neutral/react-surface-TUMXARMI.mjs.map +7 -0
- package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs +32 -0
- package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs.map +7 -0
- package/dist/lib/neutral/restore-SP4HADCE.mjs +32 -0
- package/dist/lib/neutral/restore-SP4HADCE.mjs.map +7 -0
- package/dist/lib/neutral/restore-message-TVIC66VL.mjs +33 -0
- package/dist/lib/neutral/restore-message-TVIC66VL.mjs.map +7 -0
- package/dist/lib/neutral/select-DLHPEKEA.mjs +24 -0
- package/dist/lib/neutral/select-DLHPEKEA.mjs.map +7 -0
- package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs +20 -0
- package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs.map +7 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +58 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs +36 -0
- package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +91 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +16 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
- package/dist/types/src/ThreadPlugin.d.ts +3 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
- package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
- package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
- package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
- package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
- package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +2 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
- package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
- package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts +11 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +16 -15
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +3 -2
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +3 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +5 -2
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +5 -5
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
- package/dist/types/src/components/Chat/Chat.d.ts +51 -0
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
- package/dist/types/src/components/Chat/index.d.ts +2 -0
- package/dist/types/src/components/Chat/index.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
- package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
- package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +5 -10
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
- package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
- package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
- package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +6 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
- package/dist/types/src/extensions/command.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +1 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts +9 -4
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/hooks/analytics.d.ts +2 -3
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -4
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/add-message.d.ts +5 -0
- package/dist/types/src/operations/add-message.d.ts.map +1 -0
- package/dist/types/src/operations/append-channel-message.d.ts +5 -0
- package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
- package/dist/types/src/operations/create-channel.d.ts +5 -0
- package/dist/types/src/operations/create-channel.d.ts.map +1 -0
- package/dist/types/src/operations/create-proposals.d.ts +5 -0
- package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
- package/dist/types/src/operations/create.d.ts +5 -0
- package/dist/types/src/operations/create.d.ts.map +1 -0
- package/dist/types/src/operations/delete-message.d.ts +5 -0
- package/dist/types/src/operations/delete-message.d.ts.map +1 -0
- package/dist/types/src/operations/delete.d.ts +5 -0
- package/dist/types/src/operations/delete.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/on-create-space.d.ts +5 -0
- package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
- package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
- package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
- package/dist/types/src/operations/restore-message.d.ts +5 -0
- package/dist/types/src/operations/restore-message.d.ts.map +1 -0
- package/dist/types/src/operations/restore.d.ts +5 -0
- package/dist/types/src/operations/restore.d.ts.map +1 -0
- package/dist/types/src/operations/select.d.ts +5 -0
- package/dist/types/src/operations/select.d.ts.map +1 -0
- package/dist/types/src/operations/set-agent-config.d.ts +5 -0
- package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
- package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
- package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/should-trigger-agent.d.ts +22 -0
- package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
- package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
- package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
- package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +142 -74
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/AgentIdentity.d.ts +27 -0
- package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
- package/dist/types/src/types/Settings.d.ts +5 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/ThreadOperation.d.ts +2745 -0
- package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3 -458
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +6 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +150 -83
- package/src/ThreadPlugin.node.ts +39 -0
- package/src/ThreadPlugin.test.ts +37 -0
- package/src/ThreadPlugin.tsx +63 -123
- package/src/ThreadPlugin.workerd.ts +20 -0
- package/src/blueprints/index.ts +5 -0
- package/src/blueprints/thread-blueprint.ts +36 -0
- package/src/capabilities/agent-runner.ts +291 -0
- package/src/capabilities/app-graph-builder.ts +124 -165
- package/src/capabilities/blueprint-definition.ts +19 -0
- package/src/capabilities/create-object.ts +30 -0
- package/src/capabilities/index.ts +16 -12
- package/src/capabilities/markdown.ts +53 -36
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-surface.tsx +64 -78
- package/src/capabilities/settings.ts +26 -12
- package/src/capabilities/state.ts +14 -18
- package/src/capabilities/undo-mappings.ts +46 -0
- package/src/components/Chat/Chat.tsx +259 -0
- package/src/components/Chat/index.ts +5 -0
- package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
- package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
- package/src/components/CommentsPanel/CommentsThread.tsx +176 -0
- package/src/components/CommentsPanel/index.ts +6 -0
- package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +83 -47
- package/src/components/MessagePanel/index.ts +5 -0
- package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
- package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
- package/src/components/ThreadSettings/index.ts +5 -0
- package/src/components/index.ts +5 -12
- package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
- package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
- package/src/containers/ChannelArticle/index.ts +5 -0
- package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
- package/src/containers/ChannelChat/index.ts +8 -0
- package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +355 -0
- package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
- package/src/containers/CommentsCompanion/index.ts +5 -0
- package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
- package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
- package/src/containers/ThreadContainer/index.ts +8 -0
- package/src/containers/index.ts +10 -0
- package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
- package/src/extensions/index.ts +1 -0
- package/src/extensions/threads.ts +88 -43
- package/src/hooks/analytics.ts +22 -21
- package/src/hooks/index.ts +0 -4
- package/src/index.ts +4 -4
- package/src/meta.ts +39 -8
- package/src/operations/add-message.ts +94 -0
- package/src/operations/append-channel-message.ts +37 -0
- package/src/operations/create-channel.ts +20 -0
- package/src/operations/create-proposals.ts +49 -0
- package/src/operations/create.ts +63 -0
- package/src/operations/delete-message.ts +53 -0
- package/src/operations/delete.ts +63 -0
- package/src/operations/index.ts +22 -0
- package/src/operations/on-create-space.ts +27 -0
- package/src/operations/respond-to-thread.ts +32 -0
- package/src/operations/restore-message.ts +38 -0
- package/src/operations/restore.ts +38 -0
- package/src/operations/select.ts +24 -0
- package/src/operations/set-agent-config.ts +24 -0
- package/src/operations/toggle-resolved.ts +41 -0
- package/src/plugin.ts +11 -0
- package/src/should-trigger-agent.test.ts +72 -0
- package/src/should-trigger-agent.ts +50 -0
- package/src/testing/data.ts +49 -0
- package/src/testing/index.ts +1 -1
- package/src/translations.ts +75 -75
- package/src/types/AgentIdentity.ts +35 -0
- package/src/types/Settings.ts +10 -0
- package/src/types/ThreadCapabilities.ts +46 -0
- package/src/types/ThreadOperation.ts +225 -0
- package/src/types/index.ts +5 -1
- package/src/types/types.ts +4 -109
- package/src/util.ts +37 -5
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
- package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
- package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
- package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
- package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
- package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
- package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
- package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
- package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
- package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
- package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
- package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
- package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
- package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
- package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
- package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
- package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
- package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
- package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
- package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
- package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
- package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
- package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
- package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -311
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
- package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
- package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
- package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
- package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
- package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
- package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
- package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
- package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
- package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
- package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
- package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
- package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -16
- package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
- package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
- package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
- package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
- package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
- package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
- package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
- package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
- package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
- package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
- package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
- package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
- package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
- package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
- package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -312
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
- package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
- package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
- package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
- package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
- package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
- package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
- package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
- package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
- package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
- package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -17
- package/dist/types/src/calls/call-manager.d.ts +0 -77
- package/dist/types/src/calls/call-manager.d.ts.map +0 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
- package/dist/types/src/calls/index.d.ts +0 -7
- package/dist/types/src/calls/index.d.ts.map +0 -1
- package/dist/types/src/calls/media-manager.d.ts +0 -60
- package/dist/types/src/calls/media-manager.d.ts.map +0 -1
- package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
- package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
- package/dist/types/src/calls/types.d.ts +0 -45
- package/dist/types/src/calls/types.d.ts.map +0 -1
- package/dist/types/src/calls/util/audio.d.ts +0 -6
- package/dist/types/src/calls/util/audio.d.ts.map +0 -1
- package/dist/types/src/calls/util/calls-service.d.ts +0 -77
- package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
- package/dist/types/src/calls/util/history-cache.d.ts +0 -11
- package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
- package/dist/types/src/calls/util/index.d.ts +0 -5
- package/dist/types/src/calls/util/index.d.ts.map +0 -1
- package/dist/types/src/calls/util/media.d.ts +0 -6
- package/dist/types/src/calls/util/media.d.ts.map +0 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
- package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
- package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
- package/dist/types/src/calls-service.stories.d.ts +0 -23
- package/dist/types/src/calls-service.stories.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager.d.ts +0 -5
- package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
- package/dist/types/src/capabilities/capabilities.d.ts +0 -27
- package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root.d.ts +0 -7
- package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
- package/dist/types/src/capabilities/toolkit.d.ts +0 -6
- package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
- package/dist/types/src/components/Call/Call.d.ts +0 -17
- package/dist/types/src/components/Call/Call.d.ts.map +0 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
- package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Call/index.d.ts +0 -3
- package/dist/types/src/components/Call/index.d.ts.map +0 -1
- package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
- package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
- package/dist/types/src/components/CallSidebar.d.ts +0 -4
- package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.d.ts +0 -14
- package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -94
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/Chat.stories.d.ts +0 -93
- package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
- package/dist/types/src/components/ChatContainer.d.ts +0 -17
- package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/components/Comments.stories.d.ts +0 -162
- package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
- package/dist/types/src/components/CommentsContainer.d.ts +0 -13
- package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
- package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
- package/dist/types/src/components/Lobby/index.d.ts +0 -2
- package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
- package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
- package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
- package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
- package/dist/types/src/components/Media/index.d.ts +0 -3
- package/dist/types/src/components/Media/index.d.ts.map +0 -1
- package/dist/types/src/components/MessageContainer.d.ts +0 -14
- package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
- package/dist/types/src/components/Participant/Participant.d.ts +0 -6
- package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
- package/dist/types/src/components/Participant/index.d.ts +0 -3
- package/dist/types/src/components/Participant/index.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
- package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
- package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
- package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
- package/dist/types/src/components/ThreadSettings.d.ts +0 -6
- package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
- package/dist/types/src/components/command-extension.d.ts.map +0 -1
- package/dist/types/src/components/testing.d.ts.map +0 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
- package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
- package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
- package/dist/types/src/testing/stories.d.ts +0 -2
- package/dist/types/src/testing/stories.d.ts.map +0 -1
- package/dist/types/src/types/schema.d.ts +0 -179
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/calls/call-manager.ts +0 -246
- package/src/calls/call-swarm-synchronizer.ts +0 -350
- package/src/calls/index.ts +0 -10
- package/src/calls/media-manager.ts +0 -375
- package/src/calls/speaking-monitor.ts +0 -85
- package/src/calls/types.ts +0 -74
- package/src/calls/util/audio.ts +0 -58
- package/src/calls/util/calls-service.ts +0 -581
- package/src/calls/util/history-cache.ts +0 -27
- package/src/calls/util/index.ts +0 -8
- package/src/calls/util/media.ts +0 -52
- package/src/calls/util/stub-media-streams.ts +0 -127
- package/src/calls/util/task-scheduling.ts +0 -92
- package/src/calls-service.stories.tsx +0 -229
- package/src/capabilities/call-manager.ts +0 -20
- package/src/capabilities/capabilities.ts +0 -33
- package/src/capabilities/intent-resolver.ts +0 -348
- package/src/capabilities/react-root.tsx +0 -17
- package/src/capabilities/toolkit.ts +0 -82
- package/src/components/Call/Call.tsx +0 -89
- package/src/components/Call/Toolbar.tsx +0 -182
- package/src/components/Call/index.ts +0 -6
- package/src/components/CallDebugPanel.tsx +0 -174
- package/src/components/CallSidebar.tsx +0 -18
- package/src/components/ChannelContainer.stories.tsx +0 -59
- package/src/components/ChannelContainer.tsx +0 -201
- package/src/components/Chat.stories.tsx +0 -91
- package/src/components/ChatContainer.tsx +0 -145
- package/src/components/Comments.stories.tsx +0 -93
- package/src/components/CommentsContainer.tsx +0 -72
- package/src/components/CommentsThreadContainer.tsx +0 -169
- package/src/components/Lobby/Lobby.tsx +0 -119
- package/src/components/Lobby/index.ts +0 -5
- package/src/components/Media/AudioStream.tsx +0 -67
- package/src/components/Media/VideoObject.stories.tsx +0 -60
- package/src/components/Media/VideoObject.tsx +0 -58
- package/src/components/Media/index.ts +0 -6
- package/src/components/Participant/Participant.tsx +0 -63
- package/src/components/Participant/ParticipantGrid.tsx +0 -89
- package/src/components/Participant/index.ts +0 -6
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
- package/src/components/ResponsiveGrid/index.ts +0 -7
- package/src/components/ThreadComplementary.tsx +0 -181
- package/src/components/ThreadSettings.tsx +0 -16
- package/src/components/testing.ts +0 -51
- package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
- package/src/hooks/useDebugMode.ts +0 -25
- package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
- package/src/hooks/useVideoStreamTrack.tsx +0 -36
- package/src/testing/stories.ts +0 -54
- package/src/types/schema.ts +0 -33
- package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
- package/src/typings.d.ts +0 -8
- /package/dist/lib/{browser/ChannelContainer-BGDGZHV4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
- /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
- /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/ChannelContainer-OXC6BTU7.mjs.map → neutral/index.mjs.map} +0 -0
- /package/dist/lib/{node-esm/ChatContainer-SH6LTFQL.mjs.map → neutral/meta.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/CommentsCompanion/CommentsCompanion.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities, CollaborationOperation, LayoutOperation } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Query, Ref, Relation } from '@dxos/echo';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { getParentId, useAttention } from '@dxos/react-ui-attention';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo, Thread } from '@dxos/types';\n\nimport { CommentsPanel, type CommentsPanelProps } from '#components';\nimport { meta } from '#meta';\nimport { ThreadOperation } from '#types';\nimport { ThreadCapabilities, type ViewState } from '#types';\n\nconst initialViewState: ViewState = { showResolvedThreads: false };\n\n/**\n * Subject is the host object being commented on (e.g. a Markdown.Document),\n * not a Thread — the threads anchored to that host are discovered via the\n * `AnchoredTo` query inside the component.\n */\nexport type CommentsCompanionProps = AppSurface.ObjectArticleProps<Obj.Any>;\n\nexport const CommentsCompanion = ({ attendableId, subject }: CommentsCompanionProps) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const identity = useIdentity();\n const subjectId = Obj.getURI(subject);\n const parentId = attendableId ? getParentId(attendableId) : undefined;\n const registry = useCapability(Capabilities.AtomRegistry);\n\n const stateAtom = useCapability(ThreadCapabilities.State);\n const viewStoreAtom = useCapability(ThreadCapabilities.ViewState);\n const state = useAtomValue(stateAtom);\n const viewStore = useAtomValue(viewStoreAtom);\n const drafts = state.drafts[subjectId];\n\n // Get or initialize view state for this subject.\n const viewState = useMemo(() => {\n if (!viewStore[subjectId]) {\n registry.set(viewStoreAtom, { ...viewStore, [subjectId]: { ...initialViewState } });\n return initialViewState;\n }\n\n return viewStore[subjectId];\n }, [viewStore, subjectId, registry, viewStoreAtom]);\n const { showResolvedThreads } = viewState;\n\n const commentConfigs = useCapabilities(AppCapabilities.CommentConfig);\n const anchorSorts = useCapabilities(AppCapabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const db = Obj.getDatabase(subject);\n const objectsAnchoredTo = useQuery(db, Query.select(Filter.id(subject.id)).targetOf(AnchoredTo.AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const handleChangeViewState = useCallback(\n (nextValue: string) => {\n registry.set(viewStoreAtom, {\n ...registry.get(viewStoreAtom),\n [subjectId]: { ...registry.get(viewStoreAtom)[subjectId], showResolvedThreads: nextValue === 'all' },\n });\n },\n [registry, viewStoreAtom, subjectId],\n );\n\n const { hasAttention, isAncestor, isRelated } = useAttention(parentId);\n const isAttended = hasAttention || isAncestor || isRelated;\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getURI(thread);\n\n if (state.current !== threadId) {\n registry.set(stateAtom, { ...registry.get(stateAtom), current: threadId });\n\n // Scroll plank into view (deck handler).\n void invokePromise(LayoutOperation.ScrollIntoView, { subject: parentId });\n\n // Scroll within content to anchor (comment config per typename).\n if (anchor.anchor && parentId) {\n const typename = Obj.getTypename(subject);\n const commentConfig = commentConfigs.find(({ id }) => id === typename);\n if (commentConfig?.scrollToAnchor) {\n void invokePromise(commentConfig.scrollToAnchor, {\n subject: parentId,\n cursor: anchor.anchor,\n ref: threadId,\n });\n }\n }\n }\n },\n [state.current, invokePromise, registry, stateAtom, parentId, subject, commentConfigs],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo.AnchoredTo, text: string) => {\n await invokePromise(ThreadOperation.AddMessage, {\n anchor,\n subject,\n sender: { identityDid: identity?.did },\n text,\n });\n\n const thread = Relation.getSource(anchor) as Thread.Thread;\n registry.set(stateAtom, { ...registry.get(stateAtom), current: Obj.getURI(thread) });\n },\n [invokePromise, identity, subject, registry, stateAtom],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo.AnchoredTo) =>\n invokePromise(ThreadOperation.ToggleResolved, {\n thread: Relation.getSource(anchor) as Thread.Thread,\n }),\n [invokePromise],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => invokePromise(ThreadOperation.Delete, { anchor, subject }),\n [invokePromise, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo, messageId: string) =>\n invokePromise(ThreadOperation.DeleteMessage, {\n anchor,\n subject,\n messageId,\n }),\n [invokePromise, subject],\n );\n\n const handleAcceptProposal = useCallback<NonNullable<CommentsPanelProps['onAcceptProposal']>>(\n async (anchor, messageId) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const messageIndex = thread.messages.findIndex(Ref.hasEntityId(messageId));\n const message = thread.messages[messageIndex]?.target;\n const proposal = message?.blocks.find((block) => block._tag === 'proposal');\n if (!proposal || !anchor.anchor) {\n return;\n }\n\n await invokePromise(CollaborationOperation.AcceptProposal, {\n subject,\n anchor: anchor.anchor,\n proposal,\n });\n await invokePromise(ThreadOperation.ToggleResolved, { thread });\n },\n [invokePromise, subject],\n );\n\n const comments = (\n <CommentsPanel\n anchors={anchors}\n currentId={isAttended ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n );\n\n return (\n <Tabs.Root\n orientation='horizontal'\n value={showResolvedThreads ? 'all' : 'unresolved'}\n onValueChange={handleChangeViewState}\n >\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <Tabs.Tablist classNames='p-0'>\n <Tabs.Tab classNames='text-sm' value='unresolved'>\n {t('show-unresolved.label')}\n </Tabs.Tab>\n <Tabs.Tab classNames='text-sm' value='all'>\n {t('show-all.label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <ScrollArea.Root thin>\n <ScrollArea.Viewport>\n <Tabs.Panel value='all'>{showResolvedThreads && comments}</Tabs.Panel>\n <Tabs.Panel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Panel>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Panel.Content>\n </Panel.Root>\n </Tabs.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useAtomValue", "React", "useCallback", "useMemo", "Capabilities", "useCapabilities", "useCapability", "useOperationInvoker", "AppCapabilities", "CollaborationOperation", "LayoutOperation", "Filter", "Obj", "Query", "Ref", "Relation", "useQuery", "useIdentity", "Panel", "ScrollArea", "Toolbar", "useTranslation", "getParentId", "useAttention", "Tabs", "AnchoredTo", "Thread", "CommentsPanel", "meta", "ThreadOperation", "ThreadCapabilities", "initialViewState", "showResolvedThreads", "CommentsCompanion", "attendableId", "subject", "t", "id", "invokePromise", "identity", "subjectId", "getURI", "parentId", "undefined", "registry", "AtomRegistry", "stateAtom", "State", "viewStoreAtom", "ViewState", "state", "viewStore", "drafts", "viewState", "set", "commentConfigs", "CommentConfig", "anchorSorts", "AnchorSort", "sort", "find", "key", "getTypename", "db", "getDatabase", "objectsAnchoredTo", "select", "targetOf", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "getSource", "concat", "handleChangeViewState", "nextValue", "get", "hasAttention", "isAncestor", "isRelated", "isAttended", "handleAttend", "thread", "threadId", "current", "ScrollIntoView", "typename", "commentConfig", "scrollToAnchor", "cursor", "ref", "handleComment", "text", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "handleAcceptProposal", "messageIndex", "messages", "findIndex", "hasEntityId", "message", "target", "proposal", "blocks", "block", "_tag", "AcceptProposal", "comments", "currentId", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "Root", "orientation", "value", "onValueChange", "asChild", "Tablist", "classNames", "Tab", "Content", "thin", "Viewport"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/containers/ThreadContainer/ThreadContainer.tsx
|
|
4
|
+
import React, { useMemo } from "react";
|
|
5
|
+
import { Obj, Ref } from "@dxos/echo";
|
|
6
|
+
import { useMembers } from "@dxos/react-client/echo";
|
|
7
|
+
import { useIdentity } from "@dxos/react-client/halo";
|
|
8
|
+
import { composable, composableProps } from "@dxos/react-ui";
|
|
9
|
+
import { Message } from "@dxos/types";
|
|
10
|
+
import { isNonNullable } from "@dxos/util";
|
|
11
|
+
import { Chat } from "#components";
|
|
12
|
+
import { useStatus } from "#hooks";
|
|
13
|
+
var ThreadContainer = composable(({ space, thread, context, autoFocusTextbox, current, ...props }, forwardedRef) => {
|
|
14
|
+
const id = Obj.getURI(thread);
|
|
15
|
+
const identity = useIdentity();
|
|
16
|
+
const members = useMembers(space?.id);
|
|
17
|
+
const activity = useStatus(space, id);
|
|
18
|
+
const messages = useMemo(() => thread.messages.map((message) => message.target).filter(isNonNullable), [
|
|
19
|
+
thread.messages
|
|
20
|
+
]);
|
|
21
|
+
const handleSend = (text) => {
|
|
22
|
+
Obj.update(thread, (thread2) => {
|
|
23
|
+
thread2.messages.push(Ref.make(Obj.make(Message.Message, {
|
|
24
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
25
|
+
sender: {
|
|
26
|
+
identityDid: identity.did
|
|
27
|
+
},
|
|
28
|
+
blocks: [
|
|
29
|
+
{
|
|
30
|
+
_tag: "text",
|
|
31
|
+
text
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
properties: context ? {
|
|
35
|
+
context: Ref.make(context)
|
|
36
|
+
} : void 0
|
|
37
|
+
})));
|
|
38
|
+
});
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
return /* @__PURE__ */ React.createElement(Chat, {
|
|
42
|
+
...composableProps(props),
|
|
43
|
+
id,
|
|
44
|
+
identity,
|
|
45
|
+
members,
|
|
46
|
+
messages,
|
|
47
|
+
activity,
|
|
48
|
+
onSend: handleSend,
|
|
49
|
+
autoFocusTextbox,
|
|
50
|
+
current,
|
|
51
|
+
ref: forwardedRef
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// src/containers/ThreadContainer/index.ts
|
|
56
|
+
var ThreadContainer_default = ThreadContainer;
|
|
57
|
+
export {
|
|
58
|
+
ThreadContainer,
|
|
59
|
+
ThreadContainer_default as default
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=ThreadContainer-QWB6WRMI.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/ThreadContainer/ThreadContainer.tsx", "../../../src/containers/ThreadContainer/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { type ThreadRootProps } from '@dxos/react-ui-thread';\nimport { Message, type Thread } from '@dxos/types';\nimport { isNonNullable } from '@dxos/util';\n\nimport { Chat } from '#components';\nimport { useStatus } from '#hooks';\n\nexport type ThreadContainerProps = ThemedClassName<\n {\n space: Space;\n thread: Thread.Thread;\n context?: Obj.Unknown;\n autoFocusTextbox?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\n/**\n * Renders an AutoMerge {@link Thread} as a chat: appends new messages by pushing\n * onto `thread.messages`. Used for comment threads and the meeting in-call chat.\n */\nexport const ThreadContainer = composable<HTMLDivElement, ThreadContainerProps>(\n ({ space, thread, context, autoFocusTextbox, current, ...props }, forwardedRef) => {\n const id = Obj.getURI(thread);\n const identity = useIdentity()!;\n const members = useMembers(space?.id);\n const activity = useStatus(space, id);\n\n const messages = useMemo(\n () => thread.messages.map((message) => message.target).filter(isNonNullable),\n [thread.messages],\n );\n\n const handleSend = (text: string) => {\n Obj.update(thread, (thread) => {\n thread.messages.push(\n Ref.make(\n Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n });\n return true;\n };\n\n return (\n <Chat\n {...composableProps(props)}\n id={id}\n identity={identity}\n members={members}\n messages={messages}\n activity={activity}\n onSend={handleSend}\n autoFocusTextbox={autoFocusTextbox}\n current={current}\n ref={forwardedRef}\n />\n );\n },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ThreadContainer } from './ThreadContainer';\n\nexport { ThreadContainer };\nexport default ThreadContainer;\n"],
|
|
5
|
+
"mappings": ";;;AAIA,OAAOA,SAASC,eAAe;AAE/B,SAASC,KAAKC,WAAW;AACzB,SAAqBC,kBAAkB;AACvC,SAASC,mBAAmB;AAE5B,SAASC,YAAYC,uBAAuB;AAE5C,SAASC,eAA4B;AACrC,SAASC,qBAAqB;AAE9B,SAASC,YAAY;AACrB,SAASC,iBAAiB;AAenB,IAAMC,kBAAkBN,WAC7B,CAAC,EAAEO,OAAOC,QAAQC,SAASC,kBAAkBC,SAAS,GAAGC,MAAAA,GAASC,iBAAAA;AAChE,QAAMC,KAAKlB,IAAImB,OAAOP,MAAAA;AACtB,QAAMQ,WAAWjB,YAAAA;AACjB,QAAMkB,UAAUnB,WAAWS,OAAOO,EAAAA;AAClC,QAAMI,WAAWb,UAAUE,OAAOO,EAAAA;AAElC,QAAMK,WAAWxB,QACf,MAAMa,OAAOW,SAASC,IAAI,CAACC,YAAYA,QAAQC,MAAM,EAAEC,OAAOpB,aAAAA,GAC9D;IAACK,OAAOW;GAAS;AAGnB,QAAMK,aAAa,CAACC,SAAAA;AAClB7B,QAAI8B,OAAOlB,QAAQ,CAACA,YAAAA;AAClBA,MAAAA,QAAOW,SAASQ,KACd9B,IAAI+B,KACFhC,IAAIgC,KAAK1B,QAAQA,SAAS;QACxB2B,UAAS,oBAAIC,KAAAA,GAAOC,YAAW;QAC/BC,QAAQ;UAAEC,aAAajB,SAASkB;QAAI;QACpCC,QAAQ;UAAC;YAAEC,MAAM;YAAQX;UAAK;;QAC9BY,YAAY5B,UAAU;UAAEA,SAASZ,IAAI+B,KAAKnB,OAAAA;QAAS,IAAI6B;MACzD,CAAA,CAAA,CAAA;IAGN,CAAA;AACA,WAAO;EACT;AAEA,SACE,sBAAA,cAAClC,MAAAA;IACE,GAAGH,gBAAgBW,KAAAA;IACpBE;IACAE;IACAC;IACAE;IACAD;IACAqB,QAAQf;IACRd;IACAC;IACA6B,KAAK3B;;AAGX,CAAA;;;AClEF,IAAA,0BAAe4B;",
|
|
6
|
+
"names": ["React", "useMemo", "Obj", "Ref", "useMembers", "useIdentity", "composable", "composableProps", "Message", "isNonNullable", "Chat", "useStatus", "ThreadContainer", "space", "thread", "context", "autoFocusTextbox", "current", "props", "forwardedRef", "id", "getURI", "identity", "members", "activity", "messages", "map", "message", "target", "filter", "handleSend", "text", "update", "push", "make", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "onSend", "ref", "ThreadContainer"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/ThreadPlugin.tsx
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { ActivationEvents, Capability, Plugin } from "@dxos/app-framework";
|
|
6
|
+
import { AppActivationEvents, AppPlugin } from "@dxos/app-toolkit";
|
|
7
|
+
import { Operation } from "@dxos/compute";
|
|
8
|
+
import { MarkdownEvents } from "@dxos/plugin-markdown";
|
|
9
|
+
import { SpaceCapabilities, SpaceEvents } from "@dxos/plugin-space";
|
|
10
|
+
import { translations as threadTranslations } from "@dxos/react-ui-thread/translations";
|
|
11
|
+
import { AnchoredTo, Channel, Message, Thread } from "@dxos/types";
|
|
12
|
+
import { AgentRunner, AppGraphBuilder, BlueprintDefinition, CreateObject, Markdown, OperationHandler, UndoMappings, ReactSurface, ThreadState } from "#capabilities";
|
|
13
|
+
import { meta } from "#meta";
|
|
14
|
+
import { translations } from "#translations";
|
|
15
|
+
import { AgentIdentity, DEFAULT_AGENT_IDENTITY, ThreadOperation } from "#types";
|
|
16
|
+
|
|
17
|
+
// raw-loader:/__w/dxos/dxos/packages/plugins/plugin-thread/PLUGIN.mdl?raw
|
|
18
|
+
var PLUGIN_default = "---\nid: org.dxos.plugin.thread\nname: ThreadPlugin\nversion: 0.1.0\n---\n\nThreadPlugin renders comment threads anchored to ECHO objects (primarily Markdown documents). This spec covers the **comment-thread AI agent** feature: per-thread opt-in AI that responds to user comments either automatically or on @mention, with a model-selected response shape (reply message or document edit proposal).\n\n## Extensions\n\nThe following extension dialects are used in this document.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n| `service` | `org.dxos.mdl.service@1.0` |\n\n## Types\n\n```mdl\ntype AgentMode\n literals: auto | mention\n desc: Per-thread agent firing policy.\n```\n\n```mdl\ntype AgentConfig\n desc: Per-thread agent configuration. Stored on Thread.Thread as optional field.\n fields:\n enabled: Boolean\n mode: AgentMode\n```\n\n```mdl\ntype Thread\n desc: |\n Extends the existing org.dxos.type.thread schema. Version bumps to 0.2.0.\n The `agent` field is optional; absent or disabled means no AI involvement.\n fields:\n agent?: AgentConfig\n```\n\n```mdl\ntype AgentIdentity\n desc: |\n Effect Context.Tag. Resolved at runtime, not stored on threads.\n Default layer reads from the plugin Settings (`agentName`); tests/stories\n provide static layers; the host may layer in a workspace-scoped producer.\n fields:\n name: String # display name + @mention token\n identityDid?: String # optional ECHO identity DID stamped on assistant messages\n avatar?: String # optional icon hint\n```\n\n## Services\n\n```mdl\nservice AgentRunner\n desc: |\n Capability that executes one agent turn for a given thread + subject.\n Default implementation performs one `LanguageModel.generateText` call\n with edit tools (`editAnchoredRange`, `updateDocument`) registered per\n turn. Stub implementations are used in storybook + tests.\n methods:\n run(thread: Thread, subject: Obj.Any) -> Effect<void>\n```\n\n## Operations\n\n```mdl\nop RespondToThread\n key: org.dxos.plugin.thread.operation.respond-to-thread\n desc: Run one agent turn against a thread. Scheduled by AddMessage when the gate passes.\n input:\n thread: Ref<Thread>\n subject: Ref<Obj.Any>\n\nop SetAgentConfig\n key: org.dxos.plugin.thread.operation.set-agent-config\n desc: Mutate thread.agent. Undefined config means off.\n input:\n thread: Ref<Thread>\n config?: AgentConfig\n```\n\n## Components\n\n```mdl\ncomponent AgentToggle\n desc: |\n Per-thread radio popover hung off the thread header in CommentsPanel.\n Three states: off / mention / auto. Shows the resolved AgentIdentity.name\n as a read-only label.\n props:\n value?: AgentConfig\n agentName: String\n emits:\n change: { config?: AgentConfig }\n layout: |\n \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 Agent: {agentName} \u2502\n \u2502 \u2502\n \u2502 \u25EF Off \u2502\n \u2502 \u25C9 Reply only on @mention \u2502\n \u2502 \u25EF Auto-respond \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## Features\n\n```mdl\nfeat F-1: Per-thread agent configuration\n\n req F-1.1: Thread schema MUST add an optional `agent: AgentConfig` field\n without breaking existing threads (no migration required).\n\n req F-1.2: The `AgentIdentity` Effect service MUST be the sole source of\n the agent's display name. Thread schema MUST NOT store the name.\n\n req F-1.3: ThreadPlugin MUST contribute a default `AgentIdentity` capability\n at plugin activation (`{ name: 'Kai' }`). Hosts overriding the default\n contribute their own `AgentIdentity` earlier in plugin order so\n `Capability.get` returns it first.\n\nfeat F-2: Trigger gate\n\n req F-2.1: ThreadOperation.AddMessage MUST evaluate the gate after appending\n the message and MUST schedule (not invoke) RespondToThread when it passes.\n\n req F-2.2: The gate MUST return true iff ALL hold:\n - thread.agent?.enabled === true\n - message.sender.role !== 'assistant' # user-authored messages carry no role\n - thread.status !== 'resolved'\n - mode === 'auto' OR text contains '@' + agentName (case-insensitive)\n\n req F-2.3: The gate MUST NOT fire on assistant messages (self-loop guard).\n\n req F-2.4: Flipping enabled on a thread MUST NOT retroactively respond to\n prior messages; only future user messages.\n\nfeat F-3: Agent runner\n\n req F-3.1: The runner MUST be a Capability so storybook and tests can swap\n in a stub without changing call sites.\n\n req F-3.2: The default runner MUST execute one LLM turn via\n `LanguageModel.generateText`, providing the thread message history as\n prompt and appending the response (or a synthesized post-tool ack) as\n an assistant message on the same thread.\n\n req F-3.3: The agent MUST be given edit tools for in-place markdown updates:\n - `editAnchoredRange(replacement)` \u2014 splices the replacement into the\n anchored span via Automerge-diff (`updateText`) and rewrites the\n AnchoredTo cursor so the comment marker tracks the new text.\n - `updateDocument(content)` \u2014 replaces the entire document content.\n\n req F-3.4: When the subject is not a Markdown.Document (no editable text in\n scope), the runner MUST omit the edit tools and only post a chat reply.\n\n req F-3.5: Assistant messages emitted by the runner MUST carry\n sender = { role: 'assistant', name: identity.name, identityDid: identity.identityDid }.\n\n req F-3.6: Runner errors MUST be caught at the operation handler boundary,\n logged via @dxos/log, and emit a `threads.agent.failed` observability event.\n The user's message MUST remain in the thread.\n\nfeat F-4: Toggle UI\n\n req F-4.1: CommentsPanel MUST render an AgentToggle icon button per thread,\n next to existing controls (resolve, delete).\n\n req F-4.2: Clicking the toggle MUST open a popover with three radio options\n (off / mention / auto) and a non-editable label showing AgentIdentity.name.\n\n req F-4.3: Changes MUST go through ThreadOperation.SetAgentConfig, not\n direct schema writes from the popover.\n\n req F-4.4: No UI is provided for changing the agent name in v1; the name\n is read-only from the user's perspective.\n\nfeat F-5: Storybook coverage\n\n req F-5.1: CommentsCompanion.stories.tsx MUST add three new variants:\n - `WithMentionAgent`: thread auto-opted-in with mode='mention'; stub runner.\n - `WithAutoAgent`: thread auto-opted-in with mode='auto'; stub runner.\n - `WithLiveAgent`: thread auto-opted-in with mode='auto'; live runner\n (Anthropic via DXOS edge).\n\n req F-5.2: `WithMentionAgent` and `WithAutoAgent` MUST contribute a stub\n `AgentRunner` that performs a canned `postReply` and never makes network\n calls (so headless `test-storybook` runs are deterministic and offline).\n\n req F-5.3: `WithLiveAgent` MUST contribute an `AppCapabilities.AiServiceLayer`\n (Anthropic via DXOS edge) so ThreadPlugin's default LLM-backed `AgentRunner`\n reaches a real model. Headless `test-storybook` renders but does not submit\n a comment, so no network call occurs in CI.\n\n req F-5.4: All three variants MUST contribute a static `AgentIdentity`\n capability (e.g. `{ name: 'Kai' }`) so the runner stamps the assistant\n message correctly even when no host layer is present.\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Auto mode responds to every user message\n given: A thread with agent = { enabled: true, mode: 'auto' }\n when: A user appends a text message via ThreadOperation.AddMessage\n then:\n - RespondToThread is scheduled exactly once\n - The runner's `run` is invoked with the thread and subject\n\ntest T-2: Mention mode gates on @name\n given: A thread with agent = { enabled: true, mode: 'mention' }, identity.name = 'claude'\n when: A user posts \"hello world\" (no mention) then \"hey @Claude check this\"\n then:\n - The first message does not schedule RespondToThread\n - The second message schedules RespondToThread\n\ntest T-3: Self-loop guard\n given: A thread with agent = { enabled: true, mode: 'auto' }\n when: A message with sender.role = 'assistant' is appended\n then: RespondToThread is NOT scheduled\n\ntest T-4: Resolved threads do not trigger\n given: A thread with agent.enabled = true and status = 'resolved'\n when: A user appends a message\n then: RespondToThread is NOT scheduled\n\ntest T-5: Disabled mid-conversation does not delete history\n given: A thread with prior assistant messages\n when: SetAgentConfig is invoked with config = undefined\n then:\n - thread.agent becomes undefined\n - thread.messages is unchanged\n\ntest T-6: Story WithAutoAgent posts an assistant reply\n given: The WithAutoAgent storybook variant is rendered\n when: The user types \"hello\" and clicks send\n then:\n - The thread shows two messages\n - The second message has sender.role = 'assistant' and sender.name = 'echo'\n\ntest T-7: Story WithMentionAgent gates correctly\n given: The WithMentionAgent storybook variant is rendered\n when: The user posts \"hello\" then \"@echo hello\"\n then:\n - After the first send, only the user message is visible\n - After the second send, an assistant message is appended\n\ntest T-8: Runner errors do not lose the user message\n given: A thread with agent enabled and a runner stubbed to fail\n when: A user appends a message\n then:\n - The user message persists in the thread\n - A `threads.agent.failed` observability event is emitted\n - No assistant message is appended\n```\n\n## Out of Scope (v1)\n\n- Per-document default agent config (was discussed during brainstorming; punted).\n- UI to rename the agent within Composer (lives in plugin settings).\n- \"Thinking\u2026\" / streaming indicator on the message list.\n- Cancellation of in-flight runner turns when the agent is disabled mid-turn.\n- De-duplication of concurrent triggers from multiple users on the same thread.\n- Token-budget caps on long threads or large documents.\n";
|
|
19
|
+
|
|
20
|
+
// src/ThreadPlugin.tsx
|
|
21
|
+
var ThreadPlugin = Plugin.define(meta).pipe(
|
|
22
|
+
AppPlugin.addAppGraphModule({
|
|
23
|
+
activate: AppGraphBuilder
|
|
24
|
+
}),
|
|
25
|
+
AppPlugin.addBlueprintDefinitionModule({
|
|
26
|
+
activate: BlueprintDefinition
|
|
27
|
+
}),
|
|
28
|
+
AppPlugin.addCreateObjectModule({
|
|
29
|
+
activate: CreateObject
|
|
30
|
+
}),
|
|
31
|
+
AppPlugin.addOperationHandlerModule({
|
|
32
|
+
activate: OperationHandler
|
|
33
|
+
}),
|
|
34
|
+
AppPlugin.addUndoMappingsModule({
|
|
35
|
+
activate: UndoMappings
|
|
36
|
+
}),
|
|
37
|
+
AppPlugin.addSchemaModule({
|
|
38
|
+
schema: [
|
|
39
|
+
AnchoredTo.AnchoredTo,
|
|
40
|
+
Channel.Channel,
|
|
41
|
+
Message.Message,
|
|
42
|
+
Thread.Thread
|
|
43
|
+
]
|
|
44
|
+
}),
|
|
45
|
+
AppPlugin.addSurfaceModule({
|
|
46
|
+
activate: ReactSurface
|
|
47
|
+
}),
|
|
48
|
+
AppPlugin.addTranslationsModule({
|
|
49
|
+
translations: [
|
|
50
|
+
...translations,
|
|
51
|
+
...threadTranslations
|
|
52
|
+
]
|
|
53
|
+
}),
|
|
54
|
+
// TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.
|
|
55
|
+
// Plugin.addModule({
|
|
56
|
+
// id: 'settings',
|
|
57
|
+
// activatesOn: Events.SetupSettings,
|
|
58
|
+
// activate: ThreadSettings,
|
|
59
|
+
// }),
|
|
60
|
+
Plugin.addModule({
|
|
61
|
+
id: "state",
|
|
62
|
+
// TODO(wittjosiah): Does not integrate with settings store.
|
|
63
|
+
// Should this be a different event?
|
|
64
|
+
// Should settings store be renamed to be more generic?
|
|
65
|
+
activatesOn: AppActivationEvents.SetupSettings,
|
|
66
|
+
activate: ThreadState
|
|
67
|
+
}),
|
|
68
|
+
Plugin.addModule({
|
|
69
|
+
id: "on-space-created",
|
|
70
|
+
activatesOn: SpaceEvents.SpaceCreated,
|
|
71
|
+
activate: () => Effect.succeed(Capability.contributes(SpaceCapabilities.OnCreateSpace, (params) => Operation.invoke(ThreadOperation.OnCreateSpace, params)))
|
|
72
|
+
}),
|
|
73
|
+
Plugin.addModule({
|
|
74
|
+
id: "markdown",
|
|
75
|
+
activatesOn: MarkdownEvents.SetupExtensions,
|
|
76
|
+
activate: Markdown
|
|
77
|
+
}),
|
|
78
|
+
// Default comment-thread agent runner (one-shot LLM call per scheduled turn).
|
|
79
|
+
// Test/storybook hosts that contribute a stub `AgentRunner` earlier in plugin
|
|
80
|
+
// order — i.e. before ThreadPlugin in the plugins list — win, because
|
|
81
|
+
// `Capability.get` returns the first contribution.
|
|
82
|
+
Plugin.addModule({
|
|
83
|
+
id: "agent-runner",
|
|
84
|
+
activatesOn: ActivationEvents.Startup,
|
|
85
|
+
activate: AgentRunner
|
|
86
|
+
}),
|
|
87
|
+
// Default agent identity. Hosts wanting a different name contribute their own
|
|
88
|
+
// `AgentIdentity` earlier in plugin order to win the `Capability.get`.
|
|
89
|
+
Plugin.addModule({
|
|
90
|
+
id: "agent-identity",
|
|
91
|
+
activatesOn: ActivationEvents.Startup,
|
|
92
|
+
activate: () => Effect.succeed(Capability.contributes(AgentIdentity, DEFAULT_AGENT_IDENTITY))
|
|
93
|
+
}),
|
|
94
|
+
AppPlugin.addPluginAssetModule({
|
|
95
|
+
asset: {
|
|
96
|
+
pluginId: meta.id,
|
|
97
|
+
path: "PLUGIN.mdl",
|
|
98
|
+
content: PLUGIN_default,
|
|
99
|
+
mimeType: "application/x-mdl"
|
|
100
|
+
}
|
|
101
|
+
}),
|
|
102
|
+
Plugin.make
|
|
103
|
+
);
|
|
104
|
+
var ThreadPlugin_default = ThreadPlugin;
|
|
105
|
+
export {
|
|
106
|
+
ThreadPlugin,
|
|
107
|
+
ThreadPlugin_default as default
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=ThreadPlugin.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ThreadPlugin.tsx", "raw-loader:/__w/dxos/dxos/packages/plugins/plugin-thread/PLUGIN.mdl?raw"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { ActivationEvents, Capability, Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread/translations';\nimport { AnchoredTo, Channel, Message, Thread } from '@dxos/types';\n\nimport {\n AgentRunner,\n AppGraphBuilder,\n BlueprintDefinition,\n CreateObject,\n Markdown,\n OperationHandler,\n UndoMappings,\n ReactSurface,\n ThreadState,\n} from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\nimport { AgentIdentity, DEFAULT_AGENT_IDENTITY, ThreadOperation } from '#types';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\n// NOTE(burdon): Review/discuss CursorConverter semantics.\n\n// TODO(wittjosiah): Rename to ChatPlugin.\n// TODO(wittjosiah): Enabling comments should likely be factored out of this plugin but depend on it's capabilities.\n\nexport const ThreadPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addBlueprintDefinitionModule({ activate: BlueprintDefinition }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),\n AppPlugin.addSchemaModule({\n schema: [AnchoredTo.AnchoredTo, Channel.Channel, Message.Message, Thread.Thread],\n }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations: [...translations, ...threadTranslations] }),\n // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.\n // Plugin.addModule({\n // id: 'settings',\n // activatesOn: Events.SetupSettings,\n // activate: ThreadSettings,\n // }),\n Plugin.addModule({\n id: 'state',\n // TODO(wittjosiah): Does not integrate with settings store.\n // Should this be a different event?\n // Should settings store be renamed to be more generic?\n activatesOn: AppActivationEvents.SetupSettings,\n activate: ThreadState,\n }),\n Plugin.addModule({\n id: 'on-space-created',\n activatesOn: SpaceEvents.SpaceCreated,\n activate: () =>\n Effect.succeed(\n Capability.contributes(SpaceCapabilities.OnCreateSpace, (params) =>\n Operation.invoke(ThreadOperation.OnCreateSpace, params),\n ),\n ),\n }),\n Plugin.addModule({\n id: 'markdown',\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n // Default comment-thread agent runner (one-shot LLM call per scheduled turn).\n // Test/storybook hosts that contribute a stub `AgentRunner` earlier in plugin\n // order — i.e. before ThreadPlugin in the plugins list — win, because\n // `Capability.get` returns the first contribution.\n Plugin.addModule({\n id: 'agent-runner',\n activatesOn: ActivationEvents.Startup,\n activate: AgentRunner,\n }),\n // Default agent identity. Hosts wanting a different name contribute their own\n // `AgentIdentity` earlier in plugin order to win the `Capability.get`.\n Plugin.addModule({\n id: 'agent-identity',\n activatesOn: ActivationEvents.Startup,\n activate: () => Effect.succeed(Capability.contributes(AgentIdentity, DEFAULT_AGENT_IDENTITY)),\n }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default ThreadPlugin;\n", "---\nid: org.dxos.plugin.thread\nname: ThreadPlugin\nversion: 0.1.0\n---\n\nThreadPlugin renders comment threads anchored to ECHO objects (primarily Markdown documents). This spec covers the **comment-thread AI agent** feature: per-thread opt-in AI that responds to user comments either automatically or on @mention, with a model-selected response shape (reply message or document edit proposal).\n\n## Extensions\n\nThe following extension dialects are used in this document.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n| `service` | `org.dxos.mdl.service@1.0` |\n\n## Types\n\n```mdl\ntype AgentMode\n literals: auto | mention\n desc: Per-thread agent firing policy.\n```\n\n```mdl\ntype AgentConfig\n desc: Per-thread agent configuration. Stored on Thread.Thread as optional field.\n fields:\n enabled: Boolean\n mode: AgentMode\n```\n\n```mdl\ntype Thread\n desc: |\n Extends the existing org.dxos.type.thread schema. Version bumps to 0.2.0.\n The `agent` field is optional; absent or disabled means no AI involvement.\n fields:\n agent?: AgentConfig\n```\n\n```mdl\ntype AgentIdentity\n desc: |\n Effect Context.Tag. Resolved at runtime, not stored on threads.\n Default layer reads from the plugin Settings (`agentName`); tests/stories\n provide static layers; the host may layer in a workspace-scoped producer.\n fields:\n name: String # display name + @mention token\n identityDid?: String # optional ECHO identity DID stamped on assistant messages\n avatar?: String # optional icon hint\n```\n\n## Services\n\n```mdl\nservice AgentRunner\n desc: |\n Capability that executes one agent turn for a given thread + subject.\n Default implementation performs one `LanguageModel.generateText` call\n with edit tools (`editAnchoredRange`, `updateDocument`) registered per\n turn. Stub implementations are used in storybook + tests.\n methods:\n run(thread: Thread, subject: Obj.Any) -> Effect<void>\n```\n\n## Operations\n\n```mdl\nop RespondToThread\n key: org.dxos.plugin.thread.operation.respond-to-thread\n desc: Run one agent turn against a thread. Scheduled by AddMessage when the gate passes.\n input:\n thread: Ref<Thread>\n subject: Ref<Obj.Any>\n\nop SetAgentConfig\n key: org.dxos.plugin.thread.operation.set-agent-config\n desc: Mutate thread.agent. Undefined config means off.\n input:\n thread: Ref<Thread>\n config?: AgentConfig\n```\n\n## Components\n\n```mdl\ncomponent AgentToggle\n desc: |\n Per-thread radio popover hung off the thread header in CommentsPanel.\n Three states: off / mention / auto. Shows the resolved AgentIdentity.name\n as a read-only label.\n props:\n value?: AgentConfig\n agentName: String\n emits:\n change: { config?: AgentConfig }\n layout: |\n \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 Agent: {agentName} \u2502\n \u2502 \u2502\n \u2502 \u25EF Off \u2502\n \u2502 \u25C9 Reply only on @mention \u2502\n \u2502 \u25EF Auto-respond \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## Features\n\n```mdl\nfeat F-1: Per-thread agent configuration\n\n req F-1.1: Thread schema MUST add an optional `agent: AgentConfig` field\n without breaking existing threads (no migration required).\n\n req F-1.2: The `AgentIdentity` Effect service MUST be the sole source of\n the agent's display name. Thread schema MUST NOT store the name.\n\n req F-1.3: ThreadPlugin MUST contribute a default `AgentIdentity` capability\n at plugin activation (`{ name: 'Kai' }`). Hosts overriding the default\n contribute their own `AgentIdentity` earlier in plugin order so\n `Capability.get` returns it first.\n\nfeat F-2: Trigger gate\n\n req F-2.1: ThreadOperation.AddMessage MUST evaluate the gate after appending\n the message and MUST schedule (not invoke) RespondToThread when it passes.\n\n req F-2.2: The gate MUST return true iff ALL hold:\n - thread.agent?.enabled === true\n - message.sender.role !== 'assistant' # user-authored messages carry no role\n - thread.status !== 'resolved'\n - mode === 'auto' OR text contains '@' + agentName (case-insensitive)\n\n req F-2.3: The gate MUST NOT fire on assistant messages (self-loop guard).\n\n req F-2.4: Flipping enabled on a thread MUST NOT retroactively respond to\n prior messages; only future user messages.\n\nfeat F-3: Agent runner\n\n req F-3.1: The runner MUST be a Capability so storybook and tests can swap\n in a stub without changing call sites.\n\n req F-3.2: The default runner MUST execute one LLM turn via\n `LanguageModel.generateText`, providing the thread message history as\n prompt and appending the response (or a synthesized post-tool ack) as\n an assistant message on the same thread.\n\n req F-3.3: The agent MUST be given edit tools for in-place markdown updates:\n - `editAnchoredRange(replacement)` \u2014 splices the replacement into the\n anchored span via Automerge-diff (`updateText`) and rewrites the\n AnchoredTo cursor so the comment marker tracks the new text.\n - `updateDocument(content)` \u2014 replaces the entire document content.\n\n req F-3.4: When the subject is not a Markdown.Document (no editable text in\n scope), the runner MUST omit the edit tools and only post a chat reply.\n\n req F-3.5: Assistant messages emitted by the runner MUST carry\n sender = { role: 'assistant', name: identity.name, identityDid: identity.identityDid }.\n\n req F-3.6: Runner errors MUST be caught at the operation handler boundary,\n logged via @dxos/log, and emit a `threads.agent.failed` observability event.\n The user's message MUST remain in the thread.\n\nfeat F-4: Toggle UI\n\n req F-4.1: CommentsPanel MUST render an AgentToggle icon button per thread,\n next to existing controls (resolve, delete).\n\n req F-4.2: Clicking the toggle MUST open a popover with three radio options\n (off / mention / auto) and a non-editable label showing AgentIdentity.name.\n\n req F-4.3: Changes MUST go through ThreadOperation.SetAgentConfig, not\n direct schema writes from the popover.\n\n req F-4.4: No UI is provided for changing the agent name in v1; the name\n is read-only from the user's perspective.\n\nfeat F-5: Storybook coverage\n\n req F-5.1: CommentsCompanion.stories.tsx MUST add three new variants:\n - `WithMentionAgent`: thread auto-opted-in with mode='mention'; stub runner.\n - `WithAutoAgent`: thread auto-opted-in with mode='auto'; stub runner.\n - `WithLiveAgent`: thread auto-opted-in with mode='auto'; live runner\n (Anthropic via DXOS edge).\n\n req F-5.2: `WithMentionAgent` and `WithAutoAgent` MUST contribute a stub\n `AgentRunner` that performs a canned `postReply` and never makes network\n calls (so headless `test-storybook` runs are deterministic and offline).\n\n req F-5.3: `WithLiveAgent` MUST contribute an `AppCapabilities.AiServiceLayer`\n (Anthropic via DXOS edge) so ThreadPlugin's default LLM-backed `AgentRunner`\n reaches a real model. Headless `test-storybook` renders but does not submit\n a comment, so no network call occurs in CI.\n\n req F-5.4: All three variants MUST contribute a static `AgentIdentity`\n capability (e.g. `{ name: 'Kai' }`) so the runner stamps the assistant\n message correctly even when no host layer is present.\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Auto mode responds to every user message\n given: A thread with agent = { enabled: true, mode: 'auto' }\n when: A user appends a text message via ThreadOperation.AddMessage\n then:\n - RespondToThread is scheduled exactly once\n - The runner's `run` is invoked with the thread and subject\n\ntest T-2: Mention mode gates on @name\n given: A thread with agent = { enabled: true, mode: 'mention' }, identity.name = 'claude'\n when: A user posts \"hello world\" (no mention) then \"hey @Claude check this\"\n then:\n - The first message does not schedule RespondToThread\n - The second message schedules RespondToThread\n\ntest T-3: Self-loop guard\n given: A thread with agent = { enabled: true, mode: 'auto' }\n when: A message with sender.role = 'assistant' is appended\n then: RespondToThread is NOT scheduled\n\ntest T-4: Resolved threads do not trigger\n given: A thread with agent.enabled = true and status = 'resolved'\n when: A user appends a message\n then: RespondToThread is NOT scheduled\n\ntest T-5: Disabled mid-conversation does not delete history\n given: A thread with prior assistant messages\n when: SetAgentConfig is invoked with config = undefined\n then:\n - thread.agent becomes undefined\n - thread.messages is unchanged\n\ntest T-6: Story WithAutoAgent posts an assistant reply\n given: The WithAutoAgent storybook variant is rendered\n when: The user types \"hello\" and clicks send\n then:\n - The thread shows two messages\n - The second message has sender.role = 'assistant' and sender.name = 'echo'\n\ntest T-7: Story WithMentionAgent gates correctly\n given: The WithMentionAgent storybook variant is rendered\n when: The user posts \"hello\" then \"@echo hello\"\n then:\n - After the first send, only the user message is visible\n - After the second send, an assistant message is appended\n\ntest T-8: Runner errors do not lose the user message\n given: A thread with agent enabled and a runner stubbed to fail\n when: A user appends a message\n then:\n - The user message persists in the thread\n - A `threads.agent.failed` observability event is emitted\n - No assistant message is appended\n```\n\n## Out of Scope (v1)\n\n- Per-document default agent config (was discussed during brainstorming; punted).\n- UI to rename the agent within Composer (lives in plugin settings).\n- \"Thinking\u2026\" / streaming indicator on the message list.\n- Cancellation of in-flight runner turns when the agent is disabled mid-turn.\n- De-duplication of concurrent triggers from multiple users on the same thread.\n- Token-budget caps on long threads or large documents.\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkBC,YAAYC,cAAc;AACrD,SAASC,qBAAqBC,iBAAiB;AAC/C,SAASC,iBAAiB;AAC1B,SAASC,sBAAsB;AAC/B,SAASC,mBAAmBC,mBAAmB;AAC/C,SAASC,gBAAgBC,0BAA0B;AACnD,SAASC,YAAYC,SAASC,SAASC,cAAc;AAErD,SACEC,aACAC,iBACAC,qBACAC,cACAC,UACAC,kBACAC,cACAC,cACAC,mBACK;AACP,SAASC,YAAY;AACrB,SAASf,oBAAoB;AAC7B,SAASgB,eAAeC,wBAAwBC,uBAAuB;;;AC3BvE;;;ADsCO,IAAMC,eAAeC,OAAOC,OAAOC,IAAAA,EAAMC;EAC9CC,UAAUC,kBAAkB;IAAEC,UAAUC;EAAgB,CAAA;EACxDH,UAAUI,6BAA6B;IAAEF,UAAUG;EAAoB,CAAA;EACvEL,UAAUM,sBAAsB;IAAEJ,UAAUK;EAAa,CAAA;EACzDP,UAAUQ,0BAA0B;IAAEN,UAAUO;EAAiB,CAAA;EACjET,UAAUU,sBAAsB;IAAER,UAAUS;EAAa,CAAA;EACzDX,UAAUY,gBAAgB;IACxBC,QAAQ;MAACC,WAAWA;MAAYC,QAAQA;MAASC,QAAQA;MAASC,OAAOA;;EAC3E,CAAA;EACAjB,UAAUkB,iBAAiB;IAAEhB,UAAUiB;EAAa,CAAA;EACpDnB,UAAUoB,sBAAsB;IAAEC,cAAc;SAAIA;SAAiBC;;EAAoB,CAAA;;;;;;;EAOzF1B,OAAO2B,UAAU;IACfC,IAAI;;;;IAIJC,aAAaC,oBAAoBC;IACjCzB,UAAU0B;EACZ,CAAA;EACAhC,OAAO2B,UAAU;IACfC,IAAI;IACJC,aAAaI,YAAYC;IACzB5B,UAAU,MACD6B,eACLC,WAAWC,YAAYC,kBAAkBC,eAAe,CAACC,WACvDC,UAAUC,OAAOC,gBAAgBJ,eAAeC,MAAAA,CAAAA,CAAAA;EAGxD,CAAA;EACAxC,OAAO2B,UAAU;IACfC,IAAI;IACJC,aAAae,eAAeC;IAC5BvC,UAAUwC;EACZ,CAAA;;;;;EAKA9C,OAAO2B,UAAU;IACfC,IAAI;IACJC,aAAakB,iBAAiBC;IAC9B1C,UAAU2C;EACZ,CAAA;;;EAGAjD,OAAO2B,UAAU;IACfC,IAAI;IACJC,aAAakB,iBAAiBC;IAC9B1C,UAAU,MAAa6B,eAAQC,WAAWC,YAAYa,eAAeC,sBAAAA,CAAAA;EACvE,CAAA;EACA/C,UAAUgD,qBAAqB;IAC7BC,OAAO;MAAEC,UAAUpD,KAAK0B;MAAI2B,MAAM;MAAcC,SAASC;MAAYC,UAAU;IAAoB;EACrG,CAAA;EACA1D,OAAO2D;AAAI;AAGb,IAAA,uBAAe5D;",
|
|
6
|
+
"names": ["Effect", "ActivationEvents", "Capability", "Plugin", "AppActivationEvents", "AppPlugin", "Operation", "MarkdownEvents", "SpaceCapabilities", "SpaceEvents", "translations", "threadTranslations", "AnchoredTo", "Channel", "Message", "Thread", "AgentRunner", "AppGraphBuilder", "BlueprintDefinition", "CreateObject", "Markdown", "OperationHandler", "UndoMappings", "ReactSurface", "ThreadState", "meta", "AgentIdentity", "DEFAULT_AGENT_IDENTITY", "ThreadOperation", "ThreadPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "AppGraphBuilder", "addBlueprintDefinitionModule", "BlueprintDefinition", "addCreateObjectModule", "CreateObject", "addOperationHandlerModule", "OperationHandler", "addUndoMappingsModule", "UndoMappings", "addSchemaModule", "schema", "AnchoredTo", "Channel", "Message", "Thread", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "threadTranslations", "addModule", "id", "activatesOn", "AppActivationEvents", "SetupSettings", "ThreadState", "SpaceEvents", "SpaceCreated", "succeed", "Capability", "contributes", "SpaceCapabilities", "OnCreateSpace", "params", "Operation", "invoke", "ThreadOperation", "MarkdownEvents", "SetupExtensions", "Markdown", "ActivationEvents", "Startup", "AgentRunner", "AgentIdentity", "DEFAULT_AGENT_IDENTITY", "addPluginAssetModule", "asset", "pluginId", "path", "content", "pluginSpec", "mimeType", "make"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/ThreadPlugin.node.ts
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { Capability, Plugin } from "@dxos/app-framework";
|
|
6
|
+
import { AppPlugin } from "@dxos/app-toolkit";
|
|
7
|
+
import { Operation } from "@dxos/compute";
|
|
8
|
+
import { SpaceCapabilities, SpaceEvents } from "@dxos/plugin-space";
|
|
9
|
+
import { AnchoredTo, Channel, Message, Thread } from "@dxos/types";
|
|
10
|
+
import { AppGraphBuilder, BlueprintDefinition, CreateObject, OperationHandler, UndoMappings } from "#capabilities";
|
|
11
|
+
import { meta } from "#meta";
|
|
12
|
+
import { ThreadOperation } from "#types";
|
|
13
|
+
var ThreadPlugin = Plugin.define(meta).pipe(AppPlugin.addAppGraphModule({
|
|
14
|
+
activate: AppGraphBuilder
|
|
15
|
+
}), AppPlugin.addBlueprintDefinitionModule({
|
|
16
|
+
activate: BlueprintDefinition
|
|
17
|
+
}), AppPlugin.addCreateObjectModule({
|
|
18
|
+
activate: CreateObject
|
|
19
|
+
}), AppPlugin.addOperationHandlerModule({
|
|
20
|
+
activate: OperationHandler
|
|
21
|
+
}), AppPlugin.addUndoMappingsModule({
|
|
22
|
+
activate: UndoMappings
|
|
23
|
+
}), AppPlugin.addSchemaModule({
|
|
24
|
+
schema: [
|
|
25
|
+
AnchoredTo.AnchoredTo,
|
|
26
|
+
Channel.Channel,
|
|
27
|
+
Message.Message,
|
|
28
|
+
Thread.Thread
|
|
29
|
+
]
|
|
30
|
+
}), Plugin.addModule({
|
|
31
|
+
id: "on-space-created",
|
|
32
|
+
activatesOn: SpaceEvents.SpaceCreated,
|
|
33
|
+
activate: () => Effect.succeed(Capability.contributes(SpaceCapabilities.OnCreateSpace, (params) => Operation.invoke(ThreadOperation.OnCreateSpace, params)))
|
|
34
|
+
}), Plugin.make);
|
|
35
|
+
var ThreadPlugin_node_default = ThreadPlugin;
|
|
36
|
+
export {
|
|
37
|
+
ThreadPlugin,
|
|
38
|
+
ThreadPlugin_node_default as default
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=ThreadPlugin.node.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ThreadPlugin.node.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';\nimport { AnchoredTo, Channel, Message, Thread } from '@dxos/types';\n\nimport { AppGraphBuilder, BlueprintDefinition, CreateObject, OperationHandler, UndoMappings } from '#capabilities';\nimport { meta } from '#meta';\nimport { ThreadOperation } from '#types';\n\nexport const ThreadPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addBlueprintDefinitionModule({ activate: BlueprintDefinition }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),\n AppPlugin.addSchemaModule({\n schema: [AnchoredTo.AnchoredTo, Channel.Channel, Message.Message, Thread.Thread],\n }),\n Plugin.addModule({\n id: 'on-space-created',\n activatesOn: SpaceEvents.SpaceCreated,\n activate: () =>\n Effect.succeed(\n Capability.contributes(SpaceCapabilities.OnCreateSpace, (params) =>\n Operation.invoke(ThreadOperation.OnCreateSpace, params),\n ),\n ),\n }),\n Plugin.make,\n);\n\nexport default ThreadPlugin;\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,mBAAmBC,mBAAmB;AAC/C,SAASC,YAAYC,SAASC,SAASC,cAAc;AAErD,SAASC,iBAAiBC,qBAAqBC,cAAcC,kBAAkBC,oBAAoB;AACnG,SAASC,YAAY;AACrB,SAASC,uBAAuB;AAEzB,IAAMC,eAAehB,OAAOiB,OAAOH,IAAAA,EAAMI,KAC9CjB,UAAUkB,kBAAkB;EAAEC,UAAUX;AAAgB,CAAA,GACxDR,UAAUoB,6BAA6B;EAAED,UAAUV;AAAoB,CAAA,GACvET,UAAUqB,sBAAsB;EAAEF,UAAUT;AAAa,CAAA,GACzDV,UAAUsB,0BAA0B;EAAEH,UAAUR;AAAiB,CAAA,GACjEX,UAAUuB,sBAAsB;EAAEJ,UAAUP;AAAa,CAAA,GACzDZ,UAAUwB,gBAAgB;EACxBC,QAAQ;IAACrB,WAAWA;IAAYC,QAAQA;IAASC,QAAQA;IAASC,OAAOA;;AAC3E,CAAA,GACAR,OAAO2B,UAAU;EACfC,IAAI;EACJC,aAAazB,YAAY0B;EACzBV,UAAU,MACDW,eACLhC,WAAWiC,YAAY7B,kBAAkB8B,eAAe,CAACC,WACvDhC,UAAUiC,OAAOpB,gBAAgBkB,eAAeC,MAAAA,CAAAA,CAAAA;AAGxD,CAAA,GACAlC,OAAOoC,IAAI;AAGb,IAAA,4BAAepB;",
|
|
6
|
+
"names": ["Effect", "Capability", "Plugin", "AppPlugin", "Operation", "SpaceCapabilities", "SpaceEvents", "AnchoredTo", "Channel", "Message", "Thread", "AppGraphBuilder", "BlueprintDefinition", "CreateObject", "OperationHandler", "UndoMappings", "meta", "ThreadOperation", "ThreadPlugin", "define", "pipe", "addAppGraphModule", "activate", "addBlueprintDefinitionModule", "addCreateObjectModule", "addOperationHandlerModule", "addUndoMappingsModule", "addSchemaModule", "schema", "addModule", "id", "activatesOn", "SpaceCreated", "succeed", "contributes", "OnCreateSpace", "params", "invoke", "make"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/ThreadPlugin.workerd.ts
|
|
4
|
+
import { Plugin } from "@dxos/app-framework";
|
|
5
|
+
import { AppPlugin } from "@dxos/app-toolkit";
|
|
6
|
+
import { AnchoredTo, Channel, Message, Thread } from "@dxos/types";
|
|
7
|
+
import { OperationHandler } from "#capabilities";
|
|
8
|
+
import { meta } from "#meta";
|
|
9
|
+
var ThreadPlugin = Plugin.define(meta).pipe(AppPlugin.addOperationHandlerModule({
|
|
10
|
+
activate: OperationHandler
|
|
11
|
+
}), AppPlugin.addSchemaModule({
|
|
12
|
+
schema: [
|
|
13
|
+
AnchoredTo.AnchoredTo,
|
|
14
|
+
Channel.Channel,
|
|
15
|
+
Message.Message,
|
|
16
|
+
Thread.Thread
|
|
17
|
+
]
|
|
18
|
+
}), Plugin.make);
|
|
19
|
+
var ThreadPlugin_workerd_default = ThreadPlugin;
|
|
20
|
+
export {
|
|
21
|
+
ThreadPlugin,
|
|
22
|
+
ThreadPlugin_workerd_default as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=ThreadPlugin.workerd.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ThreadPlugin.workerd.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\nimport { AnchoredTo, Channel, Message, Thread } from '@dxos/types';\n\nimport { OperationHandler } from '#capabilities';\nimport { meta } from '#meta';\n\nexport const ThreadPlugin = Plugin.define(meta).pipe(\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addSchemaModule({\n schema: [AnchoredTo.AnchoredTo, Channel.Channel, Message.Message, Thread.Thread],\n }),\n Plugin.make,\n);\n\nexport default ThreadPlugin;\n"],
|
|
5
|
+
"mappings": ";;;AAIA,SAASA,cAAc;AACvB,SAASC,iBAAiB;AAC1B,SAASC,YAAYC,SAASC,SAASC,cAAc;AAErD,SAASC,wBAAwB;AACjC,SAASC,YAAY;AAEd,IAAMC,eAAeR,OAAOS,OAAOF,IAAAA,EAAMG,KAC9CT,UAAUU,0BAA0B;EAAEC,UAAUN;AAAiB,CAAA,GACjEL,UAAUY,gBAAgB;EACxBC,QAAQ;IAACZ,WAAWA;IAAYC,QAAQA;IAASC,QAAQA;IAASC,OAAOA;;AAC3E,CAAA,GACAL,OAAOe,IAAI;AAGb,IAAA,+BAAeP;",
|
|
6
|
+
"names": ["Plugin", "AppPlugin", "AnchoredTo", "Channel", "Message", "Thread", "OperationHandler", "meta", "ThreadPlugin", "define", "pipe", "addOperationHandlerModule", "activate", "addSchemaModule", "schema", "make"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/components/ThreadSettings/ThreadSettings.tsx
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { useTranslation } from "@dxos/react-ui";
|
|
6
|
+
import { Settings as SettingsForm } from "@dxos/react-ui-form";
|
|
7
|
+
import { meta } from "#meta";
|
|
8
|
+
var ThreadSettings = ({ settings: _settings }) => {
|
|
9
|
+
const { t: _t } = useTranslation(meta.id);
|
|
10
|
+
return /* @__PURE__ */ React.createElement(SettingsForm.Viewport, null);
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
ThreadSettings as default
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=ThreadSettings-5MKTDK3A.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ThreadSettings/ThreadSettings.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Settings as SettingsForm } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { type Settings } from '#types';\n\nexport type ThreadSettingsProps = AppSurface.SettingsArticleProps<Settings.Settings>;\n\nexport const ThreadSettings = ({ settings: _settings }: ThreadSettingsProps) => {\n const { t: _t } = useTranslation(meta.id);\n return <SettingsForm.Viewport></SettingsForm.Viewport>;\n};\n"],
|
|
5
|
+
"mappings": ";;;AAIA,OAAOA,WAAW;AAGlB,SAASC,sBAAsB;AAC/B,SAASC,YAAYC,oBAAoB;AAEzC,SAASC,YAAY;AAKd,IAAMC,iBAAiB,CAAC,EAAEC,UAAUC,UAAS,MAAuB;AACzE,QAAM,EAAEC,GAAGC,GAAE,IAAKR,eAAeG,KAAKM,EAAE;AACxC,SAAO,sBAAA,cAACP,aAAaQ,UAAQ,IAAA;AAC/B;",
|
|
6
|
+
"names": ["React", "useTranslation", "Settings", "SettingsForm", "meta", "ThreadSettings", "settings", "_settings", "t", "_t", "id", "Viewport"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AgentIdentity,
|
|
3
|
+
ThreadCapabilities_exports,
|
|
4
|
+
ThreadOperation_exports
|
|
5
|
+
} from "./chunk-IQBZZAMX.mjs";
|
|
6
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
7
|
+
|
|
8
|
+
// src/operations/add-message.ts
|
|
9
|
+
import * as Effect from "effect/Effect";
|
|
10
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
12
|
+
import { Obj, Ref, Relation } from "@dxos/echo";
|
|
13
|
+
import { invariant } from "@dxos/invariant";
|
|
14
|
+
import { ObservabilityOperation } from "@dxos/plugin-observability";
|
|
15
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
16
|
+
import { AnchoredTo, Message } from "@dxos/types";
|
|
17
|
+
|
|
18
|
+
// src/should-trigger-agent.ts
|
|
19
|
+
var textOf = (message) => {
|
|
20
|
+
if (!message) {
|
|
21
|
+
return "";
|
|
22
|
+
}
|
|
23
|
+
return message.blocks.filter((block) => block._tag === "text").map((block) => block.text).join("\n");
|
|
24
|
+
};
|
|
25
|
+
var shouldTriggerAgent = (thread, message, agentName) => {
|
|
26
|
+
if (!thread.agent?.enabled) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (message.sender.role === "assistant") {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (thread.status === "resolved") {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (thread.agent.mode === "auto") {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const needle = "@" + agentName.toLowerCase();
|
|
39
|
+
return textOf(message).toLowerCase().includes(needle);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/operations/add-message.ts
|
|
43
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/operations/add-message.ts";
|
|
44
|
+
var handler = ThreadOperation_exports.AddMessage.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ anchor, subject, sender, text }) {
|
|
45
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
46
|
+
const stateAtom = yield* Capability.get(ThreadCapabilities_exports.State);
|
|
47
|
+
const thread = Relation.getSource(anchor);
|
|
48
|
+
const subjectId = Obj.getURI(subject);
|
|
49
|
+
const db = Obj.getDatabase(subject);
|
|
50
|
+
invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 21, S: this, A: ["db", "'Database not found'"] });
|
|
51
|
+
const message = Obj.make(Message.Message, {
|
|
52
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
53
|
+
sender,
|
|
54
|
+
blocks: [
|
|
55
|
+
{
|
|
56
|
+
_tag: "text",
|
|
57
|
+
text
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
Obj.update(thread, (thread2) => {
|
|
62
|
+
thread2.messages.push(Ref.make(message));
|
|
63
|
+
});
|
|
64
|
+
const state = registry.get(stateAtom);
|
|
65
|
+
const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
|
|
66
|
+
if (draft) {
|
|
67
|
+
Obj.update(thread, (thread2) => {
|
|
68
|
+
thread2.status = "active";
|
|
69
|
+
});
|
|
70
|
+
registry.set(stateAtom, {
|
|
71
|
+
...state,
|
|
72
|
+
drafts: {
|
|
73
|
+
...state.drafts,
|
|
74
|
+
[subjectId]: state.drafts[subjectId]?.filter((a) => a.id !== anchor.id)
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
78
|
+
object: thread,
|
|
79
|
+
target: db,
|
|
80
|
+
hidden: true
|
|
81
|
+
});
|
|
82
|
+
yield* Operation.invoke(SpaceOperation.AddRelation, {
|
|
83
|
+
db,
|
|
84
|
+
schema: AnchoredTo.AnchoredTo,
|
|
85
|
+
source: thread,
|
|
86
|
+
target: subject,
|
|
87
|
+
fields: {
|
|
88
|
+
anchor: draft.anchor
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
yield* Operation.schedule(ObservabilityOperation.SendEvent, {
|
|
92
|
+
name: "threads.create",
|
|
93
|
+
properties: {
|
|
94
|
+
spaceId: db.spaceId,
|
|
95
|
+
threadId: thread.id
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
yield* Operation.schedule(ObservabilityOperation.SendEvent, {
|
|
100
|
+
name: "threads.message.add",
|
|
101
|
+
properties: {
|
|
102
|
+
spaceId: db.spaceId,
|
|
103
|
+
threadId: thread.id,
|
|
104
|
+
threadLength: thread.messages.length,
|
|
105
|
+
messageId: message.id,
|
|
106
|
+
messageLength: text.length
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
const identities = yield* Capability.getAll(AgentIdentity);
|
|
110
|
+
const identity = identities[0];
|
|
111
|
+
if (identity && shouldTriggerAgent(thread, message, identity.name)) {
|
|
112
|
+
yield* Operation.schedule(ThreadOperation_exports.RespondToThread, {
|
|
113
|
+
thread: Ref.make(thread),
|
|
114
|
+
subject: Ref.make(subject)
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
})));
|
|
118
|
+
var add_message_default = handler;
|
|
119
|
+
export {
|
|
120
|
+
add_message_default as default
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=add-message-RDIABSIX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/add-message.ts", "../../../src/should-trigger-agent.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Ref, Relation } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { AnchoredTo, Message, Thread } from '@dxos/types';\n\nimport { shouldTriggerAgent } from '../should-trigger-agent';\nimport { AgentIdentity, ThreadCapabilities } from '../types';\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.AddMessage> = ThreadOperation.AddMessage.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ anchor, subject, sender, text }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(ThreadCapabilities.State);\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const subjectId = Obj.getURI(subject);\n const db = Obj.getDatabase(subject);\n invariant(db, 'Database not found');\n\n const message = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender,\n blocks: [{ _tag: 'text', text }],\n });\n Obj.update(thread, (thread) => {\n thread.messages.push(Ref.make(message));\n });\n\n const state = registry.get(stateAtom);\n const draft = state.drafts[subjectId]?.find((a: { id: string }) => a.id === anchor.id);\n if (draft) {\n Obj.update(thread, (thread) => {\n thread.status = 'active';\n });\n registry.set(stateAtom, {\n ...state,\n drafts: {\n ...state.drafts,\n [subjectId]: state.drafts[subjectId]?.filter((a: { id: string }) => a.id !== anchor.id),\n },\n });\n yield* Operation.invoke(SpaceOperation.AddObject, { object: thread, target: db, hidden: true });\n yield* Operation.invoke(SpaceOperation.AddRelation, {\n db,\n schema: AnchoredTo.AnchoredTo,\n source: thread,\n target: subject,\n fields: { anchor: draft.anchor },\n });\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'threads.create',\n properties: {\n spaceId: db.spaceId,\n threadId: thread.id,\n },\n });\n }\n\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'threads.message.add',\n properties: {\n spaceId: db.spaceId,\n threadId: thread.id,\n threadLength: thread.messages.length,\n messageId: message.id,\n messageLength: text.length,\n },\n });\n\n // Gate the comment-thread agent. Identity is optional — if no capability\n // is contributed we simply never trigger. Schedule (not invoke) so the\n // user's message commit returns immediately and the agent runs out-of-band.\n const identities = yield* Capability.getAll(AgentIdentity);\n const identity = identities[0];\n if (identity && shouldTriggerAgent(thread, message, identity.name)) {\n yield* Operation.schedule(ThreadOperation.RespondToThread, {\n thread: Ref.make(thread),\n subject: Ref.make(subject),\n });\n }\n }),\n ),\n);\n\nexport default handler;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Message, type Thread } from '@dxos/types';\n\n/**\n * Returns the concatenated text of all 'text' blocks on a message.\n *\n * Proposal blocks (assistant-authored markdown diffs) are intentionally\n * excluded — gating mentions off a proposal text would be meaningless.\n */\nexport const textOf = (message: Message.Message | undefined): string => {\n if (!message) {\n return '';\n }\n return message.blocks\n .filter((block): block is Extract<Message.Message['blocks'][number], { _tag: 'text' }> => block._tag === 'text')\n .map((block) => block.text)\n .join('\\n');\n};\n\n/**\n * Trigger gate for the comment-thread agent.\n *\n * Returns true iff the agent should respond to the latest message. All of:\n * - `thread.agent` exists and `enabled === true`\n * - `message.sender.role !== 'assistant'` (structural self-loop guard).\n * Note: user-authored messages typically have NO role set; only assistant\n * messages carry an explicit role.\n * - `thread.status !== 'resolved'`\n * - Either mode === 'auto', OR text contains an `@{agentName}` mention\n * (case-insensitive substring match; v1 — promote to a parser later).\n */\nexport const shouldTriggerAgent = (thread: Thread.Thread, message: Message.Message, agentName: string): boolean => {\n if (!thread.agent?.enabled) {\n return false;\n }\n if (message.sender.role === 'assistant') {\n return false;\n }\n if (thread.status === 'resolved') {\n return false;\n }\n if (thread.agent.mode === 'auto') {\n return true;\n }\n const needle = '@' + agentName.toLowerCase();\n return textOf(message).toLowerCase().includes(needle);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,KAAKC,gBAAgB;AACnC,SAASC,iBAAiB;AAC1B,SAASC,8BAA8B;AACvC,SAASC,sBAAsB;AAC/B,SAASC,YAAYC,eAAuB;;;ACArC,IAAMC,SAAS,CAACC,YAAAA;AACrB,MAAI,CAACA,SAAS;AACZ,WAAO;EACT;AACA,SAAOA,QAAQC,OACZC,OAAO,CAACC,UAAiFA,MAAMC,SAAS,MAAA,EACxGC,IAAI,CAACF,UAAUA,MAAMG,IAAI,EACzBC,KAAK,IAAA;AACV;AAcO,IAAMC,qBAAqB,CAACC,QAAuBT,SAA0BU,cAAAA;AAClF,MAAI,CAACD,OAAOE,OAAOC,SAAS;AAC1B,WAAO;EACT;AACA,MAAIZ,QAAQa,OAAOC,SAAS,aAAa;AACvC,WAAO;EACT;AACA,MAAIL,OAAOM,WAAW,YAAY;AAChC,WAAO;EACT;AACA,MAAIN,OAAOE,MAAMK,SAAS,QAAQ;AAChC,WAAO;EACT;AACA,QAAMC,SAAS,MAAMP,UAAUQ,YAAW;AAC1C,SAAOnB,OAAOC,OAAAA,EAASkB,YAAW,EAAGC,SAASF,MAAAA;AAChD;;;AD/BA,IAAA,eAA0EG;IAIpE,UAAMC,wBAAmBC,WAAc,KAACC,UAAAA,YAAwB,kBAAA,WAAA,EAAA,QAAA,SAAA,QAAA,KAAA,GAAA;AAChE,QAAMC,WAASC,OAASC,WAAUC,IAAAA,aAAAA,YAAAA;AAClC,QAAMC,YAAYC,OAAIC,WAAOC,IAAAA,2BAAAA,KAAAA;AAC7B,QAAMC,SAASC,SAAAA,UAAYF,MAAAA;AAC3BG,QAAAA,YAAc,IAAA,OAAA,OAAA;AAEd,QAAMC,KAAAA,IAAAA,YAAmBC,OAAQA;YAC/BC,IAAS,sBAAsB,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;QAC/BC,UAAAA,IAAAA,KAAAA,QAAAA,SAAAA;IACAC,UAAQ,oBAAA,KAAA,GAAA,YAAA;;YAAGC;;QAAmB,MAAA;QAAE;MAClC;IACIC;;AAEJ,MAAA,OAAA,QAAA,CAAAjB,YAAA;AAEA,IAAAA,QAAMkB,SAAQC,KAASC,IAAIvB,KAAAA,OAAAA,CAAAA;EAC3B,CAAA;AACA,QAAIwB,QAAO,SAAA,IAAA,SAAA;QACThB,QAAU,MAACL,OAASA,SAAAA,GAAAA,KAAAA,CAAAA,MAAAA,EAAAA,OAAAA,OAAAA,EAAAA;aAClBA;AACF,QAAA,OAAA,QAAA,CAAAA,YAAA;AACAmB,MAAAA,QAASG,SAAIzB;;aAEX0B,IAAQ,WAAA;;cAELnB;QACH,GAAA,MAAA;QACF,CAAA,SAAA,GAAA,MAAA,OAAA,SAAA,GAAA,OAAA,CAAA,MAAA,EAAA,OAAA,OAAA,EAAA;MACA;;WAAoEoB,UAAQhB,OAAAA,eAAAA,WAAAA;MAAIiB,QAAQ;MAAK,QAAA;MAC7F,QAAOC;;WAELC,UAAQC,OAAWA,eAAU,aAAA;MAC7BC;MACAL,QAAQjB,WAAAA;MACRuB,QAAQ;cAAE3B;MAAqB,QAAA;QACjC,QAAA,MAAA;MACA;;WAEE4B,UAAY,SAAA,uBAAA,WAAA;YACVC;kBACAC;QACF,SAAA,GAAA;QACF,UAAA,OAAA;MACF;IAEA,CAAA;;SAEEF,UAAY,SAAA,uBAAA,WAAA;UACVC;gBACAC;MACAC,SAAAA,GAAAA;MACAC,UAAAA,OAAWxB;MACXyB,cAAAA,OAAoBC,SAAM;MAC5B,WAAA,QAAA;MACF,eAAA,KAAA;IAEA;EACA,CAAA;AAIA,QAAIC,aAAYC,OAAAA,WAAmBvC,OAAQW,aAAS2B;QAClD,WAAOZ,WAAUc,CAAQ;kBACfC,mBAASzC,QAAAA,SAAAA,SAAAA,IAAAA,GAAAA;WACjBO,UAAamC,SAAKnC,wBAAAA,iBAAAA;MACpB,QAAA,IAAA,KAAA,MAAA;MACF,SAAA,IAAA,KAAA,OAAA;IACF,CAAA;EAIJ;;;",
|
|
6
|
+
"names": ["Effect", "Capabilities", "Capability", "Operation", "Obj", "Ref", "Relation", "invariant", "ObservabilityOperation", "SpaceOperation", "AnchoredTo", "Message", "textOf", "message", "blocks", "filter", "block", "_tag", "map", "text", "join", "shouldTriggerAgent", "thread", "agentName", "agent", "enabled", "sender", "role", "status", "mode", "needle", "toLowerCase", "includes", "ThreadOperation", "stateAtom", "Capability", "ThreadCapabilities", "thread", "Relation", "getSource", "anchor", "subjectId", "Obj", "getURI", "subject", "db", "getDatabase", "invariant", "message", "Message", "created", "sender", "blocks", "_tag", "update", "state", "registry", "get", "draft", "set", "drafts", "target", "hidden", "Operation", "schema", "AnchoredTo", "source", "fields", "properties", "spaceId", "threadId", "threadLength", "messageId", "messageLength", "length", "identity", "shouldTriggerAgent", "schedule", "Ref", "make"]
|
|
7
|
+
}
|