@dxos/plugin-assistant 0.8.4-main.422d1c7879 → 0.8.4-main.51f1e5ca51

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 (400) hide show
  1. package/dist/lib/browser/AssistantSettings-GG52BLKS.mjs +40 -0
  2. package/dist/lib/browser/AssistantSettings-GG52BLKS.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +26 -3
  4. package/dist/lib/browser/blueprints/index.mjs.map +4 -4
  5. package/dist/lib/browser/{chunk-ATHYBVGN.mjs → chunk-RIJNPAYC.mjs} +5 -5
  6. package/dist/lib/browser/chunk-RIJNPAYC.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-LMVTXH54.mjs → chunk-SEMCG4ZK.mjs} +58 -17
  8. package/dist/lib/browser/chunk-SEMCG4ZK.mjs.map +7 -0
  9. package/dist/lib/browser/cli/index.mjs +3 -4
  10. package/dist/lib/browser/cli/index.mjs.map +3 -3
  11. package/dist/lib/browser/{create-chat-LBZHGVSN.mjs → create-chat-FZJASOQS.mjs} +5 -13
  12. package/dist/lib/browser/create-chat-FZJASOQS.mjs.map +7 -0
  13. package/dist/lib/browser/{ensure-companion-chat-ZEZA34MZ.mjs → ensure-companion-chat-PHUWWFVY.mjs} +4 -4
  14. package/dist/lib/browser/ensure-companion-chat-PHUWWFVY.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +804 -880
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{on-create-space-54RNX5JI.mjs → on-create-space-OQNCM7NC.mjs} +3 -3
  19. package/dist/lib/browser/{on-create-space-54RNX5JI.mjs.map → on-create-space-OQNCM7NC.mjs.map} +1 -1
  20. package/dist/lib/browser/operations/index.mjs +3 -3
  21. package/dist/lib/browser/operations/index.mjs.map +3 -3
  22. package/dist/lib/browser/{resolve-navigation-targets-NZOD66NY.mjs → resolve-navigation-targets-PMNR7D3P.mjs} +3 -3
  23. package/dist/lib/browser/{resolve-navigation-targets-NZOD66NY.mjs.map → resolve-navigation-targets-PMNR7D3P.mjs.map} +1 -1
  24. package/dist/lib/browser/{run-prompt-in-new-chat-THLK5YQC.mjs → run-prompt-in-new-chat-4XDYFKCV.mjs} +10 -39
  25. package/dist/lib/browser/run-prompt-in-new-chat-4XDYFKCV.mjs.map +7 -0
  26. package/dist/lib/browser/{set-current-chat-LRS3VFSH.mjs → set-current-chat-7V4DA66I.mjs} +4 -4
  27. package/dist/lib/browser/set-current-chat-7V4DA66I.mjs.map +7 -0
  28. package/dist/lib/browser/translations.mjs +171 -0
  29. package/dist/lib/browser/translations.mjs.map +7 -0
  30. package/dist/lib/browser/types/index.mjs +1 -3
  31. package/dist/lib/browser/{update-chat-name-3Y36KFAS.mjs → update-chat-name-ZGMU2UGN.mjs} +7 -22
  32. package/dist/lib/browser/update-chat-name-ZGMU2UGN.mjs.map +7 -0
  33. package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs +41 -0
  34. package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs.map +7 -0
  35. package/dist/lib/node-esm/blueprints/index.mjs +26 -3
  36. package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
  37. package/dist/lib/node-esm/{chunk-PXAJSTGZ.mjs → chunk-NCIZY5ZV.mjs} +5 -5
  38. package/dist/lib/node-esm/chunk-NCIZY5ZV.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-W3JZ2F4T.mjs → chunk-XAFVSEUJ.mjs} +58 -17
  40. package/dist/lib/node-esm/chunk-XAFVSEUJ.mjs.map +7 -0
  41. package/dist/lib/node-esm/cli/index.mjs +3 -4
  42. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  43. package/dist/lib/node-esm/{create-chat-3BEG4R6J.mjs → create-chat-RY6A4WUV.mjs} +5 -13
  44. package/dist/lib/node-esm/create-chat-RY6A4WUV.mjs.map +7 -0
  45. package/dist/lib/node-esm/{ensure-companion-chat-6K2WEWFP.mjs → ensure-companion-chat-BTDU5TS2.mjs} +4 -4
  46. package/dist/lib/node-esm/ensure-companion-chat-BTDU5TS2.mjs.map +7 -0
  47. package/dist/lib/node-esm/index.mjs +804 -880
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/{on-create-space-YRPZ6HZY.mjs → on-create-space-4LWCYT3H.mjs} +3 -3
  51. package/dist/lib/node-esm/{on-create-space-YRPZ6HZY.mjs.map → on-create-space-4LWCYT3H.mjs.map} +1 -1
  52. package/dist/lib/node-esm/operations/index.mjs +3 -3
  53. package/dist/lib/node-esm/operations/index.mjs.map +3 -3
  54. package/dist/lib/node-esm/{resolve-navigation-targets-3PPK7XLH.mjs → resolve-navigation-targets-GHS3XPVP.mjs} +3 -3
  55. package/dist/lib/node-esm/{resolve-navigation-targets-3PPK7XLH.mjs.map → resolve-navigation-targets-GHS3XPVP.mjs.map} +1 -1
  56. package/dist/lib/node-esm/{run-prompt-in-new-chat-OUYKCMQ7.mjs → run-prompt-in-new-chat-UF54E34O.mjs} +10 -39
  57. package/dist/lib/node-esm/run-prompt-in-new-chat-UF54E34O.mjs.map +7 -0
  58. package/dist/lib/node-esm/{set-current-chat-SMXZJD3F.mjs → set-current-chat-SWPAOLZL.mjs} +4 -4
  59. package/dist/lib/node-esm/set-current-chat-SWPAOLZL.mjs.map +7 -0
  60. package/dist/lib/node-esm/translations.mjs +172 -0
  61. package/dist/lib/node-esm/translations.mjs.map +7 -0
  62. package/dist/lib/node-esm/types/index.mjs +1 -3
  63. package/dist/lib/node-esm/{update-chat-name-HM2P4NSI.mjs → update-chat-name-CW6K5M37.mjs} +7 -22
  64. package/dist/lib/node-esm/update-chat-name-CW6K5M37.mjs.map +7 -0
  65. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  66. package/dist/types/src/blueprints/assistant/blueprint.d.ts +2 -2
  67. package/dist/types/src/blueprints/assistant/blueprint.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +2 -2
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  77. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/migrations.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  80. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  85. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  86. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +1 -1
  87. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  88. package/dist/types/src/components/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Chat/Chat.d.ts +29 -39
  90. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  91. package/dist/types/src/components/Chat/context.d.ts +29 -0
  92. package/dist/types/src/components/Chat/context.d.ts.map +1 -0
  93. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  94. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +5 -3
  95. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  96. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +1 -1
  97. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/ChatPrompt/ChatPresets.d.ts.map +1 -1
  99. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +28 -0
  100. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -0
  101. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  102. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts +20 -0
  103. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts.map +1 -0
  104. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +1 -1
  105. package/dist/types/src/components/ChatPrompt/index.d.ts +2 -0
  106. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  107. package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/ChatThread/ChatThread.d.ts +6 -3
  109. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  110. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +4 -3
  111. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
  113. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts +1 -1
  114. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/ChatThread/registry.d.ts +18 -0
  116. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  117. package/dist/types/src/components/ChatThread/sync.d.ts +1 -1
  118. package/dist/types/src/components/ChatThread/sync.d.ts.map +1 -1
  119. package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +1 -1
  120. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts +4 -4
  121. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts.map +1 -1
  122. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.d.ts.map +1 -1
  123. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
  125. package/dist/types/src/components/ChatThread/widgets/SelectWidget.d.ts.map +1 -1
  126. package/dist/types/src/components/ChatThread/widgets/StatsWidget.d.ts.map +1 -1
  127. package/dist/types/src/components/ChatThread/widgets/StatusWidget.d.ts.map +1 -1
  128. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
  129. package/dist/types/src/components/ChatThread/widgets/SummaryWidget.d.ts.map +1 -1
  130. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
  131. package/dist/types/src/components/ChatThread/widgets/ToolWidget.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +5 -0
  133. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -0
  134. package/dist/types/src/components/ChatThread/widgets/index.d.ts +1 -2
  135. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  136. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +2 -1
  137. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  138. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +0 -1
  139. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -2
  141. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  142. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -3
  144. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  145. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +1 -1
  147. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +1 -1
  148. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +4 -4
  149. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
  150. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
  151. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  152. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  153. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
  154. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  155. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
  156. package/dist/types/src/containers/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  157. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts +1 -1
  158. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts.map +1 -1
  159. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +1 -1
  160. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -1
  161. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  162. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +6 -0
  163. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +1 -0
  164. package/dist/types/src/containers/RoutineArticle/index.d.ts +2 -0
  165. package/dist/types/src/containers/RoutineArticle/index.d.ts.map +1 -0
  166. package/dist/types/src/containers/RoutineList/RoutineList.d.ts +6 -0
  167. package/dist/types/src/containers/RoutineList/RoutineList.d.ts.map +1 -0
  168. package/dist/types/src/containers/{PromptList/PromptList.stories.d.ts → RoutineList/RoutineList.stories.d.ts} +1 -1
  169. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts.map +1 -0
  170. package/dist/types/src/containers/RoutineList/index.d.ts +2 -0
  171. package/dist/types/src/containers/RoutineList/index.d.ts.map +1 -0
  172. package/dist/types/src/containers/TracePanel/TracePanel.d.ts +3 -2
  173. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  174. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts +1 -4
  175. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  176. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts +1 -1
  177. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts.map +1 -1
  178. package/dist/types/src/containers/TracePanel/execution-graph.d.ts +81 -1
  179. package/dist/types/src/containers/TracePanel/execution-graph.d.ts.map +1 -1
  180. package/dist/types/src/containers/TracePanel/execution-graph.test.d.ts +2 -0
  181. package/dist/types/src/containers/TracePanel/execution-graph.test.d.ts.map +1 -0
  182. package/dist/types/src/containers/TracePanel/index.d.ts.map +1 -1
  183. package/dist/types/src/containers/TracePanel/testing/index.d.ts +3 -0
  184. package/dist/types/src/containers/TracePanel/testing/index.d.ts.map +1 -0
  185. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts +14 -0
  186. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts.map +1 -0
  187. package/dist/types/src/containers/TracePanel/testing/snapshot-playback.d.ts +12 -0
  188. package/dist/types/src/containers/TracePanel/testing/snapshot-playback.d.ts.map +1 -0
  189. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  190. package/dist/types/src/containers/index.d.ts +2 -2
  191. package/dist/types/src/containers/index.d.ts.map +1 -1
  192. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
  193. package/dist/types/src/hooks/index.d.ts +2 -0
  194. package/dist/types/src/hooks/index.d.ts.map +1 -1
  195. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +1 -1
  196. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useChatKeymap.d.ts +12 -0
  198. package/dist/types/src/hooks/useChatKeymap.d.ts.map +1 -0
  199. package/dist/types/src/hooks/useChatProcessor.d.ts +1 -1
  200. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  202. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  203. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  204. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useDebug.d.ts +10 -0
  206. package/dist/types/src/hooks/useDebug.d.ts.map +1 -0
  207. package/dist/types/src/hooks/useFilteredTypes.d.ts.map +1 -1
  208. package/dist/types/src/hooks/useFlush.d.ts +1 -1
  209. package/dist/types/src/hooks/useFlush.d.ts.map +1 -1
  210. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  211. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  212. package/dist/types/src/index.d.ts +0 -3
  213. package/dist/types/src/index.d.ts.map +1 -1
  214. package/dist/types/src/operations/create-chat.d.ts +1 -1
  215. package/dist/types/src/operations/create-chat.d.ts.map +1 -1
  216. package/dist/types/src/operations/definitions.d.ts +24 -19
  217. package/dist/types/src/operations/definitions.d.ts.map +1 -1
  218. package/dist/types/src/operations/ensure-companion-chat.d.ts +1 -1
  219. package/dist/types/src/operations/ensure-companion-chat.d.ts.map +1 -1
  220. package/dist/types/src/operations/index.d.ts +1 -1
  221. package/dist/types/src/operations/index.d.ts.map +1 -1
  222. package/dist/types/src/operations/on-create-space.d.ts +1 -1
  223. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  224. package/dist/types/src/operations/resolve-navigation-targets.d.ts +1 -1
  225. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -1
  226. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +1 -1
  227. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
  228. package/dist/types/src/operations/set-current-chat.d.ts +1 -1
  229. package/dist/types/src/operations/set-current-chat.d.ts.map +1 -1
  230. package/dist/types/src/operations/update-chat-name.d.ts +1 -1
  231. package/dist/types/src/operations/update-chat-name.d.ts.map +1 -1
  232. package/dist/types/src/processor/processor.d.ts +2 -2
  233. package/dist/types/src/processor/processor.d.ts.map +1 -1
  234. package/dist/types/src/queue-logger.d.ts.map +1 -1
  235. package/dist/types/src/testing/index.d.ts +1 -0
  236. package/dist/types/src/testing/index.d.ts.map +1 -1
  237. package/dist/types/src/testing/test-generator.d.ts +1 -1
  238. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  239. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  240. package/dist/types/src/testing/test-trace.d.ts +5 -0
  241. package/dist/types/src/testing/test-trace.d.ts.map +1 -0
  242. package/dist/types/src/translations.d.ts.map +1 -1
  243. package/dist/types/src/types/Assistant.d.ts +22 -6
  244. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  245. package/dist/types/src/types/Settings.d.ts +20 -5
  246. package/dist/types/src/types/Settings.d.ts.map +1 -1
  247. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  248. package/dist/types/src/types/events.d.ts.map +1 -1
  249. package/dist/types/src/types/index.d.ts +0 -1
  250. package/dist/types/src/types/index.d.ts.map +1 -1
  251. package/dist/types/src/types/service.d.ts +1 -1
  252. package/dist/types/src/types/service.d.ts.map +1 -1
  253. package/dist/types/tsconfig.tsbuildinfo +1 -1
  254. package/package.json +95 -91
  255. package/src/AssistantPlugin.tsx +10 -12
  256. package/src/blueprints/assistant/blueprint.test.ts +3 -3
  257. package/src/blueprints/assistant/blueprint.ts +3 -3
  258. package/src/capabilities/app-graph-builder.ts +3 -3
  259. package/src/capabilities/blueprint-definition.ts +0 -4
  260. package/src/capabilities/index.ts +1 -1
  261. package/src/capabilities/markdown.ts +1 -1
  262. package/src/capabilities/migrations.ts +1 -8
  263. package/src/capabilities/operation-handler.ts +1 -1
  264. package/src/capabilities/react-surface.tsx +16 -10
  265. package/src/cli/plugin.ts +3 -4
  266. package/src/components/AssistantSettings/AssistantSettings.stories.tsx +3 -2
  267. package/src/components/AssistantSettings/AssistantSettings.tsx +22 -111
  268. package/src/components/Chat/Chat.tsx +56 -260
  269. package/src/components/Chat/context.ts +39 -0
  270. package/src/components/ChatPrompt/ChatActions.tsx +10 -10
  271. package/src/components/ChatPrompt/ChatOptions.stories.tsx +24 -10
  272. package/src/components/ChatPrompt/ChatOptions.tsx +60 -31
  273. package/src/components/ChatPrompt/ChatPrompt.tsx +179 -0
  274. package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
  275. package/src/components/ChatPrompt/ChatStatus.tsx +123 -0
  276. package/src/components/ChatPrompt/index.ts +2 -0
  277. package/src/components/ChatThread/ChatThread.stories.tsx +3 -3
  278. package/src/components/ChatThread/ChatThread.tsx +31 -18
  279. package/src/components/ChatThread/DEBUG.md +41 -0
  280. package/src/components/ChatThread/MarkdownStream.stories.tsx +5 -4
  281. package/src/components/ChatThread/registry.tsx +53 -14
  282. package/src/components/ChatThread/sync.test.ts +80 -12
  283. package/src/components/ChatThread/sync.ts +1 -1
  284. package/src/components/ChatThread/widgets/ReasoningWidget.ts +6 -6
  285. package/src/components/ChatThread/widgets/ReferenceWidget.ts +3 -1
  286. package/src/components/ChatThread/widgets/SelectWidget.ts +3 -1
  287. package/src/components/ChatThread/widgets/StatsWidget.ts +3 -1
  288. package/src/components/ChatThread/widgets/StatusWidget.ts +3 -1
  289. package/src/components/ChatThread/widgets/SuggestionWidget.ts +1 -1
  290. package/src/components/ChatThread/widgets/SummaryWidget.tsx +3 -2
  291. package/src/components/ChatThread/widgets/ToolWidget.stories.tsx +2 -1
  292. package/src/components/ChatThread/widgets/defaults.ts +8 -0
  293. package/src/components/ChatThread/widgets/index.ts +1 -2
  294. package/src/components/ProcessTree/ProcessTree.stories.tsx +12 -38
  295. package/src/components/ProcessTree/ProcessTree.tsx +67 -35
  296. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +3 -2
  297. package/src/components/TemplateEditor/TemplateEditor.tsx +5 -5
  298. package/src/components/TemplateEditor/TemplateForm.stories.tsx +4 -3
  299. package/src/components/TemplateEditor/TemplateForm.tsx +3 -3
  300. package/src/components/Toolbox/Toolbox.stories.tsx +2 -1
  301. package/src/components/Toolbox/Toolbox.tsx +2 -2
  302. package/src/containers/AgentArticle/AgentArticle.stories.tsx +1 -1
  303. package/src/containers/AgentArticle/AgentArticle.tsx +2 -2
  304. package/src/containers/AgentProperties/AgentProperties.stories.tsx +2 -1
  305. package/src/containers/AgentProperties/AgentProperties.tsx +2 -2
  306. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +1 -1
  307. package/src/containers/ChatCompanion/ChatCompanion.tsx +1 -1
  308. package/src/containers/ChatContainer/ChatContainer.tsx +16 -6
  309. package/src/containers/ChatDialog/ChatDialog.tsx +3 -9
  310. package/src/containers/{PromptArticle/PromptArticle.tsx → RoutineArticle/RoutineArticle.tsx} +4 -4
  311. package/src/containers/RoutineArticle/index.ts +5 -0
  312. package/src/containers/{PromptList/PromptList.stories.tsx → RoutineList/RoutineList.stories.tsx} +10 -9
  313. package/src/containers/{PromptList/PromptList.tsx → RoutineList/RoutineList.tsx} +6 -5
  314. package/src/containers/RoutineList/index.ts +5 -0
  315. package/src/containers/TracePanel/TracePanel.stories.tsx +204 -198
  316. package/src/containers/TracePanel/TracePanel.tsx +69 -44
  317. package/src/containers/TracePanel/dxn-extractor.test.ts +7 -7
  318. package/src/containers/TracePanel/dxn-extractor.ts +4 -4
  319. package/src/containers/TracePanel/execution-graph.test.ts +382 -0
  320. package/src/containers/TracePanel/execution-graph.ts +340 -213
  321. package/src/containers/TracePanel/testing/index.ts +6 -0
  322. package/src/containers/TracePanel/testing/simulated-agent.ts +114 -0
  323. package/src/containers/TracePanel/testing/snapshot-playback.ts +45 -0
  324. package/src/containers/index.ts +2 -2
  325. package/src/hooks/index.ts +2 -0
  326. package/src/hooks/useBlueprintRegistry.ts +1 -1
  327. package/src/hooks/useChatKeymap.ts +52 -0
  328. package/src/hooks/useChatProcessor.ts +1 -1
  329. package/src/hooks/useDebug.ts +38 -0
  330. package/src/index.ts +0 -3
  331. package/src/operations/create-chat.ts +2 -2
  332. package/src/operations/definitions.ts +4 -4
  333. package/src/operations/ensure-companion-chat.ts +1 -1
  334. package/src/operations/index.ts +1 -1
  335. package/src/operations/on-create-space.ts +1 -1
  336. package/src/operations/prompt.test.ts +5 -6
  337. package/src/operations/resolve-navigation-targets.ts +1 -1
  338. package/src/operations/run-prompt-in-new-chat.ts +3 -3
  339. package/src/operations/set-current-chat.ts +1 -1
  340. package/src/operations/update-chat-name.ts +2 -2
  341. package/src/processor/processor.test.ts +1 -1
  342. package/src/processor/processor.ts +4 -4
  343. package/src/queue-logger.ts +1 -1
  344. package/src/testing/data/trace-timeline.dx.json +3737 -1200
  345. package/src/testing/index.ts +1 -0
  346. package/src/testing/test-generator.test.ts +1 -1
  347. package/src/testing/test-generator.ts +4 -4
  348. package/src/testing/test-trace.ts +20 -0
  349. package/src/testing/trace-timeline.conversations.json +1 -1
  350. package/src/testing/trace-timeline.test.ts +53 -49
  351. package/src/translations.ts +24 -31
  352. package/src/types/Assistant.ts +11 -0
  353. package/src/types/Settings.ts +62 -7
  354. package/src/types/index.ts +0 -1
  355. package/src/types/service.ts +1 -1
  356. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs +0 -97
  357. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-ATHYBVGN.mjs.map +0 -7
  359. package/dist/lib/browser/chunk-EZRS3J25.mjs +0 -30
  360. package/dist/lib/browser/chunk-EZRS3J25.mjs.map +0 -7
  361. package/dist/lib/browser/chunk-LMVTXH54.mjs.map +0 -7
  362. package/dist/lib/browser/create-chat-LBZHGVSN.mjs.map +0 -7
  363. package/dist/lib/browser/ensure-companion-chat-ZEZA34MZ.mjs.map +0 -7
  364. package/dist/lib/browser/run-prompt-in-new-chat-THLK5YQC.mjs.map +0 -7
  365. package/dist/lib/browser/set-current-chat-LRS3VFSH.mjs.map +0 -7
  366. package/dist/lib/browser/update-chat-name-3Y36KFAS.mjs.map +0 -7
  367. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs +0 -98
  368. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs.map +0 -7
  369. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs +0 -32
  370. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs.map +0 -7
  371. package/dist/lib/node-esm/chunk-PXAJSTGZ.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-W3JZ2F4T.mjs.map +0 -7
  373. package/dist/lib/node-esm/create-chat-3BEG4R6J.mjs.map +0 -7
  374. package/dist/lib/node-esm/ensure-companion-chat-6K2WEWFP.mjs.map +0 -7
  375. package/dist/lib/node-esm/run-prompt-in-new-chat-OUYKCMQ7.mjs.map +0 -7
  376. package/dist/lib/node-esm/set-current-chat-SMXZJD3F.mjs.map +0 -7
  377. package/dist/lib/node-esm/update-chat-name-HM2P4NSI.mjs.map +0 -7
  378. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts +0 -10
  379. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts.map +0 -1
  380. package/dist/types/src/components/ChatProgress/index.d.ts +0 -2
  381. package/dist/types/src/components/ChatProgress/index.d.ts.map +0 -1
  382. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts +0 -15
  383. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts.map +0 -1
  384. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts +0 -6
  385. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts.map +0 -1
  386. package/dist/types/src/containers/PromptArticle/index.d.ts +0 -2
  387. package/dist/types/src/containers/PromptArticle/index.d.ts.map +0 -1
  388. package/dist/types/src/containers/PromptList/PromptList.d.ts +0 -6
  389. package/dist/types/src/containers/PromptList/PromptList.d.ts.map +0 -1
  390. package/dist/types/src/containers/PromptList/PromptList.stories.d.ts.map +0 -1
  391. package/dist/types/src/containers/PromptList/index.d.ts +0 -2
  392. package/dist/types/src/containers/PromptList/index.d.ts.map +0 -1
  393. package/dist/types/src/types/defs.d.ts +0 -2
  394. package/dist/types/src/types/defs.d.ts.map +0 -1
  395. package/src/components/ChatProgress/ChatProgress.tsx +0 -56
  396. package/src/components/ChatProgress/index.ts +0 -5
  397. package/src/components/ChatThread/widgets/PromptWidget.ts +0 -30
  398. package/src/containers/PromptArticle/index.ts +0 -5
  399. package/src/containers/PromptList/index.ts +0 -5
  400. package/src/types/defs.ts +0 -5
@@ -5,68 +5,85 @@
5
5
  import { Atom } from '@effect-atom/atom';
6
6
  import { useAtomValue } from '@effect-atom/atom-react';
7
7
  import { pipe } from 'effect/Function';
8
- import React, { useCallback, useMemo } from 'react';
8
+ import React, { useCallback, useMemo, useState } from 'react';
9
9
 
10
10
  import { useOperationInvoker } from '@dxos/app-framework/ui';
11
11
  import { LayoutOperation } from '@dxos/app-toolkit';
12
12
  import { type AppSurface } from '@dxos/app-toolkit/ui';
13
+ import { Trace } from '@dxos/compute';
13
14
  import { Filter, Query } from '@dxos/echo';
14
15
  import { AtomQuery } from '@dxos/echo-atom';
15
- import { Trace } from '@dxos/functions';
16
16
  import { FeedTraceSink, Process } from '@dxos/functions-runtime';
17
17
  import { DXN } from '@dxos/keys';
18
+ import { log } from '@dxos/log';
18
19
  import { useComputeRuntimeService } from '@dxos/plugin-automation/hooks';
19
20
  import { type Space } from '@dxos/react-client/echo';
20
21
  import { Panel } from '@dxos/react-ui';
21
22
  import { Timeline, type Commit } from '@dxos/react-ui-components';
22
23
  import { composable, mx } from '@dxos/ui-theme';
23
24
 
24
- import { ProcessTree } from '../../components';
25
+ import { ProcessTree, ProcessTreeProps } from '#components';
26
+
25
27
  import { buildExecutionGraph } from './execution-graph';
26
28
 
27
- export type TracePanelProps = AppSurface.SpaceArticleProps;
29
+ export type TracePanelProps = AppSurface.SpaceArticleProps<Pick<ProcessTreeProps, 'onProcessTerminate'>>;
28
30
 
29
- export const TracePanel = composable<HTMLDivElement, TracePanelProps>(({ space, ...props }, forwardedRef) => {
30
- const { invokePromise } = useOperationInvoker();
31
- const { branches, commits } = useExecutionGraph(space);
31
+ export const TracePanel = composable<HTMLDivElement, TracePanelProps>(
32
+ ({ space, onProcessTerminate, ...props }, forwardedRef) => {
33
+ const { invokePromise } = useOperationInvoker();
34
+ const { branches, commits } = useExecutionGraph(space);
35
+ const runtime = useComputeRuntimeService(Process.ProcessMonitorService, space.id);
36
+ const processes = useAtomValue(runtime?.processTreeAtom ?? atomEmpty);
32
37
 
33
- const handleCommitClick = useCallback(
34
- (commit: Commit) => {
35
- if (commit.link) {
36
- const dxn = DXN.tryParse(commit.link)?.asEchoDXN();
37
- if (dxn?.spaceId && dxn.echoId) {
38
- // TODO(dmaretskyi): Navigates, but fails to open.
39
- void invokePromise(LayoutOperation.Open, {
40
- subject: [`${dxn.spaceId}:${dxn.echoId}`],
41
- });
38
+ const handleCommitClick = useCallback(
39
+ (commit: Commit) => {
40
+ if (commit.link) {
41
+ const dxn = DXN.tryParse(commit.link)?.asEchoDXN();
42
+ if (dxn?.spaceId && dxn.echoId) {
43
+ // TODO(dmaretskyi): Navigates, but fails to open.
44
+ void invokePromise(LayoutOperation.Open, {
45
+ subject: [`${dxn.spaceId}:${dxn.echoId}`],
46
+ });
47
+ }
42
48
  }
43
- }
44
- },
45
- [invokePromise],
46
- );
49
+ },
50
+ [invokePromise],
51
+ );
47
52
 
48
- return (
49
- <Panel.Root {...props} ref={forwardedRef}>
50
- <Panel.Content className='grid grid-rows-[min-content_1fr]'>
51
- <ActiveProcessList spaceId={space.id} />
52
- <Timeline branches={branches} commits={commits} compact onCommitClick={handleCommitClick} />
53
- </Panel.Content>
54
- </Panel.Root>
55
- );
56
- });
57
-
58
- /**
59
- * Separated into its own component because useComputeRuntimeService uses React's use() which requires a Suspense boundary.
60
- */
61
- const ActiveProcessList = ({ spaceId }: { spaceId: Space['id'] }) => {
62
- const runtime = useComputeRuntimeService(Process.ProcessMonitorService, spaceId);
63
- const activeProcesses = useAtomValue(runtime?.processTreeAtom ?? atomEmpty);
64
- if (activeProcesses.length === 0) {
65
- return <div />;
66
- }
53
+ // Select current branch.
54
+ const [currentBranch, setCurrentBranch] = useState<string | null>(null);
55
+ const handleProcessSelect = useCallback(
56
+ (process: Process.Info) => {
57
+ const branch = branches.find((branch) => branch === process.pid.toString());
58
+ if (branch) {
59
+ log.info('select', { process, branch });
60
+ setCurrentBranch(branch);
61
+ }
62
+ },
63
+ [branches],
64
+ );
67
65
 
68
- return <ProcessTree classNames={mx('max-h-[8lh] px-2 border-b border-separator')} processes={activeProcesses} />;
69
- };
66
+ return (
67
+ <Panel.Root {...props} ref={forwardedRef}>
68
+ <Panel.Content className='grid grid-rows-[min-content_1fr] divide-y divide-separator'>
69
+ <ProcessTree
70
+ classNames={mx('max-h-[8lh] border-b border-separator')}
71
+ processes={processes}
72
+ onProcessSelect={handleProcessSelect}
73
+ onProcessTerminate={onProcessTerminate}
74
+ />
75
+ <Timeline
76
+ currentBranch={currentBranch}
77
+ branches={branches}
78
+ commits={commits}
79
+ compact
80
+ onCommitClick={handleCommitClick}
81
+ />
82
+ </Panel.Content>
83
+ </Panel.Root>
84
+ );
85
+ },
86
+ );
70
87
 
71
88
  // Stable ref.
72
89
  const atomEmpty = Atom.make(() => [] as const);
@@ -81,17 +98,25 @@ type UseExecutionGraphOptions = {
81
98
  };
82
99
 
83
100
  const useExecutionGraph = (space: Space, { eventLimit }: UseExecutionGraphOptions = {}): ExecutionGraph => {
84
- const atom = useMemo(() => getExecutionGraph(space, { eventLimit }), [space, eventLimit]);
101
+ const runtime = useComputeRuntimeService(Process.ProcessMonitorService, space.id);
102
+ const activeProcesses = useAtomValue(runtime?.processTreeAtom ?? atomEmpty);
103
+ const atom = useMemo(
104
+ () => getExecutionGraph(space, activeProcesses, { eventLimit }),
105
+ [space, activeProcesses, eventLimit],
106
+ );
107
+
85
108
  return useAtomValue(atom);
86
109
  };
87
110
 
88
111
  const getExecutionGraph = (
89
112
  space: Space,
90
- { eventLimit = 100 }: UseExecutionGraphOptions = {},
113
+ activeProcesses: readonly Process.Info[] = [],
114
+ { eventLimit = 300 }: UseExecutionGraphOptions = {},
91
115
  ): Atom.Atom<ExecutionGraph> => {
92
116
  return pipe(
93
117
  AtomQuery.make(space.db, FeedTraceSink.query),
94
118
  Atom.map((feeds) => {
119
+ log('trace panel query trace feeds', { spaceId: space.id, feedCount: feeds.length });
95
120
  // TODO(dmaretskyi): This should be possible in a single query with properly working limit(1) and feed > feed contents traversal.
96
121
  return AtomQuery.make(
97
122
  space.db,
@@ -105,7 +130,7 @@ const getExecutionGraph = (
105
130
  Atom.make((get) =>
106
131
  buildExecutionGraph({
107
132
  traceMessages: [...get(_)],
108
- activeProcesses: [],
133
+ activeProcesses,
109
134
  eventLimit,
110
135
  }),
111
136
  ),
@@ -6,41 +6,41 @@ import { describe, test } from 'vitest';
6
6
 
7
7
  import {
8
8
  extractDxnsFromObject,
9
- extractDxnsFromString,
9
+ extractDxnFromString,
10
10
  extractFirstDxnFromToolInput,
11
11
  extractFirstDxnFromToolResult,
12
12
  } from './dxn-extractor';
13
13
 
14
14
  describe('dxn-extractor', () => {
15
- describe('extractDxnsFromString', () => {
15
+ describe('extractDxnFromString', () => {
16
16
  test('extracts plain DXN from string', ({ expect }) => {
17
- const result = extractDxnsFromString('Found object dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4');
17
+ const result = extractDxnFromString('Found object dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4');
18
18
  expect(result).toHaveLength(1);
19
19
  expect(result[0].toString()).toBe('dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4');
20
20
  });
21
21
 
22
22
  test('extracts @dxn prefixed reference from string', ({ expect }) => {
23
- const result = extractDxnsFromString('Reference to @dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4 in text');
23
+ const result = extractDxnFromString('Reference to @dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4 in text');
24
24
  expect(result).toHaveLength(1);
25
25
  expect(result[0].toString()).toBe('dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4');
26
26
  });
27
27
 
28
28
  test('extracts multiple DXNs from string', ({ expect }) => {
29
- const result = extractDxnsFromString(
29
+ const result = extractDxnFromString(
30
30
  'Objects: dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4 and @dxn:queue:data:SPACE:QUEUE:01KG7R1ZXWFMWQ4DA1Q6TN1DG5',
31
31
  );
32
32
  expect(result).toHaveLength(2);
33
33
  });
34
34
 
35
35
  test('deduplicates DXNs', ({ expect }) => {
36
- const result = extractDxnsFromString(
36
+ const result = extractDxnFromString(
37
37
  'Same object dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4 and dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',
38
38
  );
39
39
  expect(result).toHaveLength(1);
40
40
  });
41
41
 
42
42
  test('returns empty array for string without DXNs', ({ expect }) => {
43
- const result = extractDxnsFromString('No DXNs here');
43
+ const result = extractDxnFromString('No DXNs here');
44
44
  expect(result).toHaveLength(0);
45
45
  });
46
46
  });
@@ -28,7 +28,7 @@ const AT_DXN_PATTERN = /@(dxn:[a-zA-Z0-9]+(?::[a-zA-Z0-9@_-]+)+)/g;
28
28
  /**
29
29
  * Extracts all DXN references from a string.
30
30
  */
31
- export const extractDxnsFromString = (text: string): DXN[] => {
31
+ export const extractDxnFromString = (text: string): DXN[] => {
32
32
  const dxns: DXN[] = [];
33
33
  const seen = new Set<string>();
34
34
 
@@ -91,7 +91,7 @@ export const extractDxnsFromObject = (obj: unknown): DXN[] => {
91
91
  addDxn(value.slice(1));
92
92
  }
93
93
  // Also extract DXNs from within the string.
94
- const extracted = extractDxnsFromString(value);
94
+ const extracted = extractDxnFromString(value);
95
95
  for (const dxn of extracted) {
96
96
  addDxn(dxn.toString());
97
97
  }
@@ -153,7 +153,7 @@ export const extractFirstDxnFromToolInput = (input: string): DXN | undefined =>
153
153
  return dxns[0];
154
154
  } catch {
155
155
  // If JSON parsing fails, try to extract from the raw string.
156
- const dxns = extractDxnsFromString(input);
156
+ const dxns = extractDxnFromString(input);
157
157
  return dxns[0];
158
158
  }
159
159
  };
@@ -172,7 +172,7 @@ export const extractFirstDxnFromToolResult = (result: string | undefined): DXN |
172
172
  return dxns[0];
173
173
  } catch {
174
174
  // If JSON parsing fails, try to extract from the raw string.
175
- const dxns = extractDxnsFromString(result);
175
+ const dxns = extractDxnFromString(result);
176
176
  return dxns[0];
177
177
  }
178
178
  };
@@ -0,0 +1,382 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import { type Commit } from '@dxos/react-ui-components';
8
+
9
+ import { CommitSelector } from './execution-graph';
10
+
11
+ const makeCommit = (id: string, opts: Partial<Commit> = {}): Commit => ({
12
+ id,
13
+ branch: opts.branch ?? 'main',
14
+ message: opts.message ?? id,
15
+ ...opts,
16
+ });
17
+
18
+ const ids = (commits: Commit[]) => commits.map((commit) => commit.id);
19
+
20
+ describe('CommitSelector', () => {
21
+ describe('make', () => {
22
+ test('wraps a select function', ({ expect }) => {
23
+ const selector = CommitSelector.make((commits) => commits);
24
+ const a = makeCommit('a');
25
+ expect(selector.select([a])).toEqual([a]);
26
+ });
27
+
28
+ test('returns a pipeable selector', ({ expect }) => {
29
+ const selector = CommitSelector.make((commits) => commits);
30
+ expect(typeof selector.pipe).toBe('function');
31
+ });
32
+
33
+ test('does not mutate the input array', ({ expect }) => {
34
+ const input = [makeCommit('a'), makeCommit('b')];
35
+ const before = [...input];
36
+ CommitSelector.identity().select(input);
37
+ expect(input).toEqual(before);
38
+ });
39
+ });
40
+
41
+ describe('identity', () => {
42
+ test('returns all commits', ({ expect }) => {
43
+ const a = makeCommit('a');
44
+ const b = makeCommit('b');
45
+ expect(CommitSelector.identity().select([a, b])).toEqual([a, b]);
46
+ });
47
+
48
+ test('returns empty for empty input', ({ expect }) => {
49
+ expect(CommitSelector.identity().select([])).toEqual([]);
50
+ });
51
+ });
52
+
53
+ describe('filter', () => {
54
+ test('keeps commits matching predicate', ({ expect }) => {
55
+ const a = makeCommit('a', { tags: ['x'] });
56
+ const b = makeCommit('b');
57
+ const selector = CommitSelector.filter((commit) => commit.tags?.includes('x'));
58
+ expect(selector.select([a, b])).toEqual([a]);
59
+ });
60
+
61
+ test('returns empty array on no match', ({ expect }) => {
62
+ const a = makeCommit('a');
63
+ expect(CommitSelector.filter(() => false).select([a])).toEqual([]);
64
+ });
65
+
66
+ test('coerces predicate return values', ({ expect }) => {
67
+ const a = makeCommit('a', { tags: ['x'] });
68
+ const b = makeCommit('b');
69
+ // `unknown` truthy/falsy values are accepted.
70
+ const selector = CommitSelector.filter((commit) => commit.tags?.length);
71
+ expect(selector.select([a, b])).toEqual([a]);
72
+ });
73
+ });
74
+
75
+ describe('id', () => {
76
+ test('matches a single commit by id', ({ expect }) => {
77
+ const a = makeCommit('a');
78
+ const b = makeCommit('b');
79
+ expect(CommitSelector.id('b').select([a, b])).toEqual([b]);
80
+ });
81
+
82
+ test('returns empty when id is missing', ({ expect }) => {
83
+ expect(CommitSelector.id('missing').select([makeCommit('a')])).toEqual([]);
84
+ });
85
+
86
+ test('returns empty for empty input', ({ expect }) => {
87
+ expect(CommitSelector.id('a').select([])).toEqual([]);
88
+ });
89
+ });
90
+
91
+ describe('tag', () => {
92
+ test('matches commits whose tags include the tag', ({ expect }) => {
93
+ const a = makeCommit('a', { tags: ['x'] });
94
+ const b = makeCommit('b', { tags: ['y'] });
95
+ expect(CommitSelector.tag('x').select([a, b])).toEqual([a]);
96
+ });
97
+
98
+ test('matches commits with multiple tags', ({ expect }) => {
99
+ const a = makeCommit('a', { tags: ['x', 'y'] });
100
+ expect(CommitSelector.tag('y').select([a])).toEqual([a]);
101
+ });
102
+
103
+ test('returns empty for falsy tag (undefined / null / false)', ({ expect }) => {
104
+ const a = makeCommit('a', { tags: ['x'] });
105
+ expect(CommitSelector.tag(undefined).select([a])).toEqual([]);
106
+ expect(CommitSelector.tag(null).select([a])).toEqual([]);
107
+ expect(CommitSelector.tag(false).select([a])).toEqual([]);
108
+ });
109
+
110
+ test('returns empty when commit has no tags', ({ expect }) => {
111
+ expect(CommitSelector.tag('x').select([makeCommit('a')])).toEqual([]);
112
+ });
113
+ });
114
+
115
+ describe('anyTags', () => {
116
+ test('matches commits if any tag is present', ({ expect }) => {
117
+ const a = makeCommit('a', { tags: ['x'] });
118
+ const b = makeCommit('b', { tags: ['y'] });
119
+ const c = makeCommit('c', { tags: ['z'] });
120
+ expect(CommitSelector.anyTags(['x', 'y']).select([a, b, c])).toEqual([a, b]);
121
+ });
122
+
123
+ test('ignores falsy tags in the input list', ({ expect }) => {
124
+ const a = makeCommit('a', { tags: ['x'] });
125
+ expect(CommitSelector.anyTags([null, undefined, false, 'x']).select([a])).toEqual([a]);
126
+ });
127
+
128
+ test('returns empty when all tags are falsy', ({ expect }) => {
129
+ const a = makeCommit('a', { tags: ['x'] });
130
+ expect(CommitSelector.anyTags([null, undefined, false]).select([a])).toEqual([]);
131
+ });
132
+
133
+ test('returns empty when no commit carries any of the tags', ({ expect }) => {
134
+ expect(CommitSelector.anyTags(['x']).select([makeCommit('a')])).toEqual([]);
135
+ });
136
+ });
137
+
138
+ describe('branch', () => {
139
+ test('matches commits by branch', ({ expect }) => {
140
+ const a = makeCommit('a', { branch: 'main' });
141
+ const b = makeCommit('b', { branch: 'feature' });
142
+ expect(CommitSelector.branch('feature').select([a, b])).toEqual([b]);
143
+ });
144
+
145
+ test('returns empty when no commit is on the branch', ({ expect }) => {
146
+ expect(CommitSelector.branch('feature').select([makeCommit('a', { branch: 'main' })])).toEqual([]);
147
+ });
148
+ });
149
+
150
+ describe('compose', () => {
151
+ test('applies next selector after prev', ({ expect }) => {
152
+ const a = makeCommit('a', { branch: 'main', tags: ['keep'] });
153
+ const b = makeCommit('b', { branch: 'main' });
154
+ const c = makeCommit('c', { branch: 'feature', tags: ['keep'] });
155
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.compose(CommitSelector.tag('keep')));
156
+ expect(selector.select([a, b, c])).toEqual([a]);
157
+ });
158
+
159
+ test('multiple composes chain left-to-right', ({ expect }) => {
160
+ const a = makeCommit('a', { branch: 'main', tags: ['x'] });
161
+ const b = makeCommit('b', { branch: 'main', tags: ['y'] });
162
+ const c = makeCommit('c', { branch: 'main', tags: ['x'] });
163
+ const selector = CommitSelector.branch('main').pipe(
164
+ CommitSelector.compose(CommitSelector.tag('x')),
165
+ CommitSelector.compose(CommitSelector.first()),
166
+ );
167
+ expect(selector.select([a, b, c])).toEqual([a]);
168
+ });
169
+ });
170
+
171
+ describe('orElse', () => {
172
+ test('returns prev result when prev is non-empty', ({ expect }) => {
173
+ const a = makeCommit('a', { branch: 'main' });
174
+ const b = makeCommit('b', { branch: 'feature' });
175
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.orElse(CommitSelector.branch('feature')));
176
+ expect(selector.select([a, b])).toEqual([a]);
177
+ });
178
+
179
+ test('returns next result when prev is empty', ({ expect }) => {
180
+ const b = makeCommit('b', { branch: 'feature' });
181
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.orElse(CommitSelector.branch('feature')));
182
+ expect(selector.select([b])).toEqual([b]);
183
+ });
184
+
185
+ test('returns empty when both prev and next are empty', ({ expect }) => {
186
+ const z = makeCommit('z', { branch: 'other' });
187
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.orElse(CommitSelector.branch('feature')));
188
+ expect(selector.select([z])).toEqual([]);
189
+ });
190
+ });
191
+
192
+ describe('andAlso', () => {
193
+ test('returns the union of prev and next', ({ expect }) => {
194
+ const a = makeCommit('a', { branch: 'main' });
195
+ const b = makeCommit('b', { branch: 'feature' });
196
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.andAlso(CommitSelector.branch('feature')));
197
+ expect(ids(selector.select([a, b])).toSorted()).toEqual(['a', 'b']);
198
+ });
199
+
200
+ test('dedupes by id', ({ expect }) => {
201
+ const a = makeCommit('a', { branch: 'main', tags: ['x'] });
202
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.andAlso(CommitSelector.tag('x')));
203
+ expect(selector.select([a])).toHaveLength(1);
204
+ });
205
+ });
206
+
207
+ describe('first', () => {
208
+ test('returns first n commits, defaulting to 1', ({ expect }) => {
209
+ const a = makeCommit('a');
210
+ const b = makeCommit('b');
211
+ const c = makeCommit('c');
212
+ expect(CommitSelector.first().select([a, b, c])).toEqual([a]);
213
+ expect(CommitSelector.first(2).select([a, b, c])).toEqual([a, b]);
214
+ });
215
+
216
+ test('returns all when n exceeds length', ({ expect }) => {
217
+ const a = makeCommit('a');
218
+ expect(CommitSelector.first(5).select([a])).toEqual([a]);
219
+ });
220
+
221
+ test('returns empty when n=0', ({ expect }) => {
222
+ expect(CommitSelector.first(0).select([makeCommit('a')])).toEqual([]);
223
+ });
224
+
225
+ test('returns empty for empty input', ({ expect }) => {
226
+ expect(CommitSelector.first().select([])).toEqual([]);
227
+ });
228
+ });
229
+
230
+ describe('last', () => {
231
+ test('returns the last commit by default', ({ expect }) => {
232
+ const a = makeCommit('a');
233
+ const b = makeCommit('b');
234
+ const c = makeCommit('c');
235
+ const result = CommitSelector.last().select([a, b, c]);
236
+ expect(ids(result)).toEqual(['c']);
237
+ });
238
+
239
+ test('returns last n commits', ({ expect }) => {
240
+ const a = makeCommit('a');
241
+ const b = makeCommit('b');
242
+ const c = makeCommit('c');
243
+ const result = CommitSelector.last(2).select([a, b, c]);
244
+ expect(ids(result).toSorted()).toEqual(['b', 'c']);
245
+ });
246
+
247
+ test('returns all when n exceeds length', ({ expect }) => {
248
+ const a = makeCommit('a');
249
+ const result = CommitSelector.last(5).select([a]);
250
+ expect(ids(result)).toEqual(['a']);
251
+ });
252
+
253
+ test('returns empty when n=0', ({ expect }) => {
254
+ expect(CommitSelector.last(0).select([makeCommit('a')])).toEqual([]);
255
+ });
256
+
257
+ test('returns empty for empty input', ({ expect }) => {
258
+ expect(CommitSelector.last().select([])).toEqual([]);
259
+ });
260
+
261
+ test('produces the most recent commit on a branch when composed', ({ expect }) => {
262
+ // Common usage pattern in execution-graph: pick the most recent commit on a branch.
263
+ const a = makeCommit('a', { branch: 'main' });
264
+ const b = makeCommit('b', { branch: 'main' });
265
+ const c = makeCommit('c', { branch: 'main' });
266
+ const selector = CommitSelector.branch('main').pipe(CommitSelector.compose(CommitSelector.last()));
267
+ expect(ids(selector.select([a, b, c]))).toEqual(['c']);
268
+ });
269
+ });
270
+
271
+ describe('not', () => {
272
+ test('inverts the selection', ({ expect }) => {
273
+ const a = makeCommit('a', { tags: ['x'] });
274
+ const b = makeCommit('b');
275
+ expect(CommitSelector.not(CommitSelector.tag('x')).select([a, b])).toEqual([b]);
276
+ });
277
+
278
+ test('returns all when inner selector matches nothing', ({ expect }) => {
279
+ const a = makeCommit('a');
280
+ expect(CommitSelector.not(CommitSelector.id('missing')).select([a])).toEqual([a]);
281
+ });
282
+
283
+ test('returns empty when inner selector matches everything', ({ expect }) => {
284
+ const a = makeCommit('a');
285
+ const b = makeCommit('b');
286
+ expect(CommitSelector.not(CommitSelector.identity()).select([a, b])).toEqual([]);
287
+ });
288
+ });
289
+
290
+ describe('unionAll', () => {
291
+ test('combines results from multiple selectors', ({ expect }) => {
292
+ const a = makeCommit('a', { branch: 'main' });
293
+ const b = makeCommit('b', { branch: 'feature' });
294
+ const selector = CommitSelector.unionAll(CommitSelector.branch('main'), CommitSelector.branch('feature'));
295
+ expect(ids(selector.select([a, b])).toSorted()).toEqual(['a', 'b']);
296
+ });
297
+
298
+ test('dedupes by id', ({ expect }) => {
299
+ const a = makeCommit('a', { branch: 'main', tags: ['x'] });
300
+ const selector = CommitSelector.unionAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
301
+ expect(selector.select([a])).toHaveLength(1);
302
+ });
303
+
304
+ test('returns empty when called with no selectors', ({ expect }) => {
305
+ expect(CommitSelector.unionAll().select([makeCommit('a')])).toEqual([]);
306
+ });
307
+ });
308
+
309
+ describe('intersectAll', () => {
310
+ test('returns commits matching all selectors', ({ expect }) => {
311
+ const a = makeCommit('a', { branch: 'main', tags: ['x'] });
312
+ const b = makeCommit('b', { branch: 'main', tags: ['y'] });
313
+ const c = makeCommit('c', { branch: 'feature', tags: ['x'] });
314
+ const selector = CommitSelector.intersectAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
315
+ expect(selector.select([a, b, c])).toEqual([a]);
316
+ });
317
+
318
+ test('returns empty when called with no selectors', ({ expect }) => {
319
+ expect(CommitSelector.intersectAll().select([makeCommit('a')])).toEqual([]);
320
+ });
321
+
322
+ test('returns empty when no commit matches all selectors', ({ expect }) => {
323
+ const a = makeCommit('a', { branch: 'main' });
324
+ const selector = CommitSelector.intersectAll(CommitSelector.branch('main'), CommitSelector.tag('x'));
325
+ expect(selector.select([a])).toEqual([]);
326
+ });
327
+ });
328
+
329
+ describe('firstOf', () => {
330
+ test('returns the first selector result that is non-empty', ({ expect }) => {
331
+ const a = makeCommit('a', { branch: 'main' });
332
+ const b = makeCommit('b', { branch: 'feature' });
333
+ const selector = CommitSelector.firstOf(
334
+ CommitSelector.branch('missing'),
335
+ CommitSelector.branch('main'),
336
+ CommitSelector.branch('feature'),
337
+ );
338
+ expect(selector.select([a, b])).toEqual([a]);
339
+ });
340
+
341
+ test('falls through all empty selectors', ({ expect }) => {
342
+ const selector = CommitSelector.firstOf(CommitSelector.id('x'), CommitSelector.id('y'));
343
+ expect(selector.select([])).toEqual([]);
344
+ });
345
+
346
+ test('returns empty when called with no selectors', ({ expect }) => {
347
+ expect(CommitSelector.firstOf().select([makeCommit('a')])).toEqual([]);
348
+ });
349
+ });
350
+
351
+ describe('pipeable', () => {
352
+ test('OperationStart pipeline: branch || start-marker tag, then last', ({ expect }) => {
353
+ // Mirrors `parents` selector for `OperationStart` in execution-graph.ts.
354
+ // Parent is on a different branch but carries the start-marker tag for the new event's parent pid.
355
+ const parent = makeCommit('parent', { branch: 'main', tags: ['start-marker:p1'] });
356
+ const selector = CommitSelector.branch('p1').pipe(
357
+ CommitSelector.orElse(CommitSelector.tag('start-marker:p1')),
358
+ CommitSelector.compose(CommitSelector.last()),
359
+ );
360
+ expect(ids(selector.select([parent]))).toEqual(['parent']);
361
+ });
362
+
363
+ test('pipe with a single composer matches direct application', ({ expect }) => {
364
+ const a = makeCommit('a', { tags: ['x'] });
365
+ const b = makeCommit('b');
366
+ const piped = CommitSelector.identity().pipe(CommitSelector.compose(CommitSelector.tag('x')));
367
+ const direct = CommitSelector.compose(CommitSelector.tag('x'))(CommitSelector.identity());
368
+ expect(piped.select([a, b])).toEqual(direct.select([a, b]));
369
+ });
370
+
371
+ test('multi-stage pipe applies stages left-to-right', ({ expect }) => {
372
+ const a = makeCommit('a', { branch: 'main', tags: ['x'] });
373
+ const b = makeCommit('b', { branch: 'main', tags: ['y'] });
374
+ const c = makeCommit('c', { branch: 'main', tags: ['x'] });
375
+ const selector = CommitSelector.branch('main').pipe(
376
+ CommitSelector.compose(CommitSelector.tag('x')),
377
+ CommitSelector.compose(CommitSelector.last()),
378
+ );
379
+ expect(ids(selector.select([a, b, c]))).toEqual(['c']);
380
+ });
381
+ });
382
+ });