@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
package/src/hooks/processor.ts
CHANGED
|
@@ -5,17 +5,8 @@
|
|
|
5
5
|
import { type Signal, batch, computed, signal } from '@preact/signals-core';
|
|
6
6
|
|
|
7
7
|
import { type PromiseIntentDispatcher } from '@dxos/app-framework';
|
|
8
|
-
import { type
|
|
9
|
-
import {
|
|
10
|
-
isToolUse,
|
|
11
|
-
runTools,
|
|
12
|
-
type GenerateRequest,
|
|
13
|
-
type GenerationStream,
|
|
14
|
-
MixedStreamParser,
|
|
15
|
-
DEFAULT_LLM_MODEL,
|
|
16
|
-
type AIServiceClient,
|
|
17
|
-
} from '@dxos/assistant';
|
|
18
|
-
import { createStatic } from '@dxos/echo-schema';
|
|
8
|
+
import { type ArtifactDefinition, type Message, type MessageContentBlock, type Tool } from '@dxos/artifact';
|
|
9
|
+
import { type AIServiceClient, AISession, DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';
|
|
19
10
|
import { invariant } from '@dxos/invariant';
|
|
20
11
|
import { log } from '@dxos/log';
|
|
21
12
|
import { type Space } from '@dxos/react-client/echo';
|
|
@@ -36,7 +27,7 @@ type RequestOptions = {
|
|
|
36
27
|
export type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;
|
|
37
28
|
|
|
38
29
|
const defaultOptions: ChatProcessorOptions = {
|
|
39
|
-
model:
|
|
30
|
+
model: DEFAULT_EDGE_MODEL,
|
|
40
31
|
systemPrompt: 'you are a helpful assistant',
|
|
41
32
|
};
|
|
42
33
|
|
|
@@ -47,20 +38,14 @@ const defaultOptions: ChatProcessorOptions = {
|
|
|
47
38
|
* Supports cancellation of in-progress requests.
|
|
48
39
|
*/
|
|
49
40
|
export class ChatProcessor {
|
|
50
|
-
/** SSE stream parser. */
|
|
51
|
-
private readonly _parser = new MixedStreamParser();
|
|
52
|
-
|
|
53
|
-
/** Current streaming response. */
|
|
54
|
-
private _stream: GenerationStream | undefined;
|
|
55
|
-
|
|
56
41
|
/** Pending messages (incl. the current user request). */
|
|
57
42
|
private readonly _pending: Signal<Message[]> = signal([]);
|
|
58
43
|
|
|
59
44
|
/** Current streaming block (from the AI service). */
|
|
60
45
|
private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);
|
|
61
46
|
|
|
62
|
-
/**
|
|
63
|
-
private
|
|
47
|
+
/** Current streaming response. */
|
|
48
|
+
private _session: AISession | undefined;
|
|
64
49
|
|
|
65
50
|
/**
|
|
66
51
|
* Streaming state.
|
|
@@ -94,24 +79,10 @@ export class ChatProcessor {
|
|
|
94
79
|
constructor(
|
|
95
80
|
private readonly _ai: AIServiceClient,
|
|
96
81
|
private _tools?: Tool[],
|
|
82
|
+
private _artifacts?: ArtifactDefinition[],
|
|
97
83
|
private readonly _extensions?: ToolContextExtensions,
|
|
98
84
|
private readonly _options: ChatProcessorOptions = defaultOptions,
|
|
99
|
-
) {
|
|
100
|
-
// Message complete.
|
|
101
|
-
this._parser.message.on((message) => {
|
|
102
|
-
batch(() => {
|
|
103
|
-
this._pending.value = [...this._pending.value, message];
|
|
104
|
-
this._block.value = undefined;
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// Streaming update (happens before message complete).
|
|
109
|
-
this._parser.update.on((block) => {
|
|
110
|
-
batch(() => {
|
|
111
|
-
this._block.value = block;
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
}
|
|
85
|
+
) {}
|
|
115
86
|
|
|
116
87
|
get tools() {
|
|
117
88
|
return this._tools;
|
|
@@ -128,19 +99,55 @@ export class ChatProcessor {
|
|
|
128
99
|
* Make GPT request.
|
|
129
100
|
*/
|
|
130
101
|
async request(message: string, options: RequestOptions = {}): Promise<Message[]> {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
this._block.value = undefined;
|
|
102
|
+
this._session = new AISession({ operationModel: 'immediate' });
|
|
103
|
+
|
|
104
|
+
// Message complete.
|
|
105
|
+
this._session.message.on((message) => {
|
|
106
|
+
batch(() => {
|
|
107
|
+
this._pending.value = [...this._pending.value, message];
|
|
108
|
+
this._block.value = undefined;
|
|
109
|
+
});
|
|
140
110
|
});
|
|
141
111
|
|
|
142
|
-
|
|
143
|
-
|
|
112
|
+
// Streaming update (happens before message complete).
|
|
113
|
+
this._session.update.on((block) => {
|
|
114
|
+
batch(() => {
|
|
115
|
+
this._block.value = block;
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
this._session.userMessage.on((message) => {
|
|
120
|
+
this._pending.value = [...this._pending.value, message];
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
const messages = await this._session.run({
|
|
125
|
+
client: this._ai,
|
|
126
|
+
history: options.history ?? [],
|
|
127
|
+
artifacts: this._artifacts ?? [],
|
|
128
|
+
tools: this._tools ?? [],
|
|
129
|
+
prompt: message,
|
|
130
|
+
systemPrompt: this._options.systemPrompt,
|
|
131
|
+
extensions: this._extensions,
|
|
132
|
+
generationOptions: {
|
|
133
|
+
model: this._options.model,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
log.info('completed', { messages });
|
|
138
|
+
|
|
139
|
+
options.onComplete?.(this._pending.value);
|
|
140
|
+
} catch (err) {
|
|
141
|
+
log.catch(err);
|
|
142
|
+
if (err instanceof Error && err.message.includes('Overloaded')) {
|
|
143
|
+
this.error.value = new AIServiceOverloadedError('AI service overloaded', { cause: err });
|
|
144
|
+
} else {
|
|
145
|
+
this.error.value = new Error('AI service error', { cause: err });
|
|
146
|
+
}
|
|
147
|
+
} finally {
|
|
148
|
+
this._session = undefined;
|
|
149
|
+
}
|
|
150
|
+
|
|
144
151
|
return this._reset();
|
|
145
152
|
}
|
|
146
153
|
|
|
@@ -150,88 +157,22 @@ export class ChatProcessor {
|
|
|
150
157
|
*/
|
|
151
158
|
async cancel(): Promise<Message[]> {
|
|
152
159
|
log.info('cancelling...');
|
|
153
|
-
this.
|
|
160
|
+
this._session?.abort();
|
|
154
161
|
return this._reset();
|
|
155
162
|
}
|
|
156
163
|
|
|
157
164
|
private async _reset(): Promise<Message[]> {
|
|
158
165
|
const messages = this._pending.value;
|
|
159
166
|
batch(() => {
|
|
160
|
-
this._history = [];
|
|
161
167
|
this._pending.value = [];
|
|
162
168
|
this._block.value = undefined;
|
|
163
169
|
});
|
|
164
170
|
|
|
165
171
|
return messages;
|
|
166
172
|
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Generate a response from the AI service.
|
|
170
|
-
* Iterates over tool requests.
|
|
171
|
-
*/
|
|
172
|
-
private async _request() {
|
|
173
|
-
try {
|
|
174
|
-
let more = false;
|
|
175
|
-
do {
|
|
176
|
-
log('request', {
|
|
177
|
-
pending: this._pending.value.length,
|
|
178
|
-
history: this._history.length,
|
|
179
|
-
tools: this._tools?.map((tool) => tool.name),
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// Open request stream.
|
|
183
|
-
this._stream = await this._ai.exec({
|
|
184
|
-
...this._options,
|
|
185
|
-
// TODO(burdon): Rename messages or separate history/message.
|
|
186
|
-
history: [...this._history, ...this._pending.value],
|
|
187
|
-
tools: this._tools,
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// Wait until complete.
|
|
191
|
-
await this._parser.parse(this._stream);
|
|
192
|
-
await this._stream.complete();
|
|
193
|
-
|
|
194
|
-
// Add messages.
|
|
195
|
-
log('response', { pending: this._pending.value });
|
|
196
|
-
|
|
197
|
-
// Resolve tool use locally.
|
|
198
|
-
more = false;
|
|
199
|
-
const message = this._pending.value.at(-1);
|
|
200
|
-
invariant(message);
|
|
201
|
-
if (isToolUse(message)) {
|
|
202
|
-
log('tool request...');
|
|
203
|
-
const response = await runTools({
|
|
204
|
-
message: this._pending.value.at(-1)!,
|
|
205
|
-
tools: this._tools ?? [],
|
|
206
|
-
extensions: this._extensions,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
log('tool response', { response });
|
|
210
|
-
switch (response.type) {
|
|
211
|
-
case 'continue': {
|
|
212
|
-
this._pending.value = [...this._pending.value, response.message];
|
|
213
|
-
more = true;
|
|
214
|
-
break;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
} while (more);
|
|
219
|
-
|
|
220
|
-
this.error.value = undefined;
|
|
221
|
-
} catch (err) {
|
|
222
|
-
log.catch(err);
|
|
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
|
-
}
|
|
228
|
-
} finally {
|
|
229
|
-
this._stream = undefined;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
173
|
}
|
|
233
174
|
|
|
234
|
-
// TODO(wittjosiah):
|
|
235
|
-
export class
|
|
175
|
+
// TODO(wittjosiah): Move to ai-service-client.
|
|
176
|
+
export class AIServiceOverloadedError extends Error {
|
|
236
177
|
code = 'AI_SERVICE_OVERLOADED';
|
|
237
178
|
}
|
|
@@ -5,23 +5,37 @@
|
|
|
5
5
|
import { useEffect, useMemo, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
|
|
8
|
-
import { createSystemPrompt, type Tool } from '@dxos/artifact';
|
|
9
|
-
import {
|
|
8
|
+
import { type AssociatedArtifact, createSystemPrompt, type Tool } from '@dxos/artifact';
|
|
9
|
+
import { DEFAULT_EDGE_MODEL, DEFAULT_OLLAMA_MODEL } from '@dxos/assistant';
|
|
10
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
|
-
import { ChatProcessor } from '../hooks';
|
|
17
|
+
import { ChatProcessor, type ChatProcessorOptions } 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
|
+
associatedArtifact?: AssociatedArtifact;
|
|
27
|
+
};
|
|
20
28
|
|
|
21
29
|
/**
|
|
22
30
|
* Configure and create ChatProcessor.
|
|
23
31
|
*/
|
|
24
|
-
export const useChatProcessor = (
|
|
32
|
+
export const useChatProcessor = ({
|
|
33
|
+
chat,
|
|
34
|
+
space,
|
|
35
|
+
settings,
|
|
36
|
+
part = 'deck',
|
|
37
|
+
associatedArtifact,
|
|
38
|
+
}: UseChatProcessorProps): ChatProcessor => {
|
|
25
39
|
const aiClient = useCapability(AssistantCapabilities.AiClient);
|
|
26
40
|
const globalTools = useCapabilities(Capabilities.Tools);
|
|
27
41
|
const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
|
|
@@ -41,40 +55,42 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
|
|
|
41
55
|
// Tools and context.
|
|
42
56
|
const config = useConfig();
|
|
43
57
|
const functions = useQuery(space, Filter.schema(FunctionType));
|
|
58
|
+
const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);
|
|
44
59
|
const [tools, extensions] = useMemo(() => {
|
|
45
60
|
log('creating tools...');
|
|
46
61
|
const tools = [
|
|
47
62
|
...globalTools.flat(),
|
|
48
|
-
...artifactDefinitions.flatMap((definition) => definition.tools),
|
|
49
63
|
...serviceTools,
|
|
50
64
|
...functions
|
|
51
65
|
.map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
|
|
52
66
|
.filter(isNonNullable),
|
|
53
67
|
];
|
|
54
|
-
const extensions = { space, dispatch };
|
|
68
|
+
const extensions = { space, dispatch, pivotId: chatId, part };
|
|
55
69
|
return [tools, extensions];
|
|
56
|
-
}, [dispatch, globalTools,
|
|
70
|
+
}, [dispatch, globalTools, space, chatId, serviceTools, functions]);
|
|
57
71
|
|
|
58
72
|
// Prompt.
|
|
59
73
|
const systemPrompt = useMemo(
|
|
60
74
|
() =>
|
|
61
75
|
createSystemPrompt({
|
|
62
|
-
artifacts: artifactDefinitions.map((definition) => definition.instructions),
|
|
76
|
+
artifacts: artifactDefinitions.map((definition) => `${definition.name}\n${definition.instructions}`),
|
|
77
|
+
associatedArtifact,
|
|
63
78
|
}),
|
|
64
|
-
[artifactDefinitions],
|
|
79
|
+
[artifactDefinitions, associatedArtifact],
|
|
65
80
|
);
|
|
66
81
|
|
|
82
|
+
// TODO(burdon): Remove default (let backend decide if not specified).
|
|
83
|
+
const model: ChatProcessorOptions['model'] =
|
|
84
|
+
settings?.llmProvider === 'ollama'
|
|
85
|
+
? ((settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL) as ChatProcessorOptions['model'])
|
|
86
|
+
: ((settings?.edgeModel ?? DEFAULT_EDGE_MODEL) as ChatProcessorOptions['model']);
|
|
87
|
+
|
|
67
88
|
// Create processor.
|
|
68
|
-
// TODO(burdon): Updated on each query update above
|
|
89
|
+
// TODO(burdon): Updated on each query update above; should just update current processor.
|
|
69
90
|
const processor = useMemo(() => {
|
|
70
91
|
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]);
|
|
92
|
+
return new ChatProcessor(aiClient.value, tools, artifactDefinitions, extensions, { model, systemPrompt });
|
|
93
|
+
}, [aiClient.value, tools, extensions, model, systemPrompt]);
|
|
78
94
|
|
|
79
95
|
return processor;
|
|
80
96
|
};
|
|
@@ -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
|
+
};
|
|
@@ -6,18 +6,16 @@ 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
|
|
|
14
13
|
export const useMessageQueue = (chat?: AIChatType) => {
|
|
15
14
|
const space = getSpace(chat);
|
|
16
15
|
const queueDxn = useMemo(() => {
|
|
17
|
-
const dxn = space && chat?.
|
|
16
|
+
const dxn = space && chat?.assistantChatQueue.dxn;
|
|
18
17
|
return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;
|
|
19
|
-
}, [space, chat?.
|
|
18
|
+
}, [space, chat?.assistantChatQueue.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/translations.ts
CHANGED
|
@@ -10,15 +10,17 @@ export default [
|
|
|
10
10
|
'en-US': {
|
|
11
11
|
[AIChatType.typename]: {
|
|
12
12
|
'typename label': 'AI Chat',
|
|
13
|
+
'object name placeholder': 'AI Chat',
|
|
13
14
|
},
|
|
14
15
|
[TemplateType.typename]: {
|
|
15
16
|
'typename label': 'Template',
|
|
17
|
+
'object name placeholder': 'New template',
|
|
16
18
|
},
|
|
17
19
|
[ASSISTANT_PLUGIN]: {
|
|
18
|
-
'
|
|
19
|
-
'template title placeholder': 'Template',
|
|
20
|
+
'templates label': 'Templates',
|
|
20
21
|
|
|
21
22
|
'open ambient chat label': 'Open AI chat',
|
|
23
|
+
'assistant chat label': 'AI chat',
|
|
22
24
|
'plugin name': 'Assistant',
|
|
23
25
|
'object placeholder': 'New prompt',
|
|
24
26
|
'create object label': 'Create prompt',
|
|
@@ -27,6 +29,8 @@ export default [
|
|
|
27
29
|
'command placeholder': 'Enter slash command...',
|
|
28
30
|
'template placeholder': 'Enter template...',
|
|
29
31
|
'value placeholder': 'Enter value...',
|
|
32
|
+
'typename placeholder': 'Enter typename of objects which this template is for',
|
|
33
|
+
'description placeholder': 'Enter description of when this template should be used',
|
|
30
34
|
'select preset template placeholder': 'Select preset',
|
|
31
35
|
'service registry label': 'Service Registry',
|
|
32
36
|
|
|
@@ -40,9 +44,11 @@ export default [
|
|
|
40
44
|
'microphone button': 'Click to speak',
|
|
41
45
|
'cancel processing button': 'Stop processing',
|
|
42
46
|
|
|
43
|
-
'settings
|
|
44
|
-
'settings
|
|
45
|
-
'settings
|
|
47
|
+
'settings default label': 'Default',
|
|
48
|
+
'settings custom prompts label': 'Use custom prompts',
|
|
49
|
+
'settings llm provider label': 'Enable Ollama integration',
|
|
50
|
+
'settings edge llm model label': 'Remote language model',
|
|
51
|
+
'settings ollama llm model label': 'Ollama language model',
|
|
46
52
|
},
|
|
47
53
|
},
|
|
48
54
|
},
|
package/src/types/chat.ts
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Expando, Ref,
|
|
5
|
+
import { Expando, Ref, TypedObject } from '@dxos/echo-schema';
|
|
6
6
|
|
|
7
7
|
export class AIChatType extends TypedObject({ typename: 'dxos.org/type/AIChat', version: '0.1.0' })({
|
|
8
|
-
name: S.optional(S.String),
|
|
9
8
|
// TODO(wittjosiah): Should be a ref to a Queue.
|
|
10
|
-
|
|
9
|
+
assistantChatQueue: Ref(Expando),
|
|
11
10
|
}) {}
|
package/src/types/template.ts
CHANGED
|
@@ -26,8 +26,30 @@ export const TemplateInputSchema = S.mutable(
|
|
|
26
26
|
|
|
27
27
|
export type TemplateInput = S.Schema.Type<typeof TemplateInputSchema>;
|
|
28
28
|
|
|
29
|
+
export const TemplateKinds = ['always', 'schema-matching', 'automatically', 'manual'] as const;
|
|
30
|
+
export type TemplateKind = (typeof TemplateKinds)[number];
|
|
31
|
+
|
|
32
|
+
export const TemplateKindSchema = S.Union(
|
|
33
|
+
S.Struct({
|
|
34
|
+
include: S.Literal('always'),
|
|
35
|
+
}),
|
|
36
|
+
S.Struct({
|
|
37
|
+
include: S.Literal('schema-matching'),
|
|
38
|
+
typename: S.String,
|
|
39
|
+
}),
|
|
40
|
+
S.Struct({
|
|
41
|
+
include: S.Literal('automatically'),
|
|
42
|
+
description: S.String,
|
|
43
|
+
}),
|
|
44
|
+
S.Struct({
|
|
45
|
+
include: S.Literal('manual'),
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
export type TemplateKindType = S.Schema.Type<typeof TemplateKindSchema>;
|
|
29
50
|
export class TemplateType extends TypedObject({ typename: 'dxos.org/type/Template', version: '0.1.0' })({
|
|
30
51
|
name: S.optional(S.String),
|
|
52
|
+
kind: S.mutable(TemplateKindSchema),
|
|
31
53
|
source: S.String,
|
|
32
54
|
inputs: S.optional(S.mutable(S.Array(TemplateInputSchema))),
|
|
33
55
|
command: S.optional(S.String),
|
package/src/types/types.ts
CHANGED
|
@@ -33,7 +33,9 @@ export namespace AssistantAction {
|
|
|
33
33
|
|
|
34
34
|
export const AssistantSettingsSchema = S.mutable(
|
|
35
35
|
S.Struct({
|
|
36
|
-
|
|
36
|
+
llmProvider: S.optional(S.Literal('edge', 'ollama')),
|
|
37
|
+
edgeModel: S.optional(S.String),
|
|
38
|
+
ollamaModel: S.optional(S.String),
|
|
37
39
|
customPrompts: S.optional(S.Boolean),
|
|
38
40
|
}),
|
|
39
41
|
);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/AssistantDialog.tsx", "../../../src/components/AmbientDialog/AmbientDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, useState } from 'react';\n\nimport { useCapability, Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { TranscriptionCapabilities } from '@dxos/plugin-transcription';\nimport { useTranslation } from '@dxos/react-ui';\n\nimport { AmbientDialog } from './AmbientDialog';\nimport { ThreadContainer } from './Thread';\nimport { ASSISTANT_PLUGIN } from '../meta';\nimport { type AssistantSettingsProps, type AIChatType } from '../types';\n\nexport const AssistantDialog: FC<{ chat?: AIChatType }> = ({ chat }) => {\n const { t } = useTranslation(ASSISTANT_PLUGIN);\n const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;\n const settings = useCapability(Capabilities.SettingsStore).getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;\n\n // TODO(burdon): Refocus when open.\n const [open, setOpen] = useState(false);\n\n return (\n <AmbientDialog open={open} onOpenChange={setOpen} title={t('assistant dialog title')}>\n <ThreadContainer chat={chat} onOpenChange={setOpen} settings={settings} transcription={transcription} />\n </AmbientDialog>\n );\n};\n\nexport default AssistantDialog;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useCallback, useEffect, useState } from 'react';\n\nimport { Dialog, Icon, IconButton } from '@dxos/react-ui';\nimport { resizeAttributes, ResizeHandle, type Size, sizeStyle } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/react-ui-theme';\n\nconst preventDefault = (event: Event) => event.preventDefault();\n\nconst minSize = 5;\n\n// TODO(burdon): Factor out.\nexport const AmbientDialog = ({\n children,\n open: _open,\n title,\n onOpenChange,\n}: PropsWithChildren<{ open?: boolean; onOpenChange?: (open: boolean) => void; title?: string }>) => {\n const [resizeKey, setReizeKey] = useState(0);\n const [size, setSize] = useState<Size>('min-content');\n const [open, setOpen] = useState(_open);\n\n // Update controlled value.\n useEffect(() => {\n setOpen(_open);\n }, [_open]);\n\n // Update size and key.\n useEffect(() => {\n setSize(open ? 'min-content' : minSize);\n setReizeKey((key) => key + 1);\n }, [open]);\n\n // TODO(burdon): Animate open/close.\n // NOTE: We set the min size to 5rem (80px), and the header and prompt bar to 40px (i.e., the rail-size) each.\n // The dialog has no vertical padding and has box-content so that when closed it collapses to the size of the header and prompt bar.\n const handleToggle = useCallback(() => {\n setOpen((open) => {\n onOpenChange?.(!open);\n return !open;\n });\n }, []);\n\n return (\n <div role='none' className='dx-dialog__overlay bg-transparent pointer-events-none' data-block-align='end'>\n <Dialog.Content\n classNames='relative box-content py-0 px-2 md:is-[35rem] md:max-is-none overflow-hidden pointer-events-auto transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing=\"true\"])]:duration-200'\n inOverlayLayout\n {...resizeAttributes}\n style={{\n ...sizeStyle(size, 'vertical', true),\n maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)',\n }}\n onInteractOutside={preventDefault}\n >\n <ResizeHandle\n key={resizeKey}\n side='block-start'\n defaultSize='min-content'\n minSize={minSize}\n fallbackSize={minSize}\n iconPosition='center'\n onSizeChange={setSize}\n />\n\n <DialogHeader open={open} title={title} onToggle={handleToggle} />\n\n {children}\n </Dialog.Content>\n </div>\n );\n};\n\n/**\n * Matches same layout grid as PromptBar.\n */\nconst DialogHeader = ({ open, title, onToggle }: { open?: boolean; title?: string; onToggle: () => void }) => {\n return (\n <div className='flex shrink-0 w-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] items-center overflow-hidden'>\n <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>\n <Dialog.Close>\n <Icon icon='ph--x--regular' />\n </Dialog.Close>\n </div>\n <div className='grow'>\n <Dialog.Title classNames='flex justify-center text-xs text-subdued'>{title}</Dialog.Title>\n </div>\n <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>\n <IconButton\n variant='ghost'\n icon={'ph--caret-up--regular'}\n classNames={mx('[&>svg]:transition [&>svg]:duration-200', open && '[&>svg]:rotate-180')}\n iconOnly\n label='Shrink'\n onClick={onToggle}\n />\n </div>\n </div>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;AAIA,OAAOA,UAAkBC,YAAAA,iBAAgB;AAEzC,SAASC,eAAeC,cAAcC,uBAAuB;AAC7D,SAASC,iCAAiC;AAC1C,SAASC,sBAAsB;;;ACJ/B,OAAOC,SAAiCC,aAAaC,WAAWC,gBAAgB;AAEhF,SAASC,QAAQC,MAAMC,kBAAkB;AACzC,SAASC,kBAAkBC,cAAyBC,iBAAiB;AACrE,SAASC,UAAU;AAEnB,IAAMC,iBAAiB,CAACC,UAAiBA,MAAMD,eAAc;AAE7D,IAAME,UAAU;AAGT,IAAMC,gBAAgB,CAAC,EAC5BC,UACAC,MAAMC,OACNC,OACAC,aAAY,MACkF;AAC9F,QAAM,CAACC,WAAWC,WAAAA,IAAeC,SAAS,CAAA;AAC1C,QAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAe,aAAA;AACvC,QAAM,CAACN,MAAMS,OAAAA,IAAWH,SAASL,KAAAA;AAGjCS,YAAU,MAAA;AACRD,YAAQR,KAAAA;EACV,GAAG;IAACA;GAAM;AAGVS,YAAU,MAAA;AACRF,YAAQR,OAAO,gBAAgBH,OAAAA;AAC/BQ,gBAAY,CAACM,QAAQA,MAAM,CAAA;EAC7B,GAAG;IAACX;GAAK;AAKT,QAAMY,eAAeC,YAAY,MAAA;AAC/BJ,YAAQ,CAACT,UAAAA;AACPG,qBAAe,CAACH,KAAAA;AAChB,aAAO,CAACA;IACV,CAAA;EACF,GAAG,CAAA,CAAE;AAEL,SACE,sBAAA,cAACc,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAwDC,oBAAiB;KAClG,sBAAA,cAACC,OAAOC,SAAO;IACbC,YAAW;IACXC,iBAAAA;IACC,GAAGC;IACJC,OAAO;MACL,GAAGC,UAAUjB,MAAM,YAAY,IAAA;MAC/BkB,cAAc;IAChB;IACAC,mBAAmB/B;KAEnB,sBAAA,cAACgC,cAAAA;IACChB,KAAKP;IACLwB,MAAK;IACLC,aAAY;IACZhC;IACAiC,cAAcjC;IACdkC,cAAa;IACbC,cAAcxB;MAGhB,sBAAA,cAACyB,cAAAA;IAAajC;IAAYE;IAAcgC,UAAUtB;MAEjDb,QAAAA,CAAAA;AAIT;AAKA,IAAMkC,eAAe,CAAC,EAAEjC,MAAME,OAAOgC,SAAQ,MAA4D;AACvG,SACE,sBAAA,cAACpB,OAAAA;IAAIE,WAAU;KACb,sBAAA,cAACF,OAAAA;IAAIE,WAAU;KACb,sBAAA,cAACE,OAAOiB,OAAK,MACX,sBAAA,cAACC,MAAAA;IAAKC,MAAK;QAGf,sBAAA,cAACvB,OAAAA;IAAIE,WAAU;KACb,sBAAA,cAACE,OAAOoB,OAAK;IAAClB,YAAW;KAA4ClB,KAAAA,CAAAA,GAEvE,sBAAA,cAACY,OAAAA;IAAIE,WAAU;KACb,sBAAA,cAACuB,YAAAA;IACCC,SAAQ;IACRH,MAAM;IACNjB,YAAYqB,GAAG,2CAA2CzC,QAAQ,oBAAA;IAClE0C,UAAAA;IACAC,OAAM;IACNC,SAASV;;AAKnB;;;ADvFO,IAAMW,kBAA6C,CAAC,EAAEC,KAAI,MAAE;AACjE,QAAM,EAAEC,EAAC,IAAKC,eAAeC,gBAAAA;AAC7B,QAAMC,gBAAgBC,gBAAgBC,0BAA0BC,aAAa,EAAEC,SAAS;AACxF,QAAMC,WAAWC,cAAcC,aAAaC,aAAa,EAAEC,SAAiCV,gBAAAA,GAAmBW;AAG/G,QAAM,CAACC,MAAMC,OAAAA,IAAWC,UAAS,KAAA;AAEjC,SACE,gBAAAC,OAAA,cAACC,eAAAA;IAAcJ;IAAYK,cAAcJ;IAASK,OAAOpB,EAAE,wBAAA;KACzD,gBAAAiB,OAAA,cAACI,iBAAAA;IAAgBtB;IAAYoB,cAAcJ;IAASP;IAAoBL;;AAG9E;AAEA,IAAA,0BAAeL;",
|
|
6
|
-
"names": ["React", "useState", "useCapability", "Capabilities", "useCapabilities", "TranscriptionCapabilities", "useTranslation", "React", "useCallback", "useEffect", "useState", "Dialog", "Icon", "IconButton", "resizeAttributes", "ResizeHandle", "sizeStyle", "mx", "preventDefault", "event", "minSize", "AmbientDialog", "children", "open", "_open", "title", "onOpenChange", "resizeKey", "setReizeKey", "useState", "size", "setSize", "setOpen", "useEffect", "key", "handleToggle", "useCallback", "div", "role", "className", "data-block-align", "Dialog", "Content", "classNames", "inOverlayLayout", "resizeAttributes", "style", "sizeStyle", "maxBlockSize", "onInteractOutside", "ResizeHandle", "side", "defaultSize", "fallbackSize", "iconPosition", "onSizeChange", "DialogHeader", "onToggle", "Close", "Icon", "icon", "Title", "IconButton", "variant", "mx", "iconOnly", "label", "onClick", "AssistantDialog", "chat", "t", "useTranslation", "ASSISTANT_PLUGIN", "transcription", "useCapabilities", "TranscriptionCapabilities", "Transcription", "length", "settings", "useCapability", "Capabilities", "SettingsStore", "getStore", "value", "open", "setOpen", "useState", "React", "AmbientDialog", "onOpenChange", "title", "ThreadContainer"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/ChatContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, useCapabilities, useCapability } from '@dxos/app-framework';\nimport { TranscriptionCapabilities } from '@dxos/plugin-transcription';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { ThreadContainer } from './Thread';\nimport { ASSISTANT_PLUGIN } from '../meta';\nimport { type AssistantSettingsProps, type AIChatType } from '../types';\n\n// TODO(burdon): Attention.\nexport const ChatContainer = ({ chat, role }: { chat: AIChatType; role: string }) => {\n const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;\n const settings = useCapability(Capabilities.SettingsStore).getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;\n\n return (\n <StackItem.Content toolbar={false} role={role} classNames='mli-auto w-full max-w-[50rem]'>\n <ThreadContainer chat={chat} settings={settings} transcription={transcription} />\n </StackItem.Content>\n );\n};\n\nexport default ChatContainer;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,cAAcC,iBAAiBC,qBAAqB;AAC7D,SAASC,iCAAiC;AAC1C,SAASC,iBAAiB;AAOnB,IAAMC,gBAAgB,CAAC,EAAEC,MAAMC,KAAI,MAAsC;AAC9E,QAAMC,gBAAgBC,gBAAgBC,0BAA0BC,aAAa,EAAEC,SAAS;AACxF,QAAMC,WAAWC,cAAcC,aAAaC,aAAa,EAAEC,SAAiCC,gBAAAA,GAAmBC;AAE/G,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,SAAS;IAAOf;IAAYgB,YAAW;KACxD,sBAAA,cAACC,iBAAAA;IAAgBlB;IAAYO;IAAoBL;;AAGvD;AAEA,IAAA,wBAAeH;",
|
|
6
|
-
"names": ["React", "Capabilities", "useCapabilities", "useCapability", "TranscriptionCapabilities", "StackItem", "ChatContainer", "chat", "role", "transcription", "useCapabilities", "TranscriptionCapabilities", "Transcription", "length", "settings", "useCapability", "Capabilities", "SettingsStore", "getStore", "ASSISTANT_PLUGIN", "value", "StackItem", "Content", "toolbar", "classNames", "ThreadContainer"]
|
|
7
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TemplateEditor
|
|
3
|
-
} from "./chunk-EUMPBC4T.mjs";
|
|
4
|
-
import "./chunk-NV7SVHMV.mjs";
|
|
5
|
-
|
|
6
|
-
// packages/plugins/experimental/plugin-assistant/src/components/TemplateContainer.tsx
|
|
7
|
-
import React from "react";
|
|
8
|
-
import { StackItem } from "@dxos/react-ui-stack";
|
|
9
|
-
var TemplateContainer = ({ template, role }) => {
|
|
10
|
-
return /* @__PURE__ */ React.createElement(StackItem.Content, {
|
|
11
|
-
toolbar: false,
|
|
12
|
-
role,
|
|
13
|
-
classNames: "mli-auto w-full max-w-[50rem]"
|
|
14
|
-
}, /* @__PURE__ */ React.createElement(TemplateEditor, {
|
|
15
|
-
template
|
|
16
|
-
}));
|
|
17
|
-
};
|
|
18
|
-
var TemplateContainer_default = TemplateContainer;
|
|
19
|
-
export {
|
|
20
|
-
TemplateContainer,
|
|
21
|
-
TemplateContainer_default as default
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=TemplateContainer-B7MQNUPY.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/TemplateContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { TemplateEditor } from './TemplateEditor';\nimport { type TemplateType } from '../types';\n\n// TODO(burdon): Attention.\nexport const TemplateContainer = ({ template, role }: { template: TemplateType; role: string }) => {\n return (\n <StackItem.Content toolbar={false} role={role} classNames='mli-auto w-full max-w-[50rem]'>\n <TemplateEditor template={template} />\n </StackItem.Content>\n );\n};\n\nexport default TemplateContainer;\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,iBAAiB;AAMnB,IAAMC,oBAAoB,CAAC,EAAEC,UAAUC,KAAI,MAA4C;AAC5F,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,SAAS;IAAOH;IAAYI,YAAW;KACxD,sBAAA,cAACC,gBAAAA;IAAeN;;AAGtB;AAEA,IAAA,4BAAeD;",
|
|
6
|
-
"names": ["React", "StackItem", "TemplateContainer", "template", "role", "StackItem", "Content", "toolbar", "classNames", "TemplateEditor"]
|
|
7
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AssistantCapabilities
|
|
3
|
-
} from "./chunk-NTLTGYYS.mjs";
|
|
4
|
-
import "./chunk-NV7SVHMV.mjs";
|
|
5
|
-
|
|
6
|
-
// packages/plugins/experimental/plugin-assistant/src/capabilities/ai-client.ts
|
|
7
|
-
import { contributes } from "@dxos/app-framework";
|
|
8
|
-
import { AIServiceEdgeClient } from "@dxos/assistant";
|
|
9
|
-
import { log } from "@dxos/log";
|
|
10
|
-
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
11
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-assistant/src/capabilities/ai-client.ts";
|
|
12
|
-
var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
|
|
13
|
-
var ai_client_default = (context) => {
|
|
14
|
-
const client = context.requestCapability(ClientCapabilities.Client);
|
|
15
|
-
const endpoint = client.config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL;
|
|
16
|
-
const ai = new AIServiceEdgeClient({
|
|
17
|
-
endpoint
|
|
18
|
-
});
|
|
19
|
-
log.info("ai", {
|
|
20
|
-
endpoint,
|
|
21
|
-
context
|
|
22
|
-
}, {
|
|
23
|
-
F: __dxlog_file,
|
|
24
|
-
L: 20,
|
|
25
|
-
S: void 0,
|
|
26
|
-
C: (f, a) => f(...a)
|
|
27
|
-
});
|
|
28
|
-
return contributes(AssistantCapabilities.AiClient, ai);
|
|
29
|
-
};
|
|
30
|
-
export {
|
|
31
|
-
ai_client_default as default
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=ai-client-PORKRZXM.mjs.map
|