@dxos/plugin-assistant 0.8.1-staging.391c573 → 0.8.1-staging.5be625a

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 (207) hide show
  1. package/dist/lib/browser/{AssistantDialog-CM33SOCT.mjs → AssistantDialog-EIUUSXDS.mjs} +11 -10
  2. package/dist/lib/browser/AssistantDialog-EIUUSXDS.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-VW73VNUY.mjs → ChatContainer-NHHA6CSP.mjs} +5 -5
  4. package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs +78 -0
  5. package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs.map +7 -0
  6. package/dist/lib/browser/ai-client-BAPVMSNX.mjs +35 -0
  7. package/dist/lib/browser/ai-client-BAPVMSNX.mjs.map +7 -0
  8. package/dist/lib/browser/{app-graph-builder-4DIOTGOG.mjs → app-graph-builder-DTCUWBKB.mjs} +57 -6
  9. package/dist/lib/browser/app-graph-builder-DTCUWBKB.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-M2SADJVS.mjs → chunk-25APJ3ZK.mjs} +34 -12
  11. package/dist/lib/browser/chunk-25APJ3ZK.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-EUMPBC4T.mjs → chunk-6FTPLBSC.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-NV7SVHMV.mjs → chunk-AF7VQAKS.mjs} +1 -1
  14. package/dist/lib/browser/{chunk-NV7SVHMV.mjs.map → chunk-AF7VQAKS.mjs.map} +2 -2
  15. package/dist/lib/browser/{chunk-WVME6K4X.mjs → chunk-KGIACFAX.mjs} +333 -205
  16. package/dist/lib/browser/chunk-KGIACFAX.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-NTLTGYYS.mjs → chunk-SVUCJXGN.mjs} +2 -2
  18. package/dist/lib/browser/chunk-SVUCJXGN.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-FPXC3LKK.mjs → chunk-X6ALDUA5.mjs} +25 -3
  20. package/dist/lib/browser/{chunk-FPXC3LKK.mjs.map → chunk-X6ALDUA5.mjs.map} +3 -3
  21. package/dist/lib/browser/index.mjs +25 -27
  22. package/dist/lib/browser/index.mjs.map +3 -3
  23. package/dist/lib/browser/{intent-resolver-FQRN6747.mjs → intent-resolver-U57FXP3I.mjs} +6 -3
  24. package/dist/lib/browser/{intent-resolver-FQRN6747.mjs.map → intent-resolver-U57FXP3I.mjs.map} +3 -3
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/{react-surface-ZT6EQ7FJ.mjs → react-surface-YNN5NYJW.mjs} +10 -9
  27. package/dist/lib/browser/react-surface-YNN5NYJW.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-VVQUGG56.mjs → settings-VAW6UWFL.mjs} +3 -3
  29. package/dist/lib/browser/types/index.mjs +6 -2
  30. package/dist/lib/node/{AssistantDialog-5PVOCPE2.cjs → AssistantDialog-GT7R7MKH.cjs} +17 -16
  31. package/dist/lib/node/AssistantDialog-GT7R7MKH.cjs.map +7 -0
  32. package/dist/lib/node/{ChatContainer-I45I3ICI.cjs → ChatContainer-JUZOEZZ7.cjs} +10 -10
  33. package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs +104 -0
  34. package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs.map +7 -0
  35. package/dist/lib/node/{ai-client-6CY35ZIR.cjs → ai-client-5ESLYXAV.cjs} +19 -8
  36. package/dist/lib/node/ai-client-5ESLYXAV.cjs.map +7 -0
  37. package/dist/lib/node/{app-graph-builder-7O4U4RXH.cjs → app-graph-builder-3P6WSON2.cjs} +63 -13
  38. package/dist/lib/node/app-graph-builder-3P6WSON2.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-HFOUAFOW.cjs → chunk-G2HY3UJ4.cjs} +40 -18
  40. package/dist/lib/node/chunk-G2HY3UJ4.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-JWUHUQ56.cjs → chunk-JAB6KLPP.cjs} +334 -210
  42. package/dist/lib/node/chunk-JAB6KLPP.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-34WE2FD2.cjs → chunk-KLSNCP34.cjs} +31 -7
  44. package/dist/lib/node/chunk-KLSNCP34.cjs.map +7 -0
  45. package/dist/lib/node/{chunk-NV4TQQSU.cjs → chunk-N3SW6DJ6.cjs} +6 -6
  46. package/dist/lib/node/{chunk-GNPXCHFT.cjs → chunk-U6J2GO7I.cjs} +4 -4
  47. package/dist/lib/node/{chunk-GNPXCHFT.cjs.map → chunk-U6J2GO7I.cjs.map} +2 -2
  48. package/dist/lib/node/{chunk-3WXG6WA6.cjs → chunk-VRXFIS4X.cjs} +6 -6
  49. package/dist/lib/node/chunk-VRXFIS4X.cjs.map +7 -0
  50. package/dist/lib/node/index.cjs +75 -77
  51. package/dist/lib/node/index.cjs.map +3 -3
  52. package/dist/lib/node/{intent-resolver-Z37RNNMC.cjs → intent-resolver-YIFAMM3B.cjs} +13 -10
  53. package/dist/lib/node/{intent-resolver-Z37RNNMC.cjs.map → intent-resolver-YIFAMM3B.cjs.map} +3 -3
  54. package/dist/lib/node/meta.json +1 -1
  55. package/dist/lib/node/{react-surface-KFXP3GGK.cjs → react-surface-IDGIN55C.cjs} +25 -24
  56. package/dist/lib/node/react-surface-IDGIN55C.cjs.map +7 -0
  57. package/dist/lib/node/{settings-TJHHVI6B.cjs → settings-2FEYGLYU.cjs} +8 -8
  58. package/dist/lib/node/types/index.cjs +15 -11
  59. package/dist/lib/node/types/index.cjs.map +2 -2
  60. package/dist/lib/node-esm/{AssistantDialog-Q2ZBOHOV.mjs → AssistantDialog-JMBFM6QH.mjs} +11 -10
  61. package/dist/lib/node-esm/AssistantDialog-JMBFM6QH.mjs.map +7 -0
  62. package/dist/lib/node-esm/{ChatContainer-5ULBF3GW.mjs → ChatContainer-ZNN5CMVL.mjs} +5 -5
  63. package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs +79 -0
  64. package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs.map +7 -0
  65. package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs +36 -0
  66. package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs.map +7 -0
  67. package/dist/lib/node-esm/{app-graph-builder-SX3SREXF.mjs → app-graph-builder-PMAQLTTN.mjs} +57 -6
  68. package/dist/lib/node-esm/app-graph-builder-PMAQLTTN.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-ICQN3TDS.mjs → chunk-2CIYX3SD.mjs} +2 -2
  70. package/dist/lib/node-esm/chunk-2CIYX3SD.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs → chunk-J63VQFQO.mjs} +2 -2
  72. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs → chunk-N6BVC2C2.mjs} +1 -1
  73. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs.map → chunk-N6BVC2C2.mjs.map} +2 -2
  74. package/dist/lib/node-esm/{chunk-LELXJPGJ.mjs → chunk-NMMRHHAR.mjs} +25 -3
  75. package/dist/lib/node-esm/{chunk-LELXJPGJ.mjs.map → chunk-NMMRHHAR.mjs.map} +3 -3
  76. package/dist/lib/node-esm/{chunk-ASMI7PQ2.mjs → chunk-PK5JCOYB.mjs} +333 -205
  77. package/dist/lib/node-esm/chunk-PK5JCOYB.mjs.map +7 -0
  78. package/dist/lib/node-esm/{chunk-2OUUYMBT.mjs → chunk-SMUINDXQ.mjs} +34 -12
  79. package/dist/lib/node-esm/chunk-SMUINDXQ.mjs.map +7 -0
  80. package/dist/lib/node-esm/index.mjs +25 -27
  81. package/dist/lib/node-esm/index.mjs.map +3 -3
  82. package/dist/lib/node-esm/{intent-resolver-LOTXWV4J.mjs → intent-resolver-SQ4HLL5L.mjs} +6 -3
  83. package/dist/lib/node-esm/{intent-resolver-LOTXWV4J.mjs.map → intent-resolver-SQ4HLL5L.mjs.map} +3 -3
  84. package/dist/lib/node-esm/meta.json +1 -1
  85. package/dist/lib/node-esm/{react-surface-NZNNP2QI.mjs → react-surface-424JZTZ4.mjs} +10 -9
  86. package/dist/lib/node-esm/react-surface-424JZTZ4.mjs.map +7 -0
  87. package/dist/lib/node-esm/{settings-BVWR244C.mjs → settings-VHR5KT4J.mjs} +3 -3
  88. package/dist/lib/node-esm/types/index.mjs +6 -2
  89. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/ai-client.d.ts +2 -1
  91. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/capabilities.d.ts +2 -1
  94. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/index.d.ts +1 -1
  96. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  98. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +4 -3
  99. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/AssistantDialog.d.ts.map +1 -1
  101. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  102. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -0
  103. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  104. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +1 -0
  105. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/Prompt/PromptBar.d.ts +2 -2
  107. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  108. package/dist/types/src/components/Prompt/references.d.ts +30 -0
  109. package/dist/types/src/components/Prompt/references.d.ts.map +1 -0
  110. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  111. package/dist/types/src/components/Thread/Thread.d.ts +11 -1
  112. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  113. package/dist/types/src/components/Thread/ThreadContainer.d.ts +1 -0
  114. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  115. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  117. package/dist/types/src/hooks/email.d.ts.map +1 -1
  118. package/dist/types/src/hooks/index.d.ts +1 -0
  119. package/dist/types/src/hooks/index.d.ts.map +1 -1
  120. package/dist/types/src/hooks/processor.d.ts +7 -15
  121. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  122. package/dist/types/src/hooks/useChatProcessor.d.ts +9 -2
  123. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  124. package/dist/types/src/hooks/useContextProvider.d.ts +17 -0
  125. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useMessageQueue.d.ts +4 -4
  127. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  128. package/dist/types/src/meta.d.ts +2 -8
  129. package/dist/types/src/meta.d.ts.map +1 -1
  130. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  131. package/dist/types/src/translations.d.ts +23 -12
  132. package/dist/types/src/translations.d.ts.map +1 -1
  133. package/dist/types/src/types/template.d.ts +36 -0
  134. package/dist/types/src/types/template.d.ts.map +1 -1
  135. package/dist/types/src/types/types.d.ts +3 -1
  136. package/dist/types/src/types/types.d.ts.map +1 -1
  137. package/package.json +56 -55
  138. package/src/AssistantPlugin.tsx +11 -4
  139. package/src/capabilities/ai-client.ts +23 -5
  140. package/src/capabilities/app-graph-builder.ts +48 -2
  141. package/src/capabilities/capabilities.ts +3 -1
  142. package/src/capabilities/intent-resolver.ts +1 -1
  143. package/src/capabilities/react-surface.tsx +3 -2
  144. package/src/components/AmbientDialog/AmbientDialog.tsx +11 -11
  145. package/src/components/AssistantDialog.tsx +7 -1
  146. package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
  147. package/src/components/Prompt/Prompt.stories.tsx +34 -0
  148. package/src/components/Prompt/Prompt.tsx +28 -18
  149. package/src/components/Prompt/PromptBar.tsx +3 -1
  150. package/src/components/Prompt/references.ts +180 -0
  151. package/src/components/TemplateContainer.tsx +79 -4
  152. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
  153. package/src/components/TemplateEditor/TemplateForm.stories.tsx +1 -1
  154. package/src/components/Thread/Thread.tsx +21 -0
  155. package/src/components/Thread/ThreadContainer.stories.tsx +5 -10
  156. package/src/components/Thread/ThreadContainer.tsx +7 -4
  157. package/src/components/Thread/ThreadMessage.tsx +17 -9
  158. package/src/hooks/email.ts +3 -3
  159. package/src/hooks/index.ts +1 -0
  160. package/src/hooks/processor.ts +57 -116
  161. package/src/hooks/useChatProcessor.tsx +24 -16
  162. package/src/hooks/useContextProvider.ts +55 -0
  163. package/src/hooks/useMessageQueue.ts +2 -4
  164. package/src/meta.ts +2 -2
  165. package/src/testing/test-functions.ts +2 -2
  166. package/src/translations.ts +10 -5
  167. package/src/types/template.ts +22 -0
  168. package/src/types/types.ts +3 -1
  169. package/dist/lib/browser/AssistantDialog-CM33SOCT.mjs.map +0 -7
  170. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs +0 -23
  171. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs.map +0 -7
  172. package/dist/lib/browser/ai-client-HZPB7E6M.mjs +0 -22
  173. package/dist/lib/browser/ai-client-HZPB7E6M.mjs.map +0 -7
  174. package/dist/lib/browser/app-graph-builder-4DIOTGOG.mjs.map +0 -7
  175. package/dist/lib/browser/chunk-M2SADJVS.mjs.map +0 -7
  176. package/dist/lib/browser/chunk-NTLTGYYS.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-WVME6K4X.mjs.map +0 -7
  178. package/dist/lib/browser/react-surface-ZT6EQ7FJ.mjs.map +0 -7
  179. package/dist/lib/node/AssistantDialog-5PVOCPE2.cjs.map +0 -7
  180. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs +0 -53
  181. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs.map +0 -7
  182. package/dist/lib/node/ai-client-6CY35ZIR.cjs.map +0 -7
  183. package/dist/lib/node/app-graph-builder-7O4U4RXH.cjs.map +0 -7
  184. package/dist/lib/node/chunk-34WE2FD2.cjs.map +0 -7
  185. package/dist/lib/node/chunk-3WXG6WA6.cjs.map +0 -7
  186. package/dist/lib/node/chunk-HFOUAFOW.cjs.map +0 -7
  187. package/dist/lib/node/chunk-JWUHUQ56.cjs.map +0 -7
  188. package/dist/lib/node/react-surface-KFXP3GGK.cjs.map +0 -7
  189. package/dist/lib/node-esm/AssistantDialog-Q2ZBOHOV.mjs.map +0 -7
  190. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs +0 -24
  191. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs.map +0 -7
  192. package/dist/lib/node-esm/ai-client-GSA67EIB.mjs +0 -23
  193. package/dist/lib/node-esm/ai-client-GSA67EIB.mjs.map +0 -7
  194. package/dist/lib/node-esm/app-graph-builder-SX3SREXF.mjs.map +0 -7
  195. package/dist/lib/node-esm/chunk-2OUUYMBT.mjs.map +0 -7
  196. package/dist/lib/node-esm/chunk-ASMI7PQ2.mjs.map +0 -7
  197. package/dist/lib/node-esm/chunk-ICQN3TDS.mjs.map +0 -7
  198. package/dist/lib/node-esm/react-surface-NZNNP2QI.mjs.map +0 -7
  199. /package/dist/lib/browser/{ChatContainer-VW73VNUY.mjs.map → ChatContainer-NHHA6CSP.mjs.map} +0 -0
  200. /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-6FTPLBSC.mjs.map} +0 -0
  201. /package/dist/lib/browser/{settings-VVQUGG56.mjs.map → settings-VAW6UWFL.mjs.map} +0 -0
  202. /package/dist/lib/node/{ChatContainer-I45I3ICI.cjs.map → ChatContainer-JUZOEZZ7.cjs.map} +0 -0
  203. /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-N3SW6DJ6.cjs.map} +0 -0
  204. /package/dist/lib/node/{settings-TJHHVI6B.cjs.map → settings-2FEYGLYU.cjs.map} +0 -0
  205. /package/dist/lib/node-esm/{ChatContainer-5ULBF3GW.mjs.map → ChatContainer-ZNN5CMVL.mjs.map} +0 -0
  206. /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-J63VQFQO.mjs.map} +0 -0
  207. /package/dist/lib/node-esm/{settings-BVWR244C.mjs.map → settings-VHR5KT4J.mjs.map} +0 -0
@@ -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, ButtonGroup, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
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 key={idx} classNames={classNames} user={block.type === 'text' && role === 'user'}>
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
- <ButtonGroup>
144
- {options.map((option) => (
145
- <Button key={option} onClick={() => onPrompt?.(option)}>
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
- </ButtonGroup>
157
+ </div>
150
158
  );
151
159
  }
152
160
 
@@ -6,8 +6,8 @@ import { findObjectWithForeignKey } from '@dxos/echo-db';
6
6
  import { foreignKey } from '@dxos/echo-schema';
7
7
  import { log } from '@dxos/log';
8
8
  import { MailboxType } from '@dxos/plugin-inbox/types';
9
- import { MessageType } from '@dxos/plugin-space/types';
10
9
  import { type Space, Filter, create, makeRef } from '@dxos/react-client/echo';
10
+ import { MessageType } from '@dxos/schema';
11
11
 
12
12
  export const SOURCE_ID = 'hub.dxos.network/api/mailbox';
13
13
 
@@ -29,8 +29,8 @@ export const handleEmail = async (space: Space, data: any) => {
29
29
  MessageType,
30
30
  {
31
31
  sender: { email: message.from },
32
- timestamp: new Date(message.created).toISOString(),
33
- text: message.body,
32
+ created: new Date(message.created).toISOString(),
33
+ blocks: [{ type: 'text', text: message.body }],
34
34
  properties: {
35
35
  subject: message.subject,
36
36
  to: [{ email: message.to }],
@@ -9,3 +9,4 @@ export * from './useLocalTriggerManager';
9
9
  export * from './useMessageQueue';
10
10
  export * from './useServices';
11
11
  export * from './useTextInputEvents';
12
+ export * from './useContextProvider';
@@ -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 Tool, Message, type MessageContentBlock } from '@dxos/artifact';
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: DEFAULT_LLM_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
- /** Prior history from queue. */
63
- private _history: Message[] = [];
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
- batch(() => {
132
- this._history = options.history ?? [];
133
- this._pending.value = [
134
- createStatic(Message, {
135
- role: 'user',
136
- content: [{ type: 'text', text: message }],
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
- await this._request();
143
- options.onComplete?.(this._pending.value);
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
+ extensions: this._extensions,
131
+ generationOptions: {
132
+ model: this._options.model,
133
+ systemPrompt: this._options.systemPrompt,
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._stream?.abort();
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): Refactor.
235
- export class AIServiecOverloadedError extends Error {
175
+ // TODO(wittjosiah): Move to ai-service-client.
176
+ export class AIServiceOverloadedError extends Error {
236
177
  code = 'AI_SERVICE_OVERLOADED';
237
178
  }
@@ -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 { DEFAULT_LLM_MODEL } from '@dxos/assistant';
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
+ };
20
27
 
21
28
  /**
22
29
  * Configure and create ChatProcessor.
23
30
  */
24
- export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProps): ChatProcessor => {
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,19 +48,19 @@ 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 = [
47
55
  ...globalTools.flat(),
48
- ...artifactDefinitions.flatMap((definition) => definition.tools),
49
56
  ...serviceTools,
50
57
  ...functions
51
58
  .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
52
59
  .filter(isNonNullable),
53
60
  ];
54
- const extensions = { space, dispatch };
61
+ const extensions = { space, dispatch, pivotId: chatId, part };
55
62
  return [tools, extensions];
56
- }, [dispatch, globalTools, artifactDefinitions, space, serviceTools, functions]);
63
+ }, [dispatch, globalTools, space, chatId, serviceTools, functions]);
57
64
 
58
65
  // Prompt.
59
66
  const systemPrompt = useMemo(
@@ -64,17 +71,18 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
64
71
  [artifactDefinitions],
65
72
  );
66
73
 
74
+ // TODO(burdon): Remove default (let backend decide if not specified).
75
+ const model: ChatProcessorOptions['model'] =
76
+ settings?.llmProvider === 'ollama'
77
+ ? ((settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL) as ChatProcessorOptions['model'])
78
+ : ((settings?.edgeModel ?? DEFAULT_EDGE_MODEL) as ChatProcessorOptions['model']);
79
+
67
80
  // Create processor.
68
- // TODO(burdon): Updated on each query update above. Should just update current processor.
81
+ // TODO(burdon): Updated on each query update above; should just update current processor.
69
82
  const processor = useMemo(() => {
70
83
  log('creating processor...', { settings });
71
- return new ChatProcessor(aiClient, tools, extensions, {
72
- // TODO(burdon): Remove defualt (let backend decide if not specified).
73
- model: settings?.llmModel ?? DEFAULT_LLM_MODEL,
74
- // TOOD(burdon): Query.
75
- systemPrompt,
76
- });
77
- }, [aiClient, tools, extensions, systemPrompt, settings?.llmModel]);
84
+ return new ChatProcessor(aiClient.value, tools, artifactDefinitions, extensions, { model, systemPrompt });
85
+ }, [aiClient.value, tools, extensions, model, systemPrompt]);
78
86
 
79
87
  return processor;
80
88
  };
@@ -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,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
- const edgeClient = useEdgeClient();
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
- } satisfies PluginMeta;
18
+ };
@@ -3,9 +3,9 @@
3
3
  //
4
4
 
5
5
  import { createSystemPrompt } from '@dxos/artifact';
6
- import { DEFAULT_LLM_MODEL, type GenerateRequest } from '@dxos/assistant';
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: DEFAULT_LLM_MODEL,
9
+ model: DEFAULT_EDGE_MODEL,
10
10
  systemPrompt: createSystemPrompt({ artifacts }),
11
11
  });
@@ -10,13 +10,14 @@ 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
- 'chat title placeholder': 'AI Chat',
19
- 'template title placeholder': 'Template',
20
+ 'templates label': 'Templates',
20
21
 
21
22
  'open ambient chat label': 'Open AI chat',
22
23
  'plugin name': 'Assistant',
@@ -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 custom prompts label': 'Custom prompts',
44
- 'settings llm model label': 'LLM model',
45
- 'settings default llm model label': 'Default Model',
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
  },
@@ -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),
@@ -33,7 +33,9 @@ export namespace AssistantAction {
33
33
 
34
34
  export const AssistantSettingsSchema = S.mutable(
35
35
  S.Struct({
36
- llmModel: S.optional(S.String),
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": "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",
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,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