@dxos/plugin-assistant 0.8.0 → 0.8.1-main.81238a8
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-TX6YYBUG.mjs → AssistantDialog-L5RHNMU4.mjs} +6 -5
- package/dist/lib/browser/{AssistantDialog-TX6YYBUG.mjs.map → AssistantDialog-L5RHNMU4.mjs.map} +3 -3
- package/dist/lib/browser/{ChatContainer-AT3OAUT3.mjs → ChatContainer-EEEVE62F.mjs} +5 -5
- package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs +78 -0
- package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs.map +7 -0
- package/dist/lib/browser/ai-client-BAPVMSNX.mjs +35 -0
- package/dist/lib/browser/ai-client-BAPVMSNX.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-builder-AXAIFOGV.mjs → app-graph-builder-DTCUWBKB.mjs} +57 -13
- package/dist/lib/browser/app-graph-builder-DTCUWBKB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-G7B54APW.mjs → chunk-5RMJYOT7.mjs} +34 -12
- package/dist/lib/browser/chunk-5RMJYOT7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EUMPBC4T.mjs → chunk-6FTPLBSC.mjs} +2 -2
- package/dist/lib/browser/{chunk-NV7SVHMV.mjs → chunk-AF7VQAKS.mjs} +1 -1
- package/dist/lib/browser/{chunk-NV7SVHMV.mjs.map → chunk-AF7VQAKS.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-VZ4W6SHE.mjs → chunk-SVUCJXGN.mjs} +2 -2
- package/dist/lib/browser/chunk-SVUCJXGN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-FRIKXDDQ.mjs → chunk-X6ALDUA5.mjs} +26 -4
- package/dist/lib/browser/chunk-X6ALDUA5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-NFVIZS3B.mjs → chunk-XFUCWOMV.mjs} +287 -70
- package/dist/lib/browser/chunk-XFUCWOMV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +21 -11
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs → intent-resolver-U57FXP3I.mjs} +6 -3
- package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs.map → intent-resolver-U57FXP3I.mjs.map} +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-JLXNWOI6.mjs → react-surface-KFLHNDNR.mjs} +10 -9
- package/dist/lib/browser/react-surface-KFLHNDNR.mjs.map +7 -0
- package/dist/lib/browser/{settings-JTT62IHD.mjs → settings-VAW6UWFL.mjs} +3 -3
- package/dist/lib/browser/types/index.mjs +6 -2
- package/dist/lib/node/{AssistantDialog-U4GBPZD6.cjs → AssistantDialog-VIB7GPQN.cjs} +12 -11
- package/dist/lib/node/{AssistantDialog-U4GBPZD6.cjs.map → AssistantDialog-VIB7GPQN.cjs.map} +3 -3
- package/dist/lib/node/{ChatContainer-CVHXNHGA.cjs → ChatContainer-BPI3GEZS.cjs} +10 -10
- package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs +104 -0
- package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs.map +7 -0
- package/dist/lib/node/{ai-client-YANJEPO3.cjs → ai-client-5ESLYXAV.cjs} +19 -8
- package/dist/lib/node/ai-client-5ESLYXAV.cjs.map +7 -0
- package/dist/lib/node/{app-graph-builder-D7SHQTZS.cjs → app-graph-builder-3P6WSON2.cjs} +63 -20
- package/dist/lib/node/app-graph-builder-3P6WSON2.cjs.map +7 -0
- package/dist/lib/node/{chunk-37GI4NYH.cjs → chunk-KLSNCP34.cjs} +33 -9
- package/dist/lib/node/chunk-KLSNCP34.cjs.map +7 -0
- package/dist/lib/node/{chunk-NV4TQQSU.cjs → chunk-N3SW6DJ6.cjs} +6 -6
- package/dist/lib/node/{chunk-XUTDR7HI.cjs → chunk-OJJ4F6KP.cjs} +291 -78
- package/dist/lib/node/chunk-OJJ4F6KP.cjs.map +7 -0
- package/dist/lib/node/{chunk-GNPXCHFT.cjs → chunk-U6J2GO7I.cjs} +4 -4
- package/dist/lib/node/{chunk-GNPXCHFT.cjs.map → chunk-U6J2GO7I.cjs.map} +2 -2
- package/dist/lib/node/{chunk-ZGH6F5YA.cjs → chunk-VRXFIS4X.cjs} +6 -6
- package/dist/lib/node/chunk-VRXFIS4X.cjs.map +7 -0
- package/dist/lib/node/{chunk-IXJCGW7U.cjs → chunk-WFVOWPKV.cjs} +40 -18
- package/dist/lib/node/chunk-WFVOWPKV.cjs.map +7 -0
- package/dist/lib/node/index.cjs +73 -63
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-YMMAFVOB.cjs → intent-resolver-YIFAMM3B.cjs} +13 -10
- package/dist/lib/node/{intent-resolver-YMMAFVOB.cjs.map → intent-resolver-YIFAMM3B.cjs.map} +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-BSUZQ3HZ.cjs → react-surface-REI6G6B3.cjs} +25 -24
- package/dist/lib/node/react-surface-REI6G6B3.cjs.map +7 -0
- package/dist/lib/node/{settings-4YEO7KXF.cjs → settings-2FEYGLYU.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-5AT5JAZL.mjs → AssistantDialog-R3EPF2KL.mjs} +6 -5
- package/dist/lib/node-esm/{AssistantDialog-5AT5JAZL.mjs.map → AssistantDialog-R3EPF2KL.mjs.map} +3 -3
- package/dist/lib/node-esm/{ChatContainer-VR766C4M.mjs → ChatContainer-UJ7MV7GU.mjs} +5 -5
- package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs +79 -0
- package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs.map +7 -0
- package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs +36 -0
- package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-H2GC2AZA.mjs → app-graph-builder-PMAQLTTN.mjs} +57 -13
- package/dist/lib/node-esm/app-graph-builder-PMAQLTTN.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-77ARTFBA.mjs → chunk-2CIYX3SD.mjs} +2 -2
- package/dist/lib/node-esm/chunk-2CIYX3SD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-AMQMVQJO.mjs → chunk-6GBMQIW7.mjs} +34 -12
- package/dist/lib/node-esm/chunk-6GBMQIW7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7JENJTLB.mjs → chunk-AMTHOYNB.mjs} +287 -70
- package/dist/lib/node-esm/chunk-AMTHOYNB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs → chunk-J63VQFQO.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs → chunk-N6BVC2C2.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs.map → chunk-N6BVC2C2.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-CJ4Y3QW5.mjs → chunk-NMMRHHAR.mjs} +26 -4
- package/dist/lib/node-esm/chunk-NMMRHHAR.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +21 -11
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs → intent-resolver-SQ4HLL5L.mjs} +6 -3
- package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs.map → intent-resolver-SQ4HLL5L.mjs.map} +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-IGVYAOGL.mjs → react-surface-LE57AGPI.mjs} +10 -9
- package/dist/lib/node-esm/react-surface-LE57AGPI.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-S7P5RWQI.mjs → settings-VHR5KT4J.mjs} +3 -3
- 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 -2
- 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 +3 -2
- 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/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +2 -2
- package/dist/types/src/components/AmbientDialog/AmbientDialog.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 +2 -1
- package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +2 -1
- 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 +3 -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/ServiceRegistry/ServiceRegistry.d.ts +2 -1
- package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -1
- package/dist/types/src/components/TemplateContainer.d.ts +2 -1
- package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +2 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -2
- package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
- package/dist/types/src/components/Thread/Thread.d.ts +12 -1
- package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
- package/dist/types/src/components/Thread/ThreadContainer.d.ts +1 -0
- package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +2 -1
- 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/Toolbox/Toolbox.d.ts +4 -3
- package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -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/invocation-handler.d.ts +1 -1
- package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
- package/dist/types/src/hooks/processor.d.ts +8 -5
- package/dist/types/src/hooks/processor.d.ts.map +1 -1
- package/dist/types/src/hooks/useChatProcessor.d.ts +9 -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 +4 -4
- 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/tools/function.d.ts +1 -1
- package/dist/types/src/tools/function.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +21 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/service.d.ts +1 -1
- package/dist/types/src/types/service.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 +56 -56
- package/src/AssistantPlugin.tsx +11 -2
- package/src/capabilities/ai-client.ts +23 -4
- package/src/capabilities/app-graph-builder.ts +48 -4
- package/src/capabilities/capabilities.ts +4 -2
- package/src/capabilities/intent-resolver.ts +1 -1
- package/src/capabilities/react-surface.tsx +3 -2
- package/src/components/AssistantDialog.tsx +7 -1
- package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
- package/src/components/Prompt/Prompt.stories.tsx +34 -0
- package/src/components/Prompt/Prompt.tsx +9 -2
- package/src/components/Prompt/PromptBar.tsx +18 -7
- package/src/components/Prompt/references.ts +180 -0
- package/src/components/TemplateContainer.tsx +79 -4
- package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.stories.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
- package/src/components/Thread/Thread.tsx +21 -0
- package/src/components/Thread/ThreadContainer.stories.tsx +5 -8
- package/src/components/Thread/ThreadContainer.tsx +7 -4
- package/src/components/Thread/ThreadMessage.tsx +17 -9
- package/src/components/Toolbox/Toolbox.tsx +1 -1
- package/src/components/index.ts +3 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/invocation-handler.ts +3 -5
- package/src/hooks/processor.ts +18 -9
- package/src/hooks/useChatProcessor.tsx +24 -15
- package/src/hooks/useContextProvider.ts +55 -0
- package/src/hooks/useLocalTriggerManager.ts +1 -1
- package/src/hooks/useMessageQueue.ts +2 -4
- package/src/meta.ts +2 -2
- package/src/testing/test-functions.ts +2 -2
- package/src/tools/function.ts +2 -2
- package/src/tools/openapi.test.ts +4 -4
- package/src/translations.ts +8 -3
- package/src/types/service.ts +1 -1
- package/src/types/template.ts +22 -0
- package/src/types/types.ts +3 -1
- 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-RTCGRKZE.mjs +0 -22
- package/dist/lib/browser/ai-client-RTCGRKZE.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-AXAIFOGV.mjs.map +0 -7
- package/dist/lib/browser/chunk-FRIKXDDQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-G7B54APW.mjs.map +0 -7
- package/dist/lib/browser/chunk-NFVIZS3B.mjs.map +0 -7
- package/dist/lib/browser/chunk-VZ4W6SHE.mjs.map +0 -7
- package/dist/lib/browser/react-surface-JLXNWOI6.mjs.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-YANJEPO3.cjs.map +0 -7
- package/dist/lib/node/app-graph-builder-D7SHQTZS.cjs.map +0 -7
- package/dist/lib/node/chunk-37GI4NYH.cjs.map +0 -7
- package/dist/lib/node/chunk-IXJCGW7U.cjs.map +0 -7
- package/dist/lib/node/chunk-XUTDR7HI.cjs.map +0 -7
- package/dist/lib/node/chunk-ZGH6F5YA.cjs.map +0 -7
- package/dist/lib/node/react-surface-BSUZQ3HZ.cjs.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-66IBZVCX.mjs +0 -23
- package/dist/lib/node-esm/ai-client-66IBZVCX.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-H2GC2AZA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-77ARTFBA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7JENJTLB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AMQMVQJO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CJ4Y3QW5.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-IGVYAOGL.mjs.map +0 -7
- /package/dist/lib/browser/{ChatContainer-AT3OAUT3.mjs.map → ChatContainer-EEEVE62F.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-6FTPLBSC.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-JTT62IHD.mjs.map → settings-VAW6UWFL.mjs.map} +0 -0
- /package/dist/lib/node/{ChatContainer-CVHXNHGA.cjs.map → ChatContainer-BPI3GEZS.cjs.map} +0 -0
- /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-N3SW6DJ6.cjs.map} +0 -0
- /package/dist/lib/node/{settings-4YEO7KXF.cjs.map → settings-2FEYGLYU.cjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-VR766C4M.mjs.map → ChatContainer-UJ7MV7GU.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-J63VQFQO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-S7P5RWQI.mjs.map → settings-VHR5KT4J.mjs.map} +0 -0
|
@@ -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>
|
|
@@ -19,9 +19,8 @@ import {
|
|
|
19
19
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
20
20
|
import { Message, type Tool } from '@dxos/artifact';
|
|
21
21
|
import { genericTools, localServiceEndpoints, type IsObject } from '@dxos/artifact-testing';
|
|
22
|
-
import {
|
|
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';
|
|
@@ -59,8 +57,7 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
|
59
57
|
[genericTools, artifactDefinitions],
|
|
60
58
|
);
|
|
61
59
|
|
|
62
|
-
const [aiClient] = useState(() => new
|
|
63
|
-
const [edgeClient] = useState(() => new EdgeHttpClient(endpoints.edge));
|
|
60
|
+
const [aiClient] = useState(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }));
|
|
64
61
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
65
62
|
|
|
66
63
|
// TODO(burdon): Replace with useChatProcessor.
|
|
@@ -82,8 +79,8 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
|
|
|
82
79
|
}, [aiClient, tools, space, dispatch, artifactDefinitions]);
|
|
83
80
|
|
|
84
81
|
// Queue.
|
|
85
|
-
const [queueDxn, setQueueDxn] = useState(() => randomQueueDxn());
|
|
86
|
-
const queue = useQueue<Message>(
|
|
82
|
+
const [queueDxn, setQueueDxn] = useState<string>(() => randomQueueDxn());
|
|
83
|
+
const queue = useQueue<Message>(DXN.tryParse(queueDxn));
|
|
87
84
|
|
|
88
85
|
useEffect(() => {
|
|
89
86
|
if (queue?.items.length === 0 && !queue.isLoading && prompts.length > 0) {
|
|
@@ -2,7 +2,7 @@
|
|
|
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
7
|
import { invariant } from '@dxos/invariant';
|
|
8
8
|
import { log } from '@dxos/log';
|
|
@@ -10,12 +10,13 @@ import { getSpace } from '@dxos/react-client/echo';
|
|
|
10
10
|
import { type ThemedClassName } from '@dxos/react-ui';
|
|
11
11
|
|
|
12
12
|
import { Thread, type ThreadProps } from './Thread';
|
|
13
|
-
import { useChatProcessor, useMessageQueue } from '../../hooks';
|
|
13
|
+
import { useChatProcessor, useContextProvider, useMessageQueue } from '../../hooks';
|
|
14
14
|
import { type AIChatType, type AssistantSettingsProps } from '../../types';
|
|
15
15
|
|
|
16
16
|
export type ThreadContainerProps = {
|
|
17
17
|
chat?: AIChatType;
|
|
18
18
|
settings?: AssistantSettingsProps;
|
|
19
|
+
part?: 'deck' | 'dialog';
|
|
19
20
|
} & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;
|
|
20
21
|
|
|
21
22
|
// TODO(burdon): Since this only wraps Thread, just separate out hook?
|
|
@@ -23,12 +24,13 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
|
|
|
23
24
|
classNames,
|
|
24
25
|
chat,
|
|
25
26
|
settings,
|
|
27
|
+
part,
|
|
26
28
|
onOpenChange,
|
|
27
29
|
...props
|
|
28
30
|
}) => {
|
|
29
|
-
// Push up capabilities hooks out of components.
|
|
30
31
|
const space = getSpace(chat);
|
|
31
|
-
const
|
|
32
|
+
const contextProvider = useContextProvider(space);
|
|
33
|
+
const processor = useChatProcessor({ chat, space, settings, part });
|
|
32
34
|
const messageQueue = useMessageQueue(chat);
|
|
33
35
|
const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];
|
|
34
36
|
|
|
@@ -73,6 +75,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
|
|
|
73
75
|
onCancel={handleCancel}
|
|
74
76
|
onPrompt={handleSubmit}
|
|
75
77
|
onOpenChange={onOpenChange}
|
|
78
|
+
contextProvider={contextProvider}
|
|
76
79
|
{...props}
|
|
77
80
|
/>
|
|
78
81
|
);
|
|
@@ -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
|
|
|
@@ -6,7 +6,7 @@ import React, { useState, useEffect, Fragment, type FC } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { Capabilities, useCapabilities } from '@dxos/app-framework';
|
|
8
8
|
import { parseToolName, type ArtifactDefinition, type Tool } from '@dxos/artifact';
|
|
9
|
-
import { FunctionType } from '@dxos/functions';
|
|
9
|
+
import { FunctionType } from '@dxos/functions/types';
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
|
|
12
12
|
import { type ThemedClassName } from '@dxos/react-ui';
|
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
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { sleep } from '@dxos/async';
|
|
6
6
|
import { getObjectCore, ResultFormat } from '@dxos/echo-db';
|
|
7
7
|
import { type AnyObjectData } from '@dxos/echo-schema';
|
|
8
|
-
import { FunctionType } from '@dxos/functions';
|
|
9
|
-
import { type FunctionTrigger } from '@dxos/functions';
|
|
8
|
+
import { FunctionType, getUserFunctionUrlInMetadata } from '@dxos/functions/types';
|
|
9
|
+
import { type FunctionTrigger } from '@dxos/functions/types';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';
|
|
12
12
|
import { log } from '@dxos/log';
|
|
@@ -53,7 +53,7 @@ export const invokeFunction = async (client: Client, space: Space, trigger: Func
|
|
|
53
53
|
.query({ __typename: FunctionType.typename }, { format: ResultFormat.Plain })
|
|
54
54
|
.run();
|
|
55
55
|
const func = functions.find((fn) => referenceEquals(fn.source, trigger.function!)) as AnyObjectData | undefined;
|
|
56
|
-
const funcSlug = func
|
|
56
|
+
const funcSlug = func && getUserFunctionUrlInMetadata(func.__meta);
|
|
57
57
|
if (!funcSlug) {
|
|
58
58
|
log.warn('function not deployed', { scriptId: script.id, name: script.name });
|
|
59
59
|
return 404;
|
|
@@ -72,8 +72,6 @@ export const invokeFunction = async (client: Client, space: Space, trigger: Func
|
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
|
|
75
|
-
const USERFUNCTIONS_META_KEY = 'dxos.org/service/function';
|
|
76
|
-
|
|
77
75
|
const getFunctionUrl = (config: Config, slug: string, spaceId?: string) => {
|
|
78
76
|
const baseUrl = new URL('functions/', config.values.runtime?.services?.edge?.url);
|
|
79
77
|
|
package/src/hooks/processor.ts
CHANGED
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
type GenerateRequest,
|
|
13
13
|
type GenerationStream,
|
|
14
14
|
MixedStreamParser,
|
|
15
|
-
|
|
16
|
-
type
|
|
15
|
+
DEFAULT_EDGE_MODEL,
|
|
16
|
+
type AIServiceClient,
|
|
17
17
|
} from '@dxos/assistant';
|
|
18
18
|
import { createStatic } from '@dxos/echo-schema';
|
|
19
19
|
import { invariant } from '@dxos/invariant';
|
|
@@ -36,7 +36,7 @@ type RequestOptions = {
|
|
|
36
36
|
export type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;
|
|
37
37
|
|
|
38
38
|
const defaultOptions: ChatProcessorOptions = {
|
|
39
|
-
model:
|
|
39
|
+
model: DEFAULT_EDGE_MODEL,
|
|
40
40
|
systemPrompt: 'you are a helpful assistant',
|
|
41
41
|
};
|
|
42
42
|
|
|
@@ -50,15 +50,15 @@ export class ChatProcessor {
|
|
|
50
50
|
/** SSE stream parser. */
|
|
51
51
|
private readonly _parser = new MixedStreamParser();
|
|
52
52
|
|
|
53
|
-
/** Current streaming response. */
|
|
54
|
-
private _stream: GenerationStream | undefined;
|
|
55
|
-
|
|
56
53
|
/** Pending messages (incl. the current user request). */
|
|
57
54
|
private readonly _pending: Signal<Message[]> = signal([]);
|
|
58
55
|
|
|
59
56
|
/** Current streaming block (from the AI service). */
|
|
60
57
|
private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);
|
|
61
58
|
|
|
59
|
+
/** Current streaming response. */
|
|
60
|
+
private _stream: GenerationStream | undefined;
|
|
61
|
+
|
|
62
62
|
/** Prior history from queue. */
|
|
63
63
|
private _history: Message[] = [];
|
|
64
64
|
|
|
@@ -92,7 +92,7 @@ export class ChatProcessor {
|
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
constructor(
|
|
95
|
-
private readonly
|
|
95
|
+
private readonly _ai: AIServiceClient,
|
|
96
96
|
private _tools?: Tool[],
|
|
97
97
|
private readonly _extensions?: ToolContextExtensions,
|
|
98
98
|
private readonly _options: ChatProcessorOptions = defaultOptions,
|
|
@@ -180,7 +180,7 @@ export class ChatProcessor {
|
|
|
180
180
|
});
|
|
181
181
|
|
|
182
182
|
// Open request stream.
|
|
183
|
-
this._stream = await this.
|
|
183
|
+
this._stream = await this._ai.exec({
|
|
184
184
|
...this._options,
|
|
185
185
|
// TODO(burdon): Rename messages or separate history/message.
|
|
186
186
|
history: [...this._history, ...this._pending.value],
|
|
@@ -220,9 +220,18 @@ export class ChatProcessor {
|
|
|
220
220
|
this.error.value = undefined;
|
|
221
221
|
} catch (err) {
|
|
222
222
|
log.catch(err);
|
|
223
|
-
|
|
223
|
+
if (err instanceof Error && err.message.includes('Overloaded')) {
|
|
224
|
+
this.error.value = new AIServiecOverloadedError('AI service overloaded', { cause: err });
|
|
225
|
+
} else {
|
|
226
|
+
this.error.value = new Error('AI service error', { cause: err });
|
|
227
|
+
}
|
|
224
228
|
} finally {
|
|
225
229
|
this._stream = undefined;
|
|
226
230
|
}
|
|
227
231
|
}
|
|
228
232
|
}
|
|
233
|
+
|
|
234
|
+
// TODO(wittjosiah): Refactor.
|
|
235
|
+
export class AIServiecOverloadedError extends Error {
|
|
236
|
+
code = 'AI_SERVICE_OVERLOADED';
|
|
237
|
+
}
|
|
@@ -6,22 +6,29 @@ import { useEffect, useMemo, useState } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
|
|
8
8
|
import { createSystemPrompt, type Tool } from '@dxos/artifact';
|
|
9
|
-
import {
|
|
10
|
-
import { FunctionType } from '@dxos/functions';
|
|
9
|
+
import { DEFAULT_EDGE_MODEL, DEFAULT_OLLAMA_MODEL } from '@dxos/assistant';
|
|
10
|
+
import { FunctionType } from '@dxos/functions/types';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { useConfig } from '@dxos/react-client';
|
|
13
|
-
import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
|
|
13
|
+
import { Filter, fullyQualifiedId, type Space, useQuery } from '@dxos/react-client/echo';
|
|
14
14
|
import { isNonNullable } from '@dxos/util';
|
|
15
15
|
|
|
16
16
|
import { AssistantCapabilities } from '../capabilities';
|
|
17
17
|
import { ChatProcessor } from '../hooks';
|
|
18
18
|
import { covertFunctionToTool, createToolsFromService } from '../tools';
|
|
19
|
-
import { type AssistantSettingsProps, ServiceType } from '../types';
|
|
19
|
+
import { type AIChatType, type AssistantSettingsProps, ServiceType } from '../types';
|
|
20
|
+
|
|
21
|
+
type UseChatProcessorProps = {
|
|
22
|
+
chat?: AIChatType;
|
|
23
|
+
space?: Space;
|
|
24
|
+
settings?: AssistantSettingsProps;
|
|
25
|
+
part?: 'deck' | 'dialog';
|
|
26
|
+
};
|
|
20
27
|
|
|
21
28
|
/**
|
|
22
29
|
* Configure and create ChatProcessor.
|
|
23
30
|
*/
|
|
24
|
-
export const useChatProcessor = (
|
|
31
|
+
export const useChatProcessor = ({ chat, space, settings, part = 'deck' }: UseChatProcessorProps): ChatProcessor => {
|
|
25
32
|
const aiClient = useCapability(AssistantCapabilities.AiClient);
|
|
26
33
|
const globalTools = useCapabilities(Capabilities.Tools);
|
|
27
34
|
const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
|
|
@@ -41,6 +48,7 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
|
|
|
41
48
|
// Tools and context.
|
|
42
49
|
const config = useConfig();
|
|
43
50
|
const functions = useQuery(space, Filter.schema(FunctionType));
|
|
51
|
+
const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);
|
|
44
52
|
const [tools, extensions] = useMemo(() => {
|
|
45
53
|
log('creating tools...');
|
|
46
54
|
const tools = [
|
|
@@ -51,9 +59,9 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
|
|
|
51
59
|
.map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
|
|
52
60
|
.filter(isNonNullable),
|
|
53
61
|
];
|
|
54
|
-
const extensions = { space, dispatch };
|
|
62
|
+
const extensions = { space, dispatch, pivotId: chatId, part };
|
|
55
63
|
return [tools, extensions];
|
|
56
|
-
}, [dispatch, globalTools, artifactDefinitions, space, serviceTools, functions]);
|
|
64
|
+
}, [dispatch, globalTools, artifactDefinitions, space, chatId, serviceTools, functions]);
|
|
57
65
|
|
|
58
66
|
// Prompt.
|
|
59
67
|
const systemPrompt = useMemo(
|
|
@@ -64,17 +72,18 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
|
|
|
64
72
|
[artifactDefinitions],
|
|
65
73
|
);
|
|
66
74
|
|
|
75
|
+
// TODO(burdon): Remove default (let backend decide if not specified).
|
|
76
|
+
const model =
|
|
77
|
+
settings?.llmProvider === 'ollama'
|
|
78
|
+
? settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL
|
|
79
|
+
: settings?.edgeModel ?? DEFAULT_EDGE_MODEL;
|
|
80
|
+
|
|
67
81
|
// Create processor.
|
|
68
|
-
// TODO(burdon): Updated on each query update above
|
|
82
|
+
// TODO(burdon): Updated on each query update above; should just update current processor.
|
|
69
83
|
const processor = useMemo(() => {
|
|
70
84
|
log('creating processor...', { settings });
|
|
71
|
-
return new ChatProcessor(aiClient, tools, extensions, {
|
|
72
|
-
|
|
73
|
-
model: settings?.llmModel ?? DEFAULT_LLM_MODEL,
|
|
74
|
-
// TOOD(burdon): Query.
|
|
75
|
-
systemPrompt,
|
|
76
|
-
});
|
|
77
|
-
}, [aiClient, tools, extensions, systemPrompt, settings?.llmModel]);
|
|
85
|
+
return new ChatProcessor(aiClient.value, tools, extensions, { model, systemPrompt });
|
|
86
|
+
}, [aiClient.value, tools, extensions, model, systemPrompt]);
|
|
78
87
|
|
|
79
88
|
return processor;
|
|
80
89
|
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, useCapabilities } from '@dxos/app-framework';
|
|
8
|
+
import type { Space } from '@dxos/client/echo';
|
|
9
|
+
import { getDXN, getLabel, getSchema } from '@dxos/echo-schema';
|
|
10
|
+
import { log } from '@dxos/log';
|
|
11
|
+
import { Filter } from '@dxos/react-client/echo';
|
|
12
|
+
|
|
13
|
+
export type ContextProvider = {
|
|
14
|
+
query: (params: { query: string }) => Promise<Array<{ uri: string; label: string }>>;
|
|
15
|
+
resolveMetadata: (params: { uri: string }) => Promise<{ uri: string; label: string }>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const stringMatch = (query: string, label: string) => label.toLowerCase().startsWith(query.toLowerCase());
|
|
19
|
+
|
|
20
|
+
export const useContextProvider = (space?: Space): ContextProvider | undefined => {
|
|
21
|
+
const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
|
|
22
|
+
|
|
23
|
+
return useMemo<ContextProvider | undefined>((): ContextProvider | undefined => {
|
|
24
|
+
if (!space) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
query: async ({ query }) => {
|
|
30
|
+
const artifactSchemas = artifactDefinitions.map((artifact) => artifact.schema);
|
|
31
|
+
const { objects } = await space.db
|
|
32
|
+
.query(Filter.or(...artifactSchemas.map((schema) => Filter.schema(schema))))
|
|
33
|
+
.run();
|
|
34
|
+
return objects
|
|
35
|
+
.map((object) => {
|
|
36
|
+
log.info('object', { object, label: getLabel(getSchema(object)!, object) });
|
|
37
|
+
return object;
|
|
38
|
+
})
|
|
39
|
+
.filter((object) => stringMatch(query, getLabel(getSchema(object)!, object) ?? ''))
|
|
40
|
+
.filter((object) => !!getDXN(object))
|
|
41
|
+
.map((object) => ({
|
|
42
|
+
uri: getDXN(object)!.toString(),
|
|
43
|
+
label: getLabel(getSchema(object)!, object) ?? '',
|
|
44
|
+
}));
|
|
45
|
+
},
|
|
46
|
+
resolveMetadata: async ({ uri }) => {
|
|
47
|
+
const object = await space.db.query({ id: uri }).first();
|
|
48
|
+
return {
|
|
49
|
+
uri,
|
|
50
|
+
label: getLabel(getSchema(object)!, object) ?? '',
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}, [space, artifactDefinitions]);
|
|
55
|
+
};
|
|
@@ -7,7 +7,7 @@ import { useEffect, useState } from 'react';
|
|
|
7
7
|
import { Mutex } from '@dxos/async';
|
|
8
8
|
import { Context } from '@dxos/context';
|
|
9
9
|
import { createSubscriptionTrigger, type TriggerFactory } from '@dxos/functions';
|
|
10
|
-
import { FunctionTrigger } from '@dxos/functions';
|
|
10
|
+
import { FunctionTrigger } from '@dxos/functions/types';
|
|
11
11
|
import { invariant } from '@dxos/invariant';
|
|
12
12
|
import { log } from '@dxos/log';
|
|
13
13
|
import { useClient } from '@dxos/react-client';
|
|
@@ -6,8 +6,7 @@ import { useMemo } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { type Message } from '@dxos/artifact';
|
|
8
8
|
import { DXN, QueueSubspaceTags } from '@dxos/keys';
|
|
9
|
-
import { getSpace } from '@dxos/react-client/echo';
|
|
10
|
-
import { useEdgeClient, useQueue } from '@dxos/react-edge-client';
|
|
9
|
+
import { getSpace, useQueue } from '@dxos/react-client/echo';
|
|
11
10
|
|
|
12
11
|
import { type AIChatType } from '../types';
|
|
13
12
|
|
|
@@ -18,6 +17,5 @@ export const useMessageQueue = (chat?: AIChatType) => {
|
|
|
18
17
|
return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;
|
|
19
18
|
}, [space, chat?.queue.dxn]);
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
return useQueue<Message>(edgeClient, queueDxn);
|
|
20
|
+
return useQueue<Message>(queueDxn);
|
|
23
21
|
};
|
package/src/meta.ts
CHANGED
|
@@ -8,11 +8,11 @@ export const ASSISTANT_PLUGIN = 'dxos.org/plugin/assistant';
|
|
|
8
8
|
|
|
9
9
|
export const ASSISTANT_DIALOG = `${ASSISTANT_PLUGIN}/assistant/dialog`;
|
|
10
10
|
|
|
11
|
-
export const meta = {
|
|
11
|
+
export const meta: PluginMeta = {
|
|
12
12
|
id: ASSISTANT_PLUGIN,
|
|
13
13
|
name: 'Assistant',
|
|
14
14
|
description: 'The Assistant tab allows you to chat with your spaces inside of Composer.',
|
|
15
15
|
icon: 'ph--atom--regular',
|
|
16
16
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-assistant',
|
|
17
17
|
tags: ['experimental'],
|
|
18
|
-
}
|
|
18
|
+
};
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { createSystemPrompt } from '@dxos/artifact';
|
|
6
|
-
import {
|
|
6
|
+
import { DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';
|
|
7
7
|
|
|
8
8
|
export const createProcessorOptions = (artifacts: string[]): Pick<GenerateRequest, 'model' | 'systemPrompt'> => ({
|
|
9
|
-
model:
|
|
9
|
+
model: DEFAULT_EDGE_MODEL,
|
|
10
10
|
systemPrompt: createSystemPrompt({ artifacts }),
|
|
11
11
|
});
|
package/src/tools/function.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { defineTool, ToolResult } from '@dxos/artifact';
|
|
6
6
|
import type { Tool } from '@dxos/artifact';
|
|
7
7
|
import { toEffectSchema } from '@dxos/echo-schema';
|
|
8
|
-
import { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';
|
|
9
|
-
import type { FunctionType } from '@dxos/functions';
|
|
8
|
+
import { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions/types';
|
|
9
|
+
import type { FunctionType } from '@dxos/functions/types';
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
import type { SpaceId } from '@dxos/react-client/echo';
|
|
12
12
|
import { getMeta } from '@dxos/react-client/echo';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { AIServiceEdgeClient } from '@dxos/assistant';
|
|
8
8
|
import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
10
|
|
|
@@ -72,7 +72,7 @@ describe.skip('openapi', () => {
|
|
|
72
72
|
authorization: AMADEUS_AUTH,
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
-
const client = new
|
|
75
|
+
const client = new AIServiceEdgeClient({
|
|
76
76
|
endpoint: AI_SERVICE_ENDPOINT.LOCAL,
|
|
77
77
|
});
|
|
78
78
|
const processor = new ChatProcessor(client, tools);
|
|
@@ -87,7 +87,7 @@ describe.skip('openapi', () => {
|
|
|
87
87
|
test('amadeus hotel name autocomplete', { timeout: 60_000 }, async () => {
|
|
88
88
|
const tools = await createToolsFromApi(HOTEL_NAME_AUTOCOMPLETE_API, { authorization: AMADEUS_AUTH });
|
|
89
89
|
|
|
90
|
-
const client = new
|
|
90
|
+
const client = new AIServiceEdgeClient({
|
|
91
91
|
endpoint: AI_SERVICE_ENDPOINT.LOCAL,
|
|
92
92
|
});
|
|
93
93
|
const processor = new ChatProcessor(client, tools);
|
|
@@ -102,7 +102,7 @@ describe.skip('openapi', () => {
|
|
|
102
102
|
instructions: WEATHER_INSTRUCTIONS,
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
const client = new
|
|
105
|
+
const client = new AIServiceEdgeClient({
|
|
106
106
|
endpoint: AI_SERVICE_ENDPOINT.LOCAL,
|
|
107
107
|
});
|
|
108
108
|
const processor = new ChatProcessor(client, tools);
|
package/src/translations.ts
CHANGED
|
@@ -16,6 +16,7 @@ export default [
|
|
|
16
16
|
},
|
|
17
17
|
[ASSISTANT_PLUGIN]: {
|
|
18
18
|
'chat title placeholder': 'AI Chat',
|
|
19
|
+
'templates label': 'Templates',
|
|
19
20
|
'template title placeholder': 'Template',
|
|
20
21
|
|
|
21
22
|
'open ambient chat label': 'Open AI chat',
|
|
@@ -27,6 +28,8 @@ export default [
|
|
|
27
28
|
'command placeholder': 'Enter slash command...',
|
|
28
29
|
'template placeholder': 'Enter template...',
|
|
29
30
|
'value placeholder': 'Enter value...',
|
|
31
|
+
'typename placeholder': 'Enter typename of objects which this template is for',
|
|
32
|
+
'description placeholder': 'Enter description of when this template should be used',
|
|
30
33
|
'select preset template placeholder': 'Select preset',
|
|
31
34
|
'service registry label': 'Service Registry',
|
|
32
35
|
|
|
@@ -40,9 +43,11 @@ export default [
|
|
|
40
43
|
'microphone button': 'Click to speak',
|
|
41
44
|
'cancel processing button': 'Stop processing',
|
|
42
45
|
|
|
43
|
-
'settings
|
|
44
|
-
'settings
|
|
45
|
-
'settings
|
|
46
|
+
'settings default label': 'Default',
|
|
47
|
+
'settings custom prompts label': 'Use custom prompts',
|
|
48
|
+
'settings llm provider label': 'Enable Ollama integration',
|
|
49
|
+
'settings edge llm model label': 'Remote language model',
|
|
50
|
+
'settings ollama llm model label': 'Ollama language model',
|
|
46
51
|
},
|
|
47
52
|
},
|
|
48
53
|
},
|
package/src/types/service.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { ComputeGraph } from '@dxos/conductor';
|
|
6
6
|
import { Ref, S, TypedObject, type Ref$ } from '@dxos/echo-schema';
|
|
7
|
-
import { FunctionType } from '@dxos/functions';
|
|
7
|
+
import { FunctionType } from '@dxos/functions/types';
|
|
8
8
|
|
|
9
9
|
const ApiAuthorizationKey = S.Struct({
|
|
10
10
|
type: S.Literal('api-key'),
|