@dxos/plugin-assistant 0.8.1-main.ba2dec9 → 0.8.1-staging.31c3ee1
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/dist/lib/browser/{AssistantDialog-AMON6O2T.mjs → AssistantDialog-YSHMAHW5.mjs} +15 -14
- package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs.map +7 -0
- package/dist/lib/browser/{ChatContainer-SPZK5ZHX.mjs → ChatContainer-V5GP7DYF.mjs} +11 -11
- package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs.map +7 -0
- package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs +78 -0
- package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs.map +7 -0
- package/dist/lib/browser/ai-client-CDZLSNXE.mjs +35 -0
- package/dist/lib/browser/ai-client-CDZLSNXE.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs +209 -0
- package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-NV7SVHMV.mjs → chunk-3HCI5FIL.mjs} +2 -2
- package/dist/lib/browser/{chunk-NV7SVHMV.mjs.map → chunk-3HCI5FIL.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-HI564NSX.mjs → chunk-FMB7RGMP.mjs} +379 -247
- package/dist/lib/browser/chunk-FMB7RGMP.mjs.map +7 -0
- package/dist/lib/browser/chunk-IAMR2FAE.mjs +183 -0
- package/dist/lib/browser/chunk-IAMR2FAE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-FR7IEJ7N.mjs → chunk-KYMKVE6M.mjs} +37 -15
- package/dist/lib/browser/chunk-KYMKVE6M.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EUMPBC4T.mjs → chunk-NFUHCW2J.mjs} +3 -3
- package/dist/lib/browser/{chunk-NTLTGYYS.mjs → chunk-TXJWGWJ7.mjs} +3 -3
- package/dist/lib/browser/chunk-TXJWGWJ7.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +37 -53
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-FQRN6747.mjs → intent-resolver-WJGLKKVO.mjs} +8 -6
- package/dist/lib/browser/{intent-resolver-FQRN6747.mjs.map → intent-resolver-WJGLKKVO.mjs.map} +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-GLNUJX7O.mjs → react-surface-57VRDOQT.mjs} +36 -15
- package/dist/lib/browser/react-surface-57VRDOQT.mjs.map +7 -0
- package/dist/lib/browser/{settings-VVQUGG56.mjs → settings-U6UFQX32.mjs} +4 -4
- package/dist/lib/browser/types/index.mjs +6 -2
- package/dist/lib/node/{AssistantDialog-DS7OCVMV.cjs → AssistantDialog-YI2BSGSX.cjs} +18 -17
- package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs.map +7 -0
- package/dist/lib/node/{ChatContainer-7MNRJL6Q.cjs → ChatContainer-ZJ5JXF6A.cjs} +15 -15
- package/dist/lib/node/ChatContainer-ZJ5JXF6A.cjs.map +7 -0
- package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs +104 -0
- package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs.map +7 -0
- package/dist/lib/node/{ai-client-RBDOGK6W.cjs → ai-client-URCCYU6B.cjs} +19 -19
- package/dist/lib/node/ai-client-URCCYU6B.cjs.map +7 -0
- package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs +220 -0
- package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs.map +7 -0
- package/dist/lib/node/{chunk-34WE2FD2.cjs → chunk-APRU3QWK.cjs} +32 -9
- package/dist/lib/node/chunk-APRU3QWK.cjs.map +7 -0
- package/dist/lib/node/{chunk-3WXG6WA6.cjs → chunk-GBUNQ257.cjs} +6 -6
- package/dist/lib/node/chunk-GBUNQ257.cjs.map +7 -0
- package/dist/lib/node/{chunk-GNPXCHFT.cjs → chunk-Q5XWEMHB.cjs} +4 -4
- package/dist/lib/node/{chunk-GNPXCHFT.cjs.map → chunk-Q5XWEMHB.cjs.map} +2 -2
- package/dist/lib/node/{chunk-3HNLL6MY.cjs → chunk-RPBKMP2E.cjs} +350 -222
- package/dist/lib/node/chunk-RPBKMP2E.cjs.map +7 -0
- package/dist/lib/node/{chunk-NV4TQQSU.cjs → chunk-XI2ARIEO.cjs} +6 -6
- package/dist/lib/node/{chunk-PYTGHFKZ.cjs → chunk-ZKOC4ZFY.cjs} +40 -18
- package/dist/lib/node/chunk-ZKOC4ZFY.cjs.map +7 -0
- package/dist/lib/node/index.cjs +78 -94
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-Z37RNNMC.cjs → intent-resolver-R3OSTIMH.cjs} +14 -12
- package/dist/lib/node/intent-resolver-R3OSTIMH.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-PYGRBZY7.cjs → react-surface-NUQTM6MS.cjs} +47 -26
- package/dist/lib/node/react-surface-NUQTM6MS.cjs.map +7 -0
- package/dist/lib/node/{settings-TJHHVI6B.cjs → settings-TXGRCYAL.cjs} +8 -8
- package/dist/lib/node/types/index.cjs +15 -11
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{AssistantDialog-TSVUYKUL.mjs → AssistantDialog-U2FQX5TD.mjs} +15 -14
- package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs.map +7 -0
- package/dist/lib/node-esm/{ChatContainer-H4X734PB.mjs → ChatContainer-QW3OOXTT.mjs} +11 -11
- package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs.map +7 -0
- package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs +79 -0
- package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs.map +7 -0
- package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs +36 -0
- package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs +210 -0
- package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ICQN3TDS.mjs → chunk-6JK5HEUQ.mjs} +3 -3
- package/dist/lib/node-esm/chunk-6JK5HEUQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs → chunk-ECRK6TUQ.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs.map → chunk-ECRK6TUQ.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-JRP4BQT4.mjs → chunk-GBBXIW5F.mjs} +37 -15
- package/dist/lib/node-esm/chunk-GBBXIW5F.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-E44GXXNE.mjs → chunk-MVDAY3CZ.mjs} +379 -247
- package/dist/lib/node-esm/chunk-MVDAY3CZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MXK2EANZ.mjs +184 -0
- package/dist/lib/node-esm/chunk-MXK2EANZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs → chunk-PBZA7XJR.mjs} +3 -3
- package/dist/lib/node-esm/index.mjs +37 -53
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-LOTXWV4J.mjs → intent-resolver-H32TL4X6.mjs} +8 -6
- package/dist/lib/node-esm/{intent-resolver-LOTXWV4J.mjs.map → intent-resolver-H32TL4X6.mjs.map} +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-PEQD6IJS.mjs → react-surface-JBVZF6CP.mjs} +36 -15
- package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-BVWR244C.mjs → settings-DZU5PNXM.mjs} +4 -4
- package/dist/lib/node-esm/types/index.mjs +6 -2
- package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/ai-client.d.ts +2 -1
- package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +2 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +4 -3
- package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
- package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/AssistantDialog.d.ts.map +1 -1
- package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +4 -2
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Prompt/Prompt.d.ts +3 -0
- package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
- package/dist/types/src/components/Prompt/Prompt.stories.d.ts +1 -0
- package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
- package/dist/types/src/components/Prompt/PromptBar.d.ts +2 -2
- package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
- package/dist/types/src/components/Prompt/references.d.ts +30 -0
- package/dist/types/src/components/Prompt/references.d.ts.map +1 -0
- package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +3 -3
- package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/Thread/Thread.d.ts +11 -1
- package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
- package/dist/types/src/components/Thread/ThreadContainer.d.ts +3 -0
- package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +3 -3
- package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +3 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/processor.d.ts +7 -15
- package/dist/types/src/hooks/processor.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts +11 -2
- package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
- package/dist/types/src/hooks/useContextProvider.d.ts +17 -0
- package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -0
- package/dist/types/src/hooks/useMessageQueue.d.ts +3 -3
- package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -8
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/test-functions.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +26 -12
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/chat.d.ts +4 -6
- package/dist/types/src/types/chat.d.ts.map +1 -1
- package/dist/types/src/types/template.d.ts +36 -0
- package/dist/types/src/types/template.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3 -1
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +58 -55
- package/src/AssistantPlugin.tsx +19 -23
- package/src/capabilities/ai-client.ts +23 -7
- package/src/capabilities/app-graph-builder.ts +100 -5
- package/src/capabilities/capabilities.ts +3 -1
- package/src/capabilities/intent-resolver.ts +4 -3
- package/src/capabilities/react-surface.tsx +27 -9
- package/src/components/AmbientDialog/AmbientDialog.stories.tsx +3 -1
- package/src/components/AmbientDialog/AmbientDialog.tsx +11 -11
- package/src/components/AssistantDialog.tsx +8 -2
- package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
- package/src/components/ChatContainer.tsx +18 -4
- package/src/components/Prompt/Prompt.stories.tsx +34 -0
- package/src/components/Prompt/Prompt.tsx +28 -18
- package/src/components/Prompt/PromptBar.tsx +5 -3
- package/src/components/Prompt/references.ts +180 -0
- package/src/components/TemplateContainer.tsx +79 -4
- package/src/components/TemplateEditor/TemplateEditor.stories.tsx +5 -5
- package/src/components/TemplateEditor/TemplateForm.stories.tsx +3 -3
- package/src/components/Thread/Thread.stories.tsx +3 -3
- package/src/components/Thread/Thread.tsx +21 -0
- package/src/components/Thread/ThreadContainer.stories.tsx +9 -14
- package/src/components/Thread/ThreadContainer.tsx +10 -4
- package/src/components/Thread/ThreadMessage.tsx +17 -9
- package/src/components/Toolbox/Toolbox.stories.tsx +2 -2
- package/src/components/index.ts +3 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/processor.ts +57 -116
- package/src/hooks/useChatProcessor.tsx +35 -19
- package/src/hooks/useContextProvider.ts +55 -0
- package/src/hooks/useMessageQueue.ts +4 -6
- package/src/meta.ts +2 -2
- package/src/testing/test-functions.ts +2 -2
- package/src/translations.ts +11 -5
- package/src/types/chat.ts +2 -3
- package/src/types/template.ts +22 -0
- package/src/types/types.ts +3 -1
- package/dist/lib/browser/AssistantDialog-AMON6O2T.mjs.map +0 -7
- package/dist/lib/browser/ChatContainer-SPZK5ZHX.mjs.map +0 -7
- package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs +0 -23
- package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs.map +0 -7
- package/dist/lib/browser/ai-client-PORKRZXM.mjs +0 -33
- package/dist/lib/browser/ai-client-PORKRZXM.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-36SKR7CX.mjs +0 -110
- package/dist/lib/browser/app-graph-builder-36SKR7CX.mjs.map +0 -7
- package/dist/lib/browser/chunk-FPXC3LKK.mjs +0 -162
- package/dist/lib/browser/chunk-FPXC3LKK.mjs.map +0 -7
- package/dist/lib/browser/chunk-FR7IEJ7N.mjs.map +0 -7
- package/dist/lib/browser/chunk-HI564NSX.mjs.map +0 -7
- package/dist/lib/browser/chunk-NTLTGYYS.mjs.map +0 -7
- package/dist/lib/browser/react-surface-GLNUJX7O.mjs.map +0 -7
- package/dist/lib/node/AssistantDialog-DS7OCVMV.cjs.map +0 -7
- package/dist/lib/node/ChatContainer-7MNRJL6Q.cjs.map +0 -7
- package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs +0 -53
- package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs.map +0 -7
- package/dist/lib/node/ai-client-RBDOGK6W.cjs.map +0 -7
- package/dist/lib/node/app-graph-builder-V5JKKIY5.cjs +0 -122
- package/dist/lib/node/app-graph-builder-V5JKKIY5.cjs.map +0 -7
- package/dist/lib/node/chunk-34WE2FD2.cjs.map +0 -7
- package/dist/lib/node/chunk-3HNLL6MY.cjs.map +0 -7
- package/dist/lib/node/chunk-3WXG6WA6.cjs.map +0 -7
- package/dist/lib/node/chunk-PYTGHFKZ.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-Z37RNNMC.cjs.map +0 -7
- package/dist/lib/node/react-surface-PYGRBZY7.cjs.map +0 -7
- package/dist/lib/node-esm/AssistantDialog-TSVUYKUL.mjs.map +0 -7
- package/dist/lib/node-esm/ChatContainer-H4X734PB.mjs.map +0 -7
- package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs +0 -24
- package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs.map +0 -7
- package/dist/lib/node-esm/ai-client-OTZVBDUH.mjs +0 -34
- package/dist/lib/node-esm/ai-client-OTZVBDUH.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-DCAP6QAV.mjs +0 -111
- package/dist/lib/node-esm/app-graph-builder-DCAP6QAV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-E44GXXNE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ICQN3TDS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JRP4BQT4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LELXJPGJ.mjs +0 -163
- package/dist/lib/node-esm/chunk-LELXJPGJ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-PEQD6IJS.mjs.map +0 -7
- package/dist/types/src/hooks/email.d.ts +0 -4
- package/dist/types/src/hooks/email.d.ts.map +0 -1
- package/src/hooks/email.ts +0 -49
- /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-NFUHCW2J.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-VVQUGG56.mjs.map → settings-U6UFQX32.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-XI2ARIEO.cjs.map} +0 -0
- /package/dist/lib/node/{settings-TJHHVI6B.cjs.map → settings-TXGRCYAL.cjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-PBZA7XJR.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-BVWR244C.mjs.map → settings-DZU5PNXM.mjs.map} +0 -0
|
@@ -2,17 +2,92 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import { Match, type Schema as S } from 'effect';
|
|
6
|
+
import React, { type ChangeEvent, useCallback } from 'react';
|
|
6
7
|
|
|
8
|
+
import { debounce } from '@dxos/async';
|
|
9
|
+
import { Input, Select, Toolbar, useTranslation } from '@dxos/react-ui';
|
|
7
10
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
8
11
|
|
|
9
12
|
import { TemplateEditor } from './TemplateEditor';
|
|
10
|
-
import {
|
|
13
|
+
import { ASSISTANT_PLUGIN } from '../meta';
|
|
14
|
+
import { TemplateKinds, type TemplateKindSchema, type TemplateType } from '../types';
|
|
11
15
|
|
|
12
|
-
// TODO(burdon): Attention.
|
|
13
16
|
export const TemplateContainer = ({ template, role }: { template: TemplateType; role: string }) => {
|
|
17
|
+
const { t } = useTranslation(ASSISTANT_PLUGIN);
|
|
18
|
+
|
|
19
|
+
const handleKindChange = useCallback(
|
|
20
|
+
(value: string) => {
|
|
21
|
+
const kind = Match.type<string>().pipe(
|
|
22
|
+
Match.withReturnType<S.Schema.Type<typeof TemplateKindSchema>>(),
|
|
23
|
+
Match.when('always', () => ({ include: 'always' })),
|
|
24
|
+
Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),
|
|
25
|
+
Match.when('automatically', () => ({ include: 'automatically', description: '' })),
|
|
26
|
+
Match.orElse(() => ({ include: 'manual' })),
|
|
27
|
+
)(value);
|
|
28
|
+
|
|
29
|
+
template.kind = kind;
|
|
30
|
+
},
|
|
31
|
+
[template],
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const handleTypenameChange = useCallback(
|
|
35
|
+
debounce((event: ChangeEvent<HTMLInputElement>) => {
|
|
36
|
+
if (template.kind.include === 'schema-matching') {
|
|
37
|
+
template.kind.typename = event.target.value;
|
|
38
|
+
}
|
|
39
|
+
}, 300),
|
|
40
|
+
[template.kind.include],
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const handleDescriptionChange = useCallback(
|
|
44
|
+
debounce((event: ChangeEvent<HTMLInputElement>) => {
|
|
45
|
+
if (template.kind.include === 'automatically') {
|
|
46
|
+
template.kind.description = event.target.value;
|
|
47
|
+
}
|
|
48
|
+
}, 300),
|
|
49
|
+
[template.kind.include],
|
|
50
|
+
);
|
|
51
|
+
|
|
14
52
|
return (
|
|
15
|
-
<StackItem.Content
|
|
53
|
+
<StackItem.Content role={role} toolbar classNames='container-max-width'>
|
|
54
|
+
{/* TODO(wittjosiah): Move this toolbar into c11y sidebar. */}
|
|
55
|
+
<Toolbar.Root>
|
|
56
|
+
<Select.Root value={template.kind.include} onValueChange={handleKindChange}>
|
|
57
|
+
<Toolbar.Button asChild>
|
|
58
|
+
<Select.TriggerButton />
|
|
59
|
+
</Toolbar.Button>
|
|
60
|
+
<Select.Portal>
|
|
61
|
+
<Select.Content>
|
|
62
|
+
<Select.Viewport>
|
|
63
|
+
{TemplateKinds.map((kind) => (
|
|
64
|
+
<Select.Option key={kind} value={kind}>
|
|
65
|
+
{kind}
|
|
66
|
+
</Select.Option>
|
|
67
|
+
))}
|
|
68
|
+
</Select.Viewport>
|
|
69
|
+
</Select.Content>
|
|
70
|
+
</Select.Portal>
|
|
71
|
+
</Select.Root>
|
|
72
|
+
{template.kind.include === 'schema-matching' && (
|
|
73
|
+
<Input.Root>
|
|
74
|
+
<Input.TextInput
|
|
75
|
+
placeholder={t('typename placeholder')}
|
|
76
|
+
defaultValue={template.kind.typename}
|
|
77
|
+
onChange={handleTypenameChange}
|
|
78
|
+
/>
|
|
79
|
+
</Input.Root>
|
|
80
|
+
)}
|
|
81
|
+
{template.kind.include === 'automatically' && (
|
|
82
|
+
<Input.Root>
|
|
83
|
+
<Input.TextInput
|
|
84
|
+
placeholder={t('description placeholder')}
|
|
85
|
+
defaultValue={template.kind.description}
|
|
86
|
+
onChange={handleDescriptionChange}
|
|
87
|
+
/>
|
|
88
|
+
</Input.Root>
|
|
89
|
+
)}
|
|
90
|
+
</Toolbar.Root>
|
|
16
91
|
<TemplateEditor template={template} />
|
|
17
92
|
</StackItem.Content>
|
|
18
93
|
);
|
|
@@ -34,11 +34,11 @@ const TEMPLATE = [
|
|
|
34
34
|
'',
|
|
35
35
|
].join('\n');
|
|
36
36
|
|
|
37
|
-
const
|
|
37
|
+
const DefaultStory = ({ text }: TemplateEditorProps & { text: string }) => {
|
|
38
38
|
const client = useClient();
|
|
39
39
|
const [template] = useState(() => {
|
|
40
40
|
const space = client.spaces.default;
|
|
41
|
-
return space.db.add(create(TemplateType, { source: text }));
|
|
41
|
+
return space.db.add(create(TemplateType, { source: text, kind: { include: 'manual' } }));
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
return (
|
|
@@ -48,10 +48,10 @@ const Render = ({ text }: TemplateEditorProps & { text: string }) => {
|
|
|
48
48
|
);
|
|
49
49
|
};
|
|
50
50
|
|
|
51
|
-
const meta: Meta<typeof
|
|
51
|
+
const meta: Meta<typeof DefaultStory> = {
|
|
52
52
|
title: 'plugins/plugin-automation/TemplateEditor',
|
|
53
53
|
component: TemplateEditor,
|
|
54
|
-
render:
|
|
54
|
+
render: DefaultStory,
|
|
55
55
|
decorators: [
|
|
56
56
|
withClientProvider({
|
|
57
57
|
createIdentity: true,
|
|
@@ -68,7 +68,7 @@ const meta: Meta<typeof Render> = {
|
|
|
68
68
|
|
|
69
69
|
export default meta;
|
|
70
70
|
|
|
71
|
-
type Story = Meta<typeof
|
|
71
|
+
type Story = Meta<typeof DefaultStory>;
|
|
72
72
|
|
|
73
73
|
export const Default: Story = {
|
|
74
74
|
args: {
|
|
@@ -26,11 +26,11 @@ const TEMPLATE = [
|
|
|
26
26
|
'{{input}}',
|
|
27
27
|
].join('\n');
|
|
28
28
|
|
|
29
|
-
const
|
|
29
|
+
const DefaultStory = () => {
|
|
30
30
|
const client = useClient();
|
|
31
31
|
const [template] = useState(() => {
|
|
32
32
|
const space = client.spaces.default;
|
|
33
|
-
return space.db.add(create(TemplateType, { source: TEMPLATE }));
|
|
33
|
+
return space.db.add(create(TemplateType, { source: TEMPLATE, kind: { include: 'manual' } }));
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
return (
|
|
@@ -43,7 +43,7 @@ const Render = () => {
|
|
|
43
43
|
const meta: Meta<typeof TemplateForm> = {
|
|
44
44
|
title: 'plugins/plugin-automation/TemplateForm',
|
|
45
45
|
component: TemplateForm,
|
|
46
|
-
render:
|
|
46
|
+
render: DefaultStory,
|
|
47
47
|
decorators: [
|
|
48
48
|
withClientProvider({
|
|
49
49
|
createIdentity: true,
|
|
@@ -20,7 +20,7 @@ import translations from '../../translations';
|
|
|
20
20
|
|
|
21
21
|
faker.seed(1);
|
|
22
22
|
|
|
23
|
-
const
|
|
23
|
+
const DefaultStory = ({ messages: _messages, ...props }: ThreadProps) => {
|
|
24
24
|
const [processing, setProcessing] = useState(false);
|
|
25
25
|
const [messages, setMessages] = useState<Message[]>(_messages ?? []);
|
|
26
26
|
useEffect(() => {
|
|
@@ -70,7 +70,7 @@ const Render = ({ messages: _messages, ...props }: ThreadProps) => {
|
|
|
70
70
|
|
|
71
71
|
const meta: Meta<ThreadProps> = {
|
|
72
72
|
title: 'plugins/plugin-automation/Thread',
|
|
73
|
-
render:
|
|
73
|
+
render: DefaultStory,
|
|
74
74
|
component: Thread,
|
|
75
75
|
decorators: [
|
|
76
76
|
withSignals,
|
|
@@ -207,6 +207,6 @@ export const Incremental: Story = {
|
|
|
207
207
|
return () => clearInterval(interval);
|
|
208
208
|
}, []);
|
|
209
209
|
|
|
210
|
-
return <
|
|
210
|
+
return <DefaultStory messages={messages} collapse />;
|
|
211
211
|
},
|
|
212
212
|
};
|
|
@@ -15,6 +15,13 @@ import { keyToFallback } from '@dxos/util';
|
|
|
15
15
|
import { ThreadMessage, type ThreadMessageProps } from './ThreadMessage';
|
|
16
16
|
import { messageReducer } from './reducer';
|
|
17
17
|
import { PromptBar, type PromptBarProps } from '../Prompt';
|
|
18
|
+
import type { ReferenceData, ReferencesProvider } from '../Prompt/references';
|
|
19
|
+
|
|
20
|
+
export interface ContextProvider {
|
|
21
|
+
query({ query }: { query: string }): Promise<ReferenceData[]>;
|
|
22
|
+
|
|
23
|
+
resolveMetadata({ uri }: { uri: string }): Promise<ReferenceData | null>;
|
|
24
|
+
}
|
|
18
25
|
|
|
19
26
|
export type ThreadProps = ThemedClassName<{
|
|
20
27
|
space?: Space;
|
|
@@ -22,6 +29,7 @@ export type ThreadProps = ThemedClassName<{
|
|
|
22
29
|
collapse?: boolean;
|
|
23
30
|
transcription?: boolean;
|
|
24
31
|
onOpenChange?: (open: boolean) => void;
|
|
32
|
+
contextProvider?: ContextProvider;
|
|
25
33
|
}> &
|
|
26
34
|
Pick<PromptBarProps, 'processing' | 'error' | 'onSubmit' | 'onSuggest' | 'onCancel'> &
|
|
27
35
|
Pick<ThreadMessageProps, 'debug' | 'tools' | 'onPrompt' | 'onDelete'>;
|
|
@@ -40,6 +48,7 @@ export const Thread = ({
|
|
|
40
48
|
onSubmit,
|
|
41
49
|
onCancel,
|
|
42
50
|
onOpenChange,
|
|
51
|
+
contextProvider,
|
|
43
52
|
...props
|
|
44
53
|
}: ThreadProps) => {
|
|
45
54
|
const scroller = useRef<ScrollController>(null);
|
|
@@ -68,6 +77,17 @@ export const Thread = ({
|
|
|
68
77
|
}
|
|
69
78
|
}, [messages, collapse]);
|
|
70
79
|
|
|
80
|
+
const references = useMemo<ReferencesProvider | undefined>(() => {
|
|
81
|
+
if (!contextProvider) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
getReferences: async ({ query }: { query: string }) => contextProvider.query({ query }),
|
|
87
|
+
resolveReference: async ({ uri }: { uri: string }) => contextProvider.resolveMetadata({ uri }),
|
|
88
|
+
};
|
|
89
|
+
}, [contextProvider]);
|
|
90
|
+
|
|
71
91
|
return (
|
|
72
92
|
<div role='none' className={mx('flex flex-col grow overflow-hidden', classNames)}>
|
|
73
93
|
<ScrollContainer ref={scroller} fade>
|
|
@@ -90,6 +110,7 @@ export const Thread = ({
|
|
|
90
110
|
onSubmit={handleSubmit}
|
|
91
111
|
onCancel={onCancel}
|
|
92
112
|
onOpenChange={onOpenChange}
|
|
113
|
+
references={references}
|
|
93
114
|
/>
|
|
94
115
|
)}
|
|
95
116
|
</div>
|
|
@@ -21,7 +21,6 @@ import { Message, type Tool } from '@dxos/artifact';
|
|
|
21
21
|
import { genericTools, localServiceEndpoints, type IsObject } from '@dxos/artifact-testing';
|
|
22
22
|
import { AIServiceEdgeClient } from '@dxos/assistant';
|
|
23
23
|
import { createStatic, ObjectId } from '@dxos/echo-schema';
|
|
24
|
-
import { EdgeHttpClient } from '@dxos/edge-client';
|
|
25
24
|
import { invariant } from '@dxos/invariant';
|
|
26
25
|
import { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';
|
|
27
26
|
import { ChessPlugin } from '@dxos/plugin-chess';
|
|
@@ -31,9 +30,8 @@ import { InboxPlugin } from '@dxos/plugin-inbox';
|
|
|
31
30
|
import { MapPlugin } from '@dxos/plugin-map';
|
|
32
31
|
import { SpacePlugin } from '@dxos/plugin-space';
|
|
33
32
|
import { TablePlugin } from '@dxos/plugin-table';
|
|
34
|
-
import { useSpace } from '@dxos/react-client/echo';
|
|
33
|
+
import { useQueue, useSpace } from '@dxos/react-client/echo';
|
|
35
34
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
36
|
-
import { useQueue } from '@dxos/react-edge-client';
|
|
37
35
|
import { IconButton, Input, Toolbar } from '@dxos/react-ui';
|
|
38
36
|
import { mx } from '@dxos/react-ui-theme';
|
|
39
37
|
import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
|
|
@@ -51,16 +49,12 @@ type RenderProps = {
|
|
|
51
49
|
} & Pick<ThreadProps, 'debug'>;
|
|
52
50
|
|
|
53
51
|
// TODO(burdon): Use ChatContainer.
|
|
54
|
-
const
|
|
52
|
+
const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
55
53
|
const space = useSpace();
|
|
56
54
|
const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
|
|
57
|
-
const tools = useMemo<Tool[]>(
|
|
58
|
-
() => [...genericTools, ...artifactDefinitions.flatMap((definition) => definition.tools)],
|
|
59
|
-
[genericTools, artifactDefinitions],
|
|
60
|
-
);
|
|
55
|
+
const tools = useMemo<Tool[]>(() => [...genericTools], []);
|
|
61
56
|
|
|
62
57
|
const [aiClient] = useState(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }));
|
|
63
|
-
const [edgeClient] = useState(() => new EdgeHttpClient(endpoints.edge));
|
|
64
58
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
65
59
|
|
|
66
60
|
// TODO(burdon): Replace with useChatProcessor.
|
|
@@ -73,6 +67,7 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
|
73
67
|
return new ChatProcessor(
|
|
74
68
|
aiClient,
|
|
75
69
|
tools,
|
|
70
|
+
artifactDefinitions,
|
|
76
71
|
{
|
|
77
72
|
space,
|
|
78
73
|
dispatch,
|
|
@@ -82,8 +77,8 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
|
82
77
|
}, [aiClient, tools, space, dispatch, artifactDefinitions]);
|
|
83
78
|
|
|
84
79
|
// Queue.
|
|
85
|
-
const [queueDxn, setQueueDxn] = useState(() => randomQueueDxn());
|
|
86
|
-
const queue = useQueue<Message>(
|
|
80
|
+
const [queueDxn, setQueueDxn] = useState<string>(() => randomQueueDxn());
|
|
81
|
+
const queue = useQueue<Message>(DXN.tryParse(queueDxn));
|
|
87
82
|
|
|
88
83
|
useEffect(() => {
|
|
89
84
|
if (queue?.items.length === 0 && !queue.isLoading && prompts.length > 0) {
|
|
@@ -209,9 +204,9 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
|
209
204
|
const randomQueueDxn = () =>
|
|
210
205
|
new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]).toString();
|
|
211
206
|
|
|
212
|
-
const meta: Meta<typeof
|
|
207
|
+
const meta: Meta<typeof DefaultStory> = {
|
|
213
208
|
title: 'plugins/plugin-automation/ThreadContainer',
|
|
214
|
-
render:
|
|
209
|
+
render: DefaultStory,
|
|
215
210
|
decorators: [
|
|
216
211
|
withSignals,
|
|
217
212
|
withClientProvider({
|
|
@@ -247,7 +242,7 @@ const meta: Meta<typeof Render> = {
|
|
|
247
242
|
|
|
248
243
|
export default meta;
|
|
249
244
|
|
|
250
|
-
type Story = StoryObj<typeof
|
|
245
|
+
type Story = StoryObj<typeof DefaultStory>;
|
|
251
246
|
|
|
252
247
|
export const Default: Story = {
|
|
253
248
|
args: {
|
|
@@ -2,20 +2,23 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { type FC
|
|
5
|
+
import React, { useCallback, type FC } from 'react';
|
|
6
6
|
|
|
7
|
+
import { type AssociatedArtifact } from '@dxos/artifact';
|
|
7
8
|
import { invariant } from '@dxos/invariant';
|
|
8
9
|
import { log } from '@dxos/log';
|
|
9
10
|
import { getSpace } from '@dxos/react-client/echo';
|
|
10
11
|
import { type ThemedClassName } from '@dxos/react-ui';
|
|
11
12
|
|
|
12
13
|
import { Thread, type ThreadProps } from './Thread';
|
|
13
|
-
import { useChatProcessor, useMessageQueue } from '../../hooks';
|
|
14
|
+
import { useChatProcessor, useContextProvider, useMessageQueue } from '../../hooks';
|
|
14
15
|
import { type AIChatType, type AssistantSettingsProps } from '../../types';
|
|
15
16
|
|
|
16
17
|
export type ThreadContainerProps = {
|
|
17
18
|
chat?: AIChatType;
|
|
18
19
|
settings?: AssistantSettingsProps;
|
|
20
|
+
part?: 'deck' | 'dialog';
|
|
21
|
+
associatedArtifact?: AssociatedArtifact;
|
|
19
22
|
} & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;
|
|
20
23
|
|
|
21
24
|
// TODO(burdon): Since this only wraps Thread, just separate out hook?
|
|
@@ -23,12 +26,14 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
|
|
|
23
26
|
classNames,
|
|
24
27
|
chat,
|
|
25
28
|
settings,
|
|
29
|
+
part,
|
|
30
|
+
associatedArtifact,
|
|
26
31
|
onOpenChange,
|
|
27
32
|
...props
|
|
28
33
|
}) => {
|
|
29
|
-
// Push up capabilities hooks out of components.
|
|
30
34
|
const space = getSpace(chat);
|
|
31
|
-
const
|
|
35
|
+
const contextProvider = useContextProvider(space);
|
|
36
|
+
const processor = useChatProcessor({ chat, space, settings, part, associatedArtifact });
|
|
32
37
|
const messageQueue = useMessageQueue(chat);
|
|
33
38
|
const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];
|
|
34
39
|
|
|
@@ -73,6 +78,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
|
|
|
73
78
|
onCancel={handleCancel}
|
|
74
79
|
onPrompt={handleSubmit}
|
|
75
80
|
onOpenChange={onOpenChange}
|
|
81
|
+
contextProvider={contextProvider}
|
|
76
82
|
{...props}
|
|
77
83
|
/>
|
|
78
84
|
);
|
|
@@ -7,7 +7,7 @@ import React, { type PropsWithChildren, type FC } from 'react';
|
|
|
7
7
|
import { type MessageContentBlock, type Message, type ToolType } from '@dxos/artifact';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
9
|
import { type Space } from '@dxos/react-client/echo';
|
|
10
|
-
import { Button,
|
|
10
|
+
import { Button, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
|
|
11
11
|
import {
|
|
12
12
|
MarkdownViewer,
|
|
13
13
|
ToggleContainer as NativeToggleContainer,
|
|
@@ -21,7 +21,7 @@ import { ToolBlock, isToolMessage } from './ToolInvocations';
|
|
|
21
21
|
import { ToolboxContainer } from '../Toolbox';
|
|
22
22
|
|
|
23
23
|
const panelClassNames = 'flex flex-col w-full px-2 bg-groupSurface rounded-md';
|
|
24
|
-
const userClassNames = 'bg-[--user-fill]';
|
|
24
|
+
const userClassNames = 'bg-[--user-fill] text-inverse';
|
|
25
25
|
|
|
26
26
|
const ToggleContainer = (props: ToggleContainerProps) => {
|
|
27
27
|
return <NativeToggleContainer {...props} classNames={mx(panelClassNames, props.classNames)} />;
|
|
@@ -54,7 +54,7 @@ export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, messa
|
|
|
54
54
|
// TODO(burdon): Restructure types to make check unnecessary.
|
|
55
55
|
if (isToolMessage(message)) {
|
|
56
56
|
return (
|
|
57
|
-
<MessageContainer classNames={classNames}>
|
|
57
|
+
<MessageContainer classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}>
|
|
58
58
|
<ToolBlock space={space} classNames={panelClassNames} message={message} tools={tools} />
|
|
59
59
|
</MessageContainer>
|
|
60
60
|
);
|
|
@@ -69,7 +69,11 @@ export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, messa
|
|
|
69
69
|
const Component = components[block.type] ?? components.default;
|
|
70
70
|
|
|
71
71
|
return (
|
|
72
|
-
<MessageContainer
|
|
72
|
+
<MessageContainer
|
|
73
|
+
key={idx}
|
|
74
|
+
classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}
|
|
75
|
+
user={block.type === 'text' && role === 'user'}
|
|
76
|
+
>
|
|
73
77
|
<Component space={space} block={block} onPrompt={onPrompt} />
|
|
74
78
|
</MessageContainer>
|
|
75
79
|
);
|
|
@@ -87,7 +91,7 @@ const components: Record<string, BlockComponent> = {
|
|
|
87
91
|
// const [open, setOpen] = useState(block.disposition === 'cot' && block.pending);
|
|
88
92
|
const title = block.disposition ? titles[block.disposition] : undefined;
|
|
89
93
|
if (!title) {
|
|
90
|
-
return <MarkdownViewer content={block.text} />;
|
|
94
|
+
return <MarkdownViewer classNames='[&>p]:animate-[fadeIn_0.5s]' content={block.text} />;
|
|
91
95
|
}
|
|
92
96
|
|
|
93
97
|
// TOOD(burdon): Store last time user opened/closed COT.
|
|
@@ -140,13 +144,17 @@ const components: Record<string, BlockComponent> = {
|
|
|
140
144
|
case 'select': {
|
|
141
145
|
const { options = [] }: { options: string[] } = safeParseJson(block.json ?? '{}') ?? ({} as any);
|
|
142
146
|
return (
|
|
143
|
-
<
|
|
144
|
-
{options.map((option) => (
|
|
145
|
-
<Button
|
|
147
|
+
<div className='flex flex-wrap gap-1'>
|
|
148
|
+
{options.map((option, idx) => (
|
|
149
|
+
<Button
|
|
150
|
+
classNames={'animate-[fadeIn_0.5s] rounded-2xl text-sm'}
|
|
151
|
+
key={option}
|
|
152
|
+
onClick={() => onPrompt?.(option)}
|
|
153
|
+
>
|
|
146
154
|
{option}
|
|
147
155
|
</Button>
|
|
148
156
|
))}
|
|
149
|
-
</
|
|
157
|
+
</div>
|
|
150
158
|
);
|
|
151
159
|
}
|
|
152
160
|
|
|
@@ -20,7 +20,7 @@ import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
|
|
|
20
20
|
import { Toolbox, type ToolboxProps } from './Toolbox';
|
|
21
21
|
import translations from '../../translations';
|
|
22
22
|
|
|
23
|
-
const
|
|
23
|
+
const DefaultStory = (props: ToolboxProps) => {
|
|
24
24
|
const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
|
|
25
25
|
return (
|
|
26
26
|
<Toolbox
|
|
@@ -34,7 +34,7 @@ const Render = (props: ToolboxProps) => {
|
|
|
34
34
|
const meta: Meta<typeof Toolbox> = {
|
|
35
35
|
title: 'plugins/plugin-automation/Toolbox',
|
|
36
36
|
component: Toolbox,
|
|
37
|
-
render:
|
|
37
|
+
render: DefaultStory,
|
|
38
38
|
decorators: [
|
|
39
39
|
withSignals,
|
|
40
40
|
withPluginManager({
|
package/src/components/index.ts
CHANGED
|
@@ -10,6 +10,9 @@ export * from './TemplateEditor';
|
|
|
10
10
|
export * from './Thread';
|
|
11
11
|
export * from './Toolbox';
|
|
12
12
|
|
|
13
|
+
// TODO(burdon): Lazy loading causes issues with Tabster.
|
|
14
|
+
// Repro: open assistant dialog then close.
|
|
15
|
+
// https://github.com/microsoft/fluentui/issues/34020
|
|
13
16
|
export const AssistantDialog = lazy(() => import('./AssistantDialog'));
|
|
14
17
|
export const ChatContainer = lazy(() => import('./ChatContainer'));
|
|
15
18
|
export const TemplateContainer = lazy(() => import('./TemplateContainer'));
|
package/src/hooks/index.ts
CHANGED