@dxos/plugin-assistant 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/PLUGIN.mdl +3 -28
  2. package/dist/lib/AssistantPlugin.mjs +2 -0
  3. package/dist/lib/AssistantPlugin.node.mjs +55 -0
  4. package/dist/lib/AssistantPlugin.node.mjs.map +1 -0
  5. package/dist/lib/AssistantPlugin.workerd.mjs +43 -0
  6. package/dist/lib/AssistantPlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities.mjs +24 -0
  8. package/dist/lib/capabilities.mjs.map +1 -0
  9. package/dist/lib/chunk-AgentArticle.mjs +52 -0
  10. package/dist/lib/chunk-AgentArticle.mjs.map +1 -0
  11. package/dist/lib/chunk-AgentProperties.mjs +35 -0
  12. package/dist/lib/chunk-AgentProperties.mjs.map +1 -0
  13. package/dist/lib/chunk-AssistantPlugin.mjs +88 -0
  14. package/dist/lib/chunk-AssistantPlugin.mjs.map +1 -0
  15. package/dist/lib/chunk-AssistantSettings.mjs +285 -0
  16. package/dist/lib/chunk-AssistantSettings.mjs.map +1 -0
  17. package/dist/lib/chunk-ChatArticle.mjs +121 -0
  18. package/dist/lib/chunk-ChatArticle.mjs.map +1 -0
  19. package/dist/lib/chunk-ChatCompanion.mjs +116 -0
  20. package/dist/lib/chunk-ChatCompanion.mjs.map +1 -0
  21. package/dist/lib/chunk-ChatDialog.mjs +73 -0
  22. package/dist/lib/chunk-ChatDialog.mjs.map +1 -0
  23. package/dist/lib/chunk-IntegrationPrompt.mjs +73 -0
  24. package/dist/lib/chunk-IntegrationPrompt.mjs.map +1 -0
  25. package/dist/lib/chunk-SpaceHomePrompt.mjs +104 -0
  26. package/dist/lib/chunk-SpaceHomePrompt.mjs.map +1 -0
  27. package/dist/lib/chunk-SpaceHomeSuggestions.mjs +60 -0
  28. package/dist/lib/chunk-SpaceHomeSuggestions.mjs.map +1 -0
  29. package/dist/lib/chunk-TracePanel.mjs +127 -0
  30. package/dist/lib/chunk-TracePanel.mjs.map +1 -0
  31. package/dist/lib/chunk-TracePanel2.mjs +7 -0
  32. package/dist/lib/chunk-TracePanel2.mjs.map +1 -0
  33. package/dist/lib/chunk-TriggerStatus.mjs +72 -0
  34. package/dist/lib/chunk-TriggerStatus.mjs.map +1 -0
  35. package/dist/lib/chunk-agent-hydrator.mjs +22 -0
  36. package/dist/lib/chunk-agent-hydrator.mjs.map +1 -0
  37. package/dist/lib/chunk-agent-service.mjs +21 -0
  38. package/dist/lib/chunk-agent-service.mjs.map +1 -0
  39. package/dist/lib/{neutral/ai-context-LIKJYMIN.mjs → chunk-ai-context.mjs} +8 -12
  40. package/dist/lib/chunk-ai-context.mjs.map +1 -0
  41. package/dist/lib/chunk-ai-service.mjs +27 -0
  42. package/dist/lib/chunk-ai-service.mjs.map +1 -0
  43. package/dist/lib/chunk-app-graph-builder.mjs +179 -0
  44. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  45. package/dist/lib/chunk-automation-templates.mjs +99 -0
  46. package/dist/lib/chunk-automation-templates.mjs.map +1 -0
  47. package/dist/lib/chunk-companion-chat-provisioner.mjs +123 -0
  48. package/dist/lib/chunk-companion-chat-provisioner.mjs.map +1 -0
  49. package/dist/lib/chunk-connector.mjs +60 -0
  50. package/dist/lib/chunk-connector.mjs.map +1 -0
  51. package/dist/lib/chunk-constants.mjs +9 -0
  52. package/dist/lib/chunk-constants.mjs.map +1 -0
  53. package/dist/lib/chunk-context.mjs +7 -0
  54. package/dist/lib/chunk-context.mjs.map +1 -0
  55. package/dist/lib/chunk-create-chat.mjs +53 -0
  56. package/dist/lib/chunk-create-chat.mjs.map +1 -0
  57. package/dist/lib/chunk-create-object.mjs +70 -0
  58. package/dist/lib/chunk-create-object.mjs.map +1 -0
  59. package/dist/lib/chunk-edge-model-resolver.mjs +64 -0
  60. package/dist/lib/chunk-edge-model-resolver.mjs.map +1 -0
  61. package/dist/lib/chunk-ensure-companion-chat.mjs +49 -0
  62. package/dist/lib/chunk-ensure-companion-chat.mjs.map +1 -0
  63. package/dist/lib/chunk-extensions.mjs +78 -0
  64. package/dist/lib/chunk-extensions.mjs.map +1 -0
  65. package/dist/lib/chunk-fork-chat.mjs +83 -0
  66. package/dist/lib/chunk-fork-chat.mjs.map +1 -0
  67. package/dist/lib/chunk-generate-home-suggestions.mjs +71 -0
  68. package/dist/lib/chunk-generate-home-suggestions.mjs.map +1 -0
  69. package/dist/lib/chunk-local-model-resolver.mjs +25 -0
  70. package/dist/lib/chunk-local-model-resolver.mjs.map +1 -0
  71. package/dist/lib/chunk-markdown-extension.mjs +27 -0
  72. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  73. package/dist/lib/{neutral/chunk-L7AR4VTA.mjs → chunk-meta.mjs} +20 -25
  74. package/dist/lib/chunk-meta.mjs.map +1 -0
  75. package/dist/lib/chunk-operation-handler.mjs +13 -0
  76. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  77. package/dist/lib/chunk-paths.mjs +8 -0
  78. package/dist/lib/chunk-paths.mjs.map +1 -0
  79. package/dist/lib/chunk-processor.mjs +432 -0
  80. package/dist/lib/chunk-processor.mjs.map +1 -0
  81. package/dist/lib/chunk-react-surface.mjs +177 -0
  82. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  83. package/dist/lib/chunk-run-prompt-in-new-chat.mjs +96 -0
  84. package/dist/lib/chunk-run-prompt-in-new-chat.mjs.map +1 -0
  85. package/dist/lib/chunk-set-current-chat.mjs +43 -0
  86. package/dist/lib/chunk-set-current-chat.mjs.map +1 -0
  87. package/dist/lib/chunk-settings.mjs +23 -0
  88. package/dist/lib/chunk-settings.mjs.map +1 -0
  89. package/dist/lib/chunk-skill-definition.mjs +42 -0
  90. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  91. package/dist/lib/chunk-skills.mjs +19 -0
  92. package/dist/lib/chunk-skills.mjs.map +1 -0
  93. package/dist/lib/chunk-state.mjs +32 -0
  94. package/dist/lib/chunk-state.mjs.map +1 -0
  95. package/dist/lib/chunk-toggle-trace-panel-debug.mjs +18 -0
  96. package/dist/lib/chunk-toggle-trace-panel-debug.mjs.map +1 -0
  97. package/dist/lib/chunk-toolkit.mjs +12 -0
  98. package/dist/lib/chunk-toolkit.mjs.map +1 -0
  99. package/dist/lib/chunk-types.mjs +332 -0
  100. package/dist/lib/chunk-types.mjs.map +1 -0
  101. package/dist/lib/chunk-update-chat-name.mjs +63 -0
  102. package/dist/lib/chunk-update-chat-name.mjs.map +1 -0
  103. package/dist/lib/components.mjs +2616 -0
  104. package/dist/lib/components.mjs.map +1 -0
  105. package/dist/lib/containers.mjs +17 -0
  106. package/dist/lib/containers.mjs.map +1 -0
  107. package/dist/lib/execution-graph.mjs +961 -0
  108. package/dist/lib/execution-graph.mjs.map +1 -0
  109. package/dist/lib/extensions.mjs +2 -0
  110. package/dist/lib/hooks.mjs +674 -0
  111. package/dist/lib/hooks.mjs.map +1 -0
  112. package/dist/lib/index.mjs +5 -0
  113. package/dist/lib/meta.mjs +2 -0
  114. package/dist/lib/operations.mjs +7 -0
  115. package/dist/lib/operations.mjs.map +1 -0
  116. package/dist/lib/plugin.mjs +9 -0
  117. package/dist/lib/plugin.mjs.map +1 -0
  118. package/dist/lib/plugin.workerd.mjs +2 -0
  119. package/dist/lib/skills.mjs +2 -0
  120. package/dist/lib/testing.mjs +2 -0
  121. package/dist/lib/translations.mjs +207 -0
  122. package/dist/lib/translations.mjs.map +1 -0
  123. package/dist/lib/types.mjs +2 -0
  124. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  125. package/dist/types/src/AssistantPlugin.node.d.ts.map +1 -1
  126. package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
  127. package/dist/types/src/capabilities/AssistantSurfaces.d.ts +22 -0
  128. package/dist/types/src/capabilities/AssistantSurfaces.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
  130. package/dist/types/src/capabilities/agent-service.d.ts +1 -1
  131. package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/ai-context.d.ts +1 -1
  133. package/dist/types/src/capabilities/ai-service.d.ts +1 -1
  134. package/dist/types/src/capabilities/app-graph-builder.d.ts +12 -1
  135. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/automation-templates.d.ts +1 -1
  137. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
  138. package/dist/types/src/capabilities/connector.d.ts +1 -1
  139. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  140. package/dist/types/src/capabilities/edge-model-resolver.d.ts +1 -1
  141. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/index.d.ts +0 -2
  143. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/local-model-resolver.d.ts +1 -1
  145. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  147. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  148. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  149. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/settings.d.ts +1 -1
  151. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
  152. package/dist/types/src/capabilities/standalone-chats-query.test.d.ts +2 -0
  153. package/dist/types/src/capabilities/standalone-chats-query.test.d.ts.map +1 -0
  154. package/dist/types/src/capabilities/state.d.ts +1 -1
  155. package/dist/types/src/capabilities/toolkit.d.ts +1 -1
  156. package/dist/types/src/components/AgentProperties/AgentProperties.d.ts +4 -1
  157. package/dist/types/src/components/AgentProperties/AgentProperties.d.ts.map +1 -1
  158. package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Chat/Chat.d.ts +21 -8
  160. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  161. package/dist/types/src/components/Chat/{Chat.stories.d.ts → Error.stories.d.ts} +1 -1
  162. package/dist/types/src/components/Chat/Error.stories.d.ts.map +1 -0
  163. package/dist/types/src/components/Chat/context.d.ts +8 -0
  164. package/dist/types/src/components/Chat/context.d.ts.map +1 -1
  165. package/dist/types/src/components/Chat/events.d.ts +5 -0
  166. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  167. package/dist/types/src/components/Chat/thread.d.ts +42 -0
  168. package/dist/types/src/components/Chat/thread.d.ts.map +1 -0
  169. package/dist/types/src/components/Chat/thread.test.d.ts +2 -0
  170. package/dist/types/src/components/Chat/thread.test.d.ts.map +1 -0
  171. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  172. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -3
  174. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
  175. package/dist/types/src/components/ChatPrompt/index.d.ts +0 -1
  176. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  177. package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/ChatThread/ChatThread.d.ts +8 -3
  179. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  180. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +30 -2
  181. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
  183. package/dist/types/src/components/ChatThread/index.d.ts +1 -0
  184. package/dist/types/src/components/ChatThread/index.d.ts.map +1 -1
  185. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  186. package/dist/types/src/components/ChatThread/sync/index.d.ts +3 -0
  187. package/dist/types/src/components/ChatThread/sync/index.d.ts.map +1 -0
  188. package/dist/types/src/components/ChatThread/{sync.d.ts → sync/sync.d.ts} +46 -2
  189. package/dist/types/src/components/ChatThread/sync/sync.d.ts.map +1 -0
  190. package/dist/types/src/components/ChatThread/sync/sync.test.d.ts.map +1 -0
  191. package/dist/types/src/components/ChatThread/sync/tool-widget-state.d.ts.map +1 -0
  192. package/dist/types/src/components/ChatThread/sync/tool-widget-state.test.d.ts.map +1 -0
  193. package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts +15 -0
  194. package/dist/types/src/components/ChatThread/widgets/BranchWidget.d.ts.map +1 -0
  195. package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts +21 -0
  196. package/dist/types/src/components/ChatThread/widgets/BranchWidget.stories.d.ts.map +1 -0
  197. package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts +2 -0
  198. package/dist/types/src/components/ChatThread/widgets/BranchWidget.test.d.ts.map +1 -0
  199. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
  200. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
  201. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts +1 -2
  202. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
  203. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +6 -0
  204. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -1
  205. package/dist/types/src/components/ChatThread/widgets/format-time.d.ts +2 -0
  206. package/dist/types/src/components/ChatThread/widgets/format-time.d.ts.map +1 -0
  207. package/dist/types/src/components/ChatThread/widgets/index.d.ts +4 -1
  208. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  209. package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts +3 -0
  210. package/dist/types/src/components/ChatThread/widgets/is-tool-message.d.ts.map +1 -0
  211. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts +16 -0
  212. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.d.ts.map +1 -0
  213. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts +210 -0
  214. package/dist/types/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.d.ts.map +1 -0
  215. package/dist/types/src/components/ConnectorAuthMenu/index.d.ts +2 -0
  216. package/dist/types/src/components/ConnectorAuthMenu/index.d.ts.map +1 -0
  217. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +1 -1
  218. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  219. package/dist/types/src/components/TaskList/TaskList.d.ts +9 -11
  220. package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
  221. package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -4
  222. package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
  223. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +1 -2
  224. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
  225. package/dist/types/src/components/ToolBlock/index.d.ts +1 -0
  226. package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -1
  227. package/dist/types/src/components/ToolBlock/is-tool-message.d.ts +3 -0
  228. package/dist/types/src/components/ToolBlock/is-tool-message.d.ts.map +1 -0
  229. package/dist/types/src/components/Toolbox/Toolbox.d.ts +1 -1
  230. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  231. package/dist/types/src/components/index.d.ts +1 -0
  232. package/dist/types/src/components/index.d.ts.map +1 -1
  233. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts +5 -2
  234. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
  235. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  236. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts +4 -1
  237. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
  238. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts +4 -1
  239. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  240. package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts +4 -1
  241. package/dist/types/src/containers/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  242. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +4 -6
  243. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -1
  244. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  245. package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts +22 -1
  246. package/dist/types/src/containers/ChatArticle/ChatArticle.stories.d.ts.map +1 -1
  247. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
  248. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts +4 -1
  249. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  250. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +4 -7
  251. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -1
  252. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +4 -9
  253. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -1
  254. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +5 -7
  255. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -1
  256. package/dist/types/src/containers/TracePanel/TracePanel.d.ts +1 -1
  257. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  258. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  259. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts +15 -1
  260. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  261. package/dist/types/src/containers/index.d.ts +0 -1
  262. package/dist/types/src/containers/index.d.ts.map +1 -1
  263. package/dist/types/src/execution-graph/execution-graph.d.ts +12 -1
  264. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  265. package/dist/types/src/execution-graph/index.d.ts +1 -1
  266. package/dist/types/src/execution-graph/index.d.ts.map +1 -1
  267. package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -1
  268. package/dist/types/src/execution-graph/span-tree.d.ts +17 -0
  269. package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
  270. package/dist/types/src/feed-logger.d.ts +1 -1
  271. package/dist/types/src/feed-logger.d.ts.map +1 -1
  272. package/dist/types/src/hooks/index.d.ts +1 -1
  273. package/dist/types/src/hooks/index.d.ts.map +1 -1
  274. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  275. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  276. package/dist/types/src/hooks/useContextObjects.d.ts +1 -1
  277. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  278. package/dist/types/src/hooks/useSelectionContext.d.ts +13 -0
  279. package/dist/types/src/hooks/useSelectionContext.d.ts.map +1 -0
  280. package/dist/types/src/hooks/useSelectionContext.test.d.ts +2 -0
  281. package/dist/types/src/hooks/useSelectionContext.test.d.ts.map +1 -0
  282. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -1
  283. package/dist/types/src/operations/index.d.ts.map +1 -1
  284. package/dist/types/src/processor/index.d.ts +1 -0
  285. package/dist/types/src/processor/index.d.ts.map +1 -1
  286. package/dist/types/src/processor/processor.d.ts +5 -2
  287. package/dist/types/src/processor/processor.d.ts.map +1 -1
  288. package/dist/types/src/processor/prompt.d.ts +18 -0
  289. package/dist/types/src/processor/prompt.d.ts.map +1 -0
  290. package/dist/types/src/processor/prompt.test.d.ts +2 -0
  291. package/dist/types/src/processor/prompt.test.d.ts.map +1 -0
  292. package/dist/types/src/processor/streaming.node.test.d.ts +2 -0
  293. package/dist/types/src/processor/streaming.node.test.d.ts.map +1 -0
  294. package/dist/types/src/skills/assistant/skill.d.ts.map +1 -1
  295. package/dist/types/src/templates/scaffold.d.ts +1 -1
  296. package/dist/types/src/templates/scaffold.d.ts.map +1 -1
  297. package/dist/types/src/translations.d.ts.map +1 -1
  298. package/dist/types/src/types/AssistantCapabilities.d.ts +1 -1
  299. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  300. package/dist/types/src/types/AssistantOperation.d.ts +2 -13
  301. package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
  302. package/dist/types/src/types/ChatSurface.d.ts +2 -2
  303. package/dist/types/src/types/ChatSurface.d.ts.map +1 -1
  304. package/dist/types/src/types/Ollama.d.ts +1 -1
  305. package/dist/types/src/types/Ollama.d.ts.map +1 -1
  306. package/dist/types/tsconfig.tsbuildinfo +1 -1
  307. package/dx.config.ts +1 -0
  308. package/package.json +106 -105
  309. package/src/AssistantPlugin.node.ts +1 -2
  310. package/src/AssistantPlugin.test.ts +60 -62
  311. package/src/AssistantPlugin.ts +1 -10
  312. package/src/AssistantPlugin.workerd.ts +1 -2
  313. package/src/capabilities/AssistantSurfaces.tsx +86 -0
  314. package/src/capabilities/agent-service.ts +1 -1
  315. package/src/capabilities/app-graph-builder.ts +31 -17
  316. package/src/capabilities/companion-chat-provisioner.ts +12 -11
  317. package/src/capabilities/connector.ts +3 -3
  318. package/src/capabilities/edge-model-resolver.ts +5 -2
  319. package/src/capabilities/index.ts +0 -2
  320. package/src/capabilities/react-surface.ts +135 -0
  321. package/src/capabilities/skill-definition.ts +4 -0
  322. package/src/capabilities/standalone-chats-query.test.ts +51 -0
  323. package/src/capabilities/state.ts +1 -1
  324. package/src/components/AgentProperties/AgentProperties.stories.tsx +6 -7
  325. package/src/components/AgentProperties/AgentProperties.tsx +37 -30
  326. package/src/components/Chat/Chat.tsx +275 -59
  327. package/src/components/Chat/{Chat.stories.tsx → Error.stories.tsx} +1 -1
  328. package/src/components/Chat/context.ts +8 -0
  329. package/src/components/Chat/events.ts +5 -0
  330. package/src/components/Chat/thread.test.ts +127 -0
  331. package/src/components/Chat/thread.ts +87 -0
  332. package/src/components/ChatPrompt/ChatActions.tsx +8 -8
  333. package/src/components/ChatPrompt/ChatMcpErrors.tsx +2 -2
  334. package/src/components/ChatPrompt/ChatOptions.stories.tsx +2 -1
  335. package/src/components/ChatPrompt/ChatOptions.tsx +5 -5
  336. package/src/components/ChatPrompt/ChatPrompt.tsx +33 -6
  337. package/src/components/ChatPrompt/index.ts +0 -1
  338. package/src/components/ChatThread/Anchor.stories.tsx +2 -1
  339. package/src/components/ChatThread/ChatThread.stories.tsx +99 -4
  340. package/src/components/ChatThread/ChatThread.tsx +34 -6
  341. package/src/components/ChatThread/Link.tsx +1 -0
  342. package/src/components/ChatThread/index.ts +2 -0
  343. package/src/components/ChatThread/registry.tsx +28 -4
  344. package/src/components/ChatThread/sync/index.ts +6 -0
  345. package/src/components/ChatThread/{sync.test.ts → sync/sync.test.ts} +167 -7
  346. package/src/components/ChatThread/{sync.ts → sync/sync.ts} +97 -3
  347. package/src/components/ChatThread/{tool-widget-state.ts → sync/tool-widget-state.ts} +1 -3
  348. package/src/components/ChatThread/widgets/BranchWidget.stories.tsx +83 -0
  349. package/src/components/ChatThread/widgets/BranchWidget.test.ts +55 -0
  350. package/src/components/ChatThread/widgets/BranchWidget.tsx +61 -0
  351. package/src/components/ChatThread/widgets/FallbackWidget.tsx +2 -2
  352. package/src/components/ChatThread/widgets/ReasoningWidget.ts +1 -1
  353. package/src/components/ChatThread/widgets/ReferenceWidget.ts +1 -6
  354. package/src/components/ChatThread/widgets/SuggestionWidget.ts +12 -3
  355. package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
  356. package/src/components/ChatThread/widgets/ToolWidget.tsx +15 -9
  357. package/src/components/ChatThread/widgets/defaults.ts +7 -1
  358. package/src/components/ChatThread/widgets/format-time.ts +45 -0
  359. package/src/components/ChatThread/widgets/index.ts +4 -1
  360. package/src/components/ChatThread/widgets/is-tool-message.ts +13 -0
  361. package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.stories.tsx +177 -0
  362. package/src/components/ConnectorAuthMenu/ConnectorAuthMenu.tsx +82 -0
  363. package/src/components/ConnectorAuthMenu/index.ts +5 -0
  364. package/src/components/ProcessTree/ProcessTree.stories.tsx +1 -1
  365. package/src/components/TaskList/TaskList.stories.tsx +19 -26
  366. package/src/components/TaskList/TaskList.tsx +32 -104
  367. package/src/components/ToolBlock/ToolBlock.tsx +1 -5
  368. package/src/components/ToolBlock/index.ts +1 -0
  369. package/src/components/ToolBlock/is-tool-message.ts +13 -0
  370. package/src/components/Toolbox/Toolbox.tsx +1 -1
  371. package/src/components/index.ts +1 -0
  372. package/src/containers/AgentArticle/AgentArticle.stories.tsx +18 -11
  373. package/src/containers/AgentArticle/AgentArticle.tsx +27 -151
  374. package/src/containers/AgentProperties/AgentProperties.tsx +21 -17
  375. package/src/containers/AssistantSettings/AssistantSettings.tsx +2 -0
  376. package/src/containers/AssistantSettings/OllamaModels.tsx +6 -4
  377. package/src/containers/ChatArticle/ChatArticle.stories.tsx +200 -27
  378. package/src/containers/ChatArticle/ChatArticle.tsx +25 -5
  379. package/src/containers/ChatCompanion/ChatCompanion.tsx +45 -10
  380. package/src/containers/ChatDialog/ChatDialog.tsx +4 -1
  381. package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +9 -6
  382. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +2 -0
  383. package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +40 -39
  384. package/src/containers/TracePanel/TracePanel.stories.tsx +9 -4
  385. package/src/containers/TracePanel/TracePanel.tsx +22 -6
  386. package/src/containers/TriggerStatus/TriggerStatus.tsx +9 -16
  387. package/src/containers/index.ts +0 -1
  388. package/src/execution-graph/SPEC.md +60 -2
  389. package/src/execution-graph/execution-graph.ts +15 -2
  390. package/src/execution-graph/index.ts +1 -0
  391. package/src/execution-graph/pending-block-status.ts +3 -2
  392. package/src/execution-graph/span-tree.test.ts +87 -1
  393. package/src/execution-graph/span-tree.ts +95 -0
  394. package/src/feed-logger.ts +6 -6
  395. package/src/hooks/index.ts +1 -1
  396. package/src/hooks/useChatProcessor.ts +2 -1
  397. package/src/hooks/useChatToolbarActions.ts +22 -19
  398. package/src/hooks/useContextObjects.ts +9 -3
  399. package/src/hooks/useSelectionContext.test.ts +93 -0
  400. package/src/hooks/useSelectionContext.ts +72 -0
  401. package/src/hooks/useSkillRegistry.ts +1 -1
  402. package/src/hooks/useTraceMessages.ts +5 -3
  403. package/src/operations/create-chat.ts +2 -2
  404. package/src/operations/fork-chat.ts +2 -2
  405. package/src/operations/generate-home-suggestions.test.ts +2 -2
  406. package/src/operations/index.ts +0 -1
  407. package/src/operations/prompt.node.test.ts +1 -1
  408. package/src/paths.ts +3 -3
  409. package/src/processor/index.ts +1 -0
  410. package/src/processor/processor.node.test.ts +1 -1
  411. package/src/processor/processor.ts +33 -5
  412. package/src/processor/prompt.test.ts +37 -0
  413. package/src/processor/prompt.ts +42 -0
  414. package/src/processor/streaming.node.test.ts +196 -0
  415. package/src/skills/assistant/skill.node.test.ts +2 -2
  416. package/src/skills/assistant/skill.ts +3 -5
  417. package/src/templates/routine-templates.test.ts +1 -2
  418. package/src/templates/scaffold.ts +3 -3
  419. package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
  420. package/src/testing/data/trace-timeline-remote.dx.json +1 -1
  421. package/src/testing/data/trace-timeline.dx.json +1 -2
  422. package/src/testing/trace-timeline.node.test.ts +3 -3
  423. package/src/translations.ts +11 -10
  424. package/src/types/AssistantCapabilities.ts +1 -1
  425. package/src/types/AssistantOperation.ts +8 -31
  426. package/src/types/ChatSurface.ts +3 -3
  427. package/src/types/Ollama.ts +1 -1
  428. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs +0 -161
  429. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +0 -7
  430. package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs +0 -40
  431. package/dist/lib/neutral/AgentProperties-LFTEYJ54.mjs.map +0 -7
  432. package/dist/lib/neutral/AssistantPlugin.mjs +0 -10
  433. package/dist/lib/neutral/AssistantPlugin.mjs.map +0 -7
  434. package/dist/lib/neutral/AssistantPlugin.node.mjs +0 -72
  435. package/dist/lib/neutral/AssistantPlugin.node.mjs.map +0 -7
  436. package/dist/lib/neutral/AssistantPlugin.workerd.mjs +0 -13
  437. package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +0 -7
  438. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +0 -302
  439. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +0 -7
  440. package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs +0 -8
  441. package/dist/lib/neutral/ChatArticle-OO7GGEFW.mjs.map +0 -7
  442. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs +0 -128
  443. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +0 -7
  444. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs +0 -74
  445. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +0 -7
  446. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +0 -72
  447. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +0 -7
  448. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs +0 -34
  449. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +0 -7
  450. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +0 -114
  451. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +0 -7
  452. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +0 -63
  453. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +0 -7
  454. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +0 -12
  455. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +0 -7
  456. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs +0 -95
  457. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +0 -7
  458. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs +0 -23
  459. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +0 -7
  460. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs +0 -32
  461. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +0 -7
  462. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +0 -7
  463. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs +0 -44
  464. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +0 -7
  465. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs +0 -249
  466. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +0 -7
  467. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +0 -97
  468. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +0 -7
  469. package/dist/lib/neutral/capabilities/index.mjs +0 -47
  470. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  471. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs +0 -9
  472. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +0 -7
  473. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs +0 -420
  474. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +0 -7
  475. package/dist/lib/neutral/chunk-BXI2R4OO.mjs +0 -410
  476. package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +0 -7
  477. package/dist/lib/neutral/chunk-CMPLPDYE.mjs +0 -30
  478. package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +0 -7
  479. package/dist/lib/neutral/chunk-GPHT3HYS.mjs +0 -8
  480. package/dist/lib/neutral/chunk-GPHT3HYS.mjs.map +0 -7
  481. package/dist/lib/neutral/chunk-HKLSFB5I.mjs +0 -90
  482. package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +0 -7
  483. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  484. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  485. package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +0 -7
  486. package/dist/lib/neutral/chunk-LS72HWMM.mjs +0 -42
  487. package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +0 -7
  488. package/dist/lib/neutral/chunk-OZWZGIV2.mjs +0 -12
  489. package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +0 -7
  490. package/dist/lib/neutral/chunk-QOKLFHUS.mjs +0 -13
  491. package/dist/lib/neutral/chunk-QOKLFHUS.mjs.map +0 -7
  492. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs +0 -155
  493. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +0 -7
  494. package/dist/lib/neutral/chunk-U4LTLBAX.mjs +0 -56
  495. package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +0 -7
  496. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs +0 -115
  497. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +0 -7
  498. package/dist/lib/neutral/chunk-V2Y4XE3O.mjs +0 -12
  499. package/dist/lib/neutral/chunk-V2Y4XE3O.mjs.map +0 -7
  500. package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
  501. package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
  502. package/dist/lib/neutral/chunk-XVGEJWJX.mjs +0 -133
  503. package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +0 -7
  504. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs +0 -126
  505. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +0 -7
  506. package/dist/lib/neutral/components/index.mjs +0 -2527
  507. package/dist/lib/neutral/components/index.mjs.map +0 -7
  508. package/dist/lib/neutral/connector-ITLLTBPZ.mjs +0 -70
  509. package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +0 -7
  510. package/dist/lib/neutral/containers/index.mjs +0 -31
  511. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  512. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs +0 -56
  513. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +0 -7
  514. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs +0 -76
  515. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +0 -7
  516. package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs +0 -55
  517. package/dist/lib/neutral/edge-model-resolver-WDJWDZTT.mjs.map +0 -7
  518. package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs +0 -58
  519. package/dist/lib/neutral/ensure-companion-chat-AMOF3C66.mjs.map +0 -7
  520. package/dist/lib/neutral/execution-graph/index.mjs +0 -977
  521. package/dist/lib/neutral/execution-graph/index.mjs.map +0 -7
  522. package/dist/lib/neutral/extensions/index.mjs +0 -8
  523. package/dist/lib/neutral/extensions/index.mjs.map +0 -7
  524. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs +0 -92
  525. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +0 -7
  526. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +0 -93
  527. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +0 -7
  528. package/dist/lib/neutral/hooks/index.mjs +0 -877
  529. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  530. package/dist/lib/neutral/index.mjs +0 -42
  531. package/dist/lib/neutral/index.mjs.map +0 -7
  532. package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs +0 -24
  533. package/dist/lib/neutral/local-model-resolver-I2BENFFS.mjs.map +0 -7
  534. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +0 -41
  535. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +0 -7
  536. package/dist/lib/neutral/meta.json +0 -1
  537. package/dist/lib/neutral/meta.mjs +0 -12
  538. package/dist/lib/neutral/meta.mjs.map +0 -7
  539. package/dist/lib/neutral/migrations-7DEMVBOG.mjs +0 -28
  540. package/dist/lib/neutral/migrations-7DEMVBOG.mjs.map +0 -7
  541. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +0 -18
  542. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +0 -7
  543. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +0 -8
  544. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +0 -7
  545. package/dist/lib/neutral/operations/index.mjs +0 -8
  546. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  547. package/dist/lib/neutral/plugin.mjs +0 -16
  548. package/dist/lib/neutral/plugin.mjs.map +0 -7
  549. package/dist/lib/neutral/plugin.workerd.mjs +0 -13
  550. package/dist/lib/neutral/plugin.workerd.mjs.map +0 -7
  551. package/dist/lib/neutral/react-surface-HEJEK44F.mjs +0 -171
  552. package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +0 -7
  553. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +0 -28
  554. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +0 -7
  555. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs +0 -102
  556. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +0 -7
  557. package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs +0 -48
  558. package/dist/lib/neutral/set-current-chat-VWBPSIMZ.mjs.map +0 -7
  559. package/dist/lib/neutral/settings-7Q3RITIT.mjs +0 -28
  560. package/dist/lib/neutral/settings-7Q3RITIT.mjs.map +0 -7
  561. package/dist/lib/neutral/skill-definition-553MQRTR.mjs +0 -8
  562. package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +0 -7
  563. package/dist/lib/neutral/skills/index.mjs +0 -8
  564. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  565. package/dist/lib/neutral/state-4LGAKSSD.mjs +0 -34
  566. package/dist/lib/neutral/state-4LGAKSSD.mjs.map +0 -7
  567. package/dist/lib/neutral/testing.mjs +0 -8
  568. package/dist/lib/neutral/testing.mjs.map +0 -7
  569. package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs +0 -21
  570. package/dist/lib/neutral/toggle-trace-panel-debug-JGTB6KVJ.mjs.map +0 -7
  571. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +0 -8
  572. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +0 -7
  573. package/dist/lib/neutral/translations.mjs +0 -217
  574. package/dist/lib/neutral/translations.mjs.map +0 -7
  575. package/dist/lib/neutral/types/index.mjs +0 -24
  576. package/dist/lib/neutral/types/index.mjs.map +0 -7
  577. package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs +0 -61
  578. package/dist/lib/neutral/update-chat-name-IJJELRR6.mjs.map +0 -7
  579. package/dist/types/src/capabilities/migrations.d.ts +0 -5
  580. package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
  581. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  582. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  583. package/dist/types/src/components/Chat/Chat.stories.d.ts.map +0 -1
  584. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +0 -10
  585. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +0 -1
  586. package/dist/types/src/components/ChatThread/sync.d.ts.map +0 -1
  587. package/dist/types/src/components/ChatThread/sync.test.d.ts.map +0 -1
  588. package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +0 -1
  589. package/dist/types/src/components/ChatThread/tool-widget-state.test.d.ts.map +0 -1
  590. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts +0 -6
  591. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +0 -1
  592. package/dist/types/src/containers/PlanArticle/index.d.ts +0 -2
  593. package/dist/types/src/containers/PlanArticle/index.d.ts.map +0 -1
  594. package/dist/types/src/hooks/useFlush.d.ts +0 -6
  595. package/dist/types/src/hooks/useFlush.d.ts.map +0 -1
  596. package/dist/types/src/operations/resolve-navigation-targets.d.ts +0 -5
  597. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +0 -1
  598. package/src/AssistantPlugin.conversations.json +0 -1
  599. package/src/capabilities/migrations.ts +0 -28
  600. package/src/capabilities/navigation-resolver.ts +0 -20
  601. package/src/capabilities/react-surface.tsx +0 -177
  602. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +0 -42
  603. package/src/components/ChatThread/DEBUG.md +0 -64
  604. package/src/containers/PlanArticle/PlanArticle.tsx +0 -37
  605. package/src/containers/PlanArticle/index.ts +0 -5
  606. package/src/hooks/useFlush.ts +0 -35
  607. package/src/operations/resolve-navigation-targets.ts +0 -44
  608. /package/dist/types/src/components/ChatThread/{sync.test.d.ts → sync/sync.test.d.ts} +0 -0
  609. /package/dist/types/src/components/ChatThread/{tool-widget-state.d.ts → sync/tool-widget-state.d.ts} +0 -0
  610. /package/dist/types/src/components/ChatThread/{tool-widget-state.test.d.ts → sync/tool-widget-state.test.d.ts} +0 -0
  611. /package/src/components/ChatThread/{tool-widget-state.test.ts → sync/tool-widget-state.test.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-connector.mjs","names":[],"sources":["../../src/capabilities/connector.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Format, Obj, Ref } from '@dxos/echo';\nimport { AccessToken } from '@dxos/link';\nimport { Connection, Connector, type CredentialForm } from '@dxos/plugin-connector';\n\nimport { ANTHROPIC_PROVIDER_ID, ANTHROPIC_SOURCE } from '../constants';\n\n/** API-key form for the Anthropic BYOK provider; key is best-effort validated against `/v1/models`. */\nconst AnthropicTokenForm = Schema.Struct({\n token: Schema.String.pipe(Format.FormatAnnotation.set(Format.TypeFormat.Password)).annotations({\n title: 'API key',\n description: 'Your Anthropic API key — find it at https://console.anthropic.com/settings/keys.',\n }),\n});\n\n/**\n * Best-effort validation: 401/403 from Anthropic blocks the save; CORS/network failures\n * are tolerated so the form still works in environments where the direct browser call is blocked.\n */\nconst validateAnthropicKey = (apiKey: string): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: () =>\n fetch('https://api.anthropic.com/v1/models', {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true',\n },\n }),\n catch: (cause) => cause,\n }).pipe(\n Effect.matchEffect({\n onSuccess: (response) =>\n response.status === 401 || response.status === 403\n ? Effect.fail(\n new Error('Invalid Anthropic API key. Check it at https://console.anthropic.com/settings/keys.'),\n )\n : Effect.void,\n onFailure: () => Effect.void,\n }),\n );\n\nconst credentialForm: CredentialForm<Schema.Schema.Type<typeof AnthropicTokenForm>> = {\n schema: AnthropicTokenForm,\n defaultValues: { token: '' },\n // Validates before the dialog closes so 401/403 errors are shown inline.\n onValidate: ({ values }) => validateAnthropicKey(values.token.trim()),\n onSubmit: ({ values, connector }) =>\n Effect.sync(() => {\n const accessToken = Obj.make(AccessToken.AccessToken, {\n source: ANTHROPIC_SOURCE,\n token: values.token.trim(),\n });\n const connection = Obj.make(Connection.Connection, {\n name: connector.label ?? 'Anthropic',\n connectorId: connector.id,\n accessToken: Ref.make(accessToken),\n });\n return { kind: 'complete' as const, accessToken, connection };\n }),\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(Connector, [\n {\n id: ANTHROPIC_PROVIDER_ID,\n source: ANTHROPIC_SOURCE,\n label: 'Anthropic',\n credentialForm,\n },\n ]);\n }),\n);\n"],"mappings":";;;;;;;;;AAeA,IAAM,qBAAqB,OAAO,OAAO,EACvC,OAAO,OAAO,OAAO,KAAK,OAAO,iBAAiB,IAAI,OAAO,WAAW,QAAQ,CAAC,CAAC,CAAC,YAAY;CAC7F,OAAO;CACP,aAAa;AACf,CAAC,EACH,CAAC;;;;;AAMD,IAAM,wBAAwB,WAC5B,OAAO,WAAW;CAChB,WACE,MAAM,uCAAuC,EAC3C,SAAS;EACP,aAAa;EACb,qBAAqB;EACrB,6CAA6C;CAC/C,EACF,CAAC;CACH,QAAQ,UAAU;AACpB,CAAC,CAAC,CAAC,KACD,OAAO,YAAY;CACjB,YAAY,aACV,SAAS,WAAW,OAAO,SAAS,WAAW,MAC3C,OAAO,qBACL,IAAI,MAAM,qFAAqF,CACjG,IACA,OAAO;CACb,iBAAiB,OAAO;AAC1B,CAAC,CACH;AAEF,IAAM,iBAAgF;CACpF,QAAQ;CACR,eAAe,EAAE,OAAO,GAAG;CAE3B,aAAa,EAAE,aAAa,qBAAqB,OAAO,MAAM,KAAK,CAAC;CACpE,WAAW,EAAE,QAAQ,gBACnB,OAAO,WAAW;EAChB,MAAM,cAAc,IAAI,KAAK,YAAY,aAAa;GACpD,QAAQ;GACR,OAAO,OAAO,MAAM,KAAK;EAC3B,CAAC;EAMD,OAAO;GAAE,MAAM;GAAqB;GAAa,YAL9B,IAAI,KAAK,WAAW,YAAY;IACjD,MAAM,UAAU,SAAS;IACzB,aAAa,UAAU;IACvB,aAAa,IAAI,KAAK,WAAW;GACnC,CACiD;EAAW;CAC9D,CAAC;AACL;AAEA,IAAA,oBAAe,WAAW,WACxB,OAAO,WAAW,aAAa;CAC7B,OAAO,WAAW,YAAY,WAAW,CACvC;EACE,IAAI;EACJ,QAAQ;EACR,OAAO;EACP;CACF,CACF,CAAC;AACH,CAAC,CACH"}
@@ -0,0 +1,9 @@
1
+ //#region src/constants.ts
2
+ /** Stable id used by `plugin-connector` to look up the Anthropic provider entry. */
3
+ var ANTHROPIC_PROVIDER_ID = "anthropic";
4
+ /** Source string used in `AccessToken.source` and matched by `Header.byokLayer('anthropic.com')`. */
5
+ var ANTHROPIC_SOURCE = "anthropic.com";
6
+ //#endregion
7
+ export { ANTHROPIC_SOURCE as n, ANTHROPIC_PROVIDER_ID as t };
8
+
9
+ //# sourceMappingURL=chunk-constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-constants.mjs","names":[],"sources":["../../src/constants.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n/** Stable id used by `plugin-connector` to look up the Anthropic provider entry. */\nexport const ANTHROPIC_PROVIDER_ID = 'anthropic';\n\n/** Source string used in `AccessToken.source` and matched by `Header.byokLayer('anthropic.com')`. */\nexport const ANTHROPIC_SOURCE = 'anthropic.com';\n"],"mappings":";;AAKA,IAAa,wBAAwB;;AAGrC,IAAa,mBAAmB"}
@@ -0,0 +1,7 @@
1
+ import { createContext } from "@radix-ui/react-context";
2
+ //#region src/components/Chat/context.ts
3
+ var [ChatContextProvider, useChatContext] = createContext("Chat");
4
+ //#endregion
5
+ export { useChatContext as n, ChatContextProvider as t };
6
+
7
+ //# sourceMappingURL=chunk-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-context.mjs","names":[],"sources":["../../src/components/Chat/context.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\n\nimport { type Chat as ChatModule } from '@dxos/assistant-toolkit';\nimport { type Event } from '@dxos/async';\nimport { type Database } from '@dxos/echo';\nimport { type MarkdownStreamController } from '@dxos/react-ui-markdown';\nimport { type Message } from '@dxos/types';\n\nimport { type AiChatProcessor } from '../../processor';\nimport { type MessageSpan } from '../ChatThread';\nimport { type ChatEvent } from './events';\n\n/**\n * Wall-clock timestamps for the most-recent (or in-flight) request, lifted out of\n * `ChatStreamStatus` so the elapsed value survives across re-mounts triggered when wire's\n * drip queue toggles `wireDrainingEffect` (which removes/restores the footer block widget).\n * `endedAt` is `null` while the request is still active.\n */\nexport type ChatRequestTiming = {\n startedAt: number;\n endedAt: number | null;\n};\n\nexport type ChatContextValue = {\n debug?: boolean;\n event: Event<ChatEvent>;\n db?: Database.Database;\n chat?: ChatModule.Chat;\n messages: Message.Message[];\n processor: AiChatProcessor;\n requestTiming: ChatRequestTiming | null;\n /** The thread's editor controller, shared between `Chat.Thread` and `Chat.Minimap`. */\n controller: MarkdownStreamController | null;\n setController: (controller: MarkdownStreamController | null) => void;\n /** Per-message document offset ranges, published by `Chat.Thread`'s syncer. */\n messageRanges: MessageSpan[];\n setMessageRanges: (ranges: MessageSpan[]) => void;\n};\n\n// Internal: not re-exported from `Chat/index.ts`. Accessed by sibling components in this\n// package (e.g. `ChatStreamStatus`) without dragging in `Chat.tsx`'s heavy transitive\n// imports (transcription, etc.).\nexport const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');\n"],"mappings":";;AA8CA,IAAa,CAAC,qBAAqB,kBAAkB,cAAgC,MAAM"}
@@ -0,0 +1,53 @@
1
+ import { AiContext } from "@dxos/assistant";
2
+ import { Operation, Skill } from "@dxos/compute";
3
+ import { Capabilities, Capability } from "@dxos/app-framework";
4
+ import { AgentWizardSkill, AlarmSkill, Chat, DatabaseSkill } from "@dxos/assistant-toolkit";
5
+ import { Database, Feed, Obj, Ref } from "@dxos/echo";
6
+ import { AssistantOperation } from "#types";
7
+ import * as Effect from "effect/Effect";
8
+ import { AssistantSkill } from "#skills";
9
+ import { invariant } from "@dxos/invariant";
10
+ import { ClientCapabilities } from "@dxos/plugin-client";
11
+ //#region src/operations/create-chat.ts
12
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/create-chat.ts";
13
+ var handler = AssistantOperation.CreateChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db, name, instructions, addToSpace = true }) {
14
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
15
+ const space = (yield* Capability.get(ClientCapabilities.Client)).spaces.get(db.spaceId);
16
+ invariant(space, "Space not found", {
17
+ "~LogMeta": "~LogMeta",
18
+ F: __dxlog_file,
19
+ L: 24,
20
+ S: this,
21
+ A: ["space", "'Space not found'"]
22
+ });
23
+ const feed = space.db.add(Feed.make());
24
+ const chat = Chat.make({
25
+ name,
26
+ feed: Ref.make(feed),
27
+ instructions
28
+ });
29
+ Obj.setParent(feed, chat);
30
+ if (addToSpace) space.db.add(chat);
31
+ const { SkillManagerSkill } = yield* Effect.promise(() => import("@dxos/assistant-toolkit"));
32
+ const runtime = yield* Effect.runtime().pipe(Effect.provide(Database.layer(space.db)));
33
+ const binder = new AiContext.Binder({
34
+ feed,
35
+ runtime,
36
+ registry
37
+ });
38
+ yield* Effect.promise(() => binder.use((b) => b.bind({
39
+ skills: [
40
+ AssistantSkill,
41
+ DatabaseSkill,
42
+ AgentWizardSkill,
43
+ SkillManagerSkill,
44
+ AlarmSkill
45
+ ].map(({ key }) => Ref.fromURI(Skill.registryURI(key))),
46
+ objects: [Ref.make(chat)]
47
+ })));
48
+ return { object: chat };
49
+ })));
50
+ //#endregion
51
+ export { handler as default };
52
+
53
+ //# sourceMappingURL=chunk-create-chat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-create-chat.mjs","names":[],"sources":["../../src/operations/create-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AiContext } from '@dxos/assistant';\nimport { AgentWizardSkill, AlarmSkill, Chat, DatabaseSkill } from '@dxos/assistant-toolkit';\nimport { Operation, Skill } from '@dxos/compute';\nimport { Database, Feed, Obj, Ref } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AssistantSkill } from '#skills';\nimport { AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.CreateChat> = AssistantOperation.CreateChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db, name, instructions, addToSpace = true }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found');\n const feed = space.db.add(Feed.make());\n const chat = Chat.make({ name, feed: Ref.make(feed), instructions });\n Obj.setParent(feed, chat);\n if (addToSpace) {\n space.db.add(chat);\n }\n\n // Dynamic import to avoid circular dependency with the barrel that also exports SkillManagerHandlers.\n const { SkillManagerSkill } = yield* Effect.promise(() => import('@dxos/assistant-toolkit'));\n\n const runtime = yield* Effect.runtime<Database.Service>().pipe(Effect.provide(Database.layer(space.db)));\n const binder = new AiContext.Binder({ feed, runtime, registry });\n\n // Bind default skills via registry refs — no DB clone needed since the ECHO ref\n // resolver already spans the hypergraph registry.\n yield* Effect.promise(() =>\n binder.use((b: AiContext.Binder) =>\n b.bind({\n skills: [AssistantSkill, DatabaseSkill, AgentWizardSkill, SkillManagerSkill, AlarmSkill].map(({ key }) =>\n Ref.fromURI(Skill.registryURI(key)),\n ),\n objects: [Ref.make(chat)],\n }),\n ),\n );\n\n return { object: chat };\n }),\n ),\n);\n\nexport default handler;\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAM,UAAuE,mBAAmB,WAAW,KACzG,UAAU,YACR,OAAO,WAAW,WAAW,EAAE,IAAI,MAAM,cAAc,aAAa,QAAQ;CAC1E,MAAM,WAAW,OAAO,WAAW,IAAI,aAAa,YAAY;CAEhE,MAAM,SAAQ,OADQ,WAAW,IAAI,mBAAmB,MAAM,EAAA,CACzC,OAAO,IAAI,GAAG,OAAO;CAC1C,UAAU,OAAO,mBAAgB;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,CAAA,SAAA,mBAAA;CAAA,CAAC;CAClC,MAAM,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;CACrC,MAAM,OAAO,KAAK,KAAK;EAAE;EAAM,MAAM,IAAI,KAAK,IAAI;EAAG;CAAa,CAAC;CACnE,IAAI,UAAU,MAAM,IAAI;CACxB,IAAI,YACF,MAAM,GAAG,IAAI,IAAI;CAInB,MAAM,EAAE,sBAAsB,OAAO,OAAO,cAAc,OAAO,0BAA0B;CAE3F,MAAM,UAAU,OAAO,OAAO,QAA0B,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC;CACvG,MAAM,SAAS,IAAI,UAAU,OAAO;EAAE;EAAM;EAAS;CAAS,CAAC;CAI/D,OAAO,OAAO,cACZ,OAAO,KAAK,MACV,EAAE,KAAK;EACL,QAAQ;GAAC;GAAgB;GAAe;GAAkB;GAAmB;EAAU,CAAC,CAAC,KAAK,EAAE,UAC9F,IAAI,QAAQ,MAAM,YAAY,GAAG,CAAC,CACpC;EACA,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;CAC1B,CAAC,CACH,CACF;CAEA,OAAO,EAAE,QAAQ,KAAK;AACxB,CAAC,CACH,CACF"}
@@ -0,0 +1,70 @@
1
+ import { n as getChatsPath } from "./chunk-paths.mjs";
2
+ import { Operation, ServiceResolver, Skill } from "@dxos/compute";
3
+ import { Capabilities, Capability } from "@dxos/app-framework";
4
+ import { Agent, AgentSkill, Chat } from "@dxos/assistant-toolkit";
5
+ import { Database, Obj, Type } from "@dxos/echo";
6
+ import { Sequence } from "@dxos/conductor";
7
+ import { AssistantOperation } from "#types";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Layer from "effect/Layer";
10
+ import { SpaceCapabilities, SpaceOperation } from "@dxos/plugin-space";
11
+ //#region src/capabilities/create-object.ts
12
+ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
13
+ return [
14
+ Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
15
+ id: Type.getTypename(Chat.Chat),
16
+ createObject: (props, options) => Effect.gen(function* () {
17
+ const { object } = yield* Operation.invoke(AssistantOperation.CreateChat, {
18
+ db: options.db,
19
+ name: props?.name
20
+ });
21
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
22
+ object,
23
+ target: options.target,
24
+ targetNodeId: options.targetNodeId ?? getChatsPath(options.db.spaceId)
25
+ });
26
+ })
27
+ }),
28
+ Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
29
+ id: Type.getTypename(Skill.Skill),
30
+ inputSchema: AssistantOperation.SkillForm,
31
+ createObject: (props, options) => Effect.gen(function* () {
32
+ const object = Skill.make(props);
33
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
34
+ object,
35
+ target: options.target,
36
+ targetNodeId: options.targetNodeId
37
+ });
38
+ })
39
+ }),
40
+ Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
41
+ id: Type.getTypename(Sequence.Sequence),
42
+ createObject: (props, options) => Effect.gen(function* () {
43
+ const object = Obj.make(Sequence.Sequence, props);
44
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
45
+ object,
46
+ target: options.target,
47
+ targetNodeId: options.targetNodeId
48
+ });
49
+ })
50
+ }),
51
+ Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
52
+ id: Type.getTypename(Agent.Agent),
53
+ createObject: (props, options) => Effect.gen(function* () {
54
+ const object = yield* Agent.makeInitialized({
55
+ name: "",
56
+ instructions: ""
57
+ }, AgentSkill.make());
58
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
59
+ object,
60
+ target: options.target,
61
+ targetNodeId: options.targetNodeId
62
+ });
63
+ }).pipe(Effect.provide(ServiceResolver.provide({ space: options.db.spaceId }, Database.Service).pipe(Layer.provide(Capability.asLayer(Capabilities.ServiceResolver, ServiceResolver.ServiceResolver)))))
64
+ })
65
+ ];
66
+ }));
67
+ //#endregion
68
+ export { create_object_default as default };
69
+
70
+ //# sourceMappingURL=chunk-create-object.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-create-object.mjs","names":[],"sources":["../../src/capabilities/create-object.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Agent, AgentSkill, Chat } from '@dxos/assistant-toolkit';\nimport { Operation, ServiceResolver, Skill } from '@dxos/compute';\nimport { Sequence } from '@dxos/conductor';\nimport { Database, Obj, Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\n\nimport { AssistantOperation } from '#types';\n\nimport { getChatsPath } from '../paths';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return [\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Chat.Chat),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const { object } = yield* Operation.invoke(AssistantOperation.CreateChat, {\n db: options.db,\n name: props?.name,\n });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId ?? getChatsPath(options.db.spaceId),\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Skill.Skill),\n inputSchema: AssistantOperation.SkillForm,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Skill.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Sequence.Sequence),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Obj.make(Sequence.Sequence, props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n }),\n Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Agent.Agent),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = yield* Agent.makeInitialized({ name: '', instructions: '' }, AgentSkill.make());\n\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }).pipe(\n Effect.provide(\n ServiceResolver.provide({ space: options.db.spaceId }, Database.Service).pipe(\n Layer.provide(Capability.asLayer(Capabilities.ServiceResolver, ServiceResolver.ServiceResolver)),\n ),\n ),\n ),\n }),\n ];\n }),\n);\n"],"mappings":";;;;;;;;;;;AAkBA,IAAA,wBAAe,WAAW,WACxB,OAAO,WAAW,aAAa;CAC7B,OAAO;EACL,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,KAAK,IAAI;GAC9B,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,EAAE,WAAW,OAAO,UAAU,OAAO,mBAAmB,YAAY;KACxE,IAAI,QAAQ;KACZ,MAAM,OAAO;IACf,CAAC;IACD,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ,gBAAgB,aAAa,QAAQ,GAAG,OAAO;IACvE,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,MAAM,KAAK;GAChC,aAAa,mBAAmB;GAChC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,MAAM,KAAK,KAAK;IAC/B,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,SAAS,QAAQ;GACtC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,IAAI,KAAK,SAAS,UAAU,KAAK;IAChD,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC;EACL,CAAC;EACD,WAAW,YAAY,kBAAkB,mBAAmB;GAC1D,IAAI,KAAK,YAAY,MAAM,KAAK;GAChC,eAAe,OAAO,YACpB,OAAO,IAAI,aAAa;IACtB,MAAM,SAAS,OAAO,MAAM,gBAAgB;KAAE,MAAM;KAAI,cAAc;IAAG,GAAG,WAAW,KAAK,CAAC;IAE7F,OAAO,OAAO,UAAU,OAAO,eAAe,WAAW;KACvD;KACA,QAAQ,QAAQ;KAChB,cAAc,QAAQ;IACxB,CAAC;GACH,CAAC,CAAC,CAAC,KACD,OAAO,QACL,gBAAgB,QAAQ,EAAE,OAAO,QAAQ,GAAG,QAAQ,GAAG,SAAS,OAAO,CAAC,CAAC,KACvE,MAAM,QAAQ,WAAW,QAAQ,aAAa,iBAAiB,gBAAgB,eAAe,CAAC,CACjG,CACF,CACF;EACJ,CAAC;CACH;AACF,CAAC,CACH"}
@@ -0,0 +1,64 @@
1
+ import { n as ANTHROPIC_SOURCE } from "./chunk-constants.mjs";
2
+ import { AppCapabilities } from "@dxos/app-toolkit";
3
+ import { Header } from "@dxos/compute";
4
+ import { Capability } from "@dxos/app-framework";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Option from "effect/Option";
7
+ import { EdgeAiHttpClient, EdgeHttpClient } from "@dxos/edge-client";
8
+ import * as Layer from "effect/Layer";
9
+ import { invariant } from "@dxos/invariant";
10
+ import { ClientCapabilities } from "@dxos/plugin-client";
11
+ import * as AnthropicClient from "@effect/ai-anthropic/AnthropicClient";
12
+ import { AnthropicResolver } from "@dxos/ai/resolvers";
13
+ import { createEdgeIdentity } from "@dxos/client/edge";
14
+ //#region src/capabilities/edge-model-resolver.ts
15
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/capabilities/edge-model-resolver.ts";
16
+ var edgeModelResolver = Capability.makeModule(Effect.fnUntraced(function* () {
17
+ const manager = yield* Capability.Service;
18
+ let edgeClient;
19
+ let identitySubscription;
20
+ const getEdgeClient = () => {
21
+ if (!edgeClient) {
22
+ const [client] = manager.getAll(ClientCapabilities.Client);
23
+ invariant(client, "Client capability is required for edge AI requests.", {
24
+ "~LogMeta": "~LogMeta",
25
+ F: __dxlog_file,
26
+ L: 39,
27
+ S: this,
28
+ A: ["client", "'Client capability is required for edge AI requests.'"]
29
+ });
30
+ const [haloIdentity] = manager.getAll(ClientCapabilities.IdentityService);
31
+ invariant(haloIdentity, "HALO identity capability is required for edge AI requests.", {
32
+ "~LogMeta": "~LogMeta",
33
+ F: __dxlog_file,
34
+ L: 41,
35
+ S: this,
36
+ A: ["haloIdentity", "'HALO identity capability is required for edge AI requests.'"]
37
+ });
38
+ const edgeUrl = client.config.values.runtime?.services?.edge?.url;
39
+ invariant(edgeUrl, "EDGE services are not configured.", {
40
+ "~LogMeta": "~LogMeta",
41
+ F: __dxlog_file,
42
+ L: 43,
43
+ S: this,
44
+ A: ["edgeUrl", "'EDGE services are not configured.'"]
45
+ });
46
+ const created = new EdgeHttpClient(edgeUrl);
47
+ const updateIdentity = () => {
48
+ if (Option.isSome(haloIdentity.getSnapshot())) created.setIdentity(createEdgeIdentity(client));
49
+ };
50
+ updateIdentity();
51
+ identitySubscription = { unsubscribe: haloIdentity.subscribe(updateIdentity) };
52
+ edgeClient = created;
53
+ }
54
+ return edgeClient;
55
+ };
56
+ const httpClient = Header.byokLayer(ANTHROPIC_SOURCE).pipe(Layer.provide(EdgeAiHttpClient.layer(getEdgeClient)));
57
+ const anthropicClient = AnthropicClient.layer({ apiUrl: "http://edge.internal" }).pipe(Layer.provide(httpClient));
58
+ const anthropicResolverLayer = AnthropicResolver.make().pipe(Layer.provide(anthropicClient));
59
+ return [Capability.contributes(AppCapabilities.AiModelResolver, anthropicResolverLayer, () => Effect.sync(() => identitySubscription?.unsubscribe()))];
60
+ }));
61
+ //#endregion
62
+ export { edgeModelResolver as default };
63
+
64
+ //# sourceMappingURL=chunk-edge-model-resolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-edge-model-resolver.mjs","names":[],"sources":["../../src/capabilities/edge-model-resolver.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AnthropicClient from '@effect/ai-anthropic/AnthropicClient';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { AnthropicResolver } from '@dxos/ai/resolvers';\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { createEdgeIdentity } from '@dxos/client/edge';\nimport { Header } from '@dxos/compute';\nimport { EdgeAiHttpClient, EdgeHttpClient } from '@dxos/edge-client';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { ANTHROPIC_SOURCE } from '../constants';\n\n// Named alias so the module's inferred type stays portable (avoids TS2883 leaking the internal\n// `@dxos/ai/AiModelResolver` Layer type into the emitted declarations).\nexport type EdgeModelResolverCapabilities = Capability.Capability<typeof AppCapabilities.AiModelResolver>[];\n\nconst edgeModelResolver = Capability.makeModule<[], EdgeModelResolverCapabilities>(\n Effect.fnUntraced(function* () {\n const manager = yield* Capability.Service;\n\n // The authenticated EDGE client is resolved lazily on the first AI request. AI providers are\n // set up before the Client capability and user identity exist (the startup cascade activates\n // this module before `ClientReady`), so requiring the Client here would throw — or deadlock\n // if we blocked on it. `EdgeAiHttpClient` invokes this thunk per request, by which point the\n // Client is available.\n let edgeClient: EdgeHttpClient | undefined;\n let identitySubscription: { unsubscribe: () => void } | undefined;\n const getEdgeClient = (): EdgeHttpClient => {\n if (!edgeClient) {\n const [client] = manager.getAll(ClientCapabilities.Client);\n invariant(client, 'Client capability is required for edge AI requests.');\n const [haloIdentity] = manager.getAll(ClientCapabilities.IdentityService);\n invariant(haloIdentity, 'HALO identity capability is required for edge AI requests.');\n const edgeUrl = client.config.values.runtime?.services?.edge?.url;\n invariant(edgeUrl, 'EDGE services are not configured.');\n const created = new EdgeHttpClient(edgeUrl);\n const updateIdentity = () => {\n if (Option.isSome(haloIdentity.getSnapshot())) {\n created.setIdentity(createEdgeIdentity(client));\n }\n };\n updateIdentity();\n identitySubscription = { unsubscribe: haloIdentity.subscribe(updateIdentity) };\n edgeClient = created;\n }\n return edgeClient;\n };\n\n // `apiUrl` is a sentinel; `EdgeAiHttpClient` rewrites the request onto the EDGE\n // `/ai/generate/anthropic` route. `Header.byokLayer` wraps that client to inject `X-BYOK`.\n const httpClient = Header.byokLayer(ANTHROPIC_SOURCE).pipe(Layer.provide(EdgeAiHttpClient.layer(getEdgeClient)));\n const anthropicClient = AnthropicClient.layer({ apiUrl: 'http://edge.internal' }).pipe(Layer.provide(httpClient));\n const anthropicResolverLayer = AnthropicResolver.make().pipe(Layer.provide(anthropicClient));\n\n const contribution: Capability.Capability<typeof AppCapabilities.AiModelResolver> = Capability.contributes(\n AppCapabilities.AiModelResolver,\n anthropicResolverLayer,\n () => Effect.sync(() => identitySubscription?.unsubscribe()),\n );\n\n return [contribution];\n }),\n);\n\nexport default edgeModelResolver;\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,IAAM,oBAAoB,WAAW,WACnC,OAAO,WAAW,aAAa;CAC7B,MAAM,UAAU,OAAO,WAAW;CAOlC,IAAI;CACJ,IAAI;CACJ,MAAM,sBAAsC;EAC1C,IAAI,CAAC,YAAY;GACf,MAAM,CAAC,UAAU,QAAQ,OAAO,mBAAmB,MAAM;GACzD,UAAU,QAAQ,uDAAoD;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,UAAA,uDAAA;GAAA,CAAC;GACvE,MAAM,CAAC,gBAAgB,QAAQ,OAAO,mBAAmB,eAAe;GACxE,UAAU,cAAc,8DAA2D;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,gBAAA,8DAAA;GAAA,CAAC;GACpF,MAAM,UAAU,OAAO,OAAO,OAAO,SAAS,UAAU,MAAM;GAC9D,UAAU,SAAS,qCAAkC;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,CAAA,WAAA,qCAAA;GAAA,CAAC;GACtD,MAAM,UAAU,IAAI,eAAe,OAAO;GAC1C,MAAM,uBAAuB;IAC3B,IAAI,OAAO,OAAO,aAAa,YAAY,CAAC,GAC1C,QAAQ,YAAY,mBAAmB,MAAM,CAAC;GAElD;GACA,eAAe;GACf,uBAAuB,EAAE,aAAa,aAAa,UAAU,cAAc,EAAE;GAC7E,aAAa;EACf;EACA,OAAO;CACT;CAIA,MAAM,aAAa,OAAO,UAAU,gBAAgB,CAAC,CAAC,KAAK,MAAM,QAAQ,iBAAiB,MAAM,aAAa,CAAC,CAAC;CAC/G,MAAM,kBAAkB,gBAAgB,MAAM,EAAE,QAAQ,uBAAuB,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,UAAU,CAAC;CAChH,MAAM,yBAAyB,kBAAkB,KAAK,CAAC,CAAC,KAAK,MAAM,QAAQ,eAAe,CAAC;CAQ3F,OAAO,CAN6E,WAAW,YAC7F,gBAAgB,iBAChB,8BACM,OAAO,WAAW,sBAAsB,YAAY,CAAC,CAGrD,CAAY;AACtB,CAAC,CACH"}
@@ -0,0 +1,49 @@
1
+ import { Operation } from "@dxos/compute";
2
+ import { Capabilities, Capability } from "@dxos/app-framework";
3
+ import { Chat } from "@dxos/assistant-toolkit";
4
+ import { Filter, Obj, Query } from "@dxos/echo";
5
+ import { AssistantCapabilities, AssistantOperation } from "#types";
6
+ import * as Effect from "effect/Effect";
7
+ //#region src/operations/ensure-companion-chat.ts
8
+ var handler = AssistantOperation.EnsureCompanionChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db, companionTo }) {
9
+ const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);
10
+ const companionUri = Obj.getURI(companionTo);
11
+ const existingChat = (yield* Effect.promise(() => db.query(Query.select(Filter.id(companionTo.id)).targetOf(Chat.CompanionTo).source()).run())).at(-1);
12
+ if (existingChat) {
13
+ yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({
14
+ ...current,
15
+ [companionUri]: existingChat
16
+ }));
17
+ yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, {
18
+ companionTo,
19
+ chat: existingChat
20
+ }));
21
+ return {
22
+ chat: existingChat,
23
+ persisted: true
24
+ };
25
+ }
26
+ const cached = (yield* Capabilities.getAtomValue(AssistantCapabilities.CompanionChatCache))[companionUri];
27
+ if (cached) return {
28
+ chat: cached,
29
+ persisted: false
30
+ };
31
+ const { data } = yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.CreateChat, {
32
+ db,
33
+ addToSpace: false
34
+ }));
35
+ if (!data?.object) return yield* Effect.fail(/* @__PURE__ */ new Error("CreateChat did not return a chat object"));
36
+ const chat = data.object;
37
+ yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({
38
+ ...current,
39
+ [companionUri]: chat
40
+ }));
41
+ return {
42
+ chat,
43
+ persisted: false
44
+ };
45
+ })));
46
+ //#endregion
47
+ export { handler as default };
48
+
49
+ //# sourceMappingURL=chunk-ensure-companion-chat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ensure-companion-chat.mjs","names":[],"sources":["../../src/operations/ensure-companion-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Filter, Obj, Query } from '@dxos/echo';\n\nimport { AssistantCapabilities, AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.EnsureCompanionChat> =\n AssistantOperation.EnsureCompanionChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db, companionTo }) {\n const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);\n const companionUri = Obj.getURI(companionTo);\n\n // 1. Look for an existing persisted companion chat in the space.\n const existingChats = yield* Effect.promise(() =>\n db.query(Query.select(Filter.id(companionTo.id)).targetOf(Chat.CompanionTo).source()).run(),\n );\n const existingChat = existingChats.at(-1);\n if (existingChat) {\n // Cache the persisted chat so the graph connector can resolve it immediately\n // via the cache fallback, without waiting for AtomObj.make(ref) to hydrate.\n yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({\n ...current,\n [companionUri]: existingChat,\n }));\n yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, { companionTo, chat: existingChat }),\n );\n return { chat: existingChat, persisted: true };\n }\n\n // 2. Return cached transient chat for this companion if present.\n const cache = yield* Capabilities.getAtomValue(AssistantCapabilities.CompanionChatCache);\n const cached = cache[companionUri] as Chat.Chat | undefined;\n if (cached) {\n return { chat: cached, persisted: false };\n }\n\n // 3. Create a new transient chat, cache it, and return it without persisting.\n const { data } = yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.CreateChat, { db, addToSpace: false }),\n );\n if (!data?.object) {\n return yield* Effect.fail(new Error('CreateChat did not return a chat object'));\n }\n const chat = data.object;\n yield* Capabilities.updateAtomValue(AssistantCapabilities.CompanionChatCache, (current) => ({\n ...current,\n [companionUri]: chat,\n }));\n return { chat, persisted: false };\n }),\n ),\n );\n\nexport default handler;\n"],"mappings":";;;;;;;AAaA,IAAM,UACJ,mBAAmB,oBAAoB,KACrC,UAAU,YACR,OAAO,WAAW,WAAW,EAAE,IAAI,eAAe;CAChD,MAAM,mBAAmB,OAAO,WAAW,IAAI,aAAa,gBAAgB;CAC5E,MAAM,eAAe,IAAI,OAAO,WAAW;CAM3C,MAAM,gBAAe,OAHQ,OAAO,cAClC,GAAG,MAAM,MAAM,OAAO,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC5F,EAAA,CACmC,GAAG,EAAE;CACxC,IAAI,cAAc;EAGhB,OAAO,aAAa,gBAAgB,sBAAsB,qBAAqB,aAAa;GAC1F,GAAG;IACF,eAAe;EAClB,EAAE;EACF,OAAO,OAAO,cACZ,iBAAiB,cAAc,mBAAmB,gBAAgB;GAAE;GAAa,MAAM;EAAa,CAAC,CACvG;EACA,OAAO;GAAE,MAAM;GAAc,WAAW;EAAK;CAC/C;CAIA,MAAM,UAAS,OADM,aAAa,aAAa,sBAAsB,kBAAkB,EAAA,CAClE;CACrB,IAAI,QACF,OAAO;EAAE,MAAM;EAAQ,WAAW;CAAM;CAI1C,MAAM,EAAE,SAAS,OAAO,OAAO,cAC7B,iBAAiB,cAAc,mBAAmB,YAAY;EAAE;EAAI,YAAY;CAAM,CAAC,CACzF;CACA,IAAI,CAAC,MAAM,QACT,OAAO,OAAO,OAAO,qBAAK,IAAI,MAAM,yCAAyC,CAAC;CAEhF,MAAM,OAAO,KAAK;CAClB,OAAO,aAAa,gBAAgB,sBAAsB,qBAAqB,aAAa;EAC1F,GAAG;GACF,eAAe;CAClB,EAAE;CACF,OAAO;EAAE;EAAM,WAAW;CAAM;AAClC,CAAC,CACH,CACF"}
@@ -0,0 +1,78 @@
1
+ import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
2
+ import { Domino } from "@dxos/ui";
3
+ import { syntaxTree } from "@codemirror/language";
4
+ import { Facet } from "@codemirror/state";
5
+ //#region src/extensions/prompt-extension.ts
6
+ var promptHandlerFacet = Facet.define({ combine: (handlers) => handlers[0] ?? null });
7
+ var promptPlugin = ViewPlugin.fromClass(class {
8
+ decorations;
9
+ constructor(view) {
10
+ this.decorations = this.buildDecorations(view);
11
+ }
12
+ update(update) {
13
+ if (update.docChanged || update.viewportChanged || update.selectionSet || update.focusChanged || update.startState.facet(promptHandlerFacet) !== update.state.facet(promptHandlerFacet)) this.decorations = this.buildDecorations(update.view);
14
+ }
15
+ buildDecorations(view) {
16
+ const onRun = view.state.facet(promptHandlerFacet);
17
+ if (!onRun) return Decoration.none;
18
+ const ranges = [];
19
+ syntaxTree(view.state).iterate({ enter: (node) => {
20
+ if (node.name === "FencedCode") {
21
+ const info = node.node.getChild("CodeInfo");
22
+ if (info) {
23
+ const type = view.state.sliceDoc(info.from, info.to);
24
+ const text = node.node.getChild("CodeText");
25
+ if (type === "prompt" && text) {
26
+ const content = view.state.sliceDoc(text.from, text.to).trim();
27
+ if (content.length > 0) {
28
+ ranges.push(Decoration.line({ class: "cm-prompt-header" }).range(node.from, node.from));
29
+ ranges.push(Decoration.widget({
30
+ widget: new PromptRunWidget(content, onRun),
31
+ side: -1
32
+ }).range(node.from, node.from));
33
+ }
34
+ }
35
+ }
36
+ }
37
+ } });
38
+ return Decoration.set(ranges, true);
39
+ }
40
+ }, { decorations: (v) => v.decorations });
41
+ var promptTheme = EditorView.baseTheme({ ".cm-prompt-header": {
42
+ position: "relative",
43
+ overflow: "visible"
44
+ } });
45
+ /**
46
+ * CodeMirror extension that adds a "run" button to ```prompt fenced code blocks.
47
+ */
48
+ var promptRunExtension = ({ onRun }) => [
49
+ promptHandlerFacet.of(onRun),
50
+ promptPlugin,
51
+ promptTheme
52
+ ];
53
+ var PromptRunWidget = class extends WidgetType {
54
+ prompt;
55
+ onClick;
56
+ constructor(prompt, onClick) {
57
+ super();
58
+ this.prompt = prompt;
59
+ this.onClick = onClick;
60
+ }
61
+ eq(other) {
62
+ return this.prompt === other.prompt && this.onClick === other.onClick;
63
+ }
64
+ ignoreEvent() {
65
+ return false;
66
+ }
67
+ toDOM() {
68
+ return Domino.of("button").classNames("dx-button h-6 w-6 min-h-0 p-1 absolute top-0 right-0 bg-green-bg hover:bg-green-surface text-green-fg").on("mousedown", (event) => {
69
+ event.preventDefault();
70
+ event.stopPropagation();
71
+ this.onClick(this.prompt);
72
+ }).append(Domino.of("svg", Domino.SVG).classNames("w-4 h-4 cursor-pointer").append(Domino.of("use", Domino.SVG).attributes({ href: Domino.icon("ph--sparkle--regular") }))).root;
73
+ }
74
+ };
75
+ //#endregion
76
+ export { promptRunExtension as t };
77
+
78
+ //# sourceMappingURL=chunk-extensions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-extensions.mjs","names":[],"sources":["../../src/extensions/prompt-extension.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type Extension, Facet, type Range } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';\n\nimport { Domino } from '@dxos/ui';\n\nexport type PromptExtensionOptions = {\n /** Called when the user clicks the run button on a prompt code block. */\n onRun: (promptText: string) => void;\n};\n\ntype OnRun = (text: string) => void;\n\n// Module-level facet so the plugin singleton can read the latest handler.\nconst promptHandlerFacet = Facet.define<OnRun, OnRun | null>({\n combine: (handlers) => handlers[0] ?? null,\n});\n\n// Module-level singleton — CM6 deduplicates by reference equality, preventing duplicate buttons\n// when the extension is contributed more than once.\nconst promptPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (\n update.docChanged ||\n update.viewportChanged ||\n update.selectionSet ||\n update.focusChanged ||\n update.startState.facet(promptHandlerFacet) !== update.state.facet(promptHandlerFacet)\n ) {\n this.decorations = this.buildDecorations(update.view);\n }\n }\n\n buildDecorations(view: EditorView): DecorationSet {\n const onRun = view.state.facet(promptHandlerFacet);\n if (!onRun) {\n return Decoration.none;\n }\n\n const ranges: Range<Decoration>[] = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name === 'FencedCode') {\n const info = node.node.getChild('CodeInfo');\n if (info) {\n const type = view.state.sliceDoc(info.from, info.to);\n const text = node.node.getChild('CodeText');\n if (type === 'prompt' && text) {\n const content = view.state.sliceDoc(text.from, text.to).trim();\n if (content.length > 0) {\n // Mark the header line as a positioned container for the button overlay.\n ranges.push(Decoration.line({ class: 'cm-prompt-header' }).range(node.from, node.from));\n ranges.push(\n Decoration.widget({ widget: new PromptRunWidget(content, onRun), side: -1 }).range(\n node.from,\n node.from,\n ),\n );\n }\n }\n }\n }\n },\n });\n\n // sort=true lets CM6 order by startSide (line decorations before widgets at the same position).\n return Decoration.set(ranges, true);\n }\n },\n {\n decorations: (v) => v.decorations,\n },\n);\n\n// Base theme wires up the positioned container on the header line.\nconst promptTheme = EditorView.baseTheme({\n '.cm-prompt-header': {\n position: 'relative',\n overflow: 'visible',\n },\n});\n\n/**\n * CodeMirror extension that adds a \"run\" button to ```prompt fenced code blocks.\n */\nexport const promptRunExtension = ({ onRun }: PromptExtensionOptions): Extension => [\n promptHandlerFacet.of(onRun),\n promptPlugin,\n promptTheme,\n];\n\nclass PromptRunWidget extends WidgetType {\n constructor(\n private readonly prompt: string,\n private readonly onClick: OnRun,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this.prompt === other.prompt && this.onClick === other.onClick;\n }\n\n override ignoreEvent() {\n return false;\n }\n\n override toDOM() {\n return Domino.of('button')\n .classNames(\n 'dx-button h-6 w-6 min-h-0 p-1 absolute top-0 right-0 bg-green-bg hover:bg-green-surface text-green-fg',\n )\n .on('mousedown', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.onClick(this.prompt);\n })\n .append(\n Domino.of('svg', Domino.SVG)\n .classNames('w-4 h-4 cursor-pointer')\n .append(\n Domino.of('use', Domino.SVG).attributes({\n href: Domino.icon('ph--sparkle--regular'),\n }),\n ),\n ).root;\n }\n}\n"],"mappings":";;;;;AAkBA,IAAM,qBAAqB,MAAM,OAA4B,EAC3D,UAAU,aAAa,SAAS,MAAM,KACxC,CAAC;AAID,IAAM,eAAe,WAAW,UAC9B,MAAM;CACJ;CAEA,YAAY,MAAkB;EAC5B,KAAK,cAAc,KAAK,iBAAiB,IAAI;CAC/C;CAEA,OAAO,QAAoB;EACzB,IACE,OAAO,cACP,OAAO,mBACP,OAAO,gBACP,OAAO,gBACP,OAAO,WAAW,MAAM,kBAAkB,MAAM,OAAO,MAAM,MAAM,kBAAkB,GAErF,KAAK,cAAc,KAAK,iBAAiB,OAAO,IAAI;CAExD;CAEA,iBAAiB,MAAiC;EAChD,MAAM,QAAQ,KAAK,MAAM,MAAM,kBAAkB;EACjD,IAAI,CAAC,OACH,OAAO,WAAW;EAGpB,MAAM,SAA8B,CAAC;EAErC,WAAW,KAAK,KAAK,CAAC,CAAC,QAAQ,EAC7B,QAAQ,SAAS;GACf,IAAI,KAAK,SAAS,cAAc;IAC9B,MAAM,OAAO,KAAK,KAAK,SAAS,UAAU;IAC1C,IAAI,MAAM;KACR,MAAM,OAAO,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE;KACnD,MAAM,OAAO,KAAK,KAAK,SAAS,UAAU;KAC1C,IAAI,SAAS,YAAY,MAAM;MAC7B,MAAM,UAAU,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE,CAAC,CAAC,KAAK;MAC7D,IAAI,QAAQ,SAAS,GAAG;OAEtB,OAAO,KAAK,WAAW,KAAK,EAAE,OAAO,mBAAmB,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;OACtF,OAAO,KACL,WAAW,OAAO;QAAE,QAAQ,IAAI,gBAAgB,SAAS,KAAK;QAAG,MAAM;OAAG,CAAC,CAAC,CAAC,MAC3E,KAAK,MACL,KAAK,IACP,CACF;MACF;KACF;IACF;GACF;EACF,EACF,CAAC;EAGD,OAAO,WAAW,IAAI,QAAQ,IAAI;CACpC;AACF,GACA,EACE,cAAc,MAAM,EAAE,YACxB,CACF;AAGA,IAAM,cAAc,WAAW,UAAU,EACvC,qBAAqB;CACnB,UAAU;CACV,UAAU;AACZ,EACF,CAAC;;;;AAKD,IAAa,sBAAsB,EAAE,YAA+C;CAClF,mBAAmB,GAAG,KAAK;CAC3B;CACA;AACF;AAEA,IAAM,kBAAN,cAA8B,WAAW;CAEpB;CACA;CAFnB,YACE,QACA,SACA;EACA,MAAM;EAHW,KAAA,SAAA;EACA,KAAA,UAAA;CAGnB;CAEA,GAAY,OAAa;EACvB,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,YAAY,MAAM;CAChE;CAEA,cAAuB;EACrB,OAAO;CACT;CAEA,QAAiB;EACf,OAAO,OAAO,GAAG,QAAQ,CAAA,CACtB,WACC,uGACF,CAAA,CACC,GAAG,cAAc,UAAU;GAC1B,MAAM,eAAe;GACrB,MAAM,gBAAgB;GACtB,KAAK,QAAQ,KAAK,MAAM;EAC1B,CAAC,CAAA,CACA,OACC,OAAO,GAAG,OAAO,OAAO,GAAG,CAAA,CACxB,WAAW,wBAAwB,CAAA,CACnC,OACC,OAAO,GAAG,OAAO,OAAO,GAAG,CAAC,CAAC,WAAW,EACtC,MAAM,OAAO,KAAK,sBAAsB,EAC1C,CAAC,CACH,CACJ,CAAC,CAAC;CACN;AACF"}
@@ -0,0 +1,83 @@
1
+ import { GraphPath, LayoutOperation } from "@dxos/app-toolkit";
2
+ import { AiContext, SessionLink } from "@dxos/assistant";
3
+ import { Operation } from "@dxos/compute";
4
+ import { Capabilities, Capability } from "@dxos/app-framework";
5
+ import { Chat } from "@dxos/assistant-toolkit";
6
+ import { Database, Feed, Filter, Obj, Ref } from "@dxos/echo";
7
+ import { Message } from "@dxos/types";
8
+ import { AssistantOperation } from "#types";
9
+ import * as Effect from "effect/Effect";
10
+ import { invariant } from "@dxos/invariant";
11
+ import { ClientCapabilities } from "@dxos/plugin-client";
12
+ import { SpaceOperation } from "@dxos/plugin-space";
13
+ //#region src/operations/fork-chat.ts
14
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/fork-chat.ts";
15
+ var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ chat, companionTo }) {
16
+ const { db } = yield* Database.Service;
17
+ const sourceFeed = yield* Database.load(chat.feed);
18
+ const space = (yield* Capability.get(ClientCapabilities.Client)).spaces.get(db.spaceId);
19
+ invariant(space, "Space not found.", {
20
+ "~LogMeta": "~LogMeta",
21
+ F: __dxlog_file,
22
+ L: 28,
23
+ S: this,
24
+ A: ["space", "'Space not found.'"]
25
+ });
26
+ const dbLayer = Database.layer(space.db);
27
+ const sorted = (yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer))).filter(Obj.instanceOf(Message.Message)).sort((a, b) => a.created.localeCompare(b.created));
28
+ const sourceName = Obj.getLabel(chat);
29
+ const { object: newChat } = yield* Operation.invoke(AssistantOperation.CreateChat, {
30
+ db,
31
+ name: sourceName ? `${sourceName} (fork)` : void 0
32
+ });
33
+ const newFeed = yield* Database.load(newChat.feed);
34
+ if (sorted.length > 0) {
35
+ const lastMessage = sorted[sorted.length - 1];
36
+ yield* Feed.append(newFeed, [Obj.make(SessionLink.SessionLink, {
37
+ feedRef: Ref.make(sourceFeed),
38
+ messageId: lastMessage.id
39
+ })]).pipe(Effect.provide(dbLayer));
40
+ }
41
+ const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(Effect.provide(dbLayer))).filter(Obj.instanceOf(AiContext.Binding));
42
+ if (sourceBindings.length > 0) {
43
+ const skillRefMap = /* @__PURE__ */ new Map();
44
+ const objectRefMap = /* @__PURE__ */ new Map();
45
+ for (const binding of sourceBindings) {
46
+ binding.skills.added.forEach((ref) => skillRefMap.set(ref.uri, ref));
47
+ binding.skills.removed.forEach((ref) => skillRefMap.delete(ref.uri));
48
+ binding.objects.added.forEach((ref) => objectRefMap.set(ref.uri, ref));
49
+ binding.objects.removed.forEach((ref) => objectRefMap.delete(ref.uri));
50
+ }
51
+ yield* Feed.append(newFeed, [Obj.make(AiContext.Binding, {
52
+ skills: {
53
+ added: Array.from(skillRefMap.values()),
54
+ removed: []
55
+ },
56
+ objects: {
57
+ added: Array.from(objectRefMap.values()),
58
+ removed: []
59
+ }
60
+ })]).pipe(Effect.provide(dbLayer));
61
+ }
62
+ if (companionTo) {
63
+ yield* Operation.invoke(SpaceOperation.AddRelation, {
64
+ db,
65
+ schema: Chat.CompanionTo,
66
+ source: newChat,
67
+ target: companionTo
68
+ });
69
+ const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);
70
+ yield* Effect.promise(() => operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, {
71
+ companionTo,
72
+ chat: newChat
73
+ }));
74
+ } else {
75
+ const chatPath = GraphPath.getObjectPathFromObject(newChat);
76
+ yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });
77
+ }
78
+ return { object: newChat };
79
+ })));
80
+ //#endregion
81
+ export { handler as default };
82
+
83
+ //# sourceMappingURL=chunk-fork-chat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-fork-chat.mjs","names":[],"sources":["../../src/operations/fork-chat.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { GraphPath, LayoutOperation } from '@dxos/app-toolkit';\nimport { AiContext, SessionLink } from '@dxos/assistant';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { Message } from '@dxos/types';\n\nimport { AssistantOperation } from '#types';\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.ForkChat> = AssistantOperation.ForkChat.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ chat, companionTo }) {\n const { db } = yield* Database.Service;\n const sourceFeed = yield* Database.load(chat.feed);\n\n const client = yield* Capability.get(ClientCapabilities.Client);\n const space = client.spaces.get(db.spaceId);\n invariant(space, 'Space not found.');\n\n const dbLayer = Database.layer(space.db);\n\n const messages = yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer));\n\n // Sort chronologically to find the last message.\n const sorted = messages\n .filter(Obj.instanceOf(Message.Message))\n .sort((a, b) => a.created.localeCompare(b.created));\n\n // Create a new chat, then apply source bindings and session link.\n const sourceName = Obj.getLabel(chat);\n const { object: newChat } = yield* Operation.invoke(AssistantOperation.CreateChat, {\n db,\n name: sourceName ? `${sourceName} (fork)` : undefined,\n });\n const newFeed = yield* Database.load(newChat.feed);\n\n if (sorted.length > 0) {\n const lastMessage = sorted[sorted.length - 1];\n\n // Append a SessionLink record pointing to the last message of the source feed.\n yield* Feed.append(newFeed, [\n Obj.make(SessionLink.SessionLink, {\n feedRef: Ref.make(sourceFeed),\n messageId: lastMessage.id,\n }),\n ]).pipe(Effect.provide(dbLayer));\n }\n\n // Copy source chat's skill and object bindings to the new feed.\n // Sort chronologically so add/remove events are applied in the correct order.\n const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(\n Effect.provide(dbLayer),\n )).filter(Obj.instanceOf(AiContext.Binding));\n\n if (sourceBindings.length > 0) {\n // Reduce binding events to the final active set.\n const skillRefMap = new Map<string, Ref.Ref<any>>();\n const objectRefMap = new Map<string, Ref.Ref<any>>();\n for (const binding of sourceBindings) {\n binding.skills.added.forEach((ref: Ref.Ref<any>) => skillRefMap.set(ref.uri, ref));\n binding.skills.removed.forEach((ref: Ref.Ref<any>) => skillRefMap.delete(ref.uri));\n binding.objects.added.forEach((ref: Ref.Ref<any>) => objectRefMap.set(ref.uri, ref));\n binding.objects.removed.forEach((ref: Ref.Ref<any>) => objectRefMap.delete(ref.uri));\n }\n\n yield* Feed.append(newFeed, [\n Obj.make(AiContext.Binding, {\n skills: { added: Array.from(skillRefMap.values()), removed: [] },\n objects: { added: Array.from(objectRefMap.values()), removed: [] },\n }),\n ]).pipe(Effect.provide(dbLayer));\n }\n\n if (companionTo) {\n // Wire the forked chat as a companion and switch to it without navigating away.\n yield* Operation.invoke(SpaceOperation.AddRelation, {\n db,\n schema: Chat.CompanionTo,\n source: newChat,\n target: companionTo,\n });\n const operationInvoker = yield* Capability.get(Capabilities.OperationInvoker);\n yield* Effect.promise(() =>\n operationInvoker.invokePromise(AssistantOperation.SetCurrentChat, { companionTo, chat: newChat }),\n );\n } else {\n // Navigate to the forked chat as a standalone plank.\n const chatPath = GraphPath.getObjectPathFromObject(newChat);\n yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });\n }\n\n return { object: newChat };\n }),\n ),\n);\n\nexport default handler;\n"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { AppCapabilities } from "@dxos/app-toolkit";
2
+ import { Operation } from "@dxos/compute";
3
+ import { Capabilities, Capability } from "@dxos/app-framework";
4
+ import * as Schema from "effect/Schema";
5
+ import { AiService } from "@dxos/ai";
6
+ import { Collection, Filter, Obj, Order, Query, Type } from "@dxos/echo";
7
+ import { AssistantCapabilities, AssistantOperation } from "#types";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Option from "effect/Option";
10
+ import { log } from "@dxos/log";
11
+ import { HiddenAnnotation, getTypeAnnotation } from "@dxos/echo/Annotation";
12
+ import { Kind } from "@dxos/echo/Entity";
13
+ import * as LanguageModel from "@effect/ai/LanguageModel";
14
+ //#region src/operations/generate-home-suggestions.ts
15
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/generate-home-suggestions.ts";
16
+ var MODEL = "com.anthropic.model.claude-haiku-4-5.default";
17
+ var CACHE_TTL_MS = 3600 * 1e3;
18
+ var RECENT_LIMIT = 20;
19
+ var MAX_PROMPTS = 3;
20
+ var ONBOARDING_DOCUMENT_LABELS = /* @__PURE__ */ new Set(["Welcome to Composer"]);
21
+ var handler = AssistantOperation.GenerateHomeSuggestions.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db }) {
22
+ const spaceId = db.spaceId;
23
+ const entry = (yield* Capabilities.getAtomValue(AssistantCapabilities.HomeSuggestionsCache))[spaceId];
24
+ if (entry && Date.now() - entry.generatedAt < CACHE_TTL_MS) return { prompts: [...entry.prompts] };
25
+ const schemas = yield* Capability.getAll(AppCapabilities.Schema);
26
+ const collectionTypename = Type.getTypename(Collection.Collection);
27
+ const types = schemas.flat().filter(Type.isType).filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== Kind.Relation).filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false))).filter((type) => Type.getTypename(type) !== collectionTypename);
28
+ let prompts = [];
29
+ if (types.length > 0) {
30
+ const items = (yield* Effect.promise(() => db.query(Query.select(Filter.or(...types.map((type) => Filter.type(type)))).orderBy(Order.updated("desc")).limit(RECENT_LIMIT)).run())).filter(Obj.isObject).filter((obj) => !Obj.isDeleted(obj)).filter((obj) => !ONBOARDING_DOCUMENT_LABELS.has(Obj.getLabel(obj) ?? "")).flatMap((obj) => {
31
+ const label = Obj.getLabel(obj);
32
+ const typename = Obj.getTypename(obj);
33
+ return label && typename ? [{
34
+ label,
35
+ typename
36
+ }] : [];
37
+ });
38
+ if (items.length > 0) prompts = yield* generateSuggestions(items);
39
+ }
40
+ const validPrompts = prompts.map((p) => p.trim()).filter((p) => p.length > 0);
41
+ if (validPrompts.length > 0) yield* Capabilities.updateAtomValue(AssistantCapabilities.HomeSuggestionsCache, (current) => ({
42
+ ...current,
43
+ [spaceId]: {
44
+ generatedAt: Date.now(),
45
+ prompts: validPrompts
46
+ }
47
+ }));
48
+ return { prompts: validPrompts };
49
+ })));
50
+ var generateSuggestions = (items) => Effect.scoped(LanguageModel.generateObject({
51
+ schema: Schema.Struct({ prompts: Schema.Array(Schema.String) }),
52
+ prompt: [
53
+ "Generate exactly 3 short, imperative, specific starter prompts for an AI assistant with access to this workspace.",
54
+ "Each prompt must be one sentence, at most 10 words, with no markdown or numbering.",
55
+ "",
56
+ "Recent workspace objects:",
57
+ ...items.map(({ label, typename }) => `- ${label} (${typename})`)
58
+ ].join("\n")
59
+ })).pipe(Effect.map(({ value }) => [...value.prompts.slice(0, MAX_PROMPTS)]), Effect.catchAll((err) => {
60
+ log.warn("generate-home-suggestions: LLM call failed", { err }, {
61
+ "~LogMeta": "~LogMeta",
62
+ F: __dxlog_file,
63
+ L: 110,
64
+ S: void 0
65
+ });
66
+ return Effect.succeed([]);
67
+ }), Effect.provide(AiService.model(MODEL)));
68
+ //#endregion
69
+ export { handler as default };
70
+
71
+ //# sourceMappingURL=chunk-generate-home-suggestions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-generate-home-suggestions.mjs","names":[],"sources":["../../src/operations/generate-home-suggestions.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as LanguageModel from '@effect/ai/LanguageModel';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService } from '@dxos/ai';\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Collection, Filter, Obj, Order, Query, Type } from '@dxos/echo';\nimport { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';\nimport { Kind as EntityKind } from '@dxos/echo/Entity';\nimport { log } from '@dxos/log';\n\nimport { AssistantCapabilities, AssistantOperation } from '#types';\n\nconst MODEL = 'com.anthropic.model.claude-haiku-4-5.default';\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst RECENT_LIMIT = 20;\nconst MAX_PROMPTS = 3;\n\n// Onboarding documents added by the system at identity creation — exclude them so a\n// brand-new personal space (containing only the welcome doc) still uses fallback prompts.\nconst ONBOARDING_DOCUMENT_LABELS = new Set(['Welcome to Composer']);\n\nconst handler: Operation.WithHandler<typeof AssistantOperation.GenerateHomeSuggestions> =\n AssistantOperation.GenerateHomeSuggestions.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ db }) {\n const spaceId = db.spaceId;\n\n // Cache check: return early if a fresh result exists.\n const cache = yield* Capabilities.getAtomValue(AssistantCapabilities.HomeSuggestionsCache);\n const entry = cache[spaceId];\n if (entry && Date.now() - entry.generatedAt < CACHE_TTL_MS) {\n return { prompts: [...entry.prompts] };\n }\n\n // Build the recent-objects filter (mirrors SpaceHomeRecent).\n const schemas = yield* Capability.getAll(AppCapabilities.Schema);\n const collectionTypename = Type.getTypename(Collection.Collection);\n const types = schemas\n .flat()\n .filter(Type.isType)\n .filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== EntityKind.Relation)\n .filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false)))\n .filter((type) => Type.getTypename(type) !== collectionTypename);\n\n let prompts: string[] = [];\n\n if (types.length > 0) {\n const objects = yield* Effect.promise(() =>\n db\n .query(\n Query.select(Filter.or(...types.map((type) => Filter.type(type))))\n .orderBy(Order.updated('desc'))\n .limit(RECENT_LIMIT),\n )\n .run(),\n );\n\n const items = objects\n .filter(Obj.isObject)\n .filter((obj) => !Obj.isDeleted(obj))\n .filter((obj) => !ONBOARDING_DOCUMENT_LABELS.has(Obj.getLabel(obj) ?? ''))\n .flatMap((obj): { label: string; typename: string }[] => {\n const label = Obj.getLabel(obj);\n const typename = Obj.getTypename(obj);\n return label && typename ? [{ label, typename }] : [];\n });\n\n if (items.length > 0) {\n prompts = yield* generateSuggestions(items);\n }\n }\n\n const validPrompts = prompts.map((p) => p.trim()).filter((p) => p.length > 0);\n\n if (validPrompts.length > 0) {\n yield* Capabilities.updateAtomValue(AssistantCapabilities.HomeSuggestionsCache, (current) => ({\n ...current,\n [spaceId]: { generatedAt: Date.now(), prompts: validPrompts },\n }));\n }\n\n return { prompts: validPrompts };\n }),\n ),\n );\n\nconst generateSuggestions = (items: { label: string; typename: string }[]) =>\n Effect.scoped(\n LanguageModel.generateObject({\n schema: Schema.Struct({ prompts: Schema.Array(Schema.String) }),\n prompt: [\n 'Generate exactly 3 short, imperative, specific starter prompts for an AI assistant with access to this workspace.',\n 'Each prompt must be one sentence, at most 10 words, with no markdown or numbering.',\n '',\n 'Recent workspace objects:',\n ...items.map(({ label, typename }) => `- ${label} (${typename})`),\n ].join('\\n'),\n }),\n ).pipe(\n Effect.map(({ value }) => [...value.prompts.slice(0, MAX_PROMPTS)]),\n Effect.catchAll((err) => {\n log.warn('generate-home-suggestions: LLM call failed', { err });\n return Effect.succeed<string[]>([]);\n }),\n Effect.provide(AiService.model(MODEL)),\n );\n\nexport default handler;\n"],"mappings":"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"}