@dxos/plugin-assistant 0.9.1-staging.ee54ba693a → 0.11.0

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 (611) hide show
  1. package/PLUGIN.mdl +3 -28
  2. package/dist/lib/AssistantPlugin.mjs +2 -0
  3. package/dist/lib/AssistantPlugin.node.mjs +55 -0
  4. package/dist/lib/AssistantPlugin.node.mjs.map +1 -0
  5. package/dist/lib/AssistantPlugin.workerd.mjs +43 -0
  6. package/dist/lib/AssistantPlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities.mjs +24 -0
  8. package/dist/lib/capabilities.mjs.map +1 -0
  9. package/dist/lib/chunk-AgentArticle.mjs +52 -0
  10. package/dist/lib/chunk-AgentArticle.mjs.map +1 -0
  11. package/dist/lib/chunk-AgentProperties.mjs +35 -0
  12. package/dist/lib/chunk-AgentProperties.mjs.map +1 -0
  13. package/dist/lib/chunk-AssistantPlugin.mjs +88 -0
  14. package/dist/lib/chunk-AssistantPlugin.mjs.map +1 -0
  15. package/dist/lib/chunk-AssistantSettings.mjs +285 -0
  16. package/dist/lib/chunk-AssistantSettings.mjs.map +1 -0
  17. package/dist/lib/chunk-ChatArticle.mjs +121 -0
  18. package/dist/lib/chunk-ChatArticle.mjs.map +1 -0
  19. package/dist/lib/chunk-ChatCompanion.mjs +116 -0
  20. package/dist/lib/chunk-ChatCompanion.mjs.map +1 -0
  21. package/dist/lib/chunk-ChatDialog.mjs +73 -0
  22. package/dist/lib/chunk-ChatDialog.mjs.map +1 -0
  23. package/dist/lib/chunk-IntegrationPrompt.mjs +73 -0
  24. package/dist/lib/chunk-IntegrationPrompt.mjs.map +1 -0
  25. package/dist/lib/chunk-SpaceHomePrompt.mjs +104 -0
  26. package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -0
  27. package/dist/lib/chunk-SpaceHomeSuggestions.mjs +60 -0
  28. package/dist/lib/chunk-SpaceHomeSuggestions.mjs.map +1 -0
  29. package/dist/lib/chunk-TracePanel.mjs +127 -0
  30. package/dist/lib/chunk-TracePanel.mjs.map +1 -0
  31. package/dist/lib/chunk-TracePanel2.mjs +7 -0
  32. package/dist/lib/chunk-TracePanel2.mjs.map +1 -0
  33. package/dist/lib/chunk-TriggerStatus.mjs +72 -0
  34. package/dist/lib/chunk-TriggerStatus.mjs.map +1 -0
  35. package/dist/lib/chunk-agent-hydrator.mjs +22 -0
  36. package/dist/lib/chunk-agent-hydrator.mjs.map +1 -0
  37. package/dist/lib/chunk-agent-service.mjs +21 -0
  38. package/dist/lib/chunk-agent-service.mjs.map +1 -0
  39. package/dist/lib/{neutral/ai-context-LIKJYMIN.mjs → chunk-ai-context.mjs} +8 -12
  40. package/dist/lib/chunk-ai-context.mjs.map +1 -0
  41. package/dist/lib/chunk-ai-service.mjs +27 -0
  42. package/dist/lib/chunk-ai-service.mjs.map +1 -0
  43. package/dist/lib/chunk-app-graph-builder.mjs +179 -0
  44. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  45. package/dist/lib/chunk-automation-templates.mjs +99 -0
  46. package/dist/lib/chunk-automation-templates.mjs.map +1 -0
  47. package/dist/lib/chunk-companion-chat-provisioner.mjs +123 -0
  48. package/dist/lib/chunk-companion-chat-provisioner.mjs.map +1 -0
  49. package/dist/lib/chunk-connector.mjs +60 -0
  50. package/dist/lib/chunk-connector.mjs.map +1 -0
  51. package/dist/lib/chunk-constants.mjs +9 -0
  52. package/dist/lib/chunk-constants.mjs.map +1 -0
  53. package/dist/lib/chunk-context.mjs +7 -0
  54. package/dist/lib/chunk-context.mjs.map +1 -0
  55. package/dist/lib/chunk-create-chat.mjs +53 -0
  56. package/dist/lib/chunk-create-chat.mjs.map +1 -0
  57. package/dist/lib/chunk-create-object.mjs +70 -0
  58. package/dist/lib/chunk-create-object.mjs.map +1 -0
  59. package/dist/lib/chunk-edge-model-resolver.mjs +64 -0
  60. package/dist/lib/chunk-edge-model-resolver.mjs.map +1 -0
  61. package/dist/lib/chunk-ensure-companion-chat.mjs +49 -0
  62. package/dist/lib/chunk-ensure-companion-chat.mjs.map +1 -0
  63. package/dist/lib/chunk-extensions.mjs +78 -0
  64. package/dist/lib/chunk-extensions.mjs.map +1 -0
  65. package/dist/lib/chunk-fork-chat.mjs +83 -0
  66. package/dist/lib/chunk-fork-chat.mjs.map +1 -0
  67. package/dist/lib/chunk-generate-home-suggestions.mjs +71 -0
  68. package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -0
  69. package/dist/lib/chunk-local-model-resolver.mjs +25 -0
  70. package/dist/lib/chunk-local-model-resolver.mjs.map +1 -0
  71. package/dist/lib/chunk-markdown-extension.mjs +27 -0
  72. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  73. package/dist/lib/{neutral/chunk-L7AR4VTA.mjs → chunk-meta.mjs} +20 -25
  74. package/dist/lib/chunk-meta.mjs.map +1 -0
  75. package/dist/lib/chunk-operation-handler.mjs +13 -0
  76. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  77. package/dist/lib/chunk-paths.mjs +8 -0
  78. package/dist/lib/chunk-paths.mjs.map +1 -0
  79. package/dist/lib/chunk-processor.mjs +432 -0
  80. package/dist/lib/chunk-processor.mjs.map +1 -0
  81. package/dist/lib/chunk-react-surface.mjs +177 -0
  82. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  83. package/dist/lib/chunk-run-prompt-in-new-chat.mjs +96 -0
  84. package/dist/lib/chunk-run-prompt-in-new-chat.mjs.map +1 -0
  85. package/dist/lib/chunk-set-current-chat.mjs +43 -0
  86. package/dist/lib/chunk-set-current-chat.mjs.map +1 -0
  87. package/dist/lib/chunk-settings.mjs +23 -0
  88. package/dist/lib/chunk-settings.mjs.map +1 -0
  89. package/dist/lib/chunk-skill-definition.mjs +42 -0
  90. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  91. package/dist/lib/chunk-skills.mjs +19 -0
  92. package/dist/lib/chunk-skills.mjs.map +1 -0
  93. package/dist/lib/chunk-state.mjs +32 -0
  94. package/dist/lib/chunk-state.mjs.map +1 -0
  95. package/dist/lib/chunk-toggle-trace-panel-debug.mjs +18 -0
  96. package/dist/lib/chunk-toggle-trace-panel-debug.mjs.map +1 -0
  97. package/dist/lib/chunk-toolkit.mjs +12 -0
  98. package/dist/lib/chunk-toolkit.mjs.map +1 -0
  99. package/dist/lib/chunk-types.mjs +332 -0
  100. package/dist/lib/chunk-types.mjs.map +1 -0
  101. package/dist/lib/chunk-update-chat-name.mjs +63 -0
  102. package/dist/lib/chunk-update-chat-name.mjs.map +1 -0
  103. package/dist/lib/components.mjs +2616 -0
  104. package/dist/lib/components.mjs.map +1 -0
  105. package/dist/lib/containers.mjs +17 -0
  106. package/dist/lib/containers.mjs.map +1 -0
  107. package/dist/lib/execution-graph.mjs +961 -0
  108. package/dist/lib/execution-graph.mjs.map +1 -0
  109. package/dist/lib/extensions.mjs +2 -0
  110. package/dist/lib/hooks.mjs +674 -0
  111. package/dist/lib/hooks.mjs.map +1 -0
  112. package/dist/lib/index.mjs +5 -0
  113. package/dist/lib/meta.mjs +2 -0
  114. package/dist/lib/operations.mjs +7 -0
  115. package/dist/lib/operations.mjs.map +1 -0
  116. package/dist/lib/plugin.mjs +9 -0
  117. package/dist/lib/plugin.mjs.map +1 -0
  118. package/dist/lib/plugin.workerd.mjs +2 -0
  119. package/dist/lib/skills.mjs +2 -0
  120. package/dist/lib/testing.mjs +2 -0
  121. package/dist/lib/translations.mjs +207 -0
  122. package/dist/lib/translations.mjs.map +1 -0
  123. package/dist/lib/types.mjs +2 -0
  124. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  125. package/dist/types/src/AssistantPlugin.node.d.ts.map +1 -1
  126. package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
  127. package/dist/types/src/capabilities/AssistantSurfaces.d.ts +22 -0
  128. package/dist/types/src/capabilities/AssistantSurfaces.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
  130. package/dist/types/src/capabilities/agent-service.d.ts +1 -1
  131. package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/ai-context.d.ts +1 -1
  133. package/dist/types/src/capabilities/ai-service.d.ts +1 -1
  134. package/dist/types/src/capabilities/app-graph-builder.d.ts +12 -1
  135. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/automation-templates.d.ts +1 -1
  137. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
  138. package/dist/types/src/capabilities/connector.d.ts +1 -1
  139. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  140. package/dist/types/src/capabilities/edge-model-resolver.d.ts +1 -1
  141. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/index.d.ts +0 -2
  143. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/local-model-resolver.d.ts +1 -1
  145. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  147. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  148. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  149. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/settings.d.ts +1 -1
  151. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
  152. package/dist/types/src/capabilities/standalone-chats-query.test.d.ts +2 -0
  153. package/dist/types/src/capabilities/standalone-chats-query.test.d.ts.map +1 -0
  154. package/dist/types/src/capabilities/state.d.ts +1 -1
  155. package/dist/types/src/capabilities/toolkit.d.ts +1 -1
  156. package/dist/types/src/components/AgentProperties/AgentProperties.d.ts +4 -1
  157. package/dist/types/src/components/AgentProperties/AgentProperties.d.ts.map +1 -1
  158. package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Chat/Chat.d.ts +21 -8
  160. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  161. package/dist/types/src/components/Chat/{Chat.stories.d.ts → Error.stories.d.ts} +1 -1
  162. package/dist/types/src/components/Chat/Error.stories.d.ts.map +1 -0
  163. package/dist/types/src/components/Chat/context.d.ts +8 -0
  164. package/dist/types/src/components/Chat/context.d.ts.map +1 -1
  165. package/dist/types/src/components/Chat/events.d.ts +5 -0
  166. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  167. package/dist/types/src/components/Chat/thread.d.ts +42 -0
  168. package/dist/types/src/components/Chat/thread.d.ts.map +1 -0
  169. package/dist/types/src/components/Chat/thread.test.d.ts +2 -0
  170. package/dist/types/src/components/Chat/thread.test.d.ts.map +1 -0
  171. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  172. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -3
  174. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
  175. package/dist/types/src/components/ChatPrompt/index.d.ts +0 -1
  176. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  177. package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/ChatThread/ChatThread.d.ts +8 -3
  179. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  180. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +30 -2
  181. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
  183. package/dist/types/src/components/ChatThread/index.d.ts +1 -0
  184. package/dist/types/src/components/ChatThread/index.d.ts.map +1 -1
  185. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  186. package/dist/types/src/components/ChatThread/sync/index.d.ts +3 -0
  187. package/dist/types/src/components/ChatThread/sync/index.d.ts.map +1 -0
  188. package/dist/types/src/components/ChatThread/{sync.d.ts → sync/sync.d.ts} +46 -2
  189. package/dist/types/src/components/ChatThread/sync/sync.d.ts.map +1 -0
  190. package/dist/types/src/components/ChatThread/sync/sync.test.d.ts.map +1 -0
  191. package/dist/types/src/components/ChatThread/sync/tool-widget-state.d.ts.map +1 -0
  192. package/dist/types/src/components/ChatThread/sync/tool-widget-state.test.d.ts.map +1 -0
  193. package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts +15 -0
  194. package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts.map +1 -0
  195. package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts +21 -0
  196. package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts.map +1 -0
  197. package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts +2 -0
  198. package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts.map +1 -0
  199. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
  200. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
  201. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts +1 -2
  202. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
  203. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +6 -0
  204. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -1
  205. package/dist/types/src/components/ChatThread/widgets/format-time.d.ts +2 -0
  206. package/dist/types/src/components/ChatThread/widgets/format-time.d.ts.map +1 -0
  207. package/dist/types/src/components/ChatThread/widgets/index.d.ts +4 -1
  208. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  209. package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts +3 -0
  210. package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts.map +1 -0
  211. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts +16 -0
  212. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts.map +1 -0
  213. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +210 -0
  214. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -0
  215. package/dist/types/src/components/ConnectorAuthMenu/index.d.ts +2 -0
  216. package/dist/types/src/components/ConnectorAuthMenu/index.d.ts.map +1 -0
  217. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +1 -1
  218. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  219. package/dist/types/src/components/TaskList/TaskList.d.ts +9 -11
  220. package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
  221. package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -4
  222. package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
  223. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +1 -2
  224. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
  225. package/dist/types/src/components/ToolBlock/index.d.ts +1 -0
  226. package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -1
  227. package/dist/types/src/components/ToolBlock/is-tool-message.d.ts +3 -0
  228. package/dist/types/src/components/ToolBlock/is-tool-message.d.ts.map +1 -0
  229. package/dist/types/src/components/Toolbox/Toolbox.d.ts +1 -1
  230. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  231. package/dist/types/src/components/index.d.ts +1 -0
  232. package/dist/types/src/components/index.d.ts.map +1 -1
  233. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts +5 -2
  234. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
  235. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  236. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts +4 -1
  237. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
  238. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts +4 -1
  239. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  240. package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts +4 -1
  241. package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  242. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +4 -6
  243. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -1
  244. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  245. package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +22 -1
  246. package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts.map +1 -1
  247. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
  248. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts +4 -1
  249. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  250. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +4 -7
  251. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -1
  252. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +4 -9
  253. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
  254. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +5 -7
  255. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -1
  256. package/dist/types/src/containers/TracePanel/TracePanel.d.ts +1 -1
  257. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  258. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  259. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts +15 -1
  260. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  261. package/dist/types/src/containers/index.d.ts +0 -1
  262. package/dist/types/src/containers/index.d.ts.map +1 -1
  263. package/dist/types/src/execution-graph/execution-graph.d.ts +12 -1
  264. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  265. package/dist/types/src/execution-graph/index.d.ts +1 -1
  266. package/dist/types/src/execution-graph/index.d.ts.map +1 -1
  267. package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -1
  268. package/dist/types/src/execution-graph/span-tree.d.ts +17 -0
  269. package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
  270. package/dist/types/src/feed-logger.d.ts +1 -1
  271. package/dist/types/src/feed-logger.d.ts.map +1 -1
  272. package/dist/types/src/hooks/index.d.ts +1 -1
  273. package/dist/types/src/hooks/index.d.ts.map +1 -1
  274. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  275. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  276. package/dist/types/src/hooks/useContextObjects.d.ts +1 -1
  277. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  278. package/dist/types/src/hooks/useSelectionContext.d.ts +13 -0
  279. package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -0
  280. package/dist/types/src/hooks/useSelectionContext.test.d.ts +2 -0
  281. package/dist/types/src/hooks/useSelectionContext.test.d.ts.map +1 -0
  282. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -1
  283. package/dist/types/src/operations/index.d.ts.map +1 -1
  284. package/dist/types/src/processor/index.d.ts +1 -0
  285. package/dist/types/src/processor/index.d.ts.map +1 -1
  286. package/dist/types/src/processor/processor.d.ts +5 -2
  287. package/dist/types/src/processor/processor.d.ts.map +1 -1
  288. package/dist/types/src/processor/prompt.d.ts +18 -0
  289. package/dist/types/src/processor/prompt.d.ts.map +1 -0
  290. package/dist/types/src/processor/prompt.test.d.ts +2 -0
  291. package/dist/types/src/processor/prompt.test.d.ts.map +1 -0
  292. package/dist/types/src/processor/streaming.node.test.d.ts +2 -0
  293. package/dist/types/src/processor/streaming.node.test.d.ts.map +1 -0
  294. package/dist/types/src/skills/assistant/skill.d.ts.map +1 -1
  295. package/dist/types/src/templates/scaffold.d.ts +1 -1
  296. package/dist/types/src/templates/scaffold.d.ts.map +1 -1
  297. package/dist/types/src/translations.d.ts.map +1 -1
  298. package/dist/types/src/types/AssistantCapabilities.d.ts +1 -1
  299. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  300. package/dist/types/src/types/AssistantOperation.d.ts +2 -13
  301. package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
  302. package/dist/types/src/types/ChatSurface.d.ts +2 -2
  303. package/dist/types/src/types/ChatSurface.d.ts.map +1 -1
  304. package/dist/types/src/types/Ollama.d.ts +1 -1
  305. package/dist/types/src/types/Ollama.d.ts.map +1 -1
  306. package/dist/types/tsconfig.tsbuildinfo +1 -1
  307. package/dx.config.ts +1 -0
  308. package/package.json +106 -105
  309. package/src/AssistantPlugin.node.ts +1 -2
  310. package/src/AssistantPlugin.test.ts +60 -62
  311. package/src/AssistantPlugin.ts +1 -10
  312. package/src/AssistantPlugin.workerd.ts +1 -2
  313. package/src/capabilities/AssistantSurfaces.tsx +86 -0
  314. package/src/capabilities/agent-service.ts +1 -1
  315. package/src/capabilities/app-graph-builder.ts +31 -17
  316. package/src/capabilities/companion-chat-provisioner.ts +12 -11
  317. package/src/capabilities/connector.ts +3 -3
  318. package/src/capabilities/edge-model-resolver.ts +5 -2
  319. package/src/capabilities/index.ts +0 -2
  320. package/src/capabilities/react-surface.ts +135 -0
  321. package/src/capabilities/skill-definition.ts +4 -0
  322. package/src/capabilities/standalone-chats-query.test.ts +51 -0
  323. package/src/capabilities/state.ts +1 -1
  324. package/src/components/AgentProperties/AgentProperties.stories.tsx +6 -7
  325. package/src/components/AgentProperties/AgentProperties.tsx +37 -30
  326. package/src/components/Chat/Chat.tsx +275 -59
  327. package/src/components/Chat/{Chat.stories.tsx → Error.stories.tsx} +1 -1
  328. package/src/components/Chat/context.ts +8 -0
  329. package/src/components/Chat/events.ts +5 -0
  330. package/src/components/Chat/thread.test.ts +127 -0
  331. package/src/components/Chat/thread.ts +87 -0
  332. package/src/components/ChatPrompt/ChatActions.tsx +8 -8
  333. package/src/components/ChatPrompt/ChatMcpErrors.tsx +2 -2
  334. package/src/components/ChatPrompt/ChatOptions.stories.tsx +2 -1
  335. package/src/components/ChatPrompt/ChatOptions.tsx +5 -5
  336. package/src/components/ChatPrompt/ChatPrompt.tsx +33 -6
  337. package/src/components/ChatPrompt/index.ts +0 -1
  338. package/src/components/ChatThread/Anchor.stories.tsx +2 -1
  339. package/src/components/ChatThread/ChatThread.stories.tsx +99 -4
  340. package/src/components/ChatThread/ChatThread.tsx +34 -6
  341. package/src/components/ChatThread/Link.tsx +1 -0
  342. package/src/components/ChatThread/index.ts +2 -0
  343. package/src/components/ChatThread/registry.tsx +28 -4
  344. package/src/components/ChatThread/sync/index.ts +6 -0
  345. package/src/components/ChatThread/{sync.test.ts → sync/sync.test.ts} +167 -7
  346. package/src/components/ChatThread/{sync.ts → sync/sync.ts} +97 -3
  347. package/src/components/ChatThread/{tool-widget-state.ts → sync/tool-widget-state.ts} +1 -3
  348. package/src/components/ChatThread/widgets/BranchWidget.stories.tsx +83 -0
  349. package/src/components/ChatThread/widgets/BranchWidget.test.ts +55 -0
  350. package/src/components/ChatThread/widgets/BranchWidget.tsx +61 -0
  351. package/src/components/ChatThread/widgets/FallbackWidget.tsx +2 -2
  352. package/src/components/ChatThread/widgets/ReasoningWidget.ts +1 -1
  353. package/src/components/ChatThread/widgets/ReferenceWidget.ts +1 -6
  354. package/src/components/ChatThread/widgets/SuggestionWidget.ts +12 -3
  355. package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
  356. package/src/components/ChatThread/widgets/ToolWidget.tsx +15 -9
  357. package/src/components/ChatThread/widgets/defaults.ts +7 -1
  358. package/src/components/ChatThread/widgets/format-time.ts +45 -0
  359. package/src/components/ChatThread/widgets/index.ts +4 -1
  360. package/src/components/ChatThread/widgets/is-tool-message.ts +13 -0
  361. package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.tsx +177 -0
  362. package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx +82 -0
  363. package/src/components/ConnectorAuthMenu/index.ts +5 -0
  364. package/src/components/ProcessTree/ProcessTree.stories.tsx +1 -1
  365. package/src/components/TaskList/TaskList.stories.tsx +19 -26
  366. package/src/components/TaskList/TaskList.tsx +32 -104
  367. package/src/components/ToolBlock/ToolBlock.tsx +1 -5
  368. package/src/components/ToolBlock/index.ts +1 -0
  369. package/src/components/ToolBlock/is-tool-message.ts +13 -0
  370. package/src/components/Toolbox/Toolbox.tsx +1 -1
  371. package/src/components/index.ts +1 -0
  372. package/src/containers/AgentArticle/AgentArticle.stories.tsx +18 -11
  373. package/src/containers/AgentArticle/AgentArticle.tsx +27 -151
  374. package/src/containers/AgentProperties/AgentProperties.tsx +21 -17
  375. package/src/containers/AssistantSettings/AssistantSettings.tsx +2 -0
  376. package/src/containers/AssistantSettings/OllamaModels.tsx +6 -4
  377. package/src/containers/ChatArticle/ChatArticle.stories.tsx +200 -27
  378. package/src/containers/ChatArticle/ChatArticle.tsx +25 -5
  379. package/src/containers/ChatCompanion/ChatCompanion.tsx +45 -10
  380. package/src/containers/ChatDialog/ChatDialog.tsx +4 -1
  381. package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +9 -6
  382. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +2 -0
  383. package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +40 -39
  384. package/src/containers/TracePanel/TracePanel.stories.tsx +9 -4
  385. package/src/containers/TracePanel/TracePanel.tsx +22 -6
  386. package/src/containers/TriggerStatus/TriggerStatus.tsx +9 -16
  387. package/src/containers/index.ts +0 -1
  388. package/src/execution-graph/SPEC.md +60 -2
  389. package/src/execution-graph/execution-graph.ts +15 -2
  390. package/src/execution-graph/index.ts +1 -0
  391. package/src/execution-graph/pending-block-status.ts +3 -2
  392. package/src/execution-graph/span-tree.test.ts +87 -1
  393. package/src/execution-graph/span-tree.ts +95 -0
  394. package/src/feed-logger.ts +6 -6
  395. package/src/hooks/index.ts +1 -1
  396. package/src/hooks/useChatProcessor.ts +2 -1
  397. package/src/hooks/useChatToolbarActions.ts +22 -19
  398. package/src/hooks/useContextObjects.ts +9 -3
  399. package/src/hooks/useSelectionContext.test.ts +93 -0
  400. package/src/hooks/useSelectionContext.ts +72 -0
  401. package/src/hooks/useSkillRegistry.ts +1 -1
  402. package/src/hooks/useTraceMessages.ts +5 -3
  403. package/src/operations/create-chat.ts +2 -2
  404. package/src/operations/fork-chat.ts +2 -2
  405. package/src/operations/generate-home-suggestions.test.ts +2 -2
  406. package/src/operations/index.ts +0 -1
  407. package/src/operations/prompt.node.test.ts +1 -1
  408. package/src/paths.ts +3 -3
  409. package/src/processor/index.ts +1 -0
  410. package/src/processor/processor.node.test.ts +1 -1
  411. package/src/processor/processor.ts +33 -5
  412. package/src/processor/prompt.test.ts +37 -0
  413. package/src/processor/prompt.ts +42 -0
  414. package/src/processor/streaming.node.test.ts +196 -0
  415. package/src/skills/assistant/skill.node.test.ts +2 -2
  416. package/src/skills/assistant/skill.ts +3 -5
  417. package/src/templates/routine-templates.test.ts +1 -2
  418. package/src/templates/scaffold.ts +3 -3
  419. package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
  420. package/src/testing/data/trace-timeline-remote.dx.json +1 -1
  421. package/src/testing/data/trace-timeline.dx.json +1 -2
  422. package/src/testing/trace-timeline.node.test.ts +3 -3
  423. package/src/translations.ts +11 -10
  424. package/src/types/AssistantCapabilities.ts +1 -1
  425. package/src/types/AssistantOperation.ts +8 -31
  426. package/src/types/ChatSurface.ts +3 -3
  427. package/src/types/Ollama.ts +1 -1
  428. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs +0 -161
  429. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +0 -7
  430. package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs +0 -40
  431. package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs.map +0 -7
  432. package/dist/lib/neutral/AssistantPlugin.mjs +0 -10
  433. package/dist/lib/neutral/AssistantPlugin.mjs.map +0 -7
  434. package/dist/lib/neutral/AssistantPlugin.node.mjs +0 -72
  435. package/dist/lib/neutral/AssistantPlugin.node.mjs.map +0 -7
  436. package/dist/lib/neutral/AssistantPlugin.workerd.mjs +0 -13
  437. package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +0 -7
  438. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +0 -302
  439. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +0 -7
  440. package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs +0 -8
  441. package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs.map +0 -7
  442. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs +0 -128
  443. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +0 -7
  444. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs +0 -74
  445. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +0 -7
  446. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +0 -72
  447. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +0 -7
  448. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs +0 -34
  449. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +0 -7
  450. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +0 -114
  451. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +0 -7
  452. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +0 -63
  453. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +0 -7
  454. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +0 -12
  455. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +0 -7
  456. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs +0 -95
  457. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +0 -7
  458. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs +0 -23
  459. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +0 -7
  460. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs +0 -32
  461. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +0 -7
  462. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +0 -7
  463. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs +0 -44
  464. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +0 -7
  465. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs +0 -249
  466. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +0 -7
  467. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +0 -97
  468. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +0 -7
  469. package/dist/lib/neutral/capabilities/index.mjs +0 -47
  470. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  471. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs +0 -9
  472. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +0 -7
  473. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs +0 -420
  474. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +0 -7
  475. package/dist/lib/neutral/chunk-BXI2R4OO.mjs +0 -410
  476. package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +0 -7
  477. package/dist/lib/neutral/chunk-CMPLPDYE.mjs +0 -30
  478. package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +0 -7
  479. package/dist/lib/neutral/chunk-GPHT3HYS.mjs +0 -8
  480. package/dist/lib/neutral/chunk-GPHT3HYS.mjs.map +0 -7
  481. package/dist/lib/neutral/chunk-HKLSFB5I.mjs +0 -90
  482. package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +0 -7
  483. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  484. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  485. package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +0 -7
  486. package/dist/lib/neutral/chunk-LS72HWMM.mjs +0 -42
  487. package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +0 -7
  488. package/dist/lib/neutral/chunk-OZWZGIV2.mjs +0 -12
  489. package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +0 -7
  490. package/dist/lib/neutral/chunk-QOKLFHUS.mjs +0 -13
  491. package/dist/lib/neutral/chunk-QOKLFHUS.mjs.map +0 -7
  492. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs +0 -155
  493. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +0 -7
  494. package/dist/lib/neutral/chunk-U4LTLBAX.mjs +0 -56
  495. package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +0 -7
  496. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs +0 -115
  497. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +0 -7
  498. package/dist/lib/neutral/chunk-V2Y4XE3O.mjs +0 -12
  499. package/dist/lib/neutral/chunk-V2Y4XE3O.mjs.map +0 -7
  500. package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
  501. package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
  502. package/dist/lib/neutral/chunk-XVGEJWJX.mjs +0 -133
  503. package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +0 -7
  504. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs +0 -126
  505. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +0 -7
  506. package/dist/lib/neutral/components/index.mjs +0 -2527
  507. package/dist/lib/neutral/components/index.mjs.map +0 -7
  508. package/dist/lib/neutral/connector-ITLLTBPZ.mjs +0 -70
  509. package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +0 -7
  510. package/dist/lib/neutral/containers/index.mjs +0 -31
  511. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  512. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs +0 -56
  513. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +0 -7
  514. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs +0 -76
  515. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +0 -7
  516. package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs +0 -55
  517. package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs.map +0 -7
  518. package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs +0 -58
  519. package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs.map +0 -7
  520. package/dist/lib/neutral/execution-graph/index.mjs +0 -977
  521. package/dist/lib/neutral/execution-graph/index.mjs.map +0 -7
  522. package/dist/lib/neutral/extensions/index.mjs +0 -8
  523. package/dist/lib/neutral/extensions/index.mjs.map +0 -7
  524. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs +0 -92
  525. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +0 -7
  526. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +0 -93
  527. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +0 -7
  528. package/dist/lib/neutral/hooks/index.mjs +0 -877
  529. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  530. package/dist/lib/neutral/index.mjs +0 -42
  531. package/dist/lib/neutral/index.mjs.map +0 -7
  532. package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs +0 -24
  533. package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs.map +0 -7
  534. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +0 -41
  535. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +0 -7
  536. package/dist/lib/neutral/meta.json +0 -1
  537. package/dist/lib/neutral/meta.mjs +0 -12
  538. package/dist/lib/neutral/meta.mjs.map +0 -7
  539. package/dist/lib/neutral/migrations-7DEMVBOG.mjs +0 -28
  540. package/dist/lib/neutral/migrations-7DEMVBOG.mjs.map +0 -7
  541. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +0 -18
  542. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +0 -7
  543. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +0 -8
  544. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +0 -7
  545. package/dist/lib/neutral/operations/index.mjs +0 -8
  546. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  547. package/dist/lib/neutral/plugin.mjs +0 -16
  548. package/dist/lib/neutral/plugin.mjs.map +0 -7
  549. package/dist/lib/neutral/plugin.workerd.mjs +0 -13
  550. package/dist/lib/neutral/plugin.workerd.mjs.map +0 -7
  551. package/dist/lib/neutral/react-surface-HEJEK44F.mjs +0 -171
  552. package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +0 -7
  553. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +0 -28
  554. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +0 -7
  555. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs +0 -102
  556. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +0 -7
  557. package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs +0 -48
  558. package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs.map +0 -7
  559. package/dist/lib/neutral/settings-7Q3RITIT.mjs +0 -28
  560. package/dist/lib/neutral/settings-7Q3RITIT.mjs.map +0 -7
  561. package/dist/lib/neutral/skill-definition-553MQRTR.mjs +0 -8
  562. package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +0 -7
  563. package/dist/lib/neutral/skills/index.mjs +0 -8
  564. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  565. package/dist/lib/neutral/state-4LGAKSSD.mjs +0 -34
  566. package/dist/lib/neutral/state-4LGAKSSD.mjs.map +0 -7
  567. package/dist/lib/neutral/testing.mjs +0 -8
  568. package/dist/lib/neutral/testing.mjs.map +0 -7
  569. package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs +0 -21
  570. package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs.map +0 -7
  571. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +0 -8
  572. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +0 -7
  573. package/dist/lib/neutral/translations.mjs +0 -217
  574. package/dist/lib/neutral/translations.mjs.map +0 -7
  575. package/dist/lib/neutral/types/index.mjs +0 -24
  576. package/dist/lib/neutral/types/index.mjs.map +0 -7
  577. package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs +0 -61
  578. package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs.map +0 -7
  579. package/dist/types/src/capabilities/migrations.d.ts +0 -5
  580. package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
  581. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  582. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  583. package/dist/types/src/components/Chat/Chat.stories.d.ts.map +0 -1
  584. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +0 -10
  585. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +0 -1
  586. package/dist/types/src/components/ChatThread/sync.d.ts.map +0 -1
  587. package/dist/types/src/components/ChatThread/sync.test.d.ts.map +0 -1
  588. package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +0 -1
  589. package/dist/types/src/components/ChatThread/tool-widget-state.test.d.ts.map +0 -1
  590. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts +0 -6
  591. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +0 -1
  592. package/dist/types/src/containers/PlanArticle/index.d.ts +0 -2
  593. package/dist/types/src/containers/PlanArticle/index.d.ts.map +0 -1
  594. package/dist/types/src/hooks/useFlush.d.ts +0 -6
  595. package/dist/types/src/hooks/useFlush.d.ts.map +0 -1
  596. package/dist/types/src/operations/resolve-navigation-targets.d.ts +0 -5
  597. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +0 -1
  598. package/src/AssistantPlugin.conversations.json +0 -1
  599. package/src/capabilities/migrations.ts +0 -28
  600. package/src/capabilities/navigation-resolver.ts +0 -20
  601. package/src/capabilities/react-surface.tsx +0 -177
  602. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +0 -42
  603. package/src/components/ChatThread/DEBUG.md +0 -64
  604. package/src/containers/PlanArticle/PlanArticle.tsx +0 -37
  605. package/src/containers/PlanArticle/index.ts +0 -5
  606. package/src/hooks/useFlush.ts +0 -35
  607. package/src/operations/resolve-navigation-targets.ts +0 -44
  608. /package/dist/types/src/components/ChatThread/{sync.test.d.ts → sync/sync.test.d.ts} +0 -0
  609. /package/dist/types/src/components/ChatThread/{tool-widget-state.d.ts → sync/tool-widget-state.d.ts} +0 -0
  610. /package/dist/types/src/components/ChatThread/{tool-widget-state.test.d.ts → sync/tool-widget-state.test.d.ts} +0 -0
  611. /package/src/components/ChatThread/{tool-widget-state.test.ts → sync/tool-widget-state.test.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.mjs","names":[],"sources":["../../src/components/AgentProperties/AgentProperties.tsx","../../src/components/ChatPrompt/ChatActions.tsx","../../src/components/ChatPrompt/ChatMcpErrors.tsx","../../src/components/ChatPrompt/ChatOptions.tsx","../../src/components/ChatPrompt/ChatReferences.tsx","../../src/components/ChatPrompt/useChatVoiceInput.ts","../../src/components/ChatPrompt/ChatPrompt.tsx","../../src/components/ChatPrompt/ChatStatus.tsx","../../src/components/ChatThread/sync/tool-widget-state.ts","../../src/components/ChatThread/sync/sync.ts","../../src/components/ChatThread/widgets/format-time.ts","../../src/components/ChatThread/widgets/BranchWidget.tsx","../../src/components/ChatThread/widgets/FallbackWidget.tsx","../../src/components/ChatThread/widgets/defaults.ts","../../src/components/ChatThread/widgets/ReasoningWidget.ts","../../src/components/ChatThread/widgets/ReferenceWidget.ts","../../src/components/ChatThread/widgets/SelectWidget.ts","../../src/components/ChatThread/widgets/StatsWidget.ts","../../src/components/ChatThread/widgets/StatusWidget.ts","../../src/components/ChatThread/widgets/SuggestionWidget.ts","../../src/components/ChatThread/widgets/SummaryWidget.tsx","../../src/components/ChatThread/widgets/SurfaceWidget.tsx","../../src/components/ChatThread/widgets/ToolWidget.tsx","../../src/components/ChatThread/registry.tsx","../../src/components/ChatThread/ChatThread.tsx","../../src/components/TaskList/TaskList.tsx","../../src/components/Chat/thread.ts","../../src/components/Chat/Chat.tsx","../../src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx","../../src/components/ProcessTree/ProcessTree.tsx","../../src/components/Toolbox/Toolbox.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { type Agent } from '@dxos/assistant-toolkit';\nimport { Trigger } from '@dxos/compute';\nimport { Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { URI } from '@dxos/keys';\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { FeedAnnotation } from '@dxos/schema';\n\nimport { meta } from '#meta';\n\n/** Mirrors the foreign keys stamped by the agent-wizard automation compiler (`sync-automation`). */\nconst AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';\nconst AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';\n\nexport type AgentPropertiesProps = {\n agent: Agent.Agent;\n /** Invoked with the FULL next subscription set when the user toggles one. */\n onSubscriptionsChanged?: (subscriptions: Ref.Ref<Obj.Unknown>[]) => void;\n};\n\nexport const AgentProperties = ({ agent, onSubscriptionsChanged }: AgentPropertiesProps) => {\n const { t } = useTranslation(meta.profile.key);\n const db = Obj.getDatabase(agent);\n\n // Build a filter matching objects of any schema annotated as a feed.\n const feedFilter = useMemo(() => {\n if (!db) {\n return Filter.nothing();\n }\n\n const schemas = db.graph.registry.list().filter(Type.isType);\n const feedSchemas = schemas.filter((type) => {\n const annotation = FeedAnnotation.get(Type.getSchema(type));\n return Option.isSome(annotation) && annotation.value === true;\n });\n\n return feedSchemas.length === 0\n ? Filter.nothing()\n : Filter.or(...feedSchemas.map((schema: Type.AnyEntity) => Filter.type(schema)));\n }, [db]);\n\n const subscribedObjects = useQuery(db, feedFilter);\n\n // The subscription state lives on the compiled automation (routine triggers), not the agent:\n // a trigger's target foreign key holds the subscribed object's URI (`timer:` keys are schedules).\n const triggers = useQuery(\n db,\n Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),\n );\n const subscribedUris = useMemo(\n () =>\n new Set(\n triggers\n .map(\n (trigger) => Obj.getMeta(trigger).keys.find((key) => key.source === AGENT_TRIGGER_TARGET_EXTENSION_KEY)?.id,\n )\n .filter((id): id is string => id !== undefined && !id.startsWith('timer:')),\n ),\n [triggers],\n );\n\n // Toggle recompiles the full subscription set (see `sync-automation`'s per-category reconcile).\n const handleSubscriptionChange = useCallback(\n (object: Obj.Unknown, checked: boolean) => {\n const next = new Set(subscribedUris);\n const uri = Obj.getURI(object);\n if (checked) {\n next.add(uri);\n } else {\n next.delete(uri);\n }\n onSubscriptionsChanged?.([...next].map((subscription) => Ref.fromURI(URI.make(subscription))));\n },\n [subscribedUris, onSubscriptionsChanged],\n );\n\n if (subscribedObjects.length === 0) {\n return null;\n }\n\n return (\n <Form.Section>\n <Input.Root>\n <Input.Label classNames='mt-form-gap'>{t('subscriptions.label')}</Input.Label>\n </Input.Root>\n\n {subscribedObjects.map((object) => (\n <Input.Root key={object.id}>\n <div className='flex items-center gap-2'>\n <Input.Checkbox\n checked={subscribedUris.has(Obj.getURI(object))}\n onCheckedChange={(checked) => {\n handleSubscriptionChange(object, checked === true);\n }}\n />\n <Input.Label>{Obj.getLabel(object) ?? object.id}</Input.Label>\n </div>\n </Input.Root>\n ))}\n </Form.Section>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useCallback, useEffect, useState } from 'react';\n\nimport { useOptionalAtomCapabilityState, useOptionalCapabilities } from '@dxos/app-framework/ui';\nimport { type Settings, TranscriptionCapabilities } from '@dxos/plugin-transcription';\nimport { DropdownMenu, Icon, IconButton, MicButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { type ChatEvent } from '../Chat/events';\n\ntype AudioInputDevice = {\n deviceId: string;\n label: string;\n};\n\nexport type ChatActionsProps = ThemedClassName<\n PropsWithChildren<{\n docId?: string;\n microphone?: boolean;\n processing?: boolean;\n debug?: boolean;\n onEvent?: (event: ChatEvent) => void;\n }>\n>;\n\nexport const ChatActions = ({\n classNames,\n children,\n docId,\n microphone,\n processing,\n debug,\n onEvent,\n}: ChatActionsProps) => {\n const { t } = useTranslation(meta.profile.key);\n // Voice input is optional: the transcription plugin contributes these capabilities. Tolerate its\n // absence so the chat prompt still renders (e.g. in stories that do not load the plugin).\n const transcriptionAvailable = useOptionalCapabilities(TranscriptionCapabilities.RecordingSession).length > 0;\n const [session, setSession] = useOptionalAtomCapabilityState(TranscriptionCapabilities.RecordingSession);\n const [settings, setSettings] = useOptionalAtomCapabilityState(TranscriptionCapabilities.Settings);\n\n const recording = !!session?.recording && session.id === docId;\n const recordMode: Settings.RecordMode = settings?.recordMode ?? 'toggle';\n const entityExtraction = settings?.entityExtraction !== false;\n const selectedDeviceId = settings?.audioDeviceId ?? '';\n\n const [devices, setDevices] = useState<AudioInputDevice[]>([]);\n useEffect(() => {\n // Only touch media APIs when the recording controls are actually shown.\n if (!microphone || !transcriptionAvailable || !navigator.mediaDevices?.enumerateDevices) {\n return;\n }\n let cancelled = false;\n const refresh = async () => {\n const all = await navigator.mediaDevices.enumerateDevices();\n if (cancelled) {\n return;\n }\n // Labels are blank until microphone permission is granted; fall back to an ordinal name.\n setDevices(\n all\n .filter((device) => device.kind === 'audioinput' && device.deviceId)\n .map((device, index) => ({\n deviceId: device.deviceId,\n label: device.label || `Microphone ${index + 1}`,\n })),\n );\n };\n void refresh();\n navigator.mediaDevices.addEventListener('devicechange', refresh);\n return () => {\n cancelled = true;\n navigator.mediaDevices.removeEventListener('devicechange', refresh);\n };\n }, [microphone, transcriptionAvailable]);\n\n const handleToggle = useCallback(() => {\n if (!docId) {\n return;\n }\n setSession((current) => (current?.recording && current.id === docId ? null : { id: docId, recording: true }));\n }, [setSession, docId]);\n\n const handlePressStart = useCallback(() => {\n if (!docId) {\n return;\n }\n setSession(() => ({ id: docId, recording: true }));\n }, [setSession, docId]);\n\n const handlePressEnd = useCallback(() => {\n setSession((current) => (current?.id === docId ? null : current));\n }, [setSession, docId]);\n\n const handleRecordModeChange = useCallback(\n (mode: Settings.RecordMode) => setSettings((current) => ({ ...current, recordMode: mode })),\n [setSettings],\n );\n\n const handleEntityExtractionChange = useCallback(\n (value: boolean) => setSettings((current) => ({ ...current, entityExtraction: value })),\n [setSettings],\n );\n\n const handleSelectDevice = useCallback(\n (deviceId: string) => setSettings((current) => ({ ...current, audioDeviceId: deviceId || undefined })),\n [setSettings],\n );\n\n const recordLabel = recording\n ? t('stop-recording.label')\n : recordMode === 'hold'\n ? t('hold-to-record.label')\n : t('start-recording.label');\n\n return (\n <div className={mx('flex items-center', classNames)}>\n {children}\n\n {microphone && docId && transcriptionAvailable && (\n <>\n <MicButton\n iconOnly\n variant='ghost'\n label={recordLabel}\n recording={recording}\n mode={recordMode}\n onToggle={handleToggle}\n onPressStart={handlePressStart}\n onPressEnd={handlePressEnd}\n data-testid='assistant.record'\n />\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon='ph--caret-down--regular'\n iconOnly\n label={t('recording-options.label')}\n variant='ghost'\n classNames='w-4'\n data-testid='assistant.record.options'\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n <DropdownMenu.GroupLabel>{t('record-mode.label')}</DropdownMenu.GroupLabel>\n <SettingsSelectableItem\n label={t('record-mode.toggle.label')}\n selected={recordMode === 'toggle'}\n onSelect={() => handleRecordModeChange('toggle')}\n />\n <SettingsSelectableItem\n label={t('record-mode.hold.label')}\n selected={recordMode === 'hold'}\n onSelect={() => handleRecordModeChange('hold')}\n />\n\n <DropdownMenu.Separator />\n\n <DropdownMenu.GroupLabel>{t('audio-device.label')}</DropdownMenu.GroupLabel>\n <SettingsSelectableItem\n label={t('audio-device.default.label')}\n selected={selectedDeviceId === ''}\n onSelect={() => handleSelectDevice('')}\n />\n {devices.map((device) => (\n <SettingsSelectableItem\n key={device.deviceId}\n label={device.label}\n selected={selectedDeviceId === device.deviceId}\n onSelect={() => handleSelectDevice(device.deviceId)}\n />\n ))}\n\n <DropdownMenu.Separator />\n <DropdownMenu.CheckboxItem\n checked={entityExtraction}\n onCheckedChange={handleEntityExtractionChange}\n classNames='gap-2'\n data-testid='assistant.entity-extraction'\n >\n <span className='grow truncate'>{t('settings.entity-extraction.label')}</span>\n <DropdownMenu.ItemIndicator asChild>\n <Icon icon='ph--check--regular' size={4} />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.CheckboxItem>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n )}\n\n {debug && (\n <IconButton\n variant='ghost'\n icon='ph--wrench--regular'\n iconOnly\n label={t('debug.button')}\n onClick={() => onEvent?.({ type: 'toggle-debug' })}\n />\n )}\n\n <IconButton\n disabled={!processing} // TODO(dmaretskyi): Set processing state correctly on rehydrated agents.\n variant='ghost'\n classNames={processing && 'text-error-text'}\n icon={processing ? 'ph--square--duotone' : 'ph--square--regular'}\n iconOnly\n label={t('cancel-processing.button')}\n onClick={() => {\n onEvent?.({ type: 'cancel' });\n }}\n />\n </div>\n );\n};\n\ntype SettingsSelectableItemProps = {\n label: string;\n selected: boolean;\n onSelect: () => void;\n};\n\n// The design system's `DropdownMenu.RadioItem` renders a plain item (no radio semantics), so\n// single-select is modelled with a plain item and an explicit trailing check. `onSelect` (not\n// `onClick`) so keyboard activation works.\nconst SettingsSelectableItem = ({ label, selected, onSelect }: SettingsSelectableItemProps) => (\n <DropdownMenu.Item classNames='gap-2' role='menuitemradio' aria-checked={selected} onSelect={onSelect}>\n <span className='grow truncate'>{label}</span>\n {selected && <Icon icon='ph--check--regular' size={4} />}\n </DropdownMenu.Item>\n);\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback } from 'react';\n\nimport { Message, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nimport { type AiChatProcessor } from '../../processor';\n\nexport type ChatMcpErrorsProps = ThemedClassName<{\n processor: AiChatProcessor;\n}>;\n\n/**\n * Inline banner that lists MCP servers that failed to connect during the most recent request.\n * The chat itself keeps working without these servers — this just lets the user see what was dropped.\n */\nexport const ChatMcpErrors = ({ classNames, processor }: ChatMcpErrorsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const errors = useAtomValue(processor.mcpErrors);\n\n const handleDismiss = useCallback(() => {\n processor.dismissMcpErrors();\n }, [processor]);\n\n if (errors.length === 0) {\n return null;\n }\n\n return (\n <Message.Root classNames={['m-1', classNames]} valence='warning'>\n <Message.Title onClose={handleDismiss}>{t('mcp-server-error.label')}</Message.Title>\n <Message.Body asChild>\n <ul className='flex flex-col gap-0.5 text-sm'>\n {errors.map((error) => (\n <li key={`${error.url}::${error.protocol}`} className='truncate'>\n <span className='font-mono'>{error.url}</span>\n {' — '}\n <span>{error.message}</span>\n </li>\n ))}\n </ul>\n </Message.Body>\n </Message.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type JSX, useCallback, useMemo, useState } from 'react';\n\nimport { type AiContext } from '@dxos/assistant';\nimport { type Chat as ChatModule, McpServer } from '@dxos/assistant-toolkit';\nimport { type Database, Filter, Obj, type Registry, Type, URI } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { IconButton, Input, Popover, Select, useTranslation } from '@dxos/react-ui';\nimport { Listbox } from '@dxos/react-ui-list';\nimport { SearchList, useSearchListResults } from '@dxos/react-ui-search';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { getStyles, mx } from '@dxos/ui-theme';\n\nimport { useActiveSkills, useContextObjects, useFilteredTypes, useSkillHandlers, useSkills } from '#hooks';\nimport { meta } from '#meta';\nimport { Assistant, type ChatPresetProps } from '#types';\n\nconst styles = {\n panel: 'w-[calc(100dvw-.5rem)] sm:w-max max-w-document-width',\n toolbar: 'p-0! gap-0! border-t border-separator',\n};\n\nexport type ChatOptionsProps = ChatPresetProps & {\n chat?: ChatModule.Chat;\n db: Database.Database;\n context: AiContext.Binder;\n registry?: Registry.Registry;\n};\n\n/**\n * Manages the runtime context for the chat.\n */\nexport const ChatOptions = ({ chat, db, context, registry, presets, preset, onPresetChange }: ChatOptionsProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <div className='flex'>\n <Popover.Root>\n <Popover.Trigger asChild>\n <IconButton variant='ghost' icon='ph--plus--regular' iconOnly label={t('context-objects.button')} />\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content side='top' classNames={styles.panel}>\n <Popover.Viewport>\n <ObjectsPanel db={db} context={context} />\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n\n <Popover.Root>\n <Popover.Trigger asChild>\n <IconButton\n variant='ghost'\n icon='ph--sliders-horizontal--regular'\n iconOnly\n label={t('context-settings.button')}\n />\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content side='top' classNames={styles.panel}>\n <Popover.Viewport>\n <Tabs.Root asChild orientation='horizontal' defaultValue='view' defaultActivePart='list' tabIndex={-1}>\n <Tabs.Viewport classNames={mx('grid grid-rows-[1fr_40px] w-full')}>\n <Tabs.Panel tabIndex={-1} classNames='dx-focus-ring-inset overflow-hidden' value='view'>\n <ViewPanel chat={chat} />\n </Tabs.Panel>\n <Tabs.Panel tabIndex={-1} classNames='dx-focus-ring-inset overflow-hidden' value='skills'>\n <SkillsPanel registry={registry} db={db} context={context} />\n </Tabs.Panel>\n <Tabs.Panel tabIndex={-1} classNames='dx-focus-ring-inset overflow-hidden' value='mcp-servers'>\n <McpServersPanel db={db} />\n </Tabs.Panel>\n <Tabs.Panel tabIndex={-1} classNames='dx-focus-ring-inset overflow-hidden' value='model'>\n <ModelsPanel presets={presets} preset={preset} onPresetChange={onPresetChange} />\n </Tabs.Panel>\n <Tabs.Tablist classNames={[styles.toolbar]}>\n <Tabs.IconButton value='view' icon='ph--eye--regular' label={t('chat-view.title')} />\n <Tabs.IconButton value='skills' icon='ph--blueprint--regular' label={t('options.skills.title')} />\n <Tabs.IconButton\n value='mcp-servers'\n icon='ph--plugs-connected--regular'\n label={t('options.mcp.title')}\n />\n <Tabs.IconButton value='model' icon='ph--cpu--regular' label={t('options.chat-model.title')} />\n </Tabs.Tablist>\n </Tabs.Viewport>\n </Tabs.Root>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </div>\n );\n};\n\nconst SkillsPanel = ({ registry, db, context }: Pick<ChatOptionsProps, 'registry' | 'db' | 'context'>) => {\n const { t } = useTranslation(meta.profile.key);\n\n const skills = useSkills({ registry, db });\n const activeSkills = useActiveSkills({ context });\n const { onUpdateSkill } = useSkillHandlers({ db, context, registry });\n const { results, handleSearch } = useSearchListResults({\n items: skills,\n extract: (skill) => skill.name,\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <SearchList.Content classNames='flex flex-col'>\n <SearchList.Viewport>\n {results.map((skill) => {\n const skillKey = Obj.getMeta(skill).key ?? skill.id;\n const isActive = activeSkills.has(skillKey);\n return (\n <SearchList.Item\n classNames='flex items-center overflow-hidden'\n key={skillKey}\n value={skillKey}\n label={skill.name}\n checked={isActive}\n onSelect={() => onUpdateSkill?.(skillKey, !isActive)}\n />\n );\n })}\n </SearchList.Viewport>\n <SearchList.Input placeholder={t('search.placeholder')} classNames='border-t border-separator' autoFocus />\n </SearchList.Content>\n </SearchList.Root>\n );\n};\n\nconst ViewPanel = ({ chat }: Pick<ChatOptionsProps, 'chat'>) => {\n const { t } = useTranslation(meta.profile.key);\n const [view, setView] = useObject(chat, 'viewType');\n const value = (view as Assistant.ChatView | undefined) ?? 'normal';\n\n return (\n <Listbox.Root value={value} onValueChange={setView} autoFocus>\n <Listbox.Content aria-label={t('chat-view.title')}>\n {Assistant.ChatViews.map((view) => (\n <Listbox.Item key={view} id={view} classNames='px-2 py-1 dx-focus-ring rounded-xs'>\n <Listbox.ItemLabel>{t(`chat-view.${view}.label`, { defaultValue: view })}</Listbox.ItemLabel>\n <Listbox.Indicator />\n </Listbox.Item>\n ))}\n </Listbox.Content>\n </Listbox.Root>\n );\n};\n\nconst ModelsPanel = ({\n presets,\n preset,\n onPresetChange,\n}: Pick<ChatOptionsProps, 'presets' | 'preset' | 'onPresetChange'>) => {\n const { t } = useTranslation(meta.profile.key);\n return (\n <Listbox.Root value={preset} onValueChange={onPresetChange} autoFocus>\n <Listbox.Content aria-label={t('options.chat-model.title')}>\n {presets?.map(({ id, label }) => (\n <Listbox.Item key={id} id={id} classNames='px-2 py-1 dx-focus-ring rounded-xs'>\n <Listbox.ItemLabel>{label}</Listbox.ItemLabel>\n <Listbox.Indicator />\n </Listbox.Item>\n ))}\n </Listbox.Content>\n </Listbox.Root>\n );\n};\n\ntype McpServersPanelProps = {\n db: Database.Database;\n};\n\nconst McpServersPanel = ({ db }: McpServersPanelProps) => {\n const { t } = useTranslation(meta.profile.key);\n const servers = useQuery(db, Filter.type(McpServer.McpServer));\n const [adding, setAdding] = useState(false);\n\n const handleAdd = useCallback(\n (name: string, url: string, protocol: 'sse' | 'http', apiKey?: string) => {\n db.add(Obj.make(McpServer.McpServer, { name, url, protocol, apiKey, enabled: true }));\n setAdding(false);\n },\n [db],\n );\n\n const handleRemove = useCallback(\n (server: McpServer.McpServer) => {\n db.remove(server);\n },\n [db],\n );\n\n return (\n <div className='p-form-chrome'>\n {servers.map((server) => (\n <McpServerRow key={server.id} server={server} onRemove={handleRemove} />\n ))}\n {adding ? (\n <McpServerForm onSubmit={handleAdd} onCancel={() => setAdding(false)} />\n ) : (\n <div>\n <IconButton\n variant='ghost'\n icon='ph--plus--regular'\n label={t('mcp-server-add.label')}\n onClick={() => setAdding(true)}\n />\n </div>\n )}\n </div>\n );\n};\n\ntype McpServerRowProps = {\n server: McpServer.McpServer;\n onRemove: (server: McpServer.McpServer) => void;\n};\n\n/**\n * `useQuery` returns live objects but only re-renders on result-identity changes,\n * so we must subscribe to the per-server `enabled` field via `useObject` to keep the\n * switch in sync with mutations made through the returned setter.\n */\nconst McpServerRow = ({ server, onRemove }: McpServerRowProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [enabled, setEnabled] = useObject(server, 'enabled');\n\n return (\n <div className='flex items-center gap-2 px-form-chrome'>\n <Input.Root>\n <Input.Label srOnly>{server.name}</Input.Label>\n <Input.Switch checked={enabled !== false} onCheckedChange={(checked) => setEnabled(!!checked)} />\n </Input.Root>\n <span className='flex-1 truncate text-sm'>{server.name}</span>\n <span className='truncate text-xs text-description'>{server.url}</span>\n <IconButton\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('mcp-server-remove.label')}\n onClick={() => onRemove(server)}\n />\n </div>\n );\n};\n\ntype McpServerFormProps = {\n onSubmit: (name: string, url: string, protocol: 'sse' | 'http', apiKey?: string) => void;\n onCancel: () => void;\n};\n\nconst McpServerForm = ({ onSubmit, onCancel }: McpServerFormProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [name, setName] = useState('');\n const [url, setUrl] = useState('');\n const [protocol, setProtocol] = useState<'sse' | 'http'>('sse');\n const [apiKey, setApiKey] = useState('');\n\n const canSubmit = name.trim().length > 0 && url.trim().length > 0;\n const handleSubmit = useCallback(() => {\n if (canSubmit) {\n onSubmit(name.trim(), url.trim(), protocol, apiKey.trim() || undefined);\n }\n }, [canSubmit, name, url, protocol, apiKey, onSubmit]);\n\n return (\n <div className='space-y-2 px-form-chrome'>\n <Input.Root>\n <Input.Label srOnly>{t('mcp-server-name.label')}</Input.Label>\n <Input.TextInput\n placeholder={t('mcp-server-name.placeholder')}\n value={name}\n onChange={(event) => setName(event.target.value)}\n autoFocus\n />\n </Input.Root>\n <Input.Root>\n <Input.Label srOnly>{t('mcp-server-url.label')}</Input.Label>\n <Input.TextInput\n placeholder={t('mcp-server-url.placeholder')}\n value={url}\n onChange={(event) => setUrl(event.target.value)}\n />\n </Input.Root>\n <Select.Root value={protocol} onValueChange={(value) => setProtocol(value as 'sse' | 'http')}>\n <Select.TriggerButton placeholder={t('mcp-server-protocol.label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value='sse'>SSE</Select.Option>\n <Select.Option value='http'>HTTP</Select.Option>\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n <Input.Root>\n <Input.Label srOnly>{t('mcp-server-api-key.label')}</Input.Label>\n <Input.TextInput\n type='password'\n placeholder={t('mcp-server-api-key.placeholder')}\n value={apiKey}\n onChange={(event) => setApiKey(event.target.value)}\n />\n </Input.Root>\n <div className='flex gap-2'>\n <IconButton\n variant='ghost'\n icon='ph--check--regular'\n iconOnly\n label={t('save.button')}\n onClick={handleSubmit}\n disabled={!canSubmit}\n />\n <IconButton variant='ghost' icon='ph--x--regular' iconOnly label={t('cancel.button')} onClick={onCancel} />\n </div>\n </div>\n );\n};\n\nconst ANY = '__any__' as const;\n\n/** @private */\nexport const ObjectsPanel = ({ db, context }: Pick<ChatOptionsProps, 'db' | 'context'>): JSX.Element => {\n const { t } = useTranslation(meta.profile.key);\n\n // Item types sorted by label.\n const types = useFilteredTypes(db);\n const typeOptions = useMemo(() => {\n const options = types.map((type) => {\n const typename = Type.getTypename(type);\n return {\n uri: Type.getURI(type),\n label: t('typename.label', { ns: typename, defaultValue: typename }),\n };\n });\n\n options.sort((a, b) => a.label.localeCompare(b.label));\n return options;\n }, [types, t]);\n\n // Current type URI and filter.\n const [selectedUri, setSelectedUri] = useState<URI.URI | typeof ANY>(ANY);\n const anyFilter = useMemo(() => Filter.or(...typeOptions.map(({ uri }) => Filter.type(uri))), [typeOptions]);\n\n // Context objects.\n const objects = useQuery(db, selectedUri === ANY ? anyFilter : Filter.type(selectedUri));\n const { objects: contextObjects, onUpdateObject } = useContextObjects({ db, context });\n const { results, handleSearch } = useSearchListResults({\n items: objects,\n extract: (object) => Obj.getLabel(object) ?? Obj.getTypename(object) ?? object.id,\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <SearchList.Content classNames='p-form-chrome [&:has([cmdk-list-sizer]:empty)]:py-0'>\n <SearchList.Viewport>\n {results.length ? (\n results.map((object) => {\n const isActive = contextObjects.findIndex((obj) => obj.id === object.id) !== -1;\n const { icon, hue } = Obj.getIcon(object) ?? { icon: 'ph--cube--regular', hue: undefined };\n const styles = hue ? getStyles(hue) : undefined;\n return (\n <SearchList.Item\n classNames='flex items-center overflow-hidden'\n key={object.id}\n value={object.id}\n icon={icon}\n iconClassNames={styles?.text}\n label={Obj.getLabel(object) ?? Obj.getTypename(object) ?? object.id}\n checked={isActive}\n onSelect={() => onUpdateObject?.(Obj.getURI(object), !isActive)}\n />\n );\n })\n ) : (\n <SearchList.Item value='__empty__' label={t('no-results.message')} />\n )}\n </SearchList.Viewport>\n </SearchList.Content>\n\n <div className={mx('flex flex-col', styles.toolbar)}>\n <Select.Root\n value={selectedUri === ANY ? undefined : selectedUri}\n onValueChange={(val) => setSelectedUri(val as URI.URI | typeof ANY)}\n >\n <Select.TriggerButton placeholder={t('type-filter.placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.ScrollUpButton />\n <Select.Viewport>\n <Select.Option value={ANY}>{t('any-type-filter.label')}</Select.Option>\n {typeOptions.map(({ uri, label }) => (\n <Select.Option key={uri} value={uri}>\n {label}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.ScrollDownButton />\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n <SearchList.Input placeholder={t('search.placeholder')} autoFocus />\n </div>\n </SearchList.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AiContext } from '@dxos/assistant';\nimport { type Database, Obj } from '@dxos/echo';\nimport { Icon, IconButton, type Label, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { getStyles, mx } from '@dxos/ui-theme';\n\nimport { useContextObjects } from '#hooks';\nimport { meta } from '#meta';\n\nexport type ChatReferencesProps = ThemedClassName<{\n context: AiContext.Binder;\n db: Database.Database;\n}>;\n\nexport const ChatReferences = ({ classNames, context, db }: ChatReferencesProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { objects, onUpdateObject } = useContextObjects({ db, context });\n\n return (\n <ul className={mx('flex', classNames)}>\n {objects.map((obj) => {\n const uri = Obj.getURI(obj);\n const typename = Obj.getTypename(obj);\n const label: Label = Obj.getLabel(obj) ?? (typename ? ['object-name.placeholder', { ns: typename }] : obj.id);\n const { icon, hue } = Obj.getIcon(obj) ?? { icon: DEFAULT_OBJECT_ICON, hue: undefined };\n const styles = hue ? getStyles(hue) : undefined;\n return (\n <li key={uri.toString()} className='dx-tag py-0 flex items-center gap-1' data-hue='neutral'>\n <Icon icon={icon} size={4} />\n {toLocalizedString(label, t)}\n <IconButton\n icon='ph--x--bold'\n iconOnly\n variant='ghost'\n label={t('remove-object.label')}\n classNames='p-0 hover:bg-transparent'\n size={3}\n onClick={() => onUpdateObject?.(uri, false)}\n />\n </li>\n );\n })}\n </ul>\n );\n};\n\n// TODO(dmaretskyi): Extract those somewhere else.\nconst DEFAULT_OBJECT_ICON = 'ph--cube--regular';\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { type RefObject, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { useOptionalAtomCapabilityState } from '@dxos/app-framework/ui';\nimport { TranscriptionCapabilities } from '@dxos/plugin-transcription/types';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type ChatEditorController } from '@dxos/react-ui-chat';\nimport { useAudioTrack, useTranscriber } from '@dxos/react-ui-transcription';\nimport { type ContentBlock } from '@dxos/types';\nimport { PendingTextStreamer, cancelPendingText, editorPendingTextSink, pendingTextState } from '@dxos/ui-editor';\n\nimport { meta } from '#meta';\n\n// Recorder chunk interval; the transcriber's chunk threshold is derived from the buffering setting.\nconst RECORDER_INTERVAL_MS = 200;\n\n/**\n * Drives word-by-word streaming transcription into the chat editor via PendingTextStreamer.\n * Reads the active RecordingSession and Settings capabilities; activates when the session id\n * matches the given docId and the session is recording.\n */\nexport const useChatVoiceInput = (docId: string, editorRef: RefObject<ChatEditorController | null>): void => {\n const { t } = useTranslation(meta.profile.key);\n // Voice input is optional: tolerate the transcription plugin being absent (no session ⇒ inactive).\n const [session] = useOptionalAtomCapabilityState(TranscriptionCapabilities.RecordingSession);\n const [settings] = useOptionalAtomCapabilityState(TranscriptionCapabilities.Settings);\n\n const active = !!session?.recording && session.id === docId;\n\n const streamerRef = useRef<PendingTextStreamer | null>(null);\n\n // Create/destroy the streamer when active transitions.\n useEffect(() => {\n if (!active) {\n return;\n }\n const view = editorRef.current?.view;\n if (!view) {\n return;\n }\n\n const streamer = new PendingTextStreamer(editorPendingTextSink(view), {\n mode: settings?.streamMode ?? 'word',\n wordIntervalMs: settings?.wordIntervalMs ?? 80,\n });\n streamer.start({ anchor: view.state.selection.main.head, placeholder: t('recording.placeholder') });\n streamerRef.current = streamer;\n\n return () => {\n streamer.dispose();\n streamerRef.current = null;\n // Drop the placeholder if nothing was transcribed; otherwise leave it for review.\n const currentView = editorRef.current?.view;\n if (currentView) {\n const pending = currentView.state.field(pendingTextState, false);\n if (pending && pending.final.length === 0) {\n currentView.dispatch({ effects: cancelPendingText.of() });\n }\n }\n };\n }, [active, settings?.streamMode, settings?.wordIntervalMs]);\n\n const handleSegments = useCallback(async (segments: ContentBlock.Transcript[]) => {\n const text = segments\n .map((segment) => segment.text)\n .join(' ')\n .trim();\n if (text.length > 0) {\n streamerRef.current?.push(text);\n }\n }, []);\n\n // Derive the transcriber's chunk threshold from the configured initial buffering time.\n const transcriberConfig = useMemo(\n () => ({\n transcribeAfterChunksAmount: Math.max(\n 1,\n Math.round((settings?.transcribeAfterMs ?? 4000) / RECORDER_INTERVAL_MS),\n ),\n }),\n [settings?.transcribeAfterMs],\n );\n\n // Stable identity: a fresh object would change useTranscriber's memo deps every render.\n const recorderConfig = useMemo(() => ({ interval: RECORDER_INTERVAL_MS }), []);\n\n const audioConstraints = useMemo<MediaTrackConstraints | undefined>(\n () => (settings?.audioDeviceId ? { deviceId: { exact: settings.audioDeviceId } } : undefined),\n [settings?.audioDeviceId],\n );\n\n const track = useAudioTrack(active, audioConstraints);\n\n useTranscriber({\n audioStreamTrack: track,\n transcriberConfig,\n recorderConfig,\n onSegments: handleSegments,\n });\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport * as Option from 'effect/Option';\nimport React, { useCallback, useEffect, useId, useMemo, useRef } from 'react';\n\nimport { type Chat } from '@dxos/assistant-toolkit';\nimport { type Event } from '@dxos/async';\nimport { Project } from '@dxos/compute';\nimport { type Database, Obj } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { Input, type ThemedClassName, useDynamicRef, useTranslation } from '@dxos/react-ui';\nimport {\n ChatEditor,\n type ChatEditorController,\n type ChatEditorProps,\n ChatStatusIndicator,\n commands,\n} from '@dxos/react-ui-chat';\nimport { pendingText } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\nimport { type Merge } from '@dxos/util';\n\nimport { useChatKeymapExtensions } from '#hooks';\nimport { meta } from '#meta';\nimport { type ChatPresetProps } from '#types';\n\nimport { type AiChatProcessor } from '../../processor';\nimport { type ChatEvent } from '../Chat';\nimport { ChatActions, type ChatActionsProps } from './ChatActions';\nimport { ChatMcpErrors } from './ChatMcpErrors';\nimport { ChatOptions } from './ChatOptions';\nimport { ChatReferences } from './ChatReferences';\nimport { useChatVoiceInput } from './useChatVoiceInput';\n\nexport type ChatPromptProps = Merge<\n ThemedClassName<{\n outline?: boolean;\n settings?: boolean;\n expandable?: boolean;\n db?: Database.Database;\n chat?: Chat.Chat;\n processor: AiChatProcessor;\n event: Event<ChatEvent>;\n /** Read-only indicator of whether the configured provider is the remote (online) service. */\n online?: boolean;\n placeholder?: ChatEditorProps['placeholder'];\n /** Object the chat is attached to; its project instructions (if any) supply sentinel-command completion. */\n companionTo?: Obj.Unknown;\n }>,\n ChatPresetProps\n>;\n\nexport const ChatPrompt = ({\n classNames,\n outline,\n db,\n chat,\n processor,\n event,\n online,\n placeholder,\n onPresetChange,\n settings = true,\n presets,\n preset,\n companionTo,\n}: ChatPromptProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const error = useAtomValue(processor.error).pipe(Option.getOrUndefined);\n const streaming = useAtomValue(processor.streaming);\n const active = useAtomValue(processor.active);\n const activeRef = useDynamicRef(active);\n\n const editorRef = useRef<ChatEditorController>(null);\n useEffect(() => {\n return event.on((ev) => {\n if (ev.type === 'update-prompt' && !editorRef.current?.getText()?.length) {\n editorRef.current?.setText(ev.text);\n editorRef.current?.focus();\n }\n });\n }, [event]);\n\n const fallbackDocId = useId();\n const docId = chat?.id ?? fallbackDocId;\n useChatVoiceInput(docId, editorRef);\n\n const keymapExtensions = useChatKeymapExtensions({ event });\n\n // Sentinel-command completion is sourced from the bound project's instructions, if any.\n const [companion] = useObject(companionTo);\n const [instructions] = useObject(Obj.instanceOf(Project.Project, companion) ? companion.instructions : undefined);\n const commandsRef = useDynamicRef(instructions?.commands ?? []);\n const commandsExtension = useMemo(\n () =>\n commands({\n getCommands: () => commandsRef.current.map(({ sentinel, description }) => ({ sentinel, description })),\n }),\n [commandsRef],\n );\n\n const extensions = useMemo(\n () => [keymapExtensions, pendingText(), commandsExtension],\n [keymapExtensions, commandsExtension],\n );\n\n const handleSubmit = useCallback<NonNullable<ChatEditorProps['onSubmit']>>(\n (text) => {\n if (!activeRef.current) {\n event.emit({ type: 'submit', text });\n return true;\n }\n },\n [event],\n );\n\n const handleEvent = useCallback<NonNullable<ChatActionsProps['onEvent']>>(\n (ev) => {\n event.emit(ev);\n },\n [event],\n );\n\n return (\n <div\n role='group'\n className={mx(\n 'flex flex-col w-full dx-density-md',\n outline &&\n 'dx-group-surface rounded-sm border border-subdued-separator transition transition-border [&:has(.cm-content:focus)]:border-separator',\n classNames,\n )}\n >\n <ChatMcpErrors processor={processor} />\n\n <div className='flex p-2 gap-2'>\n <ChatStatusIndicator classNames='p-1' preset={preset} error={error} processing={streaming} />\n <ChatEditor\n ref={editorRef}\n autoFocus\n markdown\n lineWrapping\n classNames='col-span-2 pt-0.5'\n placeholder={placeholder ?? t('prompt.placeholder')}\n extensions={extensions}\n onSubmit={handleSubmit}\n />\n </div>\n\n {db && settings && (\n <div className='flex items-center overflow-hidden p-1.5'>\n <ChatOptions\n chat={chat}\n db={db}\n registry={processor.registry}\n context={processor.context}\n preset={preset}\n presets={presets}\n onPresetChange={onPresetChange}\n />\n\n <div className='flex h-6 grow overflow-x-auto scrollbar-none'>\n <ChatReferences db={db} context={processor.context} />\n </div>\n\n <ChatActions\n classNames='col-span-2'\n microphone={true}\n docId={docId}\n processing={streaming}\n onEvent={handleEvent}\n >\n {online !== undefined && (\n <Input.Root>\n <Input.Label srOnly>{t('online-switch.label')}</Input.Label>\n {/* Read-only: the provider is configured in Assistant settings, not toggled here. */}\n <Input.Switch classNames='mx-1' checked={online} disabled />\n </Input.Root>\n )}\n </ChatActions>\n </div>\n )}\n </div>\n );\n};\n\nChatPrompt.displayName = 'Chat.Prompt';\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { ChatStatus as NaturalChatStatus, formatElapsed } from '@dxos/react-ui-chat';\nimport { Matrix } from '@dxos/react-ui-components';\nimport { type ContentBlock } from '@dxos/types';\nimport { Unit } from '@dxos/util';\n\nimport { type ChatRequestTiming, useChatContext } from '../Chat/context';\n\nconst CHAT_STREAM_STATUS_NAME = 'Chat.StreamStatus';\nconst TICK_MS = 1_000;\n\nexport type ChatStreamStatusProps = ThemedClassName<{\n icon?: boolean;\n}>;\n\n/**\n * Live status pill rendered at the bottom of the chat thread.\n *\n * The block-widget host re-mounts this component each time wire's drip queue toggles\n * (`wireDrainingEffect`) — so all visible state is derived from chat-context values that\n * survive the unmount: the latest `stats` block on the chat context's `messages` for token counts,\n * and `requestTiming` (start/end wall-clock timestamps) for the elapsed value.\n *\n * Shows:\n * - elapsed seconds since the most recent request started (frozen at end-of-request)\n * - last completed turn's output token count (from the most recent `stats` content block)\n * - cumulative session total tokens across all `stats` content blocks\n */\nexport const ChatStatus = ({ classNames, icon }: ChatStreamStatusProps) => {\n // Read `messages` from the chat context (combines `useQuery(queue)` + the processor's\n // pending atom) rather than `processor.messages` directly — the latter only contains\n // blocks streamed via the ephemeral `PartialBlock` channel, while finalized blocks\n // (including the per-turn `stats` block we read for token counts) are submitted to the\n // feed via `_submitMessage` and only show up through `useQuery`.\n const { messages, requestTiming } = useChatContext(CHAT_STREAM_STATUS_NAME);\n\n const { lastOutputTokens, sessionTotalTokens } = useMemo(() => {\n let last: number | undefined;\n let total = 0;\n for (const message of messages) {\n for (const block of message.blocks) {\n if (isStats(block) && block.usage) {\n last = block.usage.outputTokens;\n total += block.usage.totalTokens ?? 0;\n }\n }\n }\n return { lastOutputTokens: last, sessionTotalTokens: total };\n }, [messages]);\n\n const isRunning = requestTiming != null && requestTiming.endedAt == null;\n const show = requestTiming || lastOutputTokens || sessionTotalTokens > 0;\n if (!show) {\n return null;\n }\n\n return (\n <NaturalChatStatus.Root defaultRunning={false} classNames={['py-2 gap-2 text-sm', classNames]}>\n {icon && (\n <NaturalChatStatus.Icon>\n <Matrix\n classNames='w-5 h-5'\n dotClassNames='bg-primary-500'\n dim={4}\n dotSize={3}\n count={10}\n interval={500}\n active={isRunning}\n />\n </NaturalChatStatus.Icon>\n )}\n {show && (\n <div className='flex items-center'>\n {requestTiming && (\n <NaturalChatStatus.Text>\n <Elapsed timing={requestTiming} />\n </NaturalChatStatus.Text>\n )}\n {lastOutputTokens != null && (\n <>\n {requestTiming && <NaturalChatStatus.Separator />}\n <NaturalChatStatus.Text>↓ {Unit.Thousand(lastOutputTokens).toString()}</NaturalChatStatus.Text>\n </>\n )}\n {sessionTotalTokens > 0 && (\n <>\n {(requestTiming || lastOutputTokens != null) && <NaturalChatStatus.Separator />}\n <NaturalChatStatus.Text>Σ {Unit.Thousand(sessionTotalTokens).toString()}</NaturalChatStatus.Text>\n </>\n )}\n </div>\n )}\n </NaturalChatStatus.Root>\n );\n};\n\n/**\n * Wall-clock-derived elapsed display. Tick interval forces a re-render every second while\n * the request is active so the displayed value advances; once `endedAt` is set, the value\n * is frozen and the interval is no longer scheduled.\n */\nconst Elapsed = ({ timing }: { timing: ChatRequestTiming }) => {\n const isRunning = timing.endedAt == null;\n const [now, setNow] = useState(Date.now());\n useEffect(() => {\n if (!isRunning) {\n return;\n }\n\n const id = setInterval(() => setNow(Date.now()), TICK_MS);\n return () => clearInterval(id);\n }, [isRunning]);\n\n return <>{formatElapsed((timing.endedAt ?? now) - timing.startedAt)}</>;\n};\n\nconst isStats = (block: ContentBlock.Any): block is ContentBlock.Stats => block._tag === 'stats';\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ContentBlock, type Message } from '@dxos/types';\nimport { type StateDispatch } from '@dxos/ui-editor';\n\n/**\n * Minimal surface used to push tool call / result blocks into {@link MarkdownStreamController} widget state.\n */\nexport type ToolWidgetStateSink = {\n updateWidget<T>(id: string, value: StateDispatch<T>): void;\n};\n\n/**\n * Mirrors tool-related branches of {@link blockToMarkdown} so widget props stay in sync with message blocks.\n */\nexport const applyToolBlockToWidgetState = (context: ToolWidgetStateSink, block: ContentBlock.Any): void => {\n switch (block._tag) {\n case 'toolCall': {\n context.updateWidget<{ blocks: ContentBlock.Any[] }>(block.toolCallId, {\n blocks: [block],\n });\n break;\n }\n\n case 'toolResult': {\n context.updateWidget<{ blocks: ContentBlock.Any[] }>(block.toolCallId, ({ blocks = [] } = { blocks: [] }) => ({\n blocks: [...blocks, block],\n }));\n break;\n }\n }\n};\n\n/**\n * Re-applies tool widget state after a full document replace (e.g. {@link MarkdownStreamController.setContent}),\n * which clears accumulated widget props via `xmlTagResetEffect`.\n */\nexport const rehydrateToolWidgetsFromMessages = (context: ToolWidgetStateSink, messages: Message.Message[]): void => {\n for (const message of messages) {\n for (const block of message.blocks) {\n applyToolBlockToWidgetState(context, block);\n }\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { type URI } from '@dxos/keys';\nimport { type MarkdownStreamController } from '@dxos/react-ui-markdown';\nimport { type ContentBlock, type Message } from '@dxos/types';\nimport { type StateDispatch, type XmlWidgetStateManager } from '@dxos/ui-editor';\n\nimport { rehydrateToolWidgetsFromMessages } from './tool-widget-state';\n\n/**\n * Update document.\n */\nexport type TextModel = Pick<MarkdownStreamController, 'length' | 'setContent' | 'append' | 'updateWidget'>;\n\n/**\n * Document offset range occupied by a message's rendered blocks. Positions are in the same\n * space as the CodeMirror document (i.e. what {@link MarkdownStreamController.scrollTo} and\n * {@link MarkdownStreamController.getVisibleRange} operate on).\n */\nexport type MessageSpan = {\n id: string;\n from: number;\n to: number;\n};\n\n/**\n * Renders a block to markdown.\n *\n * Contract: for any block whose lifetime spans multiple invocations (i.e. a streaming block\n * with `pending: true` whose content grows over time, transitioning to `pending: false`), the\n * sequence of returned strings must be monotonically extending — each subsequent value must be\n * a string-extension of the previous. The {@link MessageSyncer} relies on this invariant to\n * compute appendable deltas without diffing.\n */\nexport type BlockRenderer = (\n context: MessageThreadContext,\n message: Message.Message,\n block: ContentBlock.Any,\n) => string | undefined;\n\n/**\n * Callbacks a widget can invoke through {@link MessageThreadContext}.\n *\n * React widgets are portaled by `MarkdownStream` without its `onEvent`, so interactive widgets reach\n * the thread through the context they already receive in their props.\n */\nexport type MessageThreadHandlers = {\n /** Soft-fork the thread from the given message. */\n onRewind?: (messageId: string) => void;\n};\n\n/**\n * Thread context passed to renderer.\n * This enables the renderer to \"stream\" content into the widget state.\n */\nexport class MessageThreadContext implements Pick<MarkdownStreamController, 'updateWidget'> {\n constructor(\n private readonly _widgetState?: XmlWidgetStateManager,\n private readonly _handlers: MessageThreadHandlers = {},\n ) {}\n\n updateWidget<T>(id: string, value: StateDispatch<T>) {\n this._widgetState?.updateWidget(id, value);\n }\n\n // TODO(burdon): Resolve name from hypergraph.\n getObjectLabel(_id: URI.URI) {\n return 'Object';\n }\n\n rewind(messageId: string) {\n this._handlers.onRewind?.(messageId);\n }\n}\n\n/**\n * Syncs messages with the editor.\n *\n * Reflects the AI streaming contract:\n * - Messages and their blocks are appended in order.\n * - Only the last block in `messages` may be `pending`; all earlier blocks are finalized.\n * - The renderer's output for a streaming block grows monotonically (see {@link BlockRenderer}).\n * - The document is read-only outside this syncer.\n *\n * Under those rules the syncer needs only:\n * - `_completed`: the flat-block index past which everything has been fully appended.\n * - `_trailing`: chars of the in-flight block (at index `_completed`) already appended.\n * - `_threadId`: identity sentinel; if `messages[0]?.id` changes, the document is replaced.\n */\nexport class MessageSyncer {\n private _threadId?: string;\n\n /**\n * Ids of the messages rendered so far, in document order. `update` streams a suffix, so it needs to\n * know when the incoming list no longer extends what is on screen — a rewind drops turns, and an\n * append-only path would leave them rendered.\n */\n private _renderedIds: string[] = [];\n\n /** Cumulative block index (across all completed blocks in all messages). */\n private _completed = 0;\n\n /** Chars of the in-flight block (at index `_completed`) already appended. */\n private _trailing = 0;\n\n /** Document offset at the `_completed` boundary (length of all fully-appended blocks). */\n private _completedOffset = 0;\n\n /** Per-message document offset ranges, keyed by message id in document order. */\n private readonly _spans = new Map<string, { from: number; to: number }>();\n\n private readonly _context: MessageThreadContext;\n\n constructor(\n private readonly _document: TextModel,\n private readonly _renderer: BlockRenderer,\n handlers: MessageThreadHandlers = {},\n ) {\n this._context = new MessageThreadContext(this._document, handlers);\n }\n\n get context() {\n return this._context;\n }\n\n /**\n * Per-message document offset spans, in document order. Valid synchronously after\n * {@link reset} or {@link update} (the offsets are derived from the same rendered buffer\n * that is dispatched to the document).\n */\n getSpans(): MessageSpan[] {\n return Array.from(this._spans, ([id, { from, to }]) => ({ id, from, to }));\n }\n\n /**\n * Replace the document with the rendering of `messages`. Use on mount, on thread switch,\n * and from {@link update} when it detects an identity change in `messages[0]`.\n */\n reset(messages: Message.Message[] = []): void {\n this._threadId = messages[0]?.id;\n this._renderedIds = messages.map((message) => message.id);\n this._completed = 0;\n this._trailing = 0;\n this._completedOffset = 0;\n this._spans.clear();\n const buffer = this._walk(messages);\n // Match the pre-rewrite behaviour: rendering from a steady state (initial mount with\n // non-empty messages, or thread switch) lands the entire content via `setContent` — which\n // uses `wireBypass`, so the editor jumps straight to the final text and `update()` returns\n // `true` so the caller can scroll to the bottom. Live streaming partials that arrive\n // *after* this initial render flow through `update()`'s incremental path → `_document.append`\n // → wire's drip filter, preserving the char-by-char typewriter for incoming text.\n void this._document.setContent(buffer).then(() => {\n rehydrateToolWidgetsFromMessages(this._context, messages);\n });\n }\n\n /**\n * Whether `messages` still begins with everything already rendered, making this an append.\n *\n * A rewind removes turns from the middle or end of the thread, and the streaming path can only add\n * text — so anything other than an extension has to go through {@link reset}.\n */\n #extendsRendered(messages: Message.Message[]): boolean {\n if (messages.length < this._renderedIds.length) {\n return false;\n }\n return this._renderedIds.every((id, index) => messages[index]?.id === id);\n }\n\n /**\n * Stream the suffix of the rendered messages into the document.\n * Returns `true` if the document was replaced (initial mount or thread switch), `false`\n * if the call was a streaming append (or a no-op).\n */\n update(messages: Message.Message[]): boolean {\n if (messages[0]?.id !== this._threadId || !this.#extendsRendered(messages)) {\n this.reset(messages);\n return true;\n }\n this._renderedIds = messages.map((message) => message.id);\n const buffer = this._walk(messages);\n if (buffer.length > 0) {\n void this._document.append(buffer);\n }\n return false;\n }\n\n /**\n * Walk flat blocks starting at `_completed`, advancing the cursors and returning the chars\n * to append. Blocks before `_completed` are skipped — their renderer is never re-invoked,\n * which preserves single-shot side effects (e.g. tool widget state mutation).\n */\n _walk(messages: Message.Message[]): string {\n let buffer = '';\n let index = 0;\n // Absolute document offset at the `_completed` boundary; blocks before it were rendered on\n // earlier calls and their offsets are already baked into `_completedOffset` (and `_ranges`).\n let offset = this._completedOffset;\n outer: for (const message of messages) {\n for (const block of message.blocks) {\n if (index < this._completed) {\n index++;\n continue;\n }\n const rendered = this._renderer(this._context, message, block) ?? '';\n if (rendered.length > this._trailing) {\n buffer += rendered.slice(this._trailing);\n }\n // The document never shrinks (see the `_trailing` guard below), so span/offset accounting\n // must track the document, not a renderer output that regressed below what was appended.\n const renderedLength = Math.max(rendered.length, this._trailing);\n // The block occupies `[offset, offset + renderedLength)`; extend the message's range.\n this._saveRange(message.id, offset, offset + renderedLength);\n if (block.pending) {\n // Stay on this block; record how far we've appended so the next call can resume.\n // `Math.max`-style guard against a non-monotonic renderer output without shrinking the doc.\n if (rendered.length > this._trailing) {\n this._trailing = rendered.length;\n }\n break outer;\n }\n this._completed = index + 1;\n this._trailing = 0;\n offset += renderedLength;\n this._completedOffset = offset;\n index++;\n }\n }\n return buffer;\n }\n\n /** Record (or extend) the offset range of a message. `from` is preserved; `to` never regresses. */\n private _saveRange(id: string, from: number, to: number): void {\n const existing = this._spans.get(id);\n if (existing) {\n existing.to = Math.max(existing.to, to);\n } else {\n this._spans.set(id, { from, to });\n }\n }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\n// Kept out of `BranchWidget.tsx`: react-refresh only fast-refreshes a module whose\n// exports are all components, so values exported beside them force a full page reload on\n// every edit.\n\n/**\n * Relative (\"5 min ago\", \"yesterday\") within two days, absolute date beyond that. The exact\n * timestamp is always available via the `title` tooltip.\n *\n * Recent prompts are the ones a reader places by elapsed time; older ones by date.\n */\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const formatTime = (created: string, now = Date.now()): string => {\n const date = new Date(created);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n const elapsed = now - date.getTime();\n if (elapsed < 0 || elapsed >= 2 * DAY_MS) {\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n\n const format = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const minutes = Math.round(elapsed / 60_000);\n if (minutes < 1) {\n // Seconds rather than `format(0, 'minute')`, which renders as \"this minute\".\n return format.format(-Math.max(1, Math.round(elapsed / 1000)), 'second');\n }\n if (minutes < 60) {\n return format.format(-minutes, 'minute');\n }\n\n const hours = Math.round(minutes / 60);\n if (hours < 24) {\n return format.format(-hours, 'hour');\n }\n\n // `numeric: 'auto'` renders -1 day as \"yesterday\".\n return format.format(-Math.round(hours / 24), 'day');\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\n\nimport { meta } from '#meta';\n\nimport { type MessageThreadContext } from '../sync';\nimport { formatTime } from './format-time';\n\nexport type BranchWidgetProps = XmlWidgetProps<\n {\n /** Id of the message to rewind to. Named to avoid colliding with the widget's own `id` prop. */\n messageId?: string;\n /** ISO timestamp of the message. */\n created?: string;\n },\n MessageThreadContext\n>;\n\n/**\n * Mini toolbar rendered below each user prompt, offering a soft fork (\"rewind\") back to that prompt\n * along with when it was sent.\n */\nexport const BranchWidget = ({ messageId, created, context }: BranchWidgetProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const handleRewind = useCallback(() => {\n if (messageId) {\n context?.rewind(messageId);\n }\n }, [context, messageId]);\n\n if (!messageId) {\n return null;\n }\n\n return (\n <div role='toolbar' className='flex items-center p-1 gap-1 justify-end text-xs text-subdued hover:text-inherit'>\n <IconButton\n classNames='min-h-0 p-1'\n icon='ph--clock-counter-clockwise--regular'\n iconOnly\n variant='ghost'\n size={4}\n label={t('rewind.label')}\n data-testid='chat.rewind'\n onClick={handleRewind}\n />\n {created && (\n <time dateTime={created} title={new Date(created).toLocaleString()}>\n {formatTime(created)}\n </time>\n )}\n </div>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { TogglePanel } from '@dxos/react-ui-components';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\n\nimport { type MessageThreadContext } from '../sync';\n\nexport const FallbackWidget = ({ _tag, ...props }: XmlWidgetProps<MessageThreadContext>) => {\n return (\n <TogglePanel.Root>\n <TogglePanel.Content>\n <TogglePanel.Header classNames='dx-group-surface'>{_tag}</TogglePanel.Header>\n <TogglePanel.Body classNames='dx-modal-surface'>\n <TogglePanel.Viewport>\n <JsonHighlighter classNames='p-2! text-sm' data={props} />\n </TogglePanel.Viewport>\n </TogglePanel.Body>\n </TogglePanel.Content>\n </TogglePanel.Root>\n );\n};\n\nFallbackWidget.displayName = 'Fallback';\n","//\n// Copyright 2026 DXOS.org\n//\n\nexport const styles = {\n /**\n * Vertical rhythm for block widgets. Padding, never margin: CodeMirror measures a widget from its own\n * box, so a margin sits outside what it can see and its height model drifts from what is rendered —\n * the error accumulates down the document until the turn-fold gutter markers are visibly misaligned.\n * Note padding does not collapse between adjacent siblings the way margins do\n */\n padding: 'pt-2 pb-4',\n border: 'border border-subdued-separator rounded-sm',\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nimport { styles } from './defaults';\n\n/**\n * Props used to derive a stable key for a reasoning block across CodeMirror widget rebuilds.\n * CodeMirror does not assign persistent IDs to widgets; streaming re-runs the factory each tick.\n */\nexport type ReasoningWidgetBlockIdProps = {\n id?: string;\n range?: { from: number; to: number };\n};\n\n/**\n * AI reasoning widget.\n */\nexport class ReasoningWidget extends WidgetType {\n readonly #pos: string;\n /** The timer id last registered for this instance (may differ from the map if superseded). */\n #ownedTimerId: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private readonly text: string,\n pos: string | number | undefined,\n ) {\n super();\n this.#pos = pos === undefined || pos === '' ? 'reasoning' : String(pos);\n }\n\n override eq(other: this) {\n return this.text === other.text && this.#pos === other.#pos;\n }\n\n override toDOM() {\n return Domino.of('div')\n .classNames(styles.padding)\n .append(\n Domino.of('div')\n .classNames('relative overflow-hidden p-px', styles.border)\n .attributes({ 'data-trail-container': '' })\n .append(\n Domino.of('div')\n .classNames(\n 'relative z-10 dx-base-surface rounded-sm text-sm text-subdued py-1',\n 'grid grid-cols-[24px_1fr] gap-x-0.5 items-start',\n )\n .append(\n Domino.of('div')\n .classNames('flex h-5 w-full shrink-0 items-center justify-center self-start')\n .append(Domino.svg('ph--brain--regular').classNames('shrink-0 size-4 opacity-70')),\n Domino.of('div')\n .classNames('px-2 max-h-[5lh] overflow-y-auto dx-scrollbar-thin min-w-0')\n .text(this.text)\n .attributes({ 'data-reasoning-text': '' }),\n ),\n Domino.of('div').attributes({ 'data-id': this.#pos }),\n ),\n ).root;\n }\n\n override updateDOM(dom: HTMLElement) {\n // Update only the text leaf; `dom` may be wrapped in an outer shell, and the trail host is a\n // sibling of the text node inside the bordered container — setting `textContent` on the wrong\n // ancestor would remove `[data-id]`.\n dom.querySelector<HTMLElement>('[data-reasoning-text]')?.replaceChildren(this.text);\n\n // Recreate trail host if it was removed by a prior timeout (streaming paused > TRAIL_REMOVAL_DELAY_MS).\n const container = dom.querySelector<HTMLElement>('[data-trail-container]');\n let trailHost = container?.querySelector<HTMLElement>('[data-id]');\n if (container && !trailHost) {\n trailHost = Domino.of('div').attributes({ 'data-id': this.#pos }).root;\n container.append(trailHost);\n }\n if (trailHost?.childElementCount === 0) {\n trailHost.append(...createTrailLayers());\n }\n\n this.#scheduleTrailRemoval(dom);\n return true;\n }\n\n override destroy(_dom: HTMLElement) {\n this.#clearOwnedTrailTimer();\n }\n\n #scheduleTrailRemoval(dom: HTMLElement) {\n const previous = trailRemovalTimers.get(this.#pos);\n if (previous !== undefined) {\n clearTimeout(previous);\n }\n\n const timerId = setTimeout(() => {\n if (trailRemovalTimers.get(this.#pos) !== timerId) {\n return;\n }\n trailRemovalTimers.delete(this.#pos);\n this.#ownedTimerId = null;\n dom.querySelector<HTMLElement>('[data-id]')?.remove();\n }, TRAIL_REMOVAL_DELAY_MS);\n\n trailRemovalTimers.set(this.#pos, timerId);\n this.#ownedTimerId = timerId;\n }\n\n #clearOwnedTrailTimer() {\n const active = trailRemovalTimers.get(this.#pos);\n if (active !== undefined && active === this.#ownedTimerId) {\n clearTimeout(active);\n trailRemovalTimers.delete(this.#pos);\n }\n this.#ownedTimerId = null;\n }\n}\n\nconst trail = [\n 'absolute z-0 aspect-[2/1] w-16',\n 'bg-[radial-gradient(at_100%_50%,_theme(colors.green.700),_transparent_80%)]',\n '[offset-anchor:100%_50%] [offset-path:border-box]',\n];\n\n/** Delay after the last content update before hiding the trail. */\nconst TRAIL_REMOVAL_DELAY_MS = 1_000;\n\n/**\n * One pending removal timer per logical block. Streaming creates a new widget instance each tick;\n * `destroy` may run after the next instance has already scheduled, so we must not clear a newer timer.\n */\nconst trailRemovalTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst createTrailLayers = (): [HTMLElement, HTMLElement] => [\n Domino.of('div').classNames(...trail, 'animate-trail').root,\n Domino.of('div').classNames(...trail, 'animate-trail-offset').root,\n];\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nimport { styles } from './defaults';\n\nexport class ReferenceWidget extends WidgetType {\n constructor(\n private text: string,\n private dxn: string,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this.dxn === other.dxn;\n }\n\n override toDOM() {\n return Domino.of('div')\n .classNames(styles.padding)\n .append(Domino.of('dx-anchor').classNames('dx-tag--anchor').attributes({ dxn: this.dxn }).text(this.text)).root;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nimport { styles } from './defaults';\n\n/**\n * Simple prompt widget.\n */\nexport class SelectWidget extends WidgetType {\n constructor(private options: string[]) {\n super();\n }\n\n override eq(other: this) {\n return JSON.stringify(this.options) === JSON.stringify(other.options);\n }\n\n /**\n * NOTE: Container must set var based on user's identity.\n */\n override toDOM() {\n return Domino.of('div')\n .attributes({ role: 'group' })\n .classNames(styles.padding, 'flex flex-wrap gap-1')\n .append(\n ...this.options.map((option) =>\n Domino.of('button')\n .classNames('dx-button inline-block max-w-[100cqi]')\n .attributes({ 'data-action': 'submit', 'data-value': option, 'data-density': 'md' })\n .text(option),\n ),\n ).root;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nimport { styles } from './defaults';\n\n/**\n * Simple stats widget.\n */\nexport class StatsWidget extends WidgetType {\n constructor(private text: string) {\n super();\n }\n\n override eq(other: this) {\n return this.text === other.text;\n }\n\n override toDOM() {\n return Domino.of('div').classNames(styles.padding, 'text-sm text-placeholder').text(this.text).root;\n }\n\n override updateDOM(dom: HTMLElement) {\n dom.textContent = this.text;\n return true;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nimport { styles } from './defaults';\n\n/**\n * AI status widget.\n */\nexport class StatusWidget extends WidgetType {\n constructor(private readonly text: string) {\n super();\n }\n\n override eq(other: this) {\n return this.text === other.text;\n }\n\n override toDOM() {\n return Domino.of('div')\n .classNames(styles.padding)\n .append(\n Domino.of('div')\n .classNames('relative overflow-hidden rounded-sm')\n .append(\n Domino.of('div')\n .classNames('grid grid-cols-[24px_1fr] gap-x-0.5 gap-y-0 items-start px-0.5 py-0.5 text-placeholder')\n .append(\n Domino.of('div')\n .classNames('flex h-5 w-full shrink-0 items-center justify-center self-start')\n .append(Domino.svg('ph--info--regular').classNames('shrink-0 size-4 opacity-70')),\n Domino.of('div')\n .classNames('relative min-w-0')\n .append(\n Domino.of('div')\n .classNames('relative z-10 rounded-sm text-sm leading-5')\n .attributes({ 'data-status-text': '' })\n .text(this.text),\n ),\n ),\n ),\n ).root;\n }\n\n override updateDOM(dom: HTMLElement) {\n dom.querySelector<HTMLElement>('[data-status-text]')?.replaceChildren(this.text);\n return true;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { WidgetType } from '@codemirror/view';\n\nimport { Domino, mx } from '@dxos/ui';\n\n/**\n * Simple prompt widget.\n */\nexport class SuggestionWidget extends WidgetType {\n constructor(private text: string) {\n super();\n }\n\n override eq(other: this) {\n return this.text === other.text;\n }\n\n override toDOM() {\n // NOTE: Container must have `dx-inline-size-container` (or `dx-size-container`) to support cqi.\n //\n // Inline-level root so consecutive suggestions flow onto one wrapped line rather than stacking —\n // the tag is registered `block: false` and the renderer omits the usual block separator between\n // them.\n //\n // Vertical space must be **padding, never margin**: CodeMirror measures a widget from its own box,\n // and a margin sits outside what it can see, so the height model drifts from what is rendered, the\n // error accumulates down the document, and the turn-fold gutter markers end up visibly misaligned.\n // Adjacent chips are likewise spaced with trailing padding rather than a margin.\n return Domino.of('span')\n .classNames(mx('inline-flex max-w-[calc(100cqi-8px)] py-1 pe-1 overflow-hidden'))\n .append(\n Domino.of('button')\n .attributes({\n 'data-density': 'md',\n 'data-action': 'submit',\n 'data-value': this.text,\n })\n .classNames(mx('dx-button gap-2 w-full overflow-hidden'))\n .append(\n Domino.of('dx-icon').attributes({\n icon: 'ph--lightning--regular',\n }),\n Domino.of('span').classNames('flex-1 truncate min-w-0').text(this.text),\n ),\n ).root;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { TogglePanel } from '@dxos/react-ui-components';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\n\nimport { meta } from '#meta';\n\nimport { MessageThreadContext } from '../sync';\nimport { styles } from './defaults';\n\nexport const SummaryWidget = ({ children }: XmlWidgetProps<MessageThreadContext>) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <TogglePanel.Root>\n <TogglePanel.Content classNames={styles.border}>\n <TogglePanel.Header classNames='text-sm dx-group-surface'>{t('summary.label')}</TogglePanel.Header>\n <TogglePanel.Body>\n <div className='p-1 text-sm text-subdued'>{children}</div>\n </TogglePanel.Body>\n </TogglePanel.Content>\n </TogglePanel.Root>\n );\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { log } from '@dxos/log';\nimport { type XmlWidgetProps, getXmlTextChild } from '@dxos/ui-editor';\n\nimport { ChatSurface } from '#types';\n\n/**\n * Renders an agent-requested UI surface (the `<surface>` content block) by dispatching to a\n * registered {@link ChatSurface} surface keyed on its `role`. The payload is carried as JSON in the\n * tag's text content; a malformed payload renders the surface with no data rather than throwing.\n */\nexport const SurfaceWidget = ({ role, children }: XmlWidgetProps<{ role?: string }>) => {\n const data = useMemo(() => {\n const raw = getXmlTextChild(children ?? []);\n if (!raw) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n // Model-supplied JSON payload: narrowed to a non-array object; no typed schema exists at this boundary.\n return parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch (err) {\n log.warn('failed to parse surface data', { raw, err });\n return undefined;\n }\n }, [children]);\n\n if (!role) {\n return null;\n }\n\n return <Surface.Surface type={ChatSurface} data={{ role, data }} limit={1} />;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Tool from '@effect/ai/Tool';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Icon, IconBlock, useTranslation } from '@dxos/react-ui';\nimport { NumericTabs, TextCrawl, TogglePanel, type TogglePanelRootProps } from '@dxos/react-ui-components';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { type ContentBlock } from '@dxos/types';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\nimport { isNonNullable, safeParseJson } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nexport type ToolWidgetProps = XmlWidgetProps<{\n blocks: ContentBlock.Any[];\n}>;\n\nexport const ToolWidget = ({ view, blocks = [] }: ToolWidgetProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const items = useMemo<ToolPanelProps['items']>(() => {\n let lastToolCall: { tool: Tool.Any | undefined; block: ContentBlock.ToolCall } | undefined;\n // TODO(burdon): Get from context?\n const tools: Tool.Any[] = []; //processor.conversation.toolkit?.tools ?? [];\n return blocks\n .filter((block) => block._tag === 'toolCall' || block._tag === 'toolResult' || block._tag === 'stats')\n .map((block) => {\n switch (block._tag) {\n case 'toolCall': {\n if (block.pending && lastToolCall?.block.toolCallId === block.toolCallId) {\n return null;\n }\n\n const tool = tools.find((tool) => tool.name === block.name);\n lastToolCall = { tool, block };\n return {\n title: tool?.description ?? [t('tool-call.label'), block.name].filter(Boolean).join(' '),\n icon: block.operationIcon,\n content: {\n ...block,\n input: safeParseJson(block.input),\n },\n };\n }\n\n case 'toolResult': {\n // TODO(burdon): Parse error type.\n if (block.error) {\n return {\n title: t('tool-error.label'),\n icon: lastToolCall?.block.operationIcon,\n content: block,\n };\n }\n\n const title =\n lastToolCall?.tool?.description ??\n [t('tool-result.label'), lastToolCall?.block.name].filter(Boolean).join(' ');\n const icon = lastToolCall?.block.operationIcon;\n lastToolCall = undefined;\n return {\n title,\n icon,\n content: {\n ...block,\n result: typeof block.result === 'string' ? safeParseJson(block.result) : block.result,\n },\n };\n }\n\n case 'stats': {\n if (!lastToolCall) {\n return null;\n }\n\n return {\n title: t('stats.label'),\n icon: lastToolCall.block.operationIcon,\n content: block,\n };\n }\n }\n })\n .filter(isNonNullable);\n }, [blocks, t]);\n\n const handleChangeOpen = useCallback(() => {\n setTimeout(() => {\n // Measure after animation.\n view?.requestMeasure();\n }, 1_000);\n }, [view]);\n\n // Ignore if empty.\n if (!items.length) {\n return null;\n }\n\n return <ToolPanel items={items} onChangeOpen={handleChangeOpen} />;\n};\n\ntype ToolPanelItem = { title: string; icon?: string; content: any };\n\ntype ToolPanelProps = {\n items: ToolPanelItem[];\n} & Pick<TogglePanelRootProps, 'onChangeOpen'>;\n\nconst DEFAULT_TOOL_ICON = 'ph--wrench--regular';\n\nconst ToolPanel = ({ items, onChangeOpen }: ToolPanelProps) => {\n const tabsRef = useRef<HTMLDivElement>(null);\n const [selected, setSelected] = useState(0);\n const [open, setOpen] = useState(false);\n\n // Clamp selected to avoid out-of-bounds after items shrink.\n useEffect(() => {\n setSelected((prev) => Math.min(prev, Math.max(0, items.length - 1)));\n }, [items.length]);\n\n useEffect(() => {\n onChangeOpen?.(open);\n if (open) {\n tabsRef.current?.focus();\n }\n }, [open, onChangeOpen]);\n\n const handleSelect = useCallback((index: number) => {\n setSelected(index);\n }, []);\n\n // Prefer the icon from the latest tool call so the header reflects what's currently active.\n // TextCrawl shows multiple titles, but only one icon slot — using the most recent keeps it in sync\n // with the visible operation while it streams.\n const headerIcon = items[items.length - 1]?.icon ?? items[0]?.icon ?? DEFAULT_TOOL_ICON;\n\n return (\n <TogglePanel.Root open={open} onChangeOpen={setOpen}>\n <TogglePanel.Content>\n <TogglePanel.Header classNames='flex items-center gap-2 text-sm'>\n <div className='w-full grid grid-cols-[1fr_auto] items-center gap-2'>\n <TextCrawl\n key='status-roll'\n classNames='text-description'\n lines={items.map((item) => item.title)}\n autoAdvance\n greedy\n />\n <IconBlock>\n <Icon icon={headerIcon} size={4} />\n </IconBlock>\n </div>\n </TogglePanel.Header>\n <TogglePanel.Body>\n <TogglePanel.Viewport classNames='grid grid-cols-[32px_1fr]'>\n <NumericTabs\n ref={tabsRef}\n classNames='p-1'\n length={items.length}\n selected={selected}\n onSelect={handleSelect}\n />\n <JsonHighlighter\n data={items[selected]?.content}\n classNames='p-1 text-xs bg-transparent'\n replacer={{\n maxDepth: 3,\n maxArrayLen: 10,\n maxStringLen: 128,\n }}\n />\n </TogglePanel.Viewport>\n </TogglePanel.Body>\n </TogglePanel.Content>\n </TogglePanel.Root>\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { log } from '@dxos/log';\nimport { ContentBlock, type Message } from '@dxos/types';\nimport { AnchorWidget, type XmlWidgetRegistry, getXmlTextChild } from '@dxos/ui-editor';\n\nimport { type Assistant } from '../../types';\nimport { type BlockRenderer, type MessageThreadContext, applyToolBlockToWidgetState } from './sync';\nimport {\n BranchWidget,\n FallbackWidget,\n ReasoningWidget,\n ReferenceWidget,\n SelectWidget,\n StatsWidget,\n StatusWidget,\n SuggestionWidget,\n SummaryWidget,\n SurfaceWidget,\n ToolWidget,\n} from './widgets';\n\n/**\n * Custom XML tags registry.\n *\n * NOTE: `<prompt>` has no widget — it is rendered via mark + line decorations\n * (`xmlBlockDecoration`) in MarkdownStream so the prompt text remains part of the document\n * and can be highlighted by `xmlFormatting`. It is still listed here so the markdown block\n * parser (`xmlBlockParsers`) knows to keep `<prompt>...</prompt>` as a single HTMLBlock\n * — otherwise an unregistered prompt opens a Paragraph that lazy-continues into the\n * following lines and breaks parsing of subsequent multi-line tags (e.g. a `<reasoning>`\n * block whose content contains an ordered list).\n */\nexport const componentRegistry: XmlWidgetRegistry = {\n //\n // Block-only (no widget — see note above).\n //\n\n 'prompt': {\n block: true,\n },\n\n //\n // DOM Widgets\n //\n\n 'link-preview': {\n block: false,\n urlSchemes: ['dxn:', 'echo:'],\n factory: ({ label, dxn }) =>\n typeof label === 'string' && typeof dxn === 'string' ? new AnchorWidget(label, dxn) : null,\n },\n 'synthetic': {\n block: true,\n factory: ({ children, range }) => {\n const text = getXmlTextChild(children);\n // TODO(dmaretskyi): Synthetic blocks are \"user\"-turn messages generated by the system, i.e. and event from a trigger, an email-encoded to JSON, etc.\n // They are meant to start agent, to process the event without looking like user-authored prompt.\n // Create a new widget type for them.\n return text ? new ReasoningWidget(text, range.from) : null;\n },\n },\n 'reasoning': {\n block: true,\n streaming: true,\n factory: ({ children, range }) => {\n const text = getXmlTextChild(children);\n return text ? new ReasoningWidget(text, range.from) : null;\n },\n },\n 'reference': {\n block: false,\n factory: ({ children, ref }) => {\n const text = getXmlTextChild(children);\n return text && ref ? new ReferenceWidget(text, ref) : null;\n },\n },\n 'select': {\n block: true,\n factory: ({ children }) => {\n const options = children\n ?.map((option: any) => option._tag === 'option' && getXmlTextChild(option.children))\n .filter(Boolean);\n return options?.length ? new SelectWidget(options) : null;\n },\n },\n // Inline so a run of suggestions flows onto one wrapped line instead of one block per line.\n 'suggestion': {\n block: false,\n factory: ({ children }) => {\n const text = getXmlTextChild(children);\n return text ? new SuggestionWidget(text) : null;\n },\n },\n 'stats': {\n block: true,\n factory: ({ children }) => {\n const text = getXmlTextChild(children);\n return text ? new StatsWidget(text) : null;\n },\n },\n 'status': {\n block: true,\n streaming: true,\n factory: ({ children }) => {\n const text = getXmlTextChild(children);\n return text ? new StatusWidget(text) : null;\n },\n },\n\n //\n // React Widgets (portaled outside of the editor)\n //\n\n 'branch': {\n block: true,\n Component: BranchWidget,\n },\n 'summary': {\n block: true,\n Component: SummaryWidget,\n },\n 'surface': {\n block: true,\n Component: SurfaceWidget,\n },\n 'toolCall': {\n block: true,\n Component: (props) => (\n <div className='py-2'>\n <ToolWidget {...props} />\n </div>\n ),\n },\n 'toolResult': {\n block: true,\n Component: FallbackWidget,\n },\n 'toolkit': {\n block: true,\n Component: FallbackWidget,\n },\n\n //\n // Fallback\n //\n\n 'json': {\n block: true,\n Component: FallbackWidget,\n },\n} as const;\n\n/**\n * Convert block to markdown.\n */\nexport const blockToMarkdown: BlockRenderer = createBlockRenderer('normal');\n\n/**\n * Create a {@link BlockRenderer} that filters blocks based on the chat view type.\n *\n * - `summary`: only user prompts.\n * - `normal`: user prompts + assistant text + tool calls + summary/select/suggestion/reference + status. Hides reasoning.\n * - `thinking`: same as normal plus reasoning.\n * - `debug`: renders every block (raw fallbacks visible).\n */\nexport function createBlockRenderer(viewType: Assistant.ChatView | undefined): BlockRenderer {\n return (context, message, block) => {\n if (!isBlockVisible(viewType, message, block)) {\n return;\n }\n\n let str = blockToMarkdownImpl(context, message, block);\n if (str && !block.pending) {\n // Suggestions are inline widgets meant to flow: keeping them on one line lets a run of them wrap\n // as chips instead of stacking one per line. A trailing space separates adjacent tags so the\n // inline parser sees them as distinct.\n if (block._tag === 'suggestion') {\n return (str += ' ');\n }\n\n // Use a blank line as the block separator so each rendered block parses as its own\n // markdown block. A single newline lets CommonMark absorb a following `<prompt>` (an\n // HTML type-7 tag, which can't interrupt an open paragraph) into the previous\n // paragraph, rendering the prompt bubble inline next to the prior assistant text.\n return (str += '\\n');\n }\n return str;\n };\n}\n\nconst isBlockVisible = (\n viewType: Assistant.ChatView | undefined,\n message: Message.Message,\n block: ContentBlock.Any,\n): boolean => {\n switch (viewType) {\n case 'debug':\n return true;\n case 'normal':\n return block._tag !== 'reasoning';\n case 'summary':\n // Show only conversational text (user prompts + assistant replies); hide reasoning,\n // tool calls, status, stats, and synthetic system messages.\n return block._tag === 'text' && (block as ContentBlock.Text).disposition !== 'synthetic';\n case 'thinking':\n default:\n return true;\n }\n};\n\nconst blockToMarkdownImpl = (context: MessageThreadContext, message: Message.Message, block: ContentBlock.Any) => {\n log('blockToMarkdown', { block: JSON.stringify(block) });\n switch (block._tag) {\n case 'text': {\n if (message.sender.role === 'user') {\n if (block.disposition === 'synthetic') {\n return renderXMLBlock('synthetic', { content: block.text, pending: block.pending });\n } else {\n // Built by explicit concatenation, not an indented template: `trim` dedents by the minimum\n // indent across all lines, and a multi-line prompt contributes lines at zero indent — so the\n // source file's indentation survived into the document, where 4+ spaces is an indented code\n // block and neither the prompt nor the toolbar parsed as an element any more.\n return `\\n<prompt>${block.text}</prompt>\\n${renderBranchToolbar(message)}\\n`;\n }\n } else {\n const text = block.text.trim();\n if (text.length > 0) {\n return text;\n }\n }\n break;\n }\n\n case 'reference': {\n if (block.pending) {\n return;\n }\n const dxn = block.reference.uri;\n return `<reference ref=\"${dxn.toString()}\">${context.getObjectLabel(dxn)}</reference>`;\n }\n\n case 'suggestion': {\n if (block.pending) {\n return;\n }\n return `<suggestion>${block.text}</suggestion>`;\n }\n\n case 'select': {\n if (block.pending || block.options.length === 0) {\n return;\n }\n return `<select>${block.options.map((option) => `<option>${option}</option>`).join('')}</select>`;\n }\n\n case 'toolCall': {\n applyToolBlockToWidgetState(context, block);\n return `<toolCall id=\"${block.toolCallId}\" />`;\n }\n\n case 'toolResult': {\n // TODO(dmaretskyi): the parameter could be undefined, perhaps tool blocks are not arriving in order.\n applyToolBlockToWidgetState(context, block);\n break;\n }\n\n case 'stats': {\n return '';\n }\n\n case 'reasoning': {\n let text = block.reasoningText ?? block.redactedText;\n if (!text) {\n return;\n }\n return renderXMLBlock('reasoning', { content: text, pending: block.pending });\n }\n\n case 'summary': {\n return renderXMLBlock('summary', { content: block.content, pending: block.pending });\n }\n\n case 'status': {\n return renderXMLBlock('status', { content: block.statusText, pending: block.pending });\n }\n\n case 'surface': {\n if (block.pending) {\n return;\n }\n // Carry the payload as JSON text content so it round-trips through the mixed XML parser\n // without colliding with attribute quoting; `SurfaceWidget` re-parses it.\n return renderXMLBlock('surface', {\n content: JSON.stringify(block.data ?? {}),\n attributes: `role=\"${escapeXmlAttribute(block.role)}\"`,\n });\n }\n\n default: {\n // TODO(burdon): Needs stable ID.\n return `<json id=\"${message.id}\">\\n${JSON.stringify(block)}\\n</json>`;\n }\n }\n};\n\n/**\n * Mini toolbar below a user prompt: branch (soft fork) plus when the prompt was sent.\n * `messageId` rather than `id` because a tag's `id` attribute would shadow the widget's own id.\n */\nconst renderBranchToolbar = (message: Message.Message) =>\n `<branch messageId=\"${escapeXmlAttribute(message.id)}\" created=\"${escapeXmlAttribute(message.created)}\" />`;\n\n/**\n * Escape text embedded in generated XML so the mixed XML parser does not treat `&`, `<`, `>` as markup.\n */\nconst escapeXmlTextContent = (raw: string): string =>\n raw.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/** Escape a value embedded in a double-quoted XML attribute (e.g. a model-supplied surface role). */\nconst escapeXmlAttribute = (raw: string): string => escapeXmlTextContent(raw).replace(/\"/g, '&quot;');\n\nconst renderXMLBlock = (tag: string, opts: { content?: string; pending?: boolean; attributes?: string }) => {\n // Replace paragraph breaks so that the markdown parser does not split the content into multiple paragraphs.\n // NOTE: do not strip leading list-marker prefixes (`-`, `*`, `1. `, ...) per line — the streaming\n // tag's range is replaced atomically by the XML widget so the inner markdown is never user-visible,\n // and stripping can collapse a line to empty mid-stream (e.g. when only `1. ` has arrived), breaking\n // the prefix-extension contract that `MessageSyncer` relies on for incremental appends.\n const content = escapeXmlTextContent((opts.content ?? '').replace(/\\n\\n/g, ' ').trim());\n\n if (opts.pending) {\n return `<${tag}${opts.attributes ? ` ${opts.attributes}` : ''}>${content}`;\n } else {\n return `<${tag}${opts.attributes ? ` ${opts.attributes}` : ''}>${content}</${tag}>`;\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Identity } from '@dxos/halo';\nimport { PublicKey } from '@dxos/keys';\nimport { type ThemedClassName, setRef } from '@dxos/react-ui';\nimport { MarkdownStream, type MarkdownStreamController, type MarkdownStreamProps } from '@dxos/react-ui-markdown';\nimport { type Message } from '@dxos/types';\nimport { keyToFallback } from '@dxos/util';\n\nimport { type Assistant } from '../../types';\nimport { type ChatEvent } from '../Chat';\nimport { componentRegistry, createBlockRenderer } from './registry';\nimport { type MessageSpan, MessageSyncer } from './sync';\n\nconst defaultOptions: MarkdownStreamProps['options'] = {\n autoScroll: true,\n cursor: false,\n fader: false,\n typewriter: true,\n};\n\nexport type ChatThreadProps = ThemedClassName<\n {\n identity?: Identity.Info;\n messages?: Message.Message[];\n error?: Error;\n viewType?: Assistant.ChatView;\n onEvent?: (event: ChatEvent) => void;\n /** Publishes the syncer's per-message document spans after each update (minimap, prompt nav). */\n onSpans?: (spans: MessageSpan[]) => void;\n } & Pick<MarkdownStreamProps, 'options' | 'debug' | 'extensions' | 'footer'>\n>;\n\nexport const ChatThread = forwardRef<MarkdownStreamController | null, ChatThreadProps>(\n (\n {\n classNames,\n identity,\n messages = [],\n error,\n options = defaultOptions,\n footer,\n debug = false,\n extensions,\n viewType,\n onEvent,\n onSpans,\n },\n forwardedRef,\n ) => {\n const [controller, setController] = useState<MarkdownStreamController | null>(null);\n const handleMarkdownStreamRef = useCallback(\n (instance: MarkdownStreamController | null) => {\n setController(instance);\n setRef(forwardedRef, instance);\n },\n [forwardedRef],\n );\n\n const userHue = useMemo(\n () =>\n identity?.data?.hue ||\n keyToFallback(identity?.identityKey ? PublicKey.fromHex(identity.identityKey) : PublicKey.random()).hue,\n [identity],\n );\n\n // Jump to the bottom instantly when the thread first mounts (e.g. opening the companion);\n // smooth-scroll only on subsequent error changes.\n const initializedRef = useRef(false);\n useEffect(() => {\n if (!controller) {\n // MarkdownStream is keyed by viewType; switching views replaces the controller. Reset so\n // the first scroll for the new controller is instant rather than animated.\n initializedRef.current = false;\n return;\n }\n controller.scrollToBottom(initializedRef.current ? 'smooth' : 'instant');\n initializedRef.current = true;\n }, [controller, error]);\n\n // Widget callbacks are routed through the syncer's context, so they must be referentially stable\n // — rebuilding the syncer replaces the document.\n const onEventRef = useRef(onEvent);\n useEffect(() => {\n onEventRef.current = onEvent;\n }, [onEvent]);\n const handleRewind = useCallback((id: string) => onEventRef.current?.({ type: 'rewind', id }), []);\n\n // Update document.\n const renderer = useMemo(() => createBlockRenderer(viewType), [viewType]);\n const syncer = useMemo(\n () => controller && new MessageSyncer(controller, renderer, { onRewind: handleRewind }),\n [controller, renderer, handleRewind],\n );\n useEffect(() => {\n if (!syncer) {\n return;\n }\n\n // Publish the context every pass: widget props read it from a CodeMirror state field, and\n // `setContext` dispatches through `viewRef.current?` — a no-op before the view exists, so doing this\n // once on mount silently loses it and every widget callback (e.g. rewind) dies on the optional call.\n controller?.setContext(syncer.context);\n\n // Publish the context every pass: widget props read it from a CodeMirror state field, and\n // `setContext` dispatches through `viewRef.current?` — a no-op before the view exists, so doing this\n // once on mount silently loses it and every widget callback (e.g. rewind) dies on the optional call.\n controller?.setContext(syncer.context);\n\n if (syncer.update(messages)) {\n controller?.scrollToBottom('instant');\n }\n // Spans are valid synchronously after `update` (offsets are computed during the walk).\n onSpans?.(syncer.getSpans());\n }, [controller, syncer, messages, onSpans]);\n\n // Event adapter.\n const handleEvent = useCallback<NonNullable<MarkdownStreamProps['onEvent']>>(\n ({ type, value }) => {\n switch (type) {\n case 'submit': {\n value && onEvent?.({ type, text: value });\n break;\n }\n }\n },\n [onEvent],\n );\n\n return (\n <div data-hue={userHue} className='contents'>\n <MarkdownStream\n key={viewType}\n classNames={classNames}\n registry={componentRegistry}\n options={options}\n debug={debug}\n extensions={extensions}\n footer={footer}\n onEvent={handleEvent}\n ref={handleMarkdownStreamRef}\n />\n </div>\n );\n },\n);\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { useObject } from '@dxos/echo-react';\nimport { Icon, Tag, type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Listbox } from '@dxos/react-ui-list';\nimport { Outline } from '@dxos/types';\n\nexport type TaskListProps = ThemedClassName<{\n outline: Outline.Outline;\n /** Title of the item currently being worked by a delegated sub-agent, if any. */\n activeTitle?: string;\n}>;\n\n/**\n * Renders the conversation's working checklist (the outline's markdown `- [ ]` lines).\n * Durable promoted tasks keep richer state; the checklist is the at-a-glance view.\n */\n// TODO(burdon): Re-correlate live sub-agent activity (trace lines) via a Process annotation\n// carrying the task ref — the pid no longer lives on the task.\nexport const TaskList = composable<HTMLDivElement, TaskListProps>(\n ({ outline, activeTitle, ...props }, forwardedRef) => {\n const [text] = useObject(outline.content);\n const items = useMemo(() => Outline.parseChecklist(text?.content ?? ''), [text?.content]);\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Listbox.Root>\n <Listbox.Viewport {...composableProps(props, { classNames: 'dx-container' })} ref={forwardedRef}>\n <Listbox.Content aria-label='Tasks'>\n {items.map((item) => (\n <TaskListItem key={item.title} item={item} active={item.title === activeTitle} />\n ))}\n </Listbox.Content>\n </Listbox.Viewport>\n </Listbox.Root>\n );\n },\n);\n\ntype TaskListItemProps = {\n item: Outline.ChecklistItem;\n active?: boolean;\n};\n\nconst TaskListItem = ({ item, active }: TaskListItemProps) => {\n return (\n <Listbox.Item id={item.title} classNames='py-0'>\n <div className='flex items-center gap-2 min-w-0'>\n <Icon\n icon={item.done ? 'ph--check--regular' : 'ph--circle--regular'}\n classNames={item.done ? 'text-success-text' : undefined}\n size={4}\n />\n <span className='sr-only'>{item.done ? 'done' : 'to do'}</span>\n <span className='truncate flex-1'>{item.title}</span>\n {active && <Tag hue='info'>working</Tag>}\n </div>\n </Listbox.Item>\n );\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Order from 'effect/Order';\n\nimport { Feed } from '@dxos/echo';\nimport { Message } from '@dxos/types';\n\n/**\n * Append order for {@link Feed.history}, which walks lineage positionally rather than by time.\n *\n * Position is authoritative but server-assigned: locally-written blocks — and every block until a\n * position authority acknowledges them — report `+Infinity`, and a query returns an unordered set, so\n * position alone leaves them in arbitrary order. `created` breaks those ties: sound locally, where one\n * conversation's messages come off one clock, and consulted only when position cannot decide.\n */\nexport const byAppendOrder: Order.Order<Message.Message> = (a, b) => {\n const positionA = Feed.getPosition(a);\n const positionB = Feed.getPosition(b);\n if (positionA !== positionB) {\n return positionA < positionB ? -1 : 1;\n }\n return a.created < b.created ? -1 : a.created > b.created ? 1 : 0;\n};\n\nexport type ThreadProjection = {\n /** The turns to render, in append order. */\n messages: Message.Message[];\n};\n\n/**\n * The turns a thread should render: those reachable from the feed's head, so a rewind's abandoned turns\n * disappear from the view exactly as they disappear from the model's history.\n *\n * A pending `rewindFrom` truncates the view to what precedes it — the rewound-to prompt and everything\n * after it, since the point of rewinding to a prompt is to re-ask it. The pointer is cleared by the next\n * append (which turns the fork into lineage), so a rewind that is never followed through stays visible\n * as a truncated thread with the prompt restored in the composer.\n */\nexport const projectThread = ({\n feedMessages,\n pendingMessages = [],\n rewindFrom,\n}: {\n feedMessages: readonly Message.Message[];\n /** Messages produced by the current turn that are not in the feed yet. */\n pendingMessages?: readonly Message.Message[];\n /** Earliest message a pending rewind discards. */\n rewindFrom?: string;\n}): ThreadProjection => {\n const all = Array.dedupeWith([...feedMessages, ...pendingMessages], ({ id: a }, { id: b }) => a === b);\n const sorted = Array.sort(all, byAppendOrder);\n\n if (rewindFrom !== undefined) {\n const index = sorted.findIndex((message) => message.id === rewindFrom);\n if (index === 0) {\n // Rewound to the first turn: nothing precedes it.\n return { messages: [] };\n }\n if (index > 0) {\n return { messages: Feed.history(sorted, { head: sorted[index - 1].id }).items };\n }\n // Not present — a stale pointer (e.g. the message never replicated); fall through to the feed's\n // own lineage rather than blanking the thread.\n }\n\n return { messages: Feed.history(sorted).items };\n};\n\n/**\n * What a rewind to `messageId` implies: the messages to discard from, and the prompt text to restore so\n * the user can edit and resend it.\n *\n * Returns `undefined` when the message is absent, so a stale click is a no-op rather than a truncation.\n */\nexport const resolveRewind = (\n messages: readonly Message.Message[],\n messageId: string,\n): { rewindFrom: string; text: string } | undefined => {\n const message = messages.find((candidate) => candidate.id === messageId);\n if (!message) {\n return undefined;\n }\n return { rewindFrom: messageId, text: Message.extractText(message) };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport * as Option from 'effect/Option';\nimport React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Event } from '@dxos/async';\nimport { type Database, Filter, Obj, Query } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { useIdentity } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport {\n Button,\n type ThemedClassName,\n Toast,\n composable,\n composableProps,\n useDynamicRef,\n useTranslation,\n} from '@dxos/react-ui';\nimport { Minimap, type MinimapMarker } from '@dxos/react-ui-components';\nimport { type DocumentRange, type MarkdownStreamController } from '@dxos/react-ui-markdown';\nimport { Menu, MenuRootProps } from '@dxos/react-ui-menu';\nimport { Outline } from '@dxos/types';\nimport { Message } from '@dxos/types';\n\nimport { useChatKeymapExtensions, useChatToolbarActions, useDebug } from '#hooks';\nimport { meta } from '#meta';\n\nimport { AiUsageQuotaError, type ProcessorRequestContext } from '../../processor';\nimport {\n ChatStatus,\n ChatPrompt as NaturalChatPrompt,\n type ChatPromptProps as NaturalChatPromptProps,\n} from '../ChatPrompt';\nimport {\n type MessageSpan,\n ChatThread as NaturalChatThread,\n type ChatThreadProps as NaturalChatThreadProps,\n} from '../ChatThread';\nimport { TaskList } from '../TaskList';\nimport { ChatContextProvider, type ChatContextValue, type ChatRequestTiming, useChatContext } from './context';\nimport { type ChatEvent } from './events';\nimport { projectThread, resolveRewind } from './thread';\n\n//\n// Root\n//\n\ntype ChatRootProps = PropsWithChildren<\n Pick<ChatContextValue, 'chat' | 'processor'> & {\n /** Fallback database when the chat is transient (not yet persisted). */\n db?: Database.Database;\n onEvent?: (event: ChatEvent) => void;\n /**\n * Runs (and is awaited) before the request fires on submit. Lets a transient chat\n * persist and flush its conversation feed so the agent can resolve it.\n */\n onSubmit?: (text: string) => Promise<void> | void;\n /** Called at submit time to capture ephemeral request context (e.g. companion selection). */\n getContext?: () => ProcessorRequestContext | undefined;\n }\n>;\n\nconst ChatRoot = ({\n children,\n chat,\n processor,\n db: dbFallback,\n onEvent,\n onSubmit,\n getContext,\n ...props\n}: ChatRootProps) => {\n const [debug, setDebug] = useState(false);\n const streaming = useAtomValue(processor.streaming);\n const active = useAtomValue(processor.active);\n const requestTiming = useRequestTiming({ active });\n const lastPrompt = useRef<string | undefined>(undefined);\n // Transient chats have no database of their own; fall back to the supplied space db so\n // the message query and context controls operate before the chat is persisted.\n const db = (chat && Obj.getDatabase(chat)) || dbFallback;\n\n // Reactive subscription — re-renders when the feed ref resolves. Direct `.target` reads are not reactive.\n const [feedSnapshot] = useObject(chat?.feed);\n const feed = Obj.getReactiveOrUndefined(feedSnapshot);\n\n // Event sink.\n const event = useMemo(() => new Event<ChatEvent>(), []);\n\n // The editor controller and per-message ranges are produced by `Chat.Thread` and consumed by\n // `Chat.Minimap`; lifted here so both sub-components share the same instance.\n const [controller, setController] = useState<MarkdownStreamController | null>(null);\n const [messageRanges, setMessageRanges] = useState<MessageSpan[]>([]);\n\n const feedMessages = useQuery(\n db,\n feed ? Query.select(Filter.type(Message.Message)).from(feed) : Query.select(Filter.nothing()),\n );\n const pendingMessages = useAtomValue(processor.messages);\n const { messages } = useMemo(\n () => projectThread({ feedMessages, pendingMessages, rewindFrom: feedSnapshot?.rewindFrom }),\n [feedMessages, pendingMessages, feedSnapshot?.rewindFrom],\n );\n\n const dump = useDebug({ processor });\n\n // Surface processor failures (e.g., AI service unavailable) to subscribers via the event bus.\n const error = useAtomValue(processor.error);\n useEffect(() => {\n if (Option.isSome(error)) {\n event.emit({ type: 'error', error: error.value });\n }\n }, [event, error]);\n\n useEffect(() => {\n return event.on((ev) => {\n switch (ev.type) {\n case 'toggle-debug': {\n setDebug((debug) => {\n if (debug) {\n return false;\n } else {\n void dump();\n return true;\n }\n });\n break;\n }\n\n case 'submit': {\n const text = ev.text.trim();\n if (!streaming && text.length) {\n lastPrompt.current = ev.text;\n const context = getContext?.();\n // Await persistence (transient chat) before requesting so the agent resolves the\n // now-durable conversation feed; resolves immediately when there is no hook.\n void Promise.resolve(onSubmit?.(text)).then(() => processor.request({ message: text, context }));\n }\n break;\n }\n\n case 'rewind': {\n // Edit-and-resend: discard the prompt and everything after it, and put its text back in the\n // composer so it can be revised. Recorded on the feed rather than the chat because the\n // continuation is appended by the agent's process, which resolves the feed and never sees the\n // chat. A stale click (message already gone) resolves to nothing and is a no-op.\n const rewind = feed && resolveRewind(messages, ev.id);\n if (rewind) {\n Obj.update(feed, (feed) => {\n feed.rewindFrom = rewind.rewindFrom;\n });\n event.emit({ type: 'update-prompt', text: rewind.text });\n }\n break;\n }\n\n case 'retry': {\n if (!streaming) {\n void processor.retry();\n }\n break;\n }\n\n case 'cancel': {\n void processor.cancel();\n if (streaming) {\n if (lastPrompt.current) {\n event.emit({ type: 'update-prompt', text: lastPrompt.current });\n }\n }\n break;\n }\n }\n\n onEvent?.(ev);\n });\n // `feed` and `messages` are dependencies because the rewind branch reads and writes them: without\n // them the handler would keep resolving rewinds against whatever was mounted first.\n }, [event, dump, processor, streaming, onEvent, onSubmit, getContext, feed, messages]);\n\n return (\n <ChatContextProvider\n debug={debug}\n event={event}\n db={db}\n chat={chat}\n messages={messages}\n processor={processor}\n requestTiming={requestTiming}\n controller={controller}\n setController={setController}\n messageRanges={messageRanges}\n setMessageRanges={setMessageRanges}\n {...props}\n >\n {children}\n </ChatContextProvider>\n );\n};\n\nChatRoot.displayName = 'Chat.Root';\n\nconst useRequestTiming = ({ active }: { active: boolean }) => {\n const [requestTiming, setRequestTiming] = useState<ChatRequestTiming | null>(null);\n useEffect(() => {\n if (active) {\n setRequestTiming({ startedAt: Date.now(), endedAt: null });\n } else {\n setRequestTiming((prev) => (prev && prev.endedAt == null ? { ...prev, endedAt: Date.now() } : prev));\n }\n }, [active]);\n\n return requestTiming;\n};\n\n//\n// Toolbar\n//\n\nconst CHAT_TOOLBAR_NAME = 'Chat.Toolbar';\n\ntype ChatToolbarProps = Pick<MenuRootProps, 'attendableId' | 'alwaysActive'> &\n PropsWithChildren<{\n companionTo?: Obj.Unknown;\n }>;\n\nconst ChatToolbar = composable<HTMLDivElement, ChatToolbarProps>(\n ({ children, attendableId, alwaysActive, companionTo, ...props }, forwardedRef) => {\n const { chat } = useChatContext(CHAT_TOOLBAR_NAME);\n const menuActions = useChatToolbarActions({ chat, companionTo });\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId} alwaysActive={alwaysActive}>\n <Menu.Toolbar {...composableProps(props)} ref={forwardedRef}>\n {children}\n </Menu.Toolbar>\n </Menu.Root>\n );\n },\n);\n\nChatToolbar.displayName = CHAT_TOOLBAR_NAME;\n\n//\n// Content\n//\n\nconst CHAT_CONTENT_NAME = 'Chat.Content';\n\ntype ChatContentProps = {};\n\nconst ChatContent = composable<HTMLDivElement, ChatContentProps>(({ children, ...props }, forwardedRef) => {\n return (\n <div {...composableProps(props, { classNames: 'dx-expander flex flex-col' })} ref={forwardedRef}>\n {children}\n </div>\n );\n});\n\nChatContent.displayName = CHAT_CONTENT_NAME;\n\n//\n// Markers\n//\n\nconst PROMPT_SNIPPET_LINES = 3;\nconst PROMPT_SNIPPET_CHARS = 280;\nconst PROMPT_TITLE_CHARS = 100;\n\n/** First non-empty line of a message's text, truncated for the marker title. */\nconst promptTitle = (message: Message.Message): string => {\n const text = Message.extractText(message).trim();\n const firstLine = text.split('\\n').find((line) => line.trim().length) ?? '';\n return firstLine.length > PROMPT_TITLE_CHARS ? `${firstLine.slice(0, PROMPT_TITLE_CHARS)}…` : firstLine;\n};\n\n/** First few text lines of an assistant reply (tool calls, reasoning and status are excluded). */\nconst replySnippet = (message: Message.Message): string | undefined => {\n // `extractText` keeps only `text` blocks, so tool calls / reasoning / status are dropped.\n const text = Message.extractText(message).trim();\n if (!text.length) {\n return undefined;\n }\n const snippet = text\n .split('\\n')\n .filter((line) => line.trim().length)\n .slice(0, PROMPT_SNIPPET_LINES)\n .join('\\n');\n return snippet.length > PROMPT_SNIPPET_CHARS ? `${snippet.slice(0, PROMPT_SNIPPET_CHARS)}…` : snippet;\n};\n\n/**\n * Build one minimap marker per user-prompt turn: title = the prompt text, description = a\n * snippet of the following assistant reply, range = the turn's document span (prompt start →\n * next prompt start). Positions come from the syncer's per-message range table.\n */\nconst buildMarkers = (messages: Message.Message[], ranges: MessageSpan[]): MinimapMarker[] => {\n const rangeById = new Map(ranges.map((range) => [range.id, range] as const));\n const markers: MinimapMarker[] = [];\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index];\n if (message.sender.role !== 'user') {\n continue;\n }\n const range = rangeById.get(message.id);\n if (!range) {\n continue;\n }\n\n // Extend the turn through the following non-user messages and grab the first assistant reply.\n let turnTo = range.to;\n let description: string | undefined;\n for (let next = index + 1; next < messages.length; next++) {\n const nextMessage = messages[next];\n const nextRange = rangeById.get(nextMessage.id);\n if (nextMessage.sender.role === 'user') {\n if (nextRange) {\n turnTo = nextRange.from;\n }\n break;\n }\n if (nextRange) {\n turnTo = nextRange.to;\n }\n if (!description && nextMessage.sender.role === 'assistant') {\n description = replySnippet(nextMessage);\n }\n }\n\n markers.push({\n id: message.id,\n title: promptTitle(message) || 'Prompt',\n description,\n range: { from: range.from, to: turnTo },\n });\n }\n return markers;\n};\n\n//\n// Thread\n//\n\nconst CHAT_THREAD_NAME = 'Chat.Thread';\n\ntype ChatThreadProps = Omit<NaturalChatThreadProps, 'identity' | 'messages' | 'tools'> & {\n /** Invoked from the over-quota error toast to open the usage dashboard. */\n onViewUsage?: () => void;\n};\n\nconst ChatThread = ({ viewType, debug: debugProp, onViewUsage, ...props }: ChatThreadProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { debug, event, messages, processor, messageRanges, setController, setMessageRanges } =\n useChatContext(CHAT_THREAD_NAME);\n const extensions = useChatKeymapExtensions({ event });\n const identity = useIdentity();\n const error = useAtomValue(processor.error).pipe(Option.getOrUndefined);\n const [toastError, setToastError] = useState<Error | undefined>(undefined);\n // The toast renders whatever action the error declares (data-driven) rather than branching on type.\n const toastAction = toastError instanceof AiUsageQuotaError ? toastError.action : undefined;\n const debugView = viewType === 'debug';\n\n const controllerRef = useRef<MarkdownStreamController | null>(null);\n // Share the controller with `Chat.Minimap` (and keep the local ref for event handling).\n const handleControllerRef = useCallback(\n (instance: MarkdownStreamController | null) => {\n controllerRef.current = instance;\n setController(instance);\n },\n [setController],\n );\n\n // Prompt-turn positions for navigation; a ref keeps the event handler stable without stale reads.\n const promptPositions = useMemo(\n () =>\n buildMarkers(messages, messageRanges)\n .map((marker) => marker.range.from)\n .sort((a, b) => a - b),\n [messages, messageRanges],\n );\n const promptPositionsRef = useDynamicRef(promptPositions);\n\n // Navigate between prompt turns using the range table (not the xml-tag widget bookmarks).\n const navigateToPrompt = useCallback(\n (direction: 1 | -1) => {\n const controller = controllerRef.current;\n const positions = promptPositionsRef.current;\n if (!controller || !positions.length) {\n return;\n }\n const anchor = controller.getVisibleRange()?.from ?? 0;\n const epsilon = 2;\n const target =\n direction > 0\n ? positions.find((pos) => pos > anchor + epsilon)\n : [...positions].reverse().find((pos) => pos < anchor - epsilon);\n if (target != null) {\n controller.scrollTo(target, { y: 'start' });\n }\n },\n [promptPositionsRef],\n );\n\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'rewind':\n console.log('rewind', event);\n break;\n case 'submit':\n case 'scroll-to-bottom':\n controllerRef.current?.scrollToBottom();\n break;\n case 'nav-previous':\n navigateToPrompt(-1);\n break;\n case 'nav-next':\n navigateToPrompt(1);\n break;\n case 'error':\n setToastError(event.error);\n break;\n default:\n log.info('no handled', event);\n }\n });\n }, [event, navigateToPrompt]);\n\n const handleEvent = useCallback<NonNullable<NaturalChatThreadProps['onEvent']>>(\n (ev) => {\n event.emit(ev);\n },\n [event],\n );\n\n if (!identity) {\n return <div className='dx-expander' />;\n }\n\n return (\n <>\n <NaturalChatThread\n {...props}\n identity={identity}\n messages={messages}\n error={error}\n debug={debugProp ?? (debug || debugView)}\n viewType={viewType}\n extensions={extensions}\n onEvent={handleEvent}\n onSpans={setMessageRanges}\n ref={handleControllerRef}\n />\n\n <Toast.Root\n type='foreground'\n open={!!toastError}\n duration={20_000}\n onOpenChange={(open) => !open && setToastError(undefined)}\n >\n <Toast.Title icon='ph--warning--regular' onClose={() => setToastError(undefined)}>\n {t('ai-service-error.label')}\n </Toast.Title>\n <Toast.Description>{toastError?.message}</Toast.Description>\n {toastAction && onViewUsage && (\n <Toast.Actions>\n <Toast.Action altText={t(toastAction.labelKey)} asChild>\n <Button\n onClick={() => {\n setToastError(undefined);\n onViewUsage();\n }}\n >\n {t(toastAction.labelKey)}\n </Button>\n </Toast.Action>\n </Toast.Actions>\n )}\n </Toast.Root>\n </>\n );\n};\n\nChatThread.displayName = CHAT_THREAD_NAME;\n\n//\n// Minimap\n//\n\nconst CHAT_MINIMAP_NAME = 'Chat.Minimap';\n\ntype ChatMinimapProps = ThemedClassName<{}>;\n\n/**\n * Anchor-marker rail for the thread: one tick per user-prompt turn. Reads the shared controller\n * and the syncer's range table from context; clicking a tick scrolls the thread to that turn.\n */\nconst ChatMinimap = ({ classNames }: ChatMinimapProps) => {\n const { messages, messageRanges, controller } = useChatContext(CHAT_MINIMAP_NAME);\n const [visibleRange, setVisibleRange] = useState<DocumentRange | undefined>(undefined);\n useEffect(() => {\n if (!controller) {\n return;\n }\n return controller.onVisibleRangeChange(setVisibleRange);\n }, [controller]);\n\n const markers = useMemo(() => buildMarkers(messages, messageRanges), [messages, messageRanges]);\n const handleSelect = useCallback(\n (marker: MinimapMarker) => {\n controller?.scrollTo(marker.range.from, { y: 'start' });\n },\n [controller],\n );\n\n if (!markers.length) {\n return null;\n }\n\n return <Minimap classNames={classNames} markers={markers} visibleRange={visibleRange} onSelect={handleSelect} />;\n};\n\nChatMinimap.displayName = CHAT_MINIMAP_NAME;\n\n//\n// Prompt\n//\n\nconst CHAT_PROMPT_NAME = 'Chat.Prompt';\n\ntype ChatPromptProps = Omit<NaturalChatPromptProps, 'chat' | 'db' | 'processor' | 'event'>;\n\nconst ChatPrompt = (props: ChatPromptProps) => {\n const { chat, db, processor, event } = useChatContext(CHAT_PROMPT_NAME);\n return <NaturalChatPrompt {...props} chat={chat} db={db} processor={processor} event={event} />;\n};\n\nChatPrompt.displayName = CHAT_PROMPT_NAME;\n\n//\n// TaskList\n//\n\nconst CHAT_TASK_LIST_NAME = 'Chat.TaskList';\n\ntype ChatTaskListProps = {\n outline?: Outline.Outline;\n};\n\n// TODO(burdon): Project chats keep their working checklist on the parent project's outline —\n// resolve via the parent edge (needs a reactive parent lookup), not only `chat.outline`.\nconst ChatTaskList = composable<HTMLDivElement, ChatTaskListProps>(\n ({ outline: outlineProp, ...props }, forwardedRef) => {\n const { chat } = useChatContext(CHAT_TASK_LIST_NAME);\n\n const outline = useAtomValue(\n useMemo(\n () =>\n Atom.make(\n (get) =>\n outlineProp ??\n Option.fromNullable(chat).pipe(\n Option.map((_) => get(Obj.atom(_))),\n Option.flatMapNullable((_) => _?.outline?.atom),\n Option.map(get),\n Option.getOrUndefined,\n ),\n ),\n [chat, outlineProp],\n ),\n );\n if (!outline) {\n return null;\n }\n\n return <TaskList {...props} outline={outline} ref={forwardedRef} />;\n },\n);\n\nChatTaskList.displayName = CHAT_TASK_LIST_NAME;\n\n//\n// Chat\n//\n\nexport const Chat = {\n Root: ChatRoot,\n Toolbar: ChatToolbar,\n Content: ChatContent,\n Prompt: ChatPrompt,\n Status: ChatStatus,\n Thread: ChatThread,\n Minimap: ChatMinimap,\n TaskList: ChatTaskList,\n};\n\nexport type {\n ChatContentProps,\n ChatEvent,\n ChatMinimapProps,\n ChatPromptProps,\n ChatRootProps,\n ChatThreadProps,\n ChatToolbarProps,\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useContext, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { type Database, Filter, type Obj, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { Connection, Connector, CONNECTOR_AUTH_GROUP_ID, connectorAuthActions } from '@dxos/plugin-connector';\nimport { Graph } from '@dxos/plugin-graph';\nimport { useActionRunner } from '@dxos/plugin-graph/hooks';\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { Menu, useGraphMenuActions } from '@dxos/react-ui-menu';\n\nimport { meta } from '#meta';\n\n/** Root node the connector-auth group hangs off in the component's local graph. */\nconst NODE_ID = 'connector-auth-root';\n\nexport type ConnectorAuthMenuProps = {\n /** Stable ids of the {@link Connector} entries this menu offers: existing connections from any of\n * them are offered for reuse, and each (with an auth flow) gets a \"Connect X\" entry. */\n connectorIds: readonly string[];\n /** Omitted when there is no active database yet (e.g. no space selected) — nothing is offered. */\n db: Database.Database | undefined;\n /** Existing local object to wire up as the new connection's first sync target. */\n existingTarget?: Ref.Ref<Obj.Unknown>;\n};\n\n/**\n * Standalone connector-auth menu: a trigger button that opens a dropdown of the same\n * {@link connectorAuthActions} owning plugins contribute to object toolbars. Existing\n * {@link Connection}s are offered for reuse (bind inline) alongside a \"Connect X\" entry per connector\n * with an auth flow. Renders nothing when there is nothing to offer.\n */\nexport const ConnectorAuthMenu = ({ connectorIds, db, existingTarget }: ConnectorAuthMenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n const registry = useContext(RegistryContext);\n const runAction = useActionRunner();\n const allConnectors = useCapabilities(Connector).flat();\n const allConnections = useQuery(db, Filter.type(Connection.Connection));\n\n const graph = useMemo(() => {\n if (!db) {\n return undefined;\n }\n const actions = connectorAuthActions({\n connectorIds,\n db,\n spaceId: db.spaceId,\n existingTarget,\n allConnectors,\n allConnections,\n });\n if (actions.length === 0) {\n return undefined;\n }\n const nextGraph = Graph.make({ registry });\n nextGraph.pipe(Graph.addNodes([{ id: NODE_ID, type: NODE_ID, data: null, properties: {}, actions }]));\n return nextGraph;\n }, [registry, connectorIds, db, existingTarget, allConnectors, allConnections]);\n\n // Read the group's children (reuse / connect entries) as the menu content.\n const menuActions = useGraphMenuActions(graph, CONNECTOR_AUTH_GROUP_ID);\n\n if (!graph) {\n return null;\n }\n\n return (\n <Menu.Root {...menuActions} onAction={runAction} attendableId={NODE_ID} alwaysActive>\n <Menu.Trigger asChild>\n <IconButton variant='ghost' icon='ph--plugs--regular' label={t('connect.label')} />\n </Menu.Trigger>\n <Menu.Content />\n </Menu.Root>\n );\n};\n\nConnectorAuthMenu.displayName = 'ConnectorAuthMenu';\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport React, { useMemo } from 'react';\n\nimport { Process } from '@dxos/compute';\nimport { Icon, IconButton, ScrollArea, Tooltip, composable, composableProps } from '@dxos/react-ui';\nimport { Treegrid, TREEGRID_PATH_SEPARATOR } from '@dxos/react-ui-list';\nimport { mx } from '@dxos/ui-theme';\nimport { Unit } from '@dxos/util';\n\nconst DEFAULT_DEPTH = 1;\n/** Extra label inset per nesting level (status icons stay aligned). */\nconst LABEL_INDENT_REM = 0.5;\n\n/** Nested subprocess rows (level > 1) only surface still-active processes. */\nconst NESTED_ACTIVE_STATES = new Set<Process.State>([\n Process.State.RUNNING,\n Process.State.HYBERNATING,\n Process.State.TERMINATING,\n]);\n\nexport type ProcessTreeProps = {\n // TODO(burdon): Atom.\n processes: readonly Process.Info[];\n /**\n * Maximum nesting depth from the root (1 = top-level processes only).\n *\n * @default 1\n */\n depth?: number;\n onProcessSelect?: (process: Process.Info) => void;\n onProcessTerminate?: (process: Process.Info) => void;\n};\n\ntype ProcessTreeRow = {\n process: Process.Info;\n path: string[];\n};\n\nexport const ProcessTree = React.memo(\n composable<HTMLDivElement, ProcessTreeProps>(\n ({ processes, depth = DEFAULT_DEPTH, onProcessSelect, onProcessTerminate, ...props }, forwardedRef) => {\n const rows = useMemo(() => buildProcessTreeRows(processes, depth), [processes, depth]);\n\n return (\n <ScrollArea.Root {...composableProps(props, { classNames: 'dx-expander' })} thin ref={forwardedRef}>\n <ScrollArea.Viewport>\n <Treegrid.Root classNames='grid grid-cols-[min-content_1fr_min-content_min-content]'>\n {rows.map(({ process, path }) => (\n <ProcessTreeRowView\n key={path.join(TREEGRID_PATH_SEPARATOR)}\n process={process}\n path={path}\n onProcessSelect={onProcessSelect}\n onProcessTerminate={onProcessTerminate}\n />\n ))}\n </Treegrid.Root>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n ),\n);\n\ntype ProcessTreeRowViewProps = {\n process: Process.Info;\n path: string[];\n onProcessSelect?: (process: Process.Info) => void;\n onProcessTerminate?: (process: Process.Info) => void;\n};\n\nconst ProcessTreeRowView = ({ process, path, onProcessSelect, onProcessTerminate }: ProcessTreeRowViewProps) => {\n const duration = Unit.Duration(process.metrics.wallTime);\n const level = path.length;\n const nested = level > 1;\n\n return (\n <Treegrid.Row\n id={path.join(TREEGRID_PATH_SEPARATOR)}\n classNames={mx('col-span-full grid grid-cols-subgrid gap-2 ps-1', onProcessSelect && 'dx-hover')}\n >\n <Treegrid.Cell classNames='flex items-center gap-0.5'>\n {nested && <Icon icon='ph--arrow-elbow-down-right--regular' size={3} classNames='shrink-0 text-subdued' />}\n <Tooltip.Trigger content={process.state.toString()}>\n <Icon\n size={4}\n synchronized\n classNames={mx(\n process.state === Process.State.RUNNING && 'animate-spin',\n process.state === Process.State.FAILED && 'text-error-text',\n process.state === Process.State.SUCCEEDED && 'text-success-text',\n )}\n icon={Match.value(process.state).pipe(\n Match.when(Process.State.RUNNING, () => 'ph--spinner-gap--regular'),\n Match.when(Process.State.SUCCEEDED, () => 'ph--check-circle--regular'),\n Match.when(Process.State.FAILED, () => 'ph--warning--regular'),\n Match.when(Process.State.HYBERNATING, () => 'ph--spinner--regular'),\n Match.when(Process.State.IDLE, () => 'ph--moon-stars--regular'),\n Match.when(Process.State.TERMINATING, () => 'ph--x-circle--regular'),\n Match.when(Process.State.TERMINATED, () => 'ph--x-circle--regular'),\n Match.orElse(() => 'ph--spinner-gap--regular'),\n )}\n />\n </Tooltip.Trigger>\n </Treegrid.Cell>\n <Treegrid.Cell\n classNames='flex items-center truncate'\n style={nested ? { paddingInlineStart: `${(level - 1) * LABEL_INDENT_REM}rem` } : undefined}\n onClick={() => onProcessSelect?.(process)}\n >\n <span\n className={mx(\n 'truncate text-sm',\n level === 1 && 'font-medium',\n process.state !== Process.State.RUNNING && 'text-description',\n )}\n >\n {process.params.name ?? process.pid.toString()}\n </span>\n </Treegrid.Cell>\n <Treegrid.Cell classNames='flex items-center justify-end text-xs text-description tabular-nums'>\n {[Process.State.FAILED, Process.State.SUCCEEDED].includes(process.state) && (\n <span className='whitespace-nowrap'>{duration.toString()}</span>\n )}\n </Treegrid.Cell>\n <Treegrid.Cell>\n {onProcessTerminate && (\n <IconButton\n classNames='min-h-0 p-1'\n icon='ph--x--regular'\n iconOnly\n variant='ghost'\n size={4}\n label='Actions'\n onClick={(event) => {\n event.stopPropagation();\n onProcessTerminate?.(process);\n }}\n />\n )}\n </Treegrid.Cell>\n </Treegrid.Row>\n );\n};\n\nconst sortProcesses = (processes: readonly Process.Info[]): Process.Info[] => {\n return [\n ...processes.filter((process) => [Process.State.RUNNING, Process.State.HYBERNATING].includes(process.state)),\n ...processes.filter((process) => [Process.State.IDLE].includes(process.state)).slice(0, 3),\n ...processes.filter((process) =>\n [Process.State.SUCCEEDED, Process.State.FAILED, Process.State.TERMINATED].includes(process.state),\n ),\n ].sort((left, right) => {\n const leftCompletedAt = Option.getOrElse(left.completedAt, () => Infinity);\n const rightCompletedAt = Option.getOrElse(right.completedAt, () => Infinity);\n return rightCompletedAt - leftCompletedAt;\n });\n};\n\nconst sortNestedActive = (processes: readonly Process.Info[]): Process.Info[] =>\n processes\n .filter((process) => NESTED_ACTIVE_STATES.has(process.state))\n .sort((left, right) => {\n const priority = (state: Process.State) =>\n state === Process.State.RUNNING ? 0 : state === Process.State.HYBERNATING ? 1 : 2;\n return priority(left.state) - priority(right.state);\n });\n\n/**\n * Flattens the process forest to a fixed depth. Rows are always shown expanded (no collapse).\n */\nconst buildProcessTreeRows = (processes: readonly Process.Info[], maxDepth: number): ProcessTreeRow[] => {\n const pidSet = new Set(processes.map((process) => String(process.pid)));\n const childrenByParent = new Map<string, Process.Info[]>();\n const roots: Process.Info[] = [];\n\n for (const process of processes) {\n const parent = process.parentPid;\n if (parent === null || !pidSet.has(String(parent))) {\n roots.push(process);\n continue;\n }\n const key = String(parent);\n const siblings = childrenByParent.get(key) ?? [];\n siblings.push(process);\n childrenByParent.set(key, siblings);\n }\n\n const sortedRoots = sortProcesses(roots);\n\n const rows: ProcessTreeRow[] = [];\n const visit = (process: Process.Info, path: string[], level: number) => {\n if (level > maxDepth) {\n return;\n }\n rows.push({ process, path });\n if (level >= maxDepth) {\n return;\n }\n const children = sortNestedActive(childrenByParent.get(String(process.pid)) ?? []);\n for (const child of children) {\n visit(child, [...path, String(child.pid)], level + 1);\n }\n };\n\n for (const root of sortedRoots) {\n visit(root, [String(root.pid)], 1);\n }\n return rows;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, useEffect, useState } from 'react';\n\nimport { type Skill } from '@dxos/compute';\nimport { Operation } from '@dxos/compute';\nimport { type Database, Filter, type Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { log } from '@dxos/log';\nimport { ScrollArea, type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { ServiceType } from '#types';\n\nimport { type AiChatProcessor } from '../../processor';\n\nexport type ToolboxProps = {\n services?: { service: ServiceType }[];\n functions?: Operation.PersistentOperation[];\n // TODO(burdon): Combine into single array.\n skills?: readonly Skill.Skill[];\n activeSkills?: readonly Ref.Ref<Skill.Skill>[];\n};\n\nexport const Toolbox = composable<HTMLDivElement, ToolboxProps>(\n ({ functions, services, skills, activeSkills, ...props }, forwardedRef) => {\n return (\n <ScrollArea.Root {...composableProps(props)} thin orientation='vertical' ref={forwardedRef}>\n <ScrollArea.Viewport>\n {skills && skills.length > 0 && (\n <Section\n title='Skills'\n items={skills.map(({ name, description, tools }) => ({\n name,\n description,\n subitems: tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {activeSkills && activeSkills.length > 0 && (\n <Section\n title='Skills'\n items={activeSkills.map(({ target }) => ({\n name: target?.name ?? '',\n description: target?.description ?? '',\n subitems: target?.tools.map((toolId) => ({ name: `∙ ${safeToolId(toolId)}` })),\n }))}\n />\n )}\n\n {services && services.length > 0 && (\n <Section\n title='Services'\n items={services.map(({ service: { serviceId, name, description } }) => ({\n name: name ?? serviceId,\n description,\n // subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),\n }))}\n />\n )}\n\n {functions && functions.length > 0 && (\n <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />\n )}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n);\n\nToolbox.displayName = 'Toolbox';\n\ntype SectionProps = {\n title: string;\n items: { name: string; description?: string; subitems?: { name: string; description?: string }[] }[];\n striped?: boolean;\n};\n\nconst Section = ({ title, items, striped }: SectionProps) => {\n const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';\n const gridClassNames = 'grid grid-cols-[8rem_1fr]';\n const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs px-2', striped && stripeClassNames);\n\n return (\n <div>\n <h1 className='px-2 text-sm'>{title}</h1>\n <div className={gridClassNames}>\n {items.map(({ name, description, subitems }, i) => (\n <Fragment key={i}>\n {name && (\n <div className={subGridClassNames}>\n <div className='truncate text-primary-500'>{name}</div>\n <div className='line-clamp-2'>{description}</div>\n </div>\n )}\n {subitems?.map(({ name, description }, i) => (\n <div key={i} className={mx(subGridClassNames, striped && stripeClassNames)}>\n <div className='truncate'>{name}</div>\n <div className='line-clamp-3 text-subdued'>{description}</div>\n </div>\n ))}\n </Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nexport type ToolboxPanelProps = ThemedClassName<{\n db?: Database.Database;\n processor?: AiChatProcessor;\n}>;\n\nexport const ToolboxPanel = ({ classNames, db, processor }: ToolboxPanelProps) => {\n // Registered services.\n const services = useQuery(db, Filter.type(ServiceType));\n const [serviceTools, setServiceTools] = useState<{ service: ServiceType }[]>([]);\n useEffect(() => {\n log('creating service tools...', { services: services.length });\n queueMicrotask(async () => {\n // TODO(burdon): Fix.\n // const tools = await Promise.all(\n // services.map(async (service) => ({ service, tools: await createToolsFromService(service) })),\n // );\n // setServiceTools(tools);\n });\n }, [services]);\n\n // Deployed functions.\n const functions = useQuery(db, Filter.type(Operation.PersistentOperation));\n\n return (\n <Toolbox\n classNames={classNames}\n skills={processor?.context.getSkills()}\n services={serviceTools}\n functions={functions}\n />\n );\n};\n\nconst safeToolId = (name: string) => {\n return name.split('_').pop();\n};\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { lazy } from "react";
2
+ //#region src/containers/index.ts
3
+ var AgentArticle = lazy(() => import("./chunk-AgentArticle.mjs"));
4
+ var AgentProperties = lazy(() => import("./chunk-AgentProperties.mjs"));
5
+ var AssistantSettings = lazy(() => import("./chunk-AssistantSettings.mjs"));
6
+ var ChatCompanion = lazy(() => import("./chunk-ChatCompanion.mjs"));
7
+ var ChatArticle = lazy(() => import("./chunk-ChatArticle.mjs").then((n) => n.t));
8
+ var ChatDialog = lazy(() => import("./chunk-ChatDialog.mjs"));
9
+ var IntegrationPrompt = lazy(() => import("./chunk-IntegrationPrompt.mjs"));
10
+ var SpaceHomePrompt = lazy(() => import("./chunk-SpaceHomePrompt.mjs"));
11
+ var SpaceHomeSuggestions = lazy(() => import("./chunk-SpaceHomeSuggestions.mjs"));
12
+ var TracePanel = lazy(() => import("./chunk-TracePanel2.mjs"));
13
+ var TriggerStatus = lazy(() => import("./chunk-TriggerStatus.mjs"));
14
+ //#endregion
15
+ export { AgentArticle, AgentProperties, AssistantSettings, ChatArticle, ChatCompanion, ChatDialog, IntegrationPrompt, SpaceHomePrompt, SpaceHomeSuggestions, TracePanel, TriggerStatus };
16
+
17
+ //# sourceMappingURL=containers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.mjs","names":[],"sources":["../../src/containers/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const AgentArticle: ComponentType<any> = lazy(() => import('./AgentArticle'));\nexport const AgentProperties: ComponentType<any> = lazy(() => import('./AgentProperties'));\nexport const AssistantSettings: ComponentType<any> = lazy(() => import('./AssistantSettings'));\nexport const ChatCompanion: ComponentType<any> = lazy(() => import('./ChatCompanion'));\nexport const ChatArticle: ComponentType<any> = lazy(() => import('./ChatArticle'));\nexport const ChatDialog: ComponentType<any> = lazy(() => import('./ChatDialog'));\nexport const IntegrationPrompt: ComponentType<any> = lazy(() => import('./IntegrationPrompt'));\nexport const SpaceHomePrompt: ComponentType<any> = lazy(() => import('./SpaceHomePrompt'));\nexport const SpaceHomeSuggestions: ComponentType<any> = lazy(() => import('./SpaceHomeSuggestions'));\nexport const TracePanel: ComponentType<any> = lazy(() => import('./TracePanel'));\nexport const TriggerStatus: ComponentType<any> = lazy(() => import('./TriggerStatus'));\n"],"mappings":";;AAMA,IAAa,eAAmC,WAAW,OAAO,2BAAiB;AACnF,IAAa,kBAAsC,WAAW,OAAO,8BAAoB;AACzF,IAAa,oBAAwC,WAAW,OAAO,gCAAsB;AAC7F,IAAa,gBAAoC,WAAW,OAAO,4BAAkB;AACrF,IAAa,cAAkC,WAAW,OAAO,0BAAgB,CAAA,MAAA,MAAA,EAAA,CAAA,CAAA;AACjF,IAAa,aAAiC,WAAW,OAAO,yBAAe;AAC/E,IAAa,oBAAwC,WAAW,OAAO,gCAAsB;AAC7F,IAAa,kBAAsC,WAAW,OAAO,8BAAoB;AACzF,IAAa,uBAA2C,WAAW,OAAO,mCAAyB;AACnG,IAAa,aAAiC,WAAW,OAAO,0BAAe;AAC/E,IAAa,gBAAoC,WAAW,OAAO,4BAAkB"}