@dxos/plugin-assistant 0.8.4-main.70d3990 → 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 (557) 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 +3063 -315
  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 +3063 -315
  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 -13
  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 -305
  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 -295
  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 -296
  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 -295
  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/useBlueprintRegistry.d.ts +5 -5
  231. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -1
  232. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -6
  233. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  234. package/dist/types/src/hooks/useChatServices.d.ts +5 -8
  235. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  236. package/dist/types/src/hooks/useChatToolbarActions.d.ts +3 -3
  237. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  238. package/dist/types/src/hooks/useContextBinder.d.ts +3 -2
  239. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  240. package/dist/types/src/hooks/useContextObjects.d.ts +7 -7
  241. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  242. package/dist/types/src/hooks/useFilteredTypes.d.ts +2 -3
  243. package/dist/types/src/hooks/useFilteredTypes.d.ts.map +1 -1
  244. package/dist/types/src/hooks/usePresets.d.ts +1 -1
  245. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  246. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  247. package/dist/types/src/index.d.ts +1 -2
  248. package/dist/types/src/index.d.ts.map +1 -1
  249. package/dist/types/src/meta.d.ts +4 -2
  250. package/dist/types/src/meta.d.ts.map +1 -1
  251. package/dist/types/src/operations/create-chat.d.ts +5 -0
  252. package/dist/types/src/operations/create-chat.d.ts.map +1 -0
  253. package/dist/types/src/operations/definitions.d.ts +135 -0
  254. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  255. package/dist/types/src/operations/ensure-companion-chat.d.ts +5 -0
  256. package/dist/types/src/operations/ensure-companion-chat.d.ts.map +1 -0
  257. package/dist/types/src/operations/index.d.ts +4 -0
  258. package/dist/types/src/operations/index.d.ts.map +1 -0
  259. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  260. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  261. package/dist/types/src/operations/resolve-navigation-targets.d.ts +15 -0
  262. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -0
  263. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +5 -0
  264. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -0
  265. package/dist/types/src/operations/set-current-chat.d.ts +5 -0
  266. package/dist/types/src/operations/set-current-chat.d.ts.map +1 -0
  267. package/dist/types/src/operations/update-chat-name.d.ts +5 -0
  268. package/dist/types/src/operations/update-chat-name.d.ts.map +1 -0
  269. package/dist/types/src/processor/index.d.ts +0 -1
  270. package/dist/types/src/processor/index.d.ts.map +1 -1
  271. package/dist/types/src/processor/processor.d.ts +34 -28
  272. package/dist/types/src/processor/processor.d.ts.map +1 -1
  273. package/dist/types/src/queue-logger.d.ts.map +1 -1
  274. package/dist/types/src/testing/test-generator.d.ts +3 -2
  275. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  276. package/dist/types/src/testing/test-services.d.ts +1 -1
  277. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  278. package/dist/types/src/translations.d.ts +493 -295
  279. package/dist/types/src/translations.d.ts.map +1 -1
  280. package/dist/types/src/types/Assistant.d.ts +18 -43
  281. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  282. package/dist/types/src/types/Settings.d.ts +10 -0
  283. package/dist/types/src/types/Settings.d.ts.map +1 -0
  284. package/dist/types/src/types/capabilities.d.ts +44 -0
  285. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  286. package/dist/types/src/types/events.d.ts +5 -0
  287. package/dist/types/src/types/events.d.ts.map +1 -0
  288. package/dist/types/src/types/index.d.ts +3 -1
  289. package/dist/types/src/types/index.d.ts.map +1 -1
  290. package/dist/types/src/types/service.d.ts +11 -260
  291. package/dist/types/src/types/service.d.ts.map +1 -1
  292. package/dist/types/tsconfig.tsbuildinfo +1 -1
  293. package/package.json +139 -93
  294. package/src/AssistantPlugin.tsx +184 -113
  295. package/src/blueprints/assistant/blueprint.conversations.json +1 -0
  296. package/src/blueprints/assistant/blueprint.test.ts +46 -0
  297. package/src/blueprints/assistant/blueprint.ts +31 -0
  298. package/src/blueprints/assistant/index.ts +5 -0
  299. package/src/blueprints/index.ts +5 -0
  300. package/src/capabilities/ai-service.ts +20 -17
  301. package/src/capabilities/app-graph-builder.ts +190 -183
  302. package/src/capabilities/blueprint-definition.ts +47 -55
  303. package/src/capabilities/companion-chat-provisioner.ts +164 -0
  304. package/src/capabilities/edge-model-resolver.ts +22 -14
  305. package/src/capabilities/index.ts +21 -15
  306. package/src/capabilities/local-model-resolver.ts +21 -13
  307. package/src/capabilities/markdown.ts +40 -0
  308. package/src/capabilities/migrations.ts +34 -0
  309. package/src/capabilities/operation-handler.ts +16 -0
  310. package/src/capabilities/react-surface.tsx +138 -68
  311. package/src/capabilities/settings.ts +24 -12
  312. package/src/capabilities/state.ts +26 -13
  313. package/src/capabilities/toolkit.ts +7 -11
  314. package/src/components/AssistantSettings/AssistantSettings.stories.tsx +34 -0
  315. package/src/components/AssistantSettings/AssistantSettings.tsx +105 -85
  316. package/src/components/AssistantSettings/index.ts +2 -2
  317. package/src/components/Chat/Chat.tsx +147 -104
  318. package/src/components/Chat/events.ts +1 -1
  319. package/src/components/ChatProgress/ChatProgress.tsx +11 -22
  320. package/src/components/ChatPrompt/ChatActions.tsx +26 -6
  321. package/src/components/ChatPrompt/ChatOptions.tsx +103 -85
  322. package/src/components/ChatPrompt/ChatReferences.tsx +21 -12
  323. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +1 -1
  324. package/src/components/ChatThread/ChatStream.stories.tsx +168 -0
  325. package/src/components/ChatThread/ChatThread.stories.tsx +30 -45
  326. package/src/components/ChatThread/ChatThread.tsx +29 -18
  327. package/src/components/ChatThread/Link.tsx +3 -3
  328. package/src/components/ChatThread/registry.tsx +74 -40
  329. package/src/components/ChatThread/sync.test.ts +19 -9
  330. package/src/components/ChatThread/sync.ts +27 -27
  331. package/src/components/ChatThread/testing/thread-1.md +17 -0
  332. package/src/components/ChatThread/widgets/FallbackWidget.tsx +24 -0
  333. package/src/components/ChatThread/widgets/PromptWidget.ts +28 -0
  334. package/src/components/ChatThread/widgets/ReasoningWidget.ts +120 -0
  335. package/src/components/ChatThread/widgets/ReferenceWidget.ts +31 -0
  336. package/src/components/ChatThread/widgets/SelectWidget.ts +37 -0
  337. package/src/components/ChatThread/widgets/StatsWidget.ts +29 -0
  338. package/src/components/ChatThread/widgets/SuggestionWidget.ts +41 -0
  339. package/src/components/ChatThread/widgets/SummaryWidget.tsx +28 -0
  340. package/src/components/ChatThread/widgets/ToolWidget.tsx +143 -0
  341. package/src/components/ChatThread/widgets/index.ts +13 -0
  342. package/src/components/ProcessTree/ProcessTree.stories.tsx +109 -0
  343. package/src/components/ProcessTree/ProcessTree.tsx +85 -0
  344. package/src/components/ProcessTree/index.ts +5 -0
  345. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +5 -10
  346. package/src/components/TemplateEditor/TemplateEditor.tsx +52 -41
  347. package/src/components/TemplateEditor/TemplateForm.stories.tsx +20 -11
  348. package/src/components/TemplateEditor/TemplateForm.tsx +83 -37
  349. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +14 -9
  350. package/src/components/ToolBlock/ToolBlock.tsx +24 -23
  351. package/src/components/Toolbox/Toolbox.stories.tsx +11 -14
  352. package/src/components/Toolbox/Toolbox.tsx +72 -67
  353. package/src/components/Typewriter/AssistantToolbar.tsx +161 -0
  354. package/src/components/Typewriter/Typewriter.stories.tsx +86 -0
  355. package/src/components/Typewriter/Typewriter.tsx +50 -0
  356. package/src/components/Typewriter/assistant-extension.tsx +141 -0
  357. package/src/components/Typewriter/index.ts +5 -0
  358. package/src/components/index.ts +3 -7
  359. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +29 -0
  360. package/src/containers/BlueprintArticle/index.ts +5 -0
  361. package/src/containers/ChatCompanion/ChatCompanion.tsx +142 -0
  362. package/src/containers/ChatCompanion/index.ts +5 -0
  363. package/src/containers/ChatContainer/ChatContainer.tsx +95 -0
  364. package/src/containers/ChatContainer/index.ts +5 -0
  365. package/src/{components → containers/ChatDialog}/ChatDialog.tsx +13 -16
  366. package/src/containers/ChatDialog/index.ts +5 -0
  367. package/src/containers/ProjectArticle/ProjectArticle.tsx +131 -0
  368. package/src/containers/ProjectArticle/index.ts +5 -0
  369. package/src/containers/ProjectSettings/ProjectSettings.tsx +139 -0
  370. package/src/containers/ProjectSettings/index.ts +5 -0
  371. package/src/containers/PromptArticle/PromptArticle.tsx +59 -0
  372. package/src/containers/PromptArticle/index.ts +5 -0
  373. package/src/containers/PromptList/PromptList.stories.tsx +129 -0
  374. package/src/containers/PromptList/PromptList.tsx +49 -0
  375. package/src/containers/PromptList/index.ts +5 -0
  376. package/src/containers/TracePanel/TracePanel.tsx +305 -0
  377. package/src/containers/TracePanel/dxn-extractor.test.ts +153 -0
  378. package/src/containers/TracePanel/dxn-extractor.ts +178 -0
  379. package/src/containers/TracePanel/index.ts +9 -0
  380. package/src/containers/TriggerStatus/TriggerStatus.tsx +144 -0
  381. package/src/containers/TriggerStatus/index.ts +5 -0
  382. package/src/containers/index.ts +16 -0
  383. package/src/extensions/index.ts +5 -0
  384. package/src/extensions/prompt-extension.ts +111 -0
  385. package/src/hooks/useBlueprintRegistry.ts +36 -22
  386. package/src/hooks/useChatProcessor.ts +34 -18
  387. package/src/hooks/useChatServices.ts +9 -34
  388. package/src/hooks/useChatToolbarActions.ts +34 -34
  389. package/src/hooks/useContextBinder.ts +20 -7
  390. package/src/hooks/useContextObjects.ts +16 -24
  391. package/src/hooks/useFilteredTypes.ts +8 -9
  392. package/src/hooks/usePresets.ts +2 -1
  393. package/src/hooks/useReferencesProvider.ts +5 -9
  394. package/src/index.ts +1 -2
  395. package/src/meta.ts +7 -4
  396. package/src/operations/create-chat.ts +80 -0
  397. package/src/operations/definitions.ts +127 -0
  398. package/src/operations/ensure-companion-chat.ts +61 -0
  399. package/src/operations/index.ts +17 -0
  400. package/src/operations/on-create-space.ts +24 -0
  401. package/src/operations/resolve-navigation-targets.ts +26 -0
  402. package/src/operations/run-prompt-in-new-chat.ts +113 -0
  403. package/src/operations/set-current-chat.ts +50 -0
  404. package/src/operations/update-chat-name.ts +61 -0
  405. package/src/processor/index.ts +0 -1
  406. package/src/processor/processor.test.ts +20 -51
  407. package/src/processor/processor.ts +196 -137
  408. package/src/queue-logger.ts +4 -1
  409. package/src/testing/test-generator.ts +17 -16
  410. package/src/testing/test-sequence.ts +3 -3
  411. package/src/testing/test-services.ts +9 -7
  412. package/src/translations.ts +126 -83
  413. package/src/types/Assistant.ts +8 -57
  414. package/src/types/Settings.ts +21 -0
  415. package/src/types/capabilities.ts +35 -0
  416. package/src/types/events.ts +11 -0
  417. package/src/types/index.ts +5 -1
  418. package/src/types/service.ts +14 -11
  419. package/dist/lib/browser/BlueprintArticle-BWSLH6LG.mjs +0 -36
  420. package/dist/lib/browser/BlueprintArticle-BWSLH6LG.mjs.map +0 -7
  421. package/dist/lib/browser/ChatCompanion-OSZZZSWV.mjs +0 -158
  422. package/dist/lib/browser/ChatCompanion-OSZZZSWV.mjs.map +0 -7
  423. package/dist/lib/browser/ChatContainer-2W6FNSJD.mjs +0 -77
  424. package/dist/lib/browser/ChatContainer-2W6FNSJD.mjs.map +0 -7
  425. package/dist/lib/browser/ChatDialog-XQ3KDYWE.mjs +0 -90
  426. package/dist/lib/browser/ChatDialog-XQ3KDYWE.mjs.map +0 -7
  427. package/dist/lib/browser/PromptArticle-Q7JYGFQV.mjs +0 -59
  428. package/dist/lib/browser/PromptArticle-Q7JYGFQV.mjs.map +0 -7
  429. package/dist/lib/browser/ai-service-ERTZBTP3.mjs +0 -19
  430. package/dist/lib/browser/ai-service-ERTZBTP3.mjs.map +0 -7
  431. package/dist/lib/browser/app-graph-builder-LM6GVHQO.mjs +0 -199
  432. package/dist/lib/browser/app-graph-builder-LM6GVHQO.mjs.map +0 -7
  433. package/dist/lib/browser/blueprint-definition-VBEOXNBS.mjs +0 -12
  434. package/dist/lib/browser/chunk-2BOE3OTW.mjs +0 -262
  435. package/dist/lib/browser/chunk-2BOE3OTW.mjs.map +0 -7
  436. package/dist/lib/browser/chunk-5JZRYQZL.mjs +0 -229
  437. package/dist/lib/browser/chunk-5JZRYQZL.mjs.map +0 -7
  438. package/dist/lib/browser/chunk-7ZJIXQ2Y.mjs +0 -335
  439. package/dist/lib/browser/chunk-7ZJIXQ2Y.mjs.map +0 -7
  440. package/dist/lib/browser/chunk-LRE4VEZV.mjs +0 -16
  441. package/dist/lib/browser/chunk-LRE4VEZV.mjs.map +0 -7
  442. package/dist/lib/browser/chunk-NC2QNMBF.mjs +0 -176
  443. package/dist/lib/browser/chunk-NC2QNMBF.mjs.map +0 -7
  444. package/dist/lib/browser/chunk-PWSTPQUY.mjs +0 -1929
  445. package/dist/lib/browser/chunk-PWSTPQUY.mjs.map +0 -7
  446. package/dist/lib/browser/chunk-WBG5PTSX.mjs +0 -23
  447. package/dist/lib/browser/chunk-WBG5PTSX.mjs.map +0 -7
  448. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs +0 -18
  449. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs.map +0 -7
  450. package/dist/lib/browser/intent-resolver-EEYS2GJF.mjs +0 -143
  451. package/dist/lib/browser/intent-resolver-EEYS2GJF.mjs.map +0 -7
  452. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs +0 -17
  453. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs.map +0 -7
  454. package/dist/lib/browser/react-surface-ECKZNDSU.mjs +0 -98
  455. package/dist/lib/browser/react-surface-ECKZNDSU.mjs.map +0 -7
  456. package/dist/lib/browser/repair-3MZXLUHO.mjs +0 -44
  457. package/dist/lib/browser/repair-3MZXLUHO.mjs.map +0 -7
  458. package/dist/lib/browser/settings-HD5WA24I.mjs +0 -23
  459. package/dist/lib/browser/settings-HD5WA24I.mjs.map +0 -7
  460. package/dist/lib/browser/state-GG7Z3NB7.mjs +0 -25
  461. package/dist/lib/browser/state-GG7Z3NB7.mjs.map +0 -7
  462. package/dist/lib/browser/toolkit-VYDAWNE4.mjs +0 -17
  463. package/dist/lib/browser/toolkit-VYDAWNE4.mjs.map +0 -7
  464. package/dist/lib/node-esm/BlueprintArticle-R2XYBRCK.mjs +0 -37
  465. package/dist/lib/node-esm/BlueprintArticle-R2XYBRCK.mjs.map +0 -7
  466. package/dist/lib/node-esm/ChatCompanion-IUMU7WRQ.mjs +0 -159
  467. package/dist/lib/node-esm/ChatCompanion-IUMU7WRQ.mjs.map +0 -7
  468. package/dist/lib/node-esm/ChatContainer-CTUNUEU3.mjs +0 -78
  469. package/dist/lib/node-esm/ChatContainer-CTUNUEU3.mjs.map +0 -7
  470. package/dist/lib/node-esm/ChatDialog-X42ASXQD.mjs +0 -91
  471. package/dist/lib/node-esm/ChatDialog-X42ASXQD.mjs.map +0 -7
  472. package/dist/lib/node-esm/PromptArticle-IV7O5UZ3.mjs +0 -60
  473. package/dist/lib/node-esm/PromptArticle-IV7O5UZ3.mjs.map +0 -7
  474. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs +0 -20
  475. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs.map +0 -7
  476. package/dist/lib/node-esm/app-graph-builder-6XUAGTRS.mjs +0 -200
  477. package/dist/lib/node-esm/app-graph-builder-6XUAGTRS.mjs.map +0 -7
  478. package/dist/lib/node-esm/blueprint-definition-RDCLLIQH.mjs +0 -13
  479. package/dist/lib/node-esm/chunk-25GMMNY5.mjs +0 -178
  480. package/dist/lib/node-esm/chunk-25GMMNY5.mjs.map +0 -7
  481. package/dist/lib/node-esm/chunk-3Q22TTXW.mjs +0 -264
  482. package/dist/lib/node-esm/chunk-3Q22TTXW.mjs.map +0 -7
  483. package/dist/lib/node-esm/chunk-CKW4IYLY.mjs +0 -336
  484. package/dist/lib/node-esm/chunk-CKW4IYLY.mjs.map +0 -7
  485. package/dist/lib/node-esm/chunk-E4JSYCWZ.mjs +0 -230
  486. package/dist/lib/node-esm/chunk-E4JSYCWZ.mjs.map +0 -7
  487. package/dist/lib/node-esm/chunk-WE6KTH72.mjs +0 -25
  488. package/dist/lib/node-esm/chunk-WE6KTH72.mjs.map +0 -7
  489. package/dist/lib/node-esm/chunk-YWFWT57N.mjs +0 -17
  490. package/dist/lib/node-esm/chunk-YWFWT57N.mjs.map +0 -7
  491. package/dist/lib/node-esm/chunk-Z37USO4K.mjs +0 -1930
  492. package/dist/lib/node-esm/chunk-Z37USO4K.mjs.map +0 -7
  493. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs +0 -19
  494. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs.map +0 -7
  495. package/dist/lib/node-esm/intent-resolver-4SRYLDK5.mjs +0 -144
  496. package/dist/lib/node-esm/intent-resolver-4SRYLDK5.mjs.map +0 -7
  497. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs +0 -18
  498. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs.map +0 -7
  499. package/dist/lib/node-esm/react-surface-NLIG5VAI.mjs +0 -99
  500. package/dist/lib/node-esm/react-surface-NLIG5VAI.mjs.map +0 -7
  501. package/dist/lib/node-esm/repair-RER5H7Y6.mjs +0 -45
  502. package/dist/lib/node-esm/repair-RER5H7Y6.mjs.map +0 -7
  503. package/dist/lib/node-esm/settings-YJQVKHH5.mjs +0 -24
  504. package/dist/lib/node-esm/settings-YJQVKHH5.mjs.map +0 -7
  505. package/dist/lib/node-esm/state-FSUHFMDM.mjs +0 -26
  506. package/dist/lib/node-esm/state-FSUHFMDM.mjs.map +0 -7
  507. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs +0 -18
  508. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs.map +0 -7
  509. package/dist/types/src/capabilities/capabilities.d.ts +0 -10
  510. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  511. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  512. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  513. package/dist/types/src/capabilities/repair.d.ts +0 -4
  514. package/dist/types/src/capabilities/repair.d.ts.map +0 -1
  515. package/dist/types/src/components/BlueprintArticle.d.ts +0 -7
  516. package/dist/types/src/components/BlueprintArticle.d.ts.map +0 -1
  517. package/dist/types/src/components/ChatCompanion.d.ts +0 -13
  518. package/dist/types/src/components/ChatCompanion.d.ts.map +0 -1
  519. package/dist/types/src/components/ChatContainer.d.ts +0 -14
  520. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  521. package/dist/types/src/components/ChatDialog.d.ts.map +0 -1
  522. package/dist/types/src/components/ChatThread/reducers.d.ts +0 -40
  523. package/dist/types/src/components/ChatThread/reducers.d.ts.map +0 -1
  524. package/dist/types/src/components/PromptArticle.d.ts +0 -7
  525. package/dist/types/src/components/PromptArticle.d.ts.map +0 -1
  526. package/dist/types/src/events.d.ts +0 -4
  527. package/dist/types/src/events.d.ts.map +0 -1
  528. package/dist/types/src/functions/analysis.d.ts +0 -5
  529. package/dist/types/src/functions/analysis.d.ts.map +0 -1
  530. package/dist/types/src/functions/index.d.ts +0 -4
  531. package/dist/types/src/functions/index.d.ts.map +0 -1
  532. package/dist/types/src/functions/object-list.d.ts +0 -10
  533. package/dist/types/src/functions/object-list.d.ts.map +0 -1
  534. package/dist/types/src/functions/object-load.d.ts +0 -8
  535. package/dist/types/src/functions/object-load.d.ts.map +0 -1
  536. package/dist/types/src/processor/update-name.d.ts +0 -10
  537. package/dist/types/src/processor/update-name.d.ts.map +0 -1
  538. package/dist/types/src/types/AssistantAction.d.ts +0 -129
  539. package/dist/types/src/types/AssistantAction.d.ts.map +0 -1
  540. package/src/capabilities/capabilities.ts +0 -17
  541. package/src/capabilities/intent-resolver.ts +0 -135
  542. package/src/capabilities/repair.ts +0 -49
  543. package/src/components/BlueprintArticle.tsx +0 -29
  544. package/src/components/ChatCompanion.tsx +0 -155
  545. package/src/components/ChatContainer.tsx +0 -61
  546. package/src/components/ChatThread/reducers.ts +0 -151
  547. package/src/components/PromptArticle.tsx +0 -51
  548. package/src/events.ts +0 -11
  549. package/src/functions/analysis.ts +0 -22
  550. package/src/functions/index.ts +0 -7
  551. package/src/functions/object-list.ts +0 -48
  552. package/src/functions/object-load.ts +0 -45
  553. package/src/processor/update-name.ts +0 -56
  554. package/src/types/AssistantAction.ts +0 -79
  555. /package/dist/lib/browser/{blueprint-definition-VBEOXNBS.mjs.map → blueprints/index.mjs.map} +0 -0
  556. /package/dist/lib/node-esm/{blueprint-definition-RDCLLIQH.mjs.map → blueprints/index.mjs.map} +0 -0
  557. /package/src/components/ChatThread/testing/{thread.md → thread-2.md} +0 -0
@@ -1,371 +1,3119 @@
1
1
  import {
2
- AssistantSettings,
3
- BlueprintArticle,
4
- Chat,
5
- ChatCompanion,
6
- ChatContainer,
7
- ChatContextProvider,
8
- ChatDialog,
9
- PromptArticle,
10
- Toolbox,
11
- ToolboxContainer,
12
- useActiveBlueprints,
13
- useBlueprintHandlers,
14
- useBlueprintRegistry,
15
- useBlueprints,
16
- useChatContext,
17
- useChatProcessor,
18
- useChatServices,
19
- useChatToolbarActions,
20
- useContextBinder,
21
- useContextObjects,
22
- useFilteredTypes,
23
- useFlush,
24
- useOnline,
25
- usePresets,
26
- useReferencesProvider
27
- } from "./chunk-PWSTPQUY.mjs";
28
- import {
29
- TemplateEditor
30
- } from "./chunk-7ZJIXQ2Y.mjs";
31
- import "./chunk-2BOE3OTW.mjs";
32
- import {
33
- ASSISTANT_BLUEPRINT_KEY,
34
- createBlueprint
35
- } from "./chunk-NC2QNMBF.mjs";
2
+ blueprint_default
3
+ } from "./chunk-EZRS3J25.mjs";
36
4
  import {
37
5
  ApiAuthorization,
38
- AssistantAction_exports,
6
+ AssistantCapabilities,
7
+ AssistantEvents,
39
8
  Assistant_exports,
40
9
  LLM_PROVIDERS,
41
10
  ServiceType,
42
11
  categoryIcons
43
- } from "./chunk-5JZRYQZL.mjs";
44
- import {
45
- AssistantCapabilities
46
- } from "./chunk-LRE4VEZV.mjs";
12
+ } from "./chunk-RUV2WOQH.mjs";
47
13
  import {
48
- ASSISTANT_DIALOG,
49
- meta
50
- } from "./chunk-WBG5PTSX.mjs";
14
+ UpdateChatName
15
+ } from "./chunk-ATHYBVGN.mjs";
51
16
  import "./chunk-J5LGTIGS.mjs";
52
17
 
53
- // src/capabilities/index.ts
54
- import { lazy } from "@dxos/app-framework";
55
- var AiService = lazy(() => import("./ai-service-ERTZBTP3.mjs"));
56
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-LM6GVHQO.mjs"));
57
- var AssistantState = lazy(() => import("./state-GG7Z3NB7.mjs"));
58
- var BlueprintDefinition = lazy(() => import("./blueprint-definition-VBEOXNBS.mjs"));
59
- var EdgeModelResolver = lazy(() => import("./edge-model-resolver-O6OFYIO2.mjs"));
60
- var IntentResolver = lazy(() => import("./intent-resolver-EEYS2GJF.mjs"));
61
- var LocalModelResolver = lazy(() => import("./local-model-resolver-34MVHRKD.mjs"));
62
- var ReactSurface = lazy(() => import("./react-surface-ECKZNDSU.mjs"));
63
- var Repair = lazy(() => import("./repair-3MZXLUHO.mjs"));
64
- var Settings = lazy(() => import("./settings-HD5WA24I.mjs"));
65
- var Toolkit = lazy(() => import("./toolkit-VYDAWNE4.mjs"));
66
-
67
- // src/events.ts
68
- import { defineEvent } from "@dxos/app-framework";
69
- (function(AssistantEvents2) {
70
- AssistantEvents2.SetupAiServiceProviders = defineEvent(`${meta.id}/event/setup-ai-service-providers`);
71
- })(AssistantEvents || (AssistantEvents = {}));
72
- var AssistantEvents;
18
+ // src/components/index.ts
19
+ import { lazy } from "react";
20
+
21
+ // src/components/Chat/Chat.tsx
22
+ import { Prec } from "@codemirror/state";
23
+ import { keymap } from "@codemirror/view";
24
+ import { useAtomValue } from "@effect-atom/atom-react";
25
+ import { createContext } from "@radix-ui/react-context";
26
+ import * as Array2 from "effect/Array";
27
+ import * as Option3 from "effect/Option";
28
+ import React10, { useCallback as useCallback3, useEffect as useEffect4, useMemo as useMemo4, useRef as useRef2, useState as useState5 } from "react";
29
+ import { Event } from "@dxos/async";
30
+ import { Filter as Filter2, Obj as Obj3 } from "@dxos/echo";
31
+ import { useVoiceInput } from "@dxos/plugin-transcription";
32
+ import { useQuery as useQuery2 } from "@dxos/react-client/echo";
33
+ import { useIdentity } from "@dxos/react-client/halo";
34
+ import { Input, useDynamicRef, useTranslation as useTranslation6 } from "@dxos/react-ui";
35
+ import { ChatEditor } from "@dxos/react-ui-chat";
36
+ import { Menu } from "@dxos/react-ui-menu";
37
+ import { Message } from "@dxos/types";
38
+ import { composable, composableProps, mx as mx7 } from "@dxos/ui-theme";
39
+ import { isTruthy, trim } from "@dxos/util";
40
+ import { useChatToolbarActions } from "#hooks";
41
+ import { meta as meta6 } from "#meta";
42
+
43
+ // src/components/ChatPrompt/ChatActions.tsx
44
+ import React from "react";
45
+ import { IconButton, useTranslation } from "@dxos/react-ui";
46
+ import { mx } from "@dxos/ui-theme";
47
+ import { meta } from "#meta";
48
+ var ChatActions = ({ classNames, children, microphone, recording, processing, debug, onEvent }) => {
49
+ const { t } = useTranslation(meta.id);
50
+ return /* @__PURE__ */ React.createElement("div", {
51
+ className: mx("flex items-center me-1", classNames)
52
+ }, children, /* @__PURE__ */ React.createElement(IconButton, {
53
+ disabled: !processing,
54
+ variant: "ghost",
55
+ icon: "ph--x--regular",
56
+ iconOnly: true,
57
+ label: t("cancel-processing.button"),
58
+ onClick: () => onEvent?.({
59
+ type: "cancel"
60
+ })
61
+ }), microphone && /* @__PURE__ */ React.createElement(IconButton, {
62
+ disabled: !processing,
63
+ classNames: mx(recording && "bg-primary-500"),
64
+ variant: "ghost",
65
+ icon: "ph--microphone--regular",
66
+ iconOnly: true,
67
+ noTooltip: true,
68
+ label: t("microphone.button"),
69
+ onMouseDown: () => onEvent?.({
70
+ type: "record-start"
71
+ }),
72
+ onMouseUp: () => onEvent?.({
73
+ type: "record-stop"
74
+ }),
75
+ onTouchStart: () => onEvent?.({
76
+ type: "record-start"
77
+ }),
78
+ onTouchEnd: () => onEvent?.({
79
+ type: "record-stop"
80
+ })
81
+ }), debug && /* @__PURE__ */ React.createElement(IconButton, {
82
+ variant: "ghost",
83
+ icon: "ph--wrench--regular",
84
+ iconOnly: true,
85
+ label: t("debug.button"),
86
+ onClick: () => onEvent?.({
87
+ type: "toggle-debug"
88
+ })
89
+ }));
90
+ };
91
+
92
+ // src/components/ChatPrompt/ChatOptions.tsx
93
+ import * as Option from "effect/Option";
94
+ import React2, { useMemo, useState } from "react";
95
+ import { Filter, Obj, Type } from "@dxos/echo";
96
+ import { Annotation } from "@dxos/echo";
97
+ import { useQuery } from "@dxos/react-client/echo";
98
+ import { IconButton as IconButton2, Popover, Select, useTranslation as useTranslation2 } from "@dxos/react-ui";
99
+ import { Listbox, SearchList, useSearchListResults } from "@dxos/react-ui-search";
100
+ import { Tabs } from "@dxos/react-ui-tabs";
101
+ import { getStyles, mx as mx2 } from "@dxos/ui-theme";
102
+ import { useActiveBlueprints, useBlueprintHandlers, useBlueprints, useContextObjects, useFilteredTypes } from "#hooks";
103
+ import { meta as meta2 } from "#meta";
104
+ var panelClassNames = "w-[calc(100dvw-.5rem)] sm:w-max md:w-72 max-w-document-width";
105
+ var ChatOptions = ({ db, context, blueprintRegistry, presets, preset, onPresetChange }) => {
106
+ const { t } = useTranslation2(meta2.id);
107
+ return /* @__PURE__ */ React2.createElement("div", {
108
+ role: "none",
109
+ className: "flex p-2"
110
+ }, /* @__PURE__ */ React2.createElement(Popover.Root, null, /* @__PURE__ */ React2.createElement(Popover.Trigger, {
111
+ asChild: true
112
+ }, /* @__PURE__ */ React2.createElement(IconButton2, {
113
+ variant: "ghost",
114
+ icon: "ph--plus--regular",
115
+ iconOnly: true,
116
+ label: t("context-objects.button")
117
+ })), /* @__PURE__ */ React2.createElement(Popover.Portal, null, /* @__PURE__ */ React2.createElement(Popover.Content, {
118
+ side: "top",
119
+ classNames: panelClassNames
120
+ }, /* @__PURE__ */ React2.createElement(Popover.Viewport, null, /* @__PURE__ */ React2.createElement(ObjectsPanel, {
121
+ db,
122
+ context
123
+ })), /* @__PURE__ */ React2.createElement(Popover.Arrow, null)))), /* @__PURE__ */ React2.createElement(Popover.Root, null, /* @__PURE__ */ React2.createElement(Popover.Trigger, {
124
+ asChild: true
125
+ }, /* @__PURE__ */ React2.createElement(IconButton2, {
126
+ variant: "ghost",
127
+ icon: "ph--sliders-horizontal--regular",
128
+ iconOnly: true,
129
+ label: t("context-settings.button")
130
+ })), /* @__PURE__ */ React2.createElement(Popover.Portal, null, /* @__PURE__ */ React2.createElement(Popover.Content, {
131
+ side: "top",
132
+ classNames: panelClassNames
133
+ }, /* @__PURE__ */ React2.createElement(Popover.Viewport, null, /* @__PURE__ */ React2.createElement(Tabs.Root, {
134
+ orientation: "horizontal",
135
+ defaultValue: "blueprints",
136
+ defaultActivePart: "list",
137
+ tabIndex: -1
138
+ }, /* @__PURE__ */ React2.createElement(Tabs.Viewport, {
139
+ classNames: mx2("max-h-(--radix-popover-content-available-height) grid grid-rows-[1fr_min-content]", '[&_[cmdk-root]]:contents [&_[role="tabpanel"]]:grid [&_[role="tabpanel"]]:grid-rows-[1fr_min-content]', '[&_[role="listbox"]]:min-h-0 [&_[role="listbox"]]:overflow-y-auto', '[&_[role="tabpanel"]]:min-h-0 [&_[role="tabpanel"]]:px-form-chrome [&_[role="tabpanel"][data-state="active"]]:order-first [&_[role="tabpanel"][data-state="inactive"]]:hidden')
140
+ }, /* @__PURE__ */ React2.createElement(Tabs.Panel, {
141
+ value: "blueprints",
142
+ tabIndex: -1,
143
+ classNames: "dx-focus-ring-inset"
144
+ }, /* @__PURE__ */ React2.createElement(BlueprintsPanel, {
145
+ blueprintRegistry,
146
+ db,
147
+ context
148
+ })), /* @__PURE__ */ React2.createElement(Tabs.Panel, {
149
+ value: "model",
150
+ tabIndex: -1,
151
+ classNames: "dx-focus-ring-inset px-0!"
152
+ }, /* @__PURE__ */ React2.createElement(ModelsPanel, {
153
+ presets,
154
+ preset,
155
+ onPresetChange
156
+ })), /* @__PURE__ */ React2.createElement(Tabs.Tablist, {
157
+ classNames: "justify-center p-form-chrome border-y border-subdued-separator order-last"
158
+ }, /* @__PURE__ */ React2.createElement(Tabs.IconTab, {
159
+ value: "blueprints",
160
+ icon: "ph--blueprint--regular",
161
+ label: t("blueprints-in-context.title")
162
+ }), /* @__PURE__ */ React2.createElement(Tabs.IconTab, {
163
+ value: "model",
164
+ label: t("chat-model.title"),
165
+ icon: "ph--cpu--regular"
166
+ }))))), /* @__PURE__ */ React2.createElement(Popover.Arrow, null)))));
167
+ };
168
+ var BlueprintsPanel = ({ blueprintRegistry, db, context }) => {
169
+ const { t } = useTranslation2(meta2.id);
170
+ const blueprints = useBlueprints({
171
+ blueprintRegistry,
172
+ db
173
+ });
174
+ const activeBlueprints = useActiveBlueprints({
175
+ context
176
+ });
177
+ const { onUpdateBlueprint } = useBlueprintHandlers({
178
+ db,
179
+ context,
180
+ blueprintRegistry
181
+ });
182
+ const { results, handleSearch } = useSearchListResults({
183
+ items: blueprints,
184
+ extract: (blueprint) => blueprint.name
185
+ });
186
+ return /* @__PURE__ */ React2.createElement(SearchList.Root, {
187
+ onSearch: handleSearch
188
+ }, /* @__PURE__ */ React2.createElement(SearchList.Content, {
189
+ classNames: "py-form-chrome"
190
+ }, /* @__PURE__ */ React2.createElement(SearchList.Viewport, null, results.map((blueprint) => {
191
+ const isActive = activeBlueprints.has(blueprint.key);
192
+ return /* @__PURE__ */ React2.createElement(SearchList.Item, {
193
+ classNames: "flex items-center overflow-hidden",
194
+ key: blueprint.key,
195
+ value: blueprint.key,
196
+ label: blueprint.name,
197
+ checked: isActive,
198
+ onSelect: () => onUpdateBlueprint?.(blueprint.key, !isActive)
199
+ });
200
+ }))), /* @__PURE__ */ React2.createElement(SearchList.Input, {
201
+ placeholder: t("search.placeholder"),
202
+ classNames: "mb-form-chrome",
203
+ autoFocus: true
204
+ }));
205
+ };
206
+ var ModelsPanel = ({ presets, preset, onPresetChange }) => {
207
+ return /* @__PURE__ */ React2.createElement(Listbox.Root, {
208
+ value: preset,
209
+ onValueChange: onPresetChange,
210
+ autoFocus: true
211
+ }, presets?.map(({ id, label }) => {
212
+ return /* @__PURE__ */ React2.createElement(Listbox.Option, {
213
+ key: id,
214
+ value: id
215
+ }, /* @__PURE__ */ React2.createElement(Listbox.OptionLabel, null, label), /* @__PURE__ */ React2.createElement(Listbox.OptionIndicator, null));
216
+ }));
217
+ };
218
+ var ANY = "__any__";
219
+ var ObjectsPanel = ({ db, context }) => {
220
+ const { t } = useTranslation2(meta2.id);
221
+ const types = useFilteredTypes(db);
222
+ const typenames = useMemo(() => {
223
+ const typenames2 = types.map((type) => {
224
+ const typename2 = Type.getTypename(type);
225
+ return {
226
+ typename: typename2,
227
+ label: t("typename.label", {
228
+ ns: typename2,
229
+ defaultValue: typename2
230
+ })
231
+ };
232
+ });
233
+ typenames2.sort((a, b) => a.label.localeCompare(b.label));
234
+ return typenames2;
235
+ }, [
236
+ types
237
+ ]);
238
+ const [typename, setTypename] = useState(ANY);
239
+ const anyFilter = useMemo(() => Filter.or(...typenames.map(({ typename: typename2 }) => Filter.typename(typename2))), [
240
+ typenames
241
+ ]);
242
+ const objects = useQuery(db, typename === ANY ? anyFilter : Filter.typename(typename));
243
+ const { objects: contextObjects, onUpdateObject } = useContextObjects({
244
+ db,
245
+ context
246
+ });
247
+ const { results, handleSearch } = useSearchListResults({
248
+ items: objects,
249
+ extract: (object) => Obj.getLabel(object) ?? Obj.getTypename(object) ?? object.id
250
+ });
251
+ return /* @__PURE__ */ React2.createElement(SearchList.Root, {
252
+ onSearch: handleSearch
253
+ }, /* @__PURE__ */ React2.createElement(SearchList.Content, {
254
+ classNames: "p-form-chrome [&:has([cmdk-list-sizer]:empty)]:py-0"
255
+ }, /* @__PURE__ */ React2.createElement(SearchList.Viewport, null, results.length ? results.map((object) => {
256
+ const isActive = contextObjects.findIndex((obj) => obj.id === object.id) !== -1;
257
+ const { icon, hue } = Option.fromNullable(Obj.getSchema(object)).pipe(Option.flatMap(Annotation.IconAnnotation.get), Option.getOrElse(() => ({
258
+ icon: DEFAULT_OBJECT_ICON,
259
+ hue: void 0
260
+ })));
261
+ const styles = hue ? getStyles(hue) : void 0;
262
+ return /* @__PURE__ */ React2.createElement(SearchList.Item, {
263
+ classNames: "flex items-center overflow-hidden",
264
+ key: object.id,
265
+ value: object.id,
266
+ icon,
267
+ iconClassNames: styles?.surfaceText,
268
+ label: Obj.getLabel(object) ?? Obj.getTypename(object) ?? object.id,
269
+ checked: isActive,
270
+ onSelect: () => onUpdateObject?.(Obj.getDXN(object), !isActive)
271
+ });
272
+ }) : /* @__PURE__ */ React2.createElement(SearchList.Item, {
273
+ value: "__empty__",
274
+ label: t("no-results.message")
275
+ }))), /* @__PURE__ */ React2.createElement("div", {
276
+ role: "none",
277
+ className: "grid grid-cols-[min-content_1fr] gap-2 px-form-chrome mb-form-chrome"
278
+ }, /* @__PURE__ */ React2.createElement(Select.Root, {
279
+ value: typename === ANY ? void 0 : typename,
280
+ onValueChange: setTypename
281
+ }, /* @__PURE__ */ React2.createElement(Select.TriggerButton, {
282
+ placeholder: t("type-filter.placeholder")
283
+ }), /* @__PURE__ */ React2.createElement(Select.Portal, null, /* @__PURE__ */ React2.createElement(Select.Content, null, /* @__PURE__ */ React2.createElement(Select.ScrollUpButton, null), /* @__PURE__ */ React2.createElement(Select.Viewport, null, /* @__PURE__ */ React2.createElement(Select.Option, {
284
+ value: ANY
285
+ }, t("any-type-filter.label")), typenames.map(({ typename: typename2, label }) => /* @__PURE__ */ React2.createElement(Select.Option, {
286
+ key: typename2,
287
+ value: typename2
288
+ }, label))), /* @__PURE__ */ React2.createElement(Select.ScrollDownButton, null), /* @__PURE__ */ React2.createElement(Select.Arrow, null)))), /* @__PURE__ */ React2.createElement(SearchList.Input, {
289
+ placeholder: t("search.placeholder"),
290
+ classNames: "mb-0",
291
+ autoFocus: true
292
+ })));
293
+ };
294
+ var DEFAULT_OBJECT_ICON = "ph--cube--regular";
295
+
296
+ // src/components/ChatPrompt/ChatPresets.tsx
297
+ import React3 from "react";
298
+ import { Select as Select2 } from "@dxos/react-ui";
299
+
300
+ // src/components/ChatPrompt/ChatReferences.tsx
301
+ import * as Option2 from "effect/Option";
302
+ import React4 from "react";
303
+ import { Annotation as Annotation2, Obj as Obj2 } from "@dxos/echo";
304
+ import { Icon, IconButton as IconButton3, toLocalizedString, useTranslation as useTranslation3 } from "@dxos/react-ui";
305
+ import { getStyles as getStyles2, mx as mx3 } from "@dxos/ui-theme";
306
+ import { useContextObjects as useContextObjects2 } from "#hooks";
307
+ import { meta as meta3 } from "#meta";
308
+ var ChatReferences = ({ classNames, context, db }) => {
309
+ const { t } = useTranslation3(meta3.id);
310
+ const { objects, onUpdateObject } = useContextObjects2({
311
+ db,
312
+ context
313
+ });
314
+ return /* @__PURE__ */ React4.createElement("ul", {
315
+ className: mx3("flex", classNames)
316
+ }, objects.map((obj) => {
317
+ const dxn = Obj2.getDXN(obj);
318
+ const typename = Obj2.getTypename(obj);
319
+ const label = Obj2.getLabel(obj) ?? (typename ? [
320
+ "object-name.placeholder",
321
+ {
322
+ ns: typename
323
+ }
324
+ ] : obj.id);
325
+ const { icon, hue } = Option2.fromNullable(Obj2.getSchema(obj)).pipe(Option2.flatMap(Annotation2.IconAnnotation.get), Option2.getOrElse(() => ({
326
+ icon: DEFAULT_OBJECT_ICON2,
327
+ hue: void 0
328
+ })));
329
+ const styles = hue ? getStyles2(hue) : void 0;
330
+ return /* @__PURE__ */ React4.createElement("li", {
331
+ key: dxn.toString(),
332
+ className: "dx-tag py-0 ps-2 flex items-center gap-1",
333
+ "data-hue": "neutral"
334
+ }, /* @__PURE__ */ React4.createElement(Icon, {
335
+ icon,
336
+ size: 4,
337
+ classNames: styles?.surfaceText
338
+ }), toLocalizedString(label, t), /* @__PURE__ */ React4.createElement(IconButton3, {
339
+ icon: "ph--x--bold",
340
+ iconOnly: true,
341
+ variant: "ghost",
342
+ label: t("remove-object-in-context.label"),
343
+ classNames: "p-0 hover:bg-transparent",
344
+ size: 3,
345
+ onClick: () => onUpdateObject?.(dxn, false)
346
+ }));
347
+ }));
348
+ };
349
+ var DEFAULT_OBJECT_ICON2 = "ph--cube--regular";
350
+
351
+ // src/components/ChatPrompt/ChatStatusIndicator.tsx
352
+ import React5, { useEffect, useState as useState2 } from "react";
353
+ import { Tooltip, useTimeout } from "@dxos/react-ui";
354
+ import { Spinner } from "@dxos/react-ui-sfx";
355
+ import { mx as mx4 } from "@dxos/ui-theme";
356
+ var period = 3e3;
357
+ var ChatStatusIndicator = ({ classNames, preset, processing, error, ...props }) => {
358
+ const [init, setInit] = useState2(false);
359
+ useEffect(() => setInit(false), [
360
+ preset
361
+ ]);
362
+ useTimeout(async () => {
363
+ setInit(true);
364
+ }, period / 2, [
365
+ preset
366
+ ]);
367
+ return /* @__PURE__ */ React5.createElement("div", {
368
+ role: "none",
369
+ className: mx4("relative flex", classNames)
370
+ }, /* @__PURE__ */ React5.createElement(Spinner, {
371
+ duration: period,
372
+ state: !init ? "flash" : error ? "error" : processing ? "spin" : "pulse",
373
+ ...props
374
+ }), error && /* @__PURE__ */ React5.createElement(Tooltip.Trigger, {
375
+ asChild: true,
376
+ content: error.message
377
+ }, /* @__PURE__ */ React5.createElement("div", {
378
+ className: "absolute inset-0"
379
+ })));
380
+ };
381
+
382
+ // src/components/ChatThread/ChatThread.tsx
383
+ import React9, { forwardRef, useCallback as useCallback2, useEffect as useEffect3, useMemo as useMemo3, useState as useState4 } from "react";
384
+ import { PublicKey } from "@dxos/keys";
385
+ import { setRef } from "@dxos/react-ui";
386
+ import { MarkdownStream } from "@dxos/react-ui-components";
387
+ import { mx as mx6 } from "@dxos/ui-theme";
388
+ import { keyToFallback } from "@dxos/util";
389
+
390
+ // src/components/ChatThread/registry.tsx
391
+ import { log } from "@dxos/log";
392
+ import { ContentBlock } from "@dxos/types";
393
+ import { getXmlTextChild } from "@dxos/ui-editor";
394
+
395
+ // src/components/ChatThread/widgets/FallbackWidget.tsx
396
+ import React6 from "react";
397
+ import { TogglePanel } from "@dxos/react-ui-components";
398
+ import { Json } from "@dxos/react-ui-syntax-highlighter";
399
+ var FallbackWidget = ({ _tag, ...props }) => {
400
+ return /* @__PURE__ */ React6.createElement(TogglePanel.Root, {
401
+ classNames: "rounded-xs"
402
+ }, /* @__PURE__ */ React6.createElement(TogglePanel.Header, {
403
+ classNames: "bg-group-surface"
404
+ }, _tag), /* @__PURE__ */ React6.createElement(TogglePanel.Content, {
405
+ classNames: "bg-modal-surface"
406
+ }, /* @__PURE__ */ React6.createElement(Json.Data, {
407
+ classNames: "p-2! text-sm",
408
+ data: props
409
+ })));
410
+ };
411
+ FallbackWidget.displayName = "Fallback";
412
+
413
+ // src/components/ChatThread/widgets/PromptWidget.ts
414
+ import { WidgetType } from "@codemirror/view";
415
+ import { Domino } from "@dxos/ui";
416
+ var PromptWidget = class extends WidgetType {
417
+ text;
418
+ constructor(text) {
419
+ super(), this.text = text;
420
+ }
421
+ eq(other) {
422
+ return this.text === other.text;
423
+ }
424
+ /**
425
+ * NOTE: Container must set var based on user's identity.
426
+ */
427
+ toDOM() {
428
+ const inner = Domino.of("div").classNames("px-3 py-1.5 bg-(--user-fill) rounded-xs").text(this.text);
429
+ return Domino.of("div").classNames("flex justify-end my-2").append(inner).root;
430
+ }
431
+ };
432
+
433
+ // src/components/ChatThread/widgets/ReasoningWidget.ts
434
+ import { WidgetType as WidgetType2 } from "@codemirror/view";
435
+ import { Domino as Domino2 } from "@dxos/ui";
436
+ var ReasoningWidget = class extends WidgetType2 {
437
+ text;
438
+ #pos;
439
+ /** The timer id last registered for this instance (may differ from the map if superseded). */
440
+ #ownedTimerId = null;
441
+ constructor(text, pos) {
442
+ super(), this.text = text;
443
+ this.#pos = pos === void 0 || pos === "" ? "reasoning" : String(pos);
444
+ }
445
+ eq(other) {
446
+ return this.text === other.text && this.#pos === other.#pos;
447
+ }
448
+ toDOM() {
449
+ return Domino2.of("div").classNames("pt-2 pb-4").append(Domino2.of("div").classNames("relative overflow-hidden p-px rounded-sm border border-subdued-separator").append(Domino2.of("div").classNames("relative z-10 bg-base-surface rounded-sm text-sm text-description p-2").attributes({
450
+ "data-reasoning-text": ""
451
+ }).text(this.text), Domino2.of("div").attributes({
452
+ "data-id": this.#pos
453
+ }))).root;
454
+ }
455
+ updateDOM(dom) {
456
+ dom.querySelector("[data-reasoning-text]")?.replaceChildren(this.text);
457
+ const trailHost = dom.querySelector("[data-id]");
458
+ if (trailHost?.childElementCount === 0) {
459
+ trailHost.append(...createTrailLayers());
460
+ }
461
+ this.#scheduleTrailRemoval(dom);
462
+ return true;
463
+ }
464
+ destroy(_dom) {
465
+ this.#clearOwnedTrailTimer();
466
+ }
467
+ #scheduleTrailRemoval(dom) {
468
+ const previous = trailRemovalTimers.get(this.#pos);
469
+ if (previous !== void 0) {
470
+ clearTimeout(previous);
471
+ }
472
+ const timerId = setTimeout(() => {
473
+ if (trailRemovalTimers.get(this.#pos) !== timerId) {
474
+ return;
475
+ }
476
+ trailRemovalTimers.delete(this.#pos);
477
+ this.#ownedTimerId = null;
478
+ dom.querySelector("[data-id]")?.remove();
479
+ }, TRAIL_REMOVAL_DELAY_MS);
480
+ trailRemovalTimers.set(this.#pos, timerId);
481
+ this.#ownedTimerId = timerId;
482
+ }
483
+ #clearOwnedTrailTimer() {
484
+ const active = trailRemovalTimers.get(this.#pos);
485
+ if (active !== void 0 && active === this.#ownedTimerId) {
486
+ clearTimeout(active);
487
+ trailRemovalTimers.delete(this.#pos);
488
+ }
489
+ this.#ownedTimerId = null;
490
+ }
491
+ };
492
+ var trail = [
493
+ "absolute z-0 aspect-[2/1] w-16",
494
+ "bg-[radial-gradient(at_100%_50%,_theme(colors.green.700),_transparent_80%)]",
495
+ "[offset-anchor:100%_50%] [offset-path:border-box]"
496
+ ];
497
+ var TRAIL_REMOVAL_DELAY_MS = 1e3;
498
+ var trailRemovalTimers = /* @__PURE__ */ new Map();
499
+ var createTrailLayers = () => [
500
+ Domino2.of("div").classNames(...trail, "animate-trail").root,
501
+ Domino2.of("div").classNames(...trail, "animate-trail-offset").root
502
+ ];
503
+
504
+ // src/components/ChatThread/widgets/ReferenceWidget.ts
505
+ import { WidgetType as WidgetType3 } from "@codemirror/view";
506
+ import { Domino as Domino3 } from "@dxos/ui";
507
+ var ReferenceWidget = class extends WidgetType3 {
508
+ text;
509
+ dxn;
510
+ constructor(text, dxn) {
511
+ super(), this.text = text, this.dxn = dxn;
512
+ }
513
+ eq(other) {
514
+ return this.dxn === other.dxn;
515
+ }
516
+ toDOM() {
517
+ return Domino3.of("div").classNames("pt-2 pb-2").append(Domino3.of("dx-anchor").classNames("dx-tag--anchor").attributes({
518
+ dxn: this.dxn
519
+ }).text(this.text)).root;
520
+ }
521
+ };
522
+
523
+ // src/components/ChatThread/widgets/SelectWidget.ts
524
+ import { WidgetType as WidgetType4 } from "@codemirror/view";
525
+ import { Domino as Domino4 } from "@dxos/ui";
526
+ var SelectWidget = class extends WidgetType4 {
527
+ options;
528
+ constructor(options) {
529
+ super(), this.options = options;
530
+ }
531
+ eq(other) {
532
+ return JSON.stringify(this.options) === JSON.stringify(other.options);
533
+ }
534
+ /**
535
+ * NOTE: Container must set var based on user's identity.
536
+ */
537
+ toDOM() {
538
+ return Domino4.of("div").attributes({
539
+ role: "group"
540
+ }).classNames("flex flex-wrap pt-2 pb-2 gap-1").append(...this.options.map((option) => Domino4.of("button").classNames("dx-button inline-block max-w-[100cqi]").attributes({
541
+ "data-action": "submit",
542
+ "data-value": option,
543
+ "data-density": "fine"
544
+ }).text(option))).root;
545
+ }
546
+ };
547
+
548
+ // src/components/ChatThread/widgets/StatsWidget.ts
549
+ import { WidgetType as WidgetType5 } from "@codemirror/view";
550
+ import { Domino as Domino5 } from "@dxos/ui";
551
+ var StatsWidget = class extends WidgetType5 {
552
+ text;
553
+ constructor(text) {
554
+ super(), this.text = text;
555
+ }
556
+ eq(other) {
557
+ return this.text === other.text;
558
+ }
559
+ toDOM() {
560
+ return Domino5.of("div").classNames("pt-2 pb-4 text-sm text-placeholder").text(this.text).root;
561
+ }
562
+ updateDOM(dom) {
563
+ dom.textContent = this.text;
564
+ return true;
565
+ }
566
+ };
567
+
568
+ // src/components/ChatThread/widgets/SummaryWidget.tsx
569
+ import React7 from "react";
570
+ import { useTranslation as useTranslation4 } from "@dxos/react-ui";
571
+ import { TogglePanel as TogglePanel2 } from "@dxos/react-ui-components";
572
+ import { meta as meta4 } from "#meta";
573
+ var SummaryWidget = ({ children }) => {
574
+ const { t } = useTranslation4(meta4.id);
575
+ return /* @__PURE__ */ React7.createElement(TogglePanel2.Root, {
576
+ classNames: "border border-separator rounded-sm"
577
+ }, /* @__PURE__ */ React7.createElement(TogglePanel2.Header, {
578
+ classNames: "text-sm bg-group-surface"
579
+ }, t("summary.label")), /* @__PURE__ */ React7.createElement(TogglePanel2.Content, null, /* @__PURE__ */ React7.createElement("div", {
580
+ role: "none",
581
+ className: "p-1 text-sm text-description"
582
+ }, children)));
583
+ };
584
+
585
+ // src/components/ChatThread/widgets/SuggestionWidget.ts
586
+ import { WidgetType as WidgetType6 } from "@codemirror/view";
587
+ import { Domino as Domino6, mx as mx5 } from "@dxos/ui";
588
+ var SuggestionWidget = class extends WidgetType6 {
589
+ text;
590
+ constructor(text) {
591
+ super(), this.text = text;
592
+ }
593
+ eq(other) {
594
+ return this.text === other.text;
595
+ }
596
+ toDOM() {
597
+ return Domino6.of("span").classNames(mx5("inline-flex max-w-[calc(100cqi-8px)] my-1 pe-2 overflow-hidden")).append(Domino6.of("button").attributes({
598
+ "data-action": "submit",
599
+ "data-density": "fine",
600
+ "data-value": this.text
601
+ }).classNames(mx5("dx-button gap-2 w-full overflow-hidden")).append(Domino6.of("dx-icon").attributes({
602
+ icon: "ph--lightning--regular"
603
+ }), Domino6.of("span").classNames("flex-1 truncate min-w-0").text(this.text))).root;
604
+ }
605
+ };
606
+
607
+ // src/components/ChatThread/widgets/ToolWidget.tsx
608
+ import React8, { useCallback, useEffect as useEffect2, useMemo as useMemo2, useRef, useState as useState3 } from "react";
609
+ import { useTranslation as useTranslation5 } from "@dxos/react-ui";
610
+ import { NumericTabs, TextCrawl, TogglePanel as TogglePanel3 } from "@dxos/react-ui-components";
611
+ import { Json as Json2 } from "@dxos/react-ui-syntax-highlighter";
612
+ import { isNonNullable, safeParseJson } from "@dxos/util";
613
+ import { meta as meta5 } from "#meta";
614
+ var ToolWidget = ({ view, blocks = [] }) => {
615
+ const { t } = useTranslation5(meta5.id);
616
+ const items = useMemo2(() => {
617
+ let lastToolCall;
618
+ const tools = [];
619
+ return blocks.filter((block) => block._tag === "toolCall" || block._tag === "toolResult" || block._tag === "stats").map((block) => {
620
+ switch (block._tag) {
621
+ case "toolCall": {
622
+ if (block.pending && lastToolCall?.block.toolCallId === block.toolCallId) {
623
+ return null;
624
+ }
625
+ const tool = tools.find((tool2) => tool2.name === block.name);
626
+ lastToolCall = {
627
+ tool,
628
+ block
629
+ };
630
+ return {
631
+ title: tool?.description ?? [
632
+ t("tool-call.label"),
633
+ block.name
634
+ ].filter(Boolean).join(" "),
635
+ content: {
636
+ ...block,
637
+ input: safeParseJson(block.input)
638
+ }
639
+ };
640
+ }
641
+ case "toolResult": {
642
+ if (block.error) {
643
+ return {
644
+ title: t("tool-error.label"),
645
+ content: block
646
+ };
647
+ }
648
+ const title = lastToolCall?.tool?.description ?? [
649
+ t("tool-result.label"),
650
+ lastToolCall?.block.name
651
+ ].filter(Boolean).join(" ");
652
+ lastToolCall = void 0;
653
+ return {
654
+ title,
655
+ content: {
656
+ ...block,
657
+ result: safeParseJson(block.result)
658
+ }
659
+ };
660
+ }
661
+ case "stats": {
662
+ if (!lastToolCall) {
663
+ return null;
664
+ }
665
+ return {
666
+ title: t("stats.label"),
667
+ content: block
668
+ };
669
+ }
670
+ }
671
+ }).filter(isNonNullable);
672
+ }, [
673
+ blocks,
674
+ t
675
+ ]);
676
+ const handleChangeOpen = useCallback(() => {
677
+ setTimeout(() => {
678
+ view?.requestMeasure();
679
+ }, 1e3);
680
+ }, [
681
+ view
682
+ ]);
683
+ if (!items.length) {
684
+ return null;
685
+ }
686
+ return /* @__PURE__ */ React8.createElement(ToolPanel, {
687
+ items,
688
+ onChangeOpen: handleChangeOpen
689
+ });
690
+ };
691
+ var ToolPanel = ({ items, onChangeOpen }) => {
692
+ const tabsRef = useRef(null);
693
+ const [selected, setSelected] = useState3(0);
694
+ const [open, setOpen] = useState3(false);
695
+ useEffect2(() => {
696
+ onChangeOpen?.(open);
697
+ if (open) {
698
+ tabsRef.current?.focus();
699
+ }
700
+ }, [
701
+ open,
702
+ onChangeOpen
703
+ ]);
704
+ const handleSelect = useCallback((index) => {
705
+ setSelected(index);
706
+ }, []);
707
+ return /* @__PURE__ */ React8.createElement(TogglePanel3.Root, {
708
+ classNames: "w-full rounded-xs border border-subdued-separator",
709
+ open,
710
+ onChangeOpen: setOpen
711
+ }, /* @__PURE__ */ React8.createElement(TogglePanel3.Header, {
712
+ classNames: "text-sm text-placeholder"
713
+ }, /* @__PURE__ */ React8.createElement(TextCrawl, {
714
+ key: "status-roll",
715
+ lines: items.map((item) => item.title),
716
+ autoAdvance: true,
717
+ greedy: true
718
+ })), /* @__PURE__ */ React8.createElement(TogglePanel3.Content, {
719
+ classNames: "grid grid-cols-[32px_1fr]"
720
+ }, /* @__PURE__ */ React8.createElement(NumericTabs, {
721
+ ref: tabsRef,
722
+ classNames: "p-1",
723
+ length: items.length,
724
+ selected,
725
+ onSelect: handleSelect
726
+ }), /* @__PURE__ */ React8.createElement(Json2.Data, {
727
+ data: items[selected]?.content,
728
+ classNames: "p-1 text-xs bg-transparent",
729
+ replacer: {
730
+ maxDepth: 3,
731
+ maxArrayLen: 10,
732
+ maxStringLen: 128
733
+ }
734
+ })));
735
+ };
736
+
737
+ // src/components/ChatThread/registry.tsx
738
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/components/ChatThread/registry.tsx";
739
+ var componentRegistry = {
740
+ //
741
+ // DOM Widgets
742
+ //
743
+ prompt: {
744
+ block: true,
745
+ factory: ({ children }) => {
746
+ const text = getXmlTextChild(children);
747
+ return text ? new PromptWidget(text) : null;
748
+ }
749
+ },
750
+ reasoning: {
751
+ block: true,
752
+ streaming: true,
753
+ factory: ({ children, range }) => {
754
+ const text = getXmlTextChild(children);
755
+ return text ? new ReasoningWidget(text, range.from) : null;
756
+ }
757
+ },
758
+ reference: {
759
+ block: false,
760
+ factory: ({ children, ref }) => {
761
+ const text = getXmlTextChild(children);
762
+ return text && ref ? new ReferenceWidget(text, ref) : null;
763
+ }
764
+ },
765
+ select: {
766
+ block: true,
767
+ factory: ({ children }) => {
768
+ const options = children?.map((option) => option._tag === "option" && getXmlTextChild(option.children)).filter(Boolean);
769
+ return options?.length ? new SelectWidget(options) : null;
770
+ }
771
+ },
772
+ suggestion: {
773
+ block: true,
774
+ factory: ({ children }) => {
775
+ const text = getXmlTextChild(children);
776
+ return text ? new SuggestionWidget(text) : null;
777
+ }
778
+ },
779
+ stats: {
780
+ block: true,
781
+ factory: ({ children }) => {
782
+ const text = getXmlTextChild(children);
783
+ return text ? new StatsWidget(text) : null;
784
+ }
785
+ },
786
+ //
787
+ // React Widgets (portaled outside of the editor)
788
+ //
789
+ summary: {
790
+ block: true,
791
+ Component: SummaryWidget
792
+ },
793
+ toolCall: {
794
+ block: true,
795
+ Component: ToolWidget
796
+ },
797
+ toolResult: {
798
+ block: true,
799
+ Component: FallbackWidget
800
+ },
801
+ toolkit: {
802
+ block: true,
803
+ Component: FallbackWidget
804
+ },
805
+ //
806
+ // Fallback
807
+ //
808
+ json: {
809
+ block: true,
810
+ Component: FallbackWidget
811
+ }
812
+ };
813
+ var blockToMarkdown = (context, message, block) => {
814
+ let str = blockToMarkdownImpl(context, message, block);
815
+ if (str && !block.pending) {
816
+ return str += "\n";
817
+ }
818
+ return str;
819
+ };
820
+ var blockToMarkdownImpl = (context, message, block) => {
821
+ log("blockToMarkdown", {
822
+ block: JSON.stringify(block)
823
+ }, {
824
+ F: __dxlog_file,
825
+ L: 125,
826
+ S: void 0,
827
+ C: (f, a) => f(...a)
828
+ });
829
+ switch (block._tag) {
830
+ case "text": {
831
+ if (message.sender.role === "user") {
832
+ return `<prompt>${block.text}</prompt>`;
833
+ } else {
834
+ const text = block.text.trim();
835
+ if (text.length > 0) {
836
+ return text;
837
+ }
838
+ }
839
+ break;
840
+ }
841
+ case "reference": {
842
+ if (block.pending) {
843
+ return;
844
+ }
845
+ const dxn = block.reference.dxn;
846
+ return `<reference ref="${dxn.toString()}">${context.getObjectLabel(dxn)}</reference>`;
847
+ }
848
+ case "suggestion": {
849
+ if (block.pending) {
850
+ return;
851
+ }
852
+ return `<suggestion>${block.text}</suggestion>`;
853
+ }
854
+ case "select": {
855
+ if (block.pending || block.options.length === 0) {
856
+ return;
857
+ }
858
+ return `<select>${block.options.map((option) => `<option>${option}</option>`).join("")}</select>`;
859
+ }
860
+ case "toolCall": {
861
+ context.updateWidget(block.toolCallId, {
862
+ blocks: [
863
+ block
864
+ ]
865
+ });
866
+ return `<toolCall id="${block.toolCallId}" />`;
867
+ }
868
+ case "toolResult": {
869
+ context.updateWidget(block.toolCallId, ({ blocks = [] } = {
870
+ blocks: []
871
+ }) => ({
872
+ blocks: [
873
+ ...blocks,
874
+ block
875
+ ]
876
+ }));
877
+ break;
878
+ }
879
+ case "stats": {
880
+ return renderXMLBlock("stats", {
881
+ content: ContentBlock.createStatsMessage(block)
882
+ });
883
+ }
884
+ case "reasoning": {
885
+ let text = block.reasoningText ?? block.redactedText;
886
+ if (!text) {
887
+ return;
888
+ }
889
+ return renderXMLBlock("reasoning", {
890
+ content: text,
891
+ pending: block.pending
892
+ });
893
+ }
894
+ case "summary": {
895
+ return renderXMLBlock("summary", {
896
+ content: block.content,
897
+ pending: block.pending
898
+ });
899
+ }
900
+ default: {
901
+ return `<json id="${message.id}">
902
+ ${JSON.stringify(block)}
903
+ </json>`;
904
+ }
905
+ }
906
+ };
907
+ var renderXMLBlock = (tag, opts) => {
908
+ const content = (opts.content ?? "").replace(/\n\n/g, " ").trim();
909
+ if (opts.pending) {
910
+ return `<${tag}${opts.attributes ? ` ${opts.attributes}` : ""}>${content}`;
911
+ } else {
912
+ return `<${tag}${opts.attributes ? ` ${opts.attributes}` : ""}>${content}</${tag}>`;
913
+ }
914
+ };
915
+
916
+ // src/components/ChatThread/sync.ts
917
+ import { log as log2 } from "@dxos/log";
918
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/components/ChatThread/sync.ts";
919
+ var MessageThreadContext = class {
920
+ _widgetState;
921
+ constructor(_widgetState) {
922
+ this._widgetState = _widgetState;
923
+ }
924
+ updateWidget(id, value2) {
925
+ this._widgetState?.updateWidget(id, value2);
926
+ }
927
+ // TODO(burdon): Resolve from hypergraph.
928
+ getObjectLabel(_id) {
929
+ return "Object";
930
+ }
931
+ };
932
+ var MessageSyncer = class {
933
+ _document;
934
+ _renderer;
935
+ _initialMessageId;
936
+ _currentMessageIndex = 0;
937
+ _currentBlockIndex = 0;
938
+ _currentBlockContent;
939
+ _context;
940
+ constructor(_document, _renderer) {
941
+ this._document = _document;
942
+ this._renderer = _renderer;
943
+ this._context = new MessageThreadContext(this._document);
944
+ }
945
+ get context() {
946
+ return this._context;
947
+ }
948
+ reset() {
949
+ log2("reset", void 0, {
950
+ F: __dxlog_file2,
951
+ L: 64,
952
+ S: this,
953
+ C: (f, a) => f(...a)
954
+ });
955
+ this._initialMessageId = void 0;
956
+ this._currentMessageIndex = 0;
957
+ this._currentBlockIndex = 0;
958
+ this._currentBlockContent = void 0;
959
+ void this._document.setContent("");
960
+ }
961
+ /**
962
+ * Syncs messages with the editor.
963
+ */
964
+ append(messages, flush = false) {
965
+ if (this._initialMessageId !== messages[0]?.id) {
966
+ this.reset();
967
+ this._initialMessageId = messages[0]?.id;
968
+ }
969
+ if (this._document.length === 0 && flush) {
970
+ const buffer = [];
971
+ this.processBlocks(messages, (content2) => buffer.push(content2));
972
+ const content = buffer.join("");
973
+ void this._document.setContent(content);
974
+ return true;
975
+ } else {
976
+ this.processBlocks(messages, (content) => {
977
+ void this._document.append(content);
978
+ });
979
+ return false;
980
+ }
981
+ }
982
+ processBlocks(messages, append) {
983
+ let i = this._currentMessageIndex;
984
+ for (const message of messages.slice(this._currentMessageIndex)) {
985
+ if (i > this._currentMessageIndex) {
986
+ this._currentBlockIndex = 0;
987
+ }
988
+ this._currentMessageIndex = i;
989
+ let j = this._currentBlockIndex;
990
+ for (const block of message.blocks.slice(this._currentBlockIndex)) {
991
+ this._currentBlockIndex = j;
992
+ const currentBlockContent = this._renderer(this._context, message, block);
993
+ if (currentBlockContent) {
994
+ let content = "";
995
+ if (this._currentBlockContent && currentBlockContent.startsWith(this._currentBlockContent)) {
996
+ content = currentBlockContent.slice(this._currentBlockContent.length);
997
+ } else {
998
+ content = currentBlockContent;
999
+ }
1000
+ this._currentBlockContent = currentBlockContent;
1001
+ append(content);
1002
+ }
1003
+ if (block.pending) {
1004
+ return;
1005
+ } else {
1006
+ this._currentBlockContent = void 0;
1007
+ this._currentBlockIndex++;
1008
+ }
1009
+ j++;
1010
+ }
1011
+ i++;
1012
+ }
1013
+ }
1014
+ };
1015
+
1016
+ // src/components/ChatThread/ChatThread.tsx
1017
+ var defaultOptions = {
1018
+ autoScroll: true,
1019
+ // wire: true,
1020
+ cursor: true
1021
+ };
1022
+ var ChatThread = /* @__PURE__ */ forwardRef(({ classNames, identity, messages = [], error, options = defaultOptions, debug = false, onEvent }, forwardedRef) => {
1023
+ const [controller, setController] = useState4(null);
1024
+ const handleMarkdownStreamRef = useCallback2((instance) => {
1025
+ setController(instance);
1026
+ setRef(forwardedRef, instance);
1027
+ }, [
1028
+ forwardedRef
1029
+ ]);
1030
+ const userHue = useMemo3(() => identity?.profile?.data?.hue || keyToFallback(identity?.identityKey ?? PublicKey.random()).hue, [
1031
+ identity
1032
+ ]);
1033
+ useEffect3(() => {
1034
+ controller?.scrollToBottom();
1035
+ }, [
1036
+ controller,
1037
+ error
1038
+ ]);
1039
+ const syncer = useMemo3(() => controller && new MessageSyncer(controller, blockToMarkdown), [
1040
+ controller
1041
+ ]);
1042
+ useEffect3(() => {
1043
+ const reset = syncer?.append(messages, true);
1044
+ if (reset) {
1045
+ controller?.scrollToBottom("instant");
1046
+ }
1047
+ }, [
1048
+ controller,
1049
+ syncer,
1050
+ messages
1051
+ ]);
1052
+ const handleEvent = useCallback2(({ type, value: value2 }) => {
1053
+ switch (type) {
1054
+ case "submit": {
1055
+ value2 && onEvent?.({
1056
+ type,
1057
+ text: value2
1058
+ });
1059
+ break;
1060
+ }
1061
+ }
1062
+ }, [
1063
+ onEvent
1064
+ ]);
1065
+ return /* @__PURE__ */ React9.createElement("div", {
1066
+ role: "none",
1067
+ className: mx6("flex h-full w-full justify-center overflow-hidden", classNames),
1068
+ style: {
1069
+ "--user-fill": `var(--color-${userHue}-fill)`
1070
+ }
1071
+ }, /* @__PURE__ */ React9.createElement(MarkdownStream, {
1072
+ registry: componentRegistry,
1073
+ options,
1074
+ debug,
1075
+ onEvent: handleEvent,
1076
+ ref: handleMarkdownStreamRef
1077
+ }));
1078
+ });
1079
+
1080
+ // src/components/Chat/Chat.tsx
1081
+ var [ChatContextProvider, useChatContext] = createContext("Chat");
1082
+ var ChatRoot = ({ children, chat, queue, processor, onEvent, ...props }) => {
1083
+ const [debug, setDebug] = useState5(false);
1084
+ const pending = useAtomValue(processor.messages);
1085
+ const streaming = useAtomValue(processor.streaming);
1086
+ const lastPrompt = useRef2(void 0);
1087
+ const storedMessages = useQuery2(queue, Filter2.type(Message.Message));
1088
+ const messages = useMemo4(() => {
1089
+ return Array2.dedupeWith([
1090
+ ...storedMessages,
1091
+ ...pending
1092
+ ], ({ id: a }, { id: b }) => a === b);
1093
+ }, [
1094
+ storedMessages,
1095
+ pending
1096
+ ]);
1097
+ const dump = useCallback3(async () => {
1098
+ const objects = processor.context.getObjects();
1099
+ const blueprints = processor.context.getBlueprints();
1100
+ const system = await processor.getSystemPrompt();
1101
+ const tools = await processor.getTools();
1102
+ console.group("Chat", {
1103
+ objects,
1104
+ blueprints
1105
+ });
1106
+ console.log(trim`
1107
+ System Prompt:
1108
+ ${system}
1109
+ `);
1110
+ console.log(trim`
1111
+ Tools:
1112
+ ${Object.values(tools).map((tool) => JSON.stringify(tool, null, 2)).join("\n")}
1113
+ `);
1114
+ console.groupEnd();
1115
+ }, [
1116
+ processor
1117
+ ]);
1118
+ const event = useMemo4(() => new Event(), []);
1119
+ useEffect4(() => {
1120
+ return event.on((ev) => {
1121
+ switch (ev.type) {
1122
+ case "toggle-debug": {
1123
+ setDebug((debug2) => {
1124
+ if (debug2) {
1125
+ return false;
1126
+ } else {
1127
+ void dump();
1128
+ return true;
1129
+ }
1130
+ });
1131
+ break;
1132
+ }
1133
+ case "submit": {
1134
+ const text = ev.text.trim();
1135
+ if (!streaming && text.length) {
1136
+ lastPrompt.current = ev.text;
1137
+ void processor.request({
1138
+ message: text
1139
+ });
1140
+ }
1141
+ break;
1142
+ }
1143
+ case "retry": {
1144
+ if (!streaming) {
1145
+ void processor.retry();
1146
+ }
1147
+ break;
1148
+ }
1149
+ case "cancel": {
1150
+ if (streaming) {
1151
+ void processor.cancel();
1152
+ if (lastPrompt.current) {
1153
+ event.emit({
1154
+ type: "update-prompt",
1155
+ text: lastPrompt.current
1156
+ });
1157
+ }
1158
+ }
1159
+ break;
1160
+ }
1161
+ }
1162
+ onEvent?.(ev);
1163
+ });
1164
+ }, [
1165
+ event,
1166
+ dump,
1167
+ processor,
1168
+ streaming,
1169
+ onEvent
1170
+ ]);
1171
+ const db = props.db ?? (chat && Obj3.getDatabase(chat));
1172
+ return /* @__PURE__ */ React10.createElement(ChatContextProvider, {
1173
+ debug,
1174
+ event,
1175
+ db,
1176
+ chat,
1177
+ messages,
1178
+ processor,
1179
+ ...props
1180
+ }, children);
1181
+ };
1182
+ ChatRoot.displayName = "Chat.Root";
1183
+ var CHAT_VIEWPORT_NAME = "Chat.Viewport";
1184
+ var ChatViewport = composable(({ children, ...props }, forwardedRef) => {
1185
+ return /* @__PURE__ */ React10.createElement("div", {
1186
+ ...composableProps(props, {
1187
+ classNames: "dx-expander flex flex-col"
1188
+ }),
1189
+ ref: forwardedRef
1190
+ }, children);
1191
+ });
1192
+ ChatViewport.displayName = CHAT_VIEWPORT_NAME;
1193
+ var CHAT_THREAD_NAME = "Chat.Thread";
1194
+ var ChatThread2 = (props) => {
1195
+ const { debug, event, messages, processor } = useChatContext(CHAT_THREAD_NAME);
1196
+ const identity = useIdentity();
1197
+ const error = useAtomValue(processor.error).pipe(Option3.getOrUndefined);
1198
+ const controllerRef = useRef2(null);
1199
+ useEffect4(() => {
1200
+ return event.on((event2) => {
1201
+ switch (event2.type) {
1202
+ case "submit":
1203
+ case "scroll-to-bottom":
1204
+ controllerRef.current?.scrollToBottom();
1205
+ break;
1206
+ case "nav-previous":
1207
+ controllerRef.current?.navigatePrevious();
1208
+ break;
1209
+ case "nav-next":
1210
+ controllerRef.current?.navigateNext();
1211
+ break;
1212
+ }
1213
+ });
1214
+ }, [
1215
+ event
1216
+ ]);
1217
+ const handleEvent = useCallback3((ev) => {
1218
+ event.emit(ev);
1219
+ }, [
1220
+ event
1221
+ ]);
1222
+ if (!identity) {
1223
+ return null;
1224
+ }
1225
+ return /* @__PURE__ */ React10.createElement(ChatThread, {
1226
+ ...props,
1227
+ identity,
1228
+ messages,
1229
+ error,
1230
+ debug,
1231
+ onEvent: handleEvent,
1232
+ ref: controllerRef
1233
+ });
1234
+ };
1235
+ ChatThread2.displayName = CHAT_THREAD_NAME;
1236
+ var CHAT_PROMPT_NAME = "Chat.Prompt";
1237
+ var ChatPrompt = ({ classNames, outline, settings = true, placeholder, expandable, online, presets, preset, onPresetChange, onOnlineChange }) => {
1238
+ const { t } = useTranslation6(meta6.id);
1239
+ const { db, processor, event } = useChatContext(CHAT_PROMPT_NAME);
1240
+ const error = useAtomValue(processor.error).pipe(Option3.getOrUndefined);
1241
+ const streaming = useAtomValue(processor.streaming);
1242
+ const active = useAtomValue(processor.active);
1243
+ const activeRef = useDynamicRef(active);
1244
+ const editorRef = useRef2(null);
1245
+ const [recordingState, setRecordingState] = useState5(false);
1246
+ useEffect4(() => {
1247
+ return event.on((event2) => {
1248
+ switch (event2.type) {
1249
+ case "update-prompt":
1250
+ if (!editorRef.current?.getText()?.length) {
1251
+ editorRef.current?.setText(event2.text);
1252
+ editorRef.current?.focus();
1253
+ }
1254
+ break;
1255
+ case "record-start":
1256
+ setRecordingState(true);
1257
+ break;
1258
+ case "record-stop":
1259
+ setRecordingState(false);
1260
+ break;
1261
+ }
1262
+ });
1263
+ }, [
1264
+ event
1265
+ ]);
1266
+ const { recording } = useVoiceInput({
1267
+ active: recordingState,
1268
+ onUpdate: (text) => {
1269
+ editorRef.current?.setText(text);
1270
+ editorRef.current?.focus();
1271
+ }
1272
+ });
1273
+ const extensions = useMemo4(() => {
1274
+ return [
1275
+ Prec.highest(keymap.of([
1276
+ {
1277
+ key: "Mod-d",
1278
+ preventDefault: true,
1279
+ run: () => {
1280
+ event.emit({
1281
+ type: "toggle-debug"
1282
+ });
1283
+ return true;
1284
+ }
1285
+ },
1286
+ {
1287
+ key: "Mod-ArrowUp",
1288
+ preventDefault: true,
1289
+ run: () => {
1290
+ event.emit({
1291
+ type: "nav-previous"
1292
+ });
1293
+ return true;
1294
+ },
1295
+ shift: () => {
1296
+ event.emit({
1297
+ type: "thread-open"
1298
+ });
1299
+ return true;
1300
+ }
1301
+ },
1302
+ {
1303
+ key: "Mod-ArrowDown",
1304
+ preventDefault: true,
1305
+ run: () => {
1306
+ event.emit({
1307
+ type: "nav-next"
1308
+ });
1309
+ return true;
1310
+ },
1311
+ shift: () => {
1312
+ event.emit({
1313
+ type: "thread-close"
1314
+ });
1315
+ return true;
1316
+ }
1317
+ }
1318
+ ]))
1319
+ ].filter(isTruthy);
1320
+ }, [
1321
+ event,
1322
+ expandable
1323
+ ]);
1324
+ const handleSubmit = useCallback3((text) => {
1325
+ if (!activeRef.current) {
1326
+ event.emit({
1327
+ type: "submit",
1328
+ text
1329
+ });
1330
+ return true;
1331
+ }
1332
+ }, [
1333
+ event
1334
+ ]);
1335
+ const handleEvent = useCallback3((ev) => {
1336
+ event.emit(ev);
1337
+ }, [
1338
+ event
1339
+ ]);
1340
+ return /* @__PURE__ */ React10.createElement("div", {
1341
+ role: "group",
1342
+ className: mx7("flex flex-col w-full dx-density-fine", outline && "bg-group-surface border border-subdued-separator transition transition-border [&:has(.cm-content:focus)]:border-separator rounded-sm", classNames)
1343
+ }, /* @__PURE__ */ React10.createElement("div", {
1344
+ role: "none",
1345
+ className: "flex p-2 gap-2"
1346
+ }, /* @__PURE__ */ React10.createElement(ChatStatusIndicator, {
1347
+ classNames: "p-1",
1348
+ preset,
1349
+ error,
1350
+ processing: streaming
1351
+ }), /* @__PURE__ */ React10.createElement(ChatEditor, {
1352
+ ref: editorRef,
1353
+ autoFocus: true,
1354
+ lineWrapping: true,
1355
+ classNames: "col-span-2 pt-0.5",
1356
+ placeholder: placeholder ?? t("prompt.placeholder"),
1357
+ extensions,
1358
+ onSubmit: handleSubmit
1359
+ })), db && settings && /* @__PURE__ */ React10.createElement("div", {
1360
+ role: "none",
1361
+ className: "flex items-center overflow-hidden"
1362
+ }, /* @__PURE__ */ React10.createElement(ChatOptions, {
1363
+ db,
1364
+ blueprintRegistry: processor.blueprintRegistry,
1365
+ context: processor.context,
1366
+ preset,
1367
+ presets,
1368
+ onPresetChange
1369
+ }), /* @__PURE__ */ React10.createElement("div", {
1370
+ role: "none",
1371
+ className: "flex grow overflow-x-auto scrollbar-none"
1372
+ }, /* @__PURE__ */ React10.createElement(ChatReferences, {
1373
+ db,
1374
+ context: processor.context
1375
+ })), /* @__PURE__ */ React10.createElement(ChatActions, {
1376
+ classNames: "col-span-2",
1377
+ microphone: true,
1378
+ recording,
1379
+ processing: streaming,
1380
+ onEvent: handleEvent
1381
+ }, online !== void 0 && /* @__PURE__ */ React10.createElement(Input.Root, null, /* @__PURE__ */ React10.createElement(Input.Label, {
1382
+ srOnly: true
1383
+ }, t("online-switch.label")), /* @__PURE__ */ React10.createElement(Input.Switch, {
1384
+ classNames: "mx-2",
1385
+ checked: online,
1386
+ onCheckedChange: onOnlineChange
1387
+ })))));
1388
+ };
1389
+ ChatPrompt.displayName = CHAT_PROMPT_NAME;
1390
+ var CHAT_TOOLBAR_NAME = "Chat.Toolbar";
1391
+ var ChatToolbar = composable(({ attendableId, companionTo, ...props }, forwardedRef) => {
1392
+ const { chat } = useChatContext(CHAT_TOOLBAR_NAME);
1393
+ const menuActions = useChatToolbarActions({
1394
+ chat,
1395
+ companionTo
1396
+ });
1397
+ return /* @__PURE__ */ React10.createElement(Menu.Root, {
1398
+ ...menuActions,
1399
+ attendableId
1400
+ }, /* @__PURE__ */ React10.createElement(Menu.Toolbar, {
1401
+ ...composableProps(props),
1402
+ ref: forwardedRef
1403
+ }));
1404
+ });
1405
+ ChatToolbar.displayName = CHAT_TOOLBAR_NAME;
1406
+ var Chat = {
1407
+ Root: ChatRoot,
1408
+ Viewport: ChatViewport,
1409
+ Thread: ChatThread2,
1410
+ Prompt: ChatPrompt,
1411
+ Toolbar: ChatToolbar
1412
+ };
1413
+
1414
+ // src/components/ProcessTree/ProcessTree.tsx
1415
+ import * as Match from "effect/Match";
1416
+ import React11 from "react";
1417
+ import { Process } from "@dxos/functions-runtime";
1418
+ import { Icon as Icon2, ScrollArea, Treegrid } from "@dxos/react-ui";
1419
+ import { composable as composable2, composableProps as composableProps2, mx as mx8 } from "@dxos/ui-theme";
1420
+ var ProcessTree = composable2(({ processes, onProcessSelect, ...props }, forwardedRef) => {
1421
+ const filteredProcesses = [
1422
+ ...processes.filter((process) => [
1423
+ Process.State.RUNNING,
1424
+ Process.State.HYBERNATING
1425
+ ].includes(process.state)),
1426
+ ...processes.filter((process) => [
1427
+ Process.State.IDLE
1428
+ ].includes(process.state)).slice(0, 3),
1429
+ ...processes.filter((process) => [
1430
+ Process.State.SUCCEEDED,
1431
+ Process.State.FAILED,
1432
+ Process.State.TERMINATED
1433
+ ].includes(process.state)).slice(0, 3)
1434
+ ];
1435
+ return /* @__PURE__ */ React11.createElement(ScrollArea.Root, {
1436
+ ...composableProps2(props, {
1437
+ classNames: "dx-expander"
1438
+ }),
1439
+ thin: true,
1440
+ ref: forwardedRef
1441
+ }, /* @__PURE__ */ React11.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React11.createElement(Treegrid.Root, {
1442
+ gridTemplateColumns: "1fr"
1443
+ }, filteredProcesses.filter((process) => process.parentPid === null).map((process) => {
1444
+ const activeChildren = filteredProcesses.filter((candidate) => candidate.parentPid?.toString() === process.pid.toString() && candidate.state === Process.State.RUNNING);
1445
+ return /* @__PURE__ */ React11.createElement(Treegrid.Row, {
1446
+ key: process.pid.toString(),
1447
+ id: process.pid.toString(),
1448
+ parentOf: process.parentPid?.toString()
1449
+ }, /* @__PURE__ */ React11.createElement(Treegrid.Cell, {
1450
+ indent: true,
1451
+ classNames: "flex items-center p-1 gap-2 min-w-0",
1452
+ onClick: () => onProcessSelect?.(process)
1453
+ }, /* @__PURE__ */ React11.createElement(Icon2, {
1454
+ size: 4,
1455
+ icon: Match.value(process.state).pipe(Match.when(Process.State.RUNNING, () => "ph--spinner-gap--regular"), Match.when(Process.State.SUCCEEDED, () => "ph--check-circle--regular"), Match.when(Process.State.FAILED, () => "ph--warning--regular"), Match.when(Process.State.HYBERNATING, () => "ph--spinner--regular"), Match.when(Process.State.IDLE, () => "ph--hourglass--regular"), Match.when(Process.State.TERMINATING, () => "ph--x-circle--regular"), Match.when(Process.State.TERMINATED, () => "ph--x-circle--regular"), Match.orElse(() => "ph--spinner-gap--regular")),
1456
+ classNames: mx8(process.state === Process.State.RUNNING && "animate-spin", process.state === Process.State.FAILED && "text-error-text", process.state === Process.State.SUCCEEDED && "text-success-text")
1457
+ }), /* @__PURE__ */ React11.createElement("div", {
1458
+ role: "none",
1459
+ className: "flex items-center gap-2 text-xs overflow-hidden"
1460
+ }, /* @__PURE__ */ React11.createElement("span", {
1461
+ className: "text-description"
1462
+ }, process.params.name), activeChildren.length > 0 && /* @__PURE__ */ React11.createElement("span", {
1463
+ className: "text-xs text-description ml-1"
1464
+ }, activeChildren[0].params.name))));
1465
+ }))));
1466
+ });
1467
+
1468
+ // src/components/TemplateEditor/TemplateEditor.tsx
1469
+ import { defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
1470
+ import { composeRefs } from "@radix-ui/react-compose-refs";
1471
+ import React12 from "react";
1472
+ import { createDocAccessor } from "@dxos/echo-db";
1473
+ import { useThemeContext, useTranslation as useTranslation7 } from "@dxos/react-ui";
1474
+ import { useTextEditor } from "@dxos/react-ui-editor";
1475
+ import { createBasicExtensions, createDataExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown } from "@dxos/ui-editor";
1476
+ import { composable as composable3, composableProps as composableProps3 } from "@dxos/ui-theme";
1477
+ import { isNonNullable as isNonNullable2 } from "@dxos/util";
1478
+ import { meta as meta7 } from "#meta";
1479
+
1480
+ // src/components/TemplateEditor/extensions/handlebars-extension.ts
1481
+ import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
1482
+ import { RangeSetBuilder } from "@codemirror/state";
1483
+ import { Decoration, ViewPlugin, WidgetType as WidgetType7, keymap as keymap2 } from "@codemirror/view";
1484
+ import { Domino as Domino7, mx as mx9 } from "@dxos/ui";
1485
+ var handlebars = (_ = {}) => {
1486
+ return [
1487
+ handlebarsHighlightPlugin,
1488
+ autocompletion({
1489
+ activateOnTyping: true,
1490
+ aboveCursor: true,
1491
+ closeOnBlur: true,
1492
+ override: [
1493
+ handlebarsCompletions
1494
+ ]
1495
+ }),
1496
+ keymap2.of(completionKeymap)
1497
+ ];
1498
+ };
1499
+ var regex = {
1500
+ // {{! comment }}
1501
+ comment: /\{\{!\s*[^}]*\}\}/g,
1502
+ // {{var}}
1503
+ brackets: /\{\{[^}]*\}\}/g,
1504
+ // {{#command}} {{/command}}
1505
+ command: /\{\{[#/]([^}]+)\}\}/g,
1506
+ // {{var}}
1507
+ var: /\{\{(?!\s*!)(\w[^}]*)\}\}/g,
1508
+ // @dxn:queue:data:xxx
1509
+ dxn: /@?dxn:[\w@:]+/g,
1510
+ // dxos.org/type/xxx
1511
+ url: /[\w.-]+\.[\w.-]+\/[\w/]+/g
1512
+ };
1513
+ var tagPadding = "mx-0.5 px-1 rounded-xs";
1514
+ var handlebarsHighlightPlugin = ViewPlugin.fromClass(class {
1515
+ decorations;
1516
+ constructor(view) {
1517
+ this.decorations = this.buildDecorations(view);
1518
+ }
1519
+ update(update) {
1520
+ if (update.docChanged || update.viewportChanged || update.selectionSet) {
1521
+ this.decorations = this.buildDecorations(update.view);
1522
+ }
1523
+ }
1524
+ // NOTE: Decorations may clash with other extensions (e.g., markdown).
1525
+ buildDecorations(view) {
1526
+ const selection = view.state.selection.main;
1527
+ const decorations = [];
1528
+ for (const { from, to } of view.visibleRanges) {
1529
+ const text = view.state.doc.sliceString(from, to);
1530
+ {
1531
+ let match;
1532
+ while ((match = regex.dxn.exec(text)) !== null) {
1533
+ const start = from + match.index;
1534
+ const end = start + match[0].length;
1535
+ const overlaps = selection.to > start && selection.from <= end;
1536
+ if (!overlaps) {
1537
+ decorations.push({
1538
+ from: start,
1539
+ to: end,
1540
+ decoration: Decoration.widget({
1541
+ widget: new DXNWidget(match[0])
1542
+ })
1543
+ });
1544
+ }
1545
+ }
1546
+ }
1547
+ {
1548
+ let match;
1549
+ while ((match = regex.url.exec(text)) !== null) {
1550
+ const start = from + match.index;
1551
+ const end = start + match[0].length;
1552
+ decorations.push({
1553
+ from: start,
1554
+ to: end,
1555
+ decoration: Decoration.mark({
1556
+ class: mx9("dx-tag--blue", tagPadding)
1557
+ })
1558
+ });
1559
+ }
1560
+ }
1561
+ {
1562
+ let match;
1563
+ while ((match = regex.brackets.exec(text)) !== null) {
1564
+ const start = from + match.index;
1565
+ const end = start + match[0].length;
1566
+ decorations.push({
1567
+ from: start,
1568
+ to: end,
1569
+ decoration: Decoration.mark({
1570
+ class: "text-subdued"
1571
+ })
1572
+ });
1573
+ }
1574
+ }
1575
+ {
1576
+ let match;
1577
+ while ((match = regex.command.exec(text)) !== null) {
1578
+ const start = from + match.index + 2;
1579
+ let end = start + match[0].length - 4;
1580
+ const text2 = view.state.doc.sliceString(start, end);
1581
+ const parts = text2.split(/\s+/);
1582
+ if (parts.length > 1) {
1583
+ const idx = start + parts[0].length;
1584
+ decorations.push({
1585
+ from: idx,
1586
+ to: end,
1587
+ decoration: Decoration.mark({
1588
+ class: "text-green-text"
1589
+ })
1590
+ });
1591
+ end = idx;
1592
+ }
1593
+ decorations.push({
1594
+ from: start,
1595
+ to: end,
1596
+ decoration: Decoration.mark({
1597
+ class: "text-blue-text"
1598
+ })
1599
+ });
1600
+ }
1601
+ }
1602
+ {
1603
+ let match;
1604
+ while ((match = regex.var.exec(text)) !== null) {
1605
+ const start = from + match.index + 2;
1606
+ const end = start + match[0].length - 4;
1607
+ decorations.push({
1608
+ from: start,
1609
+ to: end,
1610
+ decoration: Decoration.mark({
1611
+ class: "text-green-text"
1612
+ })
1613
+ });
1614
+ }
1615
+ }
1616
+ }
1617
+ decorations.sort((a, b) => a.from - b.from || a.to - b.to);
1618
+ const builder = new RangeSetBuilder();
1619
+ for (const { from, to, decoration } of decorations) {
1620
+ builder.add(from, to, decoration);
1621
+ }
1622
+ return builder.finish();
1623
+ }
1624
+ }, {
1625
+ decorations: (v) => v.decorations
1626
+ });
1627
+ var DXNWidget = class extends WidgetType7 {
1628
+ _identifier;
1629
+ constructor(_identifier) {
1630
+ super(), this._identifier = _identifier;
1631
+ }
1632
+ ignoreEvent() {
1633
+ return false;
1634
+ }
1635
+ eq(other) {
1636
+ return this._identifier === other._identifier;
1637
+ }
1638
+ toDOM() {
1639
+ const text = this._identifier.split(":").map((part) => {
1640
+ const len = 16;
1641
+ const plen = 4;
1642
+ if (part.length > len) {
1643
+ return `[${part.slice(0, plen)}\u2026${part.slice(-plen)}]`;
1644
+ }
1645
+ return part;
1646
+ }).join(":");
1647
+ return Domino7.of("span").classNames(mx9("font-mono dx-tag--blue", tagPadding)).text(text).root;
1648
+ }
1649
+ };
1650
+ var variables = [
1651
+ "this"
1652
+ ];
1653
+ var commands = [
1654
+ "this",
1655
+ "each",
1656
+ "if",
1657
+ "unless",
1658
+ "with"
1659
+ ];
1660
+ function handlebarsCompletions(context) {
1661
+ const match = context.matchBefore(/\{\{[^}]*/);
1662
+ if (!match || match.from === match.to) {
1663
+ return null;
1664
+ }
1665
+ let type = "variable";
1666
+ let text = match.text.slice(2);
1667
+ let from = match.from + 2;
1668
+ let matches = [];
1669
+ if (text.startsWith("#") || text.startsWith("/")) {
1670
+ const idx = text.lastIndexOf(" ");
1671
+ if (idx !== -1) {
1672
+ type = "variable";
1673
+ matches = variables;
1674
+ text = text.slice(idx + 1);
1675
+ from += idx + 1;
1676
+ } else {
1677
+ type = "command";
1678
+ text = text.slice(1);
1679
+ matches = commands;
1680
+ from += 1;
1681
+ }
1682
+ } else {
1683
+ type = "variable";
1684
+ matches = variables;
1685
+ }
1686
+ const options = matches.filter((name) => name.startsWith(text)).map((name) => ({
1687
+ type,
1688
+ label: name
1689
+ }));
1690
+ return {
1691
+ from,
1692
+ options
1693
+ };
1694
+ }
1695
+
1696
+ // src/components/TemplateEditor/extensions/xml-extension.ts
1697
+ import { syntaxTree } from "@codemirror/language";
1698
+ import { RangeSetBuilder as RangeSetBuilder2 } from "@codemirror/state";
1699
+ import { Decoration as Decoration2, ViewPlugin as ViewPlugin2 } from "@codemirror/view";
1700
+ var xmlDecorator = (_ = {}) => {
1701
+ return [
1702
+ xmlDecoratorPlugin
1703
+ ];
1704
+ };
1705
+ var xmlDecoratorPlugin = ViewPlugin2.fromClass(class {
1706
+ decorations;
1707
+ constructor(view) {
1708
+ this.decorations = this.buildDecorations(view);
1709
+ }
1710
+ update(update) {
1711
+ if (update.docChanged || update.viewportChanged) {
1712
+ this.decorations = this.buildDecorations(update.view);
1713
+ }
1714
+ }
1715
+ buildDecorations(view) {
1716
+ const builder = new RangeSetBuilder2();
1717
+ for (const { from, to } of view.visibleRanges) {
1718
+ syntaxTree(view.state).iterate({
1719
+ from,
1720
+ to,
1721
+ enter: (node) => {
1722
+ if (node.name === "HTMLTag" || node.name === "OpenTag" || node.name === "CloseTag" || node.name === "SelfClosingTag" || node.name === "Element") {
1723
+ builder.add(node.from, node.to, Decoration2.mark({
1724
+ class: "font-mono text-subdued"
1725
+ }));
1726
+ }
1727
+ }
1728
+ });
1729
+ }
1730
+ return builder.finish();
1731
+ }
1732
+ }, {
1733
+ decorations: (v) => v.decorations
1734
+ });
1735
+
1736
+ // src/components/TemplateEditor/TemplateEditor.tsx
1737
+ var TemplateEditor = composable3(({ classNames, id, template, lineNumbers = true, ...props }, forwardedRef) => {
1738
+ const { t } = useTranslation7(meta7.id);
1739
+ const { themeMode } = useThemeContext();
1740
+ const { parentRef } = useTextEditor(() => {
1741
+ const text = template.source?.target;
1742
+ if (!text) {
1743
+ return {};
1744
+ }
1745
+ return {
1746
+ initialValue: text.content ?? "",
1747
+ extensions: [
1748
+ createDataExtensions({
1749
+ id,
1750
+ text: createDocAccessor(text, [
1751
+ "content"
1752
+ ])
1753
+ }),
1754
+ createBasicExtensions({
1755
+ bracketMatching: false,
1756
+ lineNumbers,
1757
+ lineWrapping: true,
1758
+ placeholder: t("template.placeholder")
1759
+ }),
1760
+ createThemeExtensions({
1761
+ themeMode
1762
+ }),
1763
+ createMarkdownExtensions(),
1764
+ decorateMarkdown(),
1765
+ handlebars(),
1766
+ // xml(),
1767
+ // NOTE: Since we're using markdown only HTML nodes are parsed.
1768
+ xmlDecorator(),
1769
+ syntaxHighlighting(defaultHighlightStyle)
1770
+ ].filter(isNonNullable2)
1771
+ };
1772
+ }, [
1773
+ themeMode,
1774
+ template.source?.target,
1775
+ lineNumbers
1776
+ ]);
1777
+ return /* @__PURE__ */ React12.createElement("div", {
1778
+ ...composableProps3(props, {
1779
+ role: "none",
1780
+ classNames: [
1781
+ "h-full overflow-hidden",
1782
+ classNames
1783
+ ]
1784
+ }),
1785
+ ref: composeRefs(parentRef, forwardedRef)
1786
+ });
1787
+ });
1788
+
1789
+ // src/components/Toolbox/Toolbox.tsx
1790
+ import React13, { Fragment, useEffect as useEffect5, useState as useState6 } from "react";
1791
+ import { log as log3 } from "@dxos/log";
1792
+ import { Operation } from "@dxos/operation";
1793
+ import { Filter as Filter3, useQuery as useQuery3 } from "@dxos/react-client/echo";
1794
+ import { ScrollArea as ScrollArea2 } from "@dxos/react-ui";
1795
+ import { composable as composable4, composableProps as composableProps4, mx as mx10 } from "@dxos/ui-theme";
1796
+ import { ServiceType as ServiceType2 } from "#types";
1797
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/components/Toolbox/Toolbox.tsx";
1798
+ var Toolbox = composable4(({ functions, services, blueprints, activeBlueprints, ...props }, forwardedRef) => {
1799
+ return /* @__PURE__ */ React13.createElement(ScrollArea2.Root, {
1800
+ ...composableProps4(props),
1801
+ thin: true,
1802
+ orientation: "vertical",
1803
+ ref: forwardedRef
1804
+ }, /* @__PURE__ */ React13.createElement(ScrollArea2.Viewport, null, blueprints && blueprints.length > 0 && /* @__PURE__ */ React13.createElement(Section, {
1805
+ title: "Blueprints",
1806
+ items: blueprints.map(({ name, description, tools }) => ({
1807
+ name,
1808
+ description,
1809
+ subitems: tools.map((toolId) => ({
1810
+ name: `\u2219 ${safeToolId(toolId)}`
1811
+ }))
1812
+ }))
1813
+ }), activeBlueprints && activeBlueprints.length > 0 && /* @__PURE__ */ React13.createElement(Section, {
1814
+ title: "Blueprints",
1815
+ items: activeBlueprints.map(({ target }) => ({
1816
+ name: target?.name ?? "",
1817
+ description: target?.description ?? "",
1818
+ subitems: target?.tools.map((toolId) => ({
1819
+ name: `\u2219 ${safeToolId(toolId)}`
1820
+ }))
1821
+ }))
1822
+ }), services && services.length > 0 && /* @__PURE__ */ React13.createElement(Section, {
1823
+ title: "Services",
1824
+ items: services.map(({ service: { serviceId, name, description } }) => ({
1825
+ name: name ?? serviceId,
1826
+ description
1827
+ }))
1828
+ }), functions && functions.length > 0 && /* @__PURE__ */ React13.createElement(Section, {
1829
+ title: "Functions",
1830
+ items: functions.map(({ name, description }) => ({
1831
+ name,
1832
+ description
1833
+ }))
1834
+ })));
1835
+ });
1836
+ Toolbox.displayName = "Toolbox";
1837
+ var Section = ({ title, items, striped }) => {
1838
+ const stripeClassNames = "odd:bg-neutral-50 dark:odd:bg-neutral-800";
1839
+ const gridClassNames = "grid grid-cols-[8rem_1fr]";
1840
+ const subGridClassNames = mx10("col-span-full grid grid-cols-subgrid text-xs px-2", striped && stripeClassNames);
1841
+ return /* @__PURE__ */ React13.createElement("div", null, /* @__PURE__ */ React13.createElement("h1", {
1842
+ className: "px-2 text-sm"
1843
+ }, title), /* @__PURE__ */ React13.createElement("div", {
1844
+ className: gridClassNames
1845
+ }, items.map(({ name, description, subitems }, i) => /* @__PURE__ */ React13.createElement(Fragment, {
1846
+ key: i
1847
+ }, name && /* @__PURE__ */ React13.createElement("div", {
1848
+ className: subGridClassNames
1849
+ }, /* @__PURE__ */ React13.createElement("div", {
1850
+ className: "truncate text-primary-500"
1851
+ }, name), /* @__PURE__ */ React13.createElement("div", {
1852
+ className: "line-clamp-2"
1853
+ }, description)), subitems?.map(({ name: name2, description: description2 }, i2) => /* @__PURE__ */ React13.createElement("div", {
1854
+ key: i2,
1855
+ className: mx10(subGridClassNames, striped && stripeClassNames)
1856
+ }, /* @__PURE__ */ React13.createElement("div", {
1857
+ className: "truncate"
1858
+ }, name2), /* @__PURE__ */ React13.createElement("div", {
1859
+ className: "line-clamp-3 text-subdued"
1860
+ }, description2)))))));
1861
+ };
1862
+ var ToolboxPanel = ({ classNames, db, processor }) => {
1863
+ const services = useQuery3(db, Filter3.type(ServiceType2));
1864
+ const [serviceTools, setServiceTools] = useState6([]);
1865
+ useEffect5(() => {
1866
+ log3("creating service tools...", {
1867
+ services: services.length
1868
+ }, {
1869
+ F: __dxlog_file3,
1870
+ L: 122,
1871
+ S: void 0,
1872
+ C: (f, a) => f(...a)
1873
+ });
1874
+ queueMicrotask(async () => {
1875
+ });
1876
+ }, [
1877
+ services
1878
+ ]);
1879
+ const functions = useQuery3(db, Filter3.type(Operation.PersistentOperation));
1880
+ return /* @__PURE__ */ React13.createElement(Toolbox, {
1881
+ classNames,
1882
+ blueprints: processor?.context.getBlueprints(),
1883
+ services: serviceTools,
1884
+ functions
1885
+ });
1886
+ };
1887
+ var safeToolId = (name) => {
1888
+ return name.split("_").pop();
1889
+ };
1890
+
1891
+ // src/components/index.ts
1892
+ var AssistantSettings = lazy(() => import("./AssistantSettings-7QMO3LGF.mjs"));
1893
+
1894
+ // src/hooks/useBlueprintRegistry.ts
1895
+ import { useCallback as useCallback4, useEffect as useEffect6, useMemo as useMemo5, useState as useState7 } from "react";
1896
+ import { useCapabilities } from "@dxos/app-framework/ui";
1897
+ import { AppCapabilities } from "@dxos/app-toolkit";
1898
+ import { Blueprint } from "@dxos/blueprints";
1899
+ import { Filter as Filter4, Obj as Obj4, Ref } from "@dxos/echo";
1900
+ import { useQuery as useQuery4 } from "@dxos/react-client/echo";
1901
+ import { distinctBy } from "@dxos/util";
1902
+ var useBlueprintRegistry = () => {
1903
+ const blueprintDefinitions = useCapabilities(AppCapabilities.BlueprintDefinition);
1904
+ return useMemo5(() => new Blueprint.Registry(blueprintDefinitions.map((blueprint) => blueprint.make())), [
1905
+ blueprintDefinitions
1906
+ ]);
1907
+ };
1908
+ var useBlueprints2 = ({ blueprintRegistry, db }) => {
1909
+ const staticBlueprints = useMemo5(() => blueprintRegistry?.query() ?? [], [
1910
+ blueprintRegistry
1911
+ ]);
1912
+ const spaceBlueprints = useQuery4(db, Filter4.type(Blueprint.Blueprint));
1913
+ return useMemo5(() => {
1914
+ const blueprints = distinctBy([
1915
+ ...staticBlueprints,
1916
+ ...spaceBlueprints
1917
+ ], (b) => b.key);
1918
+ blueprints.sort(({ name: a }, { name: b }) => a.localeCompare(b));
1919
+ return blueprints;
1920
+ }, [
1921
+ staticBlueprints,
1922
+ spaceBlueprints
1923
+ ]);
1924
+ };
1925
+ var useActiveBlueprints2 = ({ context }) => {
1926
+ const [active, setActive] = useState7(/* @__PURE__ */ new Map());
1927
+ useEffect6(() => {
1928
+ if (!context) {
1929
+ setActive(/* @__PURE__ */ new Map());
1930
+ return;
1931
+ }
1932
+ const updateActive = () => {
1933
+ const blueprints = context.getBlueprints();
1934
+ setActive(new Map(blueprints.map((blueprint) => [
1935
+ blueprint.key,
1936
+ blueprint
1937
+ ])));
1938
+ };
1939
+ updateActive();
1940
+ return context.subscribeBlueprints(updateActive);
1941
+ }, [
1942
+ context
1943
+ ]);
1944
+ return active;
1945
+ };
1946
+ var useBlueprintHandlers2 = ({ db, context, blueprintRegistry }) => {
1947
+ const onUpdateBlueprint = useCallback4(async (key, checked) => {
1948
+ if (!context || !blueprintRegistry) {
1949
+ return;
1950
+ }
1951
+ const objects = await db.query(Filter4.type(Blueprint.Blueprint)).run();
1952
+ let storedBlueprint = objects.find((blueprint) => blueprint.key === key);
1953
+ if (checked) {
1954
+ if (!storedBlueprint) {
1955
+ const blueprint = blueprintRegistry.getByKey(key);
1956
+ if (!blueprint) {
1957
+ return;
1958
+ }
1959
+ storedBlueprint = db.add(Obj4.clone(blueprint));
1960
+ }
1961
+ await context.bind({
1962
+ blueprints: [
1963
+ Ref.make(storedBlueprint)
1964
+ ]
1965
+ });
1966
+ } else if (storedBlueprint) {
1967
+ await context.unbind({
1968
+ blueprints: [
1969
+ Ref.make(storedBlueprint)
1970
+ ]
1971
+ });
1972
+ }
1973
+ }, [
1974
+ db,
1975
+ context,
1976
+ blueprintRegistry
1977
+ ]);
1978
+ return {
1979
+ onUpdateBlueprint
1980
+ };
1981
+ };
1982
+
1983
+ // src/hooks/useChatProcessor.ts
1984
+ import { RegistryContext } from "@effect-atom/atom-react";
1985
+ import * as Effect2 from "effect/Effect";
1986
+ import { useContext, useMemo as useMemo6, useState as useState8 } from "react";
1987
+ import { AiConversation } from "@dxos/assistant";
1988
+ import { Ref as Ref2 } from "@dxos/echo";
1989
+ import { createFeedServiceLayer } from "@dxos/echo-db";
1990
+ import { runAndForwardErrors as runAndForwardErrors2 } from "@dxos/effect";
1991
+ import { log as log5 } from "@dxos/log";
1992
+ import { useAsyncEffect } from "@dxos/react-ui";
1993
+
1994
+ // src/processor/presets.ts
1995
+ import * as Schema from "effect/Schema";
1996
+ var ModelProviders = [
1997
+ "dxos-local",
1998
+ "dxos-remote",
1999
+ "lm-studio"
2000
+ ];
2001
+ var ModelProvider = Schema.Literal(...ModelProviders);
2002
+ var createModelLabel = (model) => {
2003
+ const parts = model.split("/");
2004
+ return parts[parts.length - 1];
2005
+ };
2006
+ var AiServicePresets = [
2007
+ {
2008
+ provider: "dxos-remote",
2009
+ model: "@anthropic/claude-opus-4-0"
2010
+ },
2011
+ {
2012
+ provider: "dxos-remote",
2013
+ model: "@anthropic/claude-sonnet-4-0"
2014
+ },
2015
+ {
2016
+ provider: "dxos-remote",
2017
+ model: "@anthropic/claude-3-5-haiku-20241022"
2018
+ },
2019
+ {
2020
+ provider: "lm-studio",
2021
+ model: "@google/gemma-3-27b"
2022
+ },
2023
+ {
2024
+ provider: "lm-studio",
2025
+ model: "@meta/llama-3.2-3b-instruct"
2026
+ },
2027
+ {
2028
+ model: "deepseek-r1:latest",
2029
+ provider: "dxos-local"
2030
+ }
2031
+ ].map(({ model, provider }, i) => ({
2032
+ id: `preset-${i}`,
2033
+ provider,
2034
+ model,
2035
+ label: createModelLabel(model)
2036
+ }));
2037
+
2038
+ // src/processor/processor.ts
2039
+ import { Atom, Registry } from "@effect-atom/atom-react";
2040
+ import * as Effect from "effect/Effect";
2041
+ import * as Fiber from "effect/Fiber";
2042
+ import * as Option4 from "effect/Option";
2043
+ import * as Stream from "effect/Stream";
2044
+ import { DEFAULT_EDGE_MODEL } from "@dxos/ai";
2045
+ import { AiContextService, createSystemPrompt, formatSystemPrompt, AgentService, PartialBlock } from "@dxos/assistant";
2046
+ import { Obj as Obj5 } from "@dxos/echo";
2047
+ import { runAndForwardErrors, unwrapExit } from "@dxos/effect";
2048
+ import { Trace } from "@dxos/functions";
2049
+ import { log as log4 } from "@dxos/log";
2050
+ import { Operation as Operation2 } from "@dxos/operation";
2051
+ import { Message as Message2 } from "@dxos/types";
2052
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/processor/processor.ts";
2053
+ var defaultOptions2 = {
2054
+ model: DEFAULT_EDGE_MODEL,
2055
+ autoUpdateNameChance: 0.1
2056
+ };
2057
+ var AiChatProcessor = class {
2058
+ _conversation;
2059
+ _runtime;
2060
+ _feed;
2061
+ _options;
2062
+ #registry;
2063
+ /** Pending messages (finalized, non-streaming). */
2064
+ #pending = Atom.make([]);
2065
+ /** Currently streaming messages (from ephemeral trace events). */
2066
+ #streaming = Atom.make([]);
2067
+ /** Set of message IDs that have been finalized (non-pending delivered via ephemeral). */
2068
+ #finalizedIds = /* @__PURE__ */ new Set();
2069
+ /** Currently active request fiber. */
2070
+ #requestFiber;
2071
+ /** Last request (for retries). */
2072
+ #lastRequest;
2073
+ /** Streaming state. */
2074
+ streaming = Atom.make((get) => get(this.#streaming).length > 0);
2075
+ /** Active state. */
2076
+ active = Atom.make(false);
2077
+ /** Array of Messages (incl. the current message being streamed). */
2078
+ messages = Atom.make((get) => [
2079
+ ...get(this.#pending),
2080
+ ...get(this.#streaming)
2081
+ ]);
2082
+ /** Last error. */
2083
+ error = Atom.make(Option4.none());
2084
+ constructor(_conversation, _runtime, _feed, _options = defaultOptions2) {
2085
+ this._conversation = _conversation;
2086
+ this._runtime = _runtime;
2087
+ this._feed = _feed;
2088
+ this._options = _options;
2089
+ this.#registry = this._options.observableRegistry ?? Registry.make();
2090
+ if (this._options.model && !this._options.system) {
2091
+ const capabilities = this._options.modelRegistry?.getCapabilities(this._options.model) ?? {};
2092
+ this._options.system = createSystemPrompt(capabilities);
2093
+ }
2094
+ }
2095
+ get context() {
2096
+ return this._conversation.context;
2097
+ }
2098
+ get conversation() {
2099
+ return this._conversation;
2100
+ }
2101
+ get blueprintRegistry() {
2102
+ return this._options.blueprintRegistry;
2103
+ }
2104
+ get system() {
2105
+ return this._options.system ?? "";
2106
+ }
2107
+ async getTools() {
2108
+ return this._runtime.runPromise(this._conversation.getTools());
2109
+ }
2110
+ async getSystemPrompt() {
2111
+ return this._runtime.runPromise(Effect.gen(this, function* () {
2112
+ const blueprints = this.context.getBlueprints();
2113
+ const objects = this.context.getObjects();
2114
+ return yield* formatSystemPrompt({
2115
+ system: this._options.system,
2116
+ blueprints,
2117
+ objects
2118
+ });
2119
+ }).pipe(Effect.provideService(AiContextService, {
2120
+ binder: this.context
2121
+ }), Effect.orDie));
2122
+ }
2123
+ /**
2124
+ * Initiates a new request via AgentService.
2125
+ */
2126
+ async request(requestProp) {
2127
+ if (this.#requestFiber) {
2128
+ await this.cancel();
2129
+ }
2130
+ try {
2131
+ this.#lastRequest = requestProp;
2132
+ this.#registry.set(this.error, Option4.none());
2133
+ this.#registry.set(this.active, true);
2134
+ const effect = Effect.gen(this, function* () {
2135
+ const session = yield* AgentService.getSession(this._feed);
2136
+ const ephemeralStream = session.subscribeEphemeral();
2137
+ yield* ephemeralStream.pipe(Stream.runForEach((message) => Effect.sync(() => {
2138
+ for (const event of message.events) {
2139
+ if (Trace.isOfType(PartialBlock, event)) {
2140
+ this.#handleEphemeralMessage(event.data);
2141
+ }
2142
+ }
2143
+ })), Effect.fork);
2144
+ log4("chat processor submitting prompt", {
2145
+ length: requestProp.message.length
2146
+ }, {
2147
+ F: __dxlog_file4,
2148
+ L: 197,
2149
+ S: this,
2150
+ C: (f, a) => f(...a)
2151
+ });
2152
+ yield* session.submitPrompt(requestProp.message);
2153
+ log4("chat processor submitPrompt returned, waiting for agent", {}, {
2154
+ F: __dxlog_file4,
2155
+ L: 199,
2156
+ S: this,
2157
+ C: (f, a) => f(...a)
2158
+ });
2159
+ yield* session.waitForCompletion();
2160
+ log4.info("session complete", void 0, {
2161
+ F: __dxlog_file4,
2162
+ L: 201,
2163
+ S: this,
2164
+ C: (f, a) => f(...a)
2165
+ });
2166
+ this.#flushStreaming();
2167
+ yield* this.#maybeUpdateChatName();
2168
+ });
2169
+ this.#requestFiber = this._runtime.runFork(effect);
2170
+ try {
2171
+ await this._runtime.runPromise(Fiber.join(this.#requestFiber));
2172
+ } catch (err) {
2173
+ if (err._tag === "InterruptedException" || err.message?.includes("interrupted")) {
2174
+ return;
2175
+ }
2176
+ throw err;
2177
+ }
2178
+ this.#registry.set(this.error, Option4.none());
2179
+ this.#lastRequest = void 0;
2180
+ this.#requestFiber = void 0;
2181
+ } catch (err) {
2182
+ log4.error("request failed", {
2183
+ error: err
2184
+ }, {
2185
+ F: __dxlog_file4,
2186
+ L: 223,
2187
+ S: this,
2188
+ C: (f, a) => f(...a)
2189
+ });
2190
+ this.#registry.set(this.error, Option4.some(new Error("AI service error", {
2191
+ cause: err
2192
+ })));
2193
+ } finally {
2194
+ log4.info("setting active to false", void 0, {
2195
+ F: __dxlog_file4,
2196
+ L: 226,
2197
+ S: this,
2198
+ C: (f, a) => f(...a)
2199
+ });
2200
+ this.#registry.set(this.active, false);
2201
+ this.#requestFiber = void 0;
2202
+ }
2203
+ }
2204
+ /**
2205
+ * Cancels the current request.
2206
+ */
2207
+ async cancel() {
2208
+ await runAndForwardErrors(Effect.gen(this, function* () {
2209
+ if (this.#requestFiber) {
2210
+ yield* Fiber.interrupt(this.#requestFiber);
2211
+ }
2212
+ }));
2213
+ this.#requestFiber = void 0;
2214
+ this.#registry.set(this.active, false);
2215
+ }
2216
+ /**
2217
+ * Retry last failed request.
2218
+ */
2219
+ async retry() {
2220
+ if (this.#lastRequest) {
2221
+ return this.request(this.#lastRequest);
2222
+ }
2223
+ }
2224
+ /**
2225
+ * Update the current chat's name.
2226
+ */
2227
+ async updateName(chat) {
2228
+ unwrapExit(await this._runtime.runPromiseExit(Operation2.invoke(UpdateChatName, {
2229
+ chat
2230
+ })));
2231
+ }
2232
+ /**
2233
+ * Handles an ephemeral message from the agent process.
2234
+ * Both pending and completed blocks arrive here. Completed blocks are deduped
2235
+ * against messages already written to the feed queue to handle the race between
2236
+ * ephemeral delivery and feed replication.
2237
+ */
2238
+ #handleEphemeralMessage(event) {
2239
+ const isPending = event.block.pending;
2240
+ const message = Obj5.make(Message2.Message, {
2241
+ id: event.messageId,
2242
+ created: (/* @__PURE__ */ new Date()).toISOString(),
2243
+ sender: {
2244
+ role: event.role
2245
+ },
2246
+ blocks: [
2247
+ event.block
2248
+ ]
2249
+ });
2250
+ if (isPending) {
2251
+ if (this.#finalizedIds.has(event.messageId)) {
2252
+ return;
2253
+ }
2254
+ this.#registry.update(this.#streaming, (streaming) => {
2255
+ const idx = streaming.findIndex((existing) => existing.id === event.messageId);
2256
+ if (idx >= 0) {
2257
+ const updated = [
2258
+ ...streaming
2259
+ ];
2260
+ updated[idx] = message;
2261
+ return updated;
2262
+ }
2263
+ return [
2264
+ ...streaming,
2265
+ message
2266
+ ];
2267
+ });
2268
+ } else {
2269
+ this.#finalizedIds.add(event.messageId);
2270
+ this.#registry.update(this.#streaming, (streaming) => streaming.filter((existing) => existing.id !== message.id));
2271
+ this.#registry.update(this.#pending, (pending) => {
2272
+ if (pending.some((existing) => existing.id === message.id)) {
2273
+ return pending;
2274
+ }
2275
+ return [
2276
+ ...pending,
2277
+ message
2278
+ ];
2279
+ });
2280
+ }
2281
+ }
2282
+ /**
2283
+ * Move remaining streaming messages to pending (called when agent completes).
2284
+ */
2285
+ #flushStreaming() {
2286
+ const remaining = this.#registry.get(this.#streaming);
2287
+ if (remaining.length > 0) {
2288
+ this.#registry.update(this.#pending, (pending) => [
2289
+ ...pending,
2290
+ ...remaining
2291
+ ]);
2292
+ this.#registry.set(this.#streaming, []);
2293
+ }
2294
+ this.#finalizedIds.clear();
2295
+ }
2296
+ /**
2297
+ * Conditionally schedule chat name update in detached fork mode.
2298
+ * Updates if chat has no name OR based on random chance (default 10%).
2299
+ */
2300
+ #maybeUpdateChatName() {
2301
+ const chat = this._options.chat?.target;
2302
+ if (!chat) {
2303
+ return Effect.void;
2304
+ }
2305
+ const chance = this._options.autoUpdateNameChance ?? defaultOptions2.autoUpdateNameChance ?? 0.1;
2306
+ const shouldUpdate = !chat.name || Math.random() < chance;
2307
+ if (!shouldUpdate) {
2308
+ return Effect.void;
2309
+ }
2310
+ log4.info("scheduling chat name update", {
2311
+ hasName: !!chat.name,
2312
+ chance
2313
+ }, {
2314
+ F: __dxlog_file4,
2315
+ L: 333,
2316
+ S: this,
2317
+ C: (f, a) => f(...a)
2318
+ });
2319
+ return Operation2.schedule(UpdateChatName, {
2320
+ chat
2321
+ });
2322
+ }
2323
+ };
2324
+
2325
+ // src/hooks/useChatProcessor.ts
2326
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/hooks/useChatProcessor.ts";
2327
+ var useChatProcessor = ({ space, chat, preset, runtime: runtime3, blueprintRegistry, settings }) => {
2328
+ const observableRegistry = useContext(RegistryContext);
2329
+ const [conversation, setConversation] = useState8();
2330
+ useAsyncEffect(async () => {
2331
+ if (!space || !chat) {
2332
+ return;
2333
+ }
2334
+ const feedTarget = chat.feed.target;
2335
+ if (!feedTarget) {
2336
+ return;
2337
+ }
2338
+ const feedServiceLayer = createFeedServiceLayer(space.queues);
2339
+ const runtime4 = await runAndForwardErrors2(Effect2.runtime().pipe(Effect2.provide(feedServiceLayer)));
2340
+ const conversation2 = new AiConversation({
2341
+ feed: feedTarget,
2342
+ runtime: runtime4,
2343
+ registry: observableRegistry
2344
+ });
2345
+ await conversation2.open();
2346
+ setConversation(conversation2);
2347
+ return () => {
2348
+ void conversation2.close();
2349
+ setConversation(void 0);
2350
+ };
2351
+ }, [
2352
+ space,
2353
+ chat?.feed.target
2354
+ ]);
2355
+ const feed = chat?.feed.target;
2356
+ const processor = useMemo6(() => {
2357
+ if (!runtime3 || !conversation || !chat || !feed) {
2358
+ return void 0;
2359
+ }
2360
+ log5("creating processor", {
2361
+ preset,
2362
+ model: preset?.model,
2363
+ settings
2364
+ }, {
2365
+ F: __dxlog_file5,
2366
+ L: 80,
2367
+ S: void 0,
2368
+ C: (f, a) => f(...a)
2369
+ });
2370
+ return new AiChatProcessor(conversation, runtime3, feed, {
2371
+ chat: chat ? Ref2.make(chat) : void 0,
2372
+ observableRegistry,
2373
+ blueprintRegistry,
2374
+ model: preset?.model
2375
+ });
2376
+ }, [
2377
+ runtime3,
2378
+ conversation,
2379
+ blueprintRegistry,
2380
+ preset,
2381
+ feed
2382
+ ]);
2383
+ return processor;
2384
+ };
2385
+
2386
+ // src/hooks/useChatServices.ts
2387
+ import { useMemo as useMemo7 } from "react";
2388
+ import { useCapability } from "@dxos/app-framework/ui";
2389
+ import { getPersonalSpace } from "@dxos/app-toolkit";
2390
+ import { AutomationCapabilities } from "@dxos/plugin-automation/types";
2391
+ import { useClient } from "@dxos/react-client";
2392
+ var useChatServices = ({ id }) => {
2393
+ const client = useClient();
2394
+ id ??= getPersonalSpace(client)?.id;
2395
+ const runtimeResolver = useCapability(AutomationCapabilities.ComputeRuntime);
2396
+ return useMemo7(() => !id ? void 0 : runtimeResolver.getRuntime(id), [
2397
+ id
2398
+ ]);
2399
+ };
2400
+
2401
+ // src/hooks/useChatToolbarActions.ts
2402
+ import { Atom as Atom2 } from "@effect-atom/atom-react";
2403
+ import * as Effect3 from "effect/Effect";
2404
+ import { useMemo as useMemo8 } from "react";
2405
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
2406
+ import { Chat as Chat2 } from "@dxos/assistant-toolkit";
2407
+ import { Filter as Filter5, Obj as Obj6, Query } from "@dxos/echo";
2408
+ import { runAndForwardErrors as runAndForwardErrors3 } from "@dxos/effect";
2409
+ import { invariant } from "@dxos/invariant";
2410
+ import { useQuery as useQuery5 } from "@dxos/react-client/echo";
2411
+ import { MenuBuilder, useMenuActions } from "@dxos/react-ui-menu";
2412
+ import { useChatContext as useChatContext2 } from "#components";
2413
+ import { meta as meta8 } from "#meta";
2414
+ import { AssistantOperation } from "#operations";
2415
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/hooks/useChatToolbarActions.ts";
2416
+ var useChatToolbarActions2 = ({ chat, companionTo }) => {
2417
+ const { invoke } = useOperationInvoker();
2418
+ const { db } = useChatContext2("useChatToolbarActions");
2419
+ const query = companionTo ? Query.select(Filter5.id(companionTo.id)).targetOf(Chat2.CompanionTo).source() : Query.select(Filter5.nothing());
2420
+ const chats = useQuery5(db, query);
2421
+ return useMenuActions(useMemo8(() => {
2422
+ return Atom2.make(() => {
2423
+ const builder = MenuBuilder.make().root({
2424
+ label: [
2425
+ "chat-toolbar.title",
2426
+ {
2427
+ ns: meta8.id
2428
+ }
2429
+ ]
2430
+ }).action("new", {
2431
+ label: [
2432
+ "new-thread.button",
2433
+ {
2434
+ ns: meta8.id
2435
+ }
2436
+ ],
2437
+ icon: "ph--plus--regular",
2438
+ type: "new",
2439
+ disabled: !companionTo
2440
+ }, () => {
2441
+ invariant(companionTo, void 0, {
2442
+ F: __dxlog_file6,
2443
+ L: 53,
2444
+ S: void 0,
2445
+ A: [
2446
+ "companionTo",
2447
+ ""
2448
+ ]
2449
+ });
2450
+ return invoke(AssistantOperation.SetCurrentChat, {
2451
+ companionTo,
2452
+ chat: void 0
2453
+ }).pipe(runAndForwardErrors3);
2454
+ }).action("rename", {
2455
+ label: [
2456
+ "rename-thread.button",
2457
+ {
2458
+ ns: meta8.id
2459
+ }
2460
+ ],
2461
+ icon: "ph--magic-wand--regular",
2462
+ type: "rename",
2463
+ disabled: !chat
2464
+ }, () => Effect3.gen(function* () {
2465
+ invariant(chat, void 0, {
2466
+ F: __dxlog_file6,
2467
+ L: 70,
2468
+ S: this,
2469
+ A: [
2470
+ "chat",
2471
+ ""
2472
+ ]
2473
+ });
2474
+ yield* invoke(AssistantOperation.UpdateChatName, {
2475
+ chat
2476
+ });
2477
+ }).pipe(runAndForwardErrors3)).action("branch", {
2478
+ label: [
2479
+ "branch-thread.menu",
2480
+ {
2481
+ ns: meta8.id
2482
+ }
2483
+ ],
2484
+ icon: "ph--git-branch--regular",
2485
+ type: "branch",
2486
+ disabled: true
2487
+ }, () => {
2488
+ });
2489
+ if (chats.length > 0) {
2490
+ builder.group("chats", {
2491
+ label: [
2492
+ "chat-history.label",
2493
+ {
2494
+ ns: meta8.id
2495
+ }
2496
+ ],
2497
+ icon: "ph--clock-counter-clockwise--regular",
2498
+ selectCardinality: "single",
2499
+ variant: "dropdownMenu"
2500
+ }, (builder2) => {
2501
+ chats.toSorted((a, b) => a.id.localeCompare(b.id)).forEach((chat2) => {
2502
+ builder2.action(chat2.id, {
2503
+ label: Obj6.getLabel(chat2) ?? [
2504
+ "object-name.placeholder",
2505
+ {
2506
+ ns: Chat2.Chat.typename
2507
+ }
2508
+ ]
2509
+ }, () => Effect3.gen(function* () {
2510
+ invariant(companionTo, void 0, {
2511
+ F: __dxlog_file6,
2512
+ L: 106,
2513
+ S: this,
2514
+ A: [
2515
+ "companionTo",
2516
+ ""
2517
+ ]
2518
+ });
2519
+ yield* invoke(AssistantOperation.SetCurrentChat, {
2520
+ companionTo,
2521
+ chat: chat2
2522
+ });
2523
+ }).pipe(runAndForwardErrors3));
2524
+ });
2525
+ });
2526
+ }
2527
+ return builder.build();
2528
+ });
2529
+ }, [
2530
+ chats.length,
2531
+ db?.spaceId,
2532
+ companionTo?.id,
2533
+ chat?.id,
2534
+ invoke
2535
+ ]));
2536
+ };
2537
+
2538
+ // src/hooks/useContextBinder.ts
2539
+ import { RegistryContext as RegistryContext2 } from "@effect-atom/atom-react";
2540
+ import * as Effect4 from "effect/Effect";
2541
+ import { useContext as useContext2, useState as useState9 } from "react";
2542
+ import { AiContextBinder } from "@dxos/assistant";
2543
+ import { createFeedServiceLayer as createFeedServiceLayer2 } from "@dxos/echo-db";
2544
+ import { runAndForwardErrors as runAndForwardErrors4 } from "@dxos/effect";
2545
+ import { useAsyncEffect as useAsyncEffect2 } from "@dxos/react-ui";
2546
+ var useContextBinder = (space, feed) => {
2547
+ const registry = useContext2(RegistryContext2);
2548
+ const [binder, setBinder] = useState9();
2549
+ useAsyncEffect2(async () => {
2550
+ setBinder(void 0);
2551
+ if (!space || !feed) {
2552
+ return;
2553
+ }
2554
+ const feedServiceLayer = createFeedServiceLayer2(space.queues);
2555
+ const runtime3 = await runAndForwardErrors4(Effect4.runtime().pipe(Effect4.provide(feedServiceLayer)));
2556
+ const binder2 = new AiContextBinder({
2557
+ feed,
2558
+ runtime: runtime3,
2559
+ registry
2560
+ });
2561
+ await binder2.open();
2562
+ setBinder(binder2);
2563
+ return () => {
2564
+ void binder2.close();
2565
+ };
2566
+ }, [
2567
+ space,
2568
+ feed
2569
+ ]);
2570
+ return binder;
2571
+ };
2572
+
2573
+ // src/hooks/useContextObjects.ts
2574
+ import { Atom as Atom3, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
2575
+ import { useCallback as useCallback5 } from "react";
2576
+ var emptyObjectsAtom = Atom3.make([]);
2577
+ var useContextObjects3 = ({ db, context }) => {
2578
+ const objects = useAtomValue2(context?.objects ?? emptyObjectsAtom);
2579
+ const handleUpdateObject = useCallback5(async (dxn, checked) => {
2580
+ if (!db || !context) {
2581
+ return;
2582
+ }
2583
+ const ref = db.makeRef(dxn);
2584
+ await ref.load();
2585
+ if (checked) {
2586
+ await context.bind({
2587
+ objects: [
2588
+ ref
2589
+ ]
2590
+ });
2591
+ } else {
2592
+ await context.unbind({
2593
+ objects: [
2594
+ ref
2595
+ ]
2596
+ });
2597
+ }
2598
+ }, [
2599
+ db,
2600
+ context
2601
+ ]);
2602
+ return {
2603
+ objects,
2604
+ onUpdateObject: handleUpdateObject
2605
+ };
2606
+ };
2607
+
2608
+ // src/hooks/useFilteredTypes.ts
2609
+ import * as Option5 from "effect/Option";
2610
+ import { useEffect as useEffect7, useState as useState10 } from "react";
2611
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from "@dxos/echo/internal";
2612
+ var useFilteredTypes2 = (db) => {
2613
+ const [types, setTypes] = useState10([]);
2614
+ useEffect7(() => {
2615
+ if (!db) {
2616
+ return;
2617
+ }
2618
+ return db.schemaRegistry.query({
2619
+ location: [
2620
+ "database",
2621
+ "runtime"
2622
+ ]
2623
+ }).subscribe((query) => {
2624
+ const types2 = Array.from(new Set(query.results.filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation).filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option5.getOrElse(() => false)))));
2625
+ setTypes(types2);
2626
+ }, {
2627
+ fire: true
2628
+ });
2629
+ }, [
2630
+ db
2631
+ ]);
2632
+ return types;
2633
+ };
2634
+
2635
+ // src/hooks/useFlush.ts
2636
+ import { useCallback as useCallback6, useRef as useRef3, useState as useState11 } from "react";
2637
+ var useFlush = (space) => {
2638
+ const [state, setState] = useState11("idle");
2639
+ const resetTimer = useRef3(null);
2640
+ const handleFlush = useCallback6(() => {
2641
+ if (!space) {
2642
+ return;
2643
+ }
2644
+ queueMicrotask(async () => {
2645
+ if (resetTimer.current) {
2646
+ clearTimeout(resetTimer.current);
2647
+ }
2648
+ setState("flushing");
2649
+ await space.db.flush();
2650
+ setState("flushed");
2651
+ resetTimer.current = setTimeout(() => {
2652
+ setState("idle");
2653
+ resetTimer.current = null;
2654
+ }, 1e3);
2655
+ });
2656
+ }, [
2657
+ space
2658
+ ]);
2659
+ return {
2660
+ state,
2661
+ handleFlush
2662
+ };
2663
+ };
2664
+
2665
+ // src/hooks/useOnline.ts
2666
+ import { useState as useState12 } from "react";
2667
+ var useOnline = () => {
2668
+ const [online, setOnline] = useState12(true);
2669
+ return [
2670
+ online,
2671
+ setOnline
2672
+ ];
2673
+ };
2674
+
2675
+ // src/hooks/usePresets.ts
2676
+ import { useCallback as useCallback7, useEffect as useEffect8, useMemo as useMemo9, useState as useState13 } from "react";
2677
+ var usePresets = (online) => {
2678
+ const [preset, setPreset] = useState13();
2679
+ const presets = useMemo9(() => AiServicePresets.filter((preset2) => online === (preset2.provider === "dxos-remote")), [
2680
+ online
2681
+ ]);
2682
+ const presetOptions = useMemo9(() => presets.map(({ id, model, label }) => ({
2683
+ id,
2684
+ label: label ?? model
2685
+ })), [
2686
+ presets
2687
+ ]);
2688
+ useEffect8(() => {
2689
+ setPreset(presets[0]);
2690
+ }, [
2691
+ presets
2692
+ ]);
2693
+ const handlePresetChange = useCallback7((id) => {
2694
+ const preset2 = presets.find((preset3) => preset3.id === id);
2695
+ if (preset2) {
2696
+ setPreset(preset2);
2697
+ }
2698
+ }, [
2699
+ presets
2700
+ ]);
2701
+ return {
2702
+ preset,
2703
+ presets: presetOptions,
2704
+ onPresetChange: handlePresetChange
2705
+ };
2706
+ };
2707
+
2708
+ // src/hooks/useReferencesProvider.ts
2709
+ import { useMemo as useMemo10 } from "react";
2710
+ import { Filter as Filter6, Obj as Obj7 } from "@dxos/echo";
2711
+ var useReferencesProvider = (space) => {
2712
+ return useMemo10(() => {
2713
+ if (!space) {
2714
+ return void 0;
2715
+ }
2716
+ return {
2717
+ getReferences: async ({ query }) => {
2718
+ const objects = await space.db.query(Filter6.everything()).run();
2719
+ return objects.filter((object) => stringMatch(query, Obj7.getLabel(object) ?? "")).filter((object) => !!Obj7.getDXN(object)).map((object) => ({
2720
+ uri: Obj7.getDXN(object).toString(),
2721
+ label: Obj7.getLabel(object) ?? ""
2722
+ }));
2723
+ },
2724
+ resolveReference: async ({ uri }) => {
2725
+ const object = await space.db.query(Filter6.id(uri)).first();
2726
+ return {
2727
+ uri,
2728
+ label: Obj7.getLabel(object) ?? ""
2729
+ };
2730
+ }
2731
+ };
2732
+ }, [
2733
+ space
2734
+ ]);
2735
+ };
2736
+ var stringMatch = (query, label) => label.toLowerCase().startsWith(query.toLowerCase());
2737
+
2738
+ // src/meta.ts
2739
+ import { trim as trim2 } from "@dxos/util";
2740
+ var meta9 = {
2741
+ id: "org.dxos.plugin.assistant",
2742
+ name: "Assistant",
2743
+ description: trim2`
2744
+ Intelligent AI assistant that can analyze and interact with objects across your spaces.
2745
+ Chat naturally to get insights, search content, and perform actions using AI-powered context awareness.
2746
+ `,
2747
+ icon: "ph--atom--regular",
2748
+ iconHue: "sky",
2749
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-assistant",
2750
+ tags: [
2751
+ "labs"
2752
+ ]
2753
+ };
2754
+ var ASSISTANT_DIALOG = `${meta9.id}.assistant.dialog`;
2755
+ var ASSISTANT_COMPANION_VARIANT = "assistant-chat";
73
2756
 
74
2757
  // src/translations.ts
75
- import { Blueprint, Prompt } from "@dxos/blueprints";
2758
+ import { Chat as Chat3, Project } from "@dxos/assistant-toolkit";
2759
+ import { Blueprint as Blueprint2, Prompt } from "@dxos/blueprints";
76
2760
  import { Sequence } from "@dxos/conductor";
77
- import { Type } from "@dxos/echo";
2761
+ import { Type as Type2 } from "@dxos/echo";
2762
+ import { meta as meta10 } from "#meta";
78
2763
  var translations = [
79
2764
  {
80
2765
  "en-US": {
81
2766
  // TODO(burdon): From assistant.
82
- [Blueprint.Blueprint.typename]: {
83
- "typename label": "Blueprint",
84
- "typename label_zero": "Blueprints",
85
- "typename label_one": "Blueprint",
86
- "typename label_other": "Blueprints",
87
- "object name placeholder": "New blueprint",
88
- "rename object label": "Rename blueprint",
89
- "delete object label": "Delete blueprint",
90
- "object deleted label": "Blueprint deleted"
2767
+ [Blueprint2.Blueprint.typename]: {
2768
+ "typename.label": "Blueprint",
2769
+ "typename.label_zero": "Blueprints",
2770
+ "typename.label_one": "Blueprint",
2771
+ "typename.label_other": "Blueprints",
2772
+ "object-name.placeholder": "New blueprint",
2773
+ "add-object.label": "Add blueprint",
2774
+ "rename-object.label": "Rename blueprint",
2775
+ "delete-object.label": "Delete blueprint",
2776
+ "object-deleted.label": "Blueprint deleted"
91
2777
  },
92
- [Type.getTypename(Prompt.Prompt)]: {
93
- "typename label": "Prompt",
94
- "typename label_zero": "Prompts",
95
- "typename label_one": "Prompt",
96
- "typename label_other": "Prompts",
97
- "object name placeholder": "New prompt",
98
- "rename object label": "Rename prompt",
99
- "delete object label": "Delete prompt",
100
- "object deleted label": "Prompt deleted"
2778
+ [Type2.getTypename(Prompt.Prompt)]: {
2779
+ "typename.label": "Prompt",
2780
+ "typename.label_zero": "Prompts",
2781
+ "typename.label_one": "Prompt",
2782
+ "typename.label_other": "Prompts",
2783
+ "object-name.placeholder": "New prompt",
2784
+ "add-object.label": "Add prompt",
2785
+ "rename-object.label": "Rename prompt",
2786
+ "delete-object.label": "Delete prompt",
2787
+ "object-deleted.label": "Prompt deleted"
101
2788
  },
102
2789
  // TODO(burdon): From conductor.
103
2790
  [Sequence.typename]: {
104
- "typename label": "Sequence",
105
- "typename label_zero": "Sequences",
106
- "typename label_one": "Sequence",
107
- "typename label_other": "Sequences",
108
- "object name placeholder": "New sequence",
109
- "rename object label": "Rename sequence",
110
- "delete object label": "Delete sequence",
111
- "object deleted label": "Sequence deleted"
2791
+ "typename.label": "Sequence",
2792
+ "typename.label_zero": "Sequences",
2793
+ "typename.label_one": "Sequence",
2794
+ "typename.label_other": "Sequences",
2795
+ "object-name.placeholder": "New sequence",
2796
+ "add-object.label": "Add sequence",
2797
+ "rename-object.label": "Rename sequence",
2798
+ "delete-object.label": "Delete sequence",
2799
+ "object-deleted.label": "Sequence deleted"
2800
+ },
2801
+ [Chat3.Chat.typename]: {
2802
+ "typename.label": "AI Chat",
2803
+ "object-name.placeholder": "New AI Chat",
2804
+ "add-object.label": "Add AI chat",
2805
+ "rename-object.label": "Rename AI Chat",
2806
+ "delete-object.label": "Delete AI Chat",
2807
+ "object-deleted.label": "AI Chat deleted"
112
2808
  },
113
- [Assistant_exports.Chat.typename]: {
114
- "typename label": "AI Chat",
115
- "object name placeholder": "New AI Chat",
116
- "rename object label": "Rename AI Chat",
117
- "delete object label": "Delete AI Chat",
118
- "object deleted label": "AI Chat deleted"
2809
+ [Project.Project.typename]: {
2810
+ "typename.label": "Project",
2811
+ "typename.label_zero": "Projects",
2812
+ "typename.label_one": "Project",
2813
+ "typename.label_other": "Projects",
2814
+ "object-name.placeholder": "New project",
2815
+ "add-object.label": "Add project",
2816
+ "rename-object.label": "Rename project",
2817
+ "delete-object.label": "Delete project",
2818
+ "object-deleted.label": "Project deleted"
119
2819
  },
120
2820
  // TODO(burdon): Reconcile with react-ui-chat.
121
- [meta.id]: {
122
- "templates label": "Templates",
123
- "open ambient chat label": "Open Assistant",
124
- "assistant chat label": "Assistant",
125
- "plugin name": "Assistant",
126
- "settings title": "Assistant settings",
127
- "object placeholder": "New prompt",
128
- "create object label": "Create prompt",
129
- "create trigger label": "Create trigger",
130
- "create stack section label": "Create prompt",
131
- "command placeholder": "Enter slash command...",
132
- "template placeholder": "Enter template...",
133
- "value placeholder": "Enter value...",
134
- "prompt rules label": "Prompt Rules",
135
- "typename placeholder": "Enter typename of objects which this template is for",
136
- "description placeholder": "Enter description of when this template should be used",
137
- "select preset template placeholder": "Select preset",
138
- "service registry label": "Service Registry",
139
- "type filter placeholder": "Type",
140
- "any type filter label": "Any",
141
- "no blueprint message": "No active blueprints",
142
- "tool call label": "Calling tool...",
143
- "tool result label": "Success",
144
- "tool error label": "Tool call failed",
145
- "invocations label": "Invocations",
146
- "assistant dialog title": "Assistant",
147
- "open assistant label": "Open assistant",
148
- "no tools": "No tools are configured",
149
- "no results": "No results",
150
- "cancel button": "Cancel",
151
- "save button": "Save",
152
- "new thread button": "New Chat",
153
- "rename thread button": "Rename Chat",
154
- "chat history label": "Chat History",
155
- "chat update name label": "Update AI Chat name",
156
- "toolkit label": "Toolkit",
157
- "summary label": "Summary",
158
- "search placeholder": "Search...",
159
- "prompt placeholder": "Enter question or command...",
160
- "context objects button": "Add to context",
161
- "context settings button": "Chat settings",
162
- "microphone button": "Click to speak",
163
- "cancel processing button": "Stop processing",
164
- "blueprints in context title": "Blueprints",
165
- "objects in context title": "Content",
166
- "remove object in context label": "Remove document",
167
- "chat model title": "Model",
168
- "settings default label": "Default",
169
- "settings custom prompts label": "Use custom prompts",
170
- "settings llm provider label": "LLM provider",
171
- "settings edge llm model label": "Remote language model",
172
- "settings ollama llm model label": "Ollama language model"
2821
+ [meta10.id]: {
2822
+ "templates.label": "Templates",
2823
+ "open-ambient-chat.label": "Open Assistant",
2824
+ "assistant-chat.label": "Assistant",
2825
+ "plugin.name": "Assistant",
2826
+ "settings.title": "Assistant settings",
2827
+ "object.placeholder": "New prompt",
2828
+ "create-object.label": "Create prompt",
2829
+ "create-trigger.label": "Create trigger",
2830
+ "create-stack-section.label": "Create prompt",
2831
+ "command.placeholder": "Enter slash command...",
2832
+ "template.placeholder": "Enter template...",
2833
+ "value.placeholder": "Enter value...",
2834
+ "prompt-rules.label": "Prompt Rules",
2835
+ "typename.placeholder": "Enter typename of objects which this template is for",
2836
+ "description.placeholder": "Enter description of when this template should be used",
2837
+ "select-preset-template.placeholder": "Select preset",
2838
+ "service-registry.label": "Service Registry",
2839
+ "type-filter.placeholder": "Type",
2840
+ "any-type-filter.label": "Any",
2841
+ "no-blueprint.message": "No active blueprints",
2842
+ "tool-call.label": "Calling tool...",
2843
+ "tool-result.label": "Success",
2844
+ "tool-error.label": "Tool call failed",
2845
+ "invocations.label": "Invocations",
2846
+ "trace.label": "Trace",
2847
+ "assistant-dialog.title": "Assistant",
2848
+ "open-assistant.label": "Open assistant",
2849
+ "reset-blueprints.label": "Reset blueprints",
2850
+ "no-results.message": "No results",
2851
+ "cancel.button": "Cancel",
2852
+ "save.button": "Save",
2853
+ "new-thread.button": "New Chat",
2854
+ "rename-thread.button": "Rename Chat",
2855
+ "chat-history.label": "Chat History",
2856
+ "chat-update-name.label": "Update AI Chat name",
2857
+ "toolkit.label": "Toolkit",
2858
+ "stats.label": "Stats",
2859
+ "summary.label": "Summary",
2860
+ "search.placeholder": "Search...",
2861
+ "prompt.placeholder": "Enter question or command...",
2862
+ "context-objects.button": "Add to context",
2863
+ "context-settings.button": "Chat settings",
2864
+ "microphone.button": "Click to speak",
2865
+ "cancel-processing.button": "Stop processing",
2866
+ "blueprints-in-context.title": "Blueprints",
2867
+ "objects-in-context.title": "Content",
2868
+ "remove-object-in-context.label": "Remove document",
2869
+ "chat-model.title": "Model",
2870
+ "settings.default.label": "Default",
2871
+ "settings.custom-prompts.label": "Use custom prompts",
2872
+ "settings.custom-prompts.description": "Allow the assistant to use custom prompts defined in your spaces.",
2873
+ "settings.llm-provider.label": "LLM provider",
2874
+ "settings.llm-provider.description": "Select which language model service to use for AI responses.",
2875
+ "settings.edge-llm-model.label": "Remote language model",
2876
+ "settings.edge-llm-model.description": "Choose the remote language model used for AI requests.",
2877
+ "settings.ollama-llm-model.label": "Ollama language model",
2878
+ "settings.ollama-llm-model.description": "Choose the locally hosted Ollama model for AI requests.",
2879
+ "settings.default-llm-model.label": "Default language model",
2880
+ // Trigger status
2881
+ "trigger-status-disabled.label": "Triggers disabled",
2882
+ "trigger-status-idle.label": "Triggers idle",
2883
+ "trigger-status-running.label": "Trigger running",
2884
+ "trigger-status-error.label": "Trigger error",
2885
+ "trigger-runtime.label": "Auto trigger execution",
2886
+ "trigger-last-invocation.label": "Last run",
2887
+ "trigger-duration.label": "Duration",
2888
+ "debug.button": "Debug",
2889
+ "online-switch.label": "Online",
2890
+ "run-prompt.label": "Run prompt",
2891
+ "typename.label": "Typename",
2892
+ "branch-thread.menu": "Branch chat",
2893
+ "chat-toolbar.title": "Chat toolbar",
2894
+ // ProjectSettings
2895
+ "instructions.label": "Instructions",
2896
+ "reset-history.button": "Reset",
2897
+ "subscriptions.label": "Subscriptions"
173
2898
  }
174
2899
  }
175
2900
  }
176
2901
  ];
177
2902
 
178
2903
  // src/AssistantPlugin.tsx
179
- import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from "@dxos/app-framework";
180
- import { ResearchGraph } from "@dxos/assistant-toolkit";
181
- import { Blueprint as Blueprint2, Prompt as Prompt2 } from "@dxos/blueprints";
2904
+ import * as Effect5 from "effect/Effect";
2905
+ import * as Option6 from "effect/Option";
2906
+ import { ActivationEvent, ActivationEvents, Capability, Plugin } from "@dxos/app-framework";
2907
+ import { AppActivationEvents, AppPlugin } from "@dxos/app-toolkit";
2908
+ import { Chat as Chat4, Memory, Plan, Project as Project2, ProjectBlueprint, ResearchGraph } from "@dxos/assistant-toolkit";
2909
+ import { Blueprint as Blueprint3, Prompt as Prompt2 } from "@dxos/blueprints";
182
2910
  import { Sequence as Sequence2 } from "@dxos/conductor";
183
- import { Type as Type2 } from "@dxos/echo";
184
- import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
185
- import { SpaceCapabilities, SpaceEvents } from "@dxos/plugin-space";
2911
+ import { Annotation as Annotation3, Obj as Obj8, Type as Type3 } from "@dxos/echo";
2912
+ import { Operation as Operation3 } from "@dxos/operation";
2913
+ import { AutomationCapabilities as AutomationCapabilities2 } from "@dxos/plugin-automation/types";
2914
+ import { ClientEvents } from "@dxos/plugin-client/types";
2915
+ import { DeckEvents } from "@dxos/plugin-deck/types";
2916
+ import { MarkdownEvents } from "@dxos/plugin-markdown";
2917
+ import { SpaceOperation } from "@dxos/plugin-space/operations";
2918
+ import { SpaceCapabilities, SpaceEvents } from "@dxos/plugin-space/types";
186
2919
  import { HasSubject } from "@dxos/types";
187
- var AssistantPlugin = definePlugin(meta, () => [
188
- defineModule({
189
- id: `${meta.id}/module/translations`,
190
- activatesOn: Events.SetupTranslations,
191
- activate: () => contributes(Capabilities.Translations, translations)
192
- }),
193
- defineModule({
194
- id: `${meta.id}/module/settings`,
195
- activatesOn: Events.SetupSettings,
196
- activate: Settings
197
- }),
198
- defineModule({
199
- id: `${meta.id}/module/state`,
200
- // TODO(wittjosiah): Does not integrate with settings store.
201
- // Should this be a different event?
202
- // Should settings store be renamed to be more generic?
203
- activatesOn: Events.SetupSettings,
204
- activate: AssistantState
205
- }),
206
- defineModule({
207
- id: `${meta.id}/module/metadata`,
208
- activatesOn: Events.SetupMetadata,
209
- activate: () => [
210
- contributes(Capabilities.Metadata, {
211
- id: Type2.getTypename(Assistant_exports.Chat),
212
- metadata: {
213
- icon: "ph--atom--regular",
214
- iconHue: "sky",
215
- createObjectIntent: (_, options) => createIntent(AssistantAction_exports.CreateChat, {
216
- space: options.space
217
- })
218
- }
219
- }),
220
- contributes(Capabilities.Metadata, {
221
- id: Type2.getTypename(Blueprint2.Blueprint),
222
- metadata: {
223
- icon: "ph--blueprint--regular",
224
- iconHue: "sky",
225
- inputSchema: AssistantAction_exports.BlueprintForm,
226
- createObjectIntent: (props) => createIntent(AssistantAction_exports.CreateBlueprint, props)
227
- }
228
- }),
229
- contributes(Capabilities.Metadata, {
230
- id: Type2.getTypename(Prompt2.Prompt),
231
- metadata: {
232
- icon: "ph--scroll--regular",
233
- iconHue: "sky",
234
- createObjectIntent: () => createIntent(AssistantAction_exports.CreatePrompt)
235
- }
236
- }),
237
- contributes(Capabilities.Metadata, {
238
- id: Type2.getTypename(Sequence2),
239
- metadata: {
240
- icon: "ph--circuitry--regular",
241
- iconHue: "sky",
242
- createObjectIntent: () => createIntent(AssistantAction_exports.CreateSequence),
243
- addToCollectionOnCreate: true
244
- }
245
- })
246
- ]
247
- }),
248
- defineModule({
249
- id: `${meta.id}/module/schema`,
250
- activatesOn: ClientEvents.SetupSchema,
251
- activate: () => contributes(ClientCapabilities.Schema, [
252
- Assistant_exports.Chat,
253
- Assistant_exports.CompanionTo,
254
- Blueprint2.Blueprint,
255
- HasSubject.HasSubject,
256
- Prompt2.Prompt,
257
- ResearchGraph,
258
- Sequence2
259
- ])
260
- }),
261
- defineModule({
262
- id: `${meta.id}/module/on-space-created`,
263
- activatesOn: SpaceEvents.SpaceCreated,
264
- activate: () => contributes(SpaceCapabilities.OnCreateSpace, (params) => createIntent(AssistantAction_exports.OnCreateSpace, params))
265
- }),
266
- defineModule({
267
- id: `${meta.id}/module/repair`,
268
- activatesOn: ClientEvents.SpacesReady,
269
- activate: Repair
270
- }),
271
- defineModule({
272
- id: `${meta.id}/module/app-graph-builder`,
273
- activatesOn: Events.SetupAppGraph,
274
- activate: AppGraphBuilder
275
- }),
276
- defineModule({
277
- id: `${meta.id}/module/intent-resolver`,
278
- activatesOn: Events.SetupIntentResolver,
279
- activate: IntentResolver
280
- }),
281
- defineModule({
282
- id: `${meta.id}/module/react-surface`,
283
- activatesOn: Events.SetupReactSurface,
284
- // TODO(wittjosiah): Should occur before the chat is loaded when surfaces activation is more granular.
285
- activatesBefore: [
286
- Events.SetupArtifactDefinition
287
- ],
288
- activate: ReactSurface
289
- }),
290
- defineModule({
291
- id: `${meta.id}/module/edge-model-resolver`,
292
- activatesOn: AssistantEvents.SetupAiServiceProviders,
293
- activate: EdgeModelResolver
294
- }),
295
- defineModule({
296
- id: `${meta.id}/module/local-model-resolver`,
297
- activatesOn: AssistantEvents.SetupAiServiceProviders,
298
- activate: LocalModelResolver
299
- }),
300
- defineModule({
301
- id: `${meta.id}/module/ai-service`,
302
- activatesBefore: [
303
- AssistantEvents.SetupAiServiceProviders
304
- ],
305
- // TODO(dmaretskyi): This should activate lazily when the AI chat is used.
306
- activatesOn: Events.Startup,
307
- activate: AiService
308
- }),
309
- defineModule({
310
- id: `${meta.id}/module/blueprint`,
311
- activatesOn: Events.SetupArtifactDefinition,
312
- activate: BlueprintDefinition
313
- }),
314
- defineModule({
315
- id: `${meta.id}/module/toolkit`,
316
- // TODO(wittjosiah): Use a different event.
317
- activatesOn: Events.Startup,
318
- activate: Toolkit
319
- })
320
- ]);
2920
+ import { AiService, AppGraphBuilder, AssistantState, BlueprintDefinition, CompanionChatProvisioner, EdgeModelResolver, LocalModelResolver, MarkdownExtension, Migrations, OperationHandler, ReactSurface, Settings, Toolkit } from "#capabilities";
2921
+ import { meta as meta11 } from "#meta";
2922
+ import { AssistantOperation as AssistantOperation2 } from "#operations";
2923
+ import { AssistantEvents as AssistantEvents2 } from "#types";
2924
+ var AssistantPlugin = Plugin.define(meta11).pipe(AppPlugin.addAppGraphModule({
2925
+ activate: AppGraphBuilder
2926
+ }), AppPlugin.addBlueprintDefinitionModule({
2927
+ activate: BlueprintDefinition
2928
+ }), AppPlugin.addMetadataModule({
2929
+ metadata: [
2930
+ {
2931
+ id: Type3.getTypename(Chat4.Chat),
2932
+ metadata: {
2933
+ icon: Annotation3.IconAnnotation.get(Chat4.Chat).pipe(Option6.getOrThrow).icon,
2934
+ iconHue: Annotation3.IconAnnotation.get(Chat4.Chat).pipe(Option6.getOrThrow).hue ?? "white",
2935
+ createObject: (props, options) => Effect5.gen(function* () {
2936
+ const { object } = yield* Operation3.invoke(AssistantOperation2.CreateChat, {
2937
+ db: options.db,
2938
+ name: props?.name
2939
+ });
2940
+ return yield* Operation3.invoke(SpaceOperation.AddObject, {
2941
+ object,
2942
+ target: options.target,
2943
+ hidden: true,
2944
+ targetNodeId: options.targetNodeId
2945
+ });
2946
+ })
2947
+ }
2948
+ },
2949
+ {
2950
+ id: Type3.getTypename(Blueprint3.Blueprint),
2951
+ metadata: {
2952
+ icon: Annotation3.IconAnnotation.get(Blueprint3.Blueprint).pipe(Option6.getOrThrow).icon,
2953
+ iconHue: Annotation3.IconAnnotation.get(Blueprint3.Blueprint).pipe(Option6.getOrThrow).hue ?? "white",
2954
+ inputSchema: AssistantOperation2.BlueprintForm,
2955
+ createObject: (props, options) => Effect5.gen(function* () {
2956
+ const object = Blueprint3.make(props);
2957
+ return yield* Operation3.invoke(SpaceOperation.AddObject, {
2958
+ object,
2959
+ target: options.target,
2960
+ hidden: true,
2961
+ targetNodeId: options.targetNodeId
2962
+ });
2963
+ })
2964
+ }
2965
+ },
2966
+ {
2967
+ id: Type3.getTypename(Prompt2.Prompt),
2968
+ metadata: {
2969
+ icon: Annotation3.IconAnnotation.get(Prompt2.Prompt).pipe(Option6.getOrThrow).icon,
2970
+ iconHue: Annotation3.IconAnnotation.get(Prompt2.Prompt).pipe(Option6.getOrThrow).hue ?? "white",
2971
+ createObject: (props, options) => Effect5.gen(function* () {
2972
+ const object = Prompt2.make(props);
2973
+ return yield* Operation3.invoke(SpaceOperation.AddObject, {
2974
+ object,
2975
+ target: options.target,
2976
+ hidden: true,
2977
+ targetNodeId: options.targetNodeId
2978
+ });
2979
+ })
2980
+ }
2981
+ },
2982
+ {
2983
+ id: Type3.getTypename(Sequence2),
2984
+ metadata: {
2985
+ icon: Annotation3.IconAnnotation.get(Sequence2).pipe(Option6.getOrThrow).icon,
2986
+ iconHue: Annotation3.IconAnnotation.get(Sequence2).pipe(Option6.getOrThrow).hue ?? "white",
2987
+ createObject: (props, options) => Effect5.gen(function* () {
2988
+ const object = Obj8.make(Sequence2, props);
2989
+ return yield* Operation3.invoke(SpaceOperation.AddObject, {
2990
+ object,
2991
+ target: options.target,
2992
+ hidden: true,
2993
+ targetNodeId: options.targetNodeId
2994
+ });
2995
+ })
2996
+ }
2997
+ },
2998
+ {
2999
+ id: Type3.getTypename(Project2.Project),
3000
+ metadata: {
3001
+ icon: Annotation3.IconAnnotation.get(Project2.Project).pipe(Option6.getOrThrow).icon,
3002
+ iconHue: Annotation3.IconAnnotation.get(Project2.Project).pipe(Option6.getOrThrow).hue ?? "white",
3003
+ createObject: (props, options) => Effect5.gen(function* () {
3004
+ const object = yield* Project2.makeInitialized({
3005
+ name: "New Project",
3006
+ spec: "Not specified yet"
3007
+ }, ProjectBlueprint.make()).pipe(withComputeRuntime(options.db.spaceId));
3008
+ return yield* Operation3.invoke(SpaceOperation.AddObject, {
3009
+ object,
3010
+ target: options.target,
3011
+ hidden: true,
3012
+ targetNodeId: options.targetNodeId
3013
+ });
3014
+ })
3015
+ }
3016
+ }
3017
+ ]
3018
+ }), AppPlugin.addOperationHandlerModule({
3019
+ activate: OperationHandler
3020
+ }), AppPlugin.addSchemaModule({
3021
+ schema: [
3022
+ Chat4.Chat,
3023
+ Chat4.CompanionTo,
3024
+ Blueprint3.Blueprint,
3025
+ HasSubject.HasSubject,
3026
+ Prompt2.Prompt,
3027
+ ResearchGraph.ResearchGraph,
3028
+ Project2.Project,
3029
+ Plan.Plan,
3030
+ Sequence2,
3031
+ Memory.Memory
3032
+ ]
3033
+ }), AppPlugin.addSettingsModule({
3034
+ activate: Settings
3035
+ }), AppPlugin.addSurfaceModule({
3036
+ activate: ReactSurface,
3037
+ activatesBefore: [
3038
+ AppActivationEvents.SetupArtifactDefinition
3039
+ ]
3040
+ }), AppPlugin.addTranslationsModule({
3041
+ translations
3042
+ }), Plugin.addModule({
3043
+ id: "markdown",
3044
+ activatesOn: MarkdownEvents.SetupExtensions,
3045
+ activate: MarkdownExtension
3046
+ }), Plugin.addModule({
3047
+ // TODO(wittjosiah): Does not integrate with settings store.
3048
+ // Should this be a different event?
3049
+ // Should settings store be renamed to be more generic?
3050
+ activatesOn: AppActivationEvents.SetupSettings,
3051
+ activate: AssistantState
3052
+ }), Plugin.addModule({
3053
+ id: "on-space-created",
3054
+ activatesOn: SpaceEvents.SpaceCreated,
3055
+ activate: () => Effect5.succeed(Capability.contributes(SpaceCapabilities.OnCreateSpace, (params) => Operation3.invoke(AssistantOperation2.OnCreateSpace, params)))
3056
+ }), Plugin.addModule({
3057
+ activatesOn: AssistantEvents2.SetupAiServiceProviders,
3058
+ activate: EdgeModelResolver
3059
+ }), Plugin.addModule({
3060
+ activatesOn: AssistantEvents2.SetupAiServiceProviders,
3061
+ activate: LocalModelResolver
3062
+ }), Plugin.addModule({
3063
+ activatesBefore: [
3064
+ AssistantEvents2.SetupAiServiceProviders
3065
+ ],
3066
+ // TODO(dmaretskyi): This should activate lazily when the AI chat is used.
3067
+ activatesOn: ActivationEvents.Startup,
3068
+ activate: AiService
3069
+ }), Plugin.addModule({
3070
+ // TODO(wittjosiah): Use a different event.
3071
+ activatesOn: ActivationEvents.Startup,
3072
+ activate: Toolkit
3073
+ }), Plugin.addModule({
3074
+ activatesOn: ActivationEvent.allOf(ActivationEvents.OperationInvokerReady, AppActivationEvents.AppGraphReady, DeckEvents.StateReady),
3075
+ activate: CompanionChatProvisioner
3076
+ }), Plugin.addModule({
3077
+ activatesOn: ClientEvents.SetupMigration,
3078
+ activate: Migrations
3079
+ }), Plugin.make);
3080
+ var withComputeRuntime = (spaceId) => (effect) => Effect5.gen(function* () {
3081
+ const provider = yield* Capability.get(AutomationCapabilities2.ComputeRuntime).pipe(Effect5.orDie);
3082
+ const runtime3 = yield* provider.getRuntime(spaceId).runtimeEffect;
3083
+ return yield* effect.pipe(Effect5.provide(runtime3));
3084
+ });
321
3085
  export {
322
- ASSISTANT_BLUEPRINT_KEY,
3086
+ ASSISTANT_COMPANION_VARIANT,
323
3087
  ASSISTANT_DIALOG,
324
- AiService,
325
3088
  ApiAuthorization,
326
- AppGraphBuilder,
327
3089
  Assistant_exports as Assistant,
328
- AssistantAction_exports as AssistantAction,
3090
+ blueprint_default as AssistantBlueprint,
329
3091
  AssistantCapabilities,
330
3092
  AssistantEvents,
331
3093
  AssistantPlugin,
332
3094
  AssistantSettings,
333
- AssistantState,
334
- BlueprintArticle,
335
- BlueprintDefinition,
336
3095
  Chat,
337
- ChatCompanion,
338
- ChatContainer,
339
3096
  ChatContextProvider,
340
- ChatDialog,
341
- EdgeModelResolver,
342
- IntentResolver,
343
3097
  LLM_PROVIDERS,
344
- LocalModelResolver,
345
- PromptArticle,
346
- ReactSurface,
347
- Repair,
3098
+ ProcessTree,
348
3099
  ServiceType,
349
- Settings,
350
3100
  TemplateEditor,
351
3101
  Toolbox,
352
- ToolboxContainer,
353
- Toolkit,
3102
+ ToolboxPanel,
354
3103
  categoryIcons,
355
- createBlueprint,
356
- meta,
3104
+ meta9 as meta,
357
3105
  translations,
358
- useActiveBlueprints,
359
- useBlueprintHandlers,
3106
+ useActiveBlueprints2 as useActiveBlueprints,
3107
+ useBlueprintHandlers2 as useBlueprintHandlers,
360
3108
  useBlueprintRegistry,
361
- useBlueprints,
3109
+ useBlueprints2 as useBlueprints,
362
3110
  useChatContext,
363
3111
  useChatProcessor,
364
3112
  useChatServices,
365
- useChatToolbarActions,
3113
+ useChatToolbarActions2 as useChatToolbarActions,
366
3114
  useContextBinder,
367
- useContextObjects,
368
- useFilteredTypes,
3115
+ useContextObjects3 as useContextObjects,
3116
+ useFilteredTypes2 as useFilteredTypes,
369
3117
  useFlush,
370
3118
  useOnline,
371
3119
  usePresets,