@dxos/plugin-automation 0.7.5-labs.5f04cf6 → 0.7.5-labs.e27f9b9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/dist/lib/browser/AutomationPanel-WFJZAW4F.mjs +8 -0
  2. package/dist/lib/browser/AutomationPanel-WFJZAW4F.mjs.map +7 -0
  3. package/dist/lib/browser/ChatContainer-OFCOZ5T2.mjs +12 -0
  4. package/dist/lib/browser/ChatContainer-OFCOZ5T2.mjs.map +7 -0
  5. package/dist/lib/browser/{ai-client-6CRYUC6D.mjs → ai-client-AARXEMMJ.mjs} +2 -2
  6. package/dist/lib/browser/{ai-client-6CRYUC6D.mjs.map → ai-client-AARXEMMJ.mjs.map} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-IJTTULDP.mjs → app-graph-builder-B4U34VSR.mjs} +32 -1
  8. package/dist/lib/browser/{app-graph-builder-IJTTULDP.mjs.map → app-graph-builder-B4U34VSR.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-5SLV6AUA.mjs +1367 -0
  10. package/dist/lib/browser/chunk-5SLV6AUA.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-7XADMUOW.mjs +205 -0
  12. package/dist/lib/browser/chunk-7XADMUOW.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-EKJVAFT2.mjs → chunk-IYSMXX6Q.mjs} +64 -7
  14. package/dist/lib/{node-esm/chunk-5QUXIXNB.mjs.map → browser/chunk-IYSMXX6Q.mjs.map} +4 -4
  15. package/dist/lib/browser/chunk-RAVNWHNE.mjs +242 -0
  16. package/dist/lib/browser/chunk-RAVNWHNE.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +43 -38
  18. package/dist/lib/browser/index.mjs.map +3 -3
  19. package/dist/lib/browser/intent-resolver-754MPV7H.mjs +29 -0
  20. package/dist/lib/browser/intent-resolver-754MPV7H.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-IGMBLSV7.mjs → react-surface-4QZ6AKBF.mjs} +22 -21
  23. package/dist/lib/browser/react-surface-4QZ6AKBF.mjs.map +7 -0
  24. package/dist/lib/browser/types/index.mjs +9 -3
  25. package/dist/lib/node/AutomationPanel-LRDEDGXI.cjs +26 -0
  26. package/dist/lib/node/AutomationPanel-LRDEDGXI.cjs.map +7 -0
  27. package/dist/lib/node/ChatContainer-6LZX4K2Z.cjs +33 -0
  28. package/dist/lib/node/ChatContainer-6LZX4K2Z.cjs.map +7 -0
  29. package/dist/lib/node/{ai-client-A3RRU55B.cjs → ai-client-SA35GN5Q.cjs} +5 -5
  30. package/dist/lib/node/{ai-client-A3RRU55B.cjs.map → ai-client-SA35GN5Q.cjs.map} +3 -3
  31. package/dist/lib/node/{app-graph-builder-MF5M4QRS.cjs → app-graph-builder-ENVDOPS4.cjs} +35 -4
  32. package/dist/lib/node/{app-graph-builder-MF5M4QRS.cjs.map → app-graph-builder-ENVDOPS4.cjs.map} +3 -3
  33. package/dist/lib/node/chunk-6VMSH4P6.cjs +1364 -0
  34. package/dist/lib/node/chunk-6VMSH4P6.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-VEGLN4YN.cjs → chunk-HEYQONXC.cjs} +76 -24
  36. package/dist/lib/node/chunk-HEYQONXC.cjs.map +7 -0
  37. package/dist/lib/node/chunk-LU4HQWJD.cjs +226 -0
  38. package/dist/lib/node/chunk-LU4HQWJD.cjs.map +7 -0
  39. package/dist/lib/node/{AutomationPanel-RXJDVLCF.cjs → chunk-WWU5FVAO.cjs} +120 -7
  40. package/dist/lib/node/chunk-WWU5FVAO.cjs.map +7 -0
  41. package/dist/lib/node/index.cjs +72 -66
  42. package/dist/lib/node/index.cjs.map +3 -3
  43. package/dist/lib/node/{intent-resolver-TBHYXBDI.cjs → intent-resolver-CNVBSG4E.cjs} +19 -14
  44. package/dist/lib/node/intent-resolver-CNVBSG4E.cjs.map +7 -0
  45. package/dist/lib/node/meta.json +1 -1
  46. package/dist/lib/node/{react-surface-BVUZMKYS.cjs → react-surface-5HYLBDC3.cjs} +23 -22
  47. package/dist/lib/node/react-surface-5HYLBDC3.cjs.map +7 -0
  48. package/dist/lib/node/types/index.cjs +14 -8
  49. package/dist/lib/node/types/index.cjs.map +2 -2
  50. package/dist/lib/node-esm/AutomationPanel-ZV7VEEPP.mjs +9 -0
  51. package/dist/lib/node-esm/AutomationPanel-ZV7VEEPP.mjs.map +7 -0
  52. package/dist/lib/node-esm/ChatContainer-PPVMC2FC.mjs +13 -0
  53. package/dist/lib/node-esm/ChatContainer-PPVMC2FC.mjs.map +7 -0
  54. package/dist/lib/node-esm/{ai-client-2GBZRHBA.mjs → ai-client-2ZA4TYFZ.mjs} +2 -2
  55. package/dist/lib/node-esm/{ai-client-2GBZRHBA.mjs.map → ai-client-2ZA4TYFZ.mjs.map} +3 -3
  56. package/dist/lib/node-esm/{app-graph-builder-5N7OK23B.mjs → app-graph-builder-IYOUCQZT.mjs} +32 -1
  57. package/dist/lib/node-esm/{app-graph-builder-5N7OK23B.mjs.map → app-graph-builder-IYOUCQZT.mjs.map} +3 -3
  58. package/dist/lib/node-esm/{chunk-5QUXIXNB.mjs → chunk-3KB5HRXA.mjs} +64 -7
  59. package/dist/lib/{browser/chunk-EKJVAFT2.mjs.map → node-esm/chunk-3KB5HRXA.mjs.map} +4 -4
  60. package/dist/lib/node-esm/chunk-EVTLHDM2.mjs +206 -0
  61. package/dist/lib/node-esm/chunk-EVTLHDM2.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-MS7OIGVR.mjs +243 -0
  63. package/dist/lib/node-esm/chunk-MS7OIGVR.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-WISKXX7U.mjs +1368 -0
  65. package/dist/lib/node-esm/chunk-WISKXX7U.mjs.map +7 -0
  66. package/dist/lib/node-esm/index.mjs +43 -38
  67. package/dist/lib/node-esm/index.mjs.map +3 -3
  68. package/dist/lib/node-esm/{intent-resolver-DPJJHFGK.mjs → intent-resolver-RQBXW442.mjs} +18 -13
  69. package/dist/lib/node-esm/intent-resolver-RQBXW442.mjs.map +7 -0
  70. package/dist/lib/node-esm/meta.json +1 -1
  71. package/dist/lib/node-esm/{react-surface-77S6XJOM.mjs → react-surface-SS5WCRJ2.mjs} +22 -21
  72. package/dist/lib/node-esm/react-surface-SS5WCRJ2.mjs.map +7 -0
  73. package/dist/lib/node-esm/types/index.mjs +9 -3
  74. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  75. package/dist/types/src/artifacts.stories.d.ts +10 -24
  76. package/dist/types/src/artifacts.stories.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  78. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/index.d.ts +27 -27
  80. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  82. package/dist/types/src/components/{ChatContainer.d.ts → ChatContainer/ChatContainer.d.ts} +2 -2
  83. package/dist/types/src/components/ChatContainer/ChatContainer.d.ts.map +1 -0
  84. package/dist/types/src/components/ChatContainer/index.d.ts +4 -0
  85. package/dist/types/src/components/ChatContainer/index.d.ts.map +1 -0
  86. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts +14 -0
  87. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts.map +1 -0
  88. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts +8 -0
  89. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/MarkdownViewer/index.d.ts +2 -0
  91. package/dist/types/src/components/MarkdownViewer/index.d.ts.map +1 -0
  92. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +6 -0
  93. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -0
  94. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +8 -0
  95. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/ServiceRegistry/index.d.ts +2 -0
  97. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +1 -0
  98. package/dist/types/src/components/Thread/ScrollContainer.d.ts +15 -0
  99. package/dist/types/src/components/Thread/ScrollContainer.d.ts.map +1 -0
  100. package/dist/types/src/components/Thread/StatusLine.d.ts +11 -0
  101. package/dist/types/src/components/Thread/StatusLine.d.ts.map +1 -0
  102. package/dist/types/src/components/Thread/StatusLine.stories.d.ts +9 -0
  103. package/dist/types/src/components/Thread/StatusLine.stories.d.ts.map +1 -0
  104. package/dist/types/src/components/Thread/Tabbed.d.ts +9 -0
  105. package/dist/types/src/components/Thread/Tabbed.d.ts.map +1 -0
  106. package/dist/types/src/components/Thread/Tabbed.stories.d.ts +8 -0
  107. package/dist/types/src/components/Thread/Tabbed.stories.d.ts.map +1 -0
  108. package/dist/types/src/components/Thread/Thread.d.ts +6 -9
  109. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  110. package/dist/types/src/components/Thread/Thread.stories.d.ts +2 -4
  111. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/Thread/ThreadMessage.d.ts +12 -0
  113. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -0
  114. package/dist/types/src/components/Thread/ToggleContainer.d.ts +13 -0
  115. package/dist/types/src/components/Thread/ToggleContainer.d.ts.map +1 -0
  116. package/dist/types/src/components/Thread/ToggleContainer.stories.d.ts +9 -0
  117. package/dist/types/src/components/Thread/ToggleContainer.stories.d.ts.map +1 -0
  118. package/dist/types/src/components/index.d.ts +5 -2
  119. package/dist/types/src/components/index.d.ts.map +1 -1
  120. package/dist/types/src/hooks/index.d.ts +1 -0
  121. package/dist/types/src/hooks/index.d.ts.map +1 -1
  122. package/dist/types/src/hooks/processor.d.ts +32 -13
  123. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  124. package/dist/types/src/hooks/useServiceRegistry.d.ts +3 -0
  125. package/dist/types/src/hooks/useServiceRegistry.d.ts.map +1 -0
  126. package/dist/types/src/tools/function.d.ts +5 -0
  127. package/dist/types/src/tools/function.d.ts.map +1 -0
  128. package/dist/types/src/tools/index.d.ts +3 -0
  129. package/dist/types/src/tools/index.d.ts.map +1 -0
  130. package/dist/types/src/tools/openapi.d.ts +10 -0
  131. package/dist/types/src/tools/openapi.d.ts.map +1 -0
  132. package/dist/types/src/tools/openapi.test.d.ts +2 -0
  133. package/dist/types/src/tools/openapi.test.d.ts.map +1 -0
  134. package/dist/types/src/translations.d.ts +9 -6
  135. package/dist/types/src/translations.d.ts.map +1 -1
  136. package/dist/types/src/types/index.d.ts +1 -0
  137. package/dist/types/src/types/index.d.ts.map +1 -1
  138. package/dist/types/src/types/registry.d.ts +9 -0
  139. package/dist/types/src/types/registry.d.ts.map +1 -0
  140. package/dist/types/src/types/schema.d.ts +131 -7
  141. package/dist/types/src/types/schema.d.ts.map +1 -1
  142. package/dist/types/src/types/types.d.ts +2 -2
  143. package/dist/types/src/types/types.d.ts.map +1 -1
  144. package/dist/types/tsconfig.tsbuildinfo +1 -1
  145. package/package.json +54 -49
  146. package/src/AutomationPlugin.tsx +12 -20
  147. package/src/artifacts.stories.tsx +126 -65
  148. package/src/capabilities/ai-client.ts +1 -1
  149. package/src/capabilities/app-graph-builder.ts +31 -2
  150. package/src/capabilities/intent-resolver.ts +14 -9
  151. package/src/capabilities/react-surface.tsx +11 -11
  152. package/src/components/ChatContainer/ChatContainer.tsx +117 -0
  153. package/src/components/ChatContainer/index.ts +8 -0
  154. package/src/components/MarkdownViewer/MarkdownViewer.stories.tsx +56 -0
  155. package/src/components/MarkdownViewer/MarkdownViewer.tsx +79 -0
  156. package/src/components/MarkdownViewer/index.ts +5 -0
  157. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +48 -0
  158. package/src/components/ServiceRegistry/ServiceRegistry.tsx +75 -0
  159. package/src/components/ServiceRegistry/index.ts +5 -0
  160. package/src/components/Thread/ScrollContainer.tsx +92 -0
  161. package/src/components/Thread/StatusLine.stories.tsx +52 -0
  162. package/src/components/Thread/StatusLine.tsx +76 -0
  163. package/src/components/Thread/Tabbed.stories.tsx +52 -0
  164. package/src/components/Thread/Tabbed.tsx +72 -0
  165. package/src/components/Thread/Thread.stories.tsx +145 -97
  166. package/src/components/Thread/Thread.tsx +115 -108
  167. package/src/components/Thread/ThreadMessage.tsx +195 -0
  168. package/src/components/Thread/ToggleContainer.stories.tsx +111 -0
  169. package/src/components/Thread/ToggleContainer.tsx +103 -0
  170. package/src/components/index.ts +4 -1
  171. package/src/hooks/index.ts +2 -0
  172. package/src/hooks/processor.ts +100 -60
  173. package/src/hooks/useServiceRegistry.ts +22 -0
  174. package/src/tools/function.ts +47 -0
  175. package/src/tools/index.ts +6 -0
  176. package/src/tools/openapi.test.ts +227 -0
  177. package/src/tools/openapi.ts +331 -0
  178. package/src/translations.ts +8 -6
  179. package/src/types/index.ts +1 -0
  180. package/src/types/registry.ts +89 -0
  181. package/src/types/schema.ts +78 -3
  182. package/src/types/types.ts +2 -2
  183. package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs +0 -340
  184. package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs.map +0 -7
  185. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs +0 -131
  186. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs.map +0 -7
  187. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs +0 -300
  188. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs.map +0 -7
  189. package/dist/lib/browser/chunk-C3VRGDR6.mjs +0 -75
  190. package/dist/lib/browser/chunk-C3VRGDR6.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-JSNPW6JF.mjs +0 -14
  192. package/dist/lib/browser/chunk-JSNPW6JF.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-KPSDH6XZ.mjs +0 -118
  194. package/dist/lib/browser/chunk-KPSDH6XZ.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-YZF3SDZL.mjs +0 -139
  196. package/dist/lib/browser/chunk-YZF3SDZL.mjs.map +0 -7
  197. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs +0 -24
  198. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs.map +0 -7
  199. package/dist/lib/browser/react-surface-IGMBLSV7.mjs.map +0 -7
  200. package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs +0 -360
  201. package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs.map +0 -7
  202. package/dist/lib/node/AutomationPanel-RXJDVLCF.cjs.map +0 -7
  203. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs +0 -318
  204. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs.map +0 -7
  205. package/dist/lib/node/chunk-BUQOZA4N.cjs +0 -97
  206. package/dist/lib/node/chunk-BUQOZA4N.cjs.map +0 -7
  207. package/dist/lib/node/chunk-DNLBVFR7.cjs +0 -147
  208. package/dist/lib/node/chunk-DNLBVFR7.cjs.map +0 -7
  209. package/dist/lib/node/chunk-TWDGP26W.cjs +0 -172
  210. package/dist/lib/node/chunk-TWDGP26W.cjs.map +0 -7
  211. package/dist/lib/node/chunk-VEGLN4YN.cjs.map +0 -7
  212. package/dist/lib/node/chunk-Z2YFE5SJ.cjs +0 -49
  213. package/dist/lib/node/chunk-Z2YFE5SJ.cjs.map +0 -7
  214. package/dist/lib/node/intent-resolver-TBHYXBDI.cjs.map +0 -7
  215. package/dist/lib/node/react-surface-BVUZMKYS.cjs.map +0 -7
  216. package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs +0 -341
  217. package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs.map +0 -7
  218. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs +0 -132
  219. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs.map +0 -7
  220. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs +0 -301
  221. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs +0 -119
  223. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-JCYVS5GG.mjs +0 -76
  225. package/dist/lib/node-esm/chunk-JCYVS5GG.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs +0 -16
  227. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs +0 -141
  229. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs.map +0 -7
  230. package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs.map +0 -7
  231. package/dist/lib/node-esm/react-surface-77S6XJOM.mjs.map +0 -7
  232. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts +0 -8
  233. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +0 -1
  234. package/dist/types/src/components/AssistantPanel/index.d.ts +0 -3
  235. package/dist/types/src/components/AssistantPanel/index.d.ts.map +0 -1
  236. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts +0 -6
  237. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts.map +0 -1
  238. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  239. package/src/components/AssistantPanel/AssistantPanel.tsx +0 -232
  240. package/src/components/AssistantPanel/index.ts +0 -7
  241. package/src/components/AssistantPanel/system-instructions.ts +0 -166
  242. package/src/components/ChatContainer.tsx +0 -80
@@ -1,232 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- /* eslint-disable no-console */
6
-
7
- import React, { useEffect, useRef, useState } from 'react';
8
-
9
- import { type Message } from '@dxos/artifact';
10
- import { type AIServiceClient, AIServiceClientImpl } from '@dxos/assistant';
11
- import type { ReactiveEchoObject } from '@dxos/echo-db';
12
- import { ObjectId } from '@dxos/echo-schema';
13
- import { SpaceId } from '@dxos/keys';
14
- import { useClient, useConfig } from '@dxos/react-client';
15
- import { ContextMenu, type ThemedClassName } from '@dxos/react-ui';
16
- import { Icon, Input, Toolbar, useTranslation } from '@dxos/react-ui';
17
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
18
- import { mx } from '@dxos/react-ui-theme';
19
-
20
- import { createSystemInstructions } from './system-instructions';
21
- import { AUTOMATION_PLUGIN } from '../../meta';
22
-
23
- const PROPERTIES_ASSISTANT_KEY = 'dxos.assistant.beta.properties';
24
-
25
- export type AssistantPanelProps = ThemedClassName<{
26
- subject?: ReactiveEchoObject<any>;
27
- }>;
28
-
29
- export const AssistantPanel = ({ subject, classNames }: AssistantPanelProps) => {
30
- const { t } = useTranslation(AUTOMATION_PLUGIN);
31
- const config = useConfig();
32
- const client = useClient();
33
- const aiClient = useRef<AIServiceClient>();
34
- const [contextSpaceId, setContextSpaceId] = useState<SpaceId | undefined>();
35
- const [threadId, setThreadId] = useState<ObjectId | undefined>();
36
- const [history, setHistory] = useState<Message[]>([]);
37
- const [input, setInput] = useState('');
38
-
39
- useEffect(() => {
40
- if (!aiClient.current) {
41
- const endpoint = config.values.runtime?.services?.ai?.server;
42
- if (!endpoint) {
43
- throw new Error('AI service endpoint is not configured');
44
- }
45
- aiClient.current = new AIServiceClientImpl({
46
- endpoint,
47
- });
48
- }
49
-
50
- queueMicrotask(async () => {
51
- const properties = client.spaces.default.properties;
52
-
53
- properties[PROPERTIES_ASSISTANT_KEY] ??= {};
54
- properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();
55
- properties[PROPERTIES_ASSISTANT_KEY].threadId ??= ObjectId.random();
56
-
57
- const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;
58
- const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;
59
-
60
- setContextSpaceId(contextSpaceId);
61
- setThreadId(threadId);
62
-
63
- const messages = await aiClient.current!.getMessages(contextSpaceId, threadId);
64
- setHistory(messages);
65
- });
66
- }, []);
67
-
68
- const handleRequest = async (input: string) => {
69
- if (!aiClient.current || input === '') {
70
- return;
71
- }
72
-
73
- setInput('');
74
-
75
- // TODO(dmaretskyi): Can we call `create(Message, { ... })` here?
76
- const userMessage: Message = {
77
- id: ObjectId.random(),
78
- spaceId: contextSpaceId!,
79
- threadId: threadId!,
80
- role: 'user',
81
- content: [{ type: 'text', text: input }],
82
- };
83
- await aiClient.current.appendMessages([userMessage]);
84
- setHistory([...history, userMessage]);
85
-
86
- const generationStream = await aiClient.current.generate({
87
- model: '@anthropic/claude-3-5-sonnet-20241022',
88
- spaceId: contextSpaceId!,
89
- threadId: threadId!,
90
- tools: [],
91
- systemPrompt: await getSystemPrompt(),
92
- });
93
-
94
- const historyBefore = [...history, userMessage];
95
- for await (const _event of generationStream) {
96
- setHistory([...historyBefore, ...generationStream.accumulatedMessages]);
97
- }
98
-
99
- await aiClient.current!.appendMessages(await generationStream.complete());
100
- };
101
-
102
- const getSystemPrompt = async () => {
103
- return createSystemInstructions({ subject });
104
- };
105
-
106
- const clearThread = async () => {
107
- const properties = client.spaces.default.properties;
108
-
109
- properties[PROPERTIES_ASSISTANT_KEY] ??= {};
110
- // properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();
111
- properties[PROPERTIES_ASSISTANT_KEY].threadId = ObjectId.random();
112
-
113
- // const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;
114
- const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;
115
-
116
- // setContextSpaceId(contextSpaceId);
117
- setThreadId(threadId);
118
-
119
- const messages = await aiClient.current!.getMessages(contextSpaceId!, threadId);
120
- setHistory(messages);
121
- };
122
-
123
- // TODO(burdon): Factor out with script plugin.
124
- return (
125
- <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>
126
- {history.length > 0 && (
127
- <div className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>
128
- {history.map((message) => (
129
- <MessageItem key={message.id} message={message} />
130
- ))}
131
- </div>
132
- )}
133
-
134
- <Toolbar.Root classNames='p-1'>
135
- <Input.Root>
136
- <Input.TextInput
137
- autoFocus
138
- placeholder={t('ask me anything')}
139
- value={input}
140
- onChange={(ev) => setInput(ev.target.value)}
141
- onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}
142
- />
143
- </Input.Root>
144
- <ContextMenu.Root>
145
- <ContextMenu.Trigger asChild>
146
- <Toolbar.Button onClick={() => handleRequest(input)}>
147
- <Icon icon='ph--play--regular' size={4} />
148
- </Toolbar.Button>
149
- </ContextMenu.Trigger>
150
- <ContextMenu.Portal>
151
- <ContextMenu.Content>
152
- <ContextMenu.Viewport>
153
- <ContextMenu.Item onClick={clearThread}>Clear thread</ContextMenu.Item>
154
- <ContextMenu.Item onClick={async () => console.log(await getSystemPrompt())}>
155
- Print instructions to console
156
- </ContextMenu.Item>
157
- </ContextMenu.Viewport>
158
- </ContextMenu.Content>
159
- </ContextMenu.Portal>
160
- </ContextMenu.Root>
161
-
162
- {/* <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>
163
- <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />
164
- </Toolbar.Button> */}
165
- </Toolbar.Root>
166
- </div>
167
- );
168
- };
169
-
170
- const MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {
171
- const { id: _, role, content } = message;
172
- const styleContainer = 'flex flex-col overflow-x-hidden overflow-y-auto rounded-md gap-2 divide-y divide-separator';
173
-
174
- return (
175
- <div className={mx('flex', role === 'user' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>
176
- {content.map((content, i) => {
177
- switch (content.type) {
178
- case 'text': {
179
- const { cot, message } = parseMessage(content.text);
180
- return (
181
- <div
182
- key={i}
183
- role='none'
184
- className={mx(
185
- styleContainer,
186
- role === 'user' ? 'bg-primary-400 dark:bg-primary-600' : 'bg-hoverSurface',
187
- )}
188
- >
189
- {cot && <div className='p-2 whitespace-pre-wrap text-xs text-subdued'>{cot}</div>}
190
- <div className='p-2 whitespace-pre-wrap'>{message}</div>
191
- </div>
192
- );
193
- }
194
-
195
- case 'tool_use': {
196
- return (
197
- <div key={i} className={mx(styleContainer, 'text-xs')}>
198
- <div>
199
- <span className='p-2 text-primary'>Tool use</span>: {content.name} {content.id}
200
- </div>
201
- <SyntaxHighlighter language='json'>{content.inputJson}</SyntaxHighlighter>
202
- </div>
203
- );
204
- }
205
-
206
- case 'tool_result': {
207
- return (
208
- <div key={i} className={mx(styleContainer, 'text-xs', content.isError && 'text-error')}>
209
- <div>
210
- <span className='p-2 text-primary'>Tool result</span>: {content.toolUseId}
211
- </div>
212
- <SyntaxHighlighter language='json'>{content.content}</SyntaxHighlighter>
213
- </div>
214
- );
215
- }
216
- }
217
-
218
- return null;
219
- })}
220
- </div>
221
- );
222
- };
223
-
224
- // TODO(burdon): Move to server-side parsing.
225
- const parseMessage = (text: string): { cot?: string; message: string } => {
226
- const regex = /<cot>([\s\S]*?)<\/cot>\s*([\s\S]*)/;
227
- const match = text.match(regex);
228
- return {
229
- cot: match?.[1].trim(),
230
- message: match?.[2] ?? text ?? '\u00D8',
231
- };
232
- };
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { AssistantPanel } from './AssistantPanel';
6
-
7
- export default AssistantPanel;
@@ -1,166 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { asyncTimeout } from '@dxos/async';
6
- import type { ReactiveEchoObject } from '@dxos/echo-db';
7
- import { getTypename } from '@dxos/echo-schema';
8
- import { log } from '@dxos/log';
9
- import { Filter, getSpace, ResultFormat } from '@dxos/react-client/echo';
10
-
11
- // TODO(burdon): Move into assistant-protocol.
12
- export type ThreadContext = {
13
- subject?: ReactiveEchoObject<any>;
14
- };
15
-
16
- export const createSystemInstructions = async (context: ThreadContext): Promise<string> => {
17
- let instructions = `
18
- <instructions>
19
- Before replying always think step-by-step on how to proceed.
20
- Print your thoughts inside <cot> tags.
21
-
22
- <example>
23
- <cot>To answer the question I need to ...</cot>
24
- </example>
25
- </instructions>
26
-
27
- <current_time>${new Date().toLocaleString()}</current_time>
28
- `;
29
-
30
- if (context.subject) {
31
- instructions += `
32
- <user_attention>
33
- The user is currently interacting with an object in Composer application:
34
-
35
- ${await formatContextObject(context.subject)}
36
- </user_attention>
37
- `;
38
- }
39
-
40
- return looseFormatXml(instructions);
41
- };
42
-
43
- const formatContextObject = async (object: ReactiveEchoObject<any>): Promise<string> => {
44
- let data;
45
- try {
46
- data = await asyncTimeout(preprocessContextObject(object), CONTEXT_OBJECT_QUERY_TIMEOUT);
47
- } catch (err: any) {
48
- log.error('Failed to preprocess context object:', { err });
49
- data = object;
50
- }
51
-
52
- if (typeof data === 'string') {
53
- return data;
54
- } else {
55
- return `
56
- <object>
57
- <type>${getTypename(object)}</type>
58
- <id>${object.id}</id>
59
- ${formatObjectAsXMLTags(data)}
60
- </object>
61
- `;
62
- }
63
- };
64
-
65
- const preprocessContextObject = async (object: ReactiveEchoObject<any>): Promise<Record<string, any> | string> => {
66
- const space = getSpace(object);
67
- if (!space) {
68
- return { ...object };
69
- }
70
-
71
- // TODO(dmaretskyi): Serialize based on schema annotations.
72
- switch (getTypename(object)) {
73
- // TODO(dmaretskyi): Reference types somehow without plugin-automation depending on other plugins.
74
- case 'dxos.org/type/Document': {
75
- const data = space.db
76
- .query({ id: object.id }, { format: ResultFormat.Plain, include: { content: true } })
77
- .first() ?? { content: { content: '' } };
78
-
79
- return {
80
- ...data,
81
- threads: undefined,
82
- };
83
- }
84
-
85
- case 'dxos.org/type/Table': {
86
- // TODO(dmaretskyi): Load references.
87
- const schema = object.view ? space?.db.schemaRegistry.getSchema(object.view.query.type) : undefined;
88
- const { objects: rows } =
89
- (schema &&
90
- (await space.db
91
- .query(Filter.schema(schema), { format: ResultFormat.Plain, limit: TABLE_ROWS_LIMIT })
92
- .run())) ??
93
- {};
94
-
95
- // TODO(dmaretskyi): Format table schema.
96
- return `
97
- <object>
98
- <id>${object.id}</id>
99
- <type>${getTypename(object)}</type>
100
- ${formatObjectAsXMLTags(object)}
101
-
102
- <rows>
103
- <!-- Limited to first ${TABLE_ROWS_LIMIT} rows. -->
104
- ${rows
105
- ?.map(
106
- (row: any) => `<row>
107
- ${formatObjectAsXMLTags(row)}
108
- </row>`,
109
- )
110
- .join('\n')}
111
- </rows>
112
-
113
- `;
114
- }
115
-
116
- default:
117
- return { ...object };
118
- }
119
- };
120
-
121
- const formatObjectAsXMLTags = (object: any, depth = 1): string => {
122
- return Object.entries(object)
123
- .filter(([key, value]) => ['string', 'number', 'boolean', 'object'].includes(typeof value))
124
- .map(([key, value]) => {
125
- if (typeof value === 'object' && value !== null) {
126
- if (depth === 0) {
127
- return '';
128
- } else {
129
- return `<${key}>
130
- ${formatObjectAsXMLTags(value, depth - 1)}
131
- </${key}>`;
132
- }
133
- }
134
-
135
- return `<${key}>${value}</${key}>`;
136
- })
137
- .join('\n');
138
- };
139
-
140
- const CONTEXT_OBJECT_QUERY_TIMEOUT = 5_000;
141
-
142
- const TABLE_ROWS_LIMIT = 10;
143
-
144
- /**
145
- * Formats XML indentation for instructions so they are easier to read during debugging.
146
- */
147
- const looseFormatXml = (xml: string): string => {
148
- let currentIndent = 0;
149
-
150
- return xml
151
- .split('\n')
152
- .map((line) => {
153
- if (line.match(RE_CLOSE_TAG_LINE)) {
154
- currentIndent--;
155
- }
156
- const indent = currentIndent;
157
- if (line.match(RE_OPEN_TAG_LINE)) {
158
- currentIndent++;
159
- }
160
- return ' '.repeat(indent * 2) + line.trimStart();
161
- })
162
- .join('\n');
163
- };
164
-
165
- const RE_OPEN_TAG_LINE = /^[ ]*<[a-zA-Z0-9\-_]+>[ ]*$/;
166
- const RE_CLOSE_TAG_LINE = /^[ ]*<\/[a-zA-Z0-9\-_]+>[ ]*$/;
@@ -1,80 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React, { useCallback, useMemo } from 'react';
6
-
7
- import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
8
- import { createSystemPrompt, type Message } from '@dxos/artifact';
9
- import { DXN, QueueSubspaceTags } from '@dxos/keys';
10
- import { getSpace } from '@dxos/react-client/echo';
11
- import { useEdgeClient, useQueue } from '@dxos/react-edge-client';
12
- import { StackItem } from '@dxos/react-ui-stack';
13
-
14
- import { Thread } from './Thread';
15
- import { AutomationCapabilities } from '../capabilities';
16
- import { ChatProcessor } from '../hooks';
17
- import { type GptChatType } from '../types';
18
-
19
- export const ChatContainer = ({ chat, role }: { chat: GptChatType; role: string }) => {
20
- const edgeClient = useEdgeClient();
21
- const { dispatchPromise: dispatch } = useIntentDispatcher();
22
- const space = getSpace(chat);
23
- const aiClient = useCapability(AutomationCapabilities.AiClient);
24
- const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
25
- const globalTools = useCapabilities(Capabilities.Tools);
26
- const tools = useMemo(
27
- () => [...globalTools.flat(), ...artifactDefinitions.flatMap((definition) => definition.tools)],
28
- [globalTools, artifactDefinitions],
29
- );
30
- const systemPrompt = useMemo(
31
- () => createSystemPrompt({ artifacts: artifactDefinitions.map((definition) => definition.instructions) }),
32
- [artifactDefinitions],
33
- );
34
-
35
- // TODO(burdon): Create hook.
36
- // TODO(wittjosiah): Should these be created in the component?
37
- // TODO(zan): Combine with ai service client?
38
- const processor = useMemo(
39
- () =>
40
- new ChatProcessor(
41
- aiClient,
42
- tools,
43
- { space, dispatch },
44
- { model: '@anthropic/claude-3-5-sonnet-20241022', systemPrompt },
45
- ),
46
- [aiClient, tools, space, systemPrompt],
47
- );
48
- // TODO(wittjosiah): Remove transformation.
49
- const queueDxn = useMemo(
50
- () => new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space!.id, chat.queue.dxn.parts.at(-1)!]),
51
- [chat.queue.dxn],
52
- );
53
- const queue = useQueue<Message>(edgeClient, queueDxn);
54
- const messages = useMemo(
55
- () => [...queue.items, ...processor.messages.value],
56
- [queue.items, processor.messages.value],
57
- );
58
-
59
- const handleSubmit = useCallback(
60
- async (message: string) => {
61
- // TODO(burdon): Button to cancel. Otherwise queue request.
62
- if (processor.isStreaming) {
63
- await processor.cancel();
64
- }
65
-
66
- const messages = await processor.request(message, queue.items);
67
- // TODO(burdon): Append on success only? If approved by user? Clinet/server.
68
- await queue.append(messages);
69
- },
70
- [processor, queue],
71
- );
72
-
73
- return (
74
- <StackItem.Content toolbar={false} role={role}>
75
- <Thread messages={messages} streaming={processor.isStreaming.value} onSubmit={handleSubmit} />
76
- </StackItem.Content>
77
- );
78
- };
79
-
80
- export default ChatContainer;