@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
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { useOperationInvoker } from '@dxos/app-framework/ui';
7
+ import { HomeSection, useOperationInvoker } from '@dxos/app-framework/ui';
8
8
  import { RoutineOperation } from '@dxos/plugin-routine/types';
9
9
  import { type Space } from '@dxos/react-client/echo';
10
10
  import { Card, IconButton, useTranslation } from '@dxos/react-ui';
@@ -14,6 +14,7 @@ import { meta } from '#meta';
14
14
 
15
15
  type SpaceScopedProps = {
16
16
  space?: Space;
17
+ onClose?: () => void;
17
18
  };
18
19
 
19
20
  /**
@@ -21,7 +22,7 @@ type SpaceScopedProps = {
21
22
  * assistant operation. Always renders (below the recent-objects masonry) so the Home page offers
22
23
  * quick entry points regardless of whether recent objects exist.
23
24
  */
24
- export const SpaceHomeSuggestions = ({ space }: SpaceScopedProps) => {
25
+ export const SpaceHomeSuggestions = ({ space, onClose }: SpaceScopedProps) => {
25
26
  const { t } = useTranslation(meta.profile.key);
26
27
  const { invokePromise } = useOperationInvoker();
27
28
  const suggestions = useHomeSuggestions(space);
@@ -41,43 +42,43 @@ export const SpaceHomeSuggestions = ({ space }: SpaceScopedProps) => {
41
42
  }
42
43
 
43
44
  return (
44
- <div className='flex justify-center w-full'>
45
- <div className='flex flex-col gap-trim-sm w-full max-w-[40rem]'>
46
- <h2 className='text-sm font-medium text-description'>{t('space-home.suggestions.heading')}</h2>
47
- <div className='flex flex-col gap-3'>
48
- {suggestions.map((prompt, index) => (
49
- <div
50
- key={`${index}:${prompt}`}
51
- role='button'
52
- tabIndex={0}
53
- className='cursor-pointer w-full'
54
- onClick={() => handleRunPrompt(prompt)}
55
- onKeyDown={(e) => {
56
- if (e.key === 'Enter' || e.key === ' ') {
57
- e.preventDefault();
58
- handleRunPrompt(prompt);
59
- }
60
- }}
61
- >
62
- <Card.Root fullWidth>
63
- <Card.Header>
64
- <Card.Block>
65
- <IconButton
66
- variant='ghost'
67
- label={prompt}
68
- icon='ph--sparkle--regular'
69
- iconOnly
70
- tabIndex={-1}
71
- aria-hidden
72
- />
73
- </Card.Block>
74
- <Card.Title>{prompt}</Card.Title>
75
- </Card.Header>
76
- </Card.Root>
77
- </div>
78
- ))}
79
- </div>
45
+ <HomeSection.Root>
46
+ <HomeSection.Header title={t('space-home.suggestions.heading')} onClose={onClose} />
47
+ <div className='flex flex-col gap-3'>
48
+ {suggestions.map((prompt, index) => (
49
+ <div
50
+ key={`${index}:${prompt}`}
51
+ role='button'
52
+ tabIndex={0}
53
+ className='cursor-pointer w-full'
54
+ onClick={() => handleRunPrompt(prompt)}
55
+ onKeyDown={(e) => {
56
+ if (e.key === 'Enter' || e.key === ' ') {
57
+ e.preventDefault();
58
+ handleRunPrompt(prompt);
59
+ }
60
+ }}
61
+ >
62
+ <Card.Root fullWidth>
63
+ <Card.Header>
64
+ <Card.Block>
65
+ <IconButton
66
+ variant='ghost'
67
+ label={prompt}
68
+ icon='ph--sparkle--regular'
69
+ iconOnly
70
+ tabIndex={-1}
71
+ aria-hidden
72
+ />
73
+ </Card.Block>
74
+ <Card.Title>{prompt}</Card.Title>
75
+ </Card.Header>
76
+ </Card.Root>
77
+ </div>
78
+ ))}
80
79
  </div>
81
- </div>
80
+ </HomeSection.Root>
82
81
  );
83
82
  };
83
+
84
+ SpaceHomeSuggestions.displayName = 'SpaceHomeSuggestions';
@@ -8,17 +8,19 @@ import React, { PropsWithChildren, type ReactNode, useCallback, useEffect, useMe
8
8
 
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
10
  import { useProcessManagerRuntime } from '@dxos/app-framework/ui';
11
+ import { AppActivationEvents } from '@dxos/app-toolkit';
11
12
  import { addEventListener } from '@dxos/async';
12
13
  import { Process, Trace } from '@dxos/compute';
13
14
  import { ProcessManager } from '@dxos/compute-runtime';
15
+ import { FeedTraceSink } from '@dxos/compute-runtime';
14
16
  import { Feed, Filter, Query } from '@dxos/echo';
15
- import { FeedTraceSink } from '@dxos/functions-runtime';
17
+ import { useQuery } from '@dxos/echo-react';
16
18
  import { log } from '@dxos/log';
17
19
  import { ClientPlugin } from '@dxos/plugin-client/testing';
18
20
  import { initializeIdentity } from '@dxos/plugin-client/testing';
19
21
  import { RoutinePlugin } from '@dxos/plugin-routine/testing';
20
22
  import { corePlugins } from '@dxos/plugin-testing';
21
- import { useQuery, useSpaces } from '@dxos/react-client/echo';
23
+ import { useSpaces } from '@dxos/react-client/echo';
22
24
  import { IconButton, Panel, ScrollContainer, Toolbar } from '@dxos/react-ui';
23
25
  import { type Commit, Timeline } from '@dxos/react-ui-components';
24
26
  import { Syntax } from '@dxos/react-ui-syntax-highlighter';
@@ -56,7 +58,7 @@ const JsonInspectorPanel = ({ data }: { data: unknown }) => (
56
58
  <Syntax.Root data={data}>
57
59
  <Syntax.Content>
58
60
  <Syntax.Viewport>
59
- <Syntax.Code className='text-xs' />
61
+ <Syntax.Code classNames='text-xs' />
60
62
  </Syntax.Viewport>
61
63
  </Syntax.Content>
62
64
  </Syntax.Root>
@@ -262,7 +264,7 @@ const TimelinePlayback = ({
262
264
  />
263
265
  <IconButton iconOnly icon='ph--caret-right--regular' label='Step forward (→ / L)' onClick={handleNext} />
264
266
  <IconButton iconOnly icon='ph--skip-forward--regular' label='Show all (E / End)' onClick={handleShowAll} />
265
- <Toolbar.Text className='text-right text-sm tabular-nums opacity-70'>
267
+ <Toolbar.Text classNames='text-right text-sm tabular-nums opacity-70'>
266
268
  {step} / {total}
267
269
  </Toolbar.Text>
268
270
  </Toolbar.Root>
@@ -307,6 +309,9 @@ export const Default: Story = {
307
309
  withTheme(),
308
310
  withLayout({ layout: 'column', classNames: 'w-(--dx-complementary-sidebar-size) overflow-hidden' }),
309
311
  withPluginManager({
312
+ // Fire SetupSettings so the assistant settings module activates and contributes
313
+ // `AssistantCapabilities.Settings`, which `TracePanel` reads via `useAtomCapability`.
314
+ setupEvents: [AppActivationEvents.SetupSettings],
310
315
  plugins: [
311
316
  ...corePlugins(),
312
317
  ClientPlugin({
@@ -105,7 +105,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
105
105
  {...composableProps(props, {
106
106
  ...attentionAttrs,
107
107
  classNames: mx(
108
- 'h-full grid divide-y divide-separator',
108
+ 'h-full grid divide-y divide-subdued-separator',
109
109
  !tracePanelDebug && selectedCommit
110
110
  ? 'grid-rows-[minmax(0,160px)_1fr_minmax(0,206px)]'
111
111
  : 'grid-rows-[minmax(0,160px)_1fr]',
@@ -123,7 +123,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
123
123
  <Syntax.Root data={spanTree}>
124
124
  <Syntax.Content>
125
125
  <Syntax.Viewport>
126
- <Syntax.Code className='text-xs' />
126
+ <Syntax.Code classNames='text-xs' />
127
127
  </Syntax.Viewport>
128
128
  </Syntax.Content>
129
129
  </Syntax.Root>
@@ -145,7 +145,7 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
145
145
  <Syntax.Root data={details[selectedCommit.id] ?? selectedCommit}>
146
146
  <Syntax.Content>
147
147
  <Syntax.Viewport>
148
- <Syntax.Code className='text-xs' />
148
+ <Syntax.Code classNames='text-xs' />
149
149
  </Syntax.Viewport>
150
150
  </Syntax.Content>
151
151
  </Syntax.Root>
@@ -158,6 +158,11 @@ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
158
158
  // Stable ref.
159
159
  const atomEmpty = Atom.make(() => [] as const);
160
160
 
161
+ // How often the graph re-checks for spans that timed out with no closing event.
162
+ // Coarse-grained on purpose: `spanTimeoutMs` operates on a 20-minute scale, so there is no
163
+ // benefit to re-deriving the graph more often than this just to catch the timeout crossing.
164
+ const SPAN_TIMEOUT_CHECK_INTERVAL_MS = 60_000;
165
+
161
166
  type UseExecutionGraphOptions = {
162
167
  collapseCompletedSpans?: boolean;
163
168
  eventLimit?: number;
@@ -170,9 +175,19 @@ const useExecutionGraph = (
170
175
  const monitor = useCapability(Capabilities.ProcessMonitor);
171
176
  const processesAtom = monitor?.processTreeAtom ?? atomEmpty;
172
177
 
178
+ // Ticks periodically so spans that are still open purely because no new trace event has
179
+ // arrived (e.g. the runtime crashed before writing its `operationEnd`) eventually get
180
+ // force-closed by `buildExecutionGraph`'s `spanTimeoutMs` check, instead of staying stuck
181
+ // until unrelated trace activity happens to trigger a recompute.
182
+ const [now, setNow] = useState(() => Date.now());
183
+ useEffect(() => {
184
+ const id = setInterval(() => setNow(Date.now()), SPAN_TIMEOUT_CHECK_INTERVAL_MS);
185
+ return () => clearInterval(id);
186
+ }, []);
187
+
173
188
  const atom = useMemo(
174
- () => getExecutionGraph(space, processesAtom, { collapseCompletedSpans, eventLimit }),
175
- [space, processesAtom, collapseCompletedSpans, eventLimit],
189
+ () => getExecutionGraph(space, processesAtom, { collapseCompletedSpans, eventLimit, now }),
190
+ [space, processesAtom, collapseCompletedSpans, eventLimit, now],
176
191
  );
177
192
 
178
193
  return useAtomValue(atom);
@@ -181,7 +196,7 @@ const useExecutionGraph = (
181
196
  const getExecutionGraph = (
182
197
  space: Space,
183
198
  processesAtom: Atom.Atom<readonly Process.Info[]>,
184
- { collapseCompletedSpans = true, eventLimit = 100 }: UseExecutionGraphOptions = {},
199
+ { collapseCompletedSpans = true, eventLimit = 100, now }: UseExecutionGraphOptions & { now: number },
185
200
  ): Atom.Atom<ExecutionGraph> => {
186
201
  const traceMessages = getTraceMessagesAtom(space);
187
202
 
@@ -204,6 +219,7 @@ const getExecutionGraph = (
204
219
  activeProcesses: get(activeProcesses),
205
220
  collapseCompletedSpans,
206
221
  eventLimit,
222
+ now,
207
223
  }),
208
224
  );
209
225
  };
@@ -5,16 +5,14 @@
5
5
  import React, { useMemo } from 'react';
6
6
 
7
7
  import { AppSurface } from '@dxos/app-toolkit/ui';
8
- import { type InvocationsState } from '@dxos/functions-runtime';
8
+ import { type InvocationsState } from '@dxos/compute-runtime';
9
9
  import { useTriggerRuntimeControls } from '@dxos/plugin-routine/hooks';
10
10
  import { StatusBar } from '@dxos/plugin-status-bar/components';
11
- import { useMulticastObservable } from '@dxos/react-client';
12
- import { SpaceState, useObject } from '@dxos/react-client/echo';
13
11
  import { IconButton, Popover, useTranslation } from '@dxos/react-ui';
14
12
 
15
13
  import { meta } from '#meta';
16
14
 
17
- type TriggerStatusState = 'disabled' | 'idle' | 'running' | 'edge' | 'error';
15
+ type TriggerStatusState = 'disabled' | 'idle' | 'running' | 'error';
18
16
 
19
17
  const getIcon = (state: TriggerStatusState): string => {
20
18
  switch (state) {
@@ -22,8 +20,6 @@ const getIcon = (state: TriggerStatusState): string => {
22
20
  return 'ph--lightning-slash--regular';
23
21
  case 'idle':
24
22
  return 'ph--lightning--regular';
25
- case 'edge':
26
- return 'ph--lightning--regular';
27
23
  case 'running':
28
24
  return 'ph--lightning--fill';
29
25
  case 'error':
@@ -47,19 +43,12 @@ export type SpaceStatusProps = AppSurface.SpaceArticleProps;
47
43
  export const SpaceStatus = ({ space }: SpaceStatusProps) => {
48
44
  const { t } = useTranslation(meta.profile.key);
49
45
  const { state } = useTriggerRuntimeControls(space.db);
46
+ // The dispatcher is stopped for the space when `triggersDisabled` is set, so `enabled` already
47
+ // reflects the space-wide kill-switch; per-trigger edge routing does not affect this indicator.
50
48
  const isEnabled = state?.enabled ?? false;
51
- // `space.properties` throws until the space finishes initializing (e.g. right after joining);
52
- // gate on `space.state` so this component doesn't crash for a freshly-joined space.
53
- const spaceState = useMulticastObservable(space.state);
54
- const [properties] = useObject(spaceState === SpaceState.SPACE_READY ? space.properties : undefined);
55
- const computeEnvironment = properties?.computeEnvironment ?? 'local';
56
49
 
57
50
  // Determine the current trigger status state.
58
51
  const triggerState: TriggerStatusState = useMemo(() => {
59
- if (computeEnvironment === 'edge') {
60
- return 'edge';
61
- }
62
-
63
52
  if (!isEnabled) {
64
53
  return 'disabled';
65
54
  }
@@ -77,7 +66,7 @@ export const SpaceStatus = ({ space }: SpaceStatusProps) => {
77
66
  }
78
67
 
79
68
  return 'idle';
80
- }, [computeEnvironment, isEnabled, state?.invocations]);
69
+ }, [isEnabled, state?.invocations]);
81
70
 
82
71
  return (
83
72
  <Popover.Root>
@@ -132,3 +121,7 @@ const TriggerStatusPopover = ({
132
121
  </div>
133
122
  );
134
123
  };
124
+
125
+ SpaceStatus.displayName = 'SpaceStatus';
126
+
127
+ TriggerStatusPopover.displayName = 'TriggerStatusPopover';
@@ -11,7 +11,6 @@ export const ChatCompanion: ComponentType<any> = lazy(() => import('./ChatCompan
11
11
  export const ChatArticle: ComponentType<any> = lazy(() => import('./ChatArticle'));
12
12
  export const ChatDialog: ComponentType<any> = lazy(() => import('./ChatDialog'));
13
13
  export const IntegrationPrompt: ComponentType<any> = lazy(() => import('./IntegrationPrompt'));
14
- export const PlanArticle: ComponentType<any> = lazy(() => import('./PlanArticle'));
15
14
  export const SpaceHomePrompt: ComponentType<any> = lazy(() => import('./SpaceHomePrompt'));
16
15
  export const SpaceHomeSuggestions: ComponentType<any> = lazy(() => import('./SpaceHomeSuggestions'));
17
16
  export const TracePanel: ComponentType<any> = lazy(() => import('./TracePanel'));
@@ -25,7 +25,8 @@ Out of scope:
25
25
  - Filtering / search of commits.
26
26
  - Mutating, ack-ing, or replaying trace events.
27
27
 
28
- Inputs: `traceMessages: Trace.Message[]`, `activeProcesses?: Process.Info[]`, `eventLimit?: number`.
28
+ Inputs: `traceMessages: Trace.Message[]`, `activeProcesses?: Process.Info[]`, `eventLimit?: number`,
29
+ `spanTimeoutMs?: number`, `now?: number`.
29
30
  Output: `ExecutionGraph = { branches, commits, spanTree, details }`.
30
31
 
31
32
  ## 2. Inputs
@@ -77,6 +78,8 @@ Optional input via `activeProcesses` (defaults to `[]`). Fields the builder read
77
78
  - `TracePanel`'s `getExecutionGraph` defaults `eventLimit = 300`
78
79
  (`TracePanel.tsx#L153`).
79
80
  - The cap targets `Timeline` rendering cost, not memory; see §11 for what it bounds.
81
+ - `buildSpanTree` defaults `spanTimeoutMs = DEFAULT_SPAN_TIMEOUT_MS` (20 minutes); `now` has
82
+ no default and force-closing is skipped unless a caller passes it. See §5.4.
80
83
 
81
84
  ## 3. Outputs
82
85
 
@@ -227,6 +230,48 @@ retains span boundaries') and `#L159` (regression for parent-child preservation)
227
230
  Sibling spans are sorted by `firstTimestamp` ascending so output is deterministic
228
231
  across runs that share inputs. Test: `span-tree.test.ts#L120`.
229
232
 
233
+ ### 5.4 Timeout-based force-close
234
+
235
+ Runs after the linear scan, before children are sorted, over `allSpans` — every span ever
236
+ opened, not just the ones still in `openSpans`. This matters because a span superseded by a
237
+ later same-pid begin event (§15 "interleaved same-pid begin/end pairs") is removed from
238
+ `openSpans` but never receives an end event either; walking `allSpans` and checking each
239
+ span's own last event (rather than map membership) reaches it too.
240
+
241
+ Skipped entirely when `options.now` is omitted (see below). Otherwise, any span whose **last**
242
+ event is not itself an end event (`isSpanEndEvent`) and is older than `now - spanTimeoutMs` is
243
+ force-closed with a synthetic end event appended to `span.events`:
244
+
245
+ - Span opened by `AgentRequestBegin` → synthetic `AgentRequestEnd` with
246
+ `{ status: 'interrupted', error: SPAN_TIMEOUT_MESSAGE }`.
247
+ - Span opened by `Trace.OperationStart` → synthetic `Trace.OperationEnd` with
248
+ `{ key, name, icon, outcome: 'failure', error: SPAN_TIMEOUT_MESSAGE }` (fields copied
249
+ from the begin event's payload).
250
+
251
+ The synthetic event's `timestamp` is `lastEvent.timestamp + spanTimeoutMs` (the exact
252
+ moment the span crossed the threshold), not `now` — this keeps the emitted commit's
253
+ position stable across repeated `buildSpanTree` calls with an advancing `now`, rather
254
+ than jumping forward on every recompute.
255
+
256
+ Rationale: the runtime may fail to write the closing event (crash, dropped connection,
257
+ process killed) — see DX-1080. Without this, `isCompletedSpan` never returns `true` for
258
+ that span (§7), so it never collapses and keeps rendering with the "in progress" shimmer
259
+ forever. Appending a synthetic end event makes it indistinguishable downstream from a
260
+ span that completed normally, except for the `outcome: 'failure'` / `status: 'interrupted'`
261
+ result and the `SPAN_TIMEOUT_MESSAGE` text surfaced by `presentEvent` (§4.1).
262
+
263
+ `spanTimeoutMs` defaults to `DEFAULT_SPAN_TIMEOUT_MS` (20 minutes) when `now` is provided.
264
+ `now` has **no default** — force-closing only runs when a caller explicitly passes it, so
265
+ deterministic callers (tests, `TracePanel.stories.tsx`'s fixture snapshot) that pass fixture
266
+ timestamps unrelated to wall-clock time are unaffected unless they opt in. `TracePanel` opts
267
+ in by ticking a `now` state every 60s (`TracePanel.tsx`); `span-tree.test.ts`'s "force-closed"
268
+ tests pass an explicit `now` for determinism.
269
+
270
+ Only spans with **zero** events never happen (a span always has at least its begin
271
+ event), so `span.events[span.events.length - 1]` is always defined when force-closing.
272
+ Nested children of a force-closed span are evaluated independently — a still-active
273
+ child is not force-closed just because its parent timed out.
274
+
230
275
  ## 6. Span branch assignment (`branchOf`)
231
276
 
232
277
  `execution-graph.ts#L263`. Pure function on a span:
@@ -582,6 +627,16 @@ Each entry: **scenario → expected output → rationale**.
582
627
  - Logged via `log('invalid trace event', …)` and dropped. The event still
583
628
  occupies a position in `spanTree.events`.
584
629
 
630
+ 18. **Span open longer than `spanTimeoutMs` with no end event** (DX-1080)
631
+ - Force-closed with a synthetic failure/interrupted end event (§5.4); becomes
632
+ `isCompletedSpan` and collapses/renders like a normal completed span instead of
633
+ hanging with the shimmer effect forever. Test: `span-tree.test.ts`
634
+ ("an open operation span past the timeout is force-closed…").
635
+
636
+ 19. **Span open but still within `spanTimeoutMs`**
637
+ - Left untouched — stays open and continues to render as in-progress. Test:
638
+ `span-tree.test.ts` ("an open span within the timeout window stays open").
639
+
585
640
  ## 14. Performance & complexity
586
641
 
587
642
  - `buildSpanTree`: O(E log E) for the chronological sort, O(E) for the linear
@@ -605,7 +660,9 @@ Each entry: **scenario → expected output → rationale**.
605
660
  spans per pid. If a process emits `B1 B2 E1 E2` interleaved, the second `B2`
606
661
  orphans the still-open `B1` (no `E1` ever closes the first span). The first
607
662
  span receives only its begin event; the second receives `B2 E1 E2`.
608
- Outcome: incorrect. Not currently supported.
663
+ Outcome: incorrect. Not currently supported. `B1` is at least reachable by the
664
+ §5.4 timeout sweep (via `allSpans`) so it eventually force-closes rather than
665
+ hanging forever — but the interleaving itself is still not modeled correctly.
609
666
  - **Event types beyond `presentEvent`**: silently dropped from the commit
610
667
  stream but retained in `spanTree.events`. Consumers wanting the full event
611
668
  stream must read `spanTree`. Examples: `OperationInput`, `OperationOutput`,
@@ -625,6 +682,7 @@ Each entry: **scenario → expected output → rationale**.
625
682
  | ------------------------------------------------------- | ---------------------------------------------------------------------------- | ----------- |
626
683
  | `buildSpanTree` | `packages/plugins/plugin-assistant/src/execution-graph/span-tree.ts` | L112 |
627
684
  | `applyEventLimit` | same | L211 |
685
+ | `makeTimeoutEndEvent` / `DEFAULT_SPAN_TIMEOUT_MS` | same | L252 / L13 |
628
686
  | `ROOT_SPAN_ID` | same | L12 |
629
687
  | `BEGIN_EVENT_TYPES`/`END_EVENT_TYPES` | same | L47 |
630
688
  | `walkSpanTree`/`flattenSpanTree` | same | L245 |
@@ -10,10 +10,10 @@ import * as Pipeable from 'effect/Pipeable';
10
10
  import * as Schema from 'effect/Schema';
11
11
  import * as Struct from 'effect/Struct';
12
12
 
13
+ import { AGENT_PROCESS_KEY } from '@dxos/agent-runtime';
13
14
  import { AgentRequestBegin, AgentRequestEnd, CompleteBlock } from '@dxos/assistant';
14
15
  import { Process, Trace } from '@dxos/compute';
15
16
  import { Annotation } from '@dxos/echo';
16
- import { AGENT_PROCESS_KEY } from '@dxos/functions-runtime';
17
17
  import { EID } from '@dxos/keys';
18
18
  import { LogLevel, log } from '@dxos/log';
19
19
  import { type Commit } from '@dxos/react-ui-components';
@@ -93,6 +93,17 @@ export interface BuildExecutionGraphParams {
93
93
  activeProcesses?: readonly Process.Info[];
94
94
  collapseCompletedSpans?: boolean;
95
95
  eventLimit?: number;
96
+ /**
97
+ * Duration a span may sit open with no new events before it's force-closed with a synthetic
98
+ * end event. Only takes effect when `now` is also provided. Defaults to
99
+ * `DEFAULT_SPAN_TIMEOUT_MS`.
100
+ */
101
+ spanTimeoutMs?: number;
102
+ /**
103
+ * Reference time used to detect abandoned spans. Force-closing is skipped entirely when this
104
+ * is omitted.
105
+ */
106
+ now?: number;
96
107
  }
97
108
 
98
109
  /**
@@ -121,8 +132,10 @@ export const buildExecutionGraph = ({
121
132
  activeProcesses = [],
122
133
  collapseCompletedSpans = false,
123
134
  eventLimit = 500,
135
+ spanTimeoutMs,
136
+ now,
124
137
  }: BuildExecutionGraphParams): ExecutionGraph => {
125
- const spanTree = buildSpanTree(traceMessages, { eventLimit });
138
+ const spanTree = buildSpanTree(traceMessages, { eventLimit, spanTimeoutMs, now });
126
139
  const toolCallContext = buildToolCallContext(traceMessages);
127
140
  const built = spanTreeToCommits(spanTree, activeProcesses, toolCallContext, collapseCompletedSpans);
128
141
  log('trace execution graph', {
@@ -22,6 +22,7 @@ export {
22
22
  export {
23
23
  BEGIN_EVENT_TYPES,
24
24
  type BuildSpanTreeOptions,
25
+ DEFAULT_SPAN_TIMEOUT_MS,
25
26
  END_EVENT_TYPES,
26
27
  ROOT_SPAN_ID,
27
28
  type Span,
@@ -60,11 +60,12 @@ export const pendingStatusFromEphemeralMessage = (message: Trace.Message): strin
60
60
  }
61
61
 
62
62
  if (Trace.isOfType(Trace.StatusUpdate, event)) {
63
+ const message = event.data.message?.trim();
63
64
  // Suppress opaque routine ULID lines so descriptive partial-block / operation-input lines win.
64
- if (ROUTINE_ULID_STATUS.test(event.data.message.trim())) {
65
+ if (!message || ROUTINE_ULID_STATUS.test(message)) {
65
66
  continue;
66
67
  }
67
- return event.data.message;
68
+ return message;
68
69
  }
69
70
  }
70
71
  return undefined;
@@ -9,7 +9,13 @@ import { describe, test } from 'vitest';
9
9
  import { AgentRequestBegin, AgentRequestEnd } from '@dxos/assistant';
10
10
  import { Trace } from '@dxos/compute';
11
11
 
12
- import { ROOT_SPAN_ID, buildSpanTree, collectSpanTreeEventsCategorically, flattenSpanTree } from './span-tree';
12
+ import {
13
+ DEFAULT_SPAN_TIMEOUT_MS,
14
+ ROOT_SPAN_ID,
15
+ buildSpanTree,
16
+ collectSpanTreeEventsCategorically,
17
+ flattenSpanTree,
18
+ } from './span-tree';
13
19
  import { collectTraceEvents, withMeta } from './testing';
14
20
 
15
21
  const NoteEvent = Trace.EventType('note', {
@@ -247,6 +253,86 @@ describe('buildSpanTree', () => {
247
253
  expect(order).toHaveLength(3);
248
254
  });
249
255
 
256
+ test('an open operation span past the timeout is force-closed with a synthetic failure end', ({ expect }) => {
257
+ const messages = collectTraceEvents(
258
+ withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
259
+ );
260
+ // The single event lands at timestamp 1; `now` is well past the default timeout.
261
+ const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
262
+ expect(tree.children).toHaveLength(1);
263
+ const span = tree.children[0];
264
+ expect(span.events).toHaveLength(2);
265
+ expect(span.events[1].type).toBe(Trace.OperationEnd.key);
266
+ expect(span.events[1].data).toMatchObject({ key: 'reply', name: 'Reply', outcome: 'failure' });
267
+ });
268
+
269
+ test('an open agent request span past the timeout is force-closed as interrupted', ({ expect }) => {
270
+ const messages = collectTraceEvents(withMeta({ pid: 'agent-1' }, Trace.write(AgentRequestBegin, {})));
271
+ const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
272
+ const span = tree.children[0];
273
+ expect(span.events).toHaveLength(2);
274
+ expect(span.events[1].type).toBe(AgentRequestEnd.key);
275
+ expect(span.events[1].data).toMatchObject({ status: 'interrupted' });
276
+ });
277
+
278
+ test('an open span within the timeout window stays open', ({ expect }) => {
279
+ const messages = collectTraceEvents(
280
+ withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
281
+ );
282
+ const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS - 1 });
283
+ const span = tree.children[0];
284
+ expect(span.events).toHaveLength(1);
285
+ });
286
+
287
+ test('spanTimeoutMs is configurable', ({ expect }) => {
288
+ const messages = collectTraceEvents(
289
+ withMeta({ pid: 'op-1' }, Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' })),
290
+ );
291
+ const closed = buildSpanTree(messages, { now: 100, spanTimeoutMs: 10 });
292
+ expect(closed.children[0].events).toHaveLength(2);
293
+
294
+ const stillOpen = buildSpanTree(messages, { now: 100, spanTimeoutMs: 1_000 });
295
+ expect(stillOpen.children[0].events).toHaveLength(1);
296
+ });
297
+
298
+ test('a span superseded by a later same-pid begin event is force-closed too', ({ expect }) => {
299
+ // The first begin never gets an end (interleaved B1 B2 E1 pattern, §15) — `openSpans` only
300
+ // tracks the second span once it supersedes the first, so the sweep must reach both.
301
+ const messages = collectTraceEvents(
302
+ withMeta(
303
+ { pid: 'agent-1' },
304
+ Effect.gen(function* () {
305
+ yield* Trace.write(AgentRequestBegin, {});
306
+ yield* Trace.write(AgentRequestBegin, {});
307
+ yield* Trace.write(AgentRequestEnd, { status: 'success' });
308
+ }),
309
+ ),
310
+ );
311
+ const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
312
+ expect(tree.children).toHaveLength(2);
313
+ const [superseded, current] = tree.children;
314
+ expect(superseded.events).toHaveLength(2);
315
+ expect(superseded.events[1].type).toBe(AgentRequestEnd.key);
316
+ expect(superseded.events[1].data).toMatchObject({ status: 'interrupted' });
317
+ expect(current.events).toHaveLength(2);
318
+ expect(current.events[1].data).toMatchObject({ status: 'success' });
319
+ });
320
+
321
+ test('a completed span is unaffected by the timeout', ({ expect }) => {
322
+ const messages = collectTraceEvents(
323
+ withMeta(
324
+ { pid: 'op-1' },
325
+ Effect.gen(function* () {
326
+ yield* Trace.write(Trace.OperationStart, { key: 'reply', name: 'Reply' });
327
+ yield* Trace.write(Trace.OperationEnd, { key: 'reply', name: 'Reply', outcome: 'success' });
328
+ }),
329
+ ),
330
+ );
331
+ const tree = buildSpanTree(messages, { now: 1 + DEFAULT_SPAN_TIMEOUT_MS });
332
+ expect(tree.children[0].events).toHaveLength(2);
333
+ expect(tree.children[0].events[1].data).toMatchObject({ outcome: 'success' });
334
+ });
335
+
250
336
  test('collectSpanTreeEventsCategorically emits begin, child subtrees, then remaining events', ({ expect }) => {
251
337
  const messages = collectTraceEvents(
252
338
  Effect.gen(function* () {