@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,285 @@
1
+ import { a as resolveProvider, i as presetsForProvider } from "./chunk-processor.mjs";
2
+ import { Model, Provider } from "@dxos/ai";
3
+ import { EffectEx } from "@dxos/effect";
4
+ import { meta } from "#meta";
5
+ import { Assistant, AssistantCapabilities, Ollama } from "#types";
6
+ import { useCallback, useEffect, useMemo, useState } from "react";
7
+ import { IconButton, useTranslation } from "@dxos/react-ui";
8
+ import { Form, createSelectField } from "@dxos/react-ui-form";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { useAtomValue } from "@effect-atom/atom-react";
11
+ import { useOptionalCapability } from "@dxos/app-framework/ui";
12
+ import { Combobox } from "@dxos/react-ui-list";
13
+ import { List, ListItem } from "@dxos/react-list";
14
+ //#region src/containers/AssistantSettings/OllamaModels.tsx
15
+ /** Quick-pick model names (Ollama pull tags) sourced from the curated catalog. */
16
+ var QUICK_PICKS = Model.forProvider(Provider.ollama.id).map((model) => model.backend);
17
+ /** Poll interval for the loaded-into-memory set while the settings panel is open. */
18
+ var LOADED_POLL_INTERVAL = 3e3;
19
+ /**
20
+ * Manage locally-installed Ollama models. The {@link AssistantCapabilities.OllamaManager}
21
+ * capability is only contributed by the native (desktop) runtime, so this renders nothing in the
22
+ * browser/mobile. Split from the section body so hooks are never called conditionally.
23
+ */
24
+ var OllamaModels = () => {
25
+ const manager = useOptionalCapability(AssistantCapabilities.OllamaManager);
26
+ if (!manager) return null;
27
+ return /* @__PURE__ */ jsx(OllamaModelsSection, { manager });
28
+ };
29
+ var OllamaModelsSection = ({ manager }) => {
30
+ const { t } = useTranslation(meta.profile.key);
31
+ const state = useAtomValue(manager.state);
32
+ const [query, setQuery] = useState("");
33
+ const [open, setOpen] = useState(false);
34
+ const [pending, setPending] = useState({});
35
+ useEffect(() => {
36
+ EffectEx.runPromise(manager.refresh);
37
+ }, [manager]);
38
+ useEffect(() => {
39
+ const interval = setInterval(() => void EffectEx.runPromise(manager.refreshLoaded), LOADED_POLL_INTERVAL);
40
+ return () => clearInterval(interval);
41
+ }, [manager]);
42
+ const installed = new Set(state.models.map((model) => model.name));
43
+ const loaded = new Map(state.loaded.map((model) => [model.name, model]));
44
+ const pulling = Object.keys(state.pulls).filter((name) => !installed.has(name));
45
+ const withPending = useCallback((key, action) => async () => {
46
+ setPending((prev) => ({
47
+ ...prev,
48
+ [key]: true
49
+ }));
50
+ try {
51
+ await action();
52
+ } finally {
53
+ setPending((prev) => ({
54
+ ...prev,
55
+ [key]: false
56
+ }));
57
+ }
58
+ }, []);
59
+ const handlePull = useCallback((target) => {
60
+ const trimmed = target.trim();
61
+ if (trimmed.length === 0) return;
62
+ setQuery("");
63
+ setOpen(false);
64
+ withPending(trimmed, () => EffectEx.runPromise(manager.pull(trimmed)))();
65
+ }, [manager, withPending]);
66
+ const filter = query.trim();
67
+ const suggestions = QUICK_PICKS.filter((pick) => !installed.has(pick) && (filter === "" || pick.includes(filter)));
68
+ const offerCustom = filter.length > 0 && !installed.has(filter) && !suggestions.includes(filter);
69
+ const empty = state.models.length === 0 && pulling.length === 0;
70
+ return /* @__PURE__ */ jsxs(Form.Section, {
71
+ title: t("settings.ollama.title"),
72
+ children: [/* @__PURE__ */ jsx(Form.Row, {
73
+ label: t("settings.ollama.installed.label"),
74
+ children: state.kind === "failed" && state.error ? /* @__PURE__ */ jsx("p", {
75
+ className: "text-sm text-error-text",
76
+ children: t("settings.ollama.failed.message", { error: state.error })
77
+ }) : empty ? /* @__PURE__ */ jsx("p", {
78
+ className: "text-sm text-description",
79
+ children: t("settings.ollama.empty.message")
80
+ }) : /* @__PURE__ */ jsxs(List, {
81
+ variant: "unordered",
82
+ className: "flex flex-col gap-1 grow w-full text-left",
83
+ children: [state.models.map((model) => {
84
+ const running = loaded.get(model.name);
85
+ const error = state.errors[model.name];
86
+ const size = model.size != null ? formatBytes(model.size) : void 0;
87
+ const loadedLabel = running ? running.sizeVram ? t("settings.ollama.loaded.vram", { size: formatBytes(running.sizeVram) }) : t("settings.ollama.loaded.label") : void 0;
88
+ return /* @__PURE__ */ jsxs(ListItem, {
89
+ className: "flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full",
90
+ children: [/* @__PURE__ */ jsxs("div", {
91
+ className: "flex items-center gap-2",
92
+ children: [
93
+ /* @__PURE__ */ jsx("span", {
94
+ className: "grow truncate font-medium",
95
+ children: model.name
96
+ }),
97
+ /* @__PURE__ */ jsx(IconButton, {
98
+ icon: running ? "ph--eject--regular" : "ph--play--regular",
99
+ iconOnly: true,
100
+ label: running ? t("settings.ollama.unload.label") : t("settings.ollama.load.label"),
101
+ disabled: pending[model.name],
102
+ onClick: () => void withPending(model.name, () => EffectEx.runPromise(running ? manager.unload(model.name) : manager.load(model.name)))()
103
+ }),
104
+ /* @__PURE__ */ jsx(IconButton, {
105
+ icon: "ph--trash--regular",
106
+ iconOnly: true,
107
+ label: t("settings.ollama.remove.label"),
108
+ disabled: pending[model.name],
109
+ onClick: () => void withPending(model.name, () => EffectEx.runPromise(manager.remove(model.name)))()
110
+ })
111
+ ]
112
+ }), (size || loadedLabel || error) && /* @__PURE__ */ jsxs("div", {
113
+ className: "flex items-center gap-2 text-sm",
114
+ children: [
115
+ size && /* @__PURE__ */ jsx("span", {
116
+ className: "text-description",
117
+ children: size
118
+ }),
119
+ loadedLabel && /* @__PURE__ */ jsx("span", {
120
+ className: "text-success-text",
121
+ children: loadedLabel
122
+ }),
123
+ error && /* @__PURE__ */ jsx("span", {
124
+ className: "truncate text-error-text",
125
+ children: shortError(error)
126
+ })
127
+ ]
128
+ })]
129
+ }, model.name);
130
+ }), pulling.map((name) => {
131
+ const progress = state.pulls[name];
132
+ const status = progress?.total ? t("settings.ollama.pulling.message", { percent: percentOf(progress) }) : progress?.status ?? t("settings.ollama.pulling.label");
133
+ return /* @__PURE__ */ jsxs(ListItem, {
134
+ className: "flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full",
135
+ children: [/* @__PURE__ */ jsxs("div", {
136
+ className: "flex items-center gap-2",
137
+ children: [/* @__PURE__ */ jsx("span", {
138
+ className: "grow truncate font-medium text-description",
139
+ children: name
140
+ }), /* @__PURE__ */ jsx(IconButton, {
141
+ icon: "ph--x--regular",
142
+ iconOnly: true,
143
+ label: t("settings.ollama.cancel.label"),
144
+ onClick: () => void EffectEx.runPromise(manager.cancel(name))
145
+ })]
146
+ }), /* @__PURE__ */ jsx("span", {
147
+ className: "text-sm text-description",
148
+ children: status
149
+ })]
150
+ }, name);
151
+ })]
152
+ })
153
+ }), /* @__PURE__ */ jsxs(Form.Row, {
154
+ label: t("settings.ollama.pull.label"),
155
+ children: [Object.entries(state.errors).filter(([name]) => !installed.has(name)).map(([name, error]) => /* @__PURE__ */ jsxs("p", {
156
+ className: "text-xs text-error-text",
157
+ children: [
158
+ name,
159
+ ": ",
160
+ shortError(error)
161
+ ]
162
+ }, name)), /* @__PURE__ */ jsxs(Combobox.Root, {
163
+ open,
164
+ onOpenChange: setOpen,
165
+ value: "",
166
+ onValueChange: () => {},
167
+ placeholder: t("settings.ollama.pull.placeholder"),
168
+ children: [/* @__PURE__ */ jsx(Combobox.Trigger, { classNames: "w-full" }), /* @__PURE__ */ jsx(Combobox.Portal, { children: /* @__PURE__ */ jsxs(Combobox.Content, { children: [
169
+ /* @__PURE__ */ jsx(Combobox.Input, {
170
+ value: query,
171
+ onValueChange: setQuery,
172
+ placeholder: t("settings.ollama.pull.placeholder"),
173
+ onKeyDown: (event) => {
174
+ if (event.key === "Enter" && filter.length > 0) handlePull(filter);
175
+ }
176
+ }),
177
+ /* @__PURE__ */ jsxs(Combobox.List, { children: [offerCustom && /* @__PURE__ */ jsx(Combobox.Item, {
178
+ value: filter,
179
+ label: t("settings.ollama.pull-custom.label", { name: filter }),
180
+ icon: "ph--download-simple--regular",
181
+ onSelect: () => handlePull(filter)
182
+ }), suggestions.map((pick) => /* @__PURE__ */ jsx(Combobox.Item, {
183
+ value: pick,
184
+ label: pick,
185
+ onSelect: () => handlePull(pick)
186
+ }, pick))] }),
187
+ /* @__PURE__ */ jsx(Combobox.Arrow, {})
188
+ ] }) })]
189
+ })]
190
+ })]
191
+ });
192
+ };
193
+ /**
194
+ * Condense a verbose service error for inline display: drop Ollama's "(checked: <paths>)" path dump
195
+ * and cap the length. The full message is still logged to the console.
196
+ */
197
+ var shortError = (error) => {
198
+ const head = error.split(/\s*\(checked:/)[0].trim();
199
+ return head.length > 160 ? `${head.slice(0, 160)}…` : head;
200
+ };
201
+ /** Percent complete for an in-flight pull, or 0 when totals are not yet known. */
202
+ var percentOf = (progress) => progress && progress.total && progress.total > 0 ? Math.round((progress.completed ?? 0) / progress.total * 100) : 0;
203
+ var UNITS = [
204
+ "B",
205
+ "KB",
206
+ "MB",
207
+ "GB",
208
+ "TB"
209
+ ];
210
+ /** Human-readable byte size (binary units). */
211
+ var formatBytes = (bytes) => {
212
+ let value = bytes;
213
+ let unit = 0;
214
+ while (value >= 1024 && unit < UNITS.length - 1) {
215
+ value /= 1024;
216
+ unit += 1;
217
+ }
218
+ return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;
219
+ };
220
+ OllamaModels.displayName = "OllamaModels";
221
+ //#endregion
222
+ //#region src/containers/AssistantSettings/AssistantSettings.tsx
223
+ var presetOptions = (provider, installed) => presetsForProvider(provider).filter((preset) => !installed || installed.has(preset.backend)).map((preset) => ({
224
+ value: preset.model,
225
+ label: preset.label
226
+ }));
227
+ var AssistantSettings = ({ settings, onSettingsChange }) => {
228
+ const { t } = useTranslation(meta.profile.key);
229
+ const ollamaManager = useOptionalCapability(AssistantCapabilities.OllamaManager);
230
+ const localProvider = ollamaManager ? Provider.builtIn : Provider.ollama;
231
+ const localProviderKey = ollamaManager ? "built-in" : "ollama";
232
+ const localModels = useAtomValue(ollamaManager?.state ?? Ollama.emptyState);
233
+ const installed = useMemo(() => new Set(localModels.models.map((model) => model.name)), [localModels]);
234
+ const values = useMemo(() => ({
235
+ ...settings,
236
+ modelProvider: resolveProvider(settings.modelProvider, !!ollamaManager)
237
+ }), [settings, ollamaManager]);
238
+ const fieldMap = useMemo(() => ({
239
+ "modelProvider": createSelectField({
240
+ defaultLabel: null,
241
+ options: [
242
+ {
243
+ value: Provider.edge.id,
244
+ label: t("settings.provider.edge.label")
245
+ },
246
+ {
247
+ value: localProvider.id,
248
+ label: t(`settings.provider.${localProviderKey}.label`)
249
+ },
250
+ {
251
+ value: Provider.lmStudio.id,
252
+ label: t("settings.provider.lmstudio.label")
253
+ }
254
+ ]
255
+ }),
256
+ "modelDefaults.edge": createSelectField({ options: presetOptions(Provider.edge.id) }),
257
+ "modelDefaults.ollama": createSelectField({ options: presetOptions(localProvider.id, ollamaManager ? installed : void 0) }),
258
+ "modelDefaults.lmstudio": createSelectField({ options: presetOptions(Provider.lmStudio.id) })
259
+ }), [
260
+ t,
261
+ localProvider,
262
+ localProviderKey,
263
+ ollamaManager,
264
+ installed
265
+ ]);
266
+ return /* @__PURE__ */ jsx(Form.Root, {
267
+ variant: "settings",
268
+ schema: Assistant.Settings,
269
+ readonly: !onSettingsChange,
270
+ values,
271
+ onValuesChanged: (values) => onSettingsChange?.(() => values),
272
+ children: /* @__PURE__ */ jsx(Form.Viewport, {
273
+ scroll: true,
274
+ children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.Section, {
275
+ title: meta.profile.name ?? meta.profile.key,
276
+ children: /* @__PURE__ */ jsx(Form.FieldSet, { fieldMap })
277
+ }), /* @__PURE__ */ jsx(OllamaModels, {})] })
278
+ })
279
+ });
280
+ };
281
+ AssistantSettings.displayName = "AssistantSettings";
282
+ //#endregion
283
+ export { AssistantSettings as default };
284
+
285
+ //# sourceMappingURL=chunk-AssistantSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-AssistantSettings.mjs","names":[],"sources":["../../src/containers/AssistantSettings/OllamaModels.tsx","../../src/containers/AssistantSettings/AssistantSettings.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { Model, Provider } from '@dxos/ai';\nimport { useOptionalCapability } from '@dxos/app-framework/ui';\nimport { EffectEx } from '@dxos/effect';\nimport { List, ListItem } from '@dxos/react-list';\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { Combobox } from '@dxos/react-ui-list';\n\nimport { meta } from '#meta';\nimport { AssistantCapabilities, type Ollama } from '#types';\n\n/** Quick-pick model names (Ollama pull tags) sourced from the curated catalog. */\nconst QUICK_PICKS = Model.forProvider(Provider.ollama.id).map((model) => model.backend);\n\n/** Poll interval for the loaded-into-memory set while the settings panel is open. */\nconst LOADED_POLL_INTERVAL = 3_000;\n\n/**\n * Manage locally-installed Ollama models. The {@link AssistantCapabilities.OllamaManager}\n * capability is only contributed by the native (desktop) runtime, so this renders nothing in the\n * browser/mobile. Split from the section body so hooks are never called conditionally.\n */\nexport const OllamaModels = () => {\n const manager = useOptionalCapability(AssistantCapabilities.OllamaManager);\n if (!manager) {\n return null;\n }\n\n return <OllamaModelsSection manager={manager} />;\n};\n\nexport const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) => {\n const { t } = useTranslation(meta.profile.key);\n // Explicit subscription: the list and badges must re-render as pulls/installs/loads land.\n const state = useAtomValue(manager.state);\n const [query, setQuery] = useState('');\n const [open, setOpen] = useState(false);\n // UI-level gate keyed by model name, guaranteeing a visible busy state across the click handler.\n const [pending, setPending] = useState<Record<string, boolean>>({});\n\n // Ensure the sidecar is up and list installed models on mount.\n useEffect(() => {\n void EffectEx.runPromise(manager.refresh);\n }, [manager]);\n\n // Poll the loaded-into-memory set so the panel reflects which model is resident in real time.\n useEffect(() => {\n const interval = setInterval(() => void EffectEx.runPromise(manager.refreshLoaded), LOADED_POLL_INTERVAL);\n return () => clearInterval(interval);\n }, [manager]);\n\n const installed = new Set(state.models.map((model) => model.name));\n const loaded = new Map(state.loaded.map((model) => [model.name, model]));\n const pulling = Object.keys(state.pulls).filter((name) => !installed.has(name));\n\n const withPending = useCallback(\n (key: string, action: () => Promise<void>) => async () => {\n setPending((prev) => ({ ...prev, [key]: true }));\n try {\n await action();\n } finally {\n setPending((prev) => ({ ...prev, [key]: false }));\n }\n },\n [],\n );\n\n const handlePull = useCallback(\n (target: string) => {\n const trimmed = target.trim();\n if (trimmed.length === 0) {\n return;\n }\n setQuery('');\n setOpen(false);\n void withPending(trimmed, () => EffectEx.runPromise(manager.pull(trimmed)))();\n },\n [manager, withPending],\n );\n\n // Caller-driven filtering: curated picks not yet installed, matching the typed query.\n const filter = query.trim();\n const suggestions = QUICK_PICKS.filter((pick) => !installed.has(pick) && (filter === '' || pick.includes(filter)));\n const offerCustom = filter.length > 0 && !installed.has(filter) && !suggestions.includes(filter);\n const empty = state.models.length === 0 && pulling.length === 0;\n\n return (\n <Form.Section title={t('settings.ollama.title')}>\n <Form.Row label={t('settings.ollama.installed.label')}>\n {state.kind === 'failed' && state.error ? (\n // Connection-level failure has no associated model, so it shows inline as the row content.\n <p className='text-sm text-error-text'>{t('settings.ollama.failed.message', { error: state.error })}</p>\n ) : empty ? (\n <p className='text-sm text-description'>{t('settings.ollama.empty.message')}</p>\n ) : (\n // Plain `List`/`ListItem` (non-select), with the trigger editor's \"fatter\" two-line row\n // treatment: a name line plus a secondary meta line, on a surface-styled row. Rows are\n // actioned via their trailing buttons (no selection semantics).\n <List variant='unordered' className='flex flex-col gap-1 grow w-full text-left'>\n {state.models.map((model) => {\n const running = loaded.get(model.name);\n const error = state.errors[model.name];\n const size = model.size != null ? formatBytes(model.size) : undefined;\n const loadedLabel = running\n ? running.sizeVram\n ? t('settings.ollama.loaded.vram', { size: formatBytes(running.sizeVram) })\n : t('settings.ollama.loaded.label')\n : undefined;\n return (\n <ListItem\n key={model.name}\n className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'\n >\n <div className='flex items-center gap-2'>\n <span className='grow truncate font-medium'>{model.name}</span>\n <IconButton\n icon={running ? 'ph--eject--regular' : 'ph--play--regular'}\n iconOnly\n label={running ? t('settings.ollama.unload.label') : t('settings.ollama.load.label')}\n disabled={pending[model.name]}\n onClick={() =>\n void withPending(model.name, () =>\n EffectEx.runPromise(running ? manager.unload(model.name) : manager.load(model.name)),\n )()\n }\n />\n <IconButton\n icon='ph--trash--regular'\n iconOnly\n label={t('settings.ollama.remove.label')}\n disabled={pending[model.name]}\n onClick={() =>\n void withPending(model.name, () => EffectEx.runPromise(manager.remove(model.name)))()\n }\n />\n </div>\n {(size || loadedLabel || error) && (\n <div className='flex items-center gap-2 text-sm'>\n {size && <span className='text-description'>{size}</span>}\n {loadedLabel && <span className='text-success-text'>{loadedLabel}</span>}\n {error && <span className='truncate text-error-text'>{shortError(error)}</span>}\n </div>\n )}\n </ListItem>\n );\n })}\n {pulling.map((name) => {\n const progress = state.pulls[name];\n const status = progress?.total\n ? t('settings.ollama.pulling.message', { percent: percentOf(progress) })\n : (progress?.status ?? t('settings.ollama.pulling.label'));\n return (\n <ListItem key={name} className='flex flex-col gap-0.5 rounded-sm dx-input-surface px-2 py-1.5 w-full'>\n <div className='flex items-center gap-2'>\n <span className='grow truncate font-medium text-description'>{name}</span>\n <IconButton\n icon='ph--x--regular'\n iconOnly\n label={t('settings.ollama.cancel.label')}\n onClick={() => void EffectEx.runPromise(manager.cancel(name))}\n />\n </div>\n <span className='text-sm text-description'>{status}</span>\n </ListItem>\n );\n })}\n </List>\n )}\n </Form.Row>\n\n <Form.Row label={t('settings.ollama.pull.label')}>\n {/* Pull failures for not-yet-installed models surface here (no model row to attach to). */}\n {Object.entries(state.errors)\n .filter(([name]) => !installed.has(name))\n .map(([name, error]) => (\n <p key={name} className='text-xs text-error-text'>\n {name}: {shortError(error)}\n </p>\n ))}\n {/* Root value is held empty so the trigger always shows the placeholder; the live text is\n the separate `query` driving the input and suggestion filter. */}\n <Combobox.Root\n open={open}\n onOpenChange={setOpen}\n value=''\n onValueChange={() => {}}\n placeholder={t('settings.ollama.pull.placeholder')}\n >\n <Combobox.Trigger classNames='w-full' />\n <Combobox.Portal>\n <Combobox.Content>\n <Combobox.Input\n value={query}\n onValueChange={setQuery}\n placeholder={t('settings.ollama.pull.placeholder')}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && filter.length > 0) {\n handlePull(filter);\n }\n }}\n />\n <Combobox.List>\n {offerCustom && (\n <Combobox.Item\n value={filter}\n label={t('settings.ollama.pull-custom.label', { name: filter })}\n icon='ph--download-simple--regular'\n onSelect={() => handlePull(filter)}\n />\n )}\n {suggestions.map((pick) => (\n <Combobox.Item key={pick} value={pick} label={pick} onSelect={() => handlePull(pick)} />\n ))}\n </Combobox.List>\n <Combobox.Arrow />\n </Combobox.Content>\n </Combobox.Portal>\n </Combobox.Root>\n </Form.Row>\n </Form.Section>\n );\n};\n\n/**\n * Condense a verbose service error for inline display: drop Ollama's \"(checked: <paths>)\" path dump\n * and cap the length. The full message is still logged to the console.\n */\nconst shortError = (error: string): string => {\n const head = error.split(/\\s*\\(checked:/)[0].trim();\n return head.length > 160 ? `${head.slice(0, 160)}…` : head;\n};\n\n/** Percent complete for an in-flight pull, or 0 when totals are not yet known. */\nconst percentOf = (progress: Ollama.ModelsState['pulls'][string] | undefined): number =>\n progress && progress.total && progress.total > 0 ? Math.round(((progress.completed ?? 0) / progress.total) * 100) : 0;\n\nconst UNITS = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n/** Human-readable byte size (binary units). */\nconst formatBytes = (bytes: number): string => {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;\n};\n\nOllamaModels.displayName = 'OllamaModels';\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useMemo } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { useOptionalCapability } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type DXN } from '@dxos/keys';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form, type FormFieldMap, createSelectField } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Assistant, AssistantCapabilities, Ollama } from '#types';\n\nimport { presetsForProvider, resolveProvider } from '../../processor';\nimport { OllamaModels } from './OllamaModels';\n\nexport type AssistantSettingsProps = AppSurface.SettingsProps<Assistant.Settings>;\n\n// The per-provider model-default options must match the chat picker (usePresets): the catalog models\n// served by the provider, restricted to installed models when `installed` is supplied (local sidecar).\nconst presetOptions = (provider: DXN.DXN, installed?: ReadonlySet<string>) =>\n presetsForProvider(provider)\n .filter((preset) => !installed || installed.has(preset.backend))\n .map((preset) => ({ value: preset.model, label: preset.label }));\n\nexport const AssistantSettings = ({ settings, onSettingsChange }: AssistantSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n // The Ollama manager is the bundled sidecar (desktop only). Its presence selects the local\n // provider: the managed `built-in` vs. an external `ollama` server.\n const ollamaManager = useOptionalCapability(AssistantCapabilities.OllamaManager);\n const localProvider = ollamaManager ? Provider.builtIn : Provider.ollama;\n const localProviderKey = ollamaManager ? 'built-in' : 'ollama';\n\n // Installed models reported by the bundled sidecar; restricts the local default to present models.\n const localModels = useAtomValue(ollamaManager?.state ?? Ollama.emptyState);\n const installed = useMemo(() => new Set(localModels.models.map((model) => model.name)), [localModels]);\n\n // Reconcile a stored provider with the runtime (`ollama` → `built-in` on desktop) so the\n // dropdown shows a concrete, available selection rather than blank.\n const values = useMemo(\n () => ({ ...settings, modelProvider: resolveProvider(settings.modelProvider, !!ollamaManager) }),\n [settings, ollamaManager],\n );\n\n // Form `fieldMap` is keyed by dotted JSON path, so nested struct leaves are addressed directly.\n const fieldMap = useMemo<FormFieldMap>(\n () => ({\n // `defaultLabel: null` drops the sentinel \"Default\" option — a provider is always concrete.\n 'modelProvider': createSelectField({\n defaultLabel: null,\n options: [\n { value: Provider.edge.id, label: t('settings.provider.edge.label') },\n { value: localProvider.id, label: t(`settings.provider.${localProviderKey}.label`) },\n { value: Provider.lmStudio.id, label: t('settings.provider.lmstudio.label') },\n ],\n }),\n 'modelDefaults.edge': createSelectField({ options: presetOptions(Provider.edge.id) }),\n // `built-in` and `ollama` share the `ollama` default key; the managed sidecar restricts to installed.\n 'modelDefaults.ollama': createSelectField({\n options: presetOptions(localProvider.id, ollamaManager ? installed : undefined),\n }),\n 'modelDefaults.lmstudio': createSelectField({ options: presetOptions(Provider.lmStudio.id) }),\n }),\n [t, localProvider, localProviderKey, ollamaManager, installed],\n );\n\n return (\n <Form.Root\n variant='settings'\n schema={Assistant.Settings}\n readonly={!onSettingsChange}\n values={values}\n onValuesChanged={(values) => onSettingsChange?.(() => values)}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.FieldSet fieldMap={fieldMap} />\n </Form.Section>\n <OllamaModels />\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAssistantSettings.displayName = 'AssistantSettings';\n"],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { u as __exportAll } from "./chunk-types.mjs";
2
+ import { Capabilities } from "@dxos/app-framework";
3
+ import { Provider } from "@dxos/ai";
4
+ import { AssistantCapabilities } from "#types";
5
+ import { forwardRef, useCallback, useEffect, useRef } from "react";
6
+ import { useObject } from "@dxos/echo-react";
7
+ import { Panel } from "@dxos/react-ui";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { useChatProcessor, useChatServices, usePresets, useSelectionContext } from "#hooks";
10
+ import { useAtomCapability, useCapability, useOperationInvoker } from "@dxos/app-framework/ui";
11
+ import { Chat } from "#components";
12
+ import { getSpace } from "@dxos/client/echo";
13
+ import { ClientOperation } from "@dxos/plugin-client";
14
+ import { useRegistry } from "@dxos/react-client/echo";
15
+ //#region src/containers/ChatArticle/ChatArticle.tsx
16
+ var ChatArticle = forwardRef(({ role, attendableId, subject: chat, companionTo, onEvent, onSubmit }, forwardedRef) => {
17
+ const registry = useRegistry();
18
+ const settings = useAtomCapability(AssistantCapabilities.Settings);
19
+ const atomRegistry = useCapability(Capabilities.AtomRegistry);
20
+ const stateAtom = useCapability(AssistantCapabilities.State);
21
+ const space = getSpace(chat) ?? getSpace(companionTo);
22
+ const runtime = useChatServices({ id: space?.id });
23
+ const { preset, ...chatProps } = usePresets(settings);
24
+ const online = preset?.provider === Provider.edge.id;
25
+ const processor = useChatProcessor({
26
+ space,
27
+ chat,
28
+ preset,
29
+ runtime,
30
+ registry,
31
+ settings
32
+ });
33
+ const getContext = useSelectionContext(companionTo);
34
+ const [chatViewType] = useObject(chat, "viewType");
35
+ const viewType = chatViewType ?? settings.chatView;
36
+ const { invokePromise } = useOperationInvoker();
37
+ const handleViewUsage = useCallback(() => {
38
+ invokePromise(ClientOperation.OpenUsage, void 0);
39
+ }, [invokePromise]);
40
+ const pendingSubmitted = useRef(false);
41
+ useEffect(() => {
42
+ pendingSubmitted.current = false;
43
+ }, [attendableId]);
44
+ useEffect(() => {
45
+ if (!processor || !attendableId || pendingSubmitted.current) return;
46
+ const pendingPrompt = atomRegistry.get(stateAtom).pendingPrompts[attendableId];
47
+ if (pendingPrompt) {
48
+ pendingSubmitted.current = true;
49
+ atomRegistry.update(stateAtom, (current) => {
50
+ const { [attendableId]: _, ...rest } = current.pendingPrompts;
51
+ return {
52
+ ...current,
53
+ pendingPrompts: rest
54
+ };
55
+ });
56
+ processor.request({ message: pendingPrompt });
57
+ }
58
+ }, [
59
+ processor,
60
+ attendableId,
61
+ atomRegistry,
62
+ stateAtom
63
+ ]);
64
+ if (!processor) return null;
65
+ return /* @__PURE__ */ jsx(Chat.Root, {
66
+ chat,
67
+ db: space?.db,
68
+ processor,
69
+ getContext,
70
+ onEvent,
71
+ onSubmit,
72
+ children: /* @__PURE__ */ jsxs(Panel.Root, {
73
+ role,
74
+ ref: forwardedRef,
75
+ children: [/* @__PURE__ */ jsx(Panel.Toolbar, { children: /* @__PURE__ */ jsx(Chat.Toolbar, {
76
+ classNames: "dx-document",
77
+ attendableId,
78
+ companionTo
79
+ }) }), /* @__PURE__ */ jsx(Panel.Content, {
80
+ asChild: true,
81
+ children: /* @__PURE__ */ jsxs(Chat.Content, { children: [/* @__PURE__ */ jsxs("div", {
82
+ className: "dx-container relative",
83
+ children: [
84
+ viewType !== "summary" && /* @__PURE__ */ jsx(Chat.Minimap, { classNames: "absolute left-0 top-1/2 -translate-y-1/2 z-10" }),
85
+ /* @__PURE__ */ jsx(Chat.Thread, {
86
+ viewType,
87
+ onViewUsage: handleViewUsage
88
+ }),
89
+ viewType !== "summary" && /* @__PURE__ */ jsx("div", {
90
+ className: "absolute bottom-2 left-0 right-0",
91
+ children: /* @__PURE__ */ jsx("div", {
92
+ className: "dx-document px-4",
93
+ children: /* @__PURE__ */ jsx(Chat.Status, { classNames: "px-3 rounded-sm bg-group-surface" })
94
+ })
95
+ })
96
+ ]
97
+ }), /* @__PURE__ */ jsxs("div", {
98
+ className: "dx-document px-4 pb-4",
99
+ children: [/* @__PURE__ */ jsx("div", {
100
+ className: "flex flex-col items-center py-2 overflow-hidden",
101
+ children: /* @__PURE__ */ jsx(Chat.TaskList, { classNames: "max-h-[120px] border border-separator rounded-sm text-description" })
102
+ }), /* @__PURE__ */ jsx(Chat.Prompt, {
103
+ ...chatProps,
104
+ outline: true,
105
+ preset: preset?.id,
106
+ online,
107
+ companionTo
108
+ })]
109
+ })] })
110
+ })]
111
+ })
112
+ });
113
+ });
114
+ ChatArticle.displayName = "ChatArticle";
115
+ //#endregion
116
+ //#region src/containers/ChatArticle/index.ts
117
+ var ChatArticle_exports = /* @__PURE__ */ __exportAll({ default: () => ChatArticle });
118
+ //#endregion
119
+ export { ChatArticle as n, ChatArticle_exports as t };
120
+
121
+ //# sourceMappingURL=chunk-ChatArticle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ChatArticle.mjs","names":[],"sources":["../../src/containers/ChatArticle/ChatArticle.tsx","../../src/containers/ChatArticle/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useEffect, useRef } from 'react';\n\nimport { Provider } from '@dxos/ai';\nimport { Capabilities } from '@dxos/app-framework';\nimport { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { getSpace } from '@dxos/client/echo';\nimport { type Obj } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { ClientOperation } from '@dxos/plugin-client';\nimport { useRegistry } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\n\nimport { Chat as ChatComponent, type ChatRootProps } from '#components';\nimport { useChatProcessor, useChatServices, usePresets, useSelectionContext } from '#hooks';\nimport { type Assistant, AssistantCapabilities, type ChatType } from '#types';\n\nexport type ChatArticleProps = AppSurface.ObjectSectionProps<ChatType.Chat> & {\n companionTo?: Obj.Unknown;\n} & Pick<ChatRootProps, 'onEvent' | 'onSubmit'>;\n\nexport const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(\n ({ role, attendableId, subject: chat, companionTo, onEvent, onSubmit }, forwardedRef) => {\n const registry = useRegistry();\n const settings = useAtomCapability(AssistantCapabilities.Settings);\n const atomRegistry = useCapability(Capabilities.AtomRegistry);\n const stateAtom = useCapability(AssistantCapabilities.State);\n // Transient (pre-submit) chats have no database; fall back to the companion's space.\n const space = getSpace(chat) ?? getSpace(companionTo);\n const runtime = useChatServices({ id: space?.id });\n\n const { preset, ...chatProps } = usePresets(settings);\n // The provider is configured in settings; the chat surfaces it as a read-only online indicator.\n const online = preset?.provider === Provider.edge.id;\n const processor = useChatProcessor({ space, chat, preset, runtime, registry, settings });\n const getContext = useSelectionContext(companionTo);\n\n // Subscribe to the view type via `useObject` so the thread re-renders when ChatOptions changes it;\n // a direct `chat.viewType` read in render does not establish a reactive dependency.\n const [chatViewType] = useObject(chat, 'viewType');\n const viewType = (chatViewType as Assistant.ChatView | undefined) ?? settings.chatView;\n\n const { invokePromise } = useOperationInvoker();\n const handleViewUsage = useCallback(() => {\n void invokePromise(ClientOperation.OpenUsage, undefined);\n }, [invokePromise]);\n\n // Reset the one-shot guard when the target conversation changes, so a pending prompt for a new\n // `attendableId` is still auto-submitted within the same mount.\n const pendingSubmitted = useRef(false);\n useEffect(() => {\n pendingSubmitted.current = false;\n }, [attendableId]);\n\n useEffect(() => {\n if (!processor || !attendableId || pendingSubmitted.current) {\n return;\n }\n\n const state = atomRegistry.get(stateAtom);\n const pendingPrompt = state.pendingPrompts[attendableId];\n if (pendingPrompt) {\n pendingSubmitted.current = true;\n atomRegistry.update(stateAtom, (current) => {\n const { [attendableId]: _, ...rest } = current.pendingPrompts;\n return { ...current, pendingPrompts: rest };\n });\n\n void processor.request({ message: pendingPrompt });\n }\n }, [processor, attendableId, atomRegistry, stateAtom]);\n\n if (!processor) {\n return null;\n }\n\n return (\n <ChatComponent.Root\n chat={chat}\n db={space?.db}\n processor={processor}\n getContext={getContext}\n onEvent={onEvent}\n onSubmit={onSubmit}\n >\n <Panel.Root role={role} ref={forwardedRef}>\n <Panel.Toolbar>\n <ChatComponent.Toolbar classNames='dx-document' attendableId={attendableId} companionTo={companionTo} />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <ChatComponent.Content>\n <div className='dx-container relative'>\n {viewType !== 'summary' && (\n <ChatComponent.Minimap classNames='absolute left-0 top-1/2 -translate-y-1/2 z-10' />\n )}\n <ChatComponent.Thread viewType={viewType} onViewUsage={handleViewUsage} />\n {viewType !== 'summary' && (\n <div className='absolute bottom-2 left-0 right-0'>\n <div className='dx-document px-4'>\n <ChatComponent.Status classNames='px-3 rounded-sm bg-group-surface' />\n </div>\n </div>\n )}\n </div>\n <div className='dx-document px-4 pb-4'>\n <div className='flex flex-col items-center py-2 overflow-hidden'>\n <ChatComponent.TaskList classNames='max-h-[120px] border border-separator rounded-sm text-description' />\n </div>\n <ChatComponent.Prompt\n {...chatProps}\n outline\n preset={preset?.id}\n online={online}\n companionTo={companionTo}\n />\n </div>\n </ChatComponent.Content>\n </Panel.Content>\n </Panel.Root>\n </ChatComponent.Root>\n );\n },\n);\n\nChatArticle.displayName = 'ChatArticle';\n","//\n// Copyright 2025 DXOS.org\n//\n\nexport { ChatArticle as default } from './ChatArticle';\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAa,cAAc,YACxB,EAAE,MAAM,cAAc,SAAS,MAAM,aAAa,SAAS,YAAY,iBAAiB;CACvF,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,kBAAkB,sBAAsB,QAAQ;CACjE,MAAM,eAAe,cAAc,aAAa,YAAY;CAC5D,MAAM,YAAY,cAAc,sBAAsB,KAAK;CAE3D,MAAM,QAAQ,SAAS,IAAI,KAAK,SAAS,WAAW;CACpD,MAAM,UAAU,gBAAgB,EAAE,IAAI,OAAO,GAAG,CAAC;CAEjD,MAAM,EAAE,QAAQ,GAAG,cAAc,WAAW,QAAQ;CAEpD,MAAM,SAAS,QAAQ,aAAa,SAAS,KAAK;CAClD,MAAM,YAAY,iBAAiB;EAAE;EAAO;EAAM;EAAQ;EAAS;EAAU;CAAS,CAAC;CACvF,MAAM,aAAa,oBAAoB,WAAW;CAIlD,MAAM,CAAC,gBAAgB,UAAU,MAAM,UAAU;CACjD,MAAM,WAAY,gBAAmD,SAAS;CAE9E,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,kBAAkB,kBAAkB;EACxC,cAAmB,gBAAgB,WAAW,KAAA,CAAS;CACzD,GAAG,CAAC,aAAa,CAAC;CAIlB,MAAM,mBAAmB,OAAO,KAAK;CACrC,gBAAgB;EACd,iBAAiB,UAAU;CAC7B,GAAG,CAAC,YAAY,CAAC;CAEjB,gBAAgB;EACd,IAAI,CAAC,aAAa,CAAC,gBAAgB,iBAAiB,SAClD;EAIF,MAAM,gBADQ,aAAa,IAAI,SACT,CAAA,CAAM,eAAe;EAC3C,IAAI,eAAe;GACjB,iBAAiB,UAAU;GAC3B,aAAa,OAAO,YAAY,YAAY;IAC1C,MAAM,GAAG,eAAe,GAAG,GAAG,SAAS,QAAQ;IAC/C,OAAO;KAAE,GAAG;KAAS,gBAAgB;IAAK;GAC5C,CAAC;GAED,UAAe,QAAQ,EAAE,SAAS,cAAc,CAAC;EACnD;CACF,GAAG;EAAC;EAAW;EAAc;EAAc;CAAS,CAAC;CAErD,IAAI,CAAC,WACH,OAAO;CAGT,OACE,oBAAC,KAAc,MAAf;EACQ;EACN,IAAI,OAAO;EACA;EACC;EACH;EACC;YAEV,qBAAC,MAAM,MAAP;GAAkB;GAAM,KAAK;aAA7B,CACE,oBAAC,MAAM,SAAP,EAAA,UACE,oBAAC,KAAc,SAAf;IAAuB,YAAW;IAA4B;IAA2B;GAAc,CAAA,EAC1F,CAAA,GACf,oBAAC,MAAM,SAAP;IAAe,SAAA;cACb,qBAAC,KAAc,SAAf,EAAA,UAAA,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf;MACG,aAAa,aACZ,oBAAC,KAAc,SAAf,EAAuB,YAAW,gDAAiD,CAAA;MAErF,oBAAC,KAAc,QAAf;OAAgC;OAAU,aAAa;MAAkB,CAAA;MACxE,aAAa,aACZ,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,OAAD;QAAK,WAAU;kBACb,oBAAC,KAAc,QAAf,EAAsB,YAAW,mCAAoC,CAAA;OAClE,CAAA;MACF,CAAA;KAEJ;QACL,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,KAAc,UAAf,EAAwB,YAAW,oEAAqE,CAAA;KACrG,CAAA,GACL,oBAAC,KAAc,QAAf;MACE,GAAI;MACJ,SAAA;MACA,QAAQ,QAAQ;MACR;MACK;KACd,CAAA,CACE;MACgB,EAAA,CAAA;GACV,CAAA,CACL;;CACM,CAAA;AAExB,CACF;AAEA,YAAY,cAAc"}
@@ -0,0 +1,116 @@
1
+ import { n as ChatArticle } from "./chunk-ChatArticle.mjs";
2
+ import { AppAnnotation } from "@dxos/app-toolkit";
3
+ import { Project, Skill } from "@dxos/compute";
4
+ import { Chat } from "@dxos/assistant-toolkit";
5
+ import { Entity, Filter, Obj, Ref, Type } from "@dxos/echo";
6
+ import { AssistantOperation } from "#types";
7
+ import * as Option from "effect/Option";
8
+ import { forwardRef, useCallback, useEffect, useMemo } from "react";
9
+ import { useObject, useQuery } from "@dxos/echo-react";
10
+ import { useAsyncEffect } from "@dxos/react-ui";
11
+ import { jsx } from "react/jsx-runtime";
12
+ import { useContextBinder } from "#hooks";
13
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
14
+ import { getSpace } from "@dxos/client/echo";
15
+ import { SpaceOperation } from "@dxos/plugin-space";
16
+ import { useRegistry } from "@dxos/react-client/echo";
17
+ //#region src/containers/ChatCompanion/ChatCompanion.tsx
18
+ var ChatCompanion = forwardRef(({ role = "article", subject: chat, companionTo, attendableId }, forwardedRef) => {
19
+ const { invokePromise } = useOperationInvoker();
20
+ const db = Obj.getDatabase(companionTo);
21
+ useSkills$1({
22
+ subject: chat,
23
+ companionTo
24
+ });
25
+ return /* @__PURE__ */ jsx(ChatArticle, {
26
+ role,
27
+ subject: chat,
28
+ attendableId,
29
+ companionTo,
30
+ onSubmit: useCallback(async () => {
31
+ if (!db || !chat || Obj.getDatabase(chat)) return;
32
+ await invokePromise(SpaceOperation.AddObject, {
33
+ object: chat,
34
+ target: db
35
+ });
36
+ await invokePromise(SpaceOperation.AddRelation, {
37
+ db,
38
+ schema: Chat.CompanionTo,
39
+ source: chat,
40
+ target: companionTo
41
+ });
42
+ await invokePromise(AssistantOperation.SetCurrentChat, {
43
+ companionTo,
44
+ chat
45
+ });
46
+ await db.flush();
47
+ }, [
48
+ db,
49
+ chat,
50
+ companionTo,
51
+ invokePromise
52
+ ]),
53
+ ref: forwardedRef
54
+ });
55
+ });
56
+ /**
57
+ * Bind skills to the context.
58
+ */
59
+ var useSkills$1 = ({ subject: chat, companionTo }) => {
60
+ const registry = useRegistry();
61
+ const space = getSpace(companionTo);
62
+ const [feedSnapshot] = useObject(chat?.feed);
63
+ const binder = useContextBinder(space, Obj.getReactiveOrUndefined(feedSnapshot));
64
+ const skillKeys = useMemo(() => {
65
+ const schema = companionTo ? Obj.getType(companionTo) : void 0;
66
+ if (!schema) return [];
67
+ return Option.getOrElse(() => [])(AppAnnotation.SkillsAnnotation.get(Type.getSchema(schema)));
68
+ }, [companionTo]);
69
+ const existingSkills = useQuery(space?.db, Filter.type(Skill.Skill));
70
+ const pluginSkills = useMemo(() => existingSkills.filter((skill) => {
71
+ const key = Obj.getMeta(skill).key;
72
+ return key !== void 0 && skillKeys.includes(key);
73
+ }), [existingSkills, skillKeys]);
74
+ const [instructionsSnapshot] = useObject(Obj.instanceOf(Project.Project, companionTo) ? companionTo.instructions : void 0);
75
+ useEffect(() => {
76
+ if (!chat || chat.instructions || !Obj.instanceOf(Project.Project, companionTo)) return;
77
+ const instructionsRef = companionTo.instructions;
78
+ if (instructionsRef) Obj.update(chat, (chat) => {
79
+ chat.instructions = instructionsRef;
80
+ });
81
+ }, [
82
+ chat,
83
+ companionTo,
84
+ instructionsSnapshot
85
+ ]);
86
+ useAsyncEffect(async () => {
87
+ if (!binder?.isOpen) return;
88
+ if (skillKeys.length > 0) {
89
+ const registryKeys = skillKeys.filter((key) => {
90
+ const candidate = registry.list().find((e) => Entity.getMeta(e)?.key === key);
91
+ return candidate != null && Obj.instanceOf(Skill.Skill, candidate);
92
+ });
93
+ const dbForks = pluginSkills.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ""));
94
+ if (registryKeys.length > 0) await binder.bind({ skills: registryKeys.map((key) => Ref.fromURI(Skill.registryURI(key))) });
95
+ if (dbForks.length > 0) await binder.bind({ skills: dbForks.map((skill) => Ref.make(skill)) });
96
+ }
97
+ if (Obj.instanceOf(Skill.Skill, companionTo)) await binder.bind({ skills: [Ref.make(companionTo)] });
98
+ else await binder.bind({ objects: [Ref.make(companionTo)] });
99
+ if (Obj.instanceOf(Project.Project, companionTo)) {
100
+ const bindings = Project.contextBindings(companionTo);
101
+ if (bindings.skills.length > 0) await binder.bind({ skills: bindings.skills });
102
+ if (bindings.objects.length > 0) await binder.bind({ objects: bindings.objects });
103
+ }
104
+ }, [
105
+ binder,
106
+ skillKeys,
107
+ pluginSkills,
108
+ companionTo,
109
+ instructionsSnapshot
110
+ ]);
111
+ };
112
+ ChatCompanion.displayName = "ChatCompanion";
113
+ //#endregion
114
+ export { ChatCompanion as default };
115
+
116
+ //# sourceMappingURL=chunk-ChatCompanion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ChatCompanion.mjs","names":[],"sources":["../../src/containers/ChatCompanion/ChatCompanion.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { forwardRef, useCallback, useEffect, useMemo } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppAnnotation } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { getSpace } from '@dxos/client/echo';\nimport { Project, Skill } from '@dxos/compute';\nimport { Entity, Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { useRegistry } from '@dxos/react-client/echo';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { useContextBinder } from '#hooks';\nimport { AssistantOperation } from '#types';\n\nimport ChatArticle from '../ChatArticle';\n\nexport type ChatCompanionProps = AppSurface.ArticleProps<Chat.Chat, {}, Obj.Unknown>;\n\nexport const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(\n ({ role = 'article', subject: chat, companionTo, attendableId }, forwardedRef) => {\n const { invokePromise } = useOperationInvoker();\n const db = Obj.getDatabase(companionTo);\n useSkills({ subject: chat, companionTo });\n\n // Persist (and flush) a transient chat before the first request so the agent can resolve\n // the now-durable conversation feed; subsequent submits are a no-op once persisted.\n const handleSubmit = useCallback(async () => {\n if (!db || !chat || Obj.getDatabase(chat)) {\n return;\n }\n\n await invokePromise(SpaceOperation.AddObject, {\n object: chat,\n target: db,\n });\n await invokePromise(SpaceOperation.AddRelation, {\n db,\n schema: Chat.CompanionTo,\n source: chat,\n target: companionTo,\n });\n await invokePromise(AssistantOperation.SetCurrentChat, {\n companionTo,\n chat,\n });\n await db.flush();\n }, [db, chat, companionTo, invokePromise]);\n\n return (\n <ChatArticle\n role={role}\n subject={chat}\n attendableId={attendableId}\n companionTo={companionTo}\n onSubmit={handleSubmit}\n ref={forwardedRef}\n />\n );\n },\n);\n\n/**\n * Bind skills to the context.\n */\n// TODO(burdon): Why is this only in the companion?\nconst useSkills = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'subject' | 'companionTo'>) => {\n const registry = useRegistry();\n const space = getSpace(companionTo);\n const [feedSnapshot] = useObject(chat?.feed);\n const feedTarget = Obj.getReactiveOrUndefined(feedSnapshot);\n const binder = useContextBinder(space, feedTarget);\n\n const skillKeys = useMemo(() => {\n const schema = companionTo ? Obj.getType(companionTo) : undefined;\n if (!schema) {\n return [] as string[];\n }\n\n return Option.getOrElse(() => [] as string[])(AppAnnotation.SkillsAnnotation.get(Type.getSchema(schema)));\n }, [companionTo]);\n\n const existingSkills = useQuery(space?.db, Filter.type(Skill.Skill));\n const pluginSkills = useMemo(\n () =>\n existingSkills.filter((skill) => {\n const key = Obj.getMeta(skill).key;\n return key !== undefined && skillKeys.includes(key);\n }),\n [existingSkills, skillKeys],\n );\n\n // Subscribe so a project's instructions ref resolving after the project object itself (e.g. loading\n // over the wire) re-triggers the effects below, mirroring the `feedSnapshot` subscription above.\n const [instructionsSnapshot] = useObject(\n Obj.instanceOf(Project.Project, companionTo) ? companionTo.instructions : undefined,\n );\n\n // Steer the chat with the project's instructions BY REFERENCE (chat.instructions → system prompt at\n // request time). Also the lazy backfill: pre-existing project chats without the field pick it up here.\n useEffect(() => {\n if (!chat || chat.instructions || !Obj.instanceOf(Project.Project, companionTo)) {\n return;\n }\n const instructionsRef = companionTo.instructions;\n if (instructionsRef) {\n Obj.update(chat, (chat) => {\n chat.instructions = instructionsRef;\n });\n }\n }, [chat, companionTo, instructionsSnapshot]);\n\n useAsyncEffect(async () => {\n if (!binder?.isOpen) {\n return;\n }\n\n // Bind annotated skills: use key URI for registry skills (no DB clone needed).\n if (skillKeys.length > 0) {\n const registryKeys = skillKeys.filter((key) => {\n const candidate = registry.list().find((e) => Entity.getMeta(e)?.key === key);\n return candidate != null && Obj.instanceOf(Skill.Skill, candidate);\n });\n\n // DB-forked skills (in space but not in registry).\n const dbForks = pluginSkills.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ''));\n if (registryKeys.length > 0) {\n await binder.bind({ skills: registryKeys.map((key) => Ref.fromURI(Skill.registryURI(key))) });\n }\n if (dbForks.length > 0) {\n await binder.bind({ skills: dbForks.map((skill) => Ref.make(skill)) });\n }\n }\n\n if (Obj.instanceOf(Skill.Skill, companionTo)) {\n await binder.bind({ skills: [Ref.make(companionTo)] });\n } else {\n await binder.bind({ objects: [Ref.make(companionTo)] });\n }\n\n // Bind the project's skills and context objects into the session (instructions text travels\n // via chat.instructions, set above).\n if (Obj.instanceOf(Project.Project, companionTo)) {\n const bindings = Project.contextBindings(companionTo);\n if (bindings.skills.length > 0) {\n await binder.bind({ skills: bindings.skills });\n }\n if (bindings.objects.length > 0) {\n await binder.bind({ objects: bindings.objects });\n }\n }\n }, [binder, skillKeys, pluginSkills, companionTo, instructionsSnapshot]);\n};\n\nChatCompanion.displayName = 'ChatCompanion';\n"],"mappings":"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"}