@dxos/plugin-assistant 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (556) hide show
  1. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs +97 -0
  2. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +8 -0
  4. package/dist/lib/browser/chunk-ATHYBVGN.mjs +176 -0
  5. package/dist/lib/browser/chunk-ATHYBVGN.mjs.map +7 -0
  6. package/dist/lib/browser/chunk-EZRS3J25.mjs +30 -0
  7. package/dist/lib/browser/chunk-EZRS3J25.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-RUV2WOQH.mjs +154 -0
  9. package/dist/lib/browser/chunk-RUV2WOQH.mjs.map +7 -0
  10. package/dist/lib/browser/create-chat-DF5TG5XC.mjs +82 -0
  11. package/dist/lib/browser/create-chat-DF5TG5XC.mjs.map +7 -0
  12. package/dist/lib/browser/ensure-companion-chat-FR4AWZ2P.mjs +65 -0
  13. package/dist/lib/browser/ensure-companion-chat-FR4AWZ2P.mjs.map +7 -0
  14. package/dist/lib/browser/index.mjs +3062 -322
  15. package/dist/lib/browser/index.mjs.map +4 -4
  16. package/dist/lib/browser/meta.json +1 -1
  17. package/dist/lib/browser/on-create-space-54RNX5JI.mjs +22 -0
  18. package/dist/lib/browser/on-create-space-54RNX5JI.mjs.map +7 -0
  19. package/dist/lib/browser/operations/index.mjs +13 -0
  20. package/dist/lib/browser/operations/index.mjs.map +7 -0
  21. package/dist/lib/browser/resolve-navigation-targets-NZOD66NY.mjs +22 -0
  22. package/dist/lib/browser/resolve-navigation-targets-NZOD66NY.mjs.map +7 -0
  23. package/dist/lib/browser/run-prompt-in-new-chat-4YQ37XIS.mjs +136 -0
  24. package/dist/lib/browser/run-prompt-in-new-chat-4YQ37XIS.mjs.map +7 -0
  25. package/dist/lib/browser/set-current-chat-WJI3WAVM.mjs +54 -0
  26. package/dist/lib/browser/set-current-chat-WJI3WAVM.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +5 -4
  28. package/dist/lib/browser/update-chat-name-3Y36KFAS.mjs +71 -0
  29. package/dist/lib/browser/update-chat-name-3Y36KFAS.mjs.map +7 -0
  30. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs +98 -0
  31. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs.map +7 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  33. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs +32 -0
  34. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-PXAJSTGZ.mjs +177 -0
  36. package/dist/lib/node-esm/chunk-PXAJSTGZ.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-PY4X6FJT.mjs +155 -0
  38. package/dist/lib/node-esm/chunk-PY4X6FJT.mjs.map +7 -0
  39. package/dist/lib/node-esm/create-chat-RAV7IX2S.mjs +83 -0
  40. package/dist/lib/node-esm/create-chat-RAV7IX2S.mjs.map +7 -0
  41. package/dist/lib/node-esm/ensure-companion-chat-BLP7NT32.mjs +66 -0
  42. package/dist/lib/node-esm/ensure-companion-chat-BLP7NT32.mjs.map +7 -0
  43. package/dist/lib/node-esm/index.mjs +3062 -322
  44. package/dist/lib/node-esm/index.mjs.map +4 -4
  45. package/dist/lib/node-esm/meta.json +1 -1
  46. package/dist/lib/node-esm/on-create-space-YRPZ6HZY.mjs +23 -0
  47. package/dist/lib/node-esm/on-create-space-YRPZ6HZY.mjs.map +7 -0
  48. package/dist/lib/node-esm/operations/index.mjs +14 -0
  49. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  50. package/dist/lib/node-esm/resolve-navigation-targets-3PPK7XLH.mjs +23 -0
  51. package/dist/lib/node-esm/resolve-navigation-targets-3PPK7XLH.mjs.map +7 -0
  52. package/dist/lib/node-esm/run-prompt-in-new-chat-2IJBSDTM.mjs +137 -0
  53. package/dist/lib/node-esm/run-prompt-in-new-chat-2IJBSDTM.mjs.map +7 -0
  54. package/dist/lib/node-esm/set-current-chat-KBMMZULR.mjs +55 -0
  55. package/dist/lib/node-esm/set-current-chat-KBMMZULR.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +5 -4
  57. package/dist/lib/node-esm/update-chat-name-HM2P4NSI.mjs +72 -0
  58. package/dist/lib/node-esm/update-chat-name-HM2P4NSI.mjs.map +7 -0
  59. package/dist/types/src/AssistantPlugin.d.ts +2 -1
  60. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  61. package/dist/types/src/blueprints/assistant/blueprint.d.ts +4 -0
  62. package/dist/types/src/blueprints/assistant/blueprint.d.ts.map +1 -0
  63. package/dist/types/src/blueprints/assistant/blueprint.test.d.ts +2 -0
  64. package/dist/types/src/blueprints/assistant/blueprint.test.d.ts.map +1 -0
  65. package/dist/types/src/blueprints/assistant/index.d.ts +2 -0
  66. package/dist/types/src/blueprints/assistant/index.d.ts.map +1 -0
  67. package/dist/types/src/blueprints/index.d.ts +2 -0
  68. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/ai-service.d.ts +4 -2
  70. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  72. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/blueprint-definition.d.ts +4 -6
  74. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +9 -0
  76. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/edge-model-resolver.d.ts +6 -3
  78. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/index.d.ts +41 -12
  80. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/local-model-resolver.d.ts +6 -3
  82. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/markdown.d.ts +5 -0
  84. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/migrations.d.ts +5 -0
  86. package/dist/types/src/capabilities/migrations.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  88. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  90. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/settings.d.ts +16 -2
  92. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/state.d.ts +19 -2
  94. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/toolkit.d.ts +4 -2
  96. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  97. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +4 -4
  98. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  99. package/dist/types/src/components/AssistantSettings/AssistantSettings.stories.d.ts +517 -0
  100. package/dist/types/src/components/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -0
  101. package/dist/types/src/components/AssistantSettings/index.d.ts +1 -1
  102. package/dist/types/src/components/AssistantSettings/index.d.ts.map +1 -1
  103. package/dist/types/src/components/Chat/Chat.d.ts +30 -19
  104. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  105. package/dist/types/src/components/Chat/events.d.ts +1 -1
  106. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  107. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts +6 -3
  108. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts.map +1 -1
  109. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +2 -1
  110. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  111. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +3 -3
  112. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  113. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +3 -3
  114. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  115. package/dist/types/src/components/ChatThread/ChatStream.stories.d.ts +530 -0
  116. package/dist/types/src/components/ChatThread/ChatStream.stories.d.ts.map +1 -0
  117. package/dist/types/src/components/ChatThread/ChatThread.d.ts +4 -4
  118. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  119. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +502 -300
  120. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/ChatThread/registry.d.ts +1 -1
  122. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  123. package/dist/types/src/components/ChatThread/sync.d.ts +6 -6
  124. package/dist/types/src/components/ChatThread/sync.d.ts.map +1 -1
  125. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts +8 -0
  126. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts.map +1 -0
  127. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts +14 -0
  128. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts.map +1 -0
  129. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.d.ts +25 -0
  130. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.d.ts.map +1 -0
  131. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts +9 -0
  132. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -0
  133. package/dist/types/src/components/ChatThread/widgets/SelectWidget.d.ts +14 -0
  134. package/dist/types/src/components/ChatThread/widgets/SelectWidget.d.ts.map +1 -0
  135. package/dist/types/src/components/ChatThread/widgets/StatsWidget.d.ts +12 -0
  136. package/dist/types/src/components/ChatThread/widgets/StatsWidget.d.ts.map +1 -0
  137. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts +11 -0
  138. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -0
  139. package/dist/types/src/components/ChatThread/widgets/SummaryWidget.d.ts +5 -0
  140. package/dist/types/src/components/ChatThread/widgets/SummaryWidget.d.ts.map +1 -0
  141. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts +9 -0
  142. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -0
  143. package/dist/types/src/components/ChatThread/widgets/index.d.ts +10 -0
  144. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -0
  145. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +14 -0
  146. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -0
  147. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +8 -0
  148. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -0
  149. package/dist/types/src/components/ProcessTree/index.d.ts +2 -0
  150. package/dist/types/src/components/ProcessTree/index.d.ts.map +1 -0
  151. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +9 -4
  152. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  153. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +493 -290
  154. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +11 -1
  156. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  157. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +494 -291
  158. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +1 -1
  160. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +1 -10
  161. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
  162. package/dist/types/src/components/Toolbox/Toolbox.d.ts +17 -12
  163. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  164. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +493 -290
  165. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/Typewriter/AssistantToolbar.d.ts +12 -0
  167. package/dist/types/src/components/Typewriter/AssistantToolbar.d.ts.map +1 -0
  168. package/dist/types/src/components/Typewriter/Typewriter.d.ts +11 -0
  169. package/dist/types/src/components/Typewriter/Typewriter.d.ts.map +1 -0
  170. package/dist/types/src/components/Typewriter/Typewriter.stories.d.ts +7 -0
  171. package/dist/types/src/components/Typewriter/Typewriter.stories.d.ts.map +1 -0
  172. package/dist/types/src/components/Typewriter/assistant-extension.d.ts +5 -0
  173. package/dist/types/src/components/Typewriter/assistant-extension.d.ts.map +1 -0
  174. package/dist/types/src/components/Typewriter/index.d.ts +2 -0
  175. package/dist/types/src/components/Typewriter/index.d.ts.map +1 -0
  176. package/dist/types/src/components/index.d.ts +3 -6
  177. package/dist/types/src/components/index.d.ts.map +1 -1
  178. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts +6 -0
  179. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts.map +1 -0
  180. package/dist/types/src/containers/BlueprintArticle/index.d.ts +2 -0
  181. package/dist/types/src/containers/BlueprintArticle/index.d.ts.map +1 -0
  182. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +18 -0
  183. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -0
  184. package/dist/types/src/containers/ChatCompanion/index.d.ts +2 -0
  185. package/dist/types/src/containers/ChatCompanion/index.d.ts.map +1 -0
  186. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +12 -0
  187. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  188. package/dist/types/src/containers/ChatContainer/index.d.ts +2 -0
  189. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  190. package/dist/types/src/{components → containers/ChatDialog}/ChatDialog.d.ts +2 -3
  191. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -0
  192. package/dist/types/src/containers/ChatDialog/index.d.ts +2 -0
  193. package/dist/types/src/containers/ChatDialog/index.d.ts.map +1 -0
  194. package/dist/types/src/containers/ProjectArticle/ProjectArticle.d.ts +6 -0
  195. package/dist/types/src/containers/ProjectArticle/ProjectArticle.d.ts.map +1 -0
  196. package/dist/types/src/containers/ProjectArticle/index.d.ts +2 -0
  197. package/dist/types/src/containers/ProjectArticle/index.d.ts.map +1 -0
  198. package/dist/types/src/containers/ProjectSettings/ProjectSettings.d.ts +6 -0
  199. package/dist/types/src/containers/ProjectSettings/ProjectSettings.d.ts.map +1 -0
  200. package/dist/types/src/containers/ProjectSettings/index.d.ts +2 -0
  201. package/dist/types/src/containers/ProjectSettings/index.d.ts.map +1 -0
  202. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts +6 -0
  203. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts.map +1 -0
  204. package/dist/types/src/containers/PromptArticle/index.d.ts +2 -0
  205. package/dist/types/src/containers/PromptArticle/index.d.ts.map +1 -0
  206. package/dist/types/src/containers/PromptList/PromptList.d.ts +6 -0
  207. package/dist/types/src/containers/PromptList/PromptList.d.ts.map +1 -0
  208. package/dist/types/src/containers/PromptList/PromptList.stories.d.ts +523 -0
  209. package/dist/types/src/containers/PromptList/PromptList.stories.d.ts.map +1 -0
  210. package/dist/types/src/containers/PromptList/index.d.ts +2 -0
  211. package/dist/types/src/containers/PromptList/index.d.ts.map +1 -0
  212. package/dist/types/src/containers/TracePanel/TracePanel.d.ts +6 -0
  213. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -0
  214. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts +19 -0
  215. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts.map +1 -0
  216. package/dist/types/src/containers/TracePanel/dxn-extractor.test.d.ts +2 -0
  217. package/dist/types/src/containers/TracePanel/dxn-extractor.test.d.ts.map +1 -0
  218. package/dist/types/src/containers/TracePanel/index.d.ts +4 -0
  219. package/dist/types/src/containers/TracePanel/index.d.ts.map +1 -0
  220. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts +4 -0
  221. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -0
  222. package/dist/types/src/containers/TriggerStatus/index.d.ts +2 -0
  223. package/dist/types/src/containers/TriggerStatus/index.d.ts.map +1 -0
  224. package/dist/types/src/containers/index.d.ts +12 -0
  225. package/dist/types/src/containers/index.d.ts.map +1 -0
  226. package/dist/types/src/extensions/index.d.ts +2 -0
  227. package/dist/types/src/extensions/index.d.ts.map +1 -0
  228. package/dist/types/src/extensions/prompt-extension.d.ts +10 -0
  229. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -0
  230. package/dist/types/src/hooks/index.d.ts +1 -1
  231. package/dist/types/src/hooks/index.d.ts.map +1 -1
  232. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +5 -5
  233. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -1
  234. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -6
  235. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  236. package/dist/types/src/hooks/useChatServices.d.ts +5 -8
  237. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  238. package/dist/types/src/hooks/useChatToolbarActions.d.ts +3 -3
  239. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  240. package/dist/types/src/hooks/useContextBinder.d.ts +3 -2
  241. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  242. package/dist/types/src/hooks/useContextObjects.d.ts +7 -7
  243. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  244. package/dist/types/src/hooks/useFilteredTypes.d.ts +3 -0
  245. package/dist/types/src/hooks/useFilteredTypes.d.ts.map +1 -0
  246. package/dist/types/src/hooks/usePresets.d.ts +1 -1
  247. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  248. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  249. package/dist/types/src/index.d.ts +1 -2
  250. package/dist/types/src/index.d.ts.map +1 -1
  251. package/dist/types/src/meta.d.ts +4 -2
  252. package/dist/types/src/meta.d.ts.map +1 -1
  253. package/dist/types/src/operations/create-chat.d.ts +5 -0
  254. package/dist/types/src/operations/create-chat.d.ts.map +1 -0
  255. package/dist/types/src/operations/definitions.d.ts +135 -0
  256. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  257. package/dist/types/src/operations/ensure-companion-chat.d.ts +5 -0
  258. package/dist/types/src/operations/ensure-companion-chat.d.ts.map +1 -0
  259. package/dist/types/src/operations/index.d.ts +4 -0
  260. package/dist/types/src/operations/index.d.ts.map +1 -0
  261. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  262. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  263. package/dist/types/src/operations/resolve-navigation-targets.d.ts +15 -0
  264. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -0
  265. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +5 -0
  266. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -0
  267. package/dist/types/src/operations/set-current-chat.d.ts +5 -0
  268. package/dist/types/src/operations/set-current-chat.d.ts.map +1 -0
  269. package/dist/types/src/operations/update-chat-name.d.ts +5 -0
  270. package/dist/types/src/operations/update-chat-name.d.ts.map +1 -0
  271. package/dist/types/src/processor/index.d.ts +0 -1
  272. package/dist/types/src/processor/index.d.ts.map +1 -1
  273. package/dist/types/src/processor/processor.d.ts +34 -28
  274. package/dist/types/src/processor/processor.d.ts.map +1 -1
  275. package/dist/types/src/queue-logger.d.ts.map +1 -1
  276. package/dist/types/src/testing/test-generator.d.ts +3 -2
  277. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  278. package/dist/types/src/testing/test-services.d.ts +1 -1
  279. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  280. package/dist/types/src/translations.d.ts +493 -290
  281. package/dist/types/src/translations.d.ts.map +1 -1
  282. package/dist/types/src/types/Assistant.d.ts +18 -46
  283. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  284. package/dist/types/src/types/Settings.d.ts +10 -0
  285. package/dist/types/src/types/Settings.d.ts.map +1 -0
  286. package/dist/types/src/types/capabilities.d.ts +44 -0
  287. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  288. package/dist/types/src/types/events.d.ts +5 -0
  289. package/dist/types/src/types/events.d.ts.map +1 -0
  290. package/dist/types/src/types/index.d.ts +3 -1
  291. package/dist/types/src/types/index.d.ts.map +1 -1
  292. package/dist/types/src/types/service.d.ts +10 -218
  293. package/dist/types/src/types/service.d.ts.map +1 -1
  294. package/dist/types/tsconfig.tsbuildinfo +1 -1
  295. package/package.json +139 -93
  296. package/src/AssistantPlugin.tsx +182 -132
  297. package/src/blueprints/assistant/blueprint.conversations.json +1 -0
  298. package/src/blueprints/assistant/blueprint.test.ts +46 -0
  299. package/src/blueprints/assistant/blueprint.ts +31 -0
  300. package/src/blueprints/assistant/index.ts +5 -0
  301. package/src/blueprints/index.ts +5 -0
  302. package/src/capabilities/ai-service.ts +20 -17
  303. package/src/capabilities/app-graph-builder.ts +190 -183
  304. package/src/capabilities/blueprint-definition.ts +47 -55
  305. package/src/capabilities/companion-chat-provisioner.ts +164 -0
  306. package/src/capabilities/edge-model-resolver.ts +22 -14
  307. package/src/capabilities/index.ts +21 -14
  308. package/src/capabilities/local-model-resolver.ts +21 -13
  309. package/src/capabilities/markdown.ts +40 -0
  310. package/src/capabilities/migrations.ts +34 -0
  311. package/src/capabilities/operation-handler.ts +16 -0
  312. package/src/capabilities/react-surface.tsx +138 -68
  313. package/src/capabilities/settings.ts +24 -12
  314. package/src/capabilities/state.ts +26 -13
  315. package/src/capabilities/toolkit.ts +7 -11
  316. package/src/components/AssistantSettings/AssistantSettings.stories.tsx +34 -0
  317. package/src/components/AssistantSettings/AssistantSettings.tsx +105 -85
  318. package/src/components/AssistantSettings/index.ts +2 -2
  319. package/src/components/Chat/Chat.tsx +147 -104
  320. package/src/components/Chat/events.ts +1 -1
  321. package/src/components/ChatProgress/ChatProgress.tsx +11 -22
  322. package/src/components/ChatPrompt/ChatActions.tsx +26 -6
  323. package/src/components/ChatPrompt/ChatOptions.tsx +103 -79
  324. package/src/components/ChatPrompt/ChatReferences.tsx +21 -12
  325. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +1 -1
  326. package/src/components/ChatThread/ChatStream.stories.tsx +168 -0
  327. package/src/components/ChatThread/ChatThread.stories.tsx +30 -45
  328. package/src/components/ChatThread/ChatThread.tsx +29 -18
  329. package/src/components/ChatThread/Link.tsx +4 -4
  330. package/src/components/ChatThread/registry.tsx +74 -40
  331. package/src/components/ChatThread/sync.test.ts +19 -9
  332. package/src/components/ChatThread/sync.ts +27 -27
  333. package/src/components/ChatThread/testing/thread-1.md +17 -0
  334. package/src/components/ChatThread/widgets/FallbackWidget.tsx +24 -0
  335. package/src/components/ChatThread/widgets/PromptWidget.ts +28 -0
  336. package/src/components/ChatThread/widgets/ReasoningWidget.ts +120 -0
  337. package/src/components/ChatThread/widgets/ReferenceWidget.ts +31 -0
  338. package/src/components/ChatThread/widgets/SelectWidget.ts +37 -0
  339. package/src/components/ChatThread/widgets/StatsWidget.ts +29 -0
  340. package/src/components/ChatThread/widgets/SuggestionWidget.ts +41 -0
  341. package/src/components/ChatThread/widgets/SummaryWidget.tsx +28 -0
  342. package/src/components/ChatThread/widgets/ToolWidget.tsx +143 -0
  343. package/src/components/ChatThread/widgets/index.ts +13 -0
  344. package/src/components/ProcessTree/ProcessTree.stories.tsx +109 -0
  345. package/src/components/ProcessTree/ProcessTree.tsx +85 -0
  346. package/src/components/ProcessTree/index.ts +5 -0
  347. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +5 -10
  348. package/src/components/TemplateEditor/TemplateEditor.tsx +53 -42
  349. package/src/components/TemplateEditor/TemplateForm.stories.tsx +20 -11
  350. package/src/components/TemplateEditor/TemplateForm.tsx +83 -37
  351. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +14 -9
  352. package/src/components/ToolBlock/ToolBlock.tsx +25 -24
  353. package/src/components/Toolbox/Toolbox.stories.tsx +11 -14
  354. package/src/components/Toolbox/Toolbox.tsx +72 -67
  355. package/src/components/Typewriter/AssistantToolbar.tsx +161 -0
  356. package/src/components/Typewriter/Typewriter.stories.tsx +86 -0
  357. package/src/components/Typewriter/Typewriter.tsx +50 -0
  358. package/src/components/Typewriter/assistant-extension.tsx +141 -0
  359. package/src/components/Typewriter/index.ts +5 -0
  360. package/src/components/index.ts +3 -7
  361. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +29 -0
  362. package/src/containers/BlueprintArticle/index.ts +5 -0
  363. package/src/containers/ChatCompanion/ChatCompanion.tsx +142 -0
  364. package/src/containers/ChatCompanion/index.ts +5 -0
  365. package/src/containers/ChatContainer/ChatContainer.tsx +95 -0
  366. package/src/containers/ChatContainer/index.ts +5 -0
  367. package/src/{components → containers/ChatDialog}/ChatDialog.tsx +13 -16
  368. package/src/containers/ChatDialog/index.ts +5 -0
  369. package/src/containers/ProjectArticle/ProjectArticle.tsx +131 -0
  370. package/src/containers/ProjectArticle/index.ts +5 -0
  371. package/src/containers/ProjectSettings/ProjectSettings.tsx +139 -0
  372. package/src/containers/ProjectSettings/index.ts +5 -0
  373. package/src/containers/PromptArticle/PromptArticle.tsx +59 -0
  374. package/src/containers/PromptArticle/index.ts +5 -0
  375. package/src/containers/PromptList/PromptList.stories.tsx +129 -0
  376. package/src/containers/PromptList/PromptList.tsx +49 -0
  377. package/src/containers/PromptList/index.ts +5 -0
  378. package/src/containers/TracePanel/TracePanel.tsx +305 -0
  379. package/src/containers/TracePanel/dxn-extractor.test.ts +153 -0
  380. package/src/containers/TracePanel/dxn-extractor.ts +178 -0
  381. package/src/containers/TracePanel/index.ts +9 -0
  382. package/src/containers/TriggerStatus/TriggerStatus.tsx +144 -0
  383. package/src/containers/TriggerStatus/index.ts +5 -0
  384. package/src/containers/index.ts +16 -0
  385. package/src/extensions/index.ts +5 -0
  386. package/src/extensions/prompt-extension.ts +111 -0
  387. package/src/hooks/index.ts +1 -1
  388. package/src/hooks/useBlueprintRegistry.ts +36 -22
  389. package/src/hooks/useChatProcessor.ts +34 -18
  390. package/src/hooks/useChatServices.ts +9 -34
  391. package/src/hooks/useChatToolbarActions.ts +34 -34
  392. package/src/hooks/useContextBinder.ts +20 -7
  393. package/src/hooks/useContextObjects.ts +16 -24
  394. package/src/hooks/useFilteredTypes.ts +37 -0
  395. package/src/hooks/usePresets.ts +2 -1
  396. package/src/hooks/useReferencesProvider.ts +5 -9
  397. package/src/index.ts +1 -2
  398. package/src/meta.ts +7 -4
  399. package/src/operations/create-chat.ts +80 -0
  400. package/src/operations/definitions.ts +127 -0
  401. package/src/operations/ensure-companion-chat.ts +61 -0
  402. package/src/operations/index.ts +17 -0
  403. package/src/operations/on-create-space.ts +24 -0
  404. package/src/operations/resolve-navigation-targets.ts +26 -0
  405. package/src/operations/run-prompt-in-new-chat.ts +113 -0
  406. package/src/operations/set-current-chat.ts +50 -0
  407. package/src/operations/update-chat-name.ts +61 -0
  408. package/src/processor/index.ts +0 -1
  409. package/src/processor/processor.test.ts +20 -51
  410. package/src/processor/processor.ts +196 -137
  411. package/src/queue-logger.ts +4 -1
  412. package/src/testing/test-generator.ts +17 -16
  413. package/src/testing/test-sequence.ts +3 -3
  414. package/src/testing/test-services.ts +9 -7
  415. package/src/translations.ts +126 -79
  416. package/src/types/Assistant.ts +8 -57
  417. package/src/types/Settings.ts +21 -0
  418. package/src/types/capabilities.ts +35 -0
  419. package/src/types/events.ts +11 -0
  420. package/src/types/index.ts +5 -1
  421. package/src/types/service.ts +14 -11
  422. package/dist/lib/browser/BlueprintArticle-IMCR3642.mjs +0 -36
  423. package/dist/lib/browser/BlueprintArticle-IMCR3642.mjs.map +0 -7
  424. package/dist/lib/browser/ChatCompanion-JYD2RIBJ.mjs +0 -158
  425. package/dist/lib/browser/ChatCompanion-JYD2RIBJ.mjs.map +0 -7
  426. package/dist/lib/browser/ChatContainer-XCPBWYIR.mjs +0 -77
  427. package/dist/lib/browser/ChatContainer-XCPBWYIR.mjs.map +0 -7
  428. package/dist/lib/browser/ChatDialog-DT7KFCRL.mjs +0 -90
  429. package/dist/lib/browser/ChatDialog-DT7KFCRL.mjs.map +0 -7
  430. package/dist/lib/browser/PromptArticle-45QX25Y5.mjs +0 -59
  431. package/dist/lib/browser/PromptArticle-45QX25Y5.mjs.map +0 -7
  432. package/dist/lib/browser/ai-service-ERTZBTP3.mjs +0 -19
  433. package/dist/lib/browser/ai-service-ERTZBTP3.mjs.map +0 -7
  434. package/dist/lib/browser/app-graph-builder-VZEXMDTY.mjs +0 -199
  435. package/dist/lib/browser/app-graph-builder-VZEXMDTY.mjs.map +0 -7
  436. package/dist/lib/browser/blueprint-definition-5FT5JGPY.mjs +0 -12
  437. package/dist/lib/browser/chunk-2BOE3OTW.mjs +0 -262
  438. package/dist/lib/browser/chunk-2BOE3OTW.mjs.map +0 -7
  439. package/dist/lib/browser/chunk-BNTPFZ7O.mjs +0 -229
  440. package/dist/lib/browser/chunk-BNTPFZ7O.mjs.map +0 -7
  441. package/dist/lib/browser/chunk-FJQ4ZRYJ.mjs +0 -335
  442. package/dist/lib/browser/chunk-FJQ4ZRYJ.mjs.map +0 -7
  443. package/dist/lib/browser/chunk-IXIIS4QA.mjs +0 -176
  444. package/dist/lib/browser/chunk-IXIIS4QA.mjs.map +0 -7
  445. package/dist/lib/browser/chunk-LRE4VEZV.mjs +0 -16
  446. package/dist/lib/browser/chunk-LRE4VEZV.mjs.map +0 -7
  447. package/dist/lib/browser/chunk-U62BTGDF.mjs +0 -1929
  448. package/dist/lib/browser/chunk-U62BTGDF.mjs.map +0 -7
  449. package/dist/lib/browser/chunk-WBG5PTSX.mjs +0 -23
  450. package/dist/lib/browser/chunk-WBG5PTSX.mjs.map +0 -7
  451. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs +0 -18
  452. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs.map +0 -7
  453. package/dist/lib/browser/intent-resolver-AK5O4GUW.mjs +0 -143
  454. package/dist/lib/browser/intent-resolver-AK5O4GUW.mjs.map +0 -7
  455. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs +0 -17
  456. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs.map +0 -7
  457. package/dist/lib/browser/react-surface-YCSR2MSR.mjs +0 -98
  458. package/dist/lib/browser/react-surface-YCSR2MSR.mjs.map +0 -7
  459. package/dist/lib/browser/settings-NYJGNQ5I.mjs +0 -23
  460. package/dist/lib/browser/settings-NYJGNQ5I.mjs.map +0 -7
  461. package/dist/lib/browser/state-GG7Z3NB7.mjs +0 -25
  462. package/dist/lib/browser/state-GG7Z3NB7.mjs.map +0 -7
  463. package/dist/lib/browser/toolkit-VYDAWNE4.mjs +0 -17
  464. package/dist/lib/browser/toolkit-VYDAWNE4.mjs.map +0 -7
  465. package/dist/lib/node-esm/BlueprintArticle-OL2HUY6Q.mjs +0 -37
  466. package/dist/lib/node-esm/BlueprintArticle-OL2HUY6Q.mjs.map +0 -7
  467. package/dist/lib/node-esm/ChatCompanion-AHKJS25S.mjs +0 -159
  468. package/dist/lib/node-esm/ChatCompanion-AHKJS25S.mjs.map +0 -7
  469. package/dist/lib/node-esm/ChatContainer-K7OGPE3G.mjs +0 -78
  470. package/dist/lib/node-esm/ChatContainer-K7OGPE3G.mjs.map +0 -7
  471. package/dist/lib/node-esm/ChatDialog-QT6ZBX45.mjs +0 -91
  472. package/dist/lib/node-esm/ChatDialog-QT6ZBX45.mjs.map +0 -7
  473. package/dist/lib/node-esm/PromptArticle-OUKFSJQV.mjs +0 -60
  474. package/dist/lib/node-esm/PromptArticle-OUKFSJQV.mjs.map +0 -7
  475. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs +0 -20
  476. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs.map +0 -7
  477. package/dist/lib/node-esm/app-graph-builder-VRN6ESRR.mjs +0 -200
  478. package/dist/lib/node-esm/app-graph-builder-VRN6ESRR.mjs.map +0 -7
  479. package/dist/lib/node-esm/blueprint-definition-XW6QQVLV.mjs +0 -13
  480. package/dist/lib/node-esm/chunk-3Q22TTXW.mjs +0 -264
  481. package/dist/lib/node-esm/chunk-3Q22TTXW.mjs.map +0 -7
  482. package/dist/lib/node-esm/chunk-AB74FOA2.mjs +0 -230
  483. package/dist/lib/node-esm/chunk-AB74FOA2.mjs.map +0 -7
  484. package/dist/lib/node-esm/chunk-BHS747K7.mjs +0 -1930
  485. package/dist/lib/node-esm/chunk-BHS747K7.mjs.map +0 -7
  486. package/dist/lib/node-esm/chunk-KJGD4EBJ.mjs +0 -336
  487. package/dist/lib/node-esm/chunk-KJGD4EBJ.mjs.map +0 -7
  488. package/dist/lib/node-esm/chunk-UXTUHH24.mjs +0 -178
  489. package/dist/lib/node-esm/chunk-UXTUHH24.mjs.map +0 -7
  490. package/dist/lib/node-esm/chunk-WE6KTH72.mjs +0 -25
  491. package/dist/lib/node-esm/chunk-WE6KTH72.mjs.map +0 -7
  492. package/dist/lib/node-esm/chunk-YWFWT57N.mjs +0 -17
  493. package/dist/lib/node-esm/chunk-YWFWT57N.mjs.map +0 -7
  494. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs +0 -19
  495. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs.map +0 -7
  496. package/dist/lib/node-esm/intent-resolver-L2F3N45L.mjs +0 -144
  497. package/dist/lib/node-esm/intent-resolver-L2F3N45L.mjs.map +0 -7
  498. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs +0 -18
  499. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs.map +0 -7
  500. package/dist/lib/node-esm/react-surface-CTW44GEM.mjs +0 -99
  501. package/dist/lib/node-esm/react-surface-CTW44GEM.mjs.map +0 -7
  502. package/dist/lib/node-esm/settings-RRHYI5KO.mjs +0 -24
  503. package/dist/lib/node-esm/settings-RRHYI5KO.mjs.map +0 -7
  504. package/dist/lib/node-esm/state-FSUHFMDM.mjs +0 -26
  505. package/dist/lib/node-esm/state-FSUHFMDM.mjs.map +0 -7
  506. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs +0 -18
  507. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs.map +0 -7
  508. package/dist/types/src/capabilities/capabilities.d.ts +0 -10
  509. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  510. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  511. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  512. package/dist/types/src/components/BlueprintArticle.d.ts +0 -7
  513. package/dist/types/src/components/BlueprintArticle.d.ts.map +0 -1
  514. package/dist/types/src/components/ChatCompanion.d.ts +0 -13
  515. package/dist/types/src/components/ChatCompanion.d.ts.map +0 -1
  516. package/dist/types/src/components/ChatContainer.d.ts +0 -14
  517. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  518. package/dist/types/src/components/ChatDialog.d.ts.map +0 -1
  519. package/dist/types/src/components/ChatThread/reducers.d.ts +0 -40
  520. package/dist/types/src/components/ChatThread/reducers.d.ts.map +0 -1
  521. package/dist/types/src/components/PromptArticle.d.ts +0 -7
  522. package/dist/types/src/components/PromptArticle.d.ts.map +0 -1
  523. package/dist/types/src/events.d.ts +0 -4
  524. package/dist/types/src/events.d.ts.map +0 -1
  525. package/dist/types/src/functions/analysis.d.ts +0 -5
  526. package/dist/types/src/functions/analysis.d.ts.map +0 -1
  527. package/dist/types/src/functions/index.d.ts +0 -4
  528. package/dist/types/src/functions/index.d.ts.map +0 -1
  529. package/dist/types/src/functions/object-list.d.ts +0 -10
  530. package/dist/types/src/functions/object-list.d.ts.map +0 -1
  531. package/dist/types/src/functions/object-load.d.ts +0 -8
  532. package/dist/types/src/functions/object-load.d.ts.map +0 -1
  533. package/dist/types/src/hooks/useItemTypes.d.ts +0 -4
  534. package/dist/types/src/hooks/useItemTypes.d.ts.map +0 -1
  535. package/dist/types/src/processor/update-name.d.ts +0 -10
  536. package/dist/types/src/processor/update-name.d.ts.map +0 -1
  537. package/dist/types/src/types/AssistantAction.d.ts +0 -132
  538. package/dist/types/src/types/AssistantAction.d.ts.map +0 -1
  539. package/src/capabilities/capabilities.ts +0 -17
  540. package/src/capabilities/intent-resolver.ts +0 -147
  541. package/src/components/BlueprintArticle.tsx +0 -29
  542. package/src/components/ChatCompanion.tsx +0 -155
  543. package/src/components/ChatContainer.tsx +0 -61
  544. package/src/components/ChatThread/reducers.ts +0 -151
  545. package/src/components/PromptArticle.tsx +0 -51
  546. package/src/events.ts +0 -11
  547. package/src/functions/analysis.ts +0 -22
  548. package/src/functions/index.ts +0 -7
  549. package/src/functions/object-list.ts +0 -48
  550. package/src/functions/object-load.ts +0 -45
  551. package/src/hooks/useItemTypes.ts +0 -37
  552. package/src/processor/update-name.ts +0 -56
  553. package/src/types/AssistantAction.ts +0 -79
  554. /package/dist/lib/browser/{blueprint-definition-5FT5JGPY.mjs.map → blueprints/index.mjs.map} +0 -0
  555. /package/dist/lib/node-esm/{blueprint-definition-XW6QQVLV.mjs.map → blueprints/index.mjs.map} +0 -0
  556. /package/src/components/ChatThread/testing/{thread.md → thread-2.md} +0 -0
@@ -6,13 +6,13 @@ import type * as Tool from '@effect/ai/Tool';
6
6
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
7
 
8
8
  import { useTranslation } from '@dxos/react-ui';
9
- import { NumericTabs, TextCrawl, ToggleContainer, type ToggleContainerRootProps } from '@dxos/react-ui-components';
10
- import { type XmlWidgetProps } from '@dxos/react-ui-editor';
9
+ import { NumericTabs, TextCrawl, TogglePanel, type TogglePanelRootProps } from '@dxos/react-ui-components';
11
10
  import { Json } from '@dxos/react-ui-syntax-highlighter';
12
11
  import { type ContentBlock, type Message } from '@dxos/types';
12
+ import { type XmlWidgetProps } from '@dxos/ui-editor';
13
13
  import { isNonNullable, safeParseJson } from '@dxos/util';
14
14
 
15
- import { meta } from '../../meta';
15
+ import { meta } from '#meta';
16
16
 
17
17
  export const isToolMessage = (message: Message.Message) => {
18
18
  return message.blocks.some((block: ContentBlock.Any) => block._tag === 'toolCall' || block._tag === 'toolResult');
@@ -25,12 +25,12 @@ export type ToolBlockProps = XmlWidgetProps<{
25
25
  export const ToolBlock = ({ view, blocks = [] }: ToolBlockProps) => {
26
26
  const { t } = useTranslation(meta.id);
27
27
 
28
- const items = useMemo<ToolContainerParams['items']>(() => {
28
+ const items = useMemo<ToolPanelProps['items']>(() => {
29
29
  let lastToolCall: { tool: Tool.Any | undefined; block: ContentBlock.ToolCall } | undefined;
30
30
  // TODO(burdon): Get from context?
31
31
  const tools: Tool.Any[] = []; //processor.conversation.toolkit?.tools ?? [];
32
32
  return blocks
33
- .filter((block) => block._tag === 'toolCall' || block._tag === 'toolResult' || block._tag === 'summary')
33
+ .filter((block) => block._tag === 'toolCall' || block._tag === 'toolResult' || block._tag === 'stats')
34
34
  .map((block) => {
35
35
  switch (block._tag) {
36
36
  case 'toolCall': {
@@ -41,7 +41,7 @@ export const ToolBlock = ({ view, blocks = [] }: ToolBlockProps) => {
41
41
  const tool = tools.find((tool) => tool.name === block.name);
42
42
  lastToolCall = { tool, block };
43
43
  return {
44
- title: tool?.description ?? [t('tool call label'), tool?.name].join(' '),
44
+ title: tool?.description ?? [t('tool-call.label'), block?.name].join(' '),
45
45
  content: {
46
46
  ...block,
47
47
  input: safeParseJson(block.input),
@@ -53,13 +53,13 @@ export const ToolBlock = ({ view, blocks = [] }: ToolBlockProps) => {
53
53
  // TODO(burdon): Parse error type.
54
54
  if (block.error) {
55
55
  return {
56
- title: t('tool error label'),
56
+ title: t('tool-error.label'),
57
57
  content: block,
58
58
  };
59
59
  }
60
60
 
61
61
  const title =
62
- lastToolCall?.tool?.description ?? [t('tool result label'), lastToolCall?.tool?.name].join(' ');
62
+ lastToolCall?.tool?.description ?? [t('tool-result.label'), lastToolCall?.block?.name].join(' ');
63
63
  lastToolCall = undefined;
64
64
  return {
65
65
  title,
@@ -70,13 +70,13 @@ export const ToolBlock = ({ view, blocks = [] }: ToolBlockProps) => {
70
70
  };
71
71
  }
72
72
 
73
- case 'summary': {
73
+ case 'stats': {
74
74
  if (!lastToolCall) {
75
75
  return null;
76
76
  }
77
77
 
78
78
  return {
79
- title: t('summary label'),
79
+ title: t('stats.label'),
80
80
  content: block,
81
81
  };
82
82
  }
@@ -92,20 +92,21 @@ export const ToolBlock = ({ view, blocks = [] }: ToolBlockProps) => {
92
92
  }, 1_000);
93
93
  }, [view]);
94
94
 
95
+ // Ignore if empty.
95
96
  if (!items.length) {
96
97
  return null;
97
98
  }
98
99
 
99
- return <ToolContainer items={items} onChangeOpen={handleChangeOpen} />;
100
+ return <ToolPanel items={items} onChangeOpen={handleChangeOpen} />;
100
101
  };
101
102
 
102
103
  ToolBlock.displayName = 'ToolBlock';
103
104
 
104
- type ToolContainerParams = {
105
+ type ToolPanelProps = {
105
106
  items: { title: string; content: any }[];
106
- } & Pick<ToggleContainerRootProps, 'onChangeOpen'>;
107
+ } & Pick<TogglePanelRootProps, 'onChangeOpen'>;
107
108
 
108
- export const ToolContainer = ({ items, onChangeOpen }: ToolContainerParams) => {
109
+ const ToolPanel = ({ items, onChangeOpen }: ToolPanelProps) => {
109
110
  const tabsRef = useRef<HTMLDivElement>(null);
110
111
  const [selected, setSelected] = useState(0);
111
112
  const [open, setOpen] = useState(false);
@@ -115,20 +116,20 @@ export const ToolContainer = ({ items, onChangeOpen }: ToolContainerParams) => {
115
116
  if (open) {
116
117
  tabsRef.current?.focus();
117
118
  }
118
- }, [onChangeOpen, open]);
119
+ }, [open, onChangeOpen]);
119
120
 
120
- const handleSelect = (index: number) => {
121
+ const handleSelect = useCallback((index: number) => {
121
122
  setSelected(index);
122
- };
123
+ }, []);
123
124
 
124
125
  return (
125
- <ToggleContainer.Root classNames='mbs-2 is-full rounded-sm' open={open} onChangeOpen={setOpen}>
126
- <ToggleContainer.Header classNames='text-sm text-placeholder'>
126
+ <TogglePanel.Root classNames='w-full rounded-xs border border-subdued-separator' open={open} onChangeOpen={setOpen}>
127
+ <TogglePanel.Header classNames='text-sm text-placeholder'>
127
128
  <TextCrawl key='status-roll' lines={items.map((item) => item.title)} autoAdvance greedy />
128
- </ToggleContainer.Header>
129
- <ToggleContainer.Content classNames='grid grid-cols-[32px_1fr]'>
129
+ </TogglePanel.Header>
130
+ <TogglePanel.Content classNames='grid grid-cols-[32px_1fr]'>
130
131
  <NumericTabs ref={tabsRef} classNames='p-1' length={items.length} selected={selected} onSelect={handleSelect} />
131
- <Json
132
+ <Json.Data
132
133
  data={items[selected]?.content}
133
134
  classNames='p-1 text-xs bg-transparent'
134
135
  replacer={{
@@ -137,7 +138,7 @@ export const ToolContainer = ({ items, onChangeOpen }: ToolContainerParams) => {
137
138
  maxStringLen: 128,
138
139
  }}
139
140
  />
140
- </ToggleContainer.Content>
141
- </ToggleContainer.Root>
141
+ </TogglePanel.Content>
142
+ </TogglePanel.Root>
142
143
  );
143
144
  };
@@ -3,42 +3,39 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
  import React from 'react';
7
8
 
8
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { capabilities } from '@dxos/assistant-toolkit';
10
+ import { capabilities } from '@dxos/assistant-toolkit/testing';
11
11
  import { ChessPlugin } from '@dxos/plugin-chess';
12
12
  import { ClientPlugin } from '@dxos/plugin-client';
13
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
13
14
  import { MapPlugin } from '@dxos/plugin-map';
14
- import { SpacePlugin } from '@dxos/plugin-space';
15
15
  import { TablePlugin } from '@dxos/plugin-table';
16
- import { withTheme } from '@dxos/react-ui/testing';
16
+ import { corePlugins } from '@dxos/plugin-testing';
17
17
 
18
18
  import { translations } from '../../translations';
19
-
20
19
  import { Toolbox, type ToolboxProps } from './Toolbox';
21
20
 
22
21
  const DefaultStory = (props: ToolboxProps) => {
23
- return <Toolbox {...props} classNames='is-[30rem] bs-[15rem] rounded-sm border border-separator plb-1' />;
22
+ return <Toolbox {...props} classNames='h-[15rem] w-[30rem] py-1 rounded-xs border border-separator' />;
24
23
  };
25
24
 
26
25
  const meta = {
27
- title: 'plugins/plugin-assistant/Toolbox',
26
+ title: 'plugins/plugin-assistant/components/Toolbox',
28
27
  component: Toolbox as any,
29
28
  render: DefaultStory,
30
29
  decorators: [
31
- withTheme,
32
30
  withPluginManager({
33
31
  plugins: [
32
+ ...corePlugins(),
34
33
  ClientPlugin({
35
- onClientInitialized: async ({ client }) => {
36
- await client.halo.createIdentity();
37
- },
34
+ onClientInitialized: ({ client }) =>
35
+ Effect.gen(function* () {
36
+ yield* initializeIdentity(client);
37
+ }),
38
38
  }),
39
- SpacePlugin({}),
40
- SettingsPlugin(),
41
- IntentPlugin(),
42
39
  ChessPlugin(),
43
40
  MapPlugin(),
44
41
  TablePlugin(),
@@ -2,86 +2,91 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type FC, Fragment, useEffect, useState } from 'react';
5
+ import React, { Fragment, useEffect, useState } from 'react';
6
6
 
7
7
  import { type Blueprint } from '@dxos/blueprints';
8
- import { type Ref } from '@dxos/echo';
9
- import { Function } from '@dxos/functions';
8
+ import { type Database, type Ref } from '@dxos/echo';
10
9
  import { log } from '@dxos/log';
11
- import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
12
- import { type ThemedClassName } from '@dxos/react-ui';
13
- import { useTranslation } from '@dxos/react-ui';
14
- import { mx } from '@dxos/react-ui-theme';
10
+ import { Operation } from '@dxos/operation';
11
+ import { Filter, useQuery } from '@dxos/react-client/echo';
12
+ import { ScrollArea, type ThemedClassName } from '@dxos/react-ui';
13
+ import { composable, composableProps, mx } from '@dxos/ui-theme';
14
+
15
+ import { ServiceType } from '#types';
15
16
 
16
- import { meta } from '../../meta';
17
17
  import { type AiChatProcessor } from '../../processor';
18
- import { ServiceType } from '../../types';
19
18
 
20
- export type ToolboxProps = ThemedClassName<{
19
+ export type ToolboxProps = {
21
20
  services?: { service: ServiceType }[];
22
- functions?: Function.Function[];
21
+ functions?: Operation.PersistentOperation[];
23
22
  // TODO(burdon): Combine into single array.
24
- blueprints?: readonly Ref.Ref<Blueprint.Blueprint>[];
23
+ blueprints?: readonly Blueprint.Blueprint[];
25
24
  activeBlueprints?: readonly Ref.Ref<Blueprint.Blueprint>[];
26
- }>;
27
-
28
- export const Toolbox = ({ classNames, functions, services, blueprints, activeBlueprints }: ToolboxProps) => {
29
- const { t } = useTranslation(meta.id);
30
-
31
- return (
32
- <div className={mx('flex flex-col overflow-y-auto box-content', classNames)}>
33
- {blueprints && blueprints.length > 0 && (
34
- <Section
35
- title='Blueprints'
36
- items={blueprints.map(({ target }) => ({
37
- name: target?.name ?? '',
38
- description: target?.description ?? '',
39
- subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),
40
- }))}
41
- />
42
- )}
43
-
44
- {activeBlueprints && activeBlueprints.length > 0 && (
45
- <Section
46
- title='Blueprints'
47
- items={activeBlueprints.map(({ target }) => ({
48
- name: target?.name ?? '',
49
- description: target?.description ?? '',
50
- subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),
51
- }))}
52
- />
53
- )}
54
-
55
- {services && services.length > 0 && (
56
- <Section
57
- title='Services'
58
- items={services.map(({ service: { serviceId, name, description } }) => ({
59
- name: name ?? serviceId,
60
- description,
61
- // subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),
62
- }))}
63
- />
64
- )}
65
-
66
- {functions && functions.length > 0 && (
67
- <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />
68
- )}
69
- </div>
70
- );
71
25
  };
72
26
 
73
- const Section: FC<{
27
+ export const Toolbox = composable<HTMLDivElement, ToolboxProps>(
28
+ ({ functions, services, blueprints, activeBlueprints, ...props }, forwardedRef) => {
29
+ return (
30
+ <ScrollArea.Root {...composableProps(props)} thin orientation='vertical' ref={forwardedRef}>
31
+ <ScrollArea.Viewport>
32
+ {blueprints && blueprints.length > 0 && (
33
+ <Section
34
+ title='Blueprints'
35
+ items={blueprints.map(({ name, description, tools }) => ({
36
+ name,
37
+ description,
38
+ subitems: tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),
39
+ }))}
40
+ />
41
+ )}
42
+
43
+ {activeBlueprints && activeBlueprints.length > 0 && (
44
+ <Section
45
+ title='Blueprints'
46
+ items={activeBlueprints.map(({ target }) => ({
47
+ name: target?.name ?? '',
48
+ description: target?.description ?? '',
49
+ subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),
50
+ }))}
51
+ />
52
+ )}
53
+
54
+ {services && services.length > 0 && (
55
+ <Section
56
+ title='Services'
57
+ items={services.map(({ service: { serviceId, name, description } }) => ({
58
+ name: name ?? serviceId,
59
+ description,
60
+ // subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),
61
+ }))}
62
+ />
63
+ )}
64
+
65
+ {functions && functions.length > 0 && (
66
+ <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />
67
+ )}
68
+ </ScrollArea.Viewport>
69
+ </ScrollArea.Root>
70
+ );
71
+ },
72
+ );
73
+
74
+ Toolbox.displayName = 'Toolbox';
75
+
76
+ type SectionProps = {
74
77
  title: string;
75
78
  items: { name: string; description?: string; subitems?: { name: string; description?: string }[] }[];
76
79
  striped?: boolean;
77
- }> = ({ title, items, striped }) => {
80
+ };
81
+
82
+ const Section = ({ title, items, striped }: SectionProps) => {
78
83
  const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';
79
84
  const gridClassNames = 'grid grid-cols-[8rem_1fr]';
80
- const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs pli-2', striped && stripeClassNames);
85
+ const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs px-2', striped && stripeClassNames);
81
86
 
82
87
  return (
83
88
  <div>
84
- <h1 className='pli-2 text-sm'>{title}</h1>
89
+ <h1 className='px-2 text-sm'>{title}</h1>
85
90
  <div className={gridClassNames}>
86
91
  {items.map(({ name, description, subitems }, i) => (
87
92
  <Fragment key={i}>
@@ -104,14 +109,14 @@ const Section: FC<{
104
109
  );
105
110
  };
106
111
 
107
- export type ToolboxContainerProps = ThemedClassName<{
108
- space?: Space;
112
+ export type ToolboxPanelProps = ThemedClassName<{
113
+ db?: Database.Database;
109
114
  processor?: AiChatProcessor;
110
115
  }>;
111
116
 
112
- export const ToolboxContainer = ({ classNames, space, processor }: ToolboxContainerProps) => {
117
+ export const ToolboxPanel = ({ classNames, db, processor }: ToolboxPanelProps) => {
113
118
  // Registered services.
114
- const services = useQuery(space, Filter.type(ServiceType));
119
+ const services = useQuery(db, Filter.type(ServiceType));
115
120
  const [serviceTools, setServiceTools] = useState<{ service: ServiceType }[]>([]);
116
121
  useEffect(() => {
117
122
  log('creating service tools...', { services: services.length });
@@ -125,12 +130,12 @@ export const ToolboxContainer = ({ classNames, space, processor }: ToolboxContai
125
130
  }, [services]);
126
131
 
127
132
  // Deployed functions.
128
- const functions = useQuery(space, Filter.type(Function.Function));
133
+ const functions = useQuery(db, Filter.type(Operation.PersistentOperation));
129
134
 
130
135
  return (
131
136
  <Toolbox
132
137
  classNames={classNames}
133
- blueprints={processor?.context.blueprints.value}
138
+ blueprints={processor?.context.getBlueprints()}
134
139
  services={serviceTools}
135
140
  functions={functions}
136
141
  />
@@ -0,0 +1,161 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import * as LanguageModel from '@effect/ai/LanguageModel';
7
+ import * as Effect from 'effect/Effect';
8
+ import type * as Runtime from 'effect/Runtime';
9
+ import React, { useState } from 'react';
10
+
11
+ import { runInRuntime } from '@dxos/effect';
12
+ import { log } from '@dxos/log';
13
+ import { Button, Icon, Input, ThemeProvider } from '@dxos/react-ui';
14
+
15
+ export type AssistantToolbarProps = {
16
+ view: EditorView;
17
+ from: number;
18
+ to: number;
19
+ runtime: Runtime.Runtime<LanguageModel.LanguageModel>;
20
+ };
21
+
22
+ export const AssistantToolbar = ({ view, from, to, runtime }: AssistantToolbarProps) => {
23
+ const [isProcessing, setIsProcessing] = useState(false);
24
+ const [showPromptInput, setShowPromptInput] = useState(false);
25
+ const [customPrompt, setCustomPrompt] = useState('');
26
+
27
+ const runEffect = async (text: string, prompt: string) => {
28
+ setIsProcessing(true);
29
+ try {
30
+ const newText = await runInRuntime(
31
+ runtime,
32
+ Effect.gen(function* () {
33
+ // Construct meaningful system prompt context
34
+ const response = yield* LanguageModel.generateText({
35
+ prompt: `${prompt}:\n"${text}"`,
36
+ });
37
+ return response.text;
38
+ }),
39
+ );
40
+
41
+ // Apply change - check if selection is still valid/same?
42
+ // For simple demo, we just apply to the passed from/to, but ideally we check current selection.
43
+ // We can just rely on from/to passed as props, assuming the toolbar unmounts if selection changes.
44
+ view.dispatch({
45
+ changes: { from, to, insert: newText },
46
+ });
47
+ } catch (e) {
48
+ log.error('Assistant action failed', { error: e });
49
+ } finally {
50
+ setIsProcessing(false);
51
+ setShowPromptInput(false);
52
+ }
53
+ };
54
+
55
+ const currentText = view.state.sliceDoc(from, to);
56
+
57
+ const handleRegenerate = () => {
58
+ void runEffect(
59
+ currentText,
60
+ 'You are a typewriting agent. Agent only outputs the result; one version; no explanation or formatting. Re-write the following text to be more clear and concise, keep the same meaning.',
61
+ );
62
+ };
63
+
64
+ const handleCasual = () => handleChangeTone('casual');
65
+ const handleFormal = () => handleChangeTone('formal');
66
+
67
+ const handleChangeTone = (tone: 'formal' | 'casual') => {
68
+ void runEffect(
69
+ currentText,
70
+ `You are a typewriting agent. Agent only outputs the result; one version; no explanation or formatting. Rewrite the following text to be more ${tone}`,
71
+ );
72
+ };
73
+
74
+ const handleEditWithPrompt = () => {
75
+ if (!customPrompt) return;
76
+ void runEffect(currentText, customPrompt);
77
+ };
78
+
79
+ return (
80
+ <ThemeProvider>
81
+ {showPromptInput ? (
82
+ <div
83
+ className='flex items-center gap-2 p-1 bg-white/90 dark:bg-neutral-800/90 backdrop-blur-md rounded-full shadow-xl border border-neutral-200 dark:border-neutral-700 animate-in fade-in zoom-in-95 duration-150 mt-2'
84
+ onMouseDown={(e) => e.preventDefault()}
85
+ >
86
+ <Input.Root>
87
+ <Input.TextInput
88
+ placeholder='Instruction...'
89
+ value={customPrompt}
90
+ onChange={(e) => setCustomPrompt(e.target.value)}
91
+ onKeyDown={(e) => {
92
+ if (e.key === 'Enter') handleEditWithPrompt();
93
+ if (e.key === 'Escape') setShowPromptInput(false);
94
+ e.stopPropagation();
95
+ }}
96
+ autoFocus
97
+ classNames='border-none bg-transparent focus-visible:ring-0 p-1 text-sm min-w-[200px]'
98
+ />
99
+ </Input.Root>
100
+ <Button
101
+ variant='ghost'
102
+ classNames='p-1 min-h-0 h-6 w-6 rounded-full'
103
+ onClick={handleEditWithPrompt}
104
+ disabled={!customPrompt || isProcessing}
105
+ >
106
+ <Icon icon='ph--arrows-clockwise--regular' classNames={isProcessing ? 'animate-spin' : ''} />
107
+ </Button>
108
+ </div>
109
+ ) : (
110
+ <div
111
+ className='flex items-center gap-1 p-1 bg-white/50 dark:bg-neutral-800/50 backdrop-blur-md rounded-xl shadow-xl border border-neutral-200 dark:border-neutral-700 animate-in fade-in zoom-in-95 duration-150 mt-2'
112
+ onMouseDown={(e) => e.preventDefault()}
113
+ >
114
+ <div className='flex items-center gap-1'>
115
+ <Button
116
+ variant='ghost'
117
+ classNames='flex flex-col items-center gap-1 p-1 h-auto w-auto rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-700'
118
+ onClick={handleCasual}
119
+ disabled={isProcessing}
120
+ >
121
+ <Icon icon='ph--caret-left--regular' />
122
+ <span className='text-[10px] leading-none text-neutral-500 font-medium'>Casual</span>
123
+ </Button>
124
+
125
+ <Button
126
+ variant='ghost'
127
+ classNames='flex flex-col items-center gap-1 p-1 h-auto w-auto rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-700'
128
+ onClick={handleRegenerate}
129
+ disabled={isProcessing}
130
+ >
131
+ <Icon icon='ph--arrows-clockwise--regular' classNames={isProcessing ? 'animate-spin' : ''} />
132
+ <span className='text-[10px] leading-none text-neutral-500 font-medium'>Different</span>
133
+ </Button>
134
+
135
+ <Button
136
+ variant='ghost'
137
+ classNames='flex flex-col gap-1 p-1 h-auto w-auto rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-700'
138
+ onClick={handleFormal}
139
+ disabled={isProcessing}
140
+ >
141
+ <Icon icon='ph--caret-right--regular' />
142
+ <span className='text-[10px] leading-none text-neutral-500 font-medium'>Formal</span>
143
+ </Button>
144
+ </div>
145
+
146
+ <div className='w-px h-8 bg-neutral-200 dark:bg-neutral-700 mx-1' />
147
+
148
+ <Button
149
+ variant='ghost'
150
+ classNames='flex flex-col gap-1 p-1 h-auto w-auto rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-700'
151
+ onClick={() => setShowPromptInput(true)}
152
+ disabled={isProcessing}
153
+ >
154
+ <Icon icon='ph--keyboard--regular' />
155
+ <span className='text-[10px] leading-none text-neutral-500 font-medium'>Instruct</span>
156
+ </Button>
157
+ </div>
158
+ )}
159
+ </ThemeProvider>
160
+ );
161
+ };
@@ -0,0 +1,86 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import type * as LanguageModel from '@effect/ai/LanguageModel';
6
+ import type { Meta, StoryObj } from '@storybook/react-vite';
7
+ import * as Layer from 'effect/Layer';
8
+ import * as ManagedRuntime from 'effect/ManagedRuntime';
9
+ import type * as Runtime from 'effect/Runtime';
10
+ import React, { useEffect, useState } from 'react';
11
+
12
+ import { AiService } from '@dxos/ai';
13
+ import { AiServiceTestingPreset } from '@dxos/ai/testing';
14
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
15
+
16
+ import { Typewriter } from './Typewriter';
17
+
18
+ const meta: Meta<typeof Typewriter> = {
19
+ title: 'plugins/plugin-assistant/components/Typewriter',
20
+ component: Typewriter,
21
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
22
+ };
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<typeof Typewriter>;
27
+
28
+ const sampleText = `# The Future of Artificial Intelligence
29
+
30
+ Artificial Intelligence (AI) has rapidly evolved from a theoretical concept to a transformative force reshaping industries, economies, and daily life. At its core, AI refers to the development of computer systems capable of performing tasks that typically require human intelligence, such as visual perception, speech recognition, decision-making, and language translation.
31
+
32
+ ## Machine Learning and Neural Networks
33
+
34
+ The resurgence of AI in recent years is largely driven by advancements in machine learning (ML) and deep learning. Neural networks, inspired by the human brain's architecture, enable computers to learn from vast amounts of data. This has led to breakthroughs in areas like natural language processing (NLP), allowing models like GPT-4 to generate human-like text and code.
35
+
36
+ ## Ethical Considerations
37
+
38
+ As AI becomes more autonomous, ethical concerns have moved to the forefront. Issues such as algorithmic bias, data privacy, and the potential displacement of jobs are critical topics of debate. Ensuring that AI systems are fair, transparent, and aligned with human values is essential for their sustainable development.
39
+
40
+ ## Conclusion
41
+
42
+ The journey of AI is just beginning. With responsible innovation and global collaboration, AI has the potential to solve some of humanity's most pressing challenges, from climate change to personalized medicine.
43
+
44
+ (try selecting some text to see the AI assistant, or wait for the proofreader to find the typo below)
45
+
46
+ The quick brown fox jumps over teh lazy dog. i think this is cool.
47
+ `;
48
+
49
+ export const Default: Story = {
50
+ render: () => {
51
+ const [runtime, setRuntime] = useState<Runtime.Runtime<LanguageModel.LanguageModel>>();
52
+ useEffect(() => {
53
+ let disposed = false;
54
+ const rt = ManagedRuntime.make(
55
+ AiService.model('@anthropic/claude-haiku-4-5').pipe(
56
+ Layer.provide(AiServiceTestingPreset('edge-remote')),
57
+ Layer.orDie,
58
+ ),
59
+ );
60
+ queueMicrotask(async () => {
61
+ try {
62
+ if (disposed) {
63
+ return;
64
+ }
65
+ const runtime = await rt.runtime();
66
+ if (disposed) {
67
+ return;
68
+ }
69
+ setRuntime(runtime);
70
+ } catch (error) {
71
+ console.error('Failed to initialize runtime:', error);
72
+ }
73
+ });
74
+ return () => {
75
+ disposed = true;
76
+ void rt.dispose();
77
+ };
78
+ }, []);
79
+
80
+ if (!runtime) {
81
+ return <div>...Loading</div>;
82
+ }
83
+
84
+ return <Typewriter initialContent={sampleText} runtime={runtime} />;
85
+ },
86
+ };
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import type * as LanguageModel from '@effect/ai/LanguageModel';
7
+ import type * as Runtime from 'effect/Runtime';
8
+ import React, { useMemo, useRef } from 'react';
9
+
10
+ import { ThemeProvider } from '@dxos/react-ui';
11
+ import { Editor, type EditorController } from '@dxos/react-ui-editor';
12
+ import {
13
+ createBasicExtensions,
14
+ createMarkdownExtensions,
15
+ createThemeExtensions,
16
+ decorateMarkdown,
17
+ } from '@dxos/ui-editor';
18
+
19
+ import { assistant } from './assistant-extension';
20
+
21
+ export type TypewriterProps = {
22
+ initialContent?: string;
23
+ extensions?: Extension[];
24
+ runtime: Runtime.Runtime<LanguageModel.LanguageModel>;
25
+ };
26
+
27
+ export const Typewriter = ({ initialContent = '', extensions = [], runtime }: TypewriterProps) => {
28
+ const editorRef = useRef<EditorController>(null);
29
+ const extension = useMemo(
30
+ () => [
31
+ createBasicExtensions({ scrollPastEnd: true, search: true }),
32
+ createThemeExtensions({ syntaxHighlighting: true }),
33
+ createMarkdownExtensions(),
34
+ decorateMarkdown(),
35
+ assistant(runtime),
36
+ ...extensions,
37
+ ],
38
+ [runtime, extensions],
39
+ );
40
+
41
+ return (
42
+ <ThemeProvider>
43
+ <Editor.Root ref={editorRef}>
44
+ <Editor.Viewport>
45
+ <Editor.Content initialValue={initialContent} extensions={extension} />
46
+ </Editor.Viewport>
47
+ </Editor.Root>
48
+ </ThemeProvider>
49
+ );
50
+ };