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

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 (619) hide show
  1. package/PLUGIN.mdl +18 -24
  2. package/dist/lib/neutral/{AgentArticle-K7XM46OQ.mjs → AgentArticle-GV6EEW3I.mjs} +9 -8
  3. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +7 -0
  4. package/dist/lib/neutral/AssistantPlugin.mjs +1 -1
  5. package/dist/lib/neutral/AssistantPlugin.node.mjs +6 -6
  6. package/dist/lib/neutral/AssistantPlugin.node.mjs.map +3 -3
  7. package/dist/lib/neutral/AssistantPlugin.workerd.mjs +7 -34
  8. package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +4 -4
  9. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +302 -0
  10. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +7 -0
  11. package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs → ChatArticle-OO7GGEFW.mjs} +2 -2
  12. package/dist/lib/neutral/{ChatCompanion-LBUHYWQG.mjs → ChatCompanion-GIFJRY6I.mjs} +28 -28
  13. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +7 -0
  14. package/dist/lib/neutral/{ChatDialog-DCA6FLOV.mjs → ChatDialog-5MXN4MXS.mjs} +9 -8
  15. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +7 -0
  16. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +72 -0
  17. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +7 -0
  18. package/dist/lib/neutral/{PlanArticle-TS5ULWYS.mjs → PlanArticle-VPK2IYWU.mjs} +8 -2
  19. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +7 -0
  20. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +114 -0
  21. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +7 -0
  22. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +63 -0
  23. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +7 -0
  24. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +12 -0
  25. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +7 -0
  26. package/dist/lib/neutral/{TriggerStatus-X7Y5JFZJ.mjs → TriggerStatus-FURRBHYA.mjs} +9 -7
  27. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +7 -0
  28. package/dist/lib/neutral/{agent-hydrator-PJBYVMBW.mjs → agent-hydrator-OBO3RHLO.mjs} +3 -4
  29. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +7 -0
  30. package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs → agent-service-XFJ4VQMT.mjs} +6 -6
  31. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +7 -0
  32. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs +14 -0
  33. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +7 -0
  34. package/dist/lib/neutral/{ai-service-AADUIKBY.mjs → ai-service-DM6YXWUC.mjs} +9 -5
  35. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +7 -0
  36. package/dist/lib/neutral/{app-graph-builder-WUFHQH3Y.mjs → app-graph-builder-OPVOEQY7.mjs} +45 -28
  37. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +7 -0
  38. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +97 -0
  39. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +7 -0
  40. package/dist/lib/neutral/capabilities/index.mjs +21 -19
  41. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  42. package/dist/lib/neutral/{chunk-KLYLW4WH.mjs → chunk-5IHQ52KJ.mjs} +1 -1
  43. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +7 -0
  44. package/dist/lib/neutral/{chunk-YXRGZYYH.mjs → chunk-6Q4OBGIK.mjs} +87 -59
  45. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-BXI2R4OO.mjs +410 -0
  47. package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +7 -0
  48. package/dist/lib/neutral/{chunk-5H6UJHLF.mjs → chunk-CMPLPDYE.mjs} +12 -12
  49. package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GPHT3HYS.mjs +8 -0
  51. package/dist/lib/neutral/{chunk-SMFJD7BP.mjs.map → chunk-GPHT3HYS.mjs.map} +2 -2
  52. package/dist/lib/neutral/chunk-HKLSFB5I.mjs +90 -0
  53. package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-L7AR4VTA.mjs +53 -0
  55. package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LS72HWMM.mjs +42 -0
  57. package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-HLANPOBA.mjs → chunk-OZWZGIV2.mjs} +5 -3
  59. package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +7 -0
  60. package/dist/lib/neutral/{toolkit-GVWXPDLJ.mjs → chunk-QOKLFHUS.mjs} +3 -4
  61. package/dist/lib/neutral/{toolkit-GVWXPDLJ.mjs.map → chunk-QOKLFHUS.mjs.map} +1 -1
  62. package/dist/lib/neutral/{TracePanel-KTZJ6JNR.mjs → chunk-SCTHQVIJ.mjs} +11 -23
  63. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-U4LTLBAX.mjs +56 -0
  65. package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-RKVVK3R3.mjs → chunk-UPKFUZ6V.mjs} +22 -17
  67. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +7 -0
  68. package/dist/lib/neutral/{operation-handler-SF36MOB5.mjs → chunk-V2Y4XE3O.mjs} +3 -4
  69. package/dist/lib/neutral/{operation-handler-SF36MOB5.mjs.map → chunk-V2Y4XE3O.mjs.map} +1 -1
  70. package/dist/lib/neutral/chunk-XVGEJWJX.mjs +133 -0
  71. package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +7 -0
  72. package/dist/lib/neutral/{companion-chat-provisioner-YZZ73P6E.mjs → companion-chat-provisioner-IQV5VIVE.mjs} +14 -8
  73. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +7 -0
  74. package/dist/lib/neutral/components/index.mjs +749 -632
  75. package/dist/lib/neutral/components/index.mjs.map +4 -4
  76. package/dist/lib/neutral/{integration-provider-RBD3AFJU.mjs → connector-ITLLTBPZ.mjs} +13 -14
  77. package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +7 -0
  78. package/dist/lib/neutral/containers/index.mjs +15 -13
  79. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  80. package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs → create-chat-YGVZZYGP.mjs} +18 -16
  81. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +7 -0
  82. package/dist/lib/neutral/{create-object-U2SOFZLR.mjs → create-object-5PAEJ6KM.mjs} +11 -27
  83. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +7 -0
  84. package/dist/lib/neutral/{edge-model-resolver-BBVOJBGJ.mjs → edge-model-resolver-WDJWDZTT.mjs} +2 -2
  85. package/dist/lib/neutral/execution-graph/index.mjs +336 -62
  86. package/dist/lib/neutral/execution-graph/index.mjs.map +4 -4
  87. package/dist/lib/neutral/extensions/index.mjs +8 -0
  88. package/dist/lib/neutral/{fork-chat-34KEF4ZJ.mjs → fork-chat-RMAAYYQF.mjs} +16 -19
  89. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +7 -0
  90. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +93 -0
  91. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +7 -0
  92. package/dist/lib/neutral/hooks/index.mjs +393 -508
  93. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  94. package/dist/lib/neutral/index.mjs +14 -10
  95. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +41 -0
  96. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +7 -0
  97. package/dist/lib/neutral/meta.json +1 -1
  98. package/dist/lib/neutral/meta.mjs +1 -1
  99. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +18 -0
  100. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +7 -0
  101. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +8 -0
  102. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +7 -0
  103. package/dist/lib/neutral/operations/index.mjs +1 -1
  104. package/dist/lib/neutral/plugin.mjs +2 -2
  105. package/dist/lib/neutral/plugin.workerd.mjs +13 -0
  106. package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
  107. package/dist/lib/neutral/{react-surface-XRTBW5OJ.mjs → react-surface-HEJEK44F.mjs} +42 -45
  108. package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +7 -0
  109. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +28 -0
  110. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +7 -0
  111. package/dist/lib/neutral/{run-prompt-in-new-chat-D5IIE2C7.mjs → run-prompt-in-new-chat-RNUJE2FM.mjs} +31 -31
  112. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +7 -0
  113. package/dist/lib/neutral/{settings-W4BLWQ53.mjs → settings-7Q3RITIT.mjs} +3 -3
  114. package/dist/lib/neutral/{settings-W4BLWQ53.mjs.map → settings-7Q3RITIT.mjs.map} +3 -3
  115. package/dist/lib/neutral/skill-definition-553MQRTR.mjs +8 -0
  116. package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +7 -0
  117. package/dist/lib/neutral/skills/index.mjs +8 -0
  118. package/dist/lib/neutral/skills/index.mjs.map +7 -0
  119. package/dist/lib/neutral/{state-H3G7QCU6.mjs → state-4LGAKSSD.mjs} +9 -3
  120. package/dist/lib/neutral/state-4LGAKSSD.mjs.map +7 -0
  121. package/dist/lib/neutral/testing.mjs +1 -1
  122. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +8 -0
  123. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +7 -0
  124. package/dist/lib/neutral/translations.mjs +69 -31
  125. package/dist/lib/neutral/translations.mjs.map +3 -3
  126. package/dist/lib/neutral/types/index.mjs +5 -1
  127. package/dist/lib/neutral/{update-chat-name-Y7JWIP64.mjs → update-chat-name-IJJELRR6.mjs} +3 -3
  128. package/dist/lib/neutral/{update-chat-name-Y7JWIP64.mjs.map → update-chat-name-IJJELRR6.mjs.map} +2 -2
  129. package/dist/types/dx.config.d.ts +28 -0
  130. package/dist/types/dx.config.d.ts.map +1 -0
  131. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  132. package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
  133. package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
  134. package/dist/types/src/capabilities/agent-service.d.ts +1 -2
  135. package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/ai-context.d.ts +1 -2
  137. package/dist/types/src/capabilities/ai-context.d.ts.map +1 -1
  138. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -3
  139. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  140. package/dist/types/src/capabilities/automation-templates.d.ts +1 -2
  141. package/dist/types/src/capabilities/automation-templates.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
  143. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/{integration-provider.d.ts → connector.d.ts} +2 -2
  145. package/dist/types/src/capabilities/connector.d.ts.map +1 -0
  146. package/dist/types/src/capabilities/create-object.d.ts +1 -27
  147. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  148. package/dist/types/src/capabilities/index.d.ts +18 -57
  149. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  151. package/dist/types/src/capabilities/migrations.d.ts +1 -2
  152. package/dist/types/src/capabilities/migrations.d.ts.map +1 -1
  153. package/dist/types/src/capabilities/navigation-resolver.d.ts +5 -0
  154. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
  155. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  156. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  157. package/dist/types/src/capabilities/settings.d.ts +1 -2
  158. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  159. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  160. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  161. package/dist/types/src/capabilities/state.d.ts +1 -17
  162. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  163. package/dist/types/src/capabilities/toolkit.d.ts +1 -2
  164. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  165. package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/Chat/Chat.d.ts +10 -8
  167. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  168. package/dist/types/src/components/Chat/Chat.stories.d.ts +32 -0
  169. package/dist/types/src/components/Chat/Chat.stories.d.ts.map +1 -0
  170. package/dist/types/src/components/Chat/events.d.ts +0 -4
  171. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  172. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +2 -2
  173. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  174. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  175. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +2 -2
  176. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  177. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -5
  178. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
  179. package/dist/types/src/components/ChatPrompt/useChatVoiceInput.d.ts +9 -0
  180. package/dist/types/src/components/ChatPrompt/useChatVoiceInput.d.ts.map +1 -0
  181. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +4 -4
  182. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  183. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts +2 -2
  184. package/dist/types/src/components/ChatThread/MarkdownStream.stories.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/widgets/ReasoningWidget.stories.d.ts +2 -2
  187. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ChatThread/widgets/SurfaceWidget.d.ts +11 -0
  189. package/dist/types/src/components/ChatThread/widgets/SurfaceWidget.d.ts.map +1 -0
  190. package/dist/types/src/components/ChatThread/widgets/index.d.ts +1 -0
  191. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  192. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +6 -0
  193. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  194. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +1 -0
  195. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  196. package/dist/types/src/components/TaskList/TaskList.d.ts +8 -0
  197. package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
  198. package/dist/types/src/components/TaskList/TaskList.stories.d.ts +5 -2
  199. package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
  201. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  202. package/dist/types/src/components/index.d.ts +1 -4
  203. package/dist/types/src/components/index.d.ts.map +1 -1
  204. package/dist/types/src/constants.d.ts +1 -1
  205. package/dist/types/src/constants.d.ts.map +1 -1
  206. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts +2 -2
  207. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  208. package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.d.ts +1 -1
  209. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -0
  210. package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  211. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +12 -0
  212. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -0
  213. package/dist/types/src/{components/TemplateEditor/TemplateEditor.stories.d.ts → containers/AssistantSettings/OllamaModels.stories.d.ts} +9 -7
  214. package/dist/types/src/containers/AssistantSettings/OllamaModels.stories.d.ts.map +1 -0
  215. package/dist/types/src/{components → containers}/AssistantSettings/index.d.ts.map +1 -1
  216. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts +3 -10
  217. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  218. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +4 -11
  219. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
  220. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  221. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +13 -0
  222. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -0
  223. package/dist/types/src/containers/IntegrationPrompt/index.d.ts +2 -0
  224. package/dist/types/src/{components/RoutineProperties → containers/IntegrationPrompt}/index.d.ts.map +1 -1
  225. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -1
  226. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +15 -0
  227. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -0
  228. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts +2 -0
  229. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts.map +1 -0
  230. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +13 -0
  231. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -0
  232. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts +2 -0
  233. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts.map +1 -0
  234. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  235. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  236. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts +1 -1
  237. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts.map +1 -1
  238. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  239. package/dist/types/src/containers/index.d.ts +4 -3
  240. package/dist/types/src/containers/index.d.ts.map +1 -1
  241. package/dist/types/src/execution-graph/execution-graph.d.ts +20 -1
  242. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  243. package/dist/types/src/execution-graph/index.d.ts +3 -2
  244. package/dist/types/src/execution-graph/index.d.ts.map +1 -1
  245. package/dist/types/src/execution-graph/pending-block-status.d.ts +26 -0
  246. package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -0
  247. package/dist/types/src/execution-graph/pending-block-status.test.d.ts +2 -0
  248. package/dist/types/src/execution-graph/pending-block-status.test.d.ts.map +1 -0
  249. package/dist/types/src/execution-graph/span-tree.d.ts +13 -0
  250. package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
  251. package/dist/types/src/extensions/index.d.ts +1 -1
  252. package/dist/types/src/extensions/index.d.ts.map +1 -1
  253. package/dist/types/src/extensions/prompt-extension.d.ts +1 -1
  254. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
  255. package/dist/types/src/feed-logger.d.ts +3 -2
  256. package/dist/types/src/feed-logger.d.ts.map +1 -1
  257. package/dist/types/src/hooks/index.d.ts +4 -2
  258. package/dist/types/src/hooks/index.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  260. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  261. package/dist/types/src/hooks/useHomeSuggestions.d.ts +8 -0
  262. package/dist/types/src/hooks/useHomeSuggestions.d.ts.map +1 -0
  263. package/dist/types/src/hooks/usePresets.d.ts +6 -2
  264. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  265. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts +10 -0
  266. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts.map +1 -0
  267. package/dist/types/src/hooks/useSkillRegistry.d.ts +21 -0
  268. package/dist/types/src/hooks/useSkillRegistry.d.ts.map +1 -0
  269. package/dist/types/src/hooks/useTraceMessages.d.ts +12 -0
  270. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -0
  271. package/dist/types/src/index.d.ts +1 -1
  272. package/dist/types/src/index.d.ts.map +1 -1
  273. package/dist/types/src/meta.d.ts +32 -2
  274. package/dist/types/src/meta.d.ts.map +1 -1
  275. package/dist/types/src/operations/create-chat.d.ts.map +1 -1
  276. package/dist/types/src/operations/fork-chat.d.ts.map +1 -1
  277. package/dist/types/src/operations/generate-home-suggestions.d.ts +5 -0
  278. package/dist/types/src/operations/generate-home-suggestions.d.ts.map +1 -0
  279. package/dist/types/src/operations/generate-home-suggestions.test.d.ts +2 -0
  280. package/dist/types/src/operations/generate-home-suggestions.test.d.ts.map +1 -0
  281. package/dist/types/src/operations/index.d.ts.map +1 -1
  282. package/dist/types/src/operations/resolve-navigation-targets.d.ts +3 -15
  283. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -1
  284. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +2 -2
  285. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
  286. package/dist/types/src/paths.d.ts +1 -1
  287. package/dist/types/src/paths.d.ts.map +1 -1
  288. package/dist/types/src/plugin.workerd.d.ts +2 -0
  289. package/dist/types/src/plugin.workerd.d.ts.map +1 -0
  290. package/dist/types/src/processor/presets.d.ts +20 -9
  291. package/dist/types/src/processor/presets.d.ts.map +1 -1
  292. package/dist/types/src/processor/processor.d.ts +33 -209
  293. package/dist/types/src/processor/processor.d.ts.map +1 -1
  294. package/dist/types/src/skills/assistant/index.d.ts +2 -0
  295. package/dist/types/src/skills/assistant/index.d.ts.map +1 -0
  296. package/dist/types/src/skills/assistant/skill.d.ts +4 -0
  297. package/dist/types/src/skills/assistant/skill.d.ts.map +1 -0
  298. package/dist/types/src/skills/assistant/skill.node.test.d.ts +2 -0
  299. package/dist/types/src/skills/assistant/skill.node.test.d.ts.map +1 -0
  300. package/dist/types/src/skills/index.d.ts.map +1 -0
  301. package/dist/types/src/templates/daily-digest.d.ts +2 -2
  302. package/dist/types/src/templates/daily-digest.d.ts.map +1 -1
  303. package/dist/types/src/templates/index.d.ts +3 -3
  304. package/dist/types/src/templates/index.d.ts.map +1 -1
  305. package/dist/types/src/templates/research-brief.d.ts +2 -2
  306. package/dist/types/src/templates/research-brief.d.ts.map +1 -1
  307. package/dist/types/src/templates/routine-templates.test.d.ts +2 -0
  308. package/dist/types/src/templates/routine-templates.test.d.ts.map +1 -0
  309. package/dist/types/src/templates/scaffold.d.ts +9 -9
  310. package/dist/types/src/templates/scaffold.d.ts.map +1 -1
  311. package/dist/types/src/testing/test-generator.d.ts +1 -1
  312. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  313. package/dist/types/src/testing/test-sequence.d.ts +1 -8
  314. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  315. package/dist/types/src/testing/test-trace.d.ts.map +1 -1
  316. package/dist/types/src/translations.d.ts.map +1 -1
  317. package/dist/types/src/types/Assistant.d.ts +5 -12
  318. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  319. package/dist/types/src/types/AssistantCapabilities.d.ts +21 -0
  320. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  321. package/dist/types/src/types/AssistantEvents.d.ts.map +1 -1
  322. package/dist/types/src/types/AssistantOperation.d.ts +17 -110
  323. package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
  324. package/dist/types/src/types/ChatSurface.d.ts +12 -0
  325. package/dist/types/src/types/ChatSurface.d.ts.map +1 -0
  326. package/dist/types/src/types/Ollama.d.ts +44 -0
  327. package/dist/types/src/types/Ollama.d.ts.map +1 -0
  328. package/dist/types/src/types/Settings.d.ts +5 -4
  329. package/dist/types/src/types/Settings.d.ts.map +1 -1
  330. package/dist/types/src/types/index.d.ts +2 -0
  331. package/dist/types/src/types/index.d.ts.map +1 -1
  332. package/dist/types/src/types/service.d.ts +4 -3
  333. package/dist/types/src/types/service.d.ts.map +1 -1
  334. package/dist/types/src/util/error-cause.d.ts +3 -0
  335. package/dist/types/src/util/error-cause.d.ts.map +1 -0
  336. package/dist/types/src/util/suggestions.d.ts +1 -1
  337. package/dist/types/tsconfig.tsbuildinfo +1 -1
  338. package/dx.config.ts +38 -0
  339. package/package.json +103 -90
  340. package/src/AssistantPlugin.conversations.json +1 -1
  341. package/src/AssistantPlugin.node.ts +5 -5
  342. package/src/AssistantPlugin.test.ts +27 -41
  343. package/src/AssistantPlugin.ts +14 -12
  344. package/src/AssistantPlugin.workerd.ts +15 -6
  345. package/src/capabilities/agent-hydrator.ts +1 -2
  346. package/src/capabilities/agent-service.ts +7 -5
  347. package/src/capabilities/ai-context.ts +7 -32
  348. package/src/capabilities/ai-service.ts +3 -2
  349. package/src/capabilities/app-graph-builder.ts +43 -28
  350. package/src/capabilities/automation-templates.ts +3 -3
  351. package/src/capabilities/companion-chat-provisioner.ts +22 -6
  352. package/src/capabilities/{integration-provider.ts → connector.ts} +7 -12
  353. package/src/capabilities/create-object.ts +9 -26
  354. package/src/capabilities/index.ts +4 -12
  355. package/src/capabilities/markdown-extension.ts +7 -4
  356. package/src/capabilities/navigation-resolver.ts +20 -0
  357. package/src/capabilities/react-surface.tsx +55 -52
  358. package/src/capabilities/settings.ts +2 -2
  359. package/src/capabilities/skill-definition.ts +72 -0
  360. package/src/capabilities/state.ts +8 -1
  361. package/src/components/AgentProperties/AgentProperties.stories.tsx +1 -2
  362. package/src/components/AgentProperties/AgentProperties.tsx +1 -1
  363. package/src/components/Chat/Chat.stories.tsx +94 -0
  364. package/src/components/Chat/Chat.tsx +67 -16
  365. package/src/components/Chat/events.ts +0 -6
  366. package/src/components/ChatPrompt/ChatActions.tsx +185 -20
  367. package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
  368. package/src/components/ChatPrompt/ChatOptions.stories.tsx +3 -3
  369. package/src/components/ChatPrompt/ChatOptions.tsx +43 -50
  370. package/src/components/ChatPrompt/ChatPrompt.tsx +31 -47
  371. package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
  372. package/src/components/ChatPrompt/useChatVoiceInput.ts +103 -0
  373. package/src/components/ChatThread/Anchor.stories.tsx +1 -1
  374. package/src/components/ChatThread/ChatThread.stories.tsx +7 -16
  375. package/src/components/ChatThread/DEBUG.md +23 -0
  376. package/src/components/ChatThread/MarkdownStream.stories.tsx +3 -3
  377. package/src/components/ChatThread/registry.tsx +43 -17
  378. package/src/components/ChatThread/widgets/ReasoningWidget.stories.tsx +2 -2
  379. package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
  380. package/src/components/ChatThread/widgets/SurfaceWidget.tsx +41 -0
  381. package/src/components/ChatThread/widgets/ToolWidget.tsx +1 -1
  382. package/src/components/ChatThread/widgets/index.ts +1 -0
  383. package/src/components/ProcessTree/ProcessTree.stories.tsx +7 -0
  384. package/src/components/ProcessTree/ProcessTree.tsx +183 -88
  385. package/src/components/TaskList/TaskList.stories.tsx +24 -3
  386. package/src/components/TaskList/TaskList.tsx +122 -28
  387. package/src/components/ToolBlock/ToolBlock.tsx +1 -1
  388. package/src/components/Toolbox/Toolbox.tsx +11 -11
  389. package/src/components/index.ts +1 -6
  390. package/src/constants.ts +1 -1
  391. package/src/containers/AgentArticle/AgentArticle.stories.tsx +12 -13
  392. package/src/containers/AgentArticle/AgentArticle.tsx +10 -10
  393. package/src/{components → containers}/AssistantSettings/AssistantSettings.stories.tsx +3 -2
  394. package/src/containers/AssistantSettings/AssistantSettings.tsx +90 -0
  395. package/src/containers/AssistantSettings/OllamaModels.stories.tsx +108 -0
  396. package/src/containers/AssistantSettings/OllamaModels.tsx +255 -0
  397. package/src/containers/ChatArticle/ChatArticle.stories.tsx +3 -3
  398. package/src/containers/ChatArticle/ChatArticle.tsx +25 -28
  399. package/src/containers/ChatCompanion/ChatCompanion.tsx +27 -27
  400. package/src/containers/ChatDialog/ChatDialog.tsx +10 -7
  401. package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +79 -0
  402. package/src/containers/IntegrationPrompt/index.ts +5 -0
  403. package/src/containers/PlanArticle/PlanArticle.tsx +5 -1
  404. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +107 -0
  405. package/src/containers/SpaceHomePrompt/index.ts +5 -0
  406. package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +83 -0
  407. package/src/containers/SpaceHomeSuggestions/index.ts +5 -0
  408. package/src/containers/TracePanel/TracePanel.stories.tsx +89 -47
  409. package/src/containers/TracePanel/TracePanel.tsx +15 -37
  410. package/src/containers/TracePanel/dxn-extractor.test.ts +2 -2
  411. package/src/containers/TriggerStatus/TriggerStatus.tsx +10 -6
  412. package/src/containers/index.ts +4 -3
  413. package/src/execution-graph/SPEC.md +1 -1
  414. package/src/execution-graph/execution-graph.test.ts +213 -25
  415. package/src/execution-graph/execution-graph.ts +337 -70
  416. package/src/execution-graph/index.ts +15 -5
  417. package/src/execution-graph/pending-block-status.test.ts +114 -0
  418. package/src/execution-graph/pending-block-status.ts +88 -0
  419. package/src/execution-graph/span-tree.test.ts +33 -1
  420. package/src/execution-graph/span-tree.ts +43 -2
  421. package/src/execution-graph/sub-agent-delegation.test.ts +34 -19
  422. package/src/extensions/index.ts +1 -1
  423. package/src/extensions/prompt-extension.ts +102 -73
  424. package/src/feed-logger.ts +24 -22
  425. package/src/functions/services.test.ts +4 -4
  426. package/src/hooks/index.ts +4 -2
  427. package/src/hooks/useChatProcessor.ts +12 -16
  428. package/src/hooks/useChatServices.ts +2 -2
  429. package/src/hooks/useChatToolbarActions.ts +5 -5
  430. package/src/hooks/useContextBinder.ts +2 -4
  431. package/src/hooks/useDebug.ts +2 -2
  432. package/src/hooks/useHomeSuggestions.ts +55 -0
  433. package/src/hooks/usePresets.ts +80 -11
  434. package/src/hooks/useProcessEphemeralStatus.ts +192 -0
  435. package/src/hooks/useReferencesProvider.ts +1 -1
  436. package/src/hooks/useSkillRegistry.ts +125 -0
  437. package/src/hooks/useTraceMessages.ts +41 -0
  438. package/src/index.ts +1 -1
  439. package/src/meta.ts +3 -31
  440. package/src/operations/create-chat.ts +11 -12
  441. package/src/operations/fork-chat.ts +15 -20
  442. package/src/operations/generate-home-suggestions.test.ts +103 -0
  443. package/src/operations/generate-home-suggestions.ts +116 -0
  444. package/src/operations/index.ts +1 -0
  445. package/src/operations/prompt.node.test.ts +14 -17
  446. package/src/operations/resolve-navigation-targets.ts +32 -19
  447. package/src/operations/run-prompt-in-new-chat.ts +34 -35
  448. package/src/operations/update-chat-name.ts +2 -2
  449. package/src/paths.ts +5 -3
  450. package/src/plugin.workerd.ts +5 -0
  451. package/src/processor/presets.ts +38 -61
  452. package/src/processor/processor.node.test.ts +72 -2
  453. package/src/processor/processor.ts +91 -21
  454. package/src/skills/assistant/index.ts +5 -0
  455. package/src/{blueprints/assistant/blueprint.node.test.ts → skills/assistant/skill.node.test.ts} +8 -8
  456. package/src/{blueprints/assistant/blueprint.ts → skills/assistant/skill.ts} +9 -9
  457. package/src/templates/daily-digest.ts +10 -12
  458. package/src/templates/index.ts +3 -3
  459. package/src/templates/research-brief.ts +15 -13
  460. package/src/templates/routine-templates.test.ts +55 -0
  461. package/src/templates/scaffold.ts +22 -57
  462. package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
  463. package/src/testing/data/trace-timeline-remote.dx.json +1 -1
  464. package/src/testing/data/trace-timeline.dx.json +3430 -1093
  465. package/src/testing/test-generator.test.ts +26 -22
  466. package/src/testing/test-generator.ts +4 -8
  467. package/src/testing/test-trace.ts +2 -1
  468. package/src/testing/trace-timeline.node.test.ts +14 -14
  469. package/src/translations.ts +74 -31
  470. package/src/types/Assistant.ts +3 -1
  471. package/src/types/AssistantCapabilities.ts +24 -3
  472. package/src/types/AssistantEvents.ts +1 -1
  473. package/src/types/AssistantOperation.ts +22 -33
  474. package/src/types/ChatSurface.ts +16 -0
  475. package/src/types/Ollama.ts +59 -0
  476. package/src/types/Settings.ts +12 -10
  477. package/src/types/index.ts +3 -0
  478. package/src/types/service.ts +14 -14
  479. package/src/util/error-cause.ts +21 -0
  480. package/src/util/suggestions.ts +1 -1
  481. package/dist/lib/neutral/AgentArticle-K7XM46OQ.mjs.map +0 -7
  482. package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs +0 -40
  483. package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs.map +0 -7
  484. package/dist/lib/neutral/BlueprintArticle-ZBOZNZM7.mjs +0 -27
  485. package/dist/lib/neutral/BlueprintArticle-ZBOZNZM7.mjs.map +0 -7
  486. package/dist/lib/neutral/ChatCompanion-LBUHYWQG.mjs.map +0 -7
  487. package/dist/lib/neutral/ChatDialog-DCA6FLOV.mjs.map +0 -7
  488. package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +0 -7
  489. package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs +0 -119
  490. package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs.map +0 -7
  491. package/dist/lib/neutral/RoutineList-SO5ETHNT.mjs +0 -48
  492. package/dist/lib/neutral/RoutineList-SO5ETHNT.mjs.map +0 -7
  493. package/dist/lib/neutral/RoutineProperties-FISLMW2R.mjs +0 -17
  494. package/dist/lib/neutral/RoutineProperties-FISLMW2R.mjs.map +0 -7
  495. package/dist/lib/neutral/TracePanel-KTZJ6JNR.mjs.map +0 -7
  496. package/dist/lib/neutral/TriggerStatus-X7Y5JFZJ.mjs.map +0 -7
  497. package/dist/lib/neutral/agent-hydrator-PJBYVMBW.mjs.map +0 -7
  498. package/dist/lib/neutral/agent-service-WCAP5MLI.mjs.map +0 -7
  499. package/dist/lib/neutral/ai-context-7WRHWYXY.mjs +0 -42
  500. package/dist/lib/neutral/ai-context-7WRHWYXY.mjs.map +0 -7
  501. package/dist/lib/neutral/ai-service-AADUIKBY.mjs.map +0 -7
  502. package/dist/lib/neutral/app-graph-builder-WUFHQH3Y.mjs.map +0 -7
  503. package/dist/lib/neutral/automation-templates-M2XQWGR6.mjs +0 -115
  504. package/dist/lib/neutral/automation-templates-M2XQWGR6.mjs.map +0 -7
  505. package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs +0 -39
  506. package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs.map +0 -7
  507. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  508. package/dist/lib/neutral/chunk-5H6UJHLF.mjs.map +0 -7
  509. package/dist/lib/neutral/chunk-HLANPOBA.mjs.map +0 -7
  510. package/dist/lib/neutral/chunk-KLYLW4WH.mjs.map +0 -7
  511. package/dist/lib/neutral/chunk-QAZMOFPI.mjs +0 -130
  512. package/dist/lib/neutral/chunk-QAZMOFPI.mjs.map +0 -7
  513. package/dist/lib/neutral/chunk-RKVVK3R3.mjs.map +0 -7
  514. package/dist/lib/neutral/chunk-SMFJD7BP.mjs +0 -8
  515. package/dist/lib/neutral/chunk-XYHPOGTK.mjs +0 -43
  516. package/dist/lib/neutral/chunk-XYHPOGTK.mjs.map +0 -7
  517. package/dist/lib/neutral/chunk-YXRGZYYH.mjs.map +0 -7
  518. package/dist/lib/neutral/companion-chat-provisioner-YZZ73P6E.mjs.map +0 -7
  519. package/dist/lib/neutral/create-chat-SGGQ6HVN.mjs.map +0 -7
  520. package/dist/lib/neutral/create-object-U2SOFZLR.mjs.map +0 -7
  521. package/dist/lib/neutral/fork-chat-34KEF4ZJ.mjs.map +0 -7
  522. package/dist/lib/neutral/integration-provider-RBD3AFJU.mjs.map +0 -7
  523. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs +0 -110
  524. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs.map +0 -7
  525. package/dist/lib/neutral/react-surface-XRTBW5OJ.mjs.map +0 -7
  526. package/dist/lib/neutral/resolve-navigation-targets-ZHIMMH7L.mjs +0 -22
  527. package/dist/lib/neutral/resolve-navigation-targets-ZHIMMH7L.mjs.map +0 -7
  528. package/dist/lib/neutral/run-prompt-in-new-chat-D5IIE2C7.mjs.map +0 -7
  529. package/dist/lib/neutral/state-H3G7QCU6.mjs.map +0 -7
  530. package/dist/types/src/blueprints/assistant/blueprint.d.ts +0 -4
  531. package/dist/types/src/blueprints/assistant/blueprint.d.ts.map +0 -1
  532. package/dist/types/src/blueprints/assistant/blueprint.node.test.d.ts +0 -2
  533. package/dist/types/src/blueprints/assistant/blueprint.node.test.d.ts.map +0 -1
  534. package/dist/types/src/blueprints/assistant/index.d.ts +0 -2
  535. package/dist/types/src/blueprints/assistant/index.d.ts.map +0 -1
  536. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  537. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
  538. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  539. package/dist/types/src/capabilities/integration-provider.d.ts.map +0 -1
  540. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +0 -1
  541. package/dist/types/src/components/RoutineProperties/RoutineProperties.d.ts +0 -7
  542. package/dist/types/src/components/RoutineProperties/RoutineProperties.d.ts.map +0 -1
  543. package/dist/types/src/components/RoutineProperties/RoutineProperties.stories.d.ts +0 -15
  544. package/dist/types/src/components/RoutineProperties/RoutineProperties.stories.d.ts.map +0 -1
  545. package/dist/types/src/components/RoutineProperties/index.d.ts +0 -2
  546. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +0 -13
  547. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +0 -1
  548. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +0 -1
  549. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +0 -21
  550. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +0 -1
  551. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +0 -16
  552. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +0 -1
  553. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts +0 -12
  554. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +0 -1
  555. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts +0 -3
  556. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts.map +0 -1
  557. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts +0 -8
  558. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +0 -1
  559. package/dist/types/src/components/TemplateEditor/index.d.ts +0 -2
  560. package/dist/types/src/components/TemplateEditor/index.d.ts.map +0 -1
  561. package/dist/types/src/components/TemplateEditor/types.d.ts +0 -18
  562. package/dist/types/src/components/TemplateEditor/types.d.ts.map +0 -1
  563. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts +0 -6
  564. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts.map +0 -1
  565. package/dist/types/src/containers/BlueprintArticle/index.d.ts +0 -2
  566. package/dist/types/src/containers/BlueprintArticle/index.d.ts.map +0 -1
  567. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +0 -6
  568. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +0 -1
  569. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts +0 -15
  570. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts.map +0 -1
  571. package/dist/types/src/containers/RoutineArticle/index.d.ts +0 -2
  572. package/dist/types/src/containers/RoutineArticle/index.d.ts.map +0 -1
  573. package/dist/types/src/containers/RoutineList/RoutineList.d.ts +0 -6
  574. package/dist/types/src/containers/RoutineList/RoutineList.d.ts.map +0 -1
  575. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts +0 -21
  576. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts.map +0 -1
  577. package/dist/types/src/containers/RoutineList/index.d.ts +0 -2
  578. package/dist/types/src/containers/RoutineList/index.d.ts.map +0 -1
  579. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +0 -66
  580. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +0 -1
  581. package/dist/types/src/hooks/useOnline.d.ts +0 -3
  582. package/dist/types/src/hooks/useOnline.d.ts.map +0 -1
  583. package/dist/types/src/templates/automation-templates.test.d.ts +0 -2
  584. package/dist/types/src/templates/automation-templates.test.d.ts.map +0 -1
  585. package/src/blueprints/assistant/index.ts +0 -5
  586. package/src/capabilities/blueprint-definition.ts +0 -65
  587. package/src/components/AssistantSettings/AssistantSettings.tsx +0 -43
  588. package/src/components/RoutineProperties/RoutineProperties.stories.tsx +0 -59
  589. package/src/components/RoutineProperties/RoutineProperties.tsx +0 -23
  590. package/src/components/RoutineProperties/index.ts +0 -5
  591. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +0 -95
  592. package/src/components/TemplateEditor/TemplateEditor.tsx +0 -80
  593. package/src/components/TemplateEditor/TemplateForm.stories.tsx +0 -76
  594. package/src/components/TemplateEditor/TemplateForm.tsx +0 -204
  595. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +0 -274
  596. package/src/components/TemplateEditor/extensions/index.ts +0 -6
  597. package/src/components/TemplateEditor/extensions/xml-extension.ts +0 -64
  598. package/src/components/TemplateEditor/index.ts +0 -5
  599. package/src/components/TemplateEditor/types.tsx +0 -28
  600. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +0 -29
  601. package/src/containers/BlueprintArticle/index.ts +0 -5
  602. package/src/containers/RoutineArticle/RoutineArticle.stories.tsx +0 -75
  603. package/src/containers/RoutineArticle/RoutineArticle.tsx +0 -109
  604. package/src/containers/RoutineArticle/index.ts +0 -5
  605. package/src/containers/RoutineList/RoutineList.stories.tsx +0 -130
  606. package/src/containers/RoutineList/RoutineList.tsx +0 -50
  607. package/src/containers/RoutineList/index.ts +0 -5
  608. package/src/hooks/useBlueprintRegistry.ts +0 -125
  609. package/src/hooks/useOnline.ts +0 -10
  610. package/src/templates/automation-templates.test.ts +0 -66
  611. package/src/testing/trace-timeline.node.conversations.json +0 -1
  612. /package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs.map → ChatArticle-OO7GGEFW.mjs.map} +0 -0
  613. /package/dist/lib/neutral/{edge-model-resolver-BBVOJBGJ.mjs.map → edge-model-resolver-WDJWDZTT.mjs.map} +0 -0
  614. /package/dist/lib/neutral/{blueprints → extensions}/index.mjs.map +0 -0
  615. /package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.stories.d.ts +0 -0
  616. /package/dist/types/src/{components → containers}/AssistantSettings/index.d.ts +0 -0
  617. /package/dist/types/src/{blueprints → skills}/index.d.ts +0 -0
  618. /package/src/{components → containers}/AssistantSettings/index.ts +0 -0
  619. /package/src/{blueprints → skills}/index.ts +0 -0
@@ -0,0 +1,255 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useAtomValue } from '@effect-atom/atom-react';
6
+ import React, { useCallback, useEffect, useState } from 'react';
7
+
8
+ import { Model, Provider } from '@dxos/ai';
9
+ import { useOptionalCapability } from '@dxos/app-framework/ui';
10
+ import { EffectEx } from '@dxos/effect';
11
+ import { List, ListItem } from '@dxos/react-list';
12
+ import { IconButton, useTranslation } from '@dxos/react-ui';
13
+ import { Form } from '@dxos/react-ui-form';
14
+ import { Combobox } from '@dxos/react-ui-list';
15
+
16
+ import { meta } from '#meta';
17
+ import { AssistantCapabilities, type Ollama } from '#types';
18
+
19
+ /** Quick-pick model names (Ollama pull tags) sourced from the curated catalog. */
20
+ const QUICK_PICKS = Model.forProvider(Provider.ollama.id).map((model) => model.backend);
21
+
22
+ /** Poll interval for the loaded-into-memory set while the settings panel is open. */
23
+ const LOADED_POLL_INTERVAL = 3_000;
24
+
25
+ /**
26
+ * Manage locally-installed Ollama models. The {@link AssistantCapabilities.OllamaManager}
27
+ * capability is only contributed by the native (desktop) runtime, so this renders nothing in the
28
+ * browser/mobile. Split from the section body so hooks are never called conditionally.
29
+ */
30
+ export const OllamaModels = () => {
31
+ const manager = useOptionalCapability(AssistantCapabilities.OllamaManager);
32
+ if (!manager) {
33
+ return null;
34
+ }
35
+
36
+ return <OllamaModelsSection manager={manager} />;
37
+ };
38
+
39
+ export const OllamaModelsSection = ({ manager }: { manager: Ollama.Manager }) => {
40
+ const { t } = useTranslation(meta.profile.key);
41
+ // Explicit subscription: the list and badges must re-render as pulls/installs/loads land.
42
+ const state = useAtomValue(manager.state);
43
+ const [query, setQuery] = useState('');
44
+ const [open, setOpen] = useState(false);
45
+ // UI-level gate keyed by model name, guaranteeing a visible busy state across the click handler.
46
+ const [pending, setPending] = useState<Record<string, boolean>>({});
47
+
48
+ // Ensure the sidecar is up and list installed models on mount.
49
+ useEffect(() => {
50
+ void EffectEx.runPromise(manager.refresh);
51
+ }, [manager]);
52
+
53
+ // Poll the loaded-into-memory set so the panel reflects which model is resident in real time.
54
+ useEffect(() => {
55
+ const interval = setInterval(() => void EffectEx.runPromise(manager.refreshLoaded), LOADED_POLL_INTERVAL);
56
+ return () => clearInterval(interval);
57
+ }, [manager]);
58
+
59
+ const installed = new Set(state.models.map((model) => model.name));
60
+ const loaded = new Map(state.loaded.map((model) => [model.name, model]));
61
+ const pulling = Object.keys(state.pulls).filter((name) => !installed.has(name));
62
+
63
+ const withPending = useCallback(
64
+ (key: string, action: () => Promise<void>) => async () => {
65
+ setPending((prev) => ({ ...prev, [key]: true }));
66
+ try {
67
+ await action();
68
+ } finally {
69
+ setPending((prev) => ({ ...prev, [key]: false }));
70
+ }
71
+ },
72
+ [],
73
+ );
74
+
75
+ const handlePull = useCallback(
76
+ (target: string) => {
77
+ const trimmed = target.trim();
78
+ if (trimmed.length === 0) {
79
+ return;
80
+ }
81
+ setQuery('');
82
+ setOpen(false);
83
+ void withPending(trimmed, () => EffectEx.runPromise(manager.pull(trimmed)))();
84
+ },
85
+ [manager, withPending],
86
+ );
87
+
88
+ // Caller-driven filtering: curated picks not yet installed, matching the typed query.
89
+ const filter = query.trim();
90
+ const suggestions = QUICK_PICKS.filter((pick) => !installed.has(pick) && (filter === '' || pick.includes(filter)));
91
+ const offerCustom = filter.length > 0 && !installed.has(filter) && !suggestions.includes(filter);
92
+ const empty = state.models.length === 0 && pulling.length === 0;
93
+
94
+ return (
95
+ <Form.Section title={t('settings.ollama.title')}>
96
+ <Form.Row label={t('settings.ollama.installed.label')}>
97
+ {state.kind === 'failed' && state.error ? (
98
+ // Connection-level failure has no associated model, so it shows inline as the row content.
99
+ <p className='text-sm text-error-text'>{t('settings.ollama.failed.message', { error: state.error })}</p>
100
+ ) : empty ? (
101
+ <p className='text-sm text-description'>{t('settings.ollama.empty.message')}</p>
102
+ ) : (
103
+ // Plain `List`/`ListItem` (non-select), with the trigger editor's "fatter" two-line row
104
+ // treatment: a name line plus a secondary meta line, on a surface-styled row. Rows are
105
+ // actioned via their trailing buttons (no selection semantics).
106
+ <List variant='unordered' className='flex flex-col gap-1 grow is-full text-left'>
107
+ {state.models.map((model) => {
108
+ const running = loaded.get(model.name);
109
+ const error = state.errors[model.name];
110
+ const size = model.size != null ? formatBytes(model.size) : undefined;
111
+ const loadedLabel = running
112
+ ? running.sizeVram
113
+ ? t('settings.ollama.loaded.vram', { size: formatBytes(running.sizeVram) })
114
+ : t('settings.ollama.loaded.label')
115
+ : undefined;
116
+ return (
117
+ <ListItem
118
+ key={model.name}
119
+ className='flex flex-col gap-0.5 rounded-sm bg-input-surface px-2 py-1.5 is-full'
120
+ >
121
+ <div className='flex items-center gap-2'>
122
+ <span className='grow truncate font-medium'>{model.name}</span>
123
+ <IconButton
124
+ icon={running ? 'ph--eject--regular' : 'ph--play--regular'}
125
+ iconOnly
126
+ label={running ? t('settings.ollama.unload.label') : t('settings.ollama.load.label')}
127
+ disabled={pending[model.name]}
128
+ onClick={() =>
129
+ void withPending(model.name, () =>
130
+ EffectEx.runPromise(running ? manager.unload(model.name) : manager.load(model.name)),
131
+ )()
132
+ }
133
+ />
134
+ <IconButton
135
+ icon='ph--trash--regular'
136
+ iconOnly
137
+ label={t('settings.ollama.remove.label')}
138
+ disabled={pending[model.name]}
139
+ onClick={() =>
140
+ void withPending(model.name, () => EffectEx.runPromise(manager.remove(model.name)))()
141
+ }
142
+ />
143
+ </div>
144
+ {(size || loadedLabel || error) && (
145
+ <div className='flex items-center gap-2 text-sm'>
146
+ {size && <span className='text-description'>{size}</span>}
147
+ {loadedLabel && <span className='text-success-text'>{loadedLabel}</span>}
148
+ {error && <span className='truncate text-error-text'>{shortError(error)}</span>}
149
+ </div>
150
+ )}
151
+ </ListItem>
152
+ );
153
+ })}
154
+ {pulling.map((name) => {
155
+ const progress = state.pulls[name];
156
+ const status = progress?.total
157
+ ? t('settings.ollama.pulling.message', { percent: percentOf(progress) })
158
+ : (progress?.status ?? t('settings.ollama.pulling.label'));
159
+ return (
160
+ <ListItem key={name} className='flex flex-col gap-0.5 rounded-sm bg-input-surface px-2 py-1.5 is-full'>
161
+ <div className='flex items-center gap-2'>
162
+ <span className='grow truncate font-medium text-description'>{name}</span>
163
+ <IconButton
164
+ icon='ph--x--regular'
165
+ iconOnly
166
+ label={t('settings.ollama.cancel.label')}
167
+ onClick={() => void EffectEx.runPromise(manager.cancel(name))}
168
+ />
169
+ </div>
170
+ <span className='text-sm text-description'>{status}</span>
171
+ </ListItem>
172
+ );
173
+ })}
174
+ </List>
175
+ )}
176
+ </Form.Row>
177
+
178
+ <Form.Row label={t('settings.ollama.pull.label')}>
179
+ {/* Pull failures for not-yet-installed models surface here (no model row to attach to). */}
180
+ {Object.entries(state.errors)
181
+ .filter(([name]) => !installed.has(name))
182
+ .map(([name, error]) => (
183
+ <p key={name} className='text-xs text-error-text'>
184
+ {name}: {shortError(error)}
185
+ </p>
186
+ ))}
187
+ {/* Root value is held empty so the trigger always shows the placeholder; the live text is
188
+ the separate `query` driving the input and suggestion filter. */}
189
+ <Combobox.Root
190
+ open={open}
191
+ onOpenChange={setOpen}
192
+ value=''
193
+ onValueChange={() => {}}
194
+ placeholder={t('settings.ollama.pull.placeholder')}
195
+ >
196
+ <Combobox.Trigger classNames='is-full' />
197
+ <Combobox.Portal>
198
+ <Combobox.Content>
199
+ <Combobox.Input
200
+ value={query}
201
+ onValueChange={setQuery}
202
+ placeholder={t('settings.ollama.pull.placeholder')}
203
+ onKeyDown={(event) => {
204
+ if (event.key === 'Enter' && filter.length > 0) {
205
+ handlePull(filter);
206
+ }
207
+ }}
208
+ />
209
+ <Combobox.List>
210
+ {offerCustom && (
211
+ <Combobox.Item
212
+ value={filter}
213
+ label={t('settings.ollama.pull-custom.label', { name: filter })}
214
+ icon='ph--download-simple--regular'
215
+ onSelect={() => handlePull(filter)}
216
+ />
217
+ )}
218
+ {suggestions.map((pick) => (
219
+ <Combobox.Item key={pick} value={pick} label={pick} onSelect={() => handlePull(pick)} />
220
+ ))}
221
+ </Combobox.List>
222
+ <Combobox.Arrow />
223
+ </Combobox.Content>
224
+ </Combobox.Portal>
225
+ </Combobox.Root>
226
+ </Form.Row>
227
+ </Form.Section>
228
+ );
229
+ };
230
+
231
+ /**
232
+ * Condense a verbose service error for inline display: drop Ollama's "(checked: <paths>)" path dump
233
+ * and cap the length. The full message is still logged to the console.
234
+ */
235
+ const shortError = (error: string): string => {
236
+ const head = error.split(/\s*\(checked:/)[0].trim();
237
+ return head.length > 160 ? `${head.slice(0, 160)}…` : head;
238
+ };
239
+
240
+ /** Percent complete for an in-flight pull, or 0 when totals are not yet known. */
241
+ const percentOf = (progress: Ollama.ModelsState['pulls'][string] | undefined): number =>
242
+ progress && progress.total && progress.total > 0 ? Math.round(((progress.completed ?? 0) / progress.total) * 100) : 0;
243
+
244
+ const UNITS = ['B', 'KB', 'MB', 'GB', 'TB'];
245
+
246
+ /** Human-readable byte size (binary units). */
247
+ const formatBytes = (bytes: number): string => {
248
+ let value = bytes;
249
+ let unit = 0;
250
+ while (value >= 1024 && unit < UNITS.length - 1) {
251
+ value /= 1024;
252
+ unit += 1;
253
+ }
254
+ return `${value.toFixed(unit === 0 ? 0 : 1)} ${UNITS[unit]}`;
255
+ };
@@ -12,9 +12,9 @@ import { AppActivationEvents } from '@dxos/app-toolkit';
12
12
  import { Chat } from '@dxos/assistant-toolkit';
13
13
  import { capabilities } from '@dxos/assistant-toolkit/testing';
14
14
  import { Feed, Filter, Ref } from '@dxos/echo';
15
- import { AutomationPlugin } from '@dxos/plugin-automation/testing';
16
- import { initializeIdentity, ClientPlugin } from '@dxos/plugin-client/testing';
15
+ import { ClientPlugin, initializeIdentity } from '@dxos/plugin-client/testing';
17
16
  import { PreviewPlugin } from '@dxos/plugin-preview/testing';
17
+ import { RoutinePlugin } from '@dxos/plugin-routine/testing';
18
18
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
19
19
  import { Config } from '@dxos/react-client';
20
20
  import { useQuery, useSpaces } from '@dxos/react-client/echo';
@@ -57,7 +57,7 @@ const meta = {
57
57
  yield* Effect.promise(() => space.db.flush({ indexes: true }));
58
58
  }),
59
59
  }),
60
- AutomationPlugin(),
60
+ RoutinePlugin(),
61
61
  AssistantPlugin(),
62
62
  PreviewPlugin(),
63
63
  StorybookPlugin({}),
@@ -2,18 +2,20 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { forwardRef, useEffect, useRef } from 'react';
5
+ import React, { forwardRef, useCallback, useEffect, useRef } from 'react';
6
6
 
7
+ import { Provider } from '@dxos/ai';
7
8
  import { Capabilities } from '@dxos/app-framework';
8
- import { useAtomCapability, useCapability } from '@dxos/app-framework/ui';
9
+ import { useAtomCapability, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';
9
10
  import { type AppSurface } from '@dxos/app-toolkit/ui';
10
11
  import { getSpace } from '@dxos/client/echo';
11
12
  import { type Obj } from '@dxos/echo';
12
- import { useRegistry } from '@dxos/react-client/echo';
13
+ import { ClientOperation } from '@dxos/plugin-client';
14
+ import { useObject, useRegistry } from '@dxos/react-client/echo';
13
15
  import { Panel } from '@dxos/react-ui';
14
16
 
15
17
  import { Chat as ChatComponent, type ChatRootProps } from '#components';
16
- import { useChatProcessor, useChatServices, useOnline, usePresets } from '#hooks';
18
+ import { useChatProcessor, useChatServices, usePresets } from '#hooks';
17
19
  import { type Assistant, AssistantCapabilities, type ChatType } from '#types';
18
20
 
19
21
  export type ChatArticleProps = AppSurface.ObjectSectionProps<ChatType.Chat> & {
@@ -30,13 +32,24 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
30
32
  const space = getSpace(chat) ?? getSpace(companionTo);
31
33
  const runtime = useChatServices({ id: space?.id });
32
34
 
33
- const [online, setOnline] = useOnline();
34
- const { preset, ...chatProps } = usePresets(online);
35
+ const { preset, ...chatProps } = usePresets(settings);
36
+ // The provider is configured in settings; the chat surfaces it as a read-only online indicator.
37
+ const online = preset?.provider === Provider.edge.id;
35
38
  const processor = useChatProcessor({ space, chat, preset, runtime, registry, settings });
36
- const pendingSubmitted = useRef(false);
39
+
40
+ // Subscribe to the view type via `useObject` so the thread re-renders when ChatOptions changes it;
41
+ // a direct `chat.viewType` read in render does not establish a reactive dependency.
42
+ const [chatViewType] = useObject(chat, 'viewType');
43
+ const viewType = (chatViewType as Assistant.ChatView | undefined) ?? settings.chatView;
44
+
45
+ const { invokePromise } = useOperationInvoker();
46
+ const handleViewUsage = useCallback(() => {
47
+ void invokePromise(ClientOperation.OpenUsage, undefined);
48
+ }, [invokePromise]);
37
49
 
38
50
  // Reset the one-shot guard when the target conversation changes, so a pending prompt for a new
39
51
  // `attendableId` is still auto-submitted within the same mount.
52
+ const pendingSubmitted = useRef(false);
40
53
  useEffect(() => {
41
54
  pendingSubmitted.current = false;
42
55
  }, [attendableId]);
@@ -59,31 +72,21 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
59
72
  }
60
73
  }, [processor, attendableId, atomRegistry, stateAtom]);
61
74
 
62
- const feedTarget = chat?.feed.target;
63
- const view = (chat?.view as Assistant.ChatView | undefined) ?? settings.chatView;
64
-
65
75
  if (!processor) {
66
76
  return null;
67
77
  }
68
78
 
69
79
  return (
70
- <ChatComponent.Root
71
- chat={chat}
72
- feed={feedTarget}
73
- db={space?.db}
74
- processor={processor}
75
- onEvent={onEvent}
76
- onSubmit={onSubmit}
77
- >
80
+ <ChatComponent.Root chat={chat} db={space?.db} processor={processor} onEvent={onEvent} onSubmit={onSubmit}>
78
81
  <Panel.Root role={role} ref={forwardedRef}>
79
- <Panel.Toolbar className='bg-toolbar-surface'>
82
+ <Panel.Toolbar>
80
83
  <ChatComponent.Toolbar classNames='dx-document' attendableId={attendableId} companionTo={companionTo} />
81
84
  </Panel.Toolbar>
82
85
  <Panel.Content>
83
86
  <ChatComponent.Content>
84
87
  <div className='dx-container relative'>
85
- <ChatComponent.Thread viewType={view} />
86
- {view !== 'summary' && (
88
+ <ChatComponent.Thread viewType={viewType} onViewUsage={handleViewUsage} />
89
+ {viewType !== 'summary' && (
87
90
  <div className='absolute bottom-2 left-0 right-0'>
88
91
  <div className='dx-document px-4'>
89
92
  <ChatComponent.Status classNames='px-3 rounded-sm bg-group-surface' />
@@ -95,13 +98,7 @@ export const ChatArticle = forwardRef<HTMLDivElement, ChatArticleProps>(
95
98
  <div className='flex flex-col items-center py-2 overflow-hidden'>
96
99
  <ChatComponent.TaskList classNames='max-h-[120px] border border-separator rounded-sm text-description' />
97
100
  </div>
98
- <ChatComponent.Prompt
99
- {...chatProps}
100
- outline
101
- preset={preset?.id}
102
- online={online}
103
- onOnlineChange={setOnline}
104
- />
101
+ <ChatComponent.Prompt {...chatProps} outline preset={preset?.id} online={online} />
105
102
  </div>
106
103
  </ChatComponent.Content>
107
104
  </Panel.Content>
@@ -6,14 +6,14 @@ import * as Option from 'effect/Option';
6
6
  import React, { forwardRef, useCallback, useMemo } from 'react';
7
7
 
8
8
  import { useOperationInvoker } from '@dxos/app-framework/ui';
9
- import { BlueprintsAnnotation } from '@dxos/app-toolkit';
9
+ import { AppAnnotation } from '@dxos/app-toolkit';
10
10
  import { type AppSurface } from '@dxos/app-toolkit/ui';
11
11
  import { Chat } from '@dxos/assistant-toolkit';
12
12
  import { getSpace } from '@dxos/client/echo';
13
- import { Blueprint } from '@dxos/compute';
13
+ import { Skill } from '@dxos/compute';
14
14
  import { Entity, Filter, Obj, Ref, Type } from '@dxos/echo';
15
15
  import { SpaceOperation } from '@dxos/plugin-space';
16
- import { useQuery, useRegistry } from '@dxos/react-client/echo';
16
+ import { useObject, useQuery, useRegistry } from '@dxos/react-client/echo';
17
17
  import { useAsyncEffect } from '@dxos/react-ui';
18
18
 
19
19
  import { useContextBinder } from '#hooks';
@@ -27,7 +27,7 @@ export const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(
27
27
  ({ role = 'article', subject: chat, companionTo, attendableId }, forwardedRef) => {
28
28
  const { invokePromise } = useOperationInvoker();
29
29
  const space = getSpace(companionTo);
30
- useBlueprints({ subject: chat, companionTo });
30
+ useSkills({ subject: chat, companionTo });
31
31
 
32
32
  // Persist (and flush) a transient chat before the first request so the agent can resolve
33
33
  // the now-durable conversation feed; subsequent submits are a no-op once persisted.
@@ -39,7 +39,6 @@ export const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(
39
39
  await invokePromise(SpaceOperation.AddObject, {
40
40
  object: chat,
41
41
  target: space.db,
42
- hidden: true,
43
42
  });
44
43
  await invokePromise(SpaceOperation.AddRelation, {
45
44
  db: space.db,
@@ -68,32 +67,33 @@ export const ChatCompanion = forwardRef<HTMLDivElement, ChatCompanionProps>(
68
67
  );
69
68
 
70
69
  /**
71
- * Bind blueprints to the context.
70
+ * Bind skills to the context.
72
71
  */
73
72
  // TODO(burdon): Why is this only in the companion?
74
- const useBlueprints = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'subject' | 'companionTo'>) => {
73
+ const useSkills = ({ subject: chat, companionTo }: Pick<ChatCompanionProps, 'subject' | 'companionTo'>) => {
75
74
  const registry = useRegistry();
76
75
  const space = getSpace(companionTo);
77
- const feedTarget = chat?.feed.target;
76
+ const [feedSnapshot] = useObject(chat?.feed);
77
+ const feedTarget = Obj.getReactiveOrUndefined(feedSnapshot);
78
78
  const binder = useContextBinder(space, feedTarget);
79
79
 
80
- const blueprintKeys = useMemo(() => {
80
+ const skillKeys = useMemo(() => {
81
81
  const schema = companionTo ? Obj.getType(companionTo) : undefined;
82
82
  if (!schema) {
83
83
  return [] as string[];
84
84
  }
85
85
 
86
- return Option.getOrElse(() => [] as string[])(BlueprintsAnnotation.get(Type.getSchema(schema)));
86
+ return Option.getOrElse(() => [] as string[])(AppAnnotation.SkillsAnnotation.get(Type.getSchema(schema)));
87
87
  }, [companionTo]);
88
88
 
89
- const existingBlueprints = useQuery(space?.db, Filter.type(Blueprint.Blueprint));
90
- const pluginBlueprints = useMemo(
89
+ const existingSkills = useQuery(space?.db, Filter.type(Skill.Skill));
90
+ const pluginSkills = useMemo(
91
91
  () =>
92
- existingBlueprints.filter((blueprint) => {
93
- const key = Obj.getMeta(blueprint).key;
94
- return key !== undefined && blueprintKeys.includes(key);
92
+ existingSkills.filter((skill) => {
93
+ const key = Obj.getMeta(skill).key;
94
+ return key !== undefined && skillKeys.includes(key);
95
95
  }),
96
- [existingBlueprints, blueprintKeys],
96
+ [existingSkills, skillKeys],
97
97
  );
98
98
 
99
99
  useAsyncEffect(async () => {
@@ -101,27 +101,27 @@ const useBlueprints = ({ subject: chat, companionTo }: Pick<ChatCompanionProps,
101
101
  return;
102
102
  }
103
103
 
104
- // Bind annotated blueprints: use key URI for registry blueprints (no DB clone needed).
105
- if (blueprintKeys.length > 0) {
106
- const registryKeys = blueprintKeys.filter((key) => {
104
+ // Bind annotated skills: use key URI for registry skills (no DB clone needed).
105
+ if (skillKeys.length > 0) {
106
+ const registryKeys = skillKeys.filter((key) => {
107
107
  const candidate = registry.list().find((e) => Entity.getMeta(e)?.key === key);
108
- return candidate != null && Obj.instanceOf(Blueprint.Blueprint, candidate);
108
+ return candidate != null && Obj.instanceOf(Skill.Skill, candidate);
109
109
  });
110
110
 
111
- // DB-forked blueprints (in space but not in registry).
112
- const dbForks = pluginBlueprints.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ''));
111
+ // DB-forked skills (in space but not in registry).
112
+ const dbForks = pluginSkills.filter((bp) => !registryKeys.includes(Obj.getMeta(bp).key ?? ''));
113
113
  if (registryKeys.length > 0) {
114
- await binder.bind({ blueprints: registryKeys.map((key) => Ref.fromURI(Blueprint.registryURI(key))) });
114
+ await binder.bind({ skills: registryKeys.map((key) => Ref.fromURI(Skill.registryURI(key))) });
115
115
  }
116
116
  if (dbForks.length > 0) {
117
- await binder.bind({ blueprints: dbForks.map((blueprint) => Ref.make(blueprint)) });
117
+ await binder.bind({ skills: dbForks.map((skill) => Ref.make(skill)) });
118
118
  }
119
119
  }
120
120
 
121
- if (Obj.instanceOf(Blueprint.Blueprint, companionTo)) {
122
- await binder.bind({ blueprints: [Ref.make(companionTo)] });
121
+ if (Obj.instanceOf(Skill.Skill, companionTo)) {
122
+ await binder.bind({ skills: [Ref.make(companionTo)] });
123
123
  } else {
124
124
  await binder.bind({ objects: [Ref.make(companionTo)] });
125
125
  }
126
- }, [binder, blueprintKeys, pluginBlueprints, companionTo]);
126
+ }, [binder, skillKeys, pluginSkills, companionTo]);
127
127
  };
@@ -4,15 +4,16 @@
4
4
 
5
5
  import React, { useCallback, useState } from 'react';
6
6
 
7
+ import { Provider } from '@dxos/ai';
7
8
  import { useAtomCapability } from '@dxos/app-framework/ui';
8
9
  import { type Chat as ChatTypes } from '@dxos/assistant-toolkit';
9
10
  import { Obj } from '@dxos/echo';
10
- import { useRegistry } from '@dxos/react-client/echo';
11
+ import { useObject, useRegistry } from '@dxos/react-client/echo';
11
12
  import { useTranslation } from '@dxos/react-ui';
12
13
  import { ChatDialog as NaturalChatDialog } from '@dxos/react-ui-chat';
13
14
 
14
15
  import { Chat, type ChatRootProps } from '#components';
15
- import { useChatProcessor, useChatServices, useOnline, usePresets } from '#hooks';
16
+ import { useChatProcessor, useChatServices, usePresets } from '#hooks';
16
17
  import { meta } from '#meta';
17
18
  import { type Assistant, AssistantCapabilities } from '#types';
18
19
 
@@ -21,15 +22,17 @@ export type ChatDialogProps = {
21
22
  };
22
23
 
23
24
  export const ChatDialog = ({ chat }: ChatDialogProps) => {
24
- const { t } = useTranslation(meta.id);
25
+ const { t } = useTranslation(meta.profile.key);
25
26
 
26
27
  const db = chat && Obj.getDatabase(chat);
27
28
  const settings = useAtomCapability(AssistantCapabilities.Settings);
28
29
  const runtime = useChatServices({ id: db?.spaceId });
29
- const [online, setOnline] = useOnline();
30
- const { preset, ...chatProps } = usePresets(online);
30
+ const { preset, ...chatProps } = usePresets(settings);
31
+ const online = preset?.provider === Provider.edge.id;
31
32
  const registry = useRegistry();
32
33
  const processor = useChatProcessor({ chat, preset, runtime, registry, settings });
34
+ // Subscribe via `useObject` so the thread re-renders when ChatOptions changes the view type.
35
+ const [chatViewType] = useObject(chat, 'viewType');
33
36
 
34
37
  // TODO(burdon): Refocus when open.
35
38
  const [open, setOpen] = useState(true);
@@ -56,10 +59,10 @@ export const ChatDialog = ({ chat }: ChatDialogProps) => {
56
59
  <NaturalChatDialog.Root open={open} expanded={expanded} onOpenChange={setOpen}>
57
60
  <NaturalChatDialog.Header title={t('assistant-dialog.title')} />
58
61
  <NaturalChatDialog.Content>
59
- <Chat.Thread viewType={(chat.view as Assistant.ChatView | undefined) ?? settings.chatView} />
62
+ <Chat.Thread viewType={(chatViewType as Assistant.ChatView | undefined) ?? settings.chatView} />
60
63
  </NaturalChatDialog.Content>
61
64
  <NaturalChatDialog.Footer classNames='p-1.5'>
62
- <Chat.Prompt {...chatProps} preset={preset?.id} online={online} onOnlineChange={setOnline} expandable />
65
+ <Chat.Prompt {...chatProps} preset={preset?.id} online={online} expandable />
63
66
  </NaturalChatDialog.Footer>
64
67
  </NaturalChatDialog.Root>
65
68
  </Chat.Root>
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { Surface, useCapabilities } from '@dxos/app-framework/ui';
8
+ import { useActiveSpace } from '@dxos/app-toolkit/ui';
9
+ import { Connector, ConnectorAuth, type ConnectorEntry } from '@dxos/plugin-connector';
10
+ import { Icon, useTranslation } from '@dxos/react-ui';
11
+
12
+ import { meta } from '#meta';
13
+
14
+ export type IntegrationPromptProps = {
15
+ /** Service the agent needs access to, e.g. `gmail.com`. */
16
+ service?: string;
17
+ };
18
+
19
+ /**
20
+ * Agent-facing connector prompt: rendered when the assistant needs a service the user has not yet
21
+ * connected. Resolves the matching {@link Connector} entries for `service` and offers to connect via
22
+ * the shared connector-auth surface, so the user can grant access inline instead of the agent failing
23
+ * silently.
24
+ */
25
+ export const IntegrationPrompt = ({ service }: IntegrationPromptProps) => {
26
+ const { t } = useTranslation(meta.profile.key);
27
+ const space = useActiveSpace();
28
+ const connectors = useCapabilities(Connector).flat();
29
+ const matched = useMemo(() => (service ? matchConnectors(connectors, service) : []), [connectors, service]);
30
+
31
+ if (!service) {
32
+ return null;
33
+ }
34
+
35
+ const label = matched[0]?.label ?? service;
36
+ const connectorIds = matched.map((connector) => connector.id);
37
+
38
+ return (
39
+ <div role='group' className='flex flex-col gap-2 my-2 p-3 border border-subdued-separator rounded-sm'>
40
+ <div className='flex items-center gap-2'>
41
+ <Icon icon='ph--plugs--regular' size={5} classNames='shrink-0 text-subdued' />
42
+ <div className='flex flex-col min-w-0'>
43
+ <p className='text-sm font-medium truncate'>{t('integration-prompt.title', { service: label })}</p>
44
+ <p className='text-sm text-subdued'>
45
+ {connectorIds.length > 0
46
+ ? t('integration-prompt.description', { service: label })
47
+ : t('integration-prompt.unavailable', { service: label })}
48
+ </p>
49
+ </div>
50
+ </div>
51
+ {connectorIds.length > 0 && space && (
52
+ <div className='flex justify-end'>
53
+ <Surface.Surface type={ConnectorAuth} data={{ connectorIds }} limit={1} />
54
+ </div>
55
+ )}
56
+ </div>
57
+ );
58
+ };
59
+
60
+ /**
61
+ * Connectors whose id, source, or label relate to the requested service. Matches on the service's
62
+ * leading token (e.g. `gmail` from `gmail.com`) so model-supplied hostnames resolve to connectors
63
+ * keyed by short id or provider domain.
64
+ */
65
+ const matchConnectors = (connectors: ConnectorEntry[], service: string): ConnectorEntry[] => {
66
+ const needle = service.trim().toLowerCase();
67
+ // A malformed service (e.g. `.gmail.com` or `/`) can yield an empty base token, which would make
68
+ // `value.includes(base)` match every connector; bail so the unavailable state is shown instead.
69
+ const base = needle.split(/[.@/]/)[0];
70
+ if (!needle || !base) {
71
+ return [];
72
+ }
73
+ return connectors.filter((connector) => {
74
+ const candidates = [connector.id, connector.source, connector.label]
75
+ .filter((value): value is string => typeof value === 'string')
76
+ .map((value) => value.toLowerCase());
77
+ return candidates.some((value) => value === needle || value === base || value.includes(base));
78
+ });
79
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { IntegrationPrompt as default } from './IntegrationPrompt';
@@ -6,15 +6,19 @@ import React from 'react';
6
6
 
7
7
  import { type AppSurface } from '@dxos/app-toolkit/ui';
8
8
  import { type Plan } from '@dxos/assistant-toolkit';
9
+ import { getSpace } from '@dxos/client/echo';
9
10
  import { Panel, ScrollArea, Toolbar } from '@dxos/react-ui';
10
11
  import { useAttention } from '@dxos/react-ui-attention';
11
12
 
12
13
  import { TaskList } from '#components';
14
+ import { useTraceMessages } from '#hooks';
13
15
 
14
16
  export type PlanArticleProps = AppSurface.ObjectArticleProps<Plan.Plan>;
15
17
 
16
18
  export const PlanArticle = ({ role, attendableId, subject }: PlanArticleProps) => {
17
19
  const { hasAttention } = useAttention(attendableId);
20
+ const space = getSpace(subject);
21
+ const traceMessages = useTraceMessages(space);
18
22
 
19
23
  return (
20
24
  <Panel.Root role={role} classNames='dx-document'>
@@ -24,7 +28,7 @@ export const PlanArticle = ({ role, attendableId, subject }: PlanArticleProps) =
24
28
  <Panel.Content asChild>
25
29
  <ScrollArea.Root orientation='vertical'>
26
30
  <ScrollArea.Viewport>
27
- <TaskList plan={subject} />
31
+ <TaskList plan={subject} space={space} traceMessages={traceMessages} />
28
32
  </ScrollArea.Viewport>
29
33
  </ScrollArea.Root>
30
34
  </Panel.Content>