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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/PLUGIN.mdl +18 -24
  2. package/dist/lib/neutral/{AgentArticle-K7XM46OQ.mjs → AgentArticle-GV6EEW3I.mjs} +9 -8
  3. package/dist/lib/neutral/AgentArticle-GV6EEW3I.mjs.map +7 -0
  4. package/dist/lib/neutral/AssistantPlugin.mjs +1 -1
  5. package/dist/lib/neutral/AssistantPlugin.node.mjs +6 -6
  6. package/dist/lib/neutral/AssistantPlugin.node.mjs.map +3 -3
  7. package/dist/lib/neutral/AssistantPlugin.workerd.mjs +7 -34
  8. package/dist/lib/neutral/AssistantPlugin.workerd.mjs.map +4 -4
  9. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs +302 -0
  10. package/dist/lib/neutral/AssistantSettings-3N5M5VCN.mjs.map +7 -0
  11. package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs → ChatArticle-OO7GGEFW.mjs} +2 -2
  12. package/dist/lib/neutral/{ChatCompanion-LBUHYWQG.mjs → ChatCompanion-GIFJRY6I.mjs} +28 -28
  13. package/dist/lib/neutral/ChatCompanion-GIFJRY6I.mjs.map +7 -0
  14. package/dist/lib/neutral/{ChatDialog-DCA6FLOV.mjs → ChatDialog-5MXN4MXS.mjs} +9 -8
  15. package/dist/lib/neutral/ChatDialog-5MXN4MXS.mjs.map +7 -0
  16. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs +72 -0
  17. package/dist/lib/neutral/IntegrationPrompt-2HJQFYJE.mjs.map +7 -0
  18. package/dist/lib/neutral/{PlanArticle-TS5ULWYS.mjs → PlanArticle-VPK2IYWU.mjs} +8 -2
  19. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +7 -0
  20. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs +114 -0
  21. package/dist/lib/neutral/SpaceHomePrompt-ISAB76LD.mjs.map +7 -0
  22. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs +63 -0
  23. package/dist/lib/neutral/SpaceHomeSuggestions-IDH77QQR.mjs.map +7 -0
  24. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs +12 -0
  25. package/dist/lib/neutral/TracePanel-JKNWADJ4.mjs.map +7 -0
  26. package/dist/lib/neutral/{TriggerStatus-X7Y5JFZJ.mjs → TriggerStatus-FURRBHYA.mjs} +9 -7
  27. package/dist/lib/neutral/TriggerStatus-FURRBHYA.mjs.map +7 -0
  28. package/dist/lib/neutral/{agent-hydrator-PJBYVMBW.mjs → agent-hydrator-OBO3RHLO.mjs} +3 -4
  29. package/dist/lib/neutral/agent-hydrator-OBO3RHLO.mjs.map +7 -0
  30. package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs → agent-service-XFJ4VQMT.mjs} +6 -6
  31. package/dist/lib/neutral/agent-service-XFJ4VQMT.mjs.map +7 -0
  32. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs +14 -0
  33. package/dist/lib/neutral/ai-context-LIKJYMIN.mjs.map +7 -0
  34. package/dist/lib/neutral/{ai-service-AADUIKBY.mjs → ai-service-DM6YXWUC.mjs} +9 -5
  35. package/dist/lib/neutral/ai-service-DM6YXWUC.mjs.map +7 -0
  36. package/dist/lib/neutral/{app-graph-builder-WUFHQH3Y.mjs → app-graph-builder-OPVOEQY7.mjs} +45 -28
  37. package/dist/lib/neutral/app-graph-builder-OPVOEQY7.mjs.map +7 -0
  38. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs +97 -0
  39. package/dist/lib/neutral/automation-templates-MADJLXGJ.mjs.map +7 -0
  40. package/dist/lib/neutral/capabilities/index.mjs +21 -19
  41. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  42. package/dist/lib/neutral/{chunk-KLYLW4WH.mjs → chunk-5IHQ52KJ.mjs} +1 -1
  43. package/dist/lib/neutral/chunk-5IHQ52KJ.mjs.map +7 -0
  44. package/dist/lib/neutral/{chunk-YXRGZYYH.mjs → chunk-6Q4OBGIK.mjs} +87 -59
  45. package/dist/lib/neutral/chunk-6Q4OBGIK.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-BXI2R4OO.mjs +410 -0
  47. package/dist/lib/neutral/chunk-BXI2R4OO.mjs.map +7 -0
  48. package/dist/lib/neutral/{chunk-5H6UJHLF.mjs → chunk-CMPLPDYE.mjs} +12 -12
  49. package/dist/lib/neutral/chunk-CMPLPDYE.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GPHT3HYS.mjs +8 -0
  51. package/dist/lib/neutral/{chunk-SMFJD7BP.mjs.map → chunk-GPHT3HYS.mjs.map} +2 -2
  52. package/dist/lib/neutral/chunk-HKLSFB5I.mjs +90 -0
  53. package/dist/lib/neutral/chunk-HKLSFB5I.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-L7AR4VTA.mjs +53 -0
  55. package/dist/lib/neutral/chunk-L7AR4VTA.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LS72HWMM.mjs +42 -0
  57. package/dist/lib/neutral/chunk-LS72HWMM.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-HLANPOBA.mjs → chunk-OZWZGIV2.mjs} +5 -3
  59. package/dist/lib/neutral/chunk-OZWZGIV2.mjs.map +7 -0
  60. package/dist/lib/neutral/{toolkit-GVWXPDLJ.mjs → chunk-QOKLFHUS.mjs} +3 -4
  61. package/dist/lib/neutral/{toolkit-GVWXPDLJ.mjs.map → chunk-QOKLFHUS.mjs.map} +1 -1
  62. package/dist/lib/neutral/{TracePanel-KTZJ6JNR.mjs → chunk-SCTHQVIJ.mjs} +11 -23
  63. package/dist/lib/neutral/chunk-SCTHQVIJ.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-U4LTLBAX.mjs +56 -0
  65. package/dist/lib/neutral/chunk-U4LTLBAX.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-RKVVK3R3.mjs → chunk-UPKFUZ6V.mjs} +22 -17
  67. package/dist/lib/neutral/chunk-UPKFUZ6V.mjs.map +7 -0
  68. package/dist/lib/neutral/{operation-handler-SF36MOB5.mjs → chunk-V2Y4XE3O.mjs} +3 -4
  69. package/dist/lib/neutral/{operation-handler-SF36MOB5.mjs.map → chunk-V2Y4XE3O.mjs.map} +1 -1
  70. package/dist/lib/neutral/chunk-XVGEJWJX.mjs +133 -0
  71. package/dist/lib/neutral/chunk-XVGEJWJX.mjs.map +7 -0
  72. package/dist/lib/neutral/{companion-chat-provisioner-YZZ73P6E.mjs → companion-chat-provisioner-IQV5VIVE.mjs} +14 -8
  73. package/dist/lib/neutral/companion-chat-provisioner-IQV5VIVE.mjs.map +7 -0
  74. package/dist/lib/neutral/components/index.mjs +749 -632
  75. package/dist/lib/neutral/components/index.mjs.map +4 -4
  76. package/dist/lib/neutral/{integration-provider-RBD3AFJU.mjs → connector-ITLLTBPZ.mjs} +13 -14
  77. package/dist/lib/neutral/connector-ITLLTBPZ.mjs.map +7 -0
  78. package/dist/lib/neutral/containers/index.mjs +15 -13
  79. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  80. package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs → create-chat-YGVZZYGP.mjs} +18 -16
  81. package/dist/lib/neutral/create-chat-YGVZZYGP.mjs.map +7 -0
  82. package/dist/lib/neutral/{create-object-U2SOFZLR.mjs → create-object-5PAEJ6KM.mjs} +11 -27
  83. package/dist/lib/neutral/create-object-5PAEJ6KM.mjs.map +7 -0
  84. package/dist/lib/neutral/{edge-model-resolver-BBVOJBGJ.mjs → edge-model-resolver-WDJWDZTT.mjs} +2 -2
  85. package/dist/lib/neutral/execution-graph/index.mjs +336 -62
  86. package/dist/lib/neutral/execution-graph/index.mjs.map +4 -4
  87. package/dist/lib/neutral/extensions/index.mjs +8 -0
  88. package/dist/lib/neutral/{fork-chat-34KEF4ZJ.mjs → fork-chat-RMAAYYQF.mjs} +16 -19
  89. package/dist/lib/neutral/fork-chat-RMAAYYQF.mjs.map +7 -0
  90. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs +93 -0
  91. package/dist/lib/neutral/generate-home-suggestions-6MM2XWPV.mjs.map +7 -0
  92. package/dist/lib/neutral/hooks/index.mjs +393 -508
  93. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  94. package/dist/lib/neutral/index.mjs +14 -10
  95. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs +41 -0
  96. package/dist/lib/neutral/markdown-extension-R4TKDTIF.mjs.map +7 -0
  97. package/dist/lib/neutral/meta.json +1 -1
  98. package/dist/lib/neutral/meta.mjs +1 -1
  99. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs +18 -0
  100. package/dist/lib/neutral/navigation-resolver-PYGP2DAW.mjs.map +7 -0
  101. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs +8 -0
  102. package/dist/lib/neutral/operation-handler-2LEN45GP.mjs.map +7 -0
  103. package/dist/lib/neutral/operations/index.mjs +1 -1
  104. package/dist/lib/neutral/plugin.mjs +2 -2
  105. package/dist/lib/neutral/plugin.workerd.mjs +13 -0
  106. package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
  107. package/dist/lib/neutral/{react-surface-XRTBW5OJ.mjs → react-surface-HEJEK44F.mjs} +42 -45
  108. package/dist/lib/neutral/react-surface-HEJEK44F.mjs.map +7 -0
  109. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs +28 -0
  110. package/dist/lib/neutral/resolve-navigation-targets-PBQ3OLUE.mjs.map +7 -0
  111. package/dist/lib/neutral/{run-prompt-in-new-chat-D5IIE2C7.mjs → run-prompt-in-new-chat-RNUJE2FM.mjs} +31 -31
  112. package/dist/lib/neutral/run-prompt-in-new-chat-RNUJE2FM.mjs.map +7 -0
  113. package/dist/lib/neutral/{settings-W4BLWQ53.mjs → settings-7Q3RITIT.mjs} +3 -3
  114. package/dist/lib/neutral/{settings-W4BLWQ53.mjs.map → settings-7Q3RITIT.mjs.map} +3 -3
  115. package/dist/lib/neutral/skill-definition-553MQRTR.mjs +8 -0
  116. package/dist/lib/neutral/skill-definition-553MQRTR.mjs.map +7 -0
  117. package/dist/lib/neutral/skills/index.mjs +8 -0
  118. package/dist/lib/neutral/skills/index.mjs.map +7 -0
  119. package/dist/lib/neutral/{state-H3G7QCU6.mjs → state-4LGAKSSD.mjs} +9 -3
  120. package/dist/lib/neutral/state-4LGAKSSD.mjs.map +7 -0
  121. package/dist/lib/neutral/testing.mjs +1 -1
  122. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs +8 -0
  123. package/dist/lib/neutral/toolkit-ETWLG5NT.mjs.map +7 -0
  124. package/dist/lib/neutral/translations.mjs +69 -31
  125. package/dist/lib/neutral/translations.mjs.map +3 -3
  126. package/dist/lib/neutral/types/index.mjs +5 -1
  127. package/dist/lib/neutral/{update-chat-name-Y7JWIP64.mjs → update-chat-name-IJJELRR6.mjs} +3 -3
  128. package/dist/lib/neutral/{update-chat-name-Y7JWIP64.mjs.map → update-chat-name-IJJELRR6.mjs.map} +2 -2
  129. package/dist/types/dx.config.d.ts +28 -0
  130. package/dist/types/dx.config.d.ts.map +1 -0
  131. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  132. package/dist/types/src/AssistantPlugin.workerd.d.ts.map +1 -1
  133. package/dist/types/src/capabilities/agent-hydrator.d.ts +1 -1
  134. package/dist/types/src/capabilities/agent-service.d.ts +1 -2
  135. package/dist/types/src/capabilities/agent-service.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/ai-context.d.ts +1 -2
  137. package/dist/types/src/capabilities/ai-context.d.ts.map +1 -1
  138. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -3
  139. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  140. package/dist/types/src/capabilities/automation-templates.d.ts +1 -2
  141. package/dist/types/src/capabilities/automation-templates.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts +1 -1
  143. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/{integration-provider.d.ts → connector.d.ts} +2 -2
  145. package/dist/types/src/capabilities/connector.d.ts.map +1 -0
  146. package/dist/types/src/capabilities/create-object.d.ts +1 -27
  147. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  148. package/dist/types/src/capabilities/index.d.ts +18 -57
  149. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  151. package/dist/types/src/capabilities/migrations.d.ts +1 -2
  152. package/dist/types/src/capabilities/migrations.d.ts.map +1 -1
  153. package/dist/types/src/capabilities/navigation-resolver.d.ts +5 -0
  154. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
  155. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  156. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  157. package/dist/types/src/capabilities/settings.d.ts +1 -2
  158. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  159. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  160. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  161. package/dist/types/src/capabilities/state.d.ts +1 -17
  162. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  163. package/dist/types/src/capabilities/toolkit.d.ts +1 -2
  164. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  165. package/dist/types/src/components/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/Chat/Chat.d.ts +10 -8
  167. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  168. package/dist/types/src/components/Chat/Chat.stories.d.ts +32 -0
  169. package/dist/types/src/components/Chat/Chat.stories.d.ts.map +1 -0
  170. package/dist/types/src/components/Chat/events.d.ts +0 -4
  171. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  172. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +2 -2
  173. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  174. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  175. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +2 -2
  176. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  177. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +5 -5
  178. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -1
  179. package/dist/types/src/components/ChatPrompt/useChatVoiceInput.d.ts +9 -0
  180. package/dist/types/src/components/ChatPrompt/useChatVoiceInput.d.ts.map +1 -0
  181. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +4 -4
  182. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  183. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts +2 -2
  184. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  186. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.stories.d.ts +2 -2
  187. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ChatThread/widgets/SurfaceWidget.d.ts +11 -0
  189. package/dist/types/src/components/ChatThread/widgets/SurfaceWidget.d.ts.map +1 -0
  190. package/dist/types/src/components/ChatThread/widgets/index.d.ts +1 -0
  191. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  192. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +6 -0
  193. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  194. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +1 -0
  195. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  196. package/dist/types/src/components/TaskList/TaskList.d.ts +8 -0
  197. package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
  198. package/dist/types/src/components/TaskList/TaskList.stories.d.ts +5 -2
  199. package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
  201. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  202. package/dist/types/src/components/index.d.ts +1 -4
  203. package/dist/types/src/components/index.d.ts.map +1 -1
  204. package/dist/types/src/constants.d.ts +1 -1
  205. package/dist/types/src/constants.d.ts.map +1 -1
  206. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts +2 -2
  207. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  208. package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.d.ts +1 -1
  209. package/dist/types/src/containers/AssistantSettings/AssistantSettings.d.ts.map +1 -0
  210. package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  211. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts +12 -0
  212. package/dist/types/src/containers/AssistantSettings/OllamaModels.d.ts.map +1 -0
  213. package/dist/types/src/{components/TemplateEditor/TemplateEditor.stories.d.ts → containers/AssistantSettings/OllamaModels.stories.d.ts} +9 -7
  214. package/dist/types/src/containers/AssistantSettings/OllamaModels.stories.d.ts.map +1 -0
  215. package/dist/types/src/{components → containers}/AssistantSettings/index.d.ts.map +1 -1
  216. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts +3 -10
  217. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  218. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +4 -11
  219. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts.map +1 -1
  220. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  221. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts +13 -0
  222. package/dist/types/src/containers/IntegrationPrompt/IntegrationPrompt.d.ts.map +1 -0
  223. package/dist/types/src/containers/IntegrationPrompt/index.d.ts +2 -0
  224. package/dist/types/src/{components/RoutineProperties → containers/IntegrationPrompt}/index.d.ts.map +1 -1
  225. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -1
  226. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +15 -0
  227. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -0
  228. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts +2 -0
  229. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts.map +1 -0
  230. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +13 -0
  231. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -0
  232. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts +2 -0
  233. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts.map +1 -0
  234. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  235. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  236. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts +1 -1
  237. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts.map +1 -1
  238. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  239. package/dist/types/src/containers/index.d.ts +4 -3
  240. package/dist/types/src/containers/index.d.ts.map +1 -1
  241. package/dist/types/src/execution-graph/execution-graph.d.ts +20 -1
  242. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  243. package/dist/types/src/execution-graph/index.d.ts +3 -2
  244. package/dist/types/src/execution-graph/index.d.ts.map +1 -1
  245. package/dist/types/src/execution-graph/pending-block-status.d.ts +26 -0
  246. package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -0
  247. package/dist/types/src/execution-graph/pending-block-status.test.d.ts +2 -0
  248. package/dist/types/src/execution-graph/pending-block-status.test.d.ts.map +1 -0
  249. package/dist/types/src/execution-graph/span-tree.d.ts +13 -0
  250. package/dist/types/src/execution-graph/span-tree.d.ts.map +1 -1
  251. package/dist/types/src/extensions/index.d.ts +1 -1
  252. package/dist/types/src/extensions/index.d.ts.map +1 -1
  253. package/dist/types/src/extensions/prompt-extension.d.ts +1 -1
  254. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
  255. package/dist/types/src/feed-logger.d.ts +3 -2
  256. package/dist/types/src/feed-logger.d.ts.map +1 -1
  257. package/dist/types/src/hooks/index.d.ts +4 -2
  258. package/dist/types/src/hooks/index.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  260. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  261. package/dist/types/src/hooks/useHomeSuggestions.d.ts +8 -0
  262. package/dist/types/src/hooks/useHomeSuggestions.d.ts.map +1 -0
  263. package/dist/types/src/hooks/usePresets.d.ts +6 -2
  264. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  265. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts +10 -0
  266. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts.map +1 -0
  267. package/dist/types/src/hooks/useSkillRegistry.d.ts +21 -0
  268. package/dist/types/src/hooks/useSkillRegistry.d.ts.map +1 -0
  269. package/dist/types/src/hooks/useTraceMessages.d.ts +12 -0
  270. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -0
  271. package/dist/types/src/index.d.ts +1 -1
  272. package/dist/types/src/index.d.ts.map +1 -1
  273. package/dist/types/src/meta.d.ts +32 -2
  274. package/dist/types/src/meta.d.ts.map +1 -1
  275. package/dist/types/src/operations/create-chat.d.ts.map +1 -1
  276. package/dist/types/src/operations/fork-chat.d.ts.map +1 -1
  277. package/dist/types/src/operations/generate-home-suggestions.d.ts +5 -0
  278. package/dist/types/src/operations/generate-home-suggestions.d.ts.map +1 -0
  279. package/dist/types/src/operations/generate-home-suggestions.test.d.ts +2 -0
  280. package/dist/types/src/operations/generate-home-suggestions.test.d.ts.map +1 -0
  281. package/dist/types/src/operations/index.d.ts.map +1 -1
  282. package/dist/types/src/operations/resolve-navigation-targets.d.ts +3 -15
  283. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -1
  284. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +2 -2
  285. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
  286. package/dist/types/src/paths.d.ts +1 -1
  287. package/dist/types/src/paths.d.ts.map +1 -1
  288. package/dist/types/src/plugin.workerd.d.ts +2 -0
  289. package/dist/types/src/plugin.workerd.d.ts.map +1 -0
  290. package/dist/types/src/processor/presets.d.ts +20 -9
  291. package/dist/types/src/processor/presets.d.ts.map +1 -1
  292. package/dist/types/src/processor/processor.d.ts +33 -209
  293. package/dist/types/src/processor/processor.d.ts.map +1 -1
  294. package/dist/types/src/skills/assistant/index.d.ts +2 -0
  295. package/dist/types/src/skills/assistant/index.d.ts.map +1 -0
  296. package/dist/types/src/skills/assistant/skill.d.ts +4 -0
  297. package/dist/types/src/skills/assistant/skill.d.ts.map +1 -0
  298. package/dist/types/src/skills/assistant/skill.node.test.d.ts +2 -0
  299. package/dist/types/src/skills/assistant/skill.node.test.d.ts.map +1 -0
  300. package/dist/types/src/skills/index.d.ts.map +1 -0
  301. package/dist/types/src/templates/daily-digest.d.ts +2 -2
  302. package/dist/types/src/templates/daily-digest.d.ts.map +1 -1
  303. package/dist/types/src/templates/index.d.ts +3 -3
  304. package/dist/types/src/templates/index.d.ts.map +1 -1
  305. package/dist/types/src/templates/research-brief.d.ts +2 -2
  306. package/dist/types/src/templates/research-brief.d.ts.map +1 -1
  307. package/dist/types/src/templates/routine-templates.test.d.ts +2 -0
  308. package/dist/types/src/templates/routine-templates.test.d.ts.map +1 -0
  309. package/dist/types/src/templates/scaffold.d.ts +9 -9
  310. package/dist/types/src/templates/scaffold.d.ts.map +1 -1
  311. package/dist/types/src/testing/test-generator.d.ts +1 -1
  312. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  313. package/dist/types/src/testing/test-sequence.d.ts +1 -8
  314. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  315. package/dist/types/src/testing/test-trace.d.ts.map +1 -1
  316. package/dist/types/src/translations.d.ts.map +1 -1
  317. package/dist/types/src/types/Assistant.d.ts +5 -12
  318. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  319. package/dist/types/src/types/AssistantCapabilities.d.ts +21 -0
  320. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  321. package/dist/types/src/types/AssistantEvents.d.ts.map +1 -1
  322. package/dist/types/src/types/AssistantOperation.d.ts +17 -110
  323. package/dist/types/src/types/AssistantOperation.d.ts.map +1 -1
  324. package/dist/types/src/types/ChatSurface.d.ts +12 -0
  325. package/dist/types/src/types/ChatSurface.d.ts.map +1 -0
  326. package/dist/types/src/types/Ollama.d.ts +44 -0
  327. package/dist/types/src/types/Ollama.d.ts.map +1 -0
  328. package/dist/types/src/types/Settings.d.ts +5 -4
  329. package/dist/types/src/types/Settings.d.ts.map +1 -1
  330. package/dist/types/src/types/index.d.ts +2 -0
  331. package/dist/types/src/types/index.d.ts.map +1 -1
  332. package/dist/types/src/types/service.d.ts +4 -3
  333. package/dist/types/src/types/service.d.ts.map +1 -1
  334. package/dist/types/src/util/error-cause.d.ts +3 -0
  335. package/dist/types/src/util/error-cause.d.ts.map +1 -0
  336. package/dist/types/src/util/suggestions.d.ts +1 -1
  337. package/dist/types/tsconfig.tsbuildinfo +1 -1
  338. package/dx.config.ts +38 -0
  339. package/package.json +103 -90
  340. package/src/AssistantPlugin.conversations.json +1 -1
  341. package/src/AssistantPlugin.node.ts +5 -5
  342. package/src/AssistantPlugin.test.ts +27 -41
  343. package/src/AssistantPlugin.ts +14 -12
  344. package/src/AssistantPlugin.workerd.ts +15 -6
  345. package/src/capabilities/agent-hydrator.ts +1 -2
  346. package/src/capabilities/agent-service.ts +7 -5
  347. package/src/capabilities/ai-context.ts +7 -32
  348. package/src/capabilities/ai-service.ts +3 -2
  349. package/src/capabilities/app-graph-builder.ts +43 -28
  350. package/src/capabilities/automation-templates.ts +3 -3
  351. package/src/capabilities/companion-chat-provisioner.ts +22 -6
  352. package/src/capabilities/{integration-provider.ts → connector.ts} +7 -12
  353. package/src/capabilities/create-object.ts +9 -26
  354. package/src/capabilities/index.ts +4 -12
  355. package/src/capabilities/markdown-extension.ts +7 -4
  356. package/src/capabilities/navigation-resolver.ts +20 -0
  357. package/src/capabilities/react-surface.tsx +55 -52
  358. package/src/capabilities/settings.ts +2 -2
  359. package/src/capabilities/skill-definition.ts +72 -0
  360. package/src/capabilities/state.ts +8 -1
  361. package/src/components/AgentProperties/AgentProperties.stories.tsx +1 -2
  362. package/src/components/AgentProperties/AgentProperties.tsx +1 -1
  363. package/src/components/Chat/Chat.stories.tsx +94 -0
  364. package/src/components/Chat/Chat.tsx +67 -16
  365. package/src/components/Chat/events.ts +0 -6
  366. package/src/components/ChatPrompt/ChatActions.tsx +185 -20
  367. package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
  368. package/src/components/ChatPrompt/ChatOptions.stories.tsx +3 -3
  369. package/src/components/ChatPrompt/ChatOptions.tsx +43 -50
  370. package/src/components/ChatPrompt/ChatPrompt.tsx +31 -47
  371. package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
  372. package/src/components/ChatPrompt/useChatVoiceInput.ts +103 -0
  373. package/src/components/ChatThread/Anchor.stories.tsx +1 -1
  374. package/src/components/ChatThread/ChatThread.stories.tsx +7 -16
  375. package/src/components/ChatThread/DEBUG.md +23 -0
  376. package/src/components/ChatThread/MarkdownStream.stories.tsx +3 -3
  377. package/src/components/ChatThread/registry.tsx +43 -17
  378. package/src/components/ChatThread/widgets/ReasoningWidget.stories.tsx +2 -2
  379. package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
  380. package/src/components/ChatThread/widgets/SurfaceWidget.tsx +41 -0
  381. package/src/components/ChatThread/widgets/ToolWidget.tsx +1 -1
  382. package/src/components/ChatThread/widgets/index.ts +1 -0
  383. package/src/components/ProcessTree/ProcessTree.stories.tsx +7 -0
  384. package/src/components/ProcessTree/ProcessTree.tsx +183 -88
  385. package/src/components/TaskList/TaskList.stories.tsx +24 -3
  386. package/src/components/TaskList/TaskList.tsx +122 -28
  387. package/src/components/ToolBlock/ToolBlock.tsx +1 -1
  388. package/src/components/Toolbox/Toolbox.tsx +11 -11
  389. package/src/components/index.ts +1 -6
  390. package/src/constants.ts +1 -1
  391. package/src/containers/AgentArticle/AgentArticle.stories.tsx +12 -13
  392. package/src/containers/AgentArticle/AgentArticle.tsx +10 -10
  393. package/src/{components → containers}/AssistantSettings/AssistantSettings.stories.tsx +3 -2
  394. package/src/containers/AssistantSettings/AssistantSettings.tsx +90 -0
  395. package/src/containers/AssistantSettings/OllamaModels.stories.tsx +108 -0
  396. package/src/containers/AssistantSettings/OllamaModels.tsx +255 -0
  397. package/src/containers/ChatArticle/ChatArticle.stories.tsx +3 -3
  398. package/src/containers/ChatArticle/ChatArticle.tsx +25 -28
  399. package/src/containers/ChatCompanion/ChatCompanion.tsx +27 -27
  400. package/src/containers/ChatDialog/ChatDialog.tsx +10 -7
  401. package/src/containers/IntegrationPrompt/IntegrationPrompt.tsx +79 -0
  402. package/src/containers/IntegrationPrompt/index.ts +5 -0
  403. package/src/containers/PlanArticle/PlanArticle.tsx +5 -1
  404. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +107 -0
  405. package/src/containers/SpaceHomePrompt/index.ts +5 -0
  406. package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +83 -0
  407. package/src/containers/SpaceHomeSuggestions/index.ts +5 -0
  408. package/src/containers/TracePanel/TracePanel.stories.tsx +89 -47
  409. package/src/containers/TracePanel/TracePanel.tsx +15 -37
  410. package/src/containers/TracePanel/dxn-extractor.test.ts +2 -2
  411. package/src/containers/TriggerStatus/TriggerStatus.tsx +10 -6
  412. package/src/containers/index.ts +4 -3
  413. package/src/execution-graph/SPEC.md +1 -1
  414. package/src/execution-graph/execution-graph.test.ts +213 -25
  415. package/src/execution-graph/execution-graph.ts +337 -70
  416. package/src/execution-graph/index.ts +15 -5
  417. package/src/execution-graph/pending-block-status.test.ts +114 -0
  418. package/src/execution-graph/pending-block-status.ts +88 -0
  419. package/src/execution-graph/span-tree.test.ts +33 -1
  420. package/src/execution-graph/span-tree.ts +43 -2
  421. package/src/execution-graph/sub-agent-delegation.test.ts +34 -19
  422. package/src/extensions/index.ts +1 -1
  423. package/src/extensions/prompt-extension.ts +102 -73
  424. package/src/feed-logger.ts +24 -22
  425. package/src/functions/services.test.ts +4 -4
  426. package/src/hooks/index.ts +4 -2
  427. package/src/hooks/useChatProcessor.ts +12 -16
  428. package/src/hooks/useChatServices.ts +2 -2
  429. package/src/hooks/useChatToolbarActions.ts +5 -5
  430. package/src/hooks/useContextBinder.ts +2 -4
  431. package/src/hooks/useDebug.ts +2 -2
  432. package/src/hooks/useHomeSuggestions.ts +55 -0
  433. package/src/hooks/usePresets.ts +80 -11
  434. package/src/hooks/useProcessEphemeralStatus.ts +192 -0
  435. package/src/hooks/useReferencesProvider.ts +1 -1
  436. package/src/hooks/useSkillRegistry.ts +125 -0
  437. package/src/hooks/useTraceMessages.ts +41 -0
  438. package/src/index.ts +1 -1
  439. package/src/meta.ts +3 -31
  440. package/src/operations/create-chat.ts +11 -12
  441. package/src/operations/fork-chat.ts +15 -20
  442. package/src/operations/generate-home-suggestions.test.ts +103 -0
  443. package/src/operations/generate-home-suggestions.ts +116 -0
  444. package/src/operations/index.ts +1 -0
  445. package/src/operations/prompt.node.test.ts +14 -17
  446. package/src/operations/resolve-navigation-targets.ts +32 -19
  447. package/src/operations/run-prompt-in-new-chat.ts +34 -35
  448. package/src/operations/update-chat-name.ts +2 -2
  449. package/src/paths.ts +5 -3
  450. package/src/plugin.workerd.ts +5 -0
  451. package/src/processor/presets.ts +38 -61
  452. package/src/processor/processor.node.test.ts +72 -2
  453. package/src/processor/processor.ts +91 -21
  454. package/src/skills/assistant/index.ts +5 -0
  455. package/src/{blueprints/assistant/blueprint.node.test.ts → skills/assistant/skill.node.test.ts} +8 -8
  456. package/src/{blueprints/assistant/blueprint.ts → skills/assistant/skill.ts} +9 -9
  457. package/src/templates/daily-digest.ts +10 -12
  458. package/src/templates/index.ts +3 -3
  459. package/src/templates/research-brief.ts +15 -13
  460. package/src/templates/routine-templates.test.ts +55 -0
  461. package/src/templates/scaffold.ts +22 -57
  462. package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
  463. package/src/testing/data/trace-timeline-remote.dx.json +1 -1
  464. package/src/testing/data/trace-timeline.dx.json +3430 -1093
  465. package/src/testing/test-generator.test.ts +26 -22
  466. package/src/testing/test-generator.ts +4 -8
  467. package/src/testing/test-trace.ts +2 -1
  468. package/src/testing/trace-timeline.node.test.ts +14 -14
  469. package/src/translations.ts +74 -31
  470. package/src/types/Assistant.ts +3 -1
  471. package/src/types/AssistantCapabilities.ts +24 -3
  472. package/src/types/AssistantEvents.ts +1 -1
  473. package/src/types/AssistantOperation.ts +22 -33
  474. package/src/types/ChatSurface.ts +16 -0
  475. package/src/types/Ollama.ts +59 -0
  476. package/src/types/Settings.ts +12 -10
  477. package/src/types/index.ts +3 -0
  478. package/src/types/service.ts +14 -14
  479. package/src/util/error-cause.ts +21 -0
  480. package/src/util/suggestions.ts +1 -1
  481. package/dist/lib/neutral/AgentArticle-K7XM46OQ.mjs.map +0 -7
  482. package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs +0 -40
  483. package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs.map +0 -7
  484. package/dist/lib/neutral/BlueprintArticle-ZBOZNZM7.mjs +0 -27
  485. package/dist/lib/neutral/BlueprintArticle-ZBOZNZM7.mjs.map +0 -7
  486. package/dist/lib/neutral/ChatCompanion-LBUHYWQG.mjs.map +0 -7
  487. package/dist/lib/neutral/ChatDialog-DCA6FLOV.mjs.map +0 -7
  488. package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +0 -7
  489. package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs +0 -119
  490. package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs.map +0 -7
  491. package/dist/lib/neutral/RoutineList-SO5ETHNT.mjs +0 -48
  492. package/dist/lib/neutral/RoutineList-SO5ETHNT.mjs.map +0 -7
  493. package/dist/lib/neutral/RoutineProperties-FISLMW2R.mjs +0 -17
  494. package/dist/lib/neutral/RoutineProperties-FISLMW2R.mjs.map +0 -7
  495. package/dist/lib/neutral/TracePanel-KTZJ6JNR.mjs.map +0 -7
  496. package/dist/lib/neutral/TriggerStatus-X7Y5JFZJ.mjs.map +0 -7
  497. package/dist/lib/neutral/agent-hydrator-PJBYVMBW.mjs.map +0 -7
  498. package/dist/lib/neutral/agent-service-WCAP5MLI.mjs.map +0 -7
  499. package/dist/lib/neutral/ai-context-7WRHWYXY.mjs +0 -42
  500. package/dist/lib/neutral/ai-context-7WRHWYXY.mjs.map +0 -7
  501. package/dist/lib/neutral/ai-service-AADUIKBY.mjs.map +0 -7
  502. package/dist/lib/neutral/app-graph-builder-WUFHQH3Y.mjs.map +0 -7
  503. package/dist/lib/neutral/automation-templates-M2XQWGR6.mjs +0 -115
  504. package/dist/lib/neutral/automation-templates-M2XQWGR6.mjs.map +0 -7
  505. package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs +0 -39
  506. package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs.map +0 -7
  507. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  508. package/dist/lib/neutral/chunk-5H6UJHLF.mjs.map +0 -7
  509. package/dist/lib/neutral/chunk-HLANPOBA.mjs.map +0 -7
  510. package/dist/lib/neutral/chunk-KLYLW4WH.mjs.map +0 -7
  511. package/dist/lib/neutral/chunk-QAZMOFPI.mjs +0 -130
  512. package/dist/lib/neutral/chunk-QAZMOFPI.mjs.map +0 -7
  513. package/dist/lib/neutral/chunk-RKVVK3R3.mjs.map +0 -7
  514. package/dist/lib/neutral/chunk-SMFJD7BP.mjs +0 -8
  515. package/dist/lib/neutral/chunk-XYHPOGTK.mjs +0 -43
  516. package/dist/lib/neutral/chunk-XYHPOGTK.mjs.map +0 -7
  517. package/dist/lib/neutral/chunk-YXRGZYYH.mjs.map +0 -7
  518. package/dist/lib/neutral/companion-chat-provisioner-YZZ73P6E.mjs.map +0 -7
  519. package/dist/lib/neutral/create-chat-SGGQ6HVN.mjs.map +0 -7
  520. package/dist/lib/neutral/create-object-U2SOFZLR.mjs.map +0 -7
  521. package/dist/lib/neutral/fork-chat-34KEF4ZJ.mjs.map +0 -7
  522. package/dist/lib/neutral/integration-provider-RBD3AFJU.mjs.map +0 -7
  523. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs +0 -110
  524. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs.map +0 -7
  525. package/dist/lib/neutral/react-surface-XRTBW5OJ.mjs.map +0 -7
  526. package/dist/lib/neutral/resolve-navigation-targets-ZHIMMH7L.mjs +0 -22
  527. package/dist/lib/neutral/resolve-navigation-targets-ZHIMMH7L.mjs.map +0 -7
  528. package/dist/lib/neutral/run-prompt-in-new-chat-D5IIE2C7.mjs.map +0 -7
  529. package/dist/lib/neutral/state-H3G7QCU6.mjs.map +0 -7
  530. package/dist/types/src/blueprints/assistant/blueprint.d.ts +0 -4
  531. package/dist/types/src/blueprints/assistant/blueprint.d.ts.map +0 -1
  532. package/dist/types/src/blueprints/assistant/blueprint.node.test.d.ts +0 -2
  533. package/dist/types/src/blueprints/assistant/blueprint.node.test.d.ts.map +0 -1
  534. package/dist/types/src/blueprints/assistant/index.d.ts +0 -2
  535. package/dist/types/src/blueprints/assistant/index.d.ts.map +0 -1
  536. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  537. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
  538. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  539. package/dist/types/src/capabilities/integration-provider.d.ts.map +0 -1
  540. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +0 -1
  541. package/dist/types/src/components/RoutineProperties/RoutineProperties.d.ts +0 -7
  542. package/dist/types/src/components/RoutineProperties/RoutineProperties.d.ts.map +0 -1
  543. package/dist/types/src/components/RoutineProperties/RoutineProperties.stories.d.ts +0 -15
  544. package/dist/types/src/components/RoutineProperties/RoutineProperties.stories.d.ts.map +0 -1
  545. package/dist/types/src/components/RoutineProperties/index.d.ts +0 -2
  546. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +0 -13
  547. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +0 -1
  548. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +0 -1
  549. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +0 -21
  550. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +0 -1
  551. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +0 -16
  552. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +0 -1
  553. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts +0 -12
  554. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +0 -1
  555. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts +0 -3
  556. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts.map +0 -1
  557. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts +0 -8
  558. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +0 -1
  559. package/dist/types/src/components/TemplateEditor/index.d.ts +0 -2
  560. package/dist/types/src/components/TemplateEditor/index.d.ts.map +0 -1
  561. package/dist/types/src/components/TemplateEditor/types.d.ts +0 -18
  562. package/dist/types/src/components/TemplateEditor/types.d.ts.map +0 -1
  563. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts +0 -6
  564. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts.map +0 -1
  565. package/dist/types/src/containers/BlueprintArticle/index.d.ts +0 -2
  566. package/dist/types/src/containers/BlueprintArticle/index.d.ts.map +0 -1
  567. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +0 -6
  568. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +0 -1
  569. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts +0 -15
  570. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts.map +0 -1
  571. package/dist/types/src/containers/RoutineArticle/index.d.ts +0 -2
  572. package/dist/types/src/containers/RoutineArticle/index.d.ts.map +0 -1
  573. package/dist/types/src/containers/RoutineList/RoutineList.d.ts +0 -6
  574. package/dist/types/src/containers/RoutineList/RoutineList.d.ts.map +0 -1
  575. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts +0 -21
  576. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts.map +0 -1
  577. package/dist/types/src/containers/RoutineList/index.d.ts +0 -2
  578. package/dist/types/src/containers/RoutineList/index.d.ts.map +0 -1
  579. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +0 -66
  580. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +0 -1
  581. package/dist/types/src/hooks/useOnline.d.ts +0 -3
  582. package/dist/types/src/hooks/useOnline.d.ts.map +0 -1
  583. package/dist/types/src/templates/automation-templates.test.d.ts +0 -2
  584. package/dist/types/src/templates/automation-templates.test.d.ts.map +0 -1
  585. package/src/blueprints/assistant/index.ts +0 -5
  586. package/src/capabilities/blueprint-definition.ts +0 -65
  587. package/src/components/AssistantSettings/AssistantSettings.tsx +0 -43
  588. package/src/components/RoutineProperties/RoutineProperties.stories.tsx +0 -59
  589. package/src/components/RoutineProperties/RoutineProperties.tsx +0 -23
  590. package/src/components/RoutineProperties/index.ts +0 -5
  591. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +0 -95
  592. package/src/components/TemplateEditor/TemplateEditor.tsx +0 -80
  593. package/src/components/TemplateEditor/TemplateForm.stories.tsx +0 -76
  594. package/src/components/TemplateEditor/TemplateForm.tsx +0 -204
  595. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +0 -274
  596. package/src/components/TemplateEditor/extensions/index.ts +0 -6
  597. package/src/components/TemplateEditor/extensions/xml-extension.ts +0 -64
  598. package/src/components/TemplateEditor/index.ts +0 -5
  599. package/src/components/TemplateEditor/types.tsx +0 -28
  600. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +0 -29
  601. package/src/containers/BlueprintArticle/index.ts +0 -5
  602. package/src/containers/RoutineArticle/RoutineArticle.stories.tsx +0 -75
  603. package/src/containers/RoutineArticle/RoutineArticle.tsx +0 -109
  604. package/src/containers/RoutineArticle/index.ts +0 -5
  605. package/src/containers/RoutineList/RoutineList.stories.tsx +0 -130
  606. package/src/containers/RoutineList/RoutineList.tsx +0 -50
  607. package/src/containers/RoutineList/index.ts +0 -5
  608. package/src/hooks/useBlueprintRegistry.ts +0 -125
  609. package/src/hooks/useOnline.ts +0 -10
  610. package/src/templates/automation-templates.test.ts +0 -66
  611. package/src/testing/trace-timeline.node.conversations.json +0 -1
  612. /package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs.map → ChatArticle-OO7GGEFW.mjs.map} +0 -0
  613. /package/dist/lib/neutral/{edge-model-resolver-BBVOJBGJ.mjs.map → edge-model-resolver-WDJWDZTT.mjs.map} +0 -0
  614. /package/dist/lib/neutral/{blueprints → extensions}/index.mjs.map +0 -0
  615. /package/dist/types/src/{components → containers}/AssistantSettings/AssistantSettings.stories.d.ts +0 -0
  616. /package/dist/types/src/{components → containers}/AssistantSettings/index.d.ts +0 -0
  617. /package/dist/types/src/{blueprints → skills}/index.d.ts +0 -0
  618. /package/src/{components → containers}/AssistantSettings/index.ts +0 -0
  619. /package/src/{blueprints → skills}/index.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/execution-graph/execution-graph.ts", "../../../../src/execution-graph/span-tree.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Either from 'effect/Either';\nimport { pipe } from 'effect/Function';\nimport * as Pipeable from 'effect/Pipeable';\nimport * as Schema from 'effect/Schema';\nimport * as Struct from 'effect/Struct';\n\nimport { AgentRequestBegin, AgentRequestEnd, CompleteBlock } from '@dxos/assistant';\nimport { Process, Trace } from '@dxos/compute';\nimport { AGENT_PROCESS_KEY } from '@dxos/functions-runtime';\nimport { LogLevel, log } from '@dxos/log';\nimport { type Commit } from '@dxos/react-ui-components';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { ROOT_SPAN_ID, type Span, buildSpanTree, isSpanBeginEvent, isSpanEndEvent, walkSpanTree } from './span-tree';\n\n/**\n * Branch name for top-level operation invocations.\n */\nconst MAIN_BRANCH = 'main';\n\nconst ICONS = {\n agentRequestBegin: {\n icon: 'ph--atom--regular',\n level: LogLevel.VERBOSE,\n },\n agentRequestEndSuccess: {\n icon: 'ph--atom--regular',\n level: LogLevel.INFO,\n },\n agentRequestEndError: {\n icon: 'ph--atom--regular',\n level: LogLevel.ERROR,\n },\n agentRequestEndInterrupted: {\n icon: 'ph--atom--regular',\n level: LogLevel.WARN,\n },\n userMessage: {\n icon: 'ph--user--regular',\n level: LogLevel.VERBOSE,\n },\n statusMessage: {\n icon: 'ph--info--regular',\n level: LogLevel.VERBOSE,\n },\n operationStart: {\n icon: 'ph--function--regular',\n level: LogLevel.VERBOSE,\n },\n operationEndSuccess: {\n icon: 'ph--function--regular',\n level: LogLevel.INFO,\n },\n operationEndError: {\n icon: 'ph--function--regular',\n level: LogLevel.ERROR,\n },\n toolCall: {\n icon: 'ph--wrench--regular',\n level: LogLevel.VERBOSE,\n },\n toolResultSuccess: {\n icon: 'ph--wrench--regular',\n level: LogLevel.INFO,\n },\n toolResultError: {\n icon: 'ph--wrench--regular',\n level: LogLevel.ERROR,\n },\n agentRequestRunning: {\n icon: 'ph--spinner-gap--regular',\n level: LogLevel.VERBOSE,\n },\n processRunning: {\n icon: 'ph--spinner-gap--regular',\n level: LogLevel.VERBOSE,\n },\n} as const;\n\nexport interface BuildExecutionGraphParams {\n traceMessages: readonly Trace.Message[];\n activeProcesses?: readonly Process.Info[];\n eventLimit?: number;\n}\n\n/**\n * Builds a Timeline-compatible execution graph from trace messages and active processes.\n *\n * The conversion runs in two stages:\n * 1. `buildSpanTree` converts the flat list of trace messages into a hierarchical\n * tree of spans grouped by process id (pid). See `./span-tree.ts`.\n * 2. `spanTreeToCommits` walks the tree and emits one commit per event, using the\n * tree structure to decide which branch each commit belongs to and how to wire parents.\n *\n * Pure function — no signals or atoms.\n */\nexport type ExecutionGraph = {\n branches: string[];\n commits: Commit[];\n spanTree: Span;\n /** Commit id -> trace event. */\n details: ExecutionGraphDetailsMap;\n};\n\nexport type ExecutionGraphDetailsMap = Record<string, Trace.FlatEvent | undefined>;\n\nexport const buildExecutionGraph = ({\n traceMessages,\n activeProcesses = [],\n eventLimit = 500,\n}: BuildExecutionGraphParams): ExecutionGraph => {\n const spanTree = buildSpanTree(traceMessages, { eventLimit });\n const toolCallContext = buildToolCallContext(traceMessages);\n const built = spanTreeToCommits(spanTree, activeProcesses, toolCallContext);\n log('trace execution graph', {\n traceMessages: traceMessages.length,\n commits: built.commits.length,\n branches: built.branches.length,\n activeProcesses: activeProcesses.length,\n });\n return { ...built, spanTree };\n};\n\n/**\n * Lookup tables that pair `toolCall` blocks with their matching `toolResult` blocks so the\n * renderer can collapse the two events into a single commit (mirroring how begin/end events of\n * an empty operation span collapse). Indexed by the shared `toolCallId`.\n */\ninterface ToolCallContext {\n callById: Map<string, ContentBlock.ToolCall>;\n resultByCallId: Map<string, ContentBlock.ToolResult>;\n}\n\nconst buildToolCallContext = (messages: readonly Trace.Message[]): ToolCallContext => {\n const callById = new Map<string, ContentBlock.ToolCall>();\n const resultByCallId = new Map<string, ContentBlock.ToolResult>();\n for (const message of messages) {\n for (const event of message.events) {\n if (event.type !== CompleteBlock.key) {\n continue;\n }\n const data = event.data as { block?: ContentBlock.Any } | undefined;\n const block = data?.block;\n if (!block) {\n continue;\n }\n if (block._tag === 'toolCall') {\n callById.set(block.toolCallId, block);\n } else if (block._tag === 'toolResult') {\n resultByCallId.set(block.toolCallId, block);\n }\n }\n }\n return { callById, resultByCallId };\n};\n\n/**\n * Visual representation of a single trace event — icon, log level, message string.\n * `undefined` indicates that the event should not produce a commit.\n */\ninterface EventPresentation {\n icon: string;\n level: LogLevel;\n message: string;\n idSuffix?: string;\n}\n\ntype AgentRequestEndData = Schema.Schema.Type<typeof AgentRequestEnd.schema>;\n\n/**\n * Parses `AgentRequestEnd` payload, accepting legacy traces that omitted `status`.\n */\nconst parseAgentRequestEnd = (data: unknown): AgentRequestEndData | undefined => {\n const validated = Schema.validateEither(AgentRequestEnd.schema)(data);\n if (Either.isRight(validated)) {\n return validated.right;\n }\n // Traces emitted before `status` was added wrote an empty object.\n if (data != null && typeof data === 'object' && Object.keys(data).length === 0) {\n return { status: 'success' };\n }\n log('invalid trace event', { type: AgentRequestEnd.key });\n return undefined;\n};\n\nconst presentAgentRequestEnd = (data: AgentRequestEndData): EventPresentation => {\n switch (data.status) {\n case 'error':\n return {\n icon: ICONS.agentRequestEndError.icon,\n level: ICONS.agentRequestEndError.level,\n message: data.error ? trimText(`Agent request failed: ${data.error}`) : 'Agent request failed',\n };\n case 'interrupted':\n return {\n icon: ICONS.agentRequestEndInterrupted.icon,\n level: ICONS.agentRequestEndInterrupted.level,\n message: 'Agent request interrupted',\n };\n default:\n return {\n icon: ICONS.agentRequestEndSuccess.icon,\n level: ICONS.agentRequestEndSuccess.level,\n message: 'Agent completed request',\n };\n }\n};\n\nconst presentEvent = (event: Trace.FlatEvent, toolCallContext: ToolCallContext): EventPresentation | undefined => {\n if (Trace.isOfType(AgentRequestBegin, event)) {\n if (Either.isLeft(Schema.validateEither(AgentRequestBegin.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n return {\n icon: ICONS.agentRequestBegin.icon,\n level: ICONS.agentRequestBegin.level,\n message: 'Agent processing request...',\n };\n }\n if (Trace.isOfType(AgentRequestEnd, event)) {\n const endData = parseAgentRequestEnd(event.data);\n if (!endData) {\n return undefined;\n }\n return presentAgentRequestEnd(endData);\n }\n if (Trace.isOfType(CompleteBlock, event)) {\n if (Either.isLeft(Schema.validateEither(CompleteBlock.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n switch (event.data.block._tag) {\n case 'text':\n return event.data.role === 'user'\n ? {\n icon: ICONS.userMessage.icon,\n level: ICONS.userMessage.level,\n message: trimText(event.data.block.text),\n }\n : undefined;\n case 'status':\n return {\n icon: ICONS.statusMessage.icon,\n level: ICONS.statusMessage.level,\n message: trimText(event.data.block.statusText),\n };\n case 'toolCall': {\n // Operation-backed tool calls already have a dedicated routine span (Trace.OperationStart /\n // Trace.OperationEnd) that produces its own commits — skip the duplicate toolCall commit\n // to avoid double-rendering.\n if (event.data.block.operationKey) {\n return undefined;\n }\n // Collapse the toolCall/toolResult pair: when the matching toolResult has arrived, the\n // result event is the visible commit and carries the success/error state. The toolCall\n // itself only renders while still pending (i.e. no result yet) — same intent as an\n // operation span that collapses to a single end commit once both boundaries are present.\n if (toolCallContext.resultByCallId.has(event.data.block.toolCallId)) {\n return undefined;\n }\n return {\n icon: ICONS.toolCall.icon,\n level: ICONS.toolCall.level,\n message: event.data.block.name,\n idSuffix: `toolCall:${event.data.block.toolCallId}`,\n };\n }\n case 'toolResult': {\n // Suppress results for operation-backed calls — those are covered by the routine span.\n const call = toolCallContext.callById.get(event.data.block.toolCallId);\n if (call?.operationKey) {\n return undefined;\n }\n const success = event.data.block.error === undefined;\n const name = call?.name ?? event.data.block.name;\n return {\n icon: success ? ICONS.toolResultSuccess.icon : ICONS.toolResultError.icon,\n level: success ? ICONS.toolResultSuccess.level : ICONS.toolResultError.level,\n message: `${name} - ${success ? 'Success' : 'Error'}`,\n idSuffix: `toolResult:${event.data.block.toolCallId}`,\n };\n }\n default:\n return undefined;\n }\n }\n if (Trace.isOfType(Trace.OperationStart, event)) {\n if (Either.isLeft(Schema.validateEither(Trace.OperationStart.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n return {\n icon: event.data.icon ?? ICONS.operationStart.icon,\n level: ICONS.operationStart.level,\n message: event.data.name ?? event.data.key,\n idSuffix: `${event.data.key}:start`,\n };\n }\n if (Trace.isOfType(Trace.OperationEnd, event)) {\n if (Either.isLeft(Schema.validateEither(Trace.OperationEnd.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n const success = event.data.outcome === 'success';\n return {\n icon: event.data.icon ?? (success ? ICONS.operationEndSuccess.icon : ICONS.operationEndError.icon),\n level: success ? ICONS.operationEndSuccess.level : ICONS.operationEndError.level,\n message: `${event.data.name ?? event.data.key} - ${success ? 'Success' : 'Error'}`,\n idSuffix: `${event.data.key}:end`,\n };\n }\n return undefined;\n};\n\n/**\n * A span is \"collapsible\" when it would otherwise render as an empty fork-and-merge:\n * exactly two events that form a begin/end pair and no child sub-spans. In that case\n * we emit a single commit for the end event on the parent branch.\n *\n * A *pending* span (one whose end event has not yet been recorded) is never collapsed:\n * its trailing events should keep rendering as middle commits on the span's own branch\n * — never as a fake \"end\" commit on the parent branch.\n *\n * Both nested spans and top-level spans (whose parent is the synthetic root) are eligible\n * once they have completed: a span with no inner activity is collapsed regardless of where\n * it sits in the tree.\n */\nconst isCollapsibleSpan = (span: Span, parent: Span | null): boolean => {\n if (span.id === ROOT_SPAN_ID) {\n return false;\n }\n if (span.events.length !== 2) {\n return false;\n }\n if (span.children.length > 0) {\n return false;\n }\n const firstEvent = span.events[0];\n const lastEvent = span.events[span.events.length - 1];\n if (!isSpanBeginEvent(firstEvent) || !isSpanEndEvent(lastEvent)) {\n return false;\n }\n return parent !== null;\n};\n\n/**\n * Converts a span tree into a flat list of commits + branches suitable for `Timeline` rendering.\n *\n * For every span the algorithm:\n * - emits the **first** event as a \"begin\" commit on the parent span's branch (fork);\n * - emits **middle** events as commits on the span's own branch;\n * - emits the **last** event as an \"end\" commit on the parent span's branch with two parents\n * (the begin commit and the last commit on the span's own branch — a merge).\n *\n * Collapsible spans (`isCollapsibleSpan`) emit only the end commit on the parent branch with\n * a single parent — a tidier rendering for sub-operations that have no inner detail.\n *\n * Events are processed in global chronological order so that sub-operations of a span interleave\n * naturally with the span's own middle events.\n */\nconst spanTreeToCommits = (\n root: Span,\n activeProcesses: readonly Process.Info[],\n toolCallContext: ToolCallContext,\n): { branches: string[]; commits: Commit[]; details: ExecutionGraphDetailsMap } => {\n const builder = new GraphBuilder();\n const details: ExecutionGraphDetailsMap = {};\n builder.addBranch(MAIN_BRANCH);\n\n // Build a child → parent lookup using the tree's own structure (already correctly parented\n // when the tree was constructed, including sequential spans of the same process).\n const parentBySpan = new Map<Span, Span | null>();\n parentBySpan.set(root, null);\n const indexParents = (span: Span): void => {\n for (const child of span.children) {\n parentBySpan.set(child, span);\n indexParents(child);\n }\n };\n indexParents(root);\n\n const findParentSpan = (span: Span): Span | null => parentBySpan.get(span) ?? null;\n\n // The branch name for a span is its pid — multiple sequential spans of the same process\n // (e.g. successive agent requests in one session) share a branch so they reuse a single lane.\n const branchOf = (span: Span | null): string => {\n if (!span || span.id === ROOT_SPAN_ID) {\n return MAIN_BRANCH;\n }\n return span.meta.pid ?? span.id;\n };\n\n // Selector that returns \"the most recent commit in this span's structural context\".\n //\n // The walk is structural (pid/parentPid), not topological: at each ancestor, we prefer\n // 1) the last commit on that span's own branch, then\n // 2) that span's begin commit (the fork point on its parent branch),\n // 3) and only then recurse into the parent span.\n //\n // Crucially, we never silently slip onto a *sibling* span's commit on a shared ancestor\n // branch. E.g. if a sub-span of agent A fires before A has any middle commits, we anchor\n // to A.begin — not to whatever unrelated commit happens to be the latest on main.\n // This keeps fork edges visually attached to the correct span even when sibling top-level\n // spans (different pids) overlap in time on main.\n const lastInSpanContext = (span: Span | null): CommitSelector => {\n if (!span || span.id === ROOT_SPAN_ID) {\n return CommitSelector.branch(MAIN_BRANCH).pipe(CommitSelector.compose(CommitSelector.last()));\n }\n const ownBranch = branchOf(span);\n const beginId = beginCommitIdBySpan.get(span.id);\n return CommitSelector.firstOf(\n CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last())),\n beginId ? CommitSelector.id(beginId) : CommitSelector.filter(() => false),\n lastInSpanContext(findParentSpan(span)),\n );\n };\n\n // Flatten the tree into a chronological stream, recording each event's position within its span\n // so we can detect begin/end events.\n interface EventCursor {\n span: Span;\n event: Trace.FlatEvent;\n eventIndex: number;\n globalIndex: number;\n }\n const stream: EventCursor[] = [];\n walkSpanTree(root, (span) => {\n span.events.forEach((event, eventIndex) => {\n stream.push({ span, event, eventIndex, globalIndex: stream.length });\n });\n });\n stream.sort((a, b) => a.event.timestamp - b.event.timestamp || a.globalIndex - b.globalIndex);\n\n // Track the id of the begin commit for each non-collapsible span so the end commit can merge into it.\n const beginCommitIdBySpan = new Map<string, string>();\n\n for (const { span, event, globalIndex } of stream) {\n const presentation = presentEvent(event, toolCallContext);\n if (!presentation) {\n continue;\n }\n\n // Classify based on event TYPE, not array index. A pending span's trailing\n // middle event (e.g. a user message awaiting an agent response) must not be\n // mistaken for the span's end event — otherwise it would render on the\n // parent branch instead of the span's own branch.\n const isBeginEvent = isSpanBeginEvent(event);\n const isEndEvent = isSpanEndEvent(event);\n const parentSpan = findParentSpan(span);\n const collapsible = isCollapsibleSpan(span, parentSpan);\n\n // Collapsed spans: skip the begin event entirely; only the end event renders.\n if (collapsible && isBeginEvent) {\n continue;\n }\n\n const parentBranch = branchOf(parentSpan);\n const ownBranch = branchOf(span);\n\n // A \"process boundary\" span is a concurrent child PROCESS (its own pid, differing from the\n // parent's) with real sub-flow content (a middle event) — e.g. a delegated sub-agent. Such a\n // span gets its own lane: it forks onto its own branch at begin and collapses back to main at\n // end (so neither its lane nor its parent's lane dangles). A bare operation (begin+end only)\n // collapses to a single commit and is NOT treated as a boundary — forking its transient begin\n // mid-stream would flash a throwaway lane.\n const ownPid = span.meta.pid;\n const parentPid = parentSpan?.meta.pid;\n const spanHasMiddle = span.events.some((event) => !isSpanBeginEvent(event) && !isSpanEndEvent(event));\n const isProcessBoundary = ownPid != null && parentPid != null && ownPid !== parentPid && spanHasMiddle;\n\n let branch: string;\n let parents: string[];\n\n if (span.id === ROOT_SPAN_ID) {\n // Root-level events (no pid) attach sequentially to main.\n branch = MAIN_BRANCH;\n parents = builder.computeParents(lastInSpanContext(null));\n } else if (collapsible) {\n // Only the end event reaches here for collapsible spans.\n // Anchor to the parent span's structural context so the fork attaches to the parent\n // — not to a sibling span's commit that happens to be the latest on the shared ancestor.\n branch = parentBranch;\n parents = builder.computeParents(lastInSpanContext(parentSpan));\n } else if (isBeginEvent) {\n // Begin commit, anchored to the parent's structural context. A nested sub-span stays on the\n // parent lane (only its middle events fork). A concurrent child process forks onto its own\n // branch from this first event so it gets its own lane immediately.\n branch = isProcessBoundary ? ownBranch : parentBranch;\n parents = builder.computeParents(lastInSpanContext(parentSpan));\n } else if (isEndEvent) {\n // End commit: continues the parent branch chronologically and merges in own-branch work.\n //\n // Parent #1 is the *immediate predecessor* on the parent branch (not the matching begin\n // commit). Pointing back to the begin commit creates a visual edge that skips over any\n // sibling span's commits emitted between begin and end — e.g. when two top-level Routine\n // spans overlap on main, R1.end would otherwise draw an arrow back to R1.begin that\n // crosses over R2.begin. Anchoring to the previous main commit keeps main linear.\n //\n // A concurrent child process collapses all the way back to MAIN (merging its own branch),\n // rather than to its parent's branch: the parent (e.g. a supervisor whose turn already merged\n // to main) would otherwise gain commits after its own merge and never re-collapse — leaving a\n // dangling lane after the child finishes.\n branch = isProcessBoundary ? MAIN_BRANCH : parentBranch;\n parents = builder.computeParents(\n CommitSelector.unionAll(\n CommitSelector.branch(branch).pipe(CommitSelector.compose(CommitSelector.last())),\n CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n );\n } else {\n // Middle event: continue the span's own branch; fall back to span's own context so the\n // first middle event of a span forks from the span's begin commit, not from a sibling's\n // commit on an ancestor branch.\n branch = ownBranch;\n parents = builder.computeParents(lastInSpanContext(span));\n }\n\n const commitId = formatCommitId(span, globalIndex, presentation.idSuffix);\n const commit: Commit = {\n id: commitId,\n branch,\n parents,\n timestamp: new Date(event.timestamp),\n icon: presentation.icon,\n level: presentation.level,\n message: presentation.message,\n };\n builder.addCommit(commit);\n details[commitId] = event;\n\n // Record begin commit so a later end event can merge into it.\n if (isBeginEvent && !collapsible && span.id !== ROOT_SPAN_ID) {\n beginCommitIdBySpan.set(span.id, commitId);\n }\n }\n\n // Append \"running\" indicators for processes that are still active.\n for (const process of activeProcesses) {\n if (\n process.key === AGENT_PROCESS_KEY &&\n process.params.target &&\n (process.state === Process.State.RUNNING || process.state === Process.State.HYBERNATING)\n ) {\n builder.addCommit({\n id: `running:${process.pid}`,\n branch: process.pid,\n parents: builder.computeParents(\n CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n icon: ICONS.agentRequestRunning.icon,\n level: ICONS.agentRequestRunning.level,\n message: 'Generating...',\n timestamp: new Date(),\n });\n } else if (process.state === Process.State.RUNNING && builder.hasBranch(process.pid)) {\n builder.addCommit({\n id: `running:${process.pid}`,\n branch: process.pid,\n parents: builder.computeParents(\n CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n icon: ICONS.processRunning.icon,\n level: ICONS.processRunning.level,\n message: 'Running...',\n timestamp: new Date(),\n });\n }\n }\n\n const { commits, branches } = builder.build();\n return { commits, branches, details };\n};\n\nconst formatCommitId = (span: Span, globalIndex: number, suffix?: string): string => {\n const base = `${span.id}:${globalIndex}`;\n return suffix ? `${base}:${suffix}` : base;\n};\n\nconst trimText = (text: string) => text.slice(0, 100).trim().split('\\n')[0];\n\ntype Falsy = false | null | undefined;\n\nexport interface CommitSelector extends Pipeable.Pipeable {\n select: (commits: Commit[]) => Commit[];\n}\n\nexport const CommitSelector = {\n make: (select: CommitSelector['select']): CommitSelector => ({\n select,\n pipe(...args: any) {\n return Pipeable.pipeArguments(this, args);\n },\n }),\n\n identity: (): CommitSelector => CommitSelector.make((commits) => commits),\n\n /**\n * Selects commits that match the given predicate.\n */\n filter: (predicate: (commit: Commit) => unknown): CommitSelector =>\n CommitSelector.make((commits) => commits.filter(predicate)),\n\n /**\n * Selects commits by id.\n */\n id: (id: string): CommitSelector => CommitSelector.filter((commit) => commit.id === id),\n /**\n * Selects commits by tag.\n */\n tag: (tag: string | Falsy): CommitSelector => CommitSelector.filter((commit) => tag && commit.tags?.includes(tag)),\n /**\n * Selects commits by if any of the given tags are present.\n */\n anyTags: (tags: (string | Falsy)[]): CommitSelector =>\n CommitSelector.filter((commit) => tags.some((tag) => tag && commit.tags?.includes(tag))),\n /**\n * Selects commits by branch.\n */\n branch: (branch: string | Falsy): CommitSelector =>\n CommitSelector.filter((commit) => branch && commit.branch === branch),\n\n /**\n * Chains two selectors together, applying the second selector to the result of the first.\n *\n * Example:\n *\n * ```\n * CommitSelector.tag('tag').pipe(CommitSelector.compose(CommitSelector.branch('main')));\n * ```\n */\n compose:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => next.select(prev.select(commits))),\n\n /**\n * If `prev` selector matches no commits, return `next` selector, otherwise return `prev` selector.\n * Same as `CommitSelector.firstOf(prev, next)`.\n *\n * Example:\n *\n * ```\n * CommitSelector.tag('tag').pipe(CommitSelector.orElse(CommitSelector.branch('main')));\n * ```\n */\n orElse:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = prev.select(commits);\n if (selected.length > 0) {\n return selected;\n }\n return next.select(commits);\n }),\n\n /**\n * Selects commits that match either of the given selectors.\n */\n andAlso:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.unionAll(prev, next),\n\n /**\n * Selects the first n commits.\n */\n first: (n: number = 1): CommitSelector => CommitSelector.make((commits) => commits.slice(0, n)),\n /**\n * Selects the last n commits (reverses the order of the commits).\n */\n last: (n: number = 1): CommitSelector => CommitSelector.make((commits) => commits.toReversed().slice(0, n)),\n /**\n * Selects commits that do not match the given selector.\n */\n not: (selector: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = selector.select(commits);\n return commits.filter((commit) => !selected.includes(commit));\n }),\n\n /**\n * Selects commits that match any of the given selectors.\n */\n unionAll: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n return Array.dedupeWith(\n selectors.flatMap((selector) => selector.select(commits)),\n (a, b) => a.id === b.id,\n );\n }),\n\n /**\n * Selects commits that match all of the given selectors.\n */\n intersectAll: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = selectors.map((selector) => selector.select(commits));\n if (selected.length === 0) {\n return [];\n }\n return selected[0].filter((commit) => selected.every((selected) => selected.some((c) => c.id === commit.id)));\n }),\n\n /**\n * Returns the result of the first selector that matches any commits.\n */\n firstOf: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n for (const selector of selectors) {\n const selected = selector.select(commits);\n if (selected.length > 0) {\n return selected;\n }\n }\n return [];\n }),\n};\n\nclass GraphBuilder {\n #commits: Commit[] = [];\n #branches = new Set<string>();\n\n findCommits(selector: CommitSelector): Commit[] {\n return selector.select(this.#commits);\n }\n\n hasBranch(branch: string): boolean {\n return this.#branches.has(branch);\n }\n\n addCommit(commit: Commit) {\n this.addBranch(commit.branch);\n this.#commits.push(commit);\n }\n\n /**\n * Computes parents — picks first matching commit's id.\n */\n computeParents(selector: CommitSelector): string[] {\n return Array.dedupe(selector.select(this.#commits).map((commit) => commit.id));\n }\n\n addBranch(branch: string) {\n this.#branches.add(branch);\n }\n\n /**\n * Removes duplicate commits and dangling parents.\n */\n doctor() {\n this.#commits = pipe(\n this.#commits,\n Array.dedupeWith((a, b) => a.id === b.id),\n Array.map(\n Struct.evolve({\n parents: (parents) =>\n parents ? Array.filter(parents, (id) => this.#commits.some((commit) => commit.id === id)) : undefined,\n }),\n ),\n );\n }\n\n build() {\n this.doctor();\n return {\n commits: this.#commits,\n branches: [...this.#branches],\n };\n }\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { AgentRequestBegin, AgentRequestEnd } from '@dxos/assistant';\nimport { Trace } from '@dxos/compute';\n\n/**\n * Synthetic id assigned to the root span.\n * The root is a virtual container for top-level spans (those without a parent in the captured trace).\n */\nexport const ROOT_SPAN_ID = '<main>';\n\n/**\n * Computed metadata for a span.\n * Derived from the meta of the begin event that opened the span.\n */\nexport interface SpanMeta {\n readonly pid?: string;\n readonly parentPid?: string;\n readonly processName?: string;\n readonly conversationId?: string;\n readonly triggerId?: string;\n readonly toolCallId?: string;\n readonly runtimeName?: string;\n}\n\n/**\n * A span in the trace hierarchy.\n *\n * Each span represents a single bounded unit of work — an operation invocation or an\n * agent request. Spans are opened by `OperationStart` / `AgentRequestBegin` events and\n * closed by their matching `OperationEnd` / `AgentRequestEnd` events. A single process\n * (pid) may produce multiple sequential spans (for example, an agent session that serves\n * three prompts produces three sibling spans sharing the agent's pid).\n *\n * `events` contains the bounded events for this span only — child spans' events are not\n * duplicated here. `children` contains sub-spans that opened while this span was active.\n */\nexport interface Span {\n readonly id: string;\n readonly meta: SpanMeta;\n readonly events: Trace.FlatEvent[];\n readonly children: Span[];\n}\n\nexport const BEGIN_EVENT_TYPES = new Set<string>([Trace.OperationStart.key, AgentRequestBegin.key]);\nexport const END_EVENT_TYPES = new Set<string>([Trace.OperationEnd.key, AgentRequestEnd.key]);\n\nexport const isSpanBeginEvent = (event: Trace.FlatEvent): boolean => BEGIN_EVENT_TYPES.has(event.type);\nexport const isSpanEndEvent = (event: Trace.FlatEvent): boolean => END_EVENT_TYPES.has(event.type);\n\nconst computeMeta = (rawMeta: Trace.Meta): SpanMeta => ({\n pid: rawMeta.pid,\n parentPid: rawMeta.parentPid,\n processName: rawMeta.processName,\n conversationId: rawMeta.conversationId,\n triggerId: rawMeta.triggerId,\n toolCallId: rawMeta.toolCallId,\n runtimeName: rawMeta.runtimeName,\n});\n\ninterface MutableSpan {\n id: string;\n meta: SpanMeta;\n events: Trace.FlatEvent[];\n children: MutableSpan[];\n firstTimestamp: number;\n}\n\nconst makeMutableSpan = (id: string, meta: SpanMeta): MutableSpan => ({\n id,\n meta,\n events: [],\n children: [],\n firstTimestamp: Number.POSITIVE_INFINITY,\n});\n\nconst freezeSpan = (span: MutableSpan): Span => ({\n id: span.id,\n meta: span.meta,\n events: span.events,\n children: span.children.map(freezeSpan),\n});\n\nexport interface BuildSpanTreeOptions {\n /**\n * If provided, caps how many *non-boundary* events (status updates, partial blocks, etc.)\n * are retained — only the most recent `eventLimit` of them survive. Span boundary events\n * (`OperationStart` / `OperationEnd` / `AgentRequestBegin` / `AgentRequestEnd`) are *always*\n * retained regardless of the limit, because dropping them would orphan their child spans\n * and collapse them onto the root branch.\n */\n eventLimit?: number;\n}\n\n/**\n * Builds a hierarchical span tree from a list of trace messages.\n *\n * Algorithm:\n * 1. Flatten messages into events and sort them chronologically.\n * 2. For each event:\n * - Begin events (`OperationStart`, `AgentRequestBegin`) open a new span whose parent\n * is the currently-open span of the event's `meta.parentPid`, or the root if there is\n * none. The begin event itself becomes the first event of the new span.\n * - End events (`OperationEnd`, `AgentRequestEnd`) close the currently-open span for\n * the event's `meta.pid` and become its last event.\n * - Other events attach to the currently-open span for their `meta.pid`, or to the\n * root span if no span is currently open for that pid (or the event has no pid).\n * 3. Sort each span's children by their earliest event timestamp.\n */\nexport const buildSpanTree = (messages: readonly Trace.Message[], options: BuildSpanTreeOptions = {}): Span => {\n const allEvents = messages.flatMap((message) => Trace.flatten(message));\n allEvents.sort((a, b) => a.timestamp - b.timestamp);\n\n // The limit caps verbose middle events (status/partial-block) only. Span boundary events\n // are always retained so the parent/child structure of older spans isn't dropped — losing a\n // begin event detaches every descendant and collapses them onto the root branch.\n const events = applyEventLimit(allEvents, options.eventLimit);\n\n const root = makeMutableSpan(ROOT_SPAN_ID, {});\n\n // Currently-open span for each pid.\n // A process may host multiple sequential spans (e.g. successive agent requests), so we\n // track the active one and start a new span on the next begin event.\n const openSpans = new Map<string, MutableSpan>();\n\n // Most-recent span for each pid, open OR already closed. Used as the parent fallback for a\n // child process whose parent span has already ended — e.g. a delegated sub-agent runs\n // concurrently and its begin event arrives after the supervisor's turn (its parent) closed.\n // Without this the child would nest at the root and render on its own top-level lane, reusing\n // a sibling's released lane instead of forking off its parent.\n const lastSpanByPid = new Map<string, MutableSpan>();\n\n let spanCounter = 0;\n const allocSpanId = (pid: string): string => {\n const id = `${pid}#${spanCounter}`;\n spanCounter += 1;\n return id;\n };\n\n const noteTimestamp = (span: MutableSpan, timestamp: number): void => {\n if (timestamp < span.firstTimestamp) {\n span.firstTimestamp = timestamp;\n }\n };\n\n for (const event of events) {\n const pid = event.meta.pid;\n\n if (!pid) {\n // Events without a pid attach to the root.\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n continue;\n }\n\n if (BEGIN_EVENT_TYPES.has(event.type)) {\n const parentPid = event.meta.parentPid;\n // Prefer the parent's currently-open span; fall back to its most-recent (closed) span so a\n // child process whose parent has already ended still nests under it (delegated sub-agents).\n const parent = (parentPid && (openSpans.get(parentPid) ?? lastSpanByPid.get(parentPid))) || root;\n const span = makeMutableSpan(allocSpanId(pid), computeMeta(event.meta));\n span.events.push(event);\n noteTimestamp(span, event.timestamp);\n parent.children.push(span);\n // The new span supersedes any previously-open span for this pid.\n openSpans.set(pid, span);\n lastSpanByPid.set(pid, span);\n continue;\n }\n\n if (END_EVENT_TYPES.has(event.type)) {\n const span = openSpans.get(pid);\n if (span) {\n span.events.push(event);\n noteTimestamp(span, event.timestamp);\n openSpans.delete(pid);\n } else {\n // End event without a matching begin — attach to root so the event isn't lost.\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n }\n continue;\n }\n\n // Non-boundary event: attach to the currently-open span for this pid if any.\n const open = openSpans.get(pid);\n if (open) {\n open.events.push(event);\n noteTimestamp(open, event.timestamp);\n } else {\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n }\n }\n\n // Sort children chronologically for deterministic output.\n const sortChildren = (span: MutableSpan): void => {\n span.children.sort((a, b) => a.firstTimestamp - b.firstTimestamp);\n for (const child of span.children) {\n sortChildren(child);\n }\n };\n sortChildren(root);\n\n return freezeSpan(root);\n};\n\n/**\n * Caps the number of non-boundary events while retaining every span boundary event.\n *\n * Boundary events define the span tree's structure: dropping a begin event detaches every\n * descendant span (its `parentPid` lookup fails, so children fall back to the root), and\n * dropping an end event leaves a span open and corrupts the open-span map for sibling spans\n * that share a pid. Status/partial-block events are the noisy bulk and the only ones the\n * limit needs to control.\n *\n * The returned array stays in chronological order.\n */\nconst applyEventLimit = (events: readonly Trace.FlatEvent[], eventLimit: number | undefined): Trace.FlatEvent[] => {\n if (eventLimit === undefined) {\n return [...events];\n }\n\n let nonBoundaryCount = 0;\n for (const event of events) {\n if (!isBoundary(event)) {\n nonBoundaryCount += 1;\n }\n }\n if (nonBoundaryCount <= eventLimit) {\n return [...events];\n }\n\n const dropCount = nonBoundaryCount - eventLimit;\n let dropped = 0;\n const result: Trace.FlatEvent[] = [];\n for (const event of events) {\n if (!isBoundary(event) && dropped < dropCount) {\n dropped += 1;\n continue;\n }\n result.push(event);\n }\n return result;\n};\n\nconst isBoundary = (event: Trace.FlatEvent): boolean =>\n BEGIN_EVENT_TYPES.has(event.type) || END_EVENT_TYPES.has(event.type);\n\n/**\n * Walks the span tree in depth-first pre-order, invoking `visit` for each span (root included).\n */\nexport const walkSpanTree = (root: Span, visit: (span: Span, depth: number) => void, depth = 0): void => {\n visit(root, depth);\n for (const child of root.children) {\n walkSpanTree(child, visit, depth + 1);\n }\n};\n\n/**\n * Returns all spans in the tree in depth-first pre-order, root first.\n */\nexport const flattenSpanTree = (root: Span): Span[] => {\n const result: Span[] = [];\n walkSpanTree(root, (span) => result.push(span));\n return result;\n};\n"],
5
- "mappings": "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",
6
- "names": ["Array", "Either", "pipe", "Pipeable", "Schema", "Struct", "AgentRequestBegin", "AgentRequestEnd", "CompleteBlock", "Process", "Trace", "AGENT_PROCESS_KEY", "LogLevel", "log", "AgentRequestBegin", "AgentRequestEnd", "Trace", "ROOT_SPAN_ID", "BEGIN_EVENT_TYPES", "Set", "OperationStart", "key", "END_EVENT_TYPES", "OperationEnd", "isSpanBeginEvent", "event", "has", "type", "isSpanEndEvent", "computeMeta", "rawMeta", "pid", "parentPid", "processName", "conversationId", "triggerId", "toolCallId", "runtimeName", "makeMutableSpan", "id", "meta", "events", "children", "firstTimestamp", "Number", "POSITIVE_INFINITY", "freezeSpan", "span", "map", "buildSpanTree", "messages", "options", "allEvents", "flatMap", "message", "flatten", "sort", "a", "b", "timestamp", "applyEventLimit", "eventLimit", "root", "openSpans", "Map", "lastSpanByPid", "spanCounter", "allocSpanId", "noteTimestamp", "push", "parent", "get", "set", "delete", "open", "sortChildren", "child", "undefined", "nonBoundaryCount", "isBoundary", "dropCount", "dropped", "result", "walkSpanTree", "visit", "depth", "flattenSpanTree", "agentRequestBegin", "LogLevel", "agentRequestEndSuccess", "agentRequestEndError", "ERROR", "agentRequestEndInterrupted", "userMessage", "statusMessage", "operationStart", "operationEndSuccess", "INFO", "operationEndError", "toolCall", "level", "toolResultSuccess", "toolResultError", "agentRequestRunning", "VERBOSE", "processRunning", "eventLimit", "log", "traceMessages", "commits", "length", "branches", "built", "activeProcesses", "spanTree", "Map", "message", "messages", "event", "CompleteBlock", "block", "_tag", "resultByCallId", "toolCallId", "Either", "validated", "right", "AgentRequestEnd", "status", "undefined", "presentAgentRequestEnd", "data", "isLeft", "Schema", "AgentRequestBegin", "type", "Trace", "endData", "isOfType", "role", "ICONS", "trimText", "idSuffix", "success", "icon", "name", "key", "span", "events", "children", "firstEvent", "isSpanBeginEvent", "parent", "details", "builder", "addBranch", "MAIN_BRANCH", "indexParents", "child", "set", "CommitSelector", "branch", "ownBranch", "branchOf", "firstOf", "stream", "walkSpanTree", "forEach", "eventIndex", "globalIndex", "beginCommitIdBySpan", "presentEvent", "presentation", "parentSpan", "findParentSpan", "collapsible", "isCollapsibleSpan", "isBeginEvent", "spanHasMiddle", "isProcessBoundary", "ownPid", "parents", "isEndEvent", "commitId", "formatCommitId", "id", "timestamp", "addCommit", "commit", "process", "computeParents", "Date", "state", "base", "text", "slice", "make", "select", "args", "identity", "selected", "next", "includes", "GraphBuilder", "findCommits", "selector", "hasBranch", "push", "build"]
3
+ "sources": ["../../../../src/execution-graph/execution-graph.ts", "../../../../src/execution-graph/span-tree.ts", "../../../../src/execution-graph/pending-block-status.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Either from 'effect/Either';\nimport { pipe } from 'effect/Function';\nimport * as Option from 'effect/Option';\nimport * as Pipeable from 'effect/Pipeable';\nimport * as Schema from 'effect/Schema';\nimport * as Struct from 'effect/Struct';\n\nimport { AgentRequestBegin, AgentRequestEnd, CompleteBlock } from '@dxos/assistant';\nimport { Process, Trace } from '@dxos/compute';\nimport { Annotation } from '@dxos/echo';\nimport { AGENT_PROCESS_KEY } from '@dxos/functions-runtime';\nimport { EID } from '@dxos/keys';\nimport { LogLevel, log } from '@dxos/log';\nimport { type Commit } from '@dxos/react-ui-components';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { ROOT_SPAN_ID, type Span, buildSpanTree, isSpanBeginEvent, isSpanEndEvent, walkSpanTree } from './span-tree';\n\n/**\n * Branch name for top-level operation invocations.\n */\nconst MAIN_BRANCH = 'main';\n\n/** Timeline tag that applies a shimmer message effect. */\nconst SHIMMER_EFFECT_TAG = 'effect:shimmer';\n\nconst ICONS = {\n agentRequestBegin: {\n icon: 'ph--atom--regular',\n level: LogLevel.VERBOSE,\n },\n agentRequestEndSuccess: {\n icon: 'ph--atom--regular',\n level: LogLevel.INFO,\n },\n agentRequestEndError: {\n icon: 'ph--atom--regular',\n level: LogLevel.ERROR,\n },\n agentRequestEndInterrupted: {\n icon: 'ph--atom--regular',\n level: LogLevel.WARN,\n },\n userMessage: {\n icon: 'ph--user--regular',\n level: LogLevel.VERBOSE,\n },\n statusMessage: {\n icon: 'ph--info--regular',\n level: LogLevel.VERBOSE,\n },\n operationStart: {\n icon: 'ph--function--regular',\n level: LogLevel.VERBOSE,\n },\n operationEndSuccess: {\n icon: 'ph--function--regular',\n level: LogLevel.INFO,\n },\n operationEndError: {\n icon: 'ph--function--regular',\n level: LogLevel.ERROR,\n },\n toolCall: {\n icon: 'ph--wrench--regular',\n level: LogLevel.VERBOSE,\n },\n toolResultSuccess: {\n icon: 'ph--wrench--regular',\n level: LogLevel.INFO,\n },\n toolResultError: {\n icon: 'ph--wrench--regular',\n level: LogLevel.ERROR,\n },\n agentRequestRunning: {\n icon: 'ph--spinner-gap--regular',\n level: LogLevel.VERBOSE,\n },\n processRunning: {\n icon: 'ph--spinner-gap--regular',\n level: LogLevel.VERBOSE,\n },\n} as const;\n\nexport interface BuildExecutionGraphParams {\n traceMessages: readonly Trace.Message[];\n activeProcesses?: readonly Process.Info[];\n collapseCompletedSpans?: boolean;\n eventLimit?: number;\n}\n\n/**\n * Builds a Timeline-compatible execution graph from trace messages and active processes.\n *\n * The conversion runs in two stages:\n * 1. `buildSpanTree` converts the flat list of trace messages into a hierarchical\n * tree of spans grouped by process id (pid). See `./span-tree.ts`.\n * 2. `spanTreeToCommits` walks the tree and emits one commit per event, using the\n * tree structure to decide which branch each commit belongs to and how to wire parents.\n *\n * Pure function — no signals or atoms.\n */\nexport type ExecutionGraph = {\n branches: string[];\n commits: Commit[];\n spanTree: Span;\n /** Commit id -> trace event. */\n details: ExecutionGraphDetailsMap;\n};\n\nexport type ExecutionGraphDetailsMap = Record<string, Trace.FlatEvent | undefined>;\n\nexport const buildExecutionGraph = ({\n traceMessages,\n activeProcesses = [],\n collapseCompletedSpans = false,\n eventLimit = 500,\n}: BuildExecutionGraphParams): ExecutionGraph => {\n const spanTree = buildSpanTree(traceMessages, { eventLimit });\n const toolCallContext = buildToolCallContext(traceMessages);\n const built = spanTreeToCommits(spanTree, activeProcesses, toolCallContext, collapseCompletedSpans);\n log('trace execution graph', {\n traceMessages: traceMessages.length,\n commits: built.commits.length,\n branches: built.branches.length,\n activeProcesses: activeProcesses.length,\n });\n return { ...built, spanTree };\n};\n\n/**\n * Lookup tables that pair `toolCall` blocks with their matching `toolResult` blocks so the\n * renderer can collapse the two events into a single commit (mirroring how begin/end events of\n * an empty operation span collapse). Indexed by the shared `toolCallId`.\n */\ninterface ToolCallContext {\n callById: Map<string, ContentBlock.ToolCall>;\n resultByCallId: Map<string, ContentBlock.ToolResult>;\n}\n\nconst buildToolCallContext = (messages: readonly Trace.Message[]): ToolCallContext => {\n const callById = new Map<string, ContentBlock.ToolCall>();\n const resultByCallId = new Map<string, ContentBlock.ToolResult>();\n for (const message of messages) {\n for (const event of message.events) {\n if (event.type !== CompleteBlock.key) {\n continue;\n }\n const data = event.data as { block?: ContentBlock.Any } | undefined;\n const block = data?.block;\n if (!block) {\n continue;\n }\n if (block._tag === 'toolCall') {\n callById.set(block.toolCallId, block);\n } else if (block._tag === 'toolResult') {\n resultByCallId.set(block.toolCallId, block);\n }\n }\n }\n return { callById, resultByCallId };\n};\n\n/**\n * Visual representation of a single trace event — icon, log level, message string.\n * `undefined` indicates that the event should not produce a commit.\n */\ninterface EventPresentation {\n icon: string;\n level: LogLevel;\n message: string;\n idSuffix?: string;\n}\n\ntype AgentRequestEndData = Schema.Schema.Type<typeof AgentRequestEnd.schema>;\n\n/**\n * Parses `AgentRequestEnd` payload, accepting legacy traces that omitted `status`.\n */\nconst parseAgentRequestEnd = (data: unknown): AgentRequestEndData | undefined => {\n const validated = Schema.validateEither(AgentRequestEnd.schema)(data);\n if (Either.isRight(validated)) {\n return validated.right;\n }\n // Traces emitted before `status` was added wrote an empty object.\n if (data != null && typeof data === 'object' && Object.keys(data).length === 0) {\n return { status: 'success' };\n }\n log('invalid trace event', { type: AgentRequestEnd.key });\n return undefined;\n};\n\nconst presentAgentRequestEnd = (data: AgentRequestEndData): EventPresentation => {\n switch (data.status) {\n case 'error':\n return {\n icon: ICONS.agentRequestEndError.icon,\n level: ICONS.agentRequestEndError.level,\n message: data.error ? trimText(`Agent request failed: ${data.error}`) : 'Agent request failed',\n };\n case 'interrupted':\n return {\n icon: ICONS.agentRequestEndInterrupted.icon,\n level: ICONS.agentRequestEndInterrupted.level,\n message: 'Agent request interrupted',\n };\n default:\n return {\n icon: ICONS.agentRequestEndSuccess.icon,\n level: ICONS.agentRequestEndSuccess.level,\n message: 'Agent completed request',\n };\n }\n};\n\nconst presentEvent = (event: Trace.FlatEvent, toolCallContext: ToolCallContext): EventPresentation | undefined => {\n if (Trace.isOfType(AgentRequestBegin, event)) {\n if (Either.isLeft(Schema.validateEither(AgentRequestBegin.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n return {\n icon: ICONS.agentRequestBegin.icon,\n level: ICONS.agentRequestBegin.level,\n message: 'Agent processing request...',\n };\n }\n if (Trace.isOfType(AgentRequestEnd, event)) {\n const endData = parseAgentRequestEnd(event.data);\n if (!endData) {\n return undefined;\n }\n return presentAgentRequestEnd(endData);\n }\n if (Trace.isOfType(CompleteBlock, event)) {\n if (Either.isLeft(Schema.validateEither(CompleteBlock.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n switch (event.data.block._tag) {\n case 'text':\n return event.data.role === 'user'\n ? {\n icon: ICONS.userMessage.icon,\n level: ICONS.userMessage.level,\n message: trimText(event.data.block.text),\n }\n : undefined;\n case 'status':\n return {\n icon: ICONS.statusMessage.icon,\n level: ICONS.statusMessage.level,\n message: trimText(event.data.block.statusText),\n };\n case 'toolCall': {\n // Operation-backed tool calls already have a dedicated routine span (Trace.OperationStart /\n // Trace.OperationEnd) that produces its own commits — skip the duplicate toolCall commit\n // to avoid double-rendering.\n if (event.data.block.operationKey) {\n return undefined;\n }\n // Collapse the toolCall/toolResult pair: when the matching toolResult has arrived, the\n // result event is the visible commit and carries the success/error state. The toolCall\n // itself only renders while still pending (i.e. no result yet) — same intent as an\n // operation span that collapses to a single end commit once both boundaries are present.\n if (toolCallContext.resultByCallId.has(event.data.block.toolCallId)) {\n return undefined;\n }\n return {\n icon: ICONS.toolCall.icon,\n level: ICONS.toolCall.level,\n message: event.data.block.name,\n idSuffix: `toolCall:${event.data.block.toolCallId}`,\n };\n }\n case 'toolResult': {\n // Suppress results for operation-backed calls — those are covered by the routine span.\n const call = toolCallContext.callById.get(event.data.block.toolCallId);\n if (call?.operationKey) {\n return undefined;\n }\n const success = event.data.block.error === undefined;\n const name = call?.name ?? event.data.block.name;\n return {\n icon: success ? ICONS.toolResultSuccess.icon : ICONS.toolResultError.icon,\n level: success ? ICONS.toolResultSuccess.level : ICONS.toolResultError.level,\n message: `${name}${!success ? ' - Error' : ''}`,\n idSuffix: `toolResult:${event.data.block.toolCallId}`,\n };\n }\n default:\n return undefined;\n }\n }\n if (Trace.isOfType(Trace.OperationStart, event)) {\n if (Either.isLeft(Schema.validateEither(Trace.OperationStart.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n return {\n icon: event.data.icon ?? ICONS.operationStart.icon,\n level: ICONS.operationStart.level,\n message: event.data.name ?? event.data.key,\n idSuffix: `${event.data.key}:start`,\n };\n }\n if (Trace.isOfType(Trace.OperationEnd, event)) {\n if (Either.isLeft(Schema.validateEither(Trace.OperationEnd.schema)(event.data))) {\n log('invalid trace event', { type: event.type });\n return undefined;\n }\n const success = event.data.outcome === 'success';\n return {\n icon: event.data.icon ?? (success ? ICONS.operationEndSuccess.icon : ICONS.operationEndError.icon),\n level: success ? ICONS.operationEndSuccess.level : ICONS.operationEndError.level,\n message: `${event.data.name ?? event.data.key}${!success ? ' - Error' : ''}`,\n idSuffix: `${event.data.key}:end`,\n };\n }\n return undefined;\n};\n\nexport type CollectProcessActivityOptions = {\n /**\n * When set, messages with a `conversationId` that disagrees are excluded.\n * Messages without `conversationId` still match when their pid is in the subtree.\n */\n conversationId?: string;\n eventLimit?: number;\n};\n\n/**\n * Collects human-readable activity lines for a process subtree (root pid and descendants).\n * Used to surface live sub-agent status in the task list.\n */\nexport const collectProcessActivityLines = (\n messages: readonly Trace.Message[],\n rootPid: string,\n options: CollectProcessActivityOptions = {},\n): string[] => {\n const { conversationId, eventLimit = 50 } = options;\n const descendantPids = collectDescendantPids(messages, rootPid);\n const filtered = messages.filter((message) => {\n const pid = message.meta.pid;\n if (!pid || !descendantPids.has(pid)) {\n return false;\n }\n const metaConvId = message.meta.conversation\n ? EID.getEntityId(EID.parse(message.meta.conversation.uri))\n : undefined;\n if (conversationId && metaConvId !== undefined && metaConvId !== conversationId) {\n return false;\n }\n return true;\n });\n\n const events = filtered\n .flatMap((message) => Trace.flatten(message))\n .sort((left, right) => left.timestamp - right.timestamp)\n .slice(-eventLimit);\n\n const toolCallContext = buildToolCallContext(filtered);\n const lines: string[] = [];\n for (const event of events) {\n const presentation = presentEvent(event, toolCallContext);\n if (presentation) {\n lines.push(presentation.message);\n }\n }\n return lines;\n};\n\n/**\n * Derives a single in-flight status line from durable trace when ephemeral subscription\n * is unavailable (e.g. between partial blocks or while a child operation is running).\n */\nexport const deriveInFlightActivityLine = (\n messages: readonly Trace.Message[],\n rootPid: string,\n options: CollectProcessActivityOptions = {},\n): string | undefined => {\n const { conversationId, eventLimit = 50 } = options;\n const descendantPids = collectDescendantPids(messages, rootPid);\n const filtered = messages.filter((message) => {\n const pid = message.meta.pid;\n if (!pid || !descendantPids.has(pid)) {\n return false;\n }\n const metaConvId = message.meta.conversation\n ? EID.getEntityId(EID.parse(message.meta.conversation.uri))\n : undefined;\n if (conversationId && metaConvId !== undefined && metaConvId !== conversationId) {\n return false;\n }\n return true;\n });\n\n const events = filtered\n .flatMap((message) => Trace.flatten(message))\n .sort((left, right) => left.timestamp - right.timestamp)\n .slice(-eventLimit);\n\n const openOperations = new Map<string, { name: string; timestamp: number }>();\n let agentRequestOpen = false;\n let lastLine: string | undefined;\n\n for (const event of events) {\n const pid = event.meta.pid ?? rootPid;\n if (Trace.isOfType(Trace.OperationStart, event)) {\n const key = `${pid}:${event.data.key}`;\n const name = event.data.name ?? event.data.key;\n openOperations.set(key, { name, timestamp: event.timestamp });\n lastLine = `${name}...`;\n continue;\n }\n if (Trace.isOfType(Trace.OperationEnd, event)) {\n openOperations.delete(`${pid}:${event.data.key}`);\n continue;\n }\n if (Trace.isOfType(AgentRequestBegin, event)) {\n agentRequestOpen = true;\n lastLine = 'Generating...';\n continue;\n }\n if (Trace.isOfType(AgentRequestEnd, event)) {\n agentRequestOpen = false;\n }\n }\n\n if (agentRequestOpen) {\n return 'Generating...';\n }\n\n const latestOperation = [...openOperations.values()].sort((left, right) => right.timestamp - left.timestamp)[0];\n if (latestOperation) {\n return `${latestOperation.name}...`;\n }\n\n return lastLine;\n};\n\nconst collectDescendantPids = (messages: readonly Trace.Message[], rootPid: string): Set<string> => {\n const pids = new Set([rootPid]);\n let expanded = true;\n while (expanded) {\n expanded = false;\n for (const message of messages) {\n const pid = message.meta.pid;\n const parentPid = message.meta.parentPid;\n if (pid && parentPid && pids.has(parentPid) && !pids.has(pid)) {\n pids.add(pid);\n expanded = true;\n }\n }\n }\n return pids;\n};\n\nconst isPendingToolCallEvent = (event: Trace.FlatEvent, toolCallContext: ToolCallContext): boolean => {\n if (!Trace.isOfType(CompleteBlock, event)) {\n return false;\n }\n if (event.data.block._tag !== 'toolCall') {\n return false;\n }\n return !toolCallContext.resultByCallId.has(event.data.block.toolCallId);\n};\n\n/**\n * Marks commits that represent work still in flight for Timeline shimmer styling.\n */\nconst shouldShimmerInProgressCommit = (event: Trace.FlatEvent, toolCallContext: ToolCallContext): boolean =>\n isPendingToolCallEvent(event, toolCallContext);\n\n/**\n * A span is completed when its last recorded event is a matching end boundary.\n */\nconst isCompletedSpan = (span: Span): boolean => {\n if (span.id === ROOT_SPAN_ID) {\n return false;\n }\n const lastEvent = span.events[span.events.length - 1];\n return lastEvent !== undefined && isSpanEndEvent(lastEvent);\n};\n\n/**\n * A span is \"collapsible\" when it would otherwise render as an empty fork-and-merge:\n * exactly two events that form a begin/end pair and no child sub-spans. In that case\n * we emit a single commit for the end event on the parent branch.\n *\n * When `collapseCompletedSpans` is enabled, any completed span collapses to that single\n * end commit — middle events, child sub-spans, and the begin fork are all omitted.\n *\n * A *pending* span (one whose end event has not yet been recorded) is never collapsed:\n * its trailing events should keep rendering as middle commits on the span's own branch\n * — never as a fake \"end\" commit on the parent branch.\n *\n * Both nested spans and top-level spans (whose parent is the synthetic root) are eligible\n * once they have completed: a span with no inner activity is collapsed regardless of where\n * it sits in the tree.\n */\nconst isCollapsibleSpan = (span: Span, parent: Span | null, collapseCompletedSpans: boolean): boolean => {\n if (span.id === ROOT_SPAN_ID) {\n return false;\n }\n if (parent === null) {\n return false;\n }\n if (span.events.length === 2 && span.children.length === 0) {\n const firstEvent = span.events[0];\n const lastEvent = span.events[span.events.length - 1];\n if (isSpanBeginEvent(firstEvent) && isSpanEndEvent(lastEvent)) {\n return true;\n }\n }\n if (collapseCompletedSpans && isCompletedSpan(span)) {\n return true;\n }\n return false;\n};\n\n/**\n * Converts a span tree into a flat list of commits + branches suitable for `Timeline` rendering.\n *\n * For every span the algorithm:\n * - emits the **first** event as a \"begin\" commit on the parent span's branch (fork);\n * - emits **middle** events as commits on the span's own branch;\n * - emits the **last** event as an \"end\" commit on the parent span's branch with two parents\n * (the begin commit and the last commit on the span's own branch — a merge).\n *\n * Collapsible spans (`isCollapsibleSpan`) emit only the end commit on the parent branch with\n * a single parent — a tidier rendering for sub-operations that have no inner detail.\n *\n * Events are processed in categorical span-tree order: each span's begin events, its child\n * subtrees (depth-first), then its remaining events. Active-process running rows are inserted\n * at the end of each matching span block — not appended after the entire tree.\n */\nconst spanTreeToCommits = (\n root: Span,\n activeProcesses: readonly Process.Info[],\n toolCallContext: ToolCallContext,\n collapseCompletedSpans: boolean,\n): { branches: string[]; commits: Commit[]; details: ExecutionGraphDetailsMap } => {\n const builder = new GraphBuilder();\n const details: ExecutionGraphDetailsMap = {};\n builder.addBranch(MAIN_BRANCH);\n\n // Build a child → parent lookup using the tree's own structure (already correctly parented\n // when the tree was constructed, including sequential spans of the same process).\n const parentBySpan = new Map<Span, Span | null>();\n parentBySpan.set(root, null);\n const indexParents = (span: Span): void => {\n for (const child of span.children) {\n parentBySpan.set(child, span);\n indexParents(child);\n }\n };\n indexParents(root);\n\n const findParentSpan = (span: Span): Span | null => parentBySpan.get(span) ?? null;\n\n const collapsedSpanIds = new Set<string>();\n walkSpanTree(root, (span) => {\n if (isCollapsibleSpan(span, findParentSpan(span), collapseCompletedSpans)) {\n collapsedSpanIds.add(span.id);\n }\n });\n\n const isUnderCollapsedAncestor = (span: Span): boolean => {\n let ancestor = findParentSpan(span);\n while (ancestor) {\n if (collapsedSpanIds.has(ancestor.id)) {\n return true;\n }\n ancestor = findParentSpan(ancestor);\n }\n return false;\n };\n\n // The branch name for a span is its pid — multiple sequential spans of the same process\n // (e.g. successive agent requests in one session) share a branch so they reuse a single lane.\n const branchOf = (span: Span | null): string => {\n if (!span || span.id === ROOT_SPAN_ID) {\n return MAIN_BRANCH;\n }\n return span.meta.pid ?? span.id;\n };\n\n // Track the id of the begin commit for each non-collapsible span so the end commit can merge into it.\n const beginCommitIdBySpan = new Map<string, string>();\n\n // Selector that returns \"the most recent commit in this span's structural context\".\n //\n // The walk is structural (pid/parentPid), not topological: at each ancestor, we prefer\n // 1) the last commit on that span's own branch, then\n // 2) that span's begin commit (the fork point on its parent branch),\n // 3) and only then recurse into the parent span.\n //\n // Crucially, we never silently slip onto a *sibling* span's commit on a shared ancestor\n // branch. E.g. if a sub-span of agent A fires before A has any middle commits, we anchor\n // to A.begin — not to whatever unrelated commit happens to be the latest on main.\n // This keeps fork edges visually attached to the correct span even when sibling top-level\n // spans (different pids) overlap in time on main.\n const lastInSpanContext = (span: Span | null): CommitSelector => {\n if (!span || span.id === ROOT_SPAN_ID) {\n return CommitSelector.branch(MAIN_BRANCH).pipe(CommitSelector.compose(CommitSelector.last()));\n }\n const ownBranch = branchOf(span);\n const beginId = beginCommitIdBySpan.get(span.id);\n return CommitSelector.firstOf(\n CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last())),\n beginId ? CommitSelector.id(beginId) : CommitSelector.filter(() => false),\n lastInSpanContext(findParentSpan(span)),\n );\n };\n\n const lastCommitIdBySpan = new Map<string, string>();\n let globalIndex = 0;\n const insertedRunningPids = new Set<string>();\n const activeProcessByPid = new Map(activeProcesses.map((process) => [process.pid, process]));\n\n const emitRunningIndicator = (pid: Process.ID): void => {\n if (insertedRunningPids.has(pid)) {\n return;\n }\n\n const process = activeProcessByPid.get(pid);\n if (!process) {\n return;\n }\n\n if (\n process.key === AGENT_PROCESS_KEY &&\n Option.isSome(Annotation.getDictionary(process.params.annotations, Process.TargetAnnotation)) &&\n (process.state === Process.State.RUNNING || process.state === Process.State.HYBERNATING)\n ) {\n builder.addCommit({\n id: `running:${process.pid}`,\n branch: process.pid,\n parents: builder.computeParents(\n CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n icon: ICONS.agentRequestRunning.icon,\n level: ICONS.agentRequestRunning.level,\n message: 'Generating...',\n timestamp: new Date(),\n tags: [SHIMMER_EFFECT_TAG],\n });\n insertedRunningPids.add(pid);\n } else if (process.state === Process.State.RUNNING && builder.hasBranch(process.pid)) {\n builder.addCommit({\n id: `running:${process.pid}`,\n branch: process.pid,\n parents: builder.computeParents(\n CommitSelector.branch(process.pid).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n icon: ICONS.processRunning.icon,\n level: ICONS.processRunning.level,\n message: 'Running...',\n timestamp: new Date(),\n tags: [SHIMMER_EFFECT_TAG],\n });\n insertedRunningPids.add(pid);\n }\n };\n\n const emitEventCommit = (span: Span, event: Trace.FlatEvent, eventIndex: number): void => {\n const presentation = presentEvent(event, toolCallContext);\n if (!presentation) {\n return;\n }\n\n // Classify based on event TYPE, not array index. A pending span's trailing\n // middle event (e.g. a user message awaiting an agent response) must not be\n // mistaken for the span's end event — otherwise it would render on the\n // parent branch instead of the span's own branch.\n const isBeginEvent = isSpanBeginEvent(event);\n const isEndEvent = isSpanEndEvent(event);\n const parentSpan = findParentSpan(span);\n const collapsible = isCollapsibleSpan(span, parentSpan, collapseCompletedSpans);\n\n // Descendants of a collapsed span emit no commits — inner activity is folded into the ancestor end row.\n if (isUnderCollapsedAncestor(span)) {\n return;\n }\n\n // Collapsed spans: skip every event except the end commit.\n if (collapsible && !isEndEvent) {\n return;\n }\n\n const parentBranch = branchOf(parentSpan);\n const ownBranch = branchOf(span);\n\n // A \"process boundary\" span is a concurrent child PROCESS (its own pid, differing from the\n // parent's) with real sub-flow content (a middle event) — e.g. a delegated sub-agent. Such a\n // span gets its own lane: it forks onto its own branch at begin and collapses back to main at\n // end (so neither its lane nor its parent's lane dangles). A bare operation (begin+end only)\n // collapses to a single commit and is NOT treated as a boundary — forking its transient begin\n // mid-stream would flash a throwaway lane.\n const ownPid = span.meta.pid;\n const parentPid = parentSpan?.meta.pid;\n const spanHasMiddle = span.events.some((spanEvent) => !isSpanBeginEvent(spanEvent) && !isSpanEndEvent(spanEvent));\n const isProcessBoundary = ownPid != null && parentPid != null && ownPid !== parentPid && spanHasMiddle;\n\n let branch: string;\n let parents: string[];\n\n if (span.id === ROOT_SPAN_ID) {\n // Root-level events (no pid) attach sequentially to main.\n branch = MAIN_BRANCH;\n parents = builder.computeParents(lastInSpanContext(null));\n } else if (collapsible) {\n // Only the end event reaches here for collapsible spans.\n // Anchor to the parent span's structural context so the fork attaches to the parent\n // — not to a sibling span's commit that happens to be the latest on the shared ancestor.\n branch = parentBranch;\n parents = builder.computeParents(lastInSpanContext(parentSpan));\n } else if (isBeginEvent) {\n // Begin commit, anchored to the parent's structural context. A nested sub-span stays on the\n // parent lane (only its middle events fork). A concurrent child process forks onto its own\n // branch from this first event so it gets its own lane immediately.\n branch = isProcessBoundary ? ownBranch : parentBranch;\n parents = builder.computeParents(lastInSpanContext(parentSpan));\n } else if (isEndEvent) {\n // End commit: continues the parent branch chronologically and merges in own-branch work.\n //\n // Parent #1 is the *immediate predecessor* on the parent branch (not the matching begin\n // commit). Pointing back to the begin commit creates a visual edge that skips over any\n // sibling span's commits emitted between begin and end — e.g. when two top-level Routine\n // spans overlap on main, R1.end would otherwise draw an arrow back to R1.begin that\n // crosses over R2.begin. Anchoring to the previous main commit keeps main linear.\n //\n // A concurrent child process collapses all the way back to MAIN (merging its own branch),\n // rather than to its parent's branch: the parent (e.g. a supervisor whose turn already merged\n // to main) would otherwise gain commits after its own merge and never re-collapse — leaving a\n // dangling lane after the child finishes.\n branch = isProcessBoundary ? MAIN_BRANCH : parentBranch;\n parents = builder.computeParents(\n CommitSelector.unionAll(\n CommitSelector.branch(branch).pipe(CommitSelector.compose(CommitSelector.last())),\n CommitSelector.branch(ownBranch).pipe(CommitSelector.compose(CommitSelector.last())),\n ),\n );\n } else {\n // Middle event: continue the span's own branch; fall back to span's own context so the\n // first middle event of a span forks from the span's begin commit, not from a sibling's\n // commit on an ancestor branch.\n branch = ownBranch;\n parents = builder.computeParents(lastInSpanContext(span));\n }\n\n const commitIndex = globalIndex++;\n const commitId = formatCommitId(span, commitIndex, presentation.idSuffix);\n const shimmer = shouldShimmerInProgressCommit(event, toolCallContext);\n const commit: Commit = {\n id: commitId,\n branch,\n parents,\n timestamp: new Date(event.timestamp),\n icon: presentation.icon,\n level: presentation.level,\n message: presentation.message,\n ...(shimmer && { tags: [SHIMMER_EFFECT_TAG] }),\n };\n builder.addCommit(commit);\n details[commitId] = event;\n lastCommitIdBySpan.set(span.id, commitId);\n\n // Record begin commit so a later end event can merge into it.\n if (isBeginEvent && !collapsible && span.id !== ROOT_SPAN_ID) {\n beginCommitIdBySpan.set(span.id, commitId);\n }\n };\n\n const finishSpan = (span: Span): void => {\n const pid = span.meta.pid;\n if (pid) {\n // Trace.Meta.pid is plain string (avoids circular dep); construct brand here.\n emitRunningIndicator(Process.ID.make(pid));\n }\n\n if (span.id === ROOT_SPAN_ID || isCompletedSpan(span)) {\n return;\n }\n\n if (pid && insertedRunningPids.has(pid)) {\n return;\n }\n\n const lastCommitId = lastCommitIdBySpan.get(span.id);\n if (lastCommitId) {\n builder.addTag(lastCommitId, SHIMMER_EFFECT_TAG);\n }\n };\n\n const emitSpanCommits = (span: Span): void => {\n for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {\n const event = span.events[eventIndex]!;\n if (isSpanBeginEvent(event)) {\n emitEventCommit(span, event, eventIndex);\n }\n }\n\n for (const child of span.children) {\n emitSpanCommits(child);\n }\n\n for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {\n const event = span.events[eventIndex]!;\n if (!isSpanBeginEvent(event)) {\n emitEventCommit(span, event, eventIndex);\n }\n }\n\n finishSpan(span);\n };\n\n emitSpanCommits(root);\n\n for (const process of activeProcesses) {\n emitRunningIndicator(process.pid);\n }\n\n const { commits, branches } = builder.build();\n return { commits, branches, details };\n};\n\nconst formatCommitId = (span: Span, globalIndex: number, suffix?: string): string => {\n const base = `${span.id}:${globalIndex}`;\n return suffix ? `${base}:${suffix}` : base;\n};\n\nconst trimText = (text: string) => text.slice(0, 100).trim().split('\\n')[0];\n\ntype Falsy = false | null | undefined;\n\nexport interface CommitSelector extends Pipeable.Pipeable {\n select: (commits: Commit[]) => Commit[];\n}\n\nexport const CommitSelector = {\n make: (select: CommitSelector['select']): CommitSelector => ({\n select,\n pipe(...args: any) {\n return Pipeable.pipeArguments(this, args);\n },\n }),\n\n identity: (): CommitSelector => CommitSelector.make((commits) => commits),\n\n /**\n * Selects commits that match the given predicate.\n */\n filter: (predicate: (commit: Commit) => unknown): CommitSelector =>\n CommitSelector.make((commits) => commits.filter(predicate)),\n\n /**\n * Selects commits by id.\n */\n id: (id: string): CommitSelector => CommitSelector.filter((commit) => commit.id === id),\n /**\n * Selects commits by tag.\n */\n tag: (tag: string | Falsy): CommitSelector => CommitSelector.filter((commit) => tag && commit.tags?.includes(tag)),\n /**\n * Selects commits by if any of the given tags are present.\n */\n anyTags: (tags: (string | Falsy)[]): CommitSelector =>\n CommitSelector.filter((commit) => tags.some((tag) => tag && commit.tags?.includes(tag))),\n /**\n * Selects commits by branch.\n */\n branch: (branch: string | Falsy): CommitSelector =>\n CommitSelector.filter((commit) => branch && commit.branch === branch),\n\n /**\n * Chains two selectors together, applying the second selector to the result of the first.\n *\n * Example:\n *\n * ```\n * CommitSelector.tag('tag').pipe(CommitSelector.compose(CommitSelector.branch('main')));\n * ```\n */\n compose:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => next.select(prev.select(commits))),\n\n /**\n * If `prev` selector matches no commits, return `next` selector, otherwise return `prev` selector.\n * Same as `CommitSelector.firstOf(prev, next)`.\n *\n * Example:\n *\n * ```\n * CommitSelector.tag('tag').pipe(CommitSelector.orElse(CommitSelector.branch('main')));\n * ```\n */\n orElse:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = prev.select(commits);\n if (selected.length > 0) {\n return selected;\n }\n return next.select(commits);\n }),\n\n /**\n * Selects commits that match either of the given selectors.\n */\n andAlso:\n (next: CommitSelector) =>\n (prev: CommitSelector): CommitSelector =>\n CommitSelector.unionAll(prev, next),\n\n /**\n * Selects the first n commits.\n */\n first: (n: number = 1): CommitSelector => CommitSelector.make((commits) => commits.slice(0, n)),\n /**\n * Selects the last n commits (reverses the order of the commits).\n */\n last: (n: number = 1): CommitSelector => CommitSelector.make((commits) => commits.toReversed().slice(0, n)),\n /**\n * Selects commits that do not match the given selector.\n */\n not: (selector: CommitSelector): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = selector.select(commits);\n return commits.filter((commit) => !selected.includes(commit));\n }),\n\n /**\n * Selects commits that match any of the given selectors.\n */\n unionAll: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n return Array.dedupeWith(\n selectors.flatMap((selector) => selector.select(commits)),\n (a, b) => a.id === b.id,\n );\n }),\n\n /**\n * Selects commits that match all of the given selectors.\n */\n intersectAll: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n const selected = selectors.map((selector) => selector.select(commits));\n if (selected.length === 0) {\n return [];\n }\n return selected[0].filter((commit) => selected.every((selected) => selected.some((c) => c.id === commit.id)));\n }),\n\n /**\n * Returns the result of the first selector that matches any commits.\n */\n firstOf: (...selectors: CommitSelector[]): CommitSelector =>\n CommitSelector.make((commits) => {\n for (const selector of selectors) {\n const selected = selector.select(commits);\n if (selected.length > 0) {\n return selected;\n }\n }\n return [];\n }),\n};\n\nclass GraphBuilder {\n #commits: Commit[] = [];\n #branches = new Set<string>();\n\n findCommits(selector: CommitSelector): Commit[] {\n return selector.select(this.#commits);\n }\n\n hasBranch(branch: string): boolean {\n return this.#branches.has(branch);\n }\n\n addCommit(commit: Commit) {\n this.addBranch(commit.branch);\n this.#commits.push(commit);\n }\n\n addTag(commitId: string, tag: string) {\n const index = this.#commits.findIndex((commit) => commit.id === commitId);\n if (index < 0) {\n return;\n }\n const commit = this.#commits[index]!;\n if (commit.tags?.includes(tag)) {\n return;\n }\n this.#commits[index] = { ...commit, tags: [...(commit.tags ?? []), tag] };\n }\n\n /**\n * Computes parents — picks first matching commit's id.\n */\n computeParents(selector: CommitSelector): string[] {\n return Array.dedupe(selector.select(this.#commits).map((commit) => commit.id));\n }\n\n addBranch(branch: string) {\n this.#branches.add(branch);\n }\n\n /**\n * Removes duplicate commits and dangling parents.\n */\n doctor() {\n this.#commits = pipe(\n this.#commits,\n Array.dedupeWith((a, b) => a.id === b.id),\n Array.map(\n Struct.evolve({\n parents: (parents) =>\n parents ? Array.filter(parents, (id) => this.#commits.some((commit) => commit.id === id)) : undefined,\n }),\n ),\n );\n }\n\n build() {\n this.doctor();\n return {\n commits: this.#commits,\n branches: [...this.#branches],\n };\n }\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { AgentRequestBegin, AgentRequestEnd } from '@dxos/assistant';\nimport { Trace } from '@dxos/compute';\nimport { EID } from '@dxos/keys';\n\n/**\n * Synthetic id assigned to the root span.\n * The root is a virtual container for top-level spans (those without a parent in the captured trace).\n */\nexport const ROOT_SPAN_ID = '<main>';\n\n/**\n * Computed metadata for a span.\n * Derived from the meta of the begin event that opened the span.\n */\nexport interface SpanMeta {\n readonly pid?: string;\n readonly parentPid?: string;\n readonly processName?: string;\n readonly conversationId?: string;\n readonly triggerId?: string;\n readonly toolCallId?: string;\n readonly runtimeName?: string;\n}\n\n/**\n * A span in the trace hierarchy.\n *\n * Each span represents a single bounded unit of work — an operation invocation or an\n * agent request. Spans are opened by `OperationStart` / `AgentRequestBegin` events and\n * closed by their matching `OperationEnd` / `AgentRequestEnd` events. A single process\n * (pid) may produce multiple sequential spans (for example, an agent session that serves\n * three prompts produces three sibling spans sharing the agent's pid).\n *\n * `events` contains the bounded events for this span only — child spans' events are not\n * duplicated here. `children` contains sub-spans that opened while this span was active.\n */\nexport interface Span {\n readonly id: string;\n readonly meta: SpanMeta;\n readonly events: Trace.FlatEvent[];\n readonly children: Span[];\n}\n\nexport const BEGIN_EVENT_TYPES = new Set<string>([Trace.OperationStart.key, AgentRequestBegin.key]);\nexport const END_EVENT_TYPES = new Set<string>([Trace.OperationEnd.key, AgentRequestEnd.key]);\n\nexport const isSpanBeginEvent = (event: Trace.FlatEvent): boolean => BEGIN_EVENT_TYPES.has(event.type);\nexport const isSpanEndEvent = (event: Trace.FlatEvent): boolean => END_EVENT_TYPES.has(event.type);\n\nconst computeMeta = (rawMeta: Trace.Meta): SpanMeta => ({\n pid: rawMeta.pid,\n parentPid: rawMeta.parentPid,\n processName: rawMeta.processName,\n conversationId: rawMeta.conversation ? EID.getEntityId(EID.parse(rawMeta.conversation.uri)) : undefined,\n triggerId: rawMeta.trigger ? EID.getEntityId(EID.parse(rawMeta.trigger.uri)) : undefined,\n toolCallId: rawMeta.toolCallId,\n runtimeName: rawMeta.runtimeName,\n});\n\ninterface MutableSpan {\n id: string;\n meta: SpanMeta;\n events: Trace.FlatEvent[];\n children: MutableSpan[];\n firstTimestamp: number;\n}\n\nconst makeMutableSpan = (id: string, meta: SpanMeta): MutableSpan => ({\n id,\n meta,\n events: [],\n children: [],\n firstTimestamp: Number.POSITIVE_INFINITY,\n});\n\nconst freezeSpan = (span: MutableSpan): Span => ({\n id: span.id,\n meta: span.meta,\n events: span.events,\n children: span.children.map(freezeSpan),\n});\n\nexport interface BuildSpanTreeOptions {\n /**\n * If provided, caps how many *non-boundary* events (status updates, partial blocks, etc.)\n * are retained — only the most recent `eventLimit` of them survive. Span boundary events\n * (`OperationStart` / `OperationEnd` / `AgentRequestBegin` / `AgentRequestEnd`) are *always*\n * retained regardless of the limit, because dropping them would orphan their child spans\n * and collapse them onto the root branch.\n */\n eventLimit?: number;\n}\n\n/**\n * Builds a hierarchical span tree from a list of trace messages.\n *\n * Algorithm:\n * 1. Flatten messages into events and sort them chronologically.\n * 2. For each event:\n * - Begin events (`OperationStart`, `AgentRequestBegin`) open a new span whose parent\n * is the currently-open span of the event's `meta.parentPid`, or the root if there is\n * none. The begin event itself becomes the first event of the new span.\n * - End events (`OperationEnd`, `AgentRequestEnd`) close the currently-open span for\n * the event's `meta.pid` and become its last event.\n * - Other events attach to the currently-open span for their `meta.pid`, or to the\n * root span if no span is currently open for that pid (or the event has no pid).\n * 3. Sort each span's children by their earliest event timestamp.\n */\nexport const buildSpanTree = (messages: readonly Trace.Message[], options: BuildSpanTreeOptions = {}): Span => {\n const allEvents = messages.flatMap((message) => Trace.flatten(message));\n allEvents.sort((a, b) => a.timestamp - b.timestamp);\n\n // The limit caps verbose middle events (status/partial-block) only. Span boundary events\n // are always retained so the parent/child structure of older spans isn't dropped — losing a\n // begin event detaches every descendant and collapses them onto the root branch.\n const events = applyEventLimit(allEvents, options.eventLimit);\n\n const root = makeMutableSpan(ROOT_SPAN_ID, {});\n\n // Currently-open span for each pid.\n // A process may host multiple sequential spans (e.g. successive agent requests), so we\n // track the active one and start a new span on the next begin event.\n const openSpans = new Map<string, MutableSpan>();\n\n // Most-recent span for each pid, open OR already closed. Used as the parent fallback for a\n // child process whose parent span has already ended — e.g. a delegated sub-agent runs\n // concurrently and its begin event arrives after the supervisor's turn (its parent) closed.\n // Without this the child would nest at the root and render on its own top-level lane, reusing\n // a sibling's released lane instead of forking off its parent.\n const lastSpanByPid = new Map<string, MutableSpan>();\n\n let spanCounter = 0;\n const allocSpanId = (pid: string): string => {\n const id = `${pid}#${spanCounter}`;\n spanCounter += 1;\n return id;\n };\n\n const noteTimestamp = (span: MutableSpan, timestamp: number): void => {\n if (timestamp < span.firstTimestamp) {\n span.firstTimestamp = timestamp;\n }\n };\n\n for (const event of events) {\n const pid = event.meta.pid;\n\n if (!pid) {\n // Events without a pid attach to the root.\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n continue;\n }\n\n if (BEGIN_EVENT_TYPES.has(event.type)) {\n const parentPid = event.meta.parentPid;\n // Prefer the parent's currently-open span; fall back to its most-recent (closed) span so a\n // child process whose parent has already ended still nests under it (delegated sub-agents).\n const parent = (parentPid && (openSpans.get(parentPid) ?? lastSpanByPid.get(parentPid))) || root;\n const span = makeMutableSpan(allocSpanId(pid), computeMeta(event.meta));\n span.events.push(event);\n noteTimestamp(span, event.timestamp);\n parent.children.push(span);\n // The new span supersedes any previously-open span for this pid.\n openSpans.set(pid, span);\n lastSpanByPid.set(pid, span);\n continue;\n }\n\n if (END_EVENT_TYPES.has(event.type)) {\n const span = openSpans.get(pid);\n if (span) {\n span.events.push(event);\n noteTimestamp(span, event.timestamp);\n openSpans.delete(pid);\n } else {\n // End event without a matching begin — attach to root so the event isn't lost.\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n }\n continue;\n }\n\n // Non-boundary event: attach to the currently-open span for this pid if any.\n const open = openSpans.get(pid);\n if (open) {\n open.events.push(event);\n noteTimestamp(open, event.timestamp);\n } else {\n root.events.push(event);\n noteTimestamp(root, event.timestamp);\n }\n }\n\n // Sort children chronologically for deterministic output.\n const sortChildren = (span: MutableSpan): void => {\n span.children.sort((a, b) => a.firstTimestamp - b.firstTimestamp);\n for (const child of span.children) {\n sortChildren(child);\n }\n };\n sortChildren(root);\n\n return freezeSpan(root);\n};\n\n/**\n * Caps the number of non-boundary events while retaining every span boundary event.\n *\n * Boundary events define the span tree's structure: dropping a begin event detaches every\n * descendant span (its `parentPid` lookup fails, so children fall back to the root), and\n * dropping an end event leaves a span open and corrupts the open-span map for sibling spans\n * that share a pid. Status/partial-block events are the noisy bulk and the only ones the\n * limit needs to control.\n *\n * The returned array stays in chronological order.\n */\nconst applyEventLimit = (events: readonly Trace.FlatEvent[], eventLimit: number | undefined): Trace.FlatEvent[] => {\n if (eventLimit === undefined) {\n return [...events];\n }\n\n let nonBoundaryCount = 0;\n for (const event of events) {\n if (!isBoundary(event)) {\n nonBoundaryCount += 1;\n }\n }\n if (nonBoundaryCount <= eventLimit) {\n return [...events];\n }\n\n const dropCount = nonBoundaryCount - eventLimit;\n let dropped = 0;\n const result: Trace.FlatEvent[] = [];\n for (const event of events) {\n if (!isBoundary(event) && dropped < dropCount) {\n dropped += 1;\n continue;\n }\n result.push(event);\n }\n return result;\n};\n\nconst isBoundary = (event: Trace.FlatEvent): boolean =>\n BEGIN_EVENT_TYPES.has(event.type) || END_EVENT_TYPES.has(event.type);\n\n/**\n * A single event positioned within the span tree for commit emission.\n */\nexport interface SpanEventCursor {\n readonly span: Span;\n readonly event: Trace.FlatEvent;\n readonly eventIndex: number;\n}\n\n/**\n * Flattens span-tree events in categorical (depth-first) order: each span's begin events, its\n * child subtrees in sibling order, then its remaining events (middle and end).\n */\nexport const collectSpanTreeEventsCategorically = (root: Span): SpanEventCursor[] => {\n const stream: SpanEventCursor[] = [];\n\n const visitSpan = (span: Span): void => {\n for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {\n const event = span.events[eventIndex]!;\n if (isSpanBeginEvent(event)) {\n stream.push({ span, event, eventIndex });\n }\n }\n\n for (const child of span.children) {\n visitSpan(child);\n }\n\n for (let eventIndex = 0; eventIndex < span.events.length; eventIndex += 1) {\n const event = span.events[eventIndex]!;\n if (!isSpanBeginEvent(event)) {\n stream.push({ span, event, eventIndex });\n }\n }\n };\n\n visitSpan(root);\n return stream;\n};\n\n/**\n * Walks the span tree in depth-first pre-order, invoking `visit` for each span (root included).\n */\nexport const walkSpanTree = (root: Span, visit: (span: Span, depth: number) => void, depth = 0): void => {\n visit(root, depth);\n for (const child of root.children) {\n walkSpanTree(child, visit, depth + 1);\n }\n};\n\n/**\n * Returns all spans in the tree in depth-first pre-order, root first.\n */\nexport const flattenSpanTree = (root: Span): Span[] => {\n const result: Span[] = [];\n walkSpanTree(root, (span) => result.push(span));\n return result;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { PartialBlock } from '@dxos/assistant';\nimport { Trace } from '@dxos/compute';\nimport { type ContentBlock } from '@dxos/types';\n\n/**\n * Approximate streamed token count from partial text (UTF-8 length / 4).\n */\nexport const estimateTokenCount = (text: string): number =>\n Math.max(1, Math.ceil(new TextEncoder().encode(text).length / 4));\n\nconst formatOperationInputStatus = (data: { key: string; name?: string; input: unknown }): string => {\n const name = data.name ?? data.key;\n const bytes = new TextEncoder().encode(JSON.stringify(data.input)).length;\n return `Calling ${name} (${bytes} bytes)...`;\n};\n\n/** Raw routine status updates (e.g. `Running 01KVB9WBRG…`) carry an opaque ULID, not a useful label. */\nconst ROUTINE_ULID_STATUS = /^Running [0-9A-HJKMNP-TV-Z]{26}$/i;\n\n/**\n * Formats a pending assistant block for the delegated-task status line.\n */\nexport const formatPendingBlockStatus = (block: ContentBlock.Any): string | undefined => {\n if (!block.pending) {\n return undefined;\n }\n\n if (block._tag === 'text') {\n return `Generating ${estimateTokenCount(block.text)} tokens....`;\n }\n\n if (block._tag === 'toolCall') {\n const bytes = new TextEncoder().encode(block.input).length;\n const name = block.operationName ?? block.name;\n return `Calling ${name} (${bytes} bytes)...`;\n }\n\n return undefined;\n};\n\n/**\n * Reads the latest pending partial block from an ephemeral trace message.\n */\nexport const pendingStatusFromEphemeralMessage = (message: Trace.Message): string | undefined => {\n for (const event of message.events) {\n if (Trace.isOfType(PartialBlock, event)) {\n const status = formatPendingBlockStatus(event.data.block);\n if (status) {\n return status;\n }\n continue;\n }\n\n if (Trace.isOfType(Trace.OperationInput, event)) {\n return formatOperationInputStatus(event.data);\n }\n\n if (Trace.isOfType(Trace.StatusUpdate, event)) {\n // Suppress opaque routine ULID lines so descriptive partial-block / operation-input lines win.\n if (ROUTINE_ULID_STATUS.test(event.data.message.trim())) {\n continue;\n }\n return event.data.message;\n }\n }\n return undefined;\n};\n\nexport type EphemeralStatusUpdate = 'unchanged' | { readonly line: string };\n\n/**\n * Maps an ephemeral trace message to a task-status update.\n *\n * The status line is \"sticky\": a message without a pending line (e.g. a completed block during an\n * LLM-thinking gap) leaves the previous line in place rather than clearing it, so the row keeps\n * showing the latest meaningful activity until a new line arrives or the subscription ends.\n */\nexport const resolveEphemeralStatusUpdate = (message: Trace.Message): EphemeralStatusUpdate => {\n const line = pendingStatusFromEphemeralMessage(message);\n if (line) {\n return { line };\n }\n return 'unchanged';\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Array", "Either", "pipe", "Option", "Pipeable", "Schema", "Struct", "AgentRequestBegin", "AgentRequestEnd", "CompleteBlock", "Process", "Trace", "Annotation", "AGENT_PROCESS_KEY", "EID", "LogLevel", "log", "AgentRequestBegin", "AgentRequestEnd", "Trace", "EID", "ROOT_SPAN_ID", "BEGIN_EVENT_TYPES", "Set", "OperationStart", "key", "END_EVENT_TYPES", "OperationEnd", "isSpanBeginEvent", "event", "has", "type", "isSpanEndEvent", "computeMeta", "rawMeta", "pid", "parentPid", "processName", "conversationId", "conversation", "getEntityId", "parse", "uri", "undefined", "triggerId", "trigger", "toolCallId", "runtimeName", "makeMutableSpan", "id", "meta", "events", "children", "firstTimestamp", "Number", "POSITIVE_INFINITY", "freezeSpan", "span", "map", "buildSpanTree", "messages", "options", "allEvents", "flatMap", "message", "flatten", "sort", "a", "b", "timestamp", "applyEventLimit", "eventLimit", "root", "openSpans", "Map", "lastSpanByPid", "spanCounter", "allocSpanId", "noteTimestamp", "push", "parent", "get", "set", "delete", "open", "sortChildren", "child", "nonBoundaryCount", "isBoundary", "dropCount", "dropped", "result", "walkSpanTree", "root", "visit", "depth", "child", "children", "flattenSpanTree", "result", "span", "push", "ICONS", "LogLevel", "agentRequestEndSuccess", "agentRequestEndError", "ERROR", "agentRequestEndInterrupted", "userMessage", "statusMessage", "operationStart", "operationEndSuccess", "INFO", "operationEndError", "toolCall", "level", "toolResultSuccess", "toolResultError", "agentRequestRunning", "VERBOSE", "processRunning", "eventLimit", "log", "traceMessages", "commits", "length", "branches", "built", "activeProcesses", "spanTree", "Map", "message", "messages", "event", "CompleteBlock", "block", "_tag", "resultByCallId", "toolCallId", "Either", "validated", "right", "AgentRequestEnd", "status", "undefined", "presentAgentRequestEnd", "data", "isLeft", "Schema", "AgentRequestBegin", "type", "Trace", "endData", "isOfType", "role", "trimText", "idSuffix", "success", "icon", "name", "key", "descendantPids", "collectDescendantPids", "rootPid", "filtered", "has", "metaConvId", "EID", "events", "lines", "presentation", "agentRequestOpen", "lastLine", "openOperations", "set", "timestamp", "latestOperation", "expanded", "pid", "parentPid", "meta", "pids", "isPendingToolCallEvent", "toolCallContext", "lastEvent", "parent", "span", "isSpanBeginEvent", "firstEvent", "collapseCompletedSpans", "details", "builder", "addBranch", "MAIN_BRANCH", "indexParents", "child", "collapsedSpanIds", "walkSpanTree", "isCollapsibleSpan", "findParentSpan", "add", "ancestor", "CommitSelector", "branch", "ownBranch", "branchOf", "firstOf", "lastCommitIdBySpan", "insertedRunningPids", "Set", "activeProcessByPid", "process", "emitRunningIndicator", "parents", "computeParents", "Date", "tags", "SHIMMER_EFFECT_TAG", "id", "parentSpan", "collapsible", "isUnderCollapsedAncestor", "spanHasMiddle", "isProcessBoundary", "ownPid", "isBeginEvent", "isEndEvent", "commitIndex", "globalIndex", "shimmer", "shouldShimmerInProgressCommit", "commit", "commitId", "ROOT_SPAN_ID", "isCompletedSpan", "lastCommitId", "emitEventCommit", "eventIndex", "finishSpan", "emitSpanCommits", "root", "base", "text", "slice", "make", "select", "args", "identity", "selected", "next", "includes", "GraphBuilder", "findCommits", "selector", "hasBranch", "addCommit", "push", "addTag", "tag", "build", "PartialBlock", "Trace", "estimateTokenCount", "text", "Math", "max", "ceil", "TextEncoder", "encode", "length", "formatOperationInputStatus", "data", "name", "key", "bytes", "JSON", "stringify", "input", "ROUTINE_ULID_STATUS", "formatPendingBlockStatus", "block", "pending", "undefined", "_tag", "operationName", "pendingStatusFromEphemeralMessage", "message", "event", "events", "isOfType", "status", "OperationInput", "StatusUpdate", "test", "trim", "resolveEphemeralStatusUpdate", "line"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ import {
2
+ promptRunExtension
3
+ } from "../chunk-HKLSFB5I.mjs";
4
+ import "../chunk-J5LGTIGS.mjs";
5
+ export {
6
+ promptRunExtension
7
+ };
8
+ //# sourceMappingURL=index.mjs.map
@@ -3,12 +3,11 @@ import "./chunk-J5LGTIGS.mjs";
3
3
  // src/operations/fork-chat.ts
4
4
  import * as Effect from "effect/Effect";
5
5
  import { Capabilities, Capability } from "@dxos/app-framework";
6
- import { getObjectPathFromObject, LayoutOperation } from "@dxos/app-toolkit";
6
+ import { LayoutOperation, Paths } from "@dxos/app-toolkit";
7
7
  import { AiContext, SessionLink } from "@dxos/assistant";
8
8
  import { Chat } from "@dxos/assistant-toolkit";
9
9
  import { Operation } from "@dxos/compute";
10
10
  import { Database, Feed, Filter, Obj, Ref } from "@dxos/echo";
11
- import { createFeedServiceLayer } from "@dxos/echo-client";
12
11
  import { invariant } from "@dxos/invariant";
13
12
  import { ClientCapabilities } from "@dxos/plugin-client";
14
13
  import { SpaceOperation } from "@dxos/plugin-space";
@@ -17,21 +16,19 @@ import { AssistantOperation } from "#types";
17
16
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/fork-chat.ts";
18
17
  var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ chat, companionTo }) {
19
18
  const { db } = yield* Database.Service;
20
- const sourceFeed = chat.feed.target;
21
- invariant(sourceFeed, "Chat feed not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 20, S: this, A: ["sourceFeed", "'Chat feed not found.'"] });
19
+ const sourceFeed = yield* Database.load(chat.feed);
22
20
  const client = yield* Capability.get(ClientCapabilities.Client);
23
21
  const space = client.spaces.get(db.spaceId);
24
- invariant(space, "Space not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 23, S: this, A: ["space", "'Space not found.'"] });
25
- const feedServiceLayer = createFeedServiceLayer(space.queues);
26
- const messages = yield* Feed.runQuery(sourceFeed, Filter.type(Message.Message)).pipe(Effect.provide(feedServiceLayer));
22
+ invariant(space, "Space not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 21, S: this, A: ["space", "'Space not found.'"] });
23
+ const dbLayer = Database.layer(space.db);
24
+ const messages = yield* Feed.query(sourceFeed, Filter.type(Message.Message)).run.pipe(Effect.provide(dbLayer));
27
25
  const sorted = messages.filter(Obj.instanceOf(Message.Message)).sort((a, b) => a.created.localeCompare(b.created));
28
26
  const sourceName = Obj.getLabel(chat);
29
27
  const { object: newChat } = yield* Operation.invoke(AssistantOperation.CreateChat, {
30
28
  db,
31
29
  name: sourceName ? `${sourceName} (fork)` : void 0
32
30
  });
33
- const newFeed = newChat.feed.target;
34
- invariant(newFeed, "New chat feed not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 35, S: this, A: ["newFeed", "'New chat feed not found.'"] });
31
+ const newFeed = yield* Database.load(newChat.feed);
35
32
  if (sorted.length > 0) {
36
33
  const lastMessage = sorted[sorted.length - 1];
37
34
  yield* Feed.append(newFeed, [
@@ -39,22 +36,22 @@ var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUn
39
36
  feedRef: Ref.make(sourceFeed),
40
37
  messageId: lastMessage.id
41
38
  })
42
- ]).pipe(Effect.provide(feedServiceLayer));
39
+ ]).pipe(Effect.provide(dbLayer));
43
40
  }
44
- const sourceBindings = (yield* Feed.runQuery(sourceFeed, Filter.type(AiContext.Binding)).pipe(Effect.provide(feedServiceLayer))).filter(Obj.instanceOf(AiContext.Binding));
41
+ const sourceBindings = (yield* Feed.query(sourceFeed, Filter.type(AiContext.Binding)).run.pipe(Effect.provide(dbLayer))).filter(Obj.instanceOf(AiContext.Binding));
45
42
  if (sourceBindings.length > 0) {
46
- const blueprintRefMap = /* @__PURE__ */ new Map();
43
+ const skillRefMap = /* @__PURE__ */ new Map();
47
44
  const objectRefMap = /* @__PURE__ */ new Map();
48
45
  for (const binding of sourceBindings) {
49
- binding.blueprints.added.forEach((ref) => blueprintRefMap.set(ref.uri, ref));
50
- binding.blueprints.removed.forEach((ref) => blueprintRefMap.delete(ref.uri));
46
+ binding.skills.added.forEach((ref) => skillRefMap.set(ref.uri, ref));
47
+ binding.skills.removed.forEach((ref) => skillRefMap.delete(ref.uri));
51
48
  binding.objects.added.forEach((ref) => objectRefMap.set(ref.uri, ref));
52
49
  binding.objects.removed.forEach((ref) => objectRefMap.delete(ref.uri));
53
50
  }
54
51
  yield* Feed.append(newFeed, [
55
52
  Obj.make(AiContext.Binding, {
56
- blueprints: {
57
- added: Array.from(blueprintRefMap.values()),
53
+ skills: {
54
+ added: Array.from(skillRefMap.values()),
58
55
  removed: []
59
56
  },
60
57
  objects: {
@@ -62,7 +59,7 @@ var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUn
62
59
  removed: []
63
60
  }
64
61
  })
65
- ]).pipe(Effect.provide(feedServiceLayer));
62
+ ]).pipe(Effect.provide(dbLayer));
66
63
  }
67
64
  if (companionTo) {
68
65
  yield* Operation.invoke(SpaceOperation.AddRelation, {
@@ -77,7 +74,7 @@ var handler = AssistantOperation.ForkChat.pipe(Operation.withHandler(Effect.fnUn
77
74
  chat: newChat
78
75
  }));
79
76
  } else {
80
- const chatPath = getObjectPathFromObject(newChat);
77
+ const chatPath = Paths.getObjectPathFromObject(newChat);
81
78
  yield* Operation.invoke(LayoutOperation.Open, {
82
79
  subject: [
83
80
  chatPath
@@ -92,4 +89,4 @@ var fork_chat_default = handler;
92
89
  export {
93
90
  fork_chat_default as default
94
91
  };
95
- //# sourceMappingURL=fork-chat-34KEF4ZJ.mjs.map
92
+ //# sourceMappingURL=fork-chat-RMAAYYQF.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/fork-chat.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation, Paths } 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 = Paths.getObjectPathFromObject(newChat);\n yield* Operation.invoke(LayoutOperation.Open, { subject: [chatPath] });\n }\n\n return { object: newChat };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": "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",
6
+ "names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "Paths", "AiContext", "SessionLink", "Chat", "Operation", "Database", "Feed", "Filter", "Obj", "Ref", "invariant", "ClientCapabilities", "SpaceOperation", "Message", "AssistantOperation", "sourceFeed", "chat", "feed", "client", "space", "spaces", "spaceId", "dbLayer", "layer", "messages", "run", "pipe", "provide", "sorted", "filter", "instanceOf", "sort", "b", "a", "created", "localeCompare", "sourceName", "getLabel", "db", "name", "undefined", "newFeed", "lastMessage", "feedRef", "messageId", "skillRefMap", "Map", "binding", "sourceBindings", "added", "forEach", "removed", "ref", "objects", "objectRefMap", "set", "delete", "uri", "append", "skills", "Array", "companionTo", "schema", "CompanionTo", "source", "target", "operationInvoker", "newChat", "subject", "chatPath"]
7
+ }
@@ -0,0 +1,93 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/operations/generate-home-suggestions.ts
4
+ import * as LanguageModel from "@effect/ai/LanguageModel";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Option from "effect/Option";
7
+ import * as Schema from "effect/Schema";
8
+ import { AiService } from "@dxos/ai";
9
+ import { Capabilities, Capability } from "@dxos/app-framework";
10
+ import { AppCapabilities } from "@dxos/app-toolkit";
11
+ import { Operation } from "@dxos/compute";
12
+ import { Collection, Filter, Obj, Order, Query, Type } from "@dxos/echo";
13
+ import { HiddenAnnotation, getTypeAnnotation } from "@dxos/echo/Annotation";
14
+ import { Kind as EntityKind } from "@dxos/echo/Entity";
15
+ import { log } from "@dxos/log";
16
+ import { AssistantCapabilities, AssistantOperation } from "#types";
17
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/operations/generate-home-suggestions.ts";
18
+ var MODEL = "com.anthropic.model.claude-haiku-4-5.default";
19
+ var CACHE_TTL_MS = 60 * 60 * 1e3;
20
+ var RECENT_LIMIT = 20;
21
+ var MAX_PROMPTS = 3;
22
+ var ONBOARDING_DOCUMENT_LABELS = /* @__PURE__ */ new Set([
23
+ "Welcome to Composer"
24
+ ]);
25
+ var handler = AssistantOperation.GenerateHomeSuggestions.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ db }) {
26
+ const spaceId = db.spaceId;
27
+ const cache = yield* Capabilities.getAtomValue(AssistantCapabilities.HomeSuggestionsCache);
28
+ const entry = cache[spaceId];
29
+ if (entry && Date.now() - entry.generatedAt < CACHE_TTL_MS) {
30
+ return {
31
+ prompts: [
32
+ ...entry.prompts
33
+ ]
34
+ };
35
+ }
36
+ const schemas = yield* Capability.getAll(AppCapabilities.Schema);
37
+ const collectionTypename = Type.getTypename(Collection.Collection);
38
+ const types = schemas.flat().filter(Type.isType).filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== EntityKind.Relation).filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false))).filter((type) => Type.getTypename(type) !== collectionTypename);
39
+ let prompts = [];
40
+ if (types.length > 0) {
41
+ const objects = yield* Effect.promise(() => db.query(Query.select(Filter.or(...types.map((type) => Filter.type(type)))).orderBy(Order.updated("desc")).limit(RECENT_LIMIT)).run());
42
+ const items = objects.filter(Obj.isObject).filter((obj) => !Obj.isDeleted(obj)).filter((obj) => !ONBOARDING_DOCUMENT_LABELS.has(Obj.getLabel(obj) ?? "")).flatMap((obj) => {
43
+ const label = Obj.getLabel(obj);
44
+ const typename = Obj.getTypename(obj);
45
+ return label && typename ? [
46
+ {
47
+ label,
48
+ typename
49
+ }
50
+ ] : [];
51
+ });
52
+ if (items.length > 0) {
53
+ prompts = yield* generateSuggestions(items);
54
+ }
55
+ }
56
+ const validPrompts = prompts.map((p) => p.trim()).filter((p) => p.length > 0);
57
+ if (validPrompts.length > 0) {
58
+ yield* Capabilities.updateAtomValue(AssistantCapabilities.HomeSuggestionsCache, (current) => ({
59
+ ...current,
60
+ [spaceId]: {
61
+ generatedAt: Date.now(),
62
+ prompts: validPrompts
63
+ }
64
+ }));
65
+ }
66
+ return {
67
+ prompts: validPrompts
68
+ };
69
+ })));
70
+ var generateSuggestions = (items) => Effect.scoped(LanguageModel.generateObject({
71
+ schema: Schema.Struct({
72
+ prompts: Schema.Array(Schema.String)
73
+ }),
74
+ prompt: [
75
+ "Generate exactly 3 short, imperative, specific starter prompts for an AI assistant with access to this workspace.",
76
+ "Each prompt must be one sentence, at most 10 words, with no markdown or numbering.",
77
+ "",
78
+ "Recent workspace objects:",
79
+ ...items.map(({ label, typename }) => `- ${label} (${typename})`)
80
+ ].join("\n")
81
+ })).pipe(Effect.map(({ value }) => [
82
+ ...value.prompts.slice(0, MAX_PROMPTS)
83
+ ]), Effect.catchAll((err) => {
84
+ log.warn("generate-home-suggestions: LLM call failed", {
85
+ err
86
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 87, S: void 0 });
87
+ return Effect.succeed([]);
88
+ }), Effect.provide(AiService.model(MODEL)));
89
+ var generate_home_suggestions_default = handler;
90
+ export {
91
+ generate_home_suggestions_default as default
92
+ };
93
+ //# sourceMappingURL=generate-home-suggestions-6MM2XWPV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/generate-home-suggestions.ts"],
4
+ "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"],
5
+ "mappings": "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",
6
+ "names": ["LanguageModel", "Effect", "Option", "Schema", "AiService", "Capabilities", "Capability", "AppCapabilities", "Operation", "Collection", "Filter", "Obj", "Order", "Query", "Type", "HiddenAnnotation", "getTypeAnnotation", "Kind", "EntityKind", "log", "AssistantCapabilities", "AssistantOperation", "RECENT_LIMIT", "MAX_PROMPTS", "cache", "entry", "Date", "generatedAt", "CACHE_TTL_MS", "prompts", "types", "schemas", "flat", "filter", "isType", "type", "length", "objects", "items", "label", "obj", "typename", "getTypename", "updateAtomValue", "HomeSuggestionsCache", "current", "Array", "String", "prompt", "join", "map", "value", "catchAll", "err", "warn", "model", "MODEL", "handler"]
7
+ }