@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,192 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Atom } from '@effect-atom/atom';
6
+ import { useAtomValue } from '@effect-atom/atom-react';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Fiber from 'effect/Fiber';
9
+ import * as Stream from 'effect/Stream';
10
+ import { useEffect, useMemo, useRef, useState } from 'react';
11
+
12
+ import { Capabilities } from '@dxos/app-framework';
13
+ import { useOptionalCapability } from '@dxos/app-framework/ui';
14
+ import { Process, ServiceResolver, type Trace } from '@dxos/compute';
15
+ import { ProcessManager } from '@dxos/compute-runtime';
16
+ import { type Space } from '@dxos/react-client/echo';
17
+
18
+ import { resolveEphemeralStatusUpdate } from '#execution-graph';
19
+
20
+ const atomEmpty = Atom.make(() => [] as const);
21
+
22
+ const ACTIVE_PROCESS_STATES = new Set<Process.State>([Process.State.RUNNING, Process.State.HYBERNATING]);
23
+
24
+ /** Durable trace lines that represent finished work, not in-flight status. */
25
+ export const isTerminalActivityLine = (line: string): boolean =>
26
+ line.endsWith(' - Success') || line.endsWith(' - Error') || line === 'Agent completed request';
27
+
28
+ const collectDescendantPids = (processes: readonly Process.Info[], rootPid: string): Set<string> => {
29
+ const pids = new Set([rootPid]);
30
+ let expanded = true;
31
+ while (expanded) {
32
+ expanded = false;
33
+ for (const process of processes) {
34
+ const pid = String(process.pid);
35
+ const parentPid = process.parentPid ? String(process.parentPid) : undefined;
36
+ if (parentPid && pids.has(parentPid) && !pids.has(pid)) {
37
+ pids.add(pid);
38
+ expanded = true;
39
+ }
40
+ }
41
+ }
42
+ return pids;
43
+ };
44
+
45
+ const resolveSubscribePids = (agentPid: Process.ID, processes: readonly Process.Info[]): Process.ID[] => {
46
+ const rootPid = String(agentPid);
47
+ const descendants = collectDescendantPids(processes, rootPid);
48
+ const activePids = processes
49
+ .filter((process) => descendants.has(String(process.pid)) && ACTIVE_PROCESS_STATES.has(process.state))
50
+ .map((process) => process.pid);
51
+
52
+ if (activePids.length > 0) {
53
+ return activePids;
54
+ }
55
+
56
+ return [agentPid];
57
+ };
58
+
59
+ const attachActiveHandle = (
60
+ processManager: ProcessManager.Manager,
61
+ pid: Process.ID,
62
+ ): Effect.Effect<ProcessManager.Handle<any, any, never> | undefined> =>
63
+ Effect.gen(function* () {
64
+ const maxAttempts = 15;
65
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
66
+ const handle = yield* processManager.attach(pid).pipe(Effect.catchAll(() => Effect.succeed(undefined)));
67
+ if (handle && ACTIVE_PROCESS_STATES.has(handle.status.state)) {
68
+ return handle;
69
+ }
70
+ if (handle) {
71
+ return undefined;
72
+ }
73
+ yield* Effect.sleep(100);
74
+ }
75
+ return undefined;
76
+ });
77
+
78
+ /**
79
+ * Subscribes to ephemeral trace events for a delegated sub-agent process subtree
80
+ * and surfaces the latest pending text or tool-call block as a status line.
81
+ */
82
+ export const useProcessEphemeralStatus = (
83
+ agentPid: Process.ID | undefined,
84
+ space: Space | undefined,
85
+ ): string | undefined => {
86
+ // Optional capabilities: the live status is a progressive enhancement, so the component still
87
+ // renders (e.g. in standalone stories) when there is no plugin manager / process runtime.
88
+ const runtime = useOptionalCapability(Capabilities.ProcessManagerRuntime);
89
+ const monitor = useOptionalCapability(Capabilities.ProcessMonitor);
90
+ const processes = useAtomValue(monitor?.processTreeAtom ?? atomEmpty);
91
+ const [status, setStatus] = useState<string | undefined>();
92
+ const fibersRef = useRef<Fiber.RuntimeFiber<void, unknown>[]>([]);
93
+
94
+ const subscribePidsKey = useMemo(() => {
95
+ if (!agentPid) {
96
+ return '';
97
+ }
98
+ return resolveSubscribePids(agentPid, processes)
99
+ .map((pid) => String(pid))
100
+ .sort()
101
+ .join('|');
102
+ }, [agentPid, processes]);
103
+
104
+ useEffect(() => {
105
+ if (!agentPid || !space?.id || !runtime || !subscribePidsKey) {
106
+ setStatus(undefined);
107
+ return;
108
+ }
109
+
110
+ const pids = subscribePidsKey.split('|').map((pid) => Process.ID.make(pid));
111
+ let disposed = false;
112
+ let replaying = true;
113
+ let replayStatus: string | undefined;
114
+ const endReplay = () => {
115
+ replaying = false;
116
+ if (!disposed) {
117
+ setStatus(replayStatus);
118
+ }
119
+ };
120
+ queueMicrotask(endReplay);
121
+ fibersRef.current = [];
122
+
123
+ const handleEphemeralMessage = (message: Trace.Message) => {
124
+ const update = resolveEphemeralStatusUpdate(message);
125
+ if (update === 'unchanged') {
126
+ return;
127
+ }
128
+
129
+ if (replaying) {
130
+ replayStatus = update.line;
131
+ return;
132
+ }
133
+ setStatus(update.line);
134
+ };
135
+
136
+ const layer = ServiceResolver.provide({ space: space.id }, ProcessManager.ProcessManagerService);
137
+
138
+ const subscribe = (pid: Process.ID) =>
139
+ Effect.gen(function* () {
140
+ // `attachActiveHandle` polls, so a teardown can land mid-resolve; bail before forking a
141
+ // daemon that the cleanup pass below would never see (and thus never interrupt).
142
+ if (disposed) {
143
+ return;
144
+ }
145
+ const processManager = yield* ProcessManager.ProcessManagerService;
146
+ const handle = yield* attachActiveHandle(processManager, pid);
147
+ if (!handle || disposed) {
148
+ return;
149
+ }
150
+
151
+ // `forkDaemon` keeps the stream fiber alive after `runPromise(forEach)` returns;
152
+ // scoped `fork` is interrupted when the subscribe effect's parent scope closes.
153
+ const fiber = yield* handle.subscribeEphemeral().pipe(
154
+ Stream.runForEach((message) =>
155
+ Effect.sync(() => {
156
+ if (disposed) {
157
+ return;
158
+ }
159
+ handleEphemeralMessage(message);
160
+ }),
161
+ ),
162
+ Effect.forkDaemon,
163
+ );
164
+ if (disposed) {
165
+ yield* Fiber.interrupt(fiber);
166
+ return;
167
+ }
168
+ fibersRef.current.push(fiber);
169
+ });
170
+
171
+ void runtime
172
+ .runPromise(
173
+ Effect.forEach(pids, subscribe, { concurrency: 'unbounded', discard: true }).pipe(Effect.provide(layer)),
174
+ )
175
+ .catch(() => {
176
+ if (!disposed) {
177
+ setStatus(undefined);
178
+ }
179
+ });
180
+
181
+ return () => {
182
+ disposed = true;
183
+ const fibers = fibersRef.current;
184
+ fibersRef.current = [];
185
+ for (const fiber of fibers) {
186
+ void runtime.runPromise(Fiber.interrupt(fiber).pipe(Effect.provide(layer)));
187
+ }
188
+ };
189
+ }, [agentPid, runtime, space?.id, subscribePidsKey]);
190
+
191
+ return status;
192
+ };
@@ -20,7 +20,7 @@ export const useReferencesProvider = (space?: Space): ReferencesProvider | undef
20
20
  return {
21
21
  getReferences: async ({ query }) => {
22
22
  // TODO(burdon): Previously we filtered by types declared by the artifact definitions.
23
- // const schemas = blueprints.map((blueprint) => blueprint.schema).flat();
23
+ // const schemas = skills.map((skill) => skill.schema).flat();
24
24
  // const objects = await space.db
25
25
  // .query(Filter.or(...schemas.map((schema) => Filter.type(schema as Type.Schema))))
26
26
  // .run();
@@ -0,0 +1,125 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import { type AiContext } from '@dxos/assistant';
8
+ import { Skill } from '@dxos/compute';
9
+ import { type Database, Filter, Obj, Ref, type Registry } from '@dxos/echo';
10
+ import { useQuery } from '@dxos/react-client/echo';
11
+ import { distinctBy } from '@dxos/util';
12
+
13
+ export const useSkills = ({ registry, db }: { registry?: Registry.Registry; db?: Database.Database }) => {
14
+ const [registrySkills, setRegistrySkills] = useState<Skill.Skill[]>(
15
+ () => registry?.query(Filter.type(Skill.Skill)).runSync() ?? [],
16
+ );
17
+
18
+ useEffect(() => {
19
+ if (!registry) {
20
+ setRegistrySkills([]);
21
+ return;
22
+ }
23
+ setRegistrySkills(registry.query(Filter.type(Skill.Skill)).runSync());
24
+ return registry.changed.on(() => {
25
+ setRegistrySkills(registry.query(Filter.type(Skill.Skill)).runSync());
26
+ });
27
+ }, [registry]);
28
+
29
+ const spaceSkills = useQuery(db, Filter.type(Skill.Skill));
30
+ return useMemo(() => {
31
+ const skills = distinctBy([...registrySkills, ...spaceSkills], (b) => Obj.getMeta(b).key);
32
+ skills.sort(({ name: a }, { name: b }) => a.localeCompare(b));
33
+ return skills;
34
+ }, [registrySkills, spaceSkills]);
35
+ };
36
+
37
+ /**
38
+ * Create reactive map of active skills (by key).
39
+ */
40
+ export const useActiveSkills = ({ context }: { context?: AiContext.Binder }) => {
41
+ const [active, setActive] = useState<Map<string, Skill.Skill>>(new Map());
42
+
43
+ useEffect(() => {
44
+ if (!context) {
45
+ setActive(new Map());
46
+ return;
47
+ }
48
+
49
+ const updateActive = () => {
50
+ const skills = context.getSkills();
51
+ setActive(
52
+ new Map(
53
+ skills
54
+ .map((skill) => [Obj.getMeta(skill).key, skill] as const)
55
+ .filter((entry): entry is readonly [string, Skill.Skill] => entry[0] !== undefined),
56
+ ),
57
+ );
58
+ };
59
+
60
+ // Set initial value.
61
+ updateActive();
62
+
63
+ // Subscribe to changes.
64
+ return context.subscribeSkills(updateActive);
65
+ }, [context]);
66
+
67
+ return active;
68
+ };
69
+
70
+ // TODO(burdon): Move logic into binder.
71
+ export const useSkillHandlers = ({
72
+ db,
73
+ context,
74
+ registry,
75
+ }: {
76
+ db: Database.Database;
77
+ context?: AiContext.Binder;
78
+ registry?: Registry.Registry;
79
+ }) => {
80
+ const onUpdateSkill = useCallback(
81
+ async (key: string, checked: boolean) => {
82
+ if (!context) {
83
+ return;
84
+ }
85
+
86
+ if (checked) {
87
+ // Check if the skill is in the registry — if so, bind via its key URI directly
88
+ // (no DB clone needed). Fall back to an existing DB copy for user-forked skills.
89
+ const registrySkill = registry
90
+ ?.query(Filter.type(Skill.Skill))
91
+ .runSync()
92
+ .find((b) => Obj.getMeta(b).key === key);
93
+
94
+ if (registrySkill) {
95
+ await context.bind({ skills: [Ref.fromURI(Skill.registryURI(key))] });
96
+ } else {
97
+ // User-forked skill (in DB but not in registry): bind via DB ref.
98
+ const objects = await db.query(Filter.type(Skill.Skill)).run();
99
+ const storedSkill = objects.find((skill) => Obj.getMeta(skill).key === key);
100
+ if (storedSkill) {
101
+ await context.bind({ skills: [Ref.make(storedSkill)] });
102
+ }
103
+ }
104
+ } else {
105
+ // Unbind: try registry ref first, then DB ref.
106
+ const registrySkill = registry
107
+ ?.query(Filter.type(Skill.Skill))
108
+ .runSync()
109
+ .find((b) => Obj.getMeta(b).key === key);
110
+ if (registrySkill) {
111
+ await context.unbind({ skills: [Ref.fromURI(Skill.registryURI(key))] });
112
+ } else {
113
+ const objects = await db.query(Filter.type(Skill.Skill)).run();
114
+ const storedSkill = objects.find((skill) => Obj.getMeta(skill).key === key);
115
+ if (storedSkill) {
116
+ await context.unbind({ skills: [Ref.make(storedSkill)] });
117
+ }
118
+ }
119
+ }
120
+ },
121
+ [db, context, registry],
122
+ );
123
+
124
+ return { onUpdateSkill };
125
+ };
@@ -0,0 +1,41 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Atom } from '@effect-atom/atom';
6
+ import { useAtomValue } from '@effect-atom/atom-react';
7
+ import { pipe } from 'effect/Function';
8
+ import { useMemo } from 'react';
9
+
10
+ import { Trace } from '@dxos/compute';
11
+ import { Filter, Query } from '@dxos/echo';
12
+ import { FeedTraceSink } from '@dxos/functions-runtime';
13
+ import { type Space } from '@dxos/react-client/echo';
14
+
15
+ const atomEmpty = Atom.make(() => [] as const);
16
+
17
+ /**
18
+ * Atom of raw trace messages for a space — the input to `buildExecutionGraph`.
19
+ */
20
+ export const getTraceMessagesAtom = (space: Space): Atom.Atom<readonly Trace.Message[]> =>
21
+ pipe(
22
+ space.db.query(FeedTraceSink.query).atom,
23
+ Atom.map(
24
+ (feeds) =>
25
+ // TODO(dmaretskyi): Single query with limit(1) and feed traversal when query supports it.
26
+ space.db.query(
27
+ feeds.length > 0
28
+ ? Query.type(Trace.Message).from(feeds[0])
29
+ : (Query.select(Filter.nothing()) as Query.Query<never>),
30
+ ).atom,
31
+ ),
32
+ (atom) => Atom.make((get) => get(get(atom))),
33
+ );
34
+
35
+ /**
36
+ * Subscribes to the space invocation trace feed.
37
+ */
38
+ export const useTraceMessages = (space?: Space): readonly Trace.Message[] => {
39
+ const atom = useMemo(() => (space ? getTraceMessagesAtom(space) : atomEmpty), [space]);
40
+ return useAtomValue(atom);
41
+ };
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './blueprints';
5
+ export * from './skills';
6
6
  export * from './meta';
7
7
  export * from './paths';
8
8
  export * from './types';
package/src/meta.ts CHANGED
@@ -4,40 +4,12 @@
4
4
 
5
5
  import { Plugin } from '@dxos/app-framework';
6
6
  import { DXN } from '@dxos/keys';
7
- import { trim } from '@dxos/util';
8
7
 
9
- export const meta = Plugin.makeMeta({
10
- key: DXN.make('org.dxos.plugin.assistant'),
11
- name: 'Assistant',
12
- author: 'DXOS',
13
- description: trim`
14
- AssistantPlugin brings a conversational AI assistant into DXOS Composer, letting users chat naturally
15
- with objects in their spaces. Every Chat is a first-class ECHO object — messages are persisted,
16
- replicated across peers in real time, and can be bound to any document or collection as a companion
17
- panel that appears alongside the primary view.
8
+ import config from '../dx.config';
18
9
 
19
- AI capabilities are delivered through a flexible multi-provider model layer. Users can route requests
20
- to the DXOS Edge service, a locally running Ollama instance, or LM Studio, and switch providers at
21
- any time in Settings. Each provider can be configured with a preferred model, and the runtime
22
- automatically falls back when a provider is unavailable.
10
+ export const meta = Plugin.getMetaFromConfig(config);
23
11
 
24
- Blueprints give every chat a specialised identity. Built-in blueprints cover general assistance,
25
- web browsing, database interaction, web search, Discord and Linear integration, autonomous agents,
26
- planning, memory, automation, and a wizard for authoring new blueprints. Binding a blueprint
27
- changes the system instructions and the tool set exposed to the model in a single step.
28
-
29
- Tool execution runs through the DXOS compute runtime so every AI action — opening a document,
30
- searching the web, querying a database — produces a structured execution trace. The optional
31
- TracePanel visualises that trace as a commit graph or raw JSON, giving developers full observability
32
- into what the model did and why.
33
- `,
34
- icon: 'ph--sparkle--regular',
35
- iconHue: 'sky',
36
- source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-assistant',
37
- spec: 'PLUGIN.mdl',
38
- });
39
-
40
- export const ASSISTANT_DIALOG = DXN.make(`${meta.id}.assistantDialog`);
12
+ export const ASSISTANT_DIALOG = DXN.make(`${meta.profile.key}.assistantDialog`);
41
13
 
42
14
  /** Companion variant identifier for the assistant chat panel. */
43
15
  export const ASSISTANT_COMPANION_VARIANT = 'assistant-chat';
@@ -6,14 +6,13 @@ import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, Capability } from '@dxos/app-framework';
8
8
  import { AiContext } from '@dxos/assistant';
9
- import { Chat, DatabaseBlueprint, AgentWizardBlueprint } from '@dxos/assistant-toolkit';
10
- import { Blueprint, Operation } from '@dxos/compute';
11
- import { Feed, Obj, Ref } from '@dxos/echo';
12
- import { createFeedServiceLayer } from '@dxos/echo-client';
9
+ import { AgentWizardSkill, AlarmSkill, Chat, DatabaseSkill } from '@dxos/assistant-toolkit';
10
+ import { Operation, Skill } from '@dxos/compute';
11
+ import { Database, Feed, Obj, Ref } from '@dxos/echo';
13
12
  import { invariant } from '@dxos/invariant';
14
13
  import { ClientCapabilities } from '@dxos/plugin-client';
15
14
 
16
- import { AssistantBlueprint } from '#blueprints';
15
+ import { AssistantSkill } from '#skills';
17
16
  import { AssistantOperation } from '#types';
18
17
 
19
18
  const handler: Operation.WithHandler<typeof AssistantOperation.CreateChat> = AssistantOperation.CreateChat.pipe(
@@ -30,21 +29,21 @@ const handler: Operation.WithHandler<typeof AssistantOperation.CreateChat> = Ass
30
29
  space.db.add(chat);
31
30
  }
32
31
 
33
- // Dynamic import to avoid circular dependency with the barrel that also exports BlueprintManagerHandlers.
34
- const { BlueprintManagerBlueprint } = yield* Effect.promise(() => import('@dxos/assistant-toolkit'));
32
+ // Dynamic import to avoid circular dependency with the barrel that also exports SkillManagerHandlers.
33
+ const { SkillManagerSkill } = yield* Effect.promise(() => import('@dxos/assistant-toolkit'));
35
34
 
36
- const feedServiceLayer = createFeedServiceLayer(space.queues);
37
- const runtime = yield* Effect.runtime<Feed.FeedService>().pipe(Effect.provide(feedServiceLayer));
35
+ const runtime = yield* Effect.runtime<Database.Service>().pipe(Effect.provide(Database.layer(space.db)));
38
36
  const binder = new AiContext.Binder({ feed, runtime, registry });
39
37
 
40
- // Bind default blueprints via registry refs — no DB clone needed since the ECHO ref
38
+ // Bind default skills via registry refs — no DB clone needed since the ECHO ref
41
39
  // resolver already spans the hypergraph registry.
42
40
  yield* Effect.promise(() =>
43
41
  binder.use((b: AiContext.Binder) =>
44
42
  b.bind({
45
- blueprints: [AssistantBlueprint, DatabaseBlueprint, AgentWizardBlueprint, BlueprintManagerBlueprint].map(
46
- ({ key }) => Ref.fromURI(Blueprint.registryURI(key)),
43
+ skills: [AssistantSkill, DatabaseSkill, AgentWizardSkill, SkillManagerSkill, AlarmSkill].map(({ key }) =>
44
+ Ref.fromURI(Skill.registryURI(key)),
47
45
  ),
46
+ objects: [Ref.make(chat)],
48
47
  }),
49
48
  ),
50
49
  );
@@ -5,12 +5,11 @@
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, Capability } from '@dxos/app-framework';
8
- import { getObjectPathFromObject, LayoutOperation } from '@dxos/app-toolkit';
8
+ import { LayoutOperation, Paths } from '@dxos/app-toolkit';
9
9
  import { AiContext, SessionLink } from '@dxos/assistant';
10
10
  import { Chat } from '@dxos/assistant-toolkit';
11
11
  import { Operation } from '@dxos/compute';
12
12
  import { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';
13
- import { createFeedServiceLayer } from '@dxos/echo-client';
14
13
  import { invariant } from '@dxos/invariant';
15
14
  import { ClientCapabilities } from '@dxos/plugin-client';
16
15
  import { SpaceOperation } from '@dxos/plugin-space';
@@ -22,18 +21,15 @@ const handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = Assis
22
21
  Operation.withHandler(
23
22
  Effect.fnUntraced(function* ({ chat, companionTo }) {
24
23
  const { db } = yield* Database.Service;
25
- const sourceFeed = chat.feed.target;
26
- invariant(sourceFeed, 'Chat feed not found.');
24
+ const sourceFeed = yield* Database.load(chat.feed);
27
25
 
28
26
  const client = yield* Capability.get(ClientCapabilities.Client);
29
27
  const space = client.spaces.get(db.spaceId);
30
28
  invariant(space, 'Space not found.');
31
29
 
32
- const feedServiceLayer = createFeedServiceLayer(space.queues);
30
+ const dbLayer = Database.layer(space.db);
33
31
 
34
- const messages = yield* Feed.runQuery(sourceFeed, Filter.type(Message.Message)).pipe(
35
- Effect.provide(feedServiceLayer),
36
- );
32
+ const messages = yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer));
37
33
 
38
34
  // Sort chronologically to find the last message.
39
35
  const sorted = messages
@@ -46,8 +42,7 @@ const handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = Assis
46
42
  db,
47
43
  name: sourceName ? `${sourceName} (fork)` : undefined,
48
44
  });
49
- const newFeed = newChat.feed.target;
50
- invariant(newFeed, 'New chat feed not found.');
45
+ const newFeed = yield* Database.load(newChat.feed);
51
46
 
52
47
  if (sorted.length > 0) {
53
48
  const lastMessage = sorted[sorted.length - 1];
@@ -58,32 +53,32 @@ const handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = Assis
58
53
  feedRef: Ref.make(sourceFeed),
59
54
  messageId: lastMessage.id,
60
55
  }),
61
- ]).pipe(Effect.provide(feedServiceLayer));
56
+ ]).pipe(Effect.provide(dbLayer));
62
57
  }
63
58
 
64
- // Copy source chat's blueprint and object bindings to the new feed.
59
+ // Copy source chat's skill and object bindings to the new feed.
65
60
  // Sort chronologically so add/remove events are applied in the correct order.
66
- const sourceBindings = (yield* Feed.runQuery(sourceFeed, Filter.type(AiContext.Binding)).pipe(
67
- Effect.provide(feedServiceLayer),
61
+ const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(
62
+ Effect.provide(dbLayer),
68
63
  )).filter(Obj.instanceOf(AiContext.Binding));
69
64
 
70
65
  if (sourceBindings.length > 0) {
71
66
  // Reduce binding events to the final active set.
72
- const blueprintRefMap = new Map<string, Ref.Ref<any>>();
67
+ const skillRefMap = new Map<string, Ref.Ref<any>>();
73
68
  const objectRefMap = new Map<string, Ref.Ref<any>>();
74
69
  for (const binding of sourceBindings) {
75
- binding.blueprints.added.forEach((ref: Ref.Ref<any>) => blueprintRefMap.set(ref.uri, ref));
76
- binding.blueprints.removed.forEach((ref: Ref.Ref<any>) => blueprintRefMap.delete(ref.uri));
70
+ binding.skills.added.forEach((ref: Ref.Ref<any>) => skillRefMap.set(ref.uri, ref));
71
+ binding.skills.removed.forEach((ref: Ref.Ref<any>) => skillRefMap.delete(ref.uri));
77
72
  binding.objects.added.forEach((ref: Ref.Ref<any>) => objectRefMap.set(ref.uri, ref));
78
73
  binding.objects.removed.forEach((ref: Ref.Ref<any>) => objectRefMap.delete(ref.uri));
79
74
  }
80
75
 
81
76
  yield* Feed.append(newFeed, [
82
77
  Obj.make(AiContext.Binding, {
83
- blueprints: { added: Array.from(blueprintRefMap.values()), removed: [] },
78
+ skills: { added: Array.from(skillRefMap.values()), removed: [] },
84
79
  objects: { added: Array.from(objectRefMap.values()), removed: [] },
85
80
  }),
86
- ]).pipe(Effect.provide(feedServiceLayer));
81
+ ]).pipe(Effect.provide(dbLayer));
87
82
  }
88
83
 
89
84
  if (companionTo) {
@@ -100,7 +95,7 @@ const handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = Assis
100
95
  );
101
96
  } else {
102
97
  // Navigate to the forked chat as a standalone plank.
103
- const chatPath = getObjectPathFromObject(newChat);
98
+ const chatPath = Paths.getObjectPathFromObject(newChat);
104
99
  yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });
105
100
  }
106
101
 
@@ -0,0 +1,103 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Atom, Registry } from '@effect-atom/atom-react';
6
+ import { describe, expect, it } from '@effect/vitest';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Layer from 'effect/Layer';
9
+
10
+ import { Capabilities, Capability, CapabilityManager } from '@dxos/app-framework';
11
+ import { Operation } from '@dxos/compute';
12
+ import { Database } from '@dxos/echo';
13
+ import { TestHelpers } from '@dxos/effect/testing';
14
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
15
+ import { EntityId } from '@dxos/keys';
16
+
17
+ import { AssistantCapabilities, AssistantOperation } from '#types';
18
+
19
+ import { AssistantOperationHandlerSet } from './index';
20
+
21
+ EntityId.dangerouslyDisableRandomness();
22
+
23
+ const CACHE_TTL_MS = 60 * 60 * 1000;
24
+
25
+ // Shared registry and cache atom — each test sets its own cache state before invoking the operation.
26
+ const testRegistry = Registry.make();
27
+ const testCacheAtom = Atom.make<AssistantCapabilities.HomeSuggestionsCache>({}).pipe(Atom.keepAlive);
28
+ const testManager = CapabilityManager.make({ registry: testRegistry });
29
+ testManager.contribute({ module: 'test', interface: Capabilities.AtomRegistry, implementation: testRegistry });
30
+ testManager.contribute({
31
+ module: 'test',
32
+ interface: AssistantCapabilities.HomeSuggestionsCache,
33
+ implementation: testCacheAtom,
34
+ });
35
+
36
+ const TestLayer = AssistantTestLayer({
37
+ operationHandlers: AssistantOperationHandlerSet,
38
+ // Provide Capability.Service so the handler can read/write the suggestions cache.
39
+ extraServices: Layer.succeed(Capability.Service, testManager),
40
+ });
41
+
42
+ describe('GenerateHomeSuggestions', () => {
43
+ it.effect(
44
+ 'empty space returns empty prompts (fallback path)',
45
+ Effect.fnUntraced(
46
+ function* (_) {
47
+ const { db } = yield* Database.Service;
48
+ testRegistry.set(testCacheAtom, {});
49
+
50
+ const result = yield* Operation.invoke(AssistantOperation.GenerateHomeSuggestions, { db });
51
+
52
+ expect(result.prompts).toHaveLength(0);
53
+ // No cache entry written when prompts is empty.
54
+ const cached = testRegistry.get(testCacheAtom);
55
+ expect(cached[db.spaceId]).toBeUndefined();
56
+ },
57
+ Effect.provide(TestLayer),
58
+ TestHelpers.provideTestContext,
59
+ ),
60
+ );
61
+
62
+ it.effect(
63
+ 'cache hit returns stored prompts without re-generating',
64
+ Effect.fnUntraced(
65
+ function* (_) {
66
+ const { db } = yield* Database.Service;
67
+ const stored = ['Refine the proposal', 'Review the schedule', 'Draft a summary'];
68
+ testRegistry.set(testCacheAtom, {
69
+ [db.spaceId]: { generatedAt: Date.now(), prompts: stored },
70
+ });
71
+
72
+ const result = yield* Operation.invoke(AssistantOperation.GenerateHomeSuggestions, { db });
73
+
74
+ expect(result.prompts).toEqual(stored);
75
+ },
76
+ Effect.provide(TestLayer),
77
+ TestHelpers.provideTestContext,
78
+ ),
79
+ );
80
+
81
+ it.effect(
82
+ 'expired cache entry is not used — re-runs and returns empty for empty space',
83
+ Effect.fnUntraced(
84
+ function* (_) {
85
+ const { db } = yield* Database.Service;
86
+ const stale = ['Stale prompt A', 'Stale prompt B', 'Stale prompt C'];
87
+ testRegistry.set(testCacheAtom, {
88
+ [db.spaceId]: { generatedAt: Date.now() - 2 * CACHE_TTL_MS, prompts: stale },
89
+ });
90
+
91
+ // Empty space — expired entry is ignored, no LLM call, no new cache entry written.
92
+ const result = yield* Operation.invoke(AssistantOperation.GenerateHomeSuggestions, { db });
93
+
94
+ expect(result.prompts).toHaveLength(0);
95
+ // Cache not updated since prompts is empty.
96
+ const cached = testRegistry.get(testCacheAtom);
97
+ expect(cached[db.spaceId]?.prompts).toEqual(stale);
98
+ },
99
+ Effect.provide(TestLayer),
100
+ TestHelpers.provideTestContext,
101
+ ),
102
+ );
103
+ });