@dxos/plugin-assistant 0.8.2-staging.7ac8446 → 0.8.3-main.672df60

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 (365) hide show
  1. package/dist/lib/browser/AssistantDialog-UAZSN6GT.mjs +46 -0
  2. package/dist/lib/browser/AssistantDialog-UAZSN6GT.mjs.map +7 -0
  3. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs +45 -0
  4. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-UTN3AO5U.mjs +39 -0
  6. package/dist/lib/browser/ChatContainer-UTN3AO5U.mjs.map +7 -0
  7. package/dist/lib/browser/TemplateContainer-AKUYL4AV.mjs +28 -0
  8. package/dist/lib/browser/TemplateContainer-AKUYL4AV.mjs.map +7 -0
  9. package/dist/lib/browser/{ai-client-CDZLSNXE.mjs → ai-client-COXVUC6V.mjs} +6 -6
  10. package/dist/lib/browser/ai-client-COXVUC6V.mjs.map +7 -0
  11. package/dist/lib/browser/app-graph-builder-56OZ5RW4.mjs +206 -0
  12. package/dist/lib/browser/app-graph-builder-56OZ5RW4.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-TXJWGWJ7.mjs → chunk-3F44MBHU.mjs} +3 -3
  14. package/dist/lib/browser/chunk-3F44MBHU.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-6SD7S7W5.mjs +157 -0
  16. package/dist/lib/browser/chunk-6SD7S7W5.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-JQFUME3B.mjs +87 -0
  18. package/dist/lib/{node-esm/chunk-PBZA7XJR.mjs.map → browser/chunk-JQFUME3B.mjs.map} +1 -1
  19. package/dist/lib/browser/chunk-NBSPGIHL.mjs +206 -0
  20. package/dist/lib/browser/chunk-NBSPGIHL.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs +96 -0
  22. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-FMB7RGMP.mjs → chunk-Q6XE3O3E.mjs} +1714 -1536
  24. package/dist/lib/browser/chunk-Q6XE3O3E.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-3HCI5FIL.mjs → chunk-XOZ7YMO3.mjs} +3 -3
  26. package/dist/lib/browser/{chunk-3HCI5FIL.mjs.map → chunk-XOZ7YMO3.mjs.map} +1 -1
  27. package/dist/lib/browser/index.mjs +47 -23
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/intent-resolver-GWELYIX2.mjs +39 -0
  30. package/dist/lib/browser/intent-resolver-GWELYIX2.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/react-surface-DGS34EON.mjs +144 -0
  33. package/dist/lib/browser/react-surface-DGS34EON.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-U6UFQX32.mjs → settings-BTFB7IQ6.mjs} +5 -5
  35. package/dist/lib/browser/settings-BTFB7IQ6.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +6 -2
  37. package/dist/lib/node/AssistantDialog-RTB5Q7FP.cjs +72 -0
  38. package/dist/lib/node/AssistantDialog-RTB5Q7FP.cjs.map +7 -0
  39. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs +72 -0
  40. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs.map +7 -0
  41. package/dist/lib/node/{ChatContainer-ZJ5JXF6A.cjs → ChatContainer-P3JL4VZ7.cjs} +25 -19
  42. package/dist/lib/node/ChatContainer-P3JL4VZ7.cjs.map +7 -0
  43. package/dist/lib/node/TemplateContainer-CTG2MB4W.cjs +58 -0
  44. package/dist/lib/node/TemplateContainer-CTG2MB4W.cjs.map +7 -0
  45. package/dist/lib/node/{ai-client-URCCYU6B.cjs → ai-client-R2CGEYZW.cjs} +13 -13
  46. package/dist/lib/node/ai-client-R2CGEYZW.cjs.map +7 -0
  47. package/dist/lib/node/app-graph-builder-QLF353LH.cjs +216 -0
  48. package/dist/lib/node/app-graph-builder-QLF353LH.cjs.map +7 -0
  49. package/dist/lib/node/{chunk-XI2ARIEO.cjs → chunk-4EEWTDQK.cjs} +45 -39
  50. package/dist/lib/node/{chunk-XI2ARIEO.cjs.map → chunk-4EEWTDQK.cjs.map} +1 -1
  51. package/dist/lib/node/chunk-BWL5A3O5.cjs +184 -0
  52. package/dist/lib/node/chunk-BWL5A3O5.cjs.map +7 -0
  53. package/dist/lib/node/chunk-HRNIUYVQ.cjs +128 -0
  54. package/dist/lib/node/chunk-HRNIUYVQ.cjs.map +7 -0
  55. package/dist/lib/node/{chunk-Q5XWEMHB.cjs → chunk-P74TWGMG.cjs} +6 -6
  56. package/dist/lib/node/{chunk-Q5XWEMHB.cjs.map → chunk-P74TWGMG.cjs.map} +1 -1
  57. package/dist/lib/node/{chunk-RPBKMP2E.cjs → chunk-PG7YNQ4R.cjs} +1523 -1338
  58. package/dist/lib/node/chunk-PG7YNQ4R.cjs.map +7 -0
  59. package/dist/lib/node/{chunk-GBUNQ257.cjs → chunk-TS3H5OSX.cjs} +7 -7
  60. package/dist/lib/node/chunk-TS3H5OSX.cjs.map +7 -0
  61. package/dist/lib/node/chunk-UNVDZOLA.cjs +231 -0
  62. package/dist/lib/node/chunk-UNVDZOLA.cjs.map +7 -0
  63. package/dist/lib/node/index.cjs +88 -65
  64. package/dist/lib/node/index.cjs.map +3 -3
  65. package/dist/lib/node/{intent-resolver-R3OSTIMH.cjs → intent-resolver-U7663JU7.cjs} +15 -21
  66. package/dist/lib/node/intent-resolver-U7663JU7.cjs.map +7 -0
  67. package/dist/lib/node/meta.json +1 -1
  68. package/dist/lib/node/react-surface-QXZTILW6.cjs +157 -0
  69. package/dist/lib/node/react-surface-QXZTILW6.cjs.map +7 -0
  70. package/dist/lib/node/{settings-TXGRCYAL.cjs → settings-LBJMT6YB.cjs} +9 -9
  71. package/dist/lib/node/settings-LBJMT6YB.cjs.map +7 -0
  72. package/dist/lib/node/types/index.cjs +17 -13
  73. package/dist/lib/node/types/index.cjs.map +2 -2
  74. package/dist/lib/node-esm/AssistantDialog-DONAO6SA.mjs +47 -0
  75. package/dist/lib/node-esm/AssistantDialog-DONAO6SA.mjs.map +7 -0
  76. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs +47 -0
  77. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs.map +7 -0
  78. package/dist/lib/node-esm/ChatContainer-FVIGCDIG.mjs +40 -0
  79. package/dist/lib/node-esm/ChatContainer-FVIGCDIG.mjs.map +7 -0
  80. package/dist/lib/node-esm/TemplateContainer-IVDQ4XQG.mjs +29 -0
  81. package/dist/lib/node-esm/TemplateContainer-IVDQ4XQG.mjs.map +7 -0
  82. package/dist/lib/node-esm/{ai-client-WMHS5EGV.mjs → ai-client-I5LXHMOZ.mjs} +6 -6
  83. package/dist/lib/node-esm/ai-client-I5LXHMOZ.mjs.map +7 -0
  84. package/dist/lib/node-esm/app-graph-builder-5YX5TKKT.mjs +207 -0
  85. package/dist/lib/node-esm/app-graph-builder-5YX5TKKT.mjs.map +7 -0
  86. package/dist/lib/node-esm/{chunk-ECRK6TUQ.mjs → chunk-BB2TAT4P.mjs} +3 -3
  87. package/dist/lib/node-esm/{chunk-ECRK6TUQ.mjs.map → chunk-BB2TAT4P.mjs.map} +1 -1
  88. package/dist/lib/node-esm/chunk-CDAILLCU.mjs +98 -0
  89. package/dist/lib/node-esm/chunk-CDAILLCU.mjs.map +7 -0
  90. package/dist/lib/node-esm/chunk-GJE4WCUJ.mjs +158 -0
  91. package/dist/lib/node-esm/chunk-GJE4WCUJ.mjs.map +7 -0
  92. package/dist/lib/node-esm/{chunk-6JK5HEUQ.mjs → chunk-HLPGKJ7N.mjs} +3 -3
  93. package/dist/lib/node-esm/chunk-HLPGKJ7N.mjs.map +7 -0
  94. package/dist/lib/node-esm/{chunk-MVDAY3CZ.mjs → chunk-MNH6E6EB.mjs} +1714 -1536
  95. package/dist/lib/node-esm/chunk-MNH6E6EB.mjs.map +7 -0
  96. package/dist/lib/node-esm/{chunk-PBZA7XJR.mjs → chunk-OYN6HLXZ.mjs} +42 -36
  97. package/dist/lib/{browser/chunk-NFUHCW2J.mjs.map → node-esm/chunk-OYN6HLXZ.mjs.map} +1 -1
  98. package/dist/lib/node-esm/chunk-TQYSF2GS.mjs +207 -0
  99. package/dist/lib/node-esm/chunk-TQYSF2GS.mjs.map +7 -0
  100. package/dist/lib/node-esm/index.mjs +47 -23
  101. package/dist/lib/node-esm/index.mjs.map +3 -3
  102. package/dist/lib/node-esm/intent-resolver-N5TM3RTL.mjs +40 -0
  103. package/dist/lib/node-esm/intent-resolver-N5TM3RTL.mjs.map +7 -0
  104. package/dist/lib/node-esm/meta.json +1 -1
  105. package/dist/lib/node-esm/react-surface-FTKGQQD2.mjs +145 -0
  106. package/dist/lib/node-esm/react-surface-FTKGQQD2.mjs.map +7 -0
  107. package/dist/lib/node-esm/{settings-DZU5PNXM.mjs → settings-TGCCAH5D.mjs} +5 -5
  108. package/dist/lib/node-esm/settings-TGCCAH5D.mjs.map +7 -0
  109. package/dist/lib/node-esm/types/index.mjs +6 -2
  110. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/ai-client.d.ts +3 -3
  112. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -179
  114. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  116. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/index.d.ts +3 -179
  118. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  121. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +3 -1
  122. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
  123. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  124. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts +8 -0
  125. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts.map +1 -0
  126. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts +8 -0
  127. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/BlueprintEditor/index.d.ts +3 -0
  129. package/dist/types/src/components/BlueprintEditor/index.d.ts.map +1 -0
  130. package/dist/types/src/components/ChatContainer.d.ts +4 -3
  131. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  132. package/dist/types/src/components/Prompt/Prompt.d.ts +5 -2
  133. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  134. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +6 -3
  135. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/Prompt/PromptBar.d.ts +9 -4
  137. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  138. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts +9 -0
  139. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts.map +1 -0
  140. package/dist/types/src/components/Prompt/autocomplete.d.ts +5 -1
  141. package/dist/types/src/components/Prompt/autocomplete.d.ts.map +1 -1
  142. package/dist/types/src/components/Prompt/references.d.ts.map +1 -1
  143. package/dist/types/src/components/PromptSettings.d.ts +6 -0
  144. package/dist/types/src/components/PromptSettings.d.ts.map +1 -0
  145. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  146. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  147. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -2
  149. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  150. package/dist/types/src/components/Thread/Thread.d.ts +2 -2
  151. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  152. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Thread/ThreadContainer.d.ts +1 -1
  154. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  155. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +2 -2
  156. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/Thread/ThreadMessage.d.ts +4 -2
  158. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  159. package/dist/types/src/components/Thread/ToolInvocations.d.ts +1 -1
  160. package/dist/types/src/components/Thread/ToolInvocations.d.ts.map +1 -1
  161. package/dist/types/src/components/Thread/reducer.d.ts +1 -1
  162. package/dist/types/src/components/Thread/reducer.d.ts.map +1 -1
  163. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -2
  164. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  165. package/dist/types/src/components/index.d.ts +5 -6
  166. package/dist/types/src/components/index.d.ts.map +1 -1
  167. package/dist/types/src/experimental/transcription/index.d.ts +1 -0
  168. package/dist/types/src/experimental/transcription/index.d.ts.map +1 -0
  169. package/dist/types/src/hooks/index.d.ts +0 -1
  170. package/dist/types/src/hooks/index.d.ts.map +1 -1
  171. package/dist/types/src/hooks/processor.d.ts +6 -5
  172. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useContextProvider.d.ts +1 -1
  175. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -1
  176. package/dist/types/src/hooks/useMessageQueue.d.ts +11 -10
  177. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useServices.d.ts.map +1 -1
  179. package/dist/types/src/hooks/useTextInputEvents.d.ts.map +1 -1
  180. package/dist/types/src/parser/filter-generator.d.ts +4 -0
  181. package/dist/types/src/parser/filter-generator.d.ts.map +1 -0
  182. package/dist/types/src/parser/filter-generator.test.d.ts +2 -0
  183. package/dist/types/src/parser/filter-generator.test.d.ts.map +1 -0
  184. package/dist/types/src/parser/index.d.ts +4 -0
  185. package/dist/types/src/parser/index.d.ts.map +1 -0
  186. package/dist/types/src/parser/query-parser.d.ts +15 -0
  187. package/dist/types/src/parser/query-parser.d.ts.map +1 -0
  188. package/dist/types/src/parser/query-parser.test.d.ts +2 -0
  189. package/dist/types/src/parser/query-parser.test.d.ts.map +1 -0
  190. package/dist/types/src/parser/types.d.ts +24 -0
  191. package/dist/types/src/parser/types.d.ts.map +1 -0
  192. package/dist/types/src/stories/Prompt.stories.d.ts +8 -0
  193. package/dist/types/src/stories/Prompt.stories.d.ts.map +1 -0
  194. package/dist/types/src/stories/Query.stories.d.ts +19 -0
  195. package/dist/types/src/stories/Query.stories.d.ts.map +1 -0
  196. package/dist/types/src/stories/Research.stories.d.ts +15 -0
  197. package/dist/types/src/stories/Research.stories.d.ts.map +1 -0
  198. package/dist/types/src/stories/test-data.d.ts +3 -0
  199. package/dist/types/src/stories/test-data.d.ts.map +1 -0
  200. package/dist/types/src/stories/testing.d.ts +12 -0
  201. package/dist/types/src/stories/testing.d.ts.map +1 -0
  202. package/dist/types/src/testing/index.d.ts +1 -0
  203. package/dist/types/src/testing/index.d.ts.map +1 -1
  204. package/dist/types/src/testing/test-blueprint.d.ts +14 -0
  205. package/dist/types/src/testing/test-blueprint.d.ts.map +1 -0
  206. package/dist/types/src/testing/test-functions.d.ts +1 -1
  207. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  208. package/dist/types/src/tools/function.d.ts +4 -4
  209. package/dist/types/src/tools/function.d.ts.map +1 -1
  210. package/dist/types/src/tools/openapi.d.ts +3 -3
  211. package/dist/types/src/tools/openapi.d.ts.map +1 -1
  212. package/dist/types/src/translations.d.ts +6 -0
  213. package/dist/types/src/translations.d.ts.map +1 -1
  214. package/dist/types/src/types/chat.d.ts +18 -8
  215. package/dist/types/src/types/chat.d.ts.map +1 -1
  216. package/dist/types/src/types/service.d.ts +96 -95
  217. package/dist/types/src/types/service.d.ts.map +1 -1
  218. package/dist/types/src/types/template.d.ts +52 -52
  219. package/dist/types/src/types/template.d.ts.map +1 -1
  220. package/dist/types/src/types/types.d.ts +34 -23
  221. package/dist/types/src/types/types.d.ts.map +1 -1
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +79 -61
  224. package/src/AssistantPlugin.tsx +12 -11
  225. package/src/capabilities/ai-client.ts +5 -6
  226. package/src/capabilities/app-graph-builder.ts +173 -135
  227. package/src/capabilities/capabilities.ts +1 -1
  228. package/src/capabilities/index.ts +1 -1
  229. package/src/capabilities/intent-resolver.ts +10 -11
  230. package/src/capabilities/react-surface.tsx +88 -22
  231. package/src/capabilities/settings.ts +2 -2
  232. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +2 -2
  233. package/src/components/AmbientDialog/AmbientDialog.tsx +27 -13
  234. package/src/components/AssistantDialog.tsx +1 -1
  235. package/src/components/AssistantSettings/AssistantSettings.tsx +29 -7
  236. package/src/components/BlueprintEditor/BlueprintEditor.stories.tsx +32 -0
  237. package/src/components/BlueprintEditor/BlueprintEditor.tsx +40 -0
  238. package/src/components/BlueprintEditor/index.ts +7 -0
  239. package/src/components/ChatContainer.tsx +6 -8
  240. package/src/components/Prompt/Prompt.stories.tsx +60 -52
  241. package/src/components/Prompt/Prompt.tsx +24 -10
  242. package/src/components/Prompt/PromptBar.stories.tsx +69 -0
  243. package/src/components/Prompt/PromptBar.tsx +82 -88
  244. package/src/components/Prompt/autocomplete.ts +14 -8
  245. package/src/components/Prompt/references.ts +3 -3
  246. package/src/components/PromptSettings.tsx +91 -0
  247. package/src/components/TemplateContainer.tsx +3 -79
  248. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +4 -4
  249. package/src/components/TemplateEditor/TemplateForm.stories.tsx +3 -3
  250. package/src/components/TemplateEditor/TemplateForm.tsx +2 -2
  251. package/src/components/Thread/Thread.stories.tsx +14 -17
  252. package/src/components/Thread/Thread.tsx +2 -2
  253. package/src/components/Thread/ThreadContainer.stories.tsx +83 -62
  254. package/src/components/Thread/ThreadContainer.tsx +26 -5
  255. package/src/components/Thread/ThreadMessage.tsx +49 -11
  256. package/src/components/Thread/ToolInvocations.tsx +9 -7
  257. package/src/components/Thread/reducer.ts +1 -1
  258. package/src/components/Toolbox/Toolbox.stories.tsx +4 -4
  259. package/src/components/Toolbox/Toolbox.tsx +5 -4
  260. package/src/components/index.ts +4 -1
  261. package/src/experimental/transcription/index.ts +3 -0
  262. package/src/hooks/index.ts +0 -1
  263. package/src/hooks/processor.ts +68 -8
  264. package/src/hooks/useChatProcessor.tsx +12 -11
  265. package/src/hooks/useContextProvider.ts +20 -17
  266. package/src/hooks/useMessageQueue.ts +5 -5
  267. package/src/meta.ts +2 -2
  268. package/src/parser/filter-generator.test.ts +32 -0
  269. package/src/parser/filter-generator.ts +81 -0
  270. package/src/parser/index.ts +7 -0
  271. package/src/parser/query-parser.test.ts +139 -0
  272. package/src/parser/query-parser.ts +199 -0
  273. package/src/parser/types.ts +34 -0
  274. package/src/shims.d.ts +8 -0
  275. package/src/stories/Prompt.stories.tsx +60 -0
  276. package/src/stories/Query.stories.tsx +515 -0
  277. package/src/stories/Research.stories.tsx +496 -0
  278. package/src/stories/test-data.ts +128 -0
  279. package/src/stories/testing.ts +60 -0
  280. package/src/testing/index.ts +1 -0
  281. package/src/testing/test-blueprint.ts +50 -0
  282. package/src/testing/test-functions.ts +1 -1
  283. package/src/testing/test-services.ts +6 -6
  284. package/src/tools/function.ts +11 -12
  285. package/src/tools/openapi.test.ts +18 -19
  286. package/src/tools/openapi.ts +24 -17
  287. package/src/translations.ts +14 -6
  288. package/src/types/chat.ts +27 -4
  289. package/src/types/service.ts +39 -37
  290. package/src/types/template.ts +27 -25
  291. package/src/types/types.ts +24 -19
  292. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs +0 -117
  293. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs.map +0 -7
  294. package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs +0 -33
  295. package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs.map +0 -7
  296. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs +0 -78
  297. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs.map +0 -7
  298. package/dist/lib/browser/ai-client-CDZLSNXE.mjs.map +0 -7
  299. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs +0 -209
  300. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-FMB7RGMP.mjs.map +0 -7
  302. package/dist/lib/browser/chunk-IAMR2FAE.mjs +0 -183
  303. package/dist/lib/browser/chunk-IAMR2FAE.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-KYMKVE6M.mjs +0 -128
  305. package/dist/lib/browser/chunk-KYMKVE6M.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-NFUHCW2J.mjs +0 -81
  307. package/dist/lib/browser/chunk-TXJWGWJ7.mjs.map +0 -7
  308. package/dist/lib/browser/intent-resolver-WJGLKKVO.mjs +0 -46
  309. package/dist/lib/browser/intent-resolver-WJGLKKVO.mjs.map +0 -7
  310. package/dist/lib/browser/react-surface-57VRDOQT.mjs +0 -90
  311. package/dist/lib/browser/react-surface-57VRDOQT.mjs.map +0 -7
  312. package/dist/lib/browser/settings-U6UFQX32.mjs.map +0 -7
  313. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs +0 -141
  314. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs.map +0 -7
  315. package/dist/lib/node/ChatContainer-ZJ5JXF6A.cjs.map +0 -7
  316. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs +0 -104
  317. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs.map +0 -7
  318. package/dist/lib/node/ai-client-URCCYU6B.cjs.map +0 -7
  319. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs +0 -220
  320. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs.map +0 -7
  321. package/dist/lib/node/chunk-APRU3QWK.cjs +0 -206
  322. package/dist/lib/node/chunk-APRU3QWK.cjs.map +0 -7
  323. package/dist/lib/node/chunk-GBUNQ257.cjs.map +0 -7
  324. package/dist/lib/node/chunk-RPBKMP2E.cjs.map +0 -7
  325. package/dist/lib/node/chunk-ZKOC4ZFY.cjs +0 -152
  326. package/dist/lib/node/chunk-ZKOC4ZFY.cjs.map +0 -7
  327. package/dist/lib/node/intent-resolver-R3OSTIMH.cjs.map +0 -7
  328. package/dist/lib/node/react-surface-NUQTM6MS.cjs +0 -106
  329. package/dist/lib/node/react-surface-NUQTM6MS.cjs.map +0 -7
  330. package/dist/lib/node/settings-TXGRCYAL.cjs.map +0 -7
  331. package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs +0 -118
  332. package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs.map +0 -7
  333. package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs +0 -34
  334. package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs.map +0 -7
  335. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs +0 -79
  336. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs.map +0 -7
  337. package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs.map +0 -7
  338. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs +0 -210
  339. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-6JK5HEUQ.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-GBBXIW5F.mjs +0 -129
  342. package/dist/lib/node-esm/chunk-GBBXIW5F.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-MVDAY3CZ.mjs.map +0 -7
  344. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs +0 -184
  345. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs.map +0 -7
  346. package/dist/lib/node-esm/intent-resolver-H32TL4X6.mjs +0 -47
  347. package/dist/lib/node-esm/intent-resolver-H32TL4X6.mjs.map +0 -7
  348. package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs +0 -91
  349. package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs.map +0 -7
  350. package/dist/lib/node-esm/settings-DZU5PNXM.mjs.map +0 -7
  351. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +0 -6
  352. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +0 -1
  353. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +0 -8
  354. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/ServiceRegistry/index.d.ts +0 -2
  356. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +0 -1
  357. package/dist/types/src/hooks/invocation-handler.d.ts +0 -5
  358. package/dist/types/src/hooks/invocation-handler.d.ts.map +0 -1
  359. package/dist/types/src/hooks/useLocalTriggerManager.d.ts +0 -3
  360. package/dist/types/src/hooks/useLocalTriggerManager.d.ts.map +0 -1
  361. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +0 -49
  362. package/src/components/ServiceRegistry/ServiceRegistry.tsx +0 -76
  363. package/src/components/ServiceRegistry/index.ts +0 -5
  364. package/src/hooks/invocation-handler.ts +0 -107
  365. package/src/hooks/useLocalTriggerManager.ts +0 -82
@@ -2,21 +2,22 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Prec } from '@codemirror/state';
5
+ import { type Extension, Prec } from '@codemirror/state';
6
6
  import React, { forwardRef, useImperativeHandle } from 'react';
7
7
 
8
8
  import { type ThemedClassName, useThemeContext } from '@dxos/react-ui';
9
9
  import {
10
- type BasicExtensionsOptions,
11
10
  createBasicExtensions,
12
11
  createThemeExtensions,
13
12
  keymap,
14
13
  useTextEditor,
14
+ type BasicExtensionsOptions,
15
15
  type UseTextEditorProps,
16
16
  } from '@dxos/react-ui-editor';
17
17
  import { mx } from '@dxos/react-ui-theme';
18
+ import { isNonNullable } from '@dxos/util';
18
19
 
19
- import { createAutocompleteExtension, type AutocompleteOptions } from './autocomplete';
20
+ import { autocompleteExtension, type AutocompleteOptions } from './autocomplete';
20
21
  import { promptReferences, type ReferencesProvider } from './references';
21
22
 
22
23
  // TODO(burdon): Handle object references.
@@ -28,8 +29,9 @@ export interface PromptController {
28
29
 
29
30
  export type PromptProps = ThemedClassName<
30
31
  {
31
- onOpenChange?: (open: boolean) => void;
32
+ extensions?: Extension;
32
33
  references?: ReferencesProvider;
34
+ onOpenChange?: (open: boolean) => void;
33
35
  } & AutocompleteOptions &
34
36
  Pick<UseTextEditorProps, 'autoFocus'> &
35
37
  Pick<BasicExtensionsOptions, 'lineWrapping' | 'placeholder'>
@@ -37,7 +39,18 @@ export type PromptProps = ThemedClassName<
37
39
 
38
40
  export const Prompt = forwardRef<PromptController, PromptProps>(
39
41
  (
40
- { classNames, autoFocus, lineWrapping = false, placeholder, onSubmit, onSuggest, onOpenChange, references },
42
+ {
43
+ classNames,
44
+ extensions,
45
+ references,
46
+ autoFocus,
47
+ lineWrapping = false,
48
+ placeholder,
49
+ onSubmit,
50
+ onSuggest,
51
+ onCancel,
52
+ onOpenChange,
53
+ },
41
54
  forwardRef,
42
55
  ) => {
43
56
  const { themeMode } = useThemeContext();
@@ -46,6 +59,7 @@ export const Prompt = forwardRef<PromptController, PromptProps>(
46
59
  debug: true,
47
60
  autoFocus,
48
61
  extensions: [
62
+ autocompleteExtension({ onSubmit, onSuggest, onCancel }),
49
63
  createBasicExtensions({
50
64
  bracketMatching: false,
51
65
  lineWrapping,
@@ -53,13 +67,12 @@ export const Prompt = forwardRef<PromptController, PromptProps>(
53
67
  }),
54
68
  createThemeExtensions({ themeMode }),
55
69
  references ? promptReferences({ provider: references }) : [],
56
- createAutocompleteExtension({ onSubmit, onSuggest }),
57
70
  Prec.highest(
58
71
  keymap.of([
59
72
  {
60
73
  key: 'cmd-ArrowUp',
61
74
  preventDefault: true,
62
- run: (view) => {
75
+ run: () => {
63
76
  onOpenChange?.(true);
64
77
  return true;
65
78
  },
@@ -67,16 +80,17 @@ export const Prompt = forwardRef<PromptController, PromptProps>(
67
80
  {
68
81
  key: 'cmd-ArrowDown',
69
82
  preventDefault: true,
70
- run: (view) => {
83
+ run: () => {
71
84
  onOpenChange?.(false);
72
85
  return true;
73
86
  },
74
87
  },
75
88
  ]),
76
89
  ),
77
- ],
90
+ extensions,
91
+ ].filter(isNonNullable),
78
92
  },
79
- [themeMode, onSubmit, onSuggest],
93
+ [themeMode, extensions, onSubmit, onSuggest],
80
94
  );
81
95
 
82
96
  // Expose editor view.
@@ -0,0 +1,69 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type StoryObj, type Meta } from '@storybook/react';
8
+ import React, { useEffect, useState } from 'react';
9
+
10
+ import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
11
+ import { withPluginManager } from '@dxos/app-framework/testing';
12
+ import { log } from '@dxos/log';
13
+ import { TranscriptionPlugin } from '@dxos/plugin-transcription';
14
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
15
+
16
+ import { PromptBar } from './PromptBar';
17
+ import translations from '../../translations';
18
+
19
+ const meta: Meta<typeof PromptBar> = {
20
+ title: 'plugins/plugin-assistant/PromptBar',
21
+ component: PromptBar,
22
+ decorators: [
23
+ withPluginManager({
24
+ plugins: [IntentPlugin(), SettingsPlugin(), TranscriptionPlugin()],
25
+ }),
26
+ withTheme,
27
+ withLayout(),
28
+ ],
29
+ parameters: {
30
+ layout: 'centered',
31
+ translations,
32
+ controls: { disable: true },
33
+ },
34
+ };
35
+
36
+ export default meta;
37
+
38
+ type Story = StoryObj<typeof PromptBar>;
39
+
40
+ export const Default: Story = {
41
+ // args: {
42
+ // classNames: 'w-96 p-4 rounded outline outline-gray-200',
43
+ // },
44
+ };
45
+
46
+ export const Toolbar: Story = {
47
+ render: (args) => {
48
+ const [processing, setProcessing] = useState(false);
49
+ useEffect(() => {
50
+ let t: NodeJS.Timeout;
51
+ if (processing) {
52
+ t = setTimeout(() => setProcessing(false), 10_000);
53
+ }
54
+ return () => clearTimeout(t);
55
+ }, [processing]);
56
+ log.info('processing', { processing });
57
+
58
+ return (
59
+ <PromptBar
60
+ classNames='w-[25rem] p-1 overflow-hidden border border-gray-200 rounded'
61
+ microphone
62
+ processing={processing}
63
+ onSubmit={() => setProcessing(true)}
64
+ onCancel={() => setProcessing(false)}
65
+ {...args}
66
+ />
67
+ );
68
+ },
69
+ };
@@ -2,110 +2,104 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useRef, useState } from 'react';
5
+ import React, { forwardRef, useState } from 'react';
6
6
 
7
7
  import { useVoiceInput } from '@dxos/plugin-transcription';
8
- import { Icon, IconButton, type ThemedClassName, Tooltip, useTranslation } from '@dxos/react-ui';
8
+ import { Icon, IconButton, type ThemedClassName, Tooltip, useForwardedRef, useTranslation } from '@dxos/react-ui';
9
9
  import { Spinner } from '@dxos/react-ui-sfx';
10
- import { errorMessageColors, errorText, mx } from '@dxos/react-ui-theme';
10
+ import { errorText, mx } from '@dxos/react-ui-theme';
11
11
 
12
12
  import { Prompt, type PromptController, type PromptProps } from './Prompt';
13
13
  import { ASSISTANT_PLUGIN } from '../../meta';
14
14
 
15
15
  export type PromptBarProps = ThemedClassName<
16
- Pick<PromptProps, 'placeholder' | 'lineWrapping' | 'onSubmit' | 'onSuggest' | 'onOpenChange' | 'references'> & {
16
+ Pick<
17
+ PromptProps,
18
+ | 'extensions'
19
+ | 'references'
20
+ | 'placeholder'
21
+ | 'lineWrapping'
22
+ | 'onSubmit'
23
+ | 'onSuggest'
24
+ | 'onCancel'
25
+ | 'onOpenChange'
26
+ > & {
17
27
  processing?: boolean;
18
28
  error?: Error;
19
29
  microphone?: boolean;
20
- onCancel?: () => void;
21
30
  }
22
31
  >;
23
32
 
24
- export const PromptBar = ({
25
- classNames,
26
- placeholder,
27
- processing,
28
- error,
29
- microphone,
30
- onCancel,
31
- references,
32
- ...props
33
- }: PromptBarProps) => {
34
- const { t } = useTranslation(ASSISTANT_PLUGIN);
33
+ export const PromptBar = forwardRef<PromptController, PromptBarProps>(
34
+ ({ classNames, placeholder, processing, error, microphone, references, onCancel, ...props }, forwardedRef) => {
35
+ const { t } = useTranslation(ASSISTANT_PLUGIN);
36
+ const promptRef = useForwardedRef<PromptController>(forwardedRef);
37
+ const [active, setActive] = useState(false);
35
38
 
36
- const promptRef = useRef<PromptController>(null);
39
+ // TODO(burdon): Configure capability in TranscriptionPlugin.
40
+ const { recording } = useVoiceInput({
41
+ active,
42
+ onUpdate: (text) => {
43
+ promptRef.current?.setText(text);
44
+ promptRef.current?.focus();
45
+ },
46
+ });
37
47
 
38
- // TODO(burdon): Configure capability in TranscriptionPlugin.
39
- const [active, setActive] = useState(false);
40
- const { recording } = useVoiceInput({
41
- active,
42
- onUpdate: (text) => {
43
- promptRef.current?.setText(text);
44
- promptRef.current?.focus();
45
- },
46
- });
47
-
48
- return (
49
- <div
50
- className={mx(
51
- 'shrink-0 w-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] overflow-hidden',
52
- classNames,
53
- )}
54
- >
55
- <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
56
- {(error && (
57
- <Tooltip.Root delayDuration={0}>
58
- <Tooltip.Trigger>
48
+ return (
49
+ <div
50
+ className={mx(
51
+ 'shrink-0 w-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] overflow-hidden',
52
+ classNames,
53
+ )}
54
+ >
55
+ <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
56
+ {(error && (
57
+ <Tooltip.Trigger content={error.message} delayDuration={0}>
59
58
  <Icon icon='ph--warning-circle--regular' classNames={errorText} size={5} />
60
59
  </Tooltip.Trigger>
61
- <Tooltip.Portal>
62
- <Tooltip.Content>
63
- <div className={mx('text-sm', errorMessageColors)}>{error.message}</div>
64
- <Tooltip.Arrow />
65
- </Tooltip.Content>
66
- </Tooltip.Portal>
67
- </Tooltip.Root>
68
- )) || <Spinner active={processing} />}
69
- </div>
70
- <Prompt
71
- ref={promptRef}
72
- autoFocus
73
- classNames='pbs-2'
74
- lineWrapping={true}
75
- placeholder={placeholder ?? t('prompt placeholder')}
76
- references={references}
77
- {...props}
78
- />
79
- {(onCancel || microphone) && (
80
- <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
81
- {processing && onCancel && (
82
- <IconButton
83
- classNames='px-1.5'
84
- variant='ghost'
85
- size={5}
86
- icon='ph--x--regular'
87
- iconOnly
88
- label={t('cancel processing button')}
89
- onClick={onCancel}
90
- />
91
- )}
92
- {!processing && microphone && (
93
- <IconButton
94
- classNames={mx('px-1.5', recording && 'bg-primary-500')}
95
- variant='ghost'
96
- size={5}
97
- icon='ph--microphone--regular'
98
- iconOnly
99
- noTooltip
100
- label={t('microphone button')}
101
- onMouseDown={() => setActive(true)}
102
- onMouseUp={() => setActive(false)}
103
- onTouchStart={() => setActive(true)}
104
- onTouchEnd={() => setActive(false)}
105
- />
106
- )}
60
+ )) || <Spinner active={processing} />}
107
61
  </div>
108
- )}
109
- </div>
110
- );
111
- };
62
+ <Prompt
63
+ ref={promptRef}
64
+ autoFocus
65
+ classNames='pbs-2'
66
+ lineWrapping={true}
67
+ placeholder={placeholder ?? t('prompt placeholder')}
68
+ references={references}
69
+ onCancel={onCancel}
70
+ {...props}
71
+ />
72
+ {(onCancel || microphone) && (
73
+ <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
74
+ {processing && onCancel && (
75
+ <IconButton
76
+ classNames='px-1.5'
77
+ variant='ghost'
78
+ size={5}
79
+ icon='ph--x--regular'
80
+ iconOnly
81
+ label={t('cancel processing button')}
82
+ onClick={onCancel}
83
+ />
84
+ )}
85
+ {!processing && microphone && (
86
+ <IconButton
87
+ classNames={mx('px-1.5', recording && 'bg-primary-500')}
88
+ variant='ghost'
89
+ size={5}
90
+ icon='ph--microphone--regular'
91
+ iconOnly
92
+ noTooltip
93
+ label={t('microphone button')}
94
+ onMouseDown={() => setActive(true)}
95
+ onMouseUp={() => setActive(false)}
96
+ onTouchStart={() => setActive(true)}
97
+ onTouchEnd={() => setActive(false)}
98
+ />
99
+ )}
100
+ </div>
101
+ )}
102
+ </div>
103
+ );
104
+ },
105
+ );
@@ -27,14 +27,20 @@ export type AutocompleteOptions = {
27
27
  * @returns Array of suggestion strings
28
28
  */
29
29
  onSuggest?: (text: string) => string[];
30
+
31
+ /**
32
+ * ESC pressed.
33
+ */
34
+ onCancel?: () => void;
30
35
  };
31
36
 
32
37
  /**
33
38
  * Creates an autocomplete extension that shows inline suggestions.
34
39
  * Pressing Tab will complete the suggestion.
35
40
  */
36
- export const createAutocompleteExtension = ({ onSubmit, onSuggest }: AutocompleteOptions): Extension => {
37
- const suggestionPlugin = ViewPlugin.fromClass(
41
+ // TODO(burdon): Move to react-ui-editor.
42
+ export const autocompleteExtension = ({ onSubmit, onSuggest, onCancel }: AutocompleteOptions): Extension => {
43
+ const suggest = ViewPlugin.fromClass(
38
44
  class {
39
45
  _decorations: DecorationSet;
40
46
  _currentSuggestion: string | null = null;
@@ -103,21 +109,20 @@ export const createAutocompleteExtension = ({ onSubmit, onSuggest }: Autocomplet
103
109
  );
104
110
 
105
111
  return [
106
- suggestionPlugin,
112
+ suggest,
107
113
  EditorView.theme({
108
114
  '.cm-inline-suggestion': {
109
115
  opacity: 0.4,
110
116
  },
111
117
  }),
112
118
 
113
- // Accept the current suggestion.
114
119
  Prec.highest(
115
120
  keymap.of([
116
121
  {
117
122
  key: 'Tab',
118
123
  preventDefault: true,
119
124
  run: (view) => {
120
- const plugin = view.plugin(suggestionPlugin);
125
+ const plugin = view.plugin(suggest);
121
126
  return plugin?.completeSuggestion(view) ?? false;
122
127
  },
123
128
  },
@@ -130,7 +135,7 @@ export const createAutocompleteExtension = ({ onSubmit, onSuggest }: Autocomplet
130
135
  return false;
131
136
  }
132
137
 
133
- const plugin = view.plugin(suggestionPlugin);
138
+ const plugin = view.plugin(suggest);
134
139
  return plugin?.completeSuggestion(view) ?? false;
135
140
  },
136
141
  },
@@ -186,6 +191,7 @@ export const createAutocompleteExtension = ({ onSubmit, onSuggest }: Autocomplet
186
191
  insert: '',
187
192
  },
188
193
  });
194
+ onCancel?.();
189
195
  return true;
190
196
  },
191
197
  },
@@ -199,14 +205,14 @@ class InlineSuggestionWidget extends WidgetType {
199
205
  super();
200
206
  }
201
207
 
202
- override toDOM() {
208
+ override toDOM(): HTMLSpanElement {
203
209
  const span = document.createElement('span');
204
210
  span.textContent = this.suffix;
205
211
  span.className = 'cm-inline-suggestion';
206
212
  return span;
207
213
  }
208
214
 
209
- override eq(other: InlineSuggestionWidget) {
215
+ override eq(other: InlineSuggestionWidget): boolean {
210
216
  return other.suffix === this.suffix;
211
217
  }
212
218
  }
@@ -163,18 +163,18 @@ class ReferenceWidget extends WidgetType {
163
163
  super();
164
164
  }
165
165
 
166
- override toDOM() {
166
+ override toDOM(): HTMLSpanElement {
167
167
  const span = document.createElement('span');
168
168
  span.textContent = `@ ${this.data.label}`;
169
169
  span.className = 'cm-reference-pill';
170
170
  return span;
171
171
  }
172
172
 
173
- override eq(other: ReferenceWidget) {
173
+ override eq(other: ReferenceWidget): boolean {
174
174
  return other.data.uri === this.data.uri;
175
175
  }
176
176
 
177
- override ignoreEvent() {
177
+ override ignoreEvent(): boolean {
178
178
  return true;
179
179
  }
180
180
  }
@@ -0,0 +1,91 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Match, type Schema } from 'effect';
6
+ import React, { type ChangeEvent, useCallback } from 'react';
7
+
8
+ import { debounce } from '@dxos/async';
9
+ import { Input, Select, Toolbar, useTranslation } from '@dxos/react-ui';
10
+
11
+ import { ASSISTANT_PLUGIN } from '../meta';
12
+ import { TemplateKinds, type TemplateType, type TemplateKindSchema } from '../types';
13
+
14
+ export const PromptSettings = ({ template }: { template: TemplateType }) => {
15
+ const { t } = useTranslation(ASSISTANT_PLUGIN);
16
+
17
+ const handleKindChange = useCallback(
18
+ (value: string) => {
19
+ const kind = Match.type<string>().pipe(
20
+ Match.withReturnType<Schema.Schema.Type<typeof TemplateKindSchema>>(),
21
+ Match.when('always', () => ({ include: 'always' })),
22
+ Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),
23
+ Match.when('automatically', () => ({ include: 'automatically', description: '' })),
24
+ Match.orElse(() => ({ include: 'manual' })),
25
+ )(value);
26
+
27
+ template.kind = kind;
28
+ },
29
+ [template],
30
+ );
31
+
32
+ const handleTypenameChange = useCallback(
33
+ debounce((event: ChangeEvent<HTMLInputElement>) => {
34
+ if (template.kind.include === 'schema-matching') {
35
+ template.kind.typename = event.target.value;
36
+ }
37
+ }, 300),
38
+ [template.kind.include],
39
+ );
40
+
41
+ const handleDescriptionChange = useCallback(
42
+ debounce((event: ChangeEvent<HTMLInputElement>) => {
43
+ if (template.kind.include === 'automatically') {
44
+ template.kind.description = event.target.value;
45
+ }
46
+ }, 300),
47
+ [template.kind.include],
48
+ );
49
+
50
+ return (
51
+ <div className='p-2 flex flex-col gap-4'>
52
+ <h2>{t('prompt rules label')}</h2>
53
+ <Toolbar.Root>
54
+ <Select.Root value={template.kind.include} onValueChange={handleKindChange}>
55
+ <Toolbar.Button asChild>
56
+ <Select.TriggerButton />
57
+ </Toolbar.Button>
58
+ <Select.Portal>
59
+ <Select.Content>
60
+ <Select.Viewport>
61
+ {TemplateKinds.map((kind) => (
62
+ <Select.Option key={kind} value={kind}>
63
+ {kind}
64
+ </Select.Option>
65
+ ))}
66
+ </Select.Viewport>
67
+ </Select.Content>
68
+ </Select.Portal>
69
+ </Select.Root>
70
+ {template.kind.include === 'schema-matching' && (
71
+ <Input.Root>
72
+ <Input.TextInput
73
+ placeholder={t('typename placeholder')}
74
+ defaultValue={template.kind.typename}
75
+ onChange={handleTypenameChange}
76
+ />
77
+ </Input.Root>
78
+ )}
79
+ {template.kind.include === 'automatically' && (
80
+ <Input.Root>
81
+ <Input.TextInput
82
+ placeholder={t('description placeholder')}
83
+ defaultValue={template.kind.description}
84
+ onChange={handleDescriptionChange}
85
+ />
86
+ </Input.Root>
87
+ )}
88
+ </Toolbar.Root>
89
+ </div>
90
+ );
91
+ };
@@ -2,92 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Match, type Schema as S } from 'effect';
6
- import React, { type ChangeEvent, useCallback } from 'react';
5
+ import React from 'react';
7
6
 
8
- import { debounce } from '@dxos/async';
9
- import { Input, Select, Toolbar, useTranslation } from '@dxos/react-ui';
10
7
  import { StackItem } from '@dxos/react-ui-stack';
11
8
 
12
9
  import { TemplateEditor } from './TemplateEditor';
13
- import { ASSISTANT_PLUGIN } from '../meta';
14
- import { TemplateKinds, type TemplateKindSchema, type TemplateType } from '../types';
10
+ import { type TemplateType } from '../types';
15
11
 
16
12
  export const TemplateContainer = ({ template, role }: { template: TemplateType; role: string }) => {
17
- const { t } = useTranslation(ASSISTANT_PLUGIN);
18
-
19
- const handleKindChange = useCallback(
20
- (value: string) => {
21
- const kind = Match.type<string>().pipe(
22
- Match.withReturnType<S.Schema.Type<typeof TemplateKindSchema>>(),
23
- Match.when('always', () => ({ include: 'always' })),
24
- Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),
25
- Match.when('automatically', () => ({ include: 'automatically', description: '' })),
26
- Match.orElse(() => ({ include: 'manual' })),
27
- )(value);
28
-
29
- template.kind = kind;
30
- },
31
- [template],
32
- );
33
-
34
- const handleTypenameChange = useCallback(
35
- debounce((event: ChangeEvent<HTMLInputElement>) => {
36
- if (template.kind.include === 'schema-matching') {
37
- template.kind.typename = event.target.value;
38
- }
39
- }, 300),
40
- [template.kind.include],
41
- );
42
-
43
- const handleDescriptionChange = useCallback(
44
- debounce((event: ChangeEvent<HTMLInputElement>) => {
45
- if (template.kind.include === 'automatically') {
46
- template.kind.description = event.target.value;
47
- }
48
- }, 300),
49
- [template.kind.include],
50
- );
51
-
52
13
  return (
53
- <StackItem.Content role={role} toolbar classNames='container-max-width'>
54
- {/* TODO(wittjosiah): Move this toolbar into c11y sidebar. */}
55
- <Toolbar.Root>
56
- <Select.Root value={template.kind.include} onValueChange={handleKindChange}>
57
- <Toolbar.Button asChild>
58
- <Select.TriggerButton />
59
- </Toolbar.Button>
60
- <Select.Portal>
61
- <Select.Content>
62
- <Select.Viewport>
63
- {TemplateKinds.map((kind) => (
64
- <Select.Option key={kind} value={kind}>
65
- {kind}
66
- </Select.Option>
67
- ))}
68
- </Select.Viewport>
69
- </Select.Content>
70
- </Select.Portal>
71
- </Select.Root>
72
- {template.kind.include === 'schema-matching' && (
73
- <Input.Root>
74
- <Input.TextInput
75
- placeholder={t('typename placeholder')}
76
- defaultValue={template.kind.typename}
77
- onChange={handleTypenameChange}
78
- />
79
- </Input.Root>
80
- )}
81
- {template.kind.include === 'automatically' && (
82
- <Input.Root>
83
- <Input.TextInput
84
- placeholder={t('description placeholder')}
85
- defaultValue={template.kind.description}
86
- onChange={handleDescriptionChange}
87
- />
88
- </Input.Root>
89
- )}
90
- </Toolbar.Root>
14
+ <StackItem.Content role={role} classNames='container-max-width'>
91
15
  <TemplateEditor template={template} />
92
16
  </StackItem.Content>
93
17
  );
@@ -8,7 +8,7 @@ import { type Meta } from '@storybook/react';
8
8
  import React, { useState } from 'react';
9
9
 
10
10
  import { createSystemPrompt } from '@dxos/artifact';
11
- import { create } from '@dxos/live-object';
11
+ import { live } from '@dxos/live-object';
12
12
  import { useClient } from '@dxos/react-client';
13
13
  import { withClientProvider } from '@dxos/react-client/testing';
14
14
  import { withLayout, withTheme } from '@dxos/storybook-utils';
@@ -38,18 +38,18 @@ const DefaultStory = ({ text }: TemplateEditorProps & { text: string }) => {
38
38
  const client = useClient();
39
39
  const [template] = useState(() => {
40
40
  const space = client.spaces.default;
41
- return space.db.add(create(TemplateType, { source: text, kind: { include: 'manual' } }));
41
+ return space.db.add(live(TemplateType, { source: text, kind: { include: 'manual' } }));
42
42
  });
43
43
 
44
44
  return (
45
- <div role='none' className='flex w-[40rem] border border-separator overflow-hidden'>
45
+ <div role='none' className='flex w-[50rem] overflow-hidden border-x border-separator'>
46
46
  <TemplateEditor template={template} />
47
47
  </div>
48
48
  );
49
49
  };
50
50
 
51
51
  const meta: Meta<typeof DefaultStory> = {
52
- title: 'plugins/plugin-automation/TemplateEditor',
52
+ title: 'plugins/plugin-assistant/TemplateEditor',
53
53
  component: TemplateEditor,
54
54
  render: DefaultStory,
55
55
  decorators: [