@athenaintel/react 0.42.2 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/README.md +225 -3
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  13. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  14. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  15. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  16. package/dist/agent-runtime/src/conversation-list-groups.d.ts +74 -0
  17. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  18. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  19. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  20. package/dist/agent-runtime/src/decision-checks.js +207 -0
  21. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  22. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  23. package/dist/agent-runtime/src/errors.cjs +18 -0
  24. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  25. package/dist/agent-runtime/src/errors.d.ts +7 -0
  26. package/dist/agent-runtime/src/errors.js +18 -0
  27. package/dist/agent-runtime/src/errors.js.map +1 -1
  28. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  29. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  30. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  31. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  32. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  33. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  34. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  35. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  36. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  37. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  38. package/dist/agent-runtime/src/index.d.ts +15 -8
  39. package/dist/agent-runtime/src/interrupts.cjs +43 -18
  40. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  41. package/dist/agent-runtime/src/interrupts.d.ts +19 -2
  42. package/dist/agent-runtime/src/interrupts.js +28 -3
  43. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  44. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  45. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  46. package/dist/agent-runtime/src/messages.cjs +43 -8
  47. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  48. package/dist/agent-runtime/src/messages.d.ts +25 -3
  49. package/dist/agent-runtime/src/messages.js +43 -8
  50. package/dist/agent-runtime/src/messages.js.map +1 -1
  51. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  52. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  53. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  54. package/dist/agent-runtime/src/offline-status.js +36 -0
  55. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  56. package/dist/agent-runtime/src/queue.cjs +0 -9
  57. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  58. package/dist/agent-runtime/src/queue.js +0 -9
  59. package/dist/agent-runtime/src/queue.js.map +1 -1
  60. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  61. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  62. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  63. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  64. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  65. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  66. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  67. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  68. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  69. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  70. package/dist/agent-runtime/src/runtime.d.ts +40 -0
  71. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  72. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  73. package/dist/agent-runtime/src/subagents.cjs +32 -2
  74. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  75. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  76. package/dist/agent-runtime/src/subagents.js +30 -0
  77. package/dist/agent-runtime/src/subagents.js.map +1 -1
  78. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  79. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  80. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  81. package/dist/agent-runtime/src/thread-driver.js +67 -0
  82. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  83. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  84. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
  85. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  86. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  87. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  88. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  89. package/dist/agent-runtime/src/tool-metadata.cjs +210 -33
  90. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  91. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  92. package/dist/agent-runtime/src/tool-metadata.js +210 -33
  93. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  94. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  95. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  96. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  97. package/dist/agent-runtime/src/tool-names.js +2 -0
  98. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  99. package/dist/agent-runtime/src/types.d.ts +10 -2
  100. package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
  101. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  102. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
  103. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  104. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
  105. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
  106. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  107. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  108. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  109. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  110. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  111. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
  112. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  113. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  114. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  115. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +572 -134
  116. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  117. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +137 -10
  118. package/dist/agent-runtime/src/use-deep-agent-voice.js +514 -76
  119. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  120. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  121. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  122. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  123. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  124. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
  125. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  126. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  127. package/dist/agent-runtime/src/voice-media.d.ts +49 -0
  128. package/dist/agent-runtime/src/voice-media.js +117 -0
  129. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  130. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  131. package/dist/assets/AssetPanel.cjs +11 -11
  132. package/dist/assets/AssetPanel.cjs.map +1 -1
  133. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  134. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  135. package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
  136. package/dist/assets/AthenaAssetEmbed.js +4 -2
  137. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  138. package/dist/assets/AthenaLayout.cjs +16 -16
  139. package/dist/assets/AthenaLayout.cjs.map +1 -1
  140. package/dist/assets/use-asset-content.cjs +4 -4
  141. package/dist/assets/use-asset-content.cjs.map +1 -1
  142. package/dist/assets/use-asset-embed.cjs +14 -7
  143. package/dist/assets/use-asset-embed.cjs.map +1 -1
  144. package/dist/assets/use-asset-embed.d.ts +11 -1
  145. package/dist/assets/use-asset-embed.js +10 -3
  146. package/dist/assets/use-asset-embed.js.map +1 -1
  147. package/dist/auth/AthenaAuthContext.cjs +3 -3
  148. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  149. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  150. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  151. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  152. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  153. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  154. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  155. package/dist/auth/credential-source.cjs +26 -13
  156. package/dist/auth/credential-source.cjs.map +1 -1
  157. package/dist/auth/credential-source.d.ts +8 -0
  158. package/dist/auth/credential-source.js +26 -13
  159. package/dist/auth/credential-source.js.map +1 -1
  160. package/dist/catalog/agent-model-options.cjs +25 -17
  161. package/dist/catalog/agent-model-options.cjs.map +1 -1
  162. package/dist/catalog/agent-model-options.d.ts +38 -5
  163. package/dist/catalog/agent-model-options.js +25 -17
  164. package/dist/catalog/agent-model-options.js.map +1 -1
  165. package/dist/catalog/channel-refusal.cjs +36 -0
  166. package/dist/catalog/channel-refusal.cjs.map +1 -0
  167. package/dist/catalog/channel-refusal.d.ts +29 -0
  168. package/dist/catalog/channel-refusal.js +36 -0
  169. package/dist/catalog/channel-refusal.js.map +1 -0
  170. package/dist/catalog/chat-pickers.cjs +60 -24
  171. package/dist/catalog/chat-pickers.cjs.map +1 -1
  172. package/dist/catalog/chat-pickers.d.ts +12 -2
  173. package/dist/catalog/chat-pickers.js +56 -20
  174. package/dist/catalog/chat-pickers.js.map +1 -1
  175. package/dist/catalog/runtime-catalog.cjs +89 -23
  176. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  177. package/dist/catalog/runtime-catalog.d.ts +8 -2
  178. package/dist/catalog/runtime-catalog.js +83 -17
  179. package/dist/catalog/runtime-catalog.js.map +1 -1
  180. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  181. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  182. package/dist/chat/AthenaChat.cjs +155 -67
  183. package/dist/chat/AthenaChat.cjs.map +1 -1
  184. package/dist/chat/AthenaChat.d.ts +42 -2
  185. package/dist/chat/AthenaChat.js +106 -18
  186. package/dist/chat/AthenaChat.js.map +1 -1
  187. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  188. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  189. package/dist/chat/DrivingOnChip.cjs +23 -0
  190. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  191. package/dist/chat/DrivingOnChip.d.ts +17 -0
  192. package/dist/chat/DrivingOnChip.js +23 -0
  193. package/dist/chat/DrivingOnChip.js.map +1 -0
  194. package/dist/chat/StatewireApprovalCard.cjs +125 -31
  195. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  196. package/dist/chat/StatewireApprovalCard.d.ts +73 -1
  197. package/dist/chat/StatewireApprovalCard.js +115 -21
  198. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  199. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  200. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  201. package/dist/chat/StatewireQueuedMessages.cjs +25 -63
  202. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  203. package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
  204. package/dist/chat/StatewireQueuedMessages.js +16 -54
  205. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  206. package/dist/chat/WaitingOnYouBanner.cjs +3 -3
  207. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  208. package/dist/chat/athena-chat-welcome.cjs +2 -2
  209. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  210. package/dist/chat/athena-citation-links.cjs +5 -5
  211. package/dist/chat/athena-citation-links.cjs.map +1 -1
  212. package/dist/chat/athena-composer-controls.cjs +26 -16
  213. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  214. package/dist/chat/athena-composer-controls.d.ts +6 -0
  215. package/dist/chat/athena-composer-controls.js +26 -16
  216. package/dist/chat/athena-composer-controls.js.map +1 -1
  217. package/dist/chat/athena-turn-end-status.cjs +42 -0
  218. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  219. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  220. package/dist/chat/athena-turn-end-status.js +42 -0
  221. package/dist/chat/athena-turn-end-status.js.map +1 -0
  222. package/dist/chat/browser-decision-check.cjs +131 -0
  223. package/dist/chat/browser-decision-check.cjs.map +1 -0
  224. package/dist/chat/browser-decision-check.d.ts +61 -0
  225. package/dist/chat/browser-decision-check.js +131 -0
  226. package/dist/chat/browser-decision-check.js.map +1 -0
  227. package/dist/chat/chat-outbox-rows.cjs +3 -3
  228. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  229. package/dist/chat/chat-voice-controls.cjs +93 -28
  230. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  231. package/dist/chat/chat-voice-controls.d.ts +36 -2
  232. package/dist/chat/chat-voice-controls.js +89 -24
  233. package/dist/chat/chat-voice-controls.js.map +1 -1
  234. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  235. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  236. package/dist/chat/device-operation.cjs +29 -0
  237. package/dist/chat/device-operation.cjs.map +1 -0
  238. package/dist/chat/device-operation.d.ts +34 -0
  239. package/dist/chat/device-operation.js +29 -0
  240. package/dist/chat/device-operation.js.map +1 -0
  241. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  242. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  243. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  244. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  245. package/dist/chat/super-grouping/SuperGroupingCard.cjs +60 -38
  246. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  247. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +24 -4
  248. package/dist/chat/super-grouping/SuperGroupingCard.js +37 -15
  249. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  250. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  251. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  252. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  253. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  254. package/dist/chat/super-grouping/ToolTimeline.cjs +97 -37
  255. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  256. package/dist/chat/super-grouping/ToolTimeline.d.ts +14 -2
  257. package/dist/chat/super-grouping/ToolTimeline.js +94 -34
  258. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  259. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  260. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  261. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  262. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  263. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  264. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  265. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  266. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  267. package/dist/chat/super-grouping/grouping-function.js +5 -1
  268. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  269. package/dist/chat/super-grouping/index.cjs +6 -0
  270. package/dist/chat/super-grouping/index.cjs.map +1 -1
  271. package/dist/chat/super-grouping/index.d.ts +6 -2
  272. package/dist/chat/super-grouping/index.js +7 -1
  273. package/dist/chat/super-grouping/index.js.map +1 -1
  274. package/dist/chat/super-grouping/timeline-step.cjs +61 -2
  275. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
  276. package/dist/chat/super-grouping/timeline-step.d.ts +13 -1
  277. package/dist/chat/super-grouping/timeline-step.js +61 -2
  278. package/dist/chat/super-grouping/timeline-step.js.map +1 -1
  279. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  280. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  281. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  282. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  283. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  284. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  285. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  286. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  287. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  288. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  289. package/dist/chat/tooltip-icon-button.cjs +2 -2
  290. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  291. package/dist/chat/use-athena-voice-live.cjs +11 -0
  292. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  293. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  294. package/dist/chat/use-athena-voice-live.js +11 -0
  295. package/dist/chat/use-athena-voice-live.js.map +1 -0
  296. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  297. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  298. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  299. package/dist/chat/use-statewire-approval-request.js +41 -9
  300. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  301. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  302. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  303. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  304. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  305. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  306. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  307. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  308. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  309. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  310. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  311. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  312. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  313. package/dist/chat-ui/index.cjs +18 -0
  314. package/dist/chat-ui/index.cjs.map +1 -1
  315. package/dist/chat-ui/index.d.ts +7 -1
  316. package/dist/chat-ui/index.js +18 -0
  317. package/dist/chat-ui/index.js.map +1 -1
  318. package/dist/chat-ui/mentions/mention-chip.cjs +147 -38
  319. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  320. package/dist/chat-ui/mentions/mention-chip.d.ts +17 -1
  321. package/dist/chat-ui/mentions/mention-chip.js +146 -37
  322. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  323. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  324. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  325. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  326. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  327. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  328. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  329. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  330. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  331. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  332. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  333. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  334. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  335. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  336. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  337. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  338. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  339. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  340. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  341. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  342. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  343. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  344. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  345. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  346. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  347. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  348. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  349. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  350. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  351. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  352. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  353. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  354. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  355. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  356. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  357. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  358. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  359. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  360. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  361. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  362. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  363. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  364. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  365. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  366. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  367. package/dist/chat-ui/mentions/use-mention-asset.cjs +140 -0
  368. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -0
  369. package/dist/chat-ui/mentions/use-mention-asset.d.ts +16 -0
  370. package/dist/chat-ui/mentions/use-mention-asset.js +140 -0
  371. package/dist/chat-ui/mentions/use-mention-asset.js.map +1 -0
  372. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  373. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  374. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  375. package/dist/chat-ui/messages/answer-label.js +42 -0
  376. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  377. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  378. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  379. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  380. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  381. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  382. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  383. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  384. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  385. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  386. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  387. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  388. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  389. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  390. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  391. package/dist/chat-ui/messages/message-components.cjs +8 -4
  392. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  393. package/dist/chat-ui/messages/message-components.js +5 -1
  394. package/dist/chat-ui/messages/message-components.js.map +1 -1
  395. package/dist/chat-ui/messages/message-images.cjs +66 -0
  396. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  397. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  398. package/dist/chat-ui/messages/message-images.js +66 -0
  399. package/dist/chat-ui/messages/message-images.js.map +1 -0
  400. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  401. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  402. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  403. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  404. package/dist/chat-ui/rich-text/chat-link.cjs +7 -6
  405. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  406. package/dist/chat-ui/rich-text/chat-link.d.ts +2 -3
  407. package/dist/chat-ui/rich-text/chat-link.js +6 -5
  408. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  409. package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
  410. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  411. package/dist/chat-ui/rich-text/chat-node-views.cjs +7 -6
  412. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  413. package/dist/chat-ui/rich-text/chat-node-views.js +1 -0
  414. package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -1
  415. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  416. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  417. package/dist/chat-ui/statewire.cjs +3 -0
  418. package/dist/chat-ui/statewire.cjs.map +1 -1
  419. package/dist/chat-ui/statewire.d.ts +2 -1
  420. package/dist/chat-ui/statewire.js +3 -0
  421. package/dist/chat-ui/statewire.js.map +1 -1
  422. package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
  423. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  424. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  425. package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
  426. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  427. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  428. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  429. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  430. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  431. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  432. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  433. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  434. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  435. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  436. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  437. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  438. package/dist/collab/client.cjs +40 -3
  439. package/dist/collab/client.cjs.map +1 -1
  440. package/dist/collab/client.d.ts +25 -0
  441. package/dist/collab/client.js +40 -3
  442. package/dist/collab/client.js.map +1 -1
  443. package/dist/collab/document-status.cjs +150 -0
  444. package/dist/collab/document-status.cjs.map +1 -0
  445. package/dist/collab/document-status.d.ts +68 -0
  446. package/dist/collab/document-status.js +150 -0
  447. package/dist/collab/document-status.js.map +1 -0
  448. package/dist/collab/index.cjs +7 -0
  449. package/dist/collab/index.cjs.map +1 -1
  450. package/dist/collab/index.d.ts +6 -1
  451. package/dist/collab/index.js +7 -0
  452. package/dist/collab/index.js.map +1 -1
  453. package/dist/collab/presence-react.cjs +11 -11
  454. package/dist/collab/presence-react.cjs.map +1 -1
  455. package/dist/collab/react.cjs +6 -6
  456. package/dist/collab/react.cjs.map +1 -1
  457. package/dist/composer/AttachmentContext.cjs +24 -11
  458. package/dist/composer/AttachmentContext.cjs.map +1 -1
  459. package/dist/composer/AttachmentContext.js +18 -5
  460. package/dist/composer/AttachmentContext.js.map +1 -1
  461. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  462. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  463. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  464. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  465. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  466. package/dist/composer/ComposerDropZone.cjs +7 -7
  467. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  468. package/dist/composer/FileUploadButton.cjs +37 -22
  469. package/dist/composer/FileUploadButton.cjs.map +1 -1
  470. package/dist/composer/FileUploadButton.d.ts +6 -0
  471. package/dist/composer/FileUploadButton.js +34 -19
  472. package/dist/composer/FileUploadButton.js.map +1 -1
  473. package/dist/composer/QuoteContext.cjs +8 -8
  474. package/dist/composer/QuoteContext.cjs.map +1 -1
  475. package/dist/composer/composer-handoff.cjs +4 -4
  476. package/dist/composer/composer-handoff.cjs.map +1 -1
  477. package/dist/composer/useAppendToComposer.cjs +4 -4
  478. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  479. package/dist/composer/useAttachFiles.cjs +23 -6
  480. package/dist/composer/useAttachFiles.cjs.map +1 -1
  481. package/dist/composer/useAttachFiles.d.ts +15 -7
  482. package/dist/composer/useAttachFiles.js +22 -5
  483. package/dist/composer/useAttachFiles.js.map +1 -1
  484. package/dist/composer/useComposerAttachment.cjs +4 -4
  485. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  486. package/dist/composer/useFileUpload.cjs +21 -16
  487. package/dist/composer/useFileUpload.cjs.map +1 -1
  488. package/dist/composer/useFileUpload.d.ts +12 -0
  489. package/dist/composer/useFileUpload.js +12 -7
  490. package/dist/composer/useFileUpload.js.map +1 -1
  491. package/dist/composer/useReadComposerDraft.cjs +2 -2
  492. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  493. package/dist/composer/useSendMessage.cjs +4 -4
  494. package/dist/composer/useSendMessage.cjs.map +1 -1
  495. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  496. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  497. package/dist/dictation/audio-level-history.cjs +3 -3
  498. package/dist/dictation/audio-level-history.cjs.map +1 -1
  499. package/dist/dictation/dictation-controls.cjs +24 -20
  500. package/dist/dictation/dictation-controls.cjs.map +1 -1
  501. package/dist/dictation/dictation-controls.d.ts +6 -1
  502. package/dist/dictation/dictation-controls.js +24 -20
  503. package/dist/dictation/dictation-controls.js.map +1 -1
  504. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  505. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  506. package/dist/dictation/use-dictation.cjs +22 -22
  507. package/dist/dictation/use-dictation.cjs.map +1 -1
  508. package/dist/index.cjs +26 -2
  509. package/dist/index.cjs.map +1 -1
  510. package/dist/index.d.ts +15 -3
  511. package/dist/index.js +26 -2
  512. package/dist/index.js.map +1 -1
  513. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  514. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  515. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  516. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  517. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  518. package/dist/keryx-http/src/update-attributions.cjs +111 -0
  519. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  520. package/dist/keryx-http/src/update-attributions.d.ts +75 -0
  521. package/dist/keryx-http/src/update-attributions.js +111 -0
  522. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  523. package/dist/lib/owner-document.cjs +6 -6
  524. package/dist/lib/owner-document.cjs.map +1 -1
  525. package/dist/lib/use-athena-rest-query.cjs +4 -4
  526. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  527. package/dist/lib/use-document-active.cjs +4 -4
  528. package/dist/lib/use-document-active.cjs.map +1 -1
  529. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  530. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  531. package/dist/offline/offline-history.cjs +7 -7
  532. package/dist/offline/offline-history.cjs.map +1 -1
  533. package/dist/provider/AthenaContext.cjs +3 -3
  534. package/dist/provider/AthenaContext.cjs.map +1 -1
  535. package/dist/provider/AthenaProvider.cjs +116 -79
  536. package/dist/provider/AthenaProvider.cjs.map +1 -1
  537. package/dist/provider/AthenaProvider.js +40 -3
  538. package/dist/provider/AthenaProvider.js.map +1 -1
  539. package/dist/provider/PostHogProvider.cjs +2 -2
  540. package/dist/provider/PostHogProvider.cjs.map +1 -1
  541. package/dist/provider/agent-selection-context.cjs +2 -2
  542. package/dist/provider/agent-selection-context.cjs.map +1 -1
  543. package/dist/provider/chat-mode-context.cjs +2 -2
  544. package/dist/provider/chat-mode-context.cjs.map +1 -1
  545. package/dist/provider/session-persistence-context.cjs +10 -0
  546. package/dist/provider/session-persistence-context.cjs.map +1 -0
  547. package/dist/provider/session-persistence-context.d.ts +15 -0
  548. package/dist/provider/session-persistence-context.js +10 -0
  549. package/dist/provider/session-persistence-context.js.map +1 -0
  550. package/dist/provider/statewire-history-context.cjs +4 -4
  551. package/dist/provider/statewire-history-context.cjs.map +1 -1
  552. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  553. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  554. package/dist/provider/statewire-window-context.cjs +3 -3
  555. package/dist/provider/statewire-window-context.cjs.map +1 -1
  556. package/dist/provider/theme-style-context.cjs +3 -3
  557. package/dist/provider/theme-style-context.cjs.map +1 -1
  558. package/dist/react/package.json.cjs +1 -1
  559. package/dist/react/package.json.js +1 -1
  560. package/dist/references/src/tool-option-schemas.d.ts +0 -34
  561. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  562. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  563. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  564. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  565. package/dist/runtime/auth.cjs +13 -13
  566. package/dist/runtime/auth.cjs.map +1 -1
  567. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  568. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  569. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  570. package/dist/runtime/statewire-lifecycle.js +2 -1
  571. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  572. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  573. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  574. package/dist/runtime/statewire-session-lane.cjs +4 -4
  575. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  576. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  577. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  578. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  579. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  580. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  581. package/dist/styles.css +1 -1
  582. package/dist/threads/Inbox.cjs +8 -8
  583. package/dist/threads/Inbox.cjs.map +1 -1
  584. package/dist/threads/SessionList.cjs +9 -9
  585. package/dist/threads/SessionList.cjs.map +1 -1
  586. package/dist/threads/SessionsPage.cjs +11 -11
  587. package/dist/threads/SessionsPage.cjs.map +1 -1
  588. package/dist/threads/index-triggered-refresh.cjs +10 -10
  589. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  590. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  591. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  592. package/dist/threads/offline-session-list.cjs +3 -3
  593. package/dist/threads/offline-session-list.cjs.map +1 -1
  594. package/dist/threads/session-list-tab-share.cjs +5 -5
  595. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  596. package/dist/threads/statewire-thread-list.cjs +55 -51
  597. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  598. package/dist/threads/statewire-thread-list.js +6 -2
  599. package/dist/threads/statewire-thread-list.js.map +1 -1
  600. package/dist/threads/thread-id-context.cjs +5 -5
  601. package/dist/threads/thread-id-context.cjs.map +1 -1
  602. package/dist/threads/use-athena-session-attention.cjs +2 -2
  603. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  604. package/dist/threads/use-athena-sessions.cjs +10 -10
  605. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  606. package/dist/threads/use-athena-thread-model.cjs +3 -3
  607. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  608. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  609. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  610. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  611. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  612. package/dist/threads/use-thread-archive.cjs +9 -9
  613. package/dist/threads/use-thread-archive.cjs.map +1 -1
  614. package/dist/threads/use-thread-favorite.cjs +2 -2
  615. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  616. package/dist/threads/use-thread-field-override.cjs +20 -20
  617. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  618. package/dist/threads/use-thread-read-state.cjs +4 -4
  619. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  620. package/dist/threads/use-thread-rename.cjs +2 -2
  621. package/dist/threads/use-thread-rename.cjs.map +1 -1
  622. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  623. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  624. package/dist/tools/NestedPtcMessages.cjs +6 -6
  625. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  626. package/dist/tools/append-document-tool-ui.cjs +7 -7
  627. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  628. package/dist/tools/file-tool-uis.cjs +2 -2
  629. package/dist/tools/file-tool-uis.cjs.map +1 -1
  630. package/dist/tools/misc-tool-uis.cjs +2 -2
  631. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  632. package/dist/tools/primitives.cjs +6 -6
  633. package/dist/tools/primitives.cjs.map +1 -1
  634. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  635. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  636. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  637. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  638. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  639. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  640. package/dist/tools/todo-plan-store.cjs +4 -4
  641. package/dist/tools/todo-plan-store.cjs.map +1 -1
  642. package/dist/tools/tool-appearance.cjs +3 -3
  643. package/dist/tools/tool-appearance.cjs.map +1 -1
  644. package/dist/tools/tool-fallback.cjs +14 -14
  645. package/dist/tools/tool-fallback.cjs.map +1 -1
  646. package/dist/tools/tool-summary.cjs +0 -2
  647. package/dist/tools/tool-summary.cjs.map +1 -1
  648. package/dist/tools/tool-summary.js +0 -2
  649. package/dist/tools/tool-summary.js.map +1 -1
  650. package/dist/tools/tool-uis.cjs +74 -74
  651. package/dist/tools/tool-uis.cjs.map +1 -1
  652. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  653. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  654. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  655. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  656. package/dist/ui/image-viewer.cjs +382 -0
  657. package/dist/ui/image-viewer.cjs.map +1 -0
  658. package/dist/ui/image-viewer.d.ts +50 -0
  659. package/dist/ui/image-viewer.js +382 -0
  660. package/dist/ui/image-viewer.js.map +1 -0
  661. package/dist/voice/chat.cjs +6 -0
  662. package/dist/voice/chat.cjs.map +1 -1
  663. package/dist/voice/chat.d.ts +1 -1
  664. package/dist/voice/chat.js +8 -2
  665. package/dist/voice/livekit-join.cjs +52 -101
  666. package/dist/voice/livekit-join.cjs.map +1 -1
  667. package/dist/voice/livekit-join.d.ts +1 -6
  668. package/dist/voice/livekit-join.js +52 -101
  669. package/dist/voice/livekit-join.js.map +1 -1
  670. package/dist/voice/livekit.cjs.map +1 -1
  671. package/dist/voice/livekit.d.ts +11 -1
  672. package/dist/voice/livekit.js.map +1 -1
  673. package/dist/voice/use-athena-voice-session.cjs +34 -34
  674. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  675. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  676. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  677. package/dist/workbench/SessionWorkbench.cjs +22 -22
  678. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  679. package/dist/workbench/session-workbench-context.cjs +3 -3
  680. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  681. package/dist/workbench/session-workbench-panes.cjs +8 -8
  682. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  683. package/dist/workbench/workbench-layout-context.cjs +3 -3
  684. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  685. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SessionWorkbench.cjs","sources":["../../src/workbench/SessionWorkbench.tsx"],"sourcesContent":["\"use client\";\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { readDeepAgentStreamValues } from '@athenaintel/agent-runtime';\nimport { QueryClientProvider, useQueryClient } from '@tanstack/react-query';\nimport {\n LayersIcon,\n Maximize2Icon,\n Minimize2Icon,\n PanelRightCloseIcon,\n PanelRightOpenIcon,\n PlusIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport {\n type FC,\n type KeyboardEvent,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport { useAssetPanelStore } from '../assets/asset-panel-store';\nimport { AssetPanel } from '../assets/AssetPanel';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { cn } from '../lib/utils';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { AthenaStatewireThreadIdContext } from '../threads/thread-id-context';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport {\n type SessionWorkbenchPane,\n type SessionWorkbenchPaneContext,\n SessionWorkbenchContext,\n} from './session-workbench-context';\nimport {\n filterWorkbenchPanes,\n threadTabs,\n visibleThreadTabs,\n type WorkbenchThreadTabs,\n workbenchTabsReducer,\n} from './session-workbench-model';\nimport {\n DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS,\n DEFAULT_SESSION_WORKBENCH_PANES,\n} from './session-workbench-panes';\nimport { SESSION_WORKSPACE_QUERY_KEY } from './use-session-workspace';\nimport { useWorkbenchLayout } from './workbench-layout-context';\n\n/** The tab `AthenaLayout`'s workbench shows the open assets in. */\nexport const SESSION_WORKBENCH_ASSETS_PANE_ID = 'open-assets';\n\nconst OPEN_ASSETS_PANE: SessionWorkbenchPane = {\n id: SESSION_WORKBENCH_ASSETS_PANE_ID,\n title: 'Open assets',\n description: 'The documents, sheets and decks open in this session',\n icon: LayersIcon,\n render: () => <AssetPanel manageAssetPanelHostRegistration={false} />,\n};\n\nexport interface SessionWorkbenchProps {\n /**\n * The panes the \"+\" menu offers, in order. Defaults to the built-in Tasks,\n * Shell, Computer, Pull requests and Attachments\n * (`DEFAULT_SESSION_WORKBENCH_PANES`); spread it to add your own.\n */\n panes?: readonly SessionWorkbenchPane[];\n /**\n * The panes a thread opens with until the person changes its tabs (ids from\n * `panes`; unknown ids are ignored). Defaults to Tasks, Shell and Computer.\n */\n defaultOpenPaneIds?: readonly string[];\n className?: string;\n}\n\nconst ICON_BUTTON_CLASS =\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring/60';\n\n/**\n * A Devin-style workspace pane for the active session: a tab strip of panes\n * (Tasks, Shell, Computer, Pull requests, Attachments — and any the host\n * adds), a \"+\" menu to open more, closable tabs, and a collapse to a rail.\n *\n * Mount it inside `<AthenaProvider>` — as `AthenaLayout`'s `workbench` for a\n * resizable right-hand column, or anywhere in your own layout. Each thread\n * keeps its own open tabs, and whether the workspace is open or collapsed,\n * while the workbench stays mounted (in memory only); a thread it has not seen\n * opens `defaultOpenPaneIds`, collapsed when the layout's\n * `defaultWorkbenchCollapsed` says so. In `AthenaLayout`, the assets the agent\n * or the person opens show here too, as an \"Open assets\" tab.\n */\nexport const SessionWorkbench: FC<SessionWorkbenchProps> = (props) => {\n // One client for every pane, so the workspace read several panes share is\n // fetched once even when the host provides no QueryClient.\n const queryClient = useAthenaQueryClient();\n return (\n <QueryClientProvider client={queryClient}>\n <SessionWorkbenchInner {...props} />\n </QueryClientProvider>\n );\n};\n\nconst SessionWorkbenchInner: FC<SessionWorkbenchProps> = ({\n panes = DEFAULT_SESSION_WORKBENCH_PANES,\n defaultOpenPaneIds = DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS,\n className,\n}) => {\n const layout = useWorkbenchLayout();\n const [ownCollapsed, setOwnCollapsed] = useState(false);\n const collapsed = layout ? layout.collapsed : ownCollapsed;\n const setCollapsed = layout ? layout.setCollapsed : setOwnCollapsed;\n // Only a hosting layout can give the workbench the chat's width.\n const maximized = layout?.maximized ?? false;\n const setMaximized = layout?.setMaximized;\n const hostsAssetPanel = layout?.hostsAssetPanel ?? false;\n\n const threadId = useContext(AthenaStatewireThreadIdContext);\n const threadList = useAthenaStatewireThreadList();\n const hasMessages = useAuiState((state) => state.thread.messages.length > 0);\n // The attach snapshot says whether the backend minted the thread's session\n // (`sessionPersisted`) — true for an existing thread before any message.\n const sessionPersisted = useAuiState(\n (state) =>\n readDeepAgentStreamValues((state.thread.extras as { state?: unknown } | undefined)?.state)\n .sessionPersisted,\n );\n const isRunning = useAuiState(\n (state) => (state.thread.extras as { status?: unknown } | undefined)?.status === 'running',\n );\n // In thread-list mode the list knows whether the backend has the thread; a\n // single-thread provider's thread is known once the host says its session\n // exists, or once it has history (a host that predates the flag).\n const isPersisted = threadList\n ? !threadList.isNewChat\n : sessionPersisted === true || hasMessages;\n const paneContext = useMemo<SessionWorkbenchPaneContext>(\n () => ({ threadId, isPersisted, isRunning, isVisible: !collapsed }),\n [threadId, isPersisted, isRunning, collapsed],\n );\n\n // Polling stops with the run; read the workspace once more as it settles so\n // what the run's last steps created shows without waiting for a refocus.\n const queryClient = useQueryClient();\n const wasRunning = useRef(isRunning);\n useEffect(() => {\n if (wasRunning.current && !isRunning) {\n void queryClient.invalidateQueries({ queryKey: SESSION_WORKSPACE_QUERY_KEY });\n }\n wasRunning.current = isRunning;\n }, [isRunning, queryClient]);\n\n const assetPanelOpen = useAssetPanelStore((state) => state.isOpen);\n const closeAssetPanel = useAssetPanelStore((state) => state.closePanel);\n const allPanes = useMemo<readonly SessionWorkbenchPane[]>(\n () => (hostsAssetPanel && assetPanelOpen ? [...panes, OPEN_ASSETS_PANE] : panes),\n [assetPanelOpen, hostsAssetPanel, panes],\n );\n const paneById = useMemo(() => new Map(allPanes.map((pane) => [pane.id, pane])), [allPanes]);\n const paneIds = useMemo(() => new Set(paneById.keys()), [paneById]);\n\n const defaults = useMemo<WorkbenchThreadTabs>(() => {\n const open = defaultOpenPaneIds.filter((id) => panes.some((pane) => pane.id === id));\n return { open, active: open[0] ?? null };\n }, [defaultOpenPaneIds, panes]);\n const [tabsState, dispatchTabs] = useReducer(workbenchTabsReducer, {});\n const threadKey = threadId ?? '';\n\n // Whether the workspace is open is kept per thread, like its tabs: a thread\n // the person has not opened or collapsed it in shows the layout's default (a\n // new session, or one switched to), so one session's open workspace never\n // follows the person into the next. Applied before paint, so a switch never\n // flashes the previous thread's state.\n const defaultCollapsed = layout?.defaultCollapsed ?? false;\n const collapsedByThread = useRef(new Map<string, boolean>());\n const setThreadCollapsed = (next: boolean) => {\n collapsedByThread.current.set(threadKey, next);\n setCollapsed(next);\n };\n useLayoutEffect(() => {\n setCollapsed(collapsedByThread.current.get(threadKey) ?? defaultCollapsed);\n }, [threadKey, defaultCollapsed, setCollapsed]);\n let tabs = visibleThreadTabs(threadTabs(tabsState, threadKey, defaults), paneIds);\n // Assets already open when the workbench mounts (or when a thread with open\n // assets comes back) show their tab without an opening to react to.\n if (\n paneIds.has(SESSION_WORKBENCH_ASSETS_PANE_ID) &&\n !tabs.open.includes(SESSION_WORKBENCH_ASSETS_PANE_ID)\n ) {\n tabs = {\n open: [...tabs.open, SESSION_WORKBENCH_ASSETS_PANE_ID],\n active: tabs.active ?? SESSION_WORKBENCH_ASSETS_PANE_ID,\n };\n }\n\n // An asset opening (a tool card, a citation, the Attachments pane) brings\n // the \"Open assets\" tab forward and the workbench out of its rail. A thread\n // switch restoring that thread's open assets (`setCurrentThread`) is not an\n // opening: the thread keeps the pane it had selected. Read through refs:\n // the store notifies outside React's render.\n const latest = useRef({ threadKey, defaults, setCollapsed });\n latest.current = { threadKey, defaults, setCollapsed };\n useEffect(() => {\n if (!hostsAssetPanel) return undefined;\n return useAssetPanelStore.subscribe((state, previous) => {\n if (state.currentThreadId !== previous.currentThreadId) return;\n // Every open request, a repeat click on the asset already showing too.\n if (!state.isOpen || state.openRequestSeq === previous.openRequestSeq) return;\n dispatchTabs({\n type: 'open',\n threadKey: latest.current.threadKey,\n paneId: SESSION_WORKBENCH_ASSETS_PANE_ID,\n defaults: latest.current.defaults,\n });\n collapsedByThread.current.set(latest.current.threadKey, false);\n latest.current.setCollapsed(false);\n });\n }, [hostsAssetPanel]);\n\n // Showing a tab the strip renders is an `open`: it activates a stored tab\n // and records one the strip only derived (the \"Open assets\" tab above).\n const openPane = (paneId: string) =>\n dispatchTabs({ type: 'open', threadKey, paneId, defaults });\n const activatePane = openPane;\n const closePane = (paneId: string) => {\n if (paneId === SESSION_WORKBENCH_ASSETS_PANE_ID) closeAssetPanel();\n dispatchTabs({ type: 'close', threadKey, paneId, defaults });\n };\n\n const baseId = useId();\n const tabId = (paneId: string) => `${baseId}-tab-${paneId}`;\n const panelId = `${baseId}-panel`;\n\n const onTabKeyDown = (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const step = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (step === 0 || tabs.open.length === 0) return;\n event.preventDefault();\n const nextId = tabs.open[(index + step + tabs.open.length) % tabs.open.length];\n if (!nextId) return;\n activatePane(nextId);\n event.currentTarget.ownerDocument.getElementById(tabId(nextId))?.focus();\n };\n\n const activePane = tabs.active ? paneById.get(tabs.active) : undefined;\n const assetsPane = paneById.get(SESSION_WORKBENCH_ASSETS_PANE_ID);\n const assetsActive = activePane?.id === SESSION_WORKBENCH_ASSETS_PANE_ID;\n\n // One tree for both states: the panel stays mounted (hidden) while the\n // workbench is a rail, and the open assets stay mounted (hidden) while\n // another pane shows — their iframes keep their editing session, as the\n // asset panel's own tabs do.\n return (\n <SessionWorkbenchContext.Provider value={paneContext}>\n <aside\n aria-label=\"Session workspace\"\n className={cn(\n 'athena-sdk-chrome flex h-full flex-col border-border border-l bg-background',\n collapsed ? 'w-10 shrink-0 items-center gap-1 py-2' : 'min-h-0 w-full min-w-0',\n className,\n )}\n >\n {collapsed ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Expand workspace\"\n title=\"Expand workspace\"\n onClick={() => setThreadCollapsed(false)}\n className={ICON_BUTTON_CLASS}\n >\n <PanelRightOpenIcon className=\"size-4\" />\n </button>\n {tabs.open.map((paneId) => {\n const pane = paneById.get(paneId);\n if (!pane) return null;\n const Icon = pane.icon ?? LayersIcon;\n return (\n <button\n key={paneId}\n type=\"button\"\n aria-label={`Show ${pane.title}`}\n title={pane.title}\n onClick={() => {\n activatePane(paneId);\n setThreadCollapsed(false);\n }}\n className={cn(\n ICON_BUTTON_CLASS,\n paneId === tabs.active && 'bg-muted text-foreground',\n )}\n >\n <Icon className=\"size-4\" />\n </button>\n );\n })}\n </>\n ) : (\n <div className=\"flex h-11 w-full shrink-0 items-center gap-1 border-border border-b pr-1.5 pl-2\">\n <div\n role=\"tablist\"\n aria-label=\"Workspace panes\"\n className=\"flex min-w-0 items-center gap-1 overflow-x-auto [scrollbar-width:none]\"\n >\n {tabs.open.map((paneId, index) => {\n const pane = paneById.get(paneId);\n if (!pane) return null;\n const Icon = pane.icon;\n const selected = paneId === tabs.active;\n return (\n <div\n key={paneId}\n data-selected={selected ? '' : undefined}\n className={cn(\n 'group/tab flex h-7 shrink-0 items-center rounded-md text-[13px] transition-colors',\n selected\n ? 'bg-foreground/[0.06] text-foreground'\n : 'text-muted-foreground hover:bg-foreground/[0.04] hover:text-foreground',\n )}\n >\n <button\n type=\"button\"\n role=\"tab\"\n id={tabId(paneId)}\n aria-selected={selected}\n aria-controls={panelId}\n tabIndex={selected ? 0 : -1}\n onClick={() => activatePane(paneId)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n className=\"flex h-full items-center gap-1.5 rounded-md pr-1 pl-2 outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n >\n {Icon ? <Icon className=\"size-3.5\" /> : null}\n {pane.title}\n </button>\n {/* Quiet until the tab is hovered, focused or selected, as in Devin's strip. */}\n <button\n type=\"button\"\n aria-label={`Close ${pane.title}`}\n title={`Close ${pane.title}`}\n onClick={() => closePane(paneId)}\n className={cn(\n 'mr-1 rounded p-0.5 transition-opacity hover:bg-background hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60',\n selected ? 'opacity-60' : 'opacity-0 group-hover/tab:opacity-60',\n )}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n <AddPaneMenu panes={allPanes} openIds={tabs.open} onOpen={openPane} />\n <div className=\"min-w-0 flex-1\" />\n {setMaximized ? (\n <button\n type=\"button\"\n aria-label={maximized ? 'Restore workspace' : 'Maximize workspace'}\n title={maximized ? 'Restore workspace' : 'Maximize workspace'}\n aria-pressed={maximized}\n onClick={() => setMaximized(!maximized)}\n className={ICON_BUTTON_CLASS}\n >\n {maximized ? <Minimize2Icon className=\"size-4\" /> : <Maximize2Icon className=\"size-4\" />}\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label=\"Collapse workspace\"\n title=\"Collapse workspace\"\n onClick={() => setThreadCollapsed(true)}\n className={ICON_BUTTON_CLASS}\n >\n <PanelRightCloseIcon className=\"size-4\" />\n </button>\n </div>\n )}\n <div\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={activePane ? tabId(activePane.id) : undefined}\n className={cn(\n 'min-h-0 w-full flex-1',\n assetsActive ? 'flex flex-col' : 'overflow-y-auto',\n collapsed && 'hidden',\n )}\n >\n {assetsActive ? null : activePane ? (\n activePane.render(paneContext)\n ) : (\n <NoOpenPane panes={allPanes} onOpen={openPane} />\n )}\n {assetsPane ? (\n <div\n key={SESSION_WORKBENCH_ASSETS_PANE_ID}\n data-workbench-assets=\"\"\n className={cn(assetsActive ? 'flex min-h-0 flex-1 flex-col' : 'hidden')}\n >\n {assetsPane.render(paneContext)}\n </div>\n ) : null}\n </div>\n </aside>\n </SessionWorkbenchContext.Provider>\n );\n};\n\nconst PaneMenuItems: FC<{\n panes: readonly SessionWorkbenchPane[];\n openIds: readonly string[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, openIds, onOpen }) => (\n <ul className=\"flex flex-col\">\n {panes.map((pane) => {\n const Icon = pane.icon ?? LayersIcon;\n const isOpen = openIds.includes(pane.id);\n return (\n <li key={pane.id}>\n <button\n type=\"button\"\n title={pane.description}\n onClick={() => onOpen(pane.id)}\n className=\"flex h-[30px] w-full items-center gap-2 rounded-md px-2 text-left text-[13px] transition-colors hover:bg-muted focus-visible:bg-muted focus-visible:outline-none\"\n >\n <Icon className=\"size-4 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{pane.title}</span>\n {isOpen ? <span className=\"text-[11px] text-muted-foreground\">Open</span> : null}\n </button>\n </li>\n );\n })}\n </ul>\n);\n\nconst AddPaneMenu: FC<{\n panes: readonly SessionWorkbenchPane[];\n openIds: readonly string[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, openIds, onOpen }) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const shown = filterWorkbenchPanes(panes, query);\n const choose = (paneId: string) => {\n onOpen(paneId);\n setOpen(false);\n setQuery('');\n };\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery('');\n }}\n >\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label=\"Open a pane\" title=\"Open a pane\" className={ICON_BUTTON_CLASS}>\n <PlusIcon className=\"size-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-56 p-1\" aria-label=\"Panes\">\n <div className=\"flex items-center gap-2 border-border border-b px-2 pb-1.5 pt-1\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n // biome-ignore lint/a11y/noAutofocus: the menu opens to type into, as a command menu does.\n autoFocus\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n const first = shown[0];\n if (event.key === 'Enter' && first) {\n event.preventDefault();\n choose(first.id);\n }\n }}\n placeholder=\"Search\"\n aria-label=\"Search panes\"\n className=\"h-7 min-w-0 flex-1 bg-transparent text-[13px] outline-none placeholder:text-muted-foreground\"\n />\n </div>\n <div className=\"pt-1\">\n {shown.length > 0 ? (\n <PaneMenuItems panes={shown} openIds={openIds} onOpen={choose} />\n ) : (\n <p className=\"px-2 py-1.5 text-[13px] text-muted-foreground\">No pane matches.</p>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n\n/** Nothing open: every pane the \"+\" menu offers, with what each shows, centred in the column. */\nconst NoOpenPane: FC<{\n panes: readonly SessionWorkbenchPane[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, onOpen }) => (\n <div className=\"flex min-h-full items-center justify-center p-6\">\n <ul aria-label=\"Available panes\" className=\"flex w-full max-w-xs flex-col gap-1\">\n {panes.map((pane) => {\n const Icon = pane.icon ?? LayersIcon;\n return (\n <li key={pane.id}>\n <button\n type=\"button\"\n onClick={() => onOpen(pane.id)}\n className=\"flex w-full items-start gap-3 rounded-lg px-3 py-2 text-left transition-colors hover:bg-muted focus-visible:bg-muted focus-visible:outline-none\"\n >\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"text-[13px] text-foreground\">{pane.title}</span>\n {pane.description ? (\n <span className=\"text-muted-foreground text-xs\">{pane.description}</span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n);\n"],"names":["LayersIcon","jsx","AssetPanel","useAthenaQueryClient","QueryClientProvider","DEFAULT_SESSION_WORKBENCH_PANES","DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS","useWorkbenchLayout","useState","useContext","AthenaStatewireThreadIdContext","useAthenaStatewireThreadList","useAuiState","readDeepAgentStreamValues","useMemo","useQueryClient","useRef","useEffect","SESSION_WORKSPACE_QUERY_KEY","useAssetPanelStore","useReducer","workbenchTabsReducer","useLayoutEffect","visibleThreadTabs","threadTabs","useId","SessionWorkbenchContext","jsxs","cn","Fragment","PanelRightOpenIcon","XIcon","Minimize2Icon","Maximize2Icon","PanelRightCloseIcon","filterWorkbenchPanes","Popover","PopoverTrigger","PlusIcon","PopoverContent","SearchIcon"],"mappings":"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"}
1
+ {"version":3,"file":"SessionWorkbench.cjs","sources":["../../src/workbench/SessionWorkbench.tsx"],"sourcesContent":["\"use client\";\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { readDeepAgentStreamValues } from '@athenaintel/agent-runtime';\nimport { QueryClientProvider, useQueryClient } from '@tanstack/react-query';\nimport {\n LayersIcon,\n Maximize2Icon,\n Minimize2Icon,\n PanelRightCloseIcon,\n PanelRightOpenIcon,\n PlusIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport {\n type FC,\n type KeyboardEvent,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport { useAssetPanelStore } from '../assets/asset-panel-store';\nimport { AssetPanel } from '../assets/AssetPanel';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { cn } from '../lib/utils';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { AthenaStatewireThreadIdContext } from '../threads/thread-id-context';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport {\n type SessionWorkbenchPane,\n type SessionWorkbenchPaneContext,\n SessionWorkbenchContext,\n} from './session-workbench-context';\nimport {\n filterWorkbenchPanes,\n threadTabs,\n visibleThreadTabs,\n type WorkbenchThreadTabs,\n workbenchTabsReducer,\n} from './session-workbench-model';\nimport {\n DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS,\n DEFAULT_SESSION_WORKBENCH_PANES,\n} from './session-workbench-panes';\nimport { SESSION_WORKSPACE_QUERY_KEY } from './use-session-workspace';\nimport { useWorkbenchLayout } from './workbench-layout-context';\n\n/** The tab `AthenaLayout`'s workbench shows the open assets in. */\nexport const SESSION_WORKBENCH_ASSETS_PANE_ID = 'open-assets';\n\nconst OPEN_ASSETS_PANE: SessionWorkbenchPane = {\n id: SESSION_WORKBENCH_ASSETS_PANE_ID,\n title: 'Open assets',\n description: 'The documents, sheets and decks open in this session',\n icon: LayersIcon,\n render: () => <AssetPanel manageAssetPanelHostRegistration={false} />,\n};\n\nexport interface SessionWorkbenchProps {\n /**\n * The panes the \"+\" menu offers, in order. Defaults to the built-in Tasks,\n * Shell, Computer, Pull requests and Attachments\n * (`DEFAULT_SESSION_WORKBENCH_PANES`); spread it to add your own.\n */\n panes?: readonly SessionWorkbenchPane[];\n /**\n * The panes a thread opens with until the person changes its tabs (ids from\n * `panes`; unknown ids are ignored). Defaults to Tasks, Shell and Computer.\n */\n defaultOpenPaneIds?: readonly string[];\n className?: string;\n}\n\nconst ICON_BUTTON_CLASS =\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring/60';\n\n/**\n * A Devin-style workspace pane for the active session: a tab strip of panes\n * (Tasks, Shell, Computer, Pull requests, Attachments — and any the host\n * adds), a \"+\" menu to open more, closable tabs, and a collapse to a rail.\n *\n * Mount it inside `<AthenaProvider>` — as `AthenaLayout`'s `workbench` for a\n * resizable right-hand column, or anywhere in your own layout. Each thread\n * keeps its own open tabs, and whether the workspace is open or collapsed,\n * while the workbench stays mounted (in memory only); a thread it has not seen\n * opens `defaultOpenPaneIds`, collapsed when the layout's\n * `defaultWorkbenchCollapsed` says so. In `AthenaLayout`, the assets the agent\n * or the person opens show here too, as an \"Open assets\" tab.\n */\nexport const SessionWorkbench: FC<SessionWorkbenchProps> = (props) => {\n // One client for every pane, so the workspace read several panes share is\n // fetched once even when the host provides no QueryClient.\n const queryClient = useAthenaQueryClient();\n return (\n <QueryClientProvider client={queryClient}>\n <SessionWorkbenchInner {...props} />\n </QueryClientProvider>\n );\n};\n\nconst SessionWorkbenchInner: FC<SessionWorkbenchProps> = ({\n panes = DEFAULT_SESSION_WORKBENCH_PANES,\n defaultOpenPaneIds = DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS,\n className,\n}) => {\n const layout = useWorkbenchLayout();\n const [ownCollapsed, setOwnCollapsed] = useState(false);\n const collapsed = layout ? layout.collapsed : ownCollapsed;\n const setCollapsed = layout ? layout.setCollapsed : setOwnCollapsed;\n // Only a hosting layout can give the workbench the chat's width.\n const maximized = layout?.maximized ?? false;\n const setMaximized = layout?.setMaximized;\n const hostsAssetPanel = layout?.hostsAssetPanel ?? false;\n\n const threadId = useContext(AthenaStatewireThreadIdContext);\n const threadList = useAthenaStatewireThreadList();\n const hasMessages = useAuiState((state) => state.thread.messages.length > 0);\n // The attach snapshot says whether the backend minted the thread's session\n // (`sessionPersisted`) — true for an existing thread before any message.\n const sessionPersisted = useAuiState(\n (state) =>\n readDeepAgentStreamValues((state.thread.extras as { state?: unknown } | undefined)?.state)\n .sessionPersisted,\n );\n const isRunning = useAuiState(\n (state) => (state.thread.extras as { status?: unknown } | undefined)?.status === 'running',\n );\n // In thread-list mode the list knows whether the backend has the thread; a\n // single-thread provider's thread is known once the host says its session\n // exists, or once it has history (a host that predates the flag).\n const isPersisted = threadList\n ? !threadList.isNewChat\n : sessionPersisted === true || hasMessages;\n const paneContext = useMemo<SessionWorkbenchPaneContext>(\n () => ({ threadId, isPersisted, isRunning, isVisible: !collapsed }),\n [threadId, isPersisted, isRunning, collapsed],\n );\n\n // Polling stops with the run; read the workspace once more as it settles so\n // what the run's last steps created shows without waiting for a refocus.\n const queryClient = useQueryClient();\n const wasRunning = useRef(isRunning);\n useEffect(() => {\n if (wasRunning.current && !isRunning) {\n void queryClient.invalidateQueries({ queryKey: SESSION_WORKSPACE_QUERY_KEY });\n }\n wasRunning.current = isRunning;\n }, [isRunning, queryClient]);\n\n const assetPanelOpen = useAssetPanelStore((state) => state.isOpen);\n const closeAssetPanel = useAssetPanelStore((state) => state.closePanel);\n const allPanes = useMemo<readonly SessionWorkbenchPane[]>(\n () => (hostsAssetPanel && assetPanelOpen ? [...panes, OPEN_ASSETS_PANE] : panes),\n [assetPanelOpen, hostsAssetPanel, panes],\n );\n const paneById = useMemo(() => new Map(allPanes.map((pane) => [pane.id, pane])), [allPanes]);\n const paneIds = useMemo(() => new Set(paneById.keys()), [paneById]);\n\n const defaults = useMemo<WorkbenchThreadTabs>(() => {\n const open = defaultOpenPaneIds.filter((id) => panes.some((pane) => pane.id === id));\n return { open, active: open[0] ?? null };\n }, [defaultOpenPaneIds, panes]);\n const [tabsState, dispatchTabs] = useReducer(workbenchTabsReducer, {});\n const threadKey = threadId ?? '';\n\n // Whether the workspace is open is kept per thread, like its tabs: a thread\n // the person has not opened or collapsed it in shows the layout's default (a\n // new session, or one switched to), so one session's open workspace never\n // follows the person into the next. Applied before paint, so a switch never\n // flashes the previous thread's state.\n const defaultCollapsed = layout?.defaultCollapsed ?? false;\n const collapsedByThread = useRef(new Map<string, boolean>());\n const setThreadCollapsed = (next: boolean) => {\n collapsedByThread.current.set(threadKey, next);\n setCollapsed(next);\n };\n useLayoutEffect(() => {\n setCollapsed(collapsedByThread.current.get(threadKey) ?? defaultCollapsed);\n }, [threadKey, defaultCollapsed, setCollapsed]);\n let tabs = visibleThreadTabs(threadTabs(tabsState, threadKey, defaults), paneIds);\n // Assets already open when the workbench mounts (or when a thread with open\n // assets comes back) show their tab without an opening to react to.\n if (\n paneIds.has(SESSION_WORKBENCH_ASSETS_PANE_ID) &&\n !tabs.open.includes(SESSION_WORKBENCH_ASSETS_PANE_ID)\n ) {\n tabs = {\n open: [...tabs.open, SESSION_WORKBENCH_ASSETS_PANE_ID],\n active: tabs.active ?? SESSION_WORKBENCH_ASSETS_PANE_ID,\n };\n }\n\n // An asset opening (a tool card, a citation, the Attachments pane) brings\n // the \"Open assets\" tab forward and the workbench out of its rail. A thread\n // switch restoring that thread's open assets (`setCurrentThread`) is not an\n // opening: the thread keeps the pane it had selected. Read through refs:\n // the store notifies outside React's render.\n const latest = useRef({ threadKey, defaults, setCollapsed });\n latest.current = { threadKey, defaults, setCollapsed };\n useEffect(() => {\n if (!hostsAssetPanel) return undefined;\n return useAssetPanelStore.subscribe((state, previous) => {\n if (state.currentThreadId !== previous.currentThreadId) return;\n // Every open request, a repeat click on the asset already showing too.\n if (!state.isOpen || state.openRequestSeq === previous.openRequestSeq) return;\n dispatchTabs({\n type: 'open',\n threadKey: latest.current.threadKey,\n paneId: SESSION_WORKBENCH_ASSETS_PANE_ID,\n defaults: latest.current.defaults,\n });\n collapsedByThread.current.set(latest.current.threadKey, false);\n latest.current.setCollapsed(false);\n });\n }, [hostsAssetPanel]);\n\n // Showing a tab the strip renders is an `open`: it activates a stored tab\n // and records one the strip only derived (the \"Open assets\" tab above).\n const openPane = (paneId: string) =>\n dispatchTabs({ type: 'open', threadKey, paneId, defaults });\n const activatePane = openPane;\n const closePane = (paneId: string) => {\n if (paneId === SESSION_WORKBENCH_ASSETS_PANE_ID) closeAssetPanel();\n dispatchTabs({ type: 'close', threadKey, paneId, defaults });\n };\n\n const baseId = useId();\n const tabId = (paneId: string) => `${baseId}-tab-${paneId}`;\n const panelId = `${baseId}-panel`;\n\n const onTabKeyDown = (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const step = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (step === 0 || tabs.open.length === 0) return;\n event.preventDefault();\n const nextId = tabs.open[(index + step + tabs.open.length) % tabs.open.length];\n if (!nextId) return;\n activatePane(nextId);\n event.currentTarget.ownerDocument.getElementById(tabId(nextId))?.focus();\n };\n\n const activePane = tabs.active ? paneById.get(tabs.active) : undefined;\n const assetsPane = paneById.get(SESSION_WORKBENCH_ASSETS_PANE_ID);\n const assetsActive = activePane?.id === SESSION_WORKBENCH_ASSETS_PANE_ID;\n\n // One tree for both states: the panel stays mounted (hidden) while the\n // workbench is a rail, and the open assets stay mounted (hidden) while\n // another pane shows — their iframes keep their editing session, as the\n // asset panel's own tabs do.\n return (\n <SessionWorkbenchContext.Provider value={paneContext}>\n <aside\n aria-label=\"Session workspace\"\n className={cn(\n 'athena-sdk-chrome flex h-full flex-col border-border border-l bg-background',\n collapsed ? 'w-10 shrink-0 items-center gap-1 py-2' : 'min-h-0 w-full min-w-0',\n className,\n )}\n >\n {collapsed ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Expand workspace\"\n title=\"Expand workspace\"\n onClick={() => setThreadCollapsed(false)}\n className={ICON_BUTTON_CLASS}\n >\n <PanelRightOpenIcon className=\"size-4\" />\n </button>\n {tabs.open.map((paneId) => {\n const pane = paneById.get(paneId);\n if (!pane) return null;\n const Icon = pane.icon ?? LayersIcon;\n return (\n <button\n key={paneId}\n type=\"button\"\n aria-label={`Show ${pane.title}`}\n title={pane.title}\n onClick={() => {\n activatePane(paneId);\n setThreadCollapsed(false);\n }}\n className={cn(\n ICON_BUTTON_CLASS,\n paneId === tabs.active && 'bg-muted text-foreground',\n )}\n >\n <Icon className=\"size-4\" />\n </button>\n );\n })}\n </>\n ) : (\n <div className=\"flex h-11 w-full shrink-0 items-center gap-1 border-border border-b pr-1.5 pl-2\">\n <div\n role=\"tablist\"\n aria-label=\"Workspace panes\"\n className=\"flex min-w-0 items-center gap-1 overflow-x-auto [scrollbar-width:none]\"\n >\n {tabs.open.map((paneId, index) => {\n const pane = paneById.get(paneId);\n if (!pane) return null;\n const Icon = pane.icon;\n const selected = paneId === tabs.active;\n return (\n <div\n key={paneId}\n data-selected={selected ? '' : undefined}\n className={cn(\n 'group/tab flex h-7 shrink-0 items-center rounded-md text-[13px] transition-colors',\n selected\n ? 'bg-foreground/[0.06] text-foreground'\n : 'text-muted-foreground hover:bg-foreground/[0.04] hover:text-foreground',\n )}\n >\n <button\n type=\"button\"\n role=\"tab\"\n id={tabId(paneId)}\n aria-selected={selected}\n aria-controls={panelId}\n tabIndex={selected ? 0 : -1}\n onClick={() => activatePane(paneId)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n className=\"flex h-full items-center gap-1.5 rounded-md pr-1 pl-2 outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n >\n {Icon ? <Icon className=\"size-3.5\" /> : null}\n {pane.title}\n </button>\n {/* Quiet until the tab is hovered, focused or selected, as in Devin's strip. */}\n <button\n type=\"button\"\n aria-label={`Close ${pane.title}`}\n title={`Close ${pane.title}`}\n onClick={() => closePane(paneId)}\n className={cn(\n 'mr-1 rounded p-0.5 transition-opacity hover:bg-background hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60',\n selected ? 'opacity-60' : 'opacity-0 group-hover/tab:opacity-60',\n )}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n <AddPaneMenu panes={allPanes} openIds={tabs.open} onOpen={openPane} />\n <div className=\"min-w-0 flex-1\" />\n {setMaximized ? (\n <button\n type=\"button\"\n aria-label={maximized ? 'Restore workspace' : 'Maximize workspace'}\n title={maximized ? 'Restore workspace' : 'Maximize workspace'}\n aria-pressed={maximized}\n onClick={() => setMaximized(!maximized)}\n className={ICON_BUTTON_CLASS}\n >\n {maximized ? <Minimize2Icon className=\"size-4\" /> : <Maximize2Icon className=\"size-4\" />}\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label=\"Collapse workspace\"\n title=\"Collapse workspace\"\n onClick={() => setThreadCollapsed(true)}\n className={ICON_BUTTON_CLASS}\n >\n <PanelRightCloseIcon className=\"size-4\" />\n </button>\n </div>\n )}\n <div\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={activePane ? tabId(activePane.id) : undefined}\n className={cn(\n 'min-h-0 w-full flex-1',\n assetsActive ? 'flex flex-col' : 'overflow-y-auto',\n collapsed && 'hidden',\n )}\n >\n {assetsActive ? null : activePane ? (\n activePane.render(paneContext)\n ) : (\n <NoOpenPane panes={allPanes} onOpen={openPane} />\n )}\n {assetsPane ? (\n <div\n key={SESSION_WORKBENCH_ASSETS_PANE_ID}\n data-workbench-assets=\"\"\n className={cn(assetsActive ? 'flex min-h-0 flex-1 flex-col' : 'hidden')}\n >\n {assetsPane.render(paneContext)}\n </div>\n ) : null}\n </div>\n </aside>\n </SessionWorkbenchContext.Provider>\n );\n};\n\nconst PaneMenuItems: FC<{\n panes: readonly SessionWorkbenchPane[];\n openIds: readonly string[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, openIds, onOpen }) => (\n <ul className=\"flex flex-col\">\n {panes.map((pane) => {\n const Icon = pane.icon ?? LayersIcon;\n const isOpen = openIds.includes(pane.id);\n return (\n <li key={pane.id}>\n <button\n type=\"button\"\n title={pane.description}\n onClick={() => onOpen(pane.id)}\n className=\"flex h-[30px] w-full items-center gap-2 rounded-md px-2 text-left text-[13px] transition-colors hover:bg-muted focus-visible:bg-muted focus-visible:outline-none\"\n >\n <Icon className=\"size-4 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{pane.title}</span>\n {isOpen ? <span className=\"text-[11px] text-muted-foreground\">Open</span> : null}\n </button>\n </li>\n );\n })}\n </ul>\n);\n\nconst AddPaneMenu: FC<{\n panes: readonly SessionWorkbenchPane[];\n openIds: readonly string[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, openIds, onOpen }) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const shown = filterWorkbenchPanes(panes, query);\n const choose = (paneId: string) => {\n onOpen(paneId);\n setOpen(false);\n setQuery('');\n };\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setQuery('');\n }}\n >\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label=\"Open a pane\" title=\"Open a pane\" className={ICON_BUTTON_CLASS}>\n <PlusIcon className=\"size-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-56 p-1\" aria-label=\"Panes\">\n <div className=\"flex items-center gap-2 border-border border-b px-2 pb-1.5 pt-1\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n // biome-ignore lint/a11y/noAutofocus: the menu opens to type into, as a command menu does.\n autoFocus\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n const first = shown[0];\n if (event.key === 'Enter' && first) {\n event.preventDefault();\n choose(first.id);\n }\n }}\n placeholder=\"Search\"\n aria-label=\"Search panes\"\n className=\"h-7 min-w-0 flex-1 bg-transparent text-[13px] outline-none placeholder:text-muted-foreground\"\n />\n </div>\n <div className=\"pt-1\">\n {shown.length > 0 ? (\n <PaneMenuItems panes={shown} openIds={openIds} onOpen={choose} />\n ) : (\n <p className=\"px-2 py-1.5 text-[13px] text-muted-foreground\">No pane matches.</p>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n\n/** Nothing open: every pane the \"+\" menu offers, with what each shows, centred in the column. */\nconst NoOpenPane: FC<{\n panes: readonly SessionWorkbenchPane[];\n onOpen: (paneId: string) => void;\n}> = ({ panes, onOpen }) => (\n <div className=\"flex min-h-full items-center justify-center p-6\">\n <ul aria-label=\"Available panes\" className=\"flex w-full max-w-xs flex-col gap-1\">\n {panes.map((pane) => {\n const Icon = pane.icon ?? LayersIcon;\n return (\n <li key={pane.id}>\n <button\n type=\"button\"\n onClick={() => onOpen(pane.id)}\n className=\"flex w-full items-start gap-3 rounded-lg px-3 py-2 text-left transition-colors hover:bg-muted focus-visible:bg-muted focus-visible:outline-none\"\n >\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"text-[13px] text-foreground\">{pane.title}</span>\n {pane.description ? (\n <span className=\"text-muted-foreground text-xs\">{pane.description}</span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n);\n"],"names":["LayersIcon","jsx","AssetPanel","useAthenaQueryClient","QueryClientProvider","DEFAULT_SESSION_WORKBENCH_PANES","DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS","useWorkbenchLayout","useState","useContext","AthenaStatewireThreadIdContext","useAthenaStatewireThreadList","useAuiState","readDeepAgentStreamValues","useMemo","useQueryClient","useRef","useEffect","SESSION_WORKSPACE_QUERY_KEY","useAssetPanelStore","useReducer","workbenchTabsReducer","useLayoutEffect","visibleThreadTabs","threadTabs","useId","SessionWorkbenchContext","jsxs","cn","Fragment","PanelRightOpenIcon","XIcon","Minimize2Icon","Maximize2Icon","PanelRightCloseIcon","filterWorkbenchPanes","Popover","PopoverTrigger","PlusIcon","PopoverContent","SearchIcon"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
3
+ const require$$0 = require("react");
4
4
  const useSessionWorkspace = require("./use-session-workspace.cjs");
5
- const SessionWorkbenchContext = react.createContext(null);
5
+ const SessionWorkbenchContext = require$$0.createContext(null);
6
6
  function useSessionWorkbench() {
7
- const context = react.useContext(SessionWorkbenchContext);
7
+ const context = require$$0.useContext(SessionWorkbenchContext);
8
8
  if (context === null) {
9
9
  throw new Error("[AthenaSDK] useSessionWorkbench must be used within <SessionWorkbench>");
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-workbench-context.cjs","sources":["../../src/workbench/session-workbench-context.ts"],"sourcesContent":["import type { UseQueryResult } from '@tanstack/react-query';\nimport type { ComponentType, ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\nimport type { SessionWorkspace } from './session-workspace-api';\nimport { useAthenaSessionWorkspace } from './use-session-workspace';\n\n/** What every pane knows about the thread the workbench shows. */\nexport interface SessionWorkbenchPaneContext {\n /**\n * The thread the chat is attached to (defined for a never-started chat too);\n * `null` outside `<AthenaProvider>`.\n */\n threadId: string | null;\n /**\n * Whether the backend knows the thread yet. A never-started chat has no\n * workspace, pull requests or history to read, so panes show their empty\n * state instead of asking.\n */\n isPersisted: boolean;\n /** Whether the thread's run is live — panes that read the backend poll while it is. */\n isRunning: boolean;\n /**\n * Whether the pane is on screen: `false` while the workbench is collapsed to\n * its rail (the pane stays mounted, hidden). A pane that streams — the\n * Computer pane's live desktop — stops while hidden. Optional for hosts that\n * build this context themselves; absent reads as visible.\n */\n isVisible?: boolean;\n}\n\n/**\n * One tab the workbench can open. Hosts add their own beside the built-in\n * ones (`DEFAULT_SESSION_WORKBENCH_PANES`) — a Harvey-style \"Matter\" pane, a\n * Hebbia-style \"Grid\" — and choose which open by default.\n */\nexport interface SessionWorkbenchPane {\n /** Stable id; also what `defaultOpenPaneIds` names. */\n id: string;\n /** Tab label. */\n title: string;\n /**\n * One line on what the pane shows (\"Commands the agent ran and their\n * output\"). The workbench lists it under the title when no pane is open.\n */\n description?: string;\n /** Tab icon (a lucide icon, or any component taking `className`). */\n icon?: ComponentType<{ className?: string }>;\n /** The pane body for the workbench's current thread. */\n render: (context: SessionWorkbenchPaneContext) => ReactNode;\n}\n\nexport const SessionWorkbenchContext = createContext<SessionWorkbenchPaneContext | null>(null);\n\n/**\n * The workbench's thread context, for a custom pane's components. Throws\n * outside `SessionWorkbench`.\n */\nexport function useSessionWorkbench(): SessionWorkbenchPaneContext {\n const context = useContext(SessionWorkbenchContext);\n if (context === null) {\n throw new Error('[AthenaSDK] useSessionWorkbench must be used within <SessionWorkbench>');\n }\n return context;\n}\n\n/** How often a pane re-reads the workspace while the run is live. */\nexport const SESSION_WORKSPACE_LIVE_REFETCH_MS = 15_000;\n\n/**\n * The workbench thread's workspace (computers and assets), shared by every\n * pane through one query: polled while the run is live, idle for a\n * never-started chat.\n */\nexport function useSessionWorkbenchWorkspace(): UseQueryResult<SessionWorkspace, Error> {\n const { threadId, isPersisted, isRunning } = useSessionWorkbench();\n return useAthenaSessionWorkspace({\n threadId,\n enabled: isPersisted,\n refetchIntervalMs: isRunning ? SESSION_WORKSPACE_LIVE_REFETCH_MS : false,\n });\n}\n"],"names":["createContext","useContext","useAthenaSessionWorkspace"],"mappings":";;;;AAmDO,MAAM,0BAA0BA,MAAAA,cAAkD,IAAI;AAMtF,SAAS,sBAAmD;AACjE,QAAM,UAAUC,MAAAA,WAAW,uBAAuB;AAClD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACA,SAAO;AACT;AAGO,MAAM,oCAAoC;AAO1C,SAAS,+BAAwE;AACtF,QAAM,EAAE,UAAU,aAAa,UAAA,IAAc,oBAAA;AAC7C,SAAOC,8CAA0B;AAAA,IAC/B;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB,YAAY,oCAAoC;AAAA,EAAA,CACpE;AACH;;;;;"}
1
+ {"version":3,"file":"session-workbench-context.cjs","sources":["../../src/workbench/session-workbench-context.ts"],"sourcesContent":["import type { UseQueryResult } from '@tanstack/react-query';\nimport type { ComponentType, ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\nimport type { SessionWorkspace } from './session-workspace-api';\nimport { useAthenaSessionWorkspace } from './use-session-workspace';\n\n/** What every pane knows about the thread the workbench shows. */\nexport interface SessionWorkbenchPaneContext {\n /**\n * The thread the chat is attached to (defined for a never-started chat too);\n * `null` outside `<AthenaProvider>`.\n */\n threadId: string | null;\n /**\n * Whether the backend knows the thread yet. A never-started chat has no\n * workspace, pull requests or history to read, so panes show their empty\n * state instead of asking.\n */\n isPersisted: boolean;\n /** Whether the thread's run is live — panes that read the backend poll while it is. */\n isRunning: boolean;\n /**\n * Whether the pane is on screen: `false` while the workbench is collapsed to\n * its rail (the pane stays mounted, hidden). A pane that streams — the\n * Computer pane's live desktop — stops while hidden. Optional for hosts that\n * build this context themselves; absent reads as visible.\n */\n isVisible?: boolean;\n}\n\n/**\n * One tab the workbench can open. Hosts add their own beside the built-in\n * ones (`DEFAULT_SESSION_WORKBENCH_PANES`) — a Harvey-style \"Matter\" pane, a\n * Hebbia-style \"Grid\" — and choose which open by default.\n */\nexport interface SessionWorkbenchPane {\n /** Stable id; also what `defaultOpenPaneIds` names. */\n id: string;\n /** Tab label. */\n title: string;\n /**\n * One line on what the pane shows (\"Commands the agent ran and their\n * output\"). The workbench lists it under the title when no pane is open.\n */\n description?: string;\n /** Tab icon (a lucide icon, or any component taking `className`). */\n icon?: ComponentType<{ className?: string }>;\n /** The pane body for the workbench's current thread. */\n render: (context: SessionWorkbenchPaneContext) => ReactNode;\n}\n\nexport const SessionWorkbenchContext = createContext<SessionWorkbenchPaneContext | null>(null);\n\n/**\n * The workbench's thread context, for a custom pane's components. Throws\n * outside `SessionWorkbench`.\n */\nexport function useSessionWorkbench(): SessionWorkbenchPaneContext {\n const context = useContext(SessionWorkbenchContext);\n if (context === null) {\n throw new Error('[AthenaSDK] useSessionWorkbench must be used within <SessionWorkbench>');\n }\n return context;\n}\n\n/** How often a pane re-reads the workspace while the run is live. */\nexport const SESSION_WORKSPACE_LIVE_REFETCH_MS = 15_000;\n\n/**\n * The workbench thread's workspace (computers and assets), shared by every\n * pane through one query: polled while the run is live, idle for a\n * never-started chat.\n */\nexport function useSessionWorkbenchWorkspace(): UseQueryResult<SessionWorkspace, Error> {\n const { threadId, isPersisted, isRunning } = useSessionWorkbench();\n return useAthenaSessionWorkspace({\n threadId,\n enabled: isPersisted,\n refetchIntervalMs: isRunning ? SESSION_WORKSPACE_LIVE_REFETCH_MS : false,\n });\n}\n"],"names":["createContext","useContext","useAthenaSessionWorkspace"],"mappings":";;;;AAmDO,MAAM,0BAA0BA,WAAAA,cAAkD,IAAI;AAMtF,SAAS,sBAAmD;AACjE,QAAM,UAAUC,WAAAA,WAAW,uBAAuB;AAClD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACA,SAAO;AACT;AAGO,MAAM,oCAAoC;AAO1C,SAAS,+BAAwE;AACtF,QAAM,EAAE,UAAU,aAAa,UAAA,IAAc,oBAAA;AAC7C,SAAOC,8CAA0B;AAAA,IAC/B;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB,YAAY,oCAAoC;AAAA,EAAA,CACpE;AACH;;;;;"}
@@ -4,7 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("@assistant-ui/react");
5
5
  const reactStatewire = require("@assistant-ui/react-statewire");
6
6
  const lucideReact = require("lucide-react");
7
- const react$1 = require("react");
7
+ const require$$0 = require("react");
8
8
  const assetPanelStore = require("../assets/asset-panel-store.cjs");
9
9
  const athenaUrls = require("../lib/athena-urls.cjs");
10
10
  const AthenaContext = require("../provider/AthenaContext.cjs");
@@ -61,7 +61,7 @@ const TASK_STATUS_LABEL = {
61
61
  const TasksPaneContent = () => {
62
62
  const stateTodos = reactStatewire.useStatewireState((state) => statewireState.readDeepAgentStreamValues(state).todos);
63
63
  const messages = react.useAuiState((state) => state.thread.messages);
64
- const progress = react$1.useMemo(
64
+ const progress = require$$0.useMemo(
65
65
  () => sessionWorkbenchModel.taskProgress(sessionWorkbenchModel.deriveTaskSteps({ stateTodos, messages })),
66
66
  [stateTodos, messages]
67
67
  );
@@ -228,10 +228,10 @@ const ShellPaneContent = () => {
228
228
  const workspace = sessionWorkbenchContext.useSessionWorkbenchWorkspace().data ?? null;
229
229
  const history = statewireHistoryContext.useStatewireHistory(threadId);
230
230
  const partial = (history == null ? void 0 : history.hasOlder) === true;
231
- const rows = react$1.useMemo(() => sessionWorkbenchModel.deriveShellRows({ messages, workspace }), [messages, workspace]);
232
- const [query, setQuery] = react$1.useState("");
233
- const [expanded, setExpanded] = react$1.useState(() => /* @__PURE__ */ new Set());
234
- const visible = react$1.useMemo(() => sessionWorkbenchModel.filterShellRows(rows, query), [rows, query]);
231
+ const rows = require$$0.useMemo(() => sessionWorkbenchModel.deriveShellRows({ messages, workspace }), [messages, workspace]);
232
+ const [query, setQuery] = require$$0.useState("");
233
+ const [expanded, setExpanded] = require$$0.useState(() => /* @__PURE__ */ new Set());
234
+ const visible = require$$0.useMemo(() => sessionWorkbenchModel.filterShellRows(rows, query), [rows, query]);
235
235
  const toggle = (id) => setExpanded((current) => {
236
236
  const next = new Set(current);
237
237
  if (next.has(id)) next.delete(id);
@@ -308,7 +308,7 @@ const ComputerStateBadge = ({ assetId }) => {
308
308
  const CopySshCommand = ({ assetId }) => {
309
309
  var _a, _b;
310
310
  const ssh = useSessionWorkspace.useAthenaComputerSshAccess({ assetId });
311
- const [copied, setCopied] = react$1.useState(false);
311
+ const [copied, setCopied] = require$$0.useState(false);
312
312
  const command = (_a = ssh.data) == null ? void 0 : _a.command;
313
313
  if (!command) return null;
314
314
  const copy = () => {
@@ -342,7 +342,7 @@ const CopySshCommand = ({ assetId }) => {
342
342
  };
343
343
  function useAssetHref(assetId) {
344
344
  const { appUrl, backendUrl } = AthenaContext.useAthenaConfig();
345
- return react$1.useMemo(() => {
345
+ return require$$0.useMemo(() => {
346
346
  const pageOrigin = typeof window === "undefined" ? null : window.location.origin;
347
347
  try {
348
348
  return athenaUrls.createAthenaSpacesUrl({
@@ -1 +1 @@
1
- {"version":3,"file":"session-workbench-panes.cjs","sources":["../../src/workbench/session-workbench-panes.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The built-in panes of `SessionWorkbench` — Tasks, Shell, Computer, Pull\n * requests and Attachments. Each reads one source:\n *\n * - Tasks: the thread state's `todos` channel (the deepagents plan), else the\n * newest `write_todos` call in the loaded transcript.\n * - Shell: every `execute` call in the loaded transcript; while the thread has\n * older history the chat has not loaded, it says so and loads the next page\n * on request (`StatewireHistoryContext`).\n * - Computer / Attachments: the session's workspace\n * (`GET /api/conversations/threads/{id}/workspace`), plus the computer's\n * status and SSH target; the Computer pane also shows the computer's screen\n * live (`ComputerLiveDesktop`).\n * - Pull requests: the thread list's live pull-request state for the session.\n */\nimport { useAuiState } from '@assistant-ui/react';\nimport { useStatewireState } from '@assistant-ui/react-statewire';\nimport {\n type ConversationPullRequest,\n hasStatewireThreadExtras,\n readDeepAgentStreamValues,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n BookOpenIcon,\n CheckIcon,\n CircleDashedIcon,\n CopyIcon,\n ExternalLinkIcon,\n FileIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n GitPullRequestIcon,\n ImageIcon,\n ListChecksIcon,\n LoaderIcon,\n MonitorIcon,\n PaperclipIcon,\n PresentationIcon,\n SearchIcon,\n TerminalIcon,\n XIcon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useMemo, useState } from 'react';\nimport { type AssetType as AssetPanelType, useAssetPanelStore } from '../assets/asset-panel-store';\nimport { athenaLinkAppUrl, createAthenaSpacesUrl } from '../lib/athena-urls';\nimport { cn } from '../lib/utils';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type StatewireHistoryState,\n useStatewireHistory,\n} from '../provider/statewire-history-context';\nimport { PR_CHECKS_LABEL, PR_STATE_CLASS, PR_STATE_ICON } from '../threads/pull-request-display';\nimport {\n orderedPullRequests,\n pullRequestChipState,\n relativeTime,\n} from '../threads/session-list-model';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { useAthenaSessionAttention } from '../threads/use-athena-session-attention';\nimport { PlanStepMarker, type PlanStepStatus } from '../tools/write-todos-tool-ui';\nimport {\n type SessionWorkbenchPane,\n useSessionWorkbench,\n useSessionWorkbenchWorkspace,\n} from './session-workbench-context';\nimport {\n assetPanelTypeOf,\n assetTypeLabel,\n computerStateBadge,\n deriveShellRows,\n deriveTaskSteps,\n filterShellRows,\n reviewDecisionLabel,\n type ShellRow,\n type ShellRowStatus,\n taskProgress,\n workspaceComputers,\n} from './session-workbench-model';\nimport { ComputerLiveDesktop } from './ComputerLiveDesktop';\nimport type { SessionWorkspaceAsset } from './session-workspace-api';\nimport { useAthenaComputerSshAccess, useAthenaComputerStatus } from './use-session-workspace';\n\n// ─── Shared pieces ───────────────────────────────────────────────────\n\nconst FOCUS_RING_CLASS =\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0';\n\nconst PaneEmpty: FC<{\n icon: FC<{ className?: string }>;\n title: string;\n children?: ReactNode;\n}> = ({ icon: Icon, title, children }) => (\n <div className=\"flex h-full min-h-40 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <Icon className=\"size-5 text-muted-foreground/70\" />\n <p className=\"font-medium text-foreground text-sm\">{title}</p>\n {children ? <p className=\"max-w-64 text-muted-foreground text-xs leading-snug\">{children}</p> : null}\n </div>\n);\n\nconst PaneError: FC<{ error: Error }> = ({ error }) => (\n <div role=\"alert\" className=\"m-3 flex items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-red-900 text-xs\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 break-words\">{error.message}</span>\n </div>\n);\n\nconst PaneSkeleton: FC = () => (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy=\"true\" aria-label=\"Loading\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n);\n\nconst SectionHeading: FC<{ children: ReactNode; trailing?: ReactNode }> = ({ children, trailing }) => (\n <div className=\"flex items-center justify-between gap-2 px-3 pt-3 pb-1.5\">\n <h3 className=\"font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">{children}</h3>\n {trailing}\n </div>\n);\n\n/** The `title` tooltip for an ISO time: the full local date and time. */\nfunction fullTime(iso: string | null): string | undefined {\n if (!iso) return undefined;\n const time = Date.parse(iso);\n return Number.isNaN(time) ? undefined : new Date(time).toLocaleString();\n}\n\n/** Statewire-only panes read the transcript and thread state; elsewhere they say so. */\nconst RequiresStatewireThread: FC<{ children: ReactNode; icon: FC<{ className?: string }> }> = ({\n children,\n icon,\n}) => {\n const extras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(extras)) {\n return <PaneEmpty icon={icon} title=\"No live session\">Open a session to see this pane.</PaneEmpty>;\n }\n return <>{children}</>;\n};\n\n// ─── Tasks ───────────────────────────────────────────────────────────\n\nconst TASK_STATUS_LABEL: Record<PlanStepStatus, string> = {\n pending: 'To do',\n in_progress: 'In progress',\n completed: 'Done',\n failed: 'Failed',\n cancelled: 'Cancelled',\n};\n\nconst TasksPaneContent: FC = () => {\n const stateTodos = useStatewireState((state) => readDeepAgentStreamValues(state).todos);\n const messages = useAuiState((state) => state.thread.messages);\n const progress = useMemo(\n () => taskProgress(deriveTaskSteps({ stateTodos, messages })),\n [stateTodos, messages],\n );\n if (progress.total === 0) {\n return (\n <PaneEmpty icon={ListChecksIcon} title=\"No plan yet\">\n When the agent writes a plan, its steps show here as it works through them.\n </PaneEmpty>\n );\n }\n const percent = Math.round((progress.done / progress.total) * 100);\n return (\n <div className=\"flex flex-col\">\n <SectionHeading\n trailing={\n <span className=\"font-medium text-foreground text-xs tabular-nums\">\n {progress.done}/{progress.total} done\n </span>\n }\n >\n Plan\n </SectionHeading>\n <div className=\"mx-3 mb-2 h-1 overflow-hidden rounded-full bg-muted\">\n {/* A runtime percentage is the one width a static utility cannot express. */}\n <div className=\"h-full rounded-full bg-primary transition-all\" style={{ width: `${percent}%` }} />\n </div>\n <ol className=\"flex flex-col pb-3\" aria-label=\"Plan steps\">\n {progress.steps.map((step, index) => (\n <li\n key={step.id ?? `${index}:${step.content}`}\n data-status={step.status}\n className=\"flex items-start gap-2.5 px-3 py-1.5\"\n >\n {step.status === 'pending' ? (\n // The row already carries its number; a pending marker repeating it reads \"11 11.\".\n <span aria-hidden className=\"size-[18px] shrink-0 rounded-full border border-border border-dashed\" />\n ) : (\n <PlanStepMarker status={step.status} index={index} />\n )}\n <span className=\"sr-only\">{TASK_STATUS_LABEL[step.status]}: </span>\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-[18px]',\n step.status === 'completed' && 'text-muted-foreground line-through',\n step.status === 'in_progress' && 'font-medium text-foreground',\n step.status === 'failed' && 'text-destructive',\n step.status === 'cancelled' && 'text-muted-foreground line-through',\n )}\n >\n <span className=\"mr-1.5 text-muted-foreground tabular-nums\">{index + 1}.</span>\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport const SessionTasksPane: FC = () => (\n <RequiresStatewireThread icon={ListChecksIcon}>\n <TasksPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Shell ───────────────────────────────────────────────────────────\n\nconst SHELL_STATUS_LABEL: Record<ShellRowStatus, string> = {\n running: 'Running',\n succeeded: 'Succeeded',\n failed: 'Failed',\n unknown: 'Finished',\n};\n\nconst ShellStatusIcon: FC<{ status: ShellRowStatus }> = ({ status }) => {\n const label = SHELL_STATUS_LABEL[status];\n if (status === 'running') {\n return <LoaderIcon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-primary\" aria-label={label} />;\n }\n if (status === 'succeeded') {\n return <CheckIcon className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" aria-label={label} />;\n }\n if (status === 'failed') {\n return <XIcon className=\"mt-0.5 size-3.5 shrink-0 text-red-600\" aria-label={label} />;\n }\n return <CircleDashedIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-label={label} />;\n};\n\nfunction shellMeta(row: ShellRow): string {\n const parts = [row.machine.label];\n if (row.exitCode !== null) parts.push(`exit ${row.exitCode}`);\n if (row.createdAt) parts.push(relativeTime(row.createdAt));\n return parts.join(' · ');\n}\n\nconst ShellRowItem: FC<{ row: ShellRow; expanded: boolean; onToggle: () => void }> = ({\n row,\n expanded,\n onToggle,\n}) => {\n const panelId = `athena-shell-${row.id}`;\n return (\n <li data-status={row.status} className=\"border-border/60 border-b last:border-b-0\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={onToggle}\n className={cn(\n 'flex w-full items-start gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n <ShellStatusIcon status={row.status} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-foreground text-xs\">\n <span className=\"text-muted-foreground\">$ </span>\n {row.firstLine || '(empty command)'}\n {row.extraLines > 0 ? (\n <span className=\"text-muted-foreground\"> (+{row.extraLines} lines)</span>\n ) : null}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(row.createdAt)}>\n {shellMeta(row)}\n </span>\n </span>\n </button>\n {expanded ? (\n <div id={panelId} className=\"px-3 pb-2.5\">\n <pre\n aria-label=\"Command\"\n className=\"mb-1.5 max-h-40 overflow-auto whitespace-pre-wrap break-all rounded-md border border-border/60 px-2 py-1.5 font-mono text-[11px] text-foreground\"\n >\n {row.command}\n </pre>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted px-2 py-1.5 font-mono text-[11px] text-foreground\">\n {row.status === 'running' ? 'Running…' : row.output || '(no output)'}\n </pre>\n {row.outputPartial ? (\n <p className=\"pt-1 text-[11px] text-muted-foreground\">\n Output shortened — the full output is on the command's card in the chat.\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * The commands below come from the part of the transcript the chat has\n * loaded; earlier ones arrive a page at a time, through the chat's own history\n * edge (the same page it loads when the reader scrolls up).\n */\nconst ShellHistoryFooter: FC<{ history: StatewireHistoryState; empty: boolean }> = ({\n history,\n empty,\n}) => {\n const { canLoadOlder, loading, loadOlder } = history;\n return (\n <div className=\"flex flex-col items-center gap-2 px-3 py-4 text-center\">\n <p className=\"text-[11px] text-muted-foreground\">\n {empty\n ? 'No commands in the part of this session loaded so far.'\n : 'Earlier commands are in the part of this session not loaded yet.'}\n </p>\n {canLoadOlder && loadOlder ? (\n <button\n type=\"button\"\n onClick={loadOlder}\n disabled={loading}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted disabled:opacity-60',\n FOCUS_RING_CLASS,\n )}\n >\n {loading ? <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden /> : null}\n {loading ? 'Loading earlier commands…' : 'Load earlier commands'}\n </button>\n ) : (\n <p className=\"text-[11px] text-muted-foreground\">\n The rest is further back than one view of the conversation loads.\n </p>\n )}\n </div>\n );\n};\n\nconst ShellPaneContent: FC = () => {\n const { threadId } = useSessionWorkbench();\n const messages = useAuiState((state) => state.thread.messages);\n const workspace = useSessionWorkbenchWorkspace().data ?? null;\n const history = useStatewireHistory(threadId);\n const partial = history?.hasOlder === true;\n const rows = useMemo(() => deriveShellRows({ messages, workspace }), [messages, workspace]);\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const visible = useMemo(() => filterShellRows(rows, query), [rows, query]);\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n if (rows.length === 0) {\n if (partial && history) return <ShellHistoryFooter history={history} empty />;\n return (\n <PaneEmpty icon={TerminalIcon} title=\"No commands yet\">\n Every shell command the agent runs shows here with where it ran and how it ended.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"sticky top-0 z-10 border-border/60 border-b bg-background px-3 py-2\">\n <label className=\"flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 focus-within:ring-2 focus-within:ring-ring/40\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search commands\"\n aria-label=\"Search commands\"\n className=\"min-w-0 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </label>\n <p className=\"pt-1.5 text-[11px] text-muted-foreground\" aria-live=\"polite\">\n {query.trim()\n ? `${visible.length} of ${rows.length} commands`\n : `${rows.length} command${rows.length === 1 ? '' : 's'}`}\n {partial ? ' so far' : ''}\n </p>\n </div>\n {visible.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-muted-foreground text-xs\">No command matches.</p>\n ) : (\n <ul aria-label=\"Shell commands\">\n {visible.map((row) => (\n <ShellRowItem\n key={row.id}\n row={row}\n expanded={expanded.has(row.id)}\n onToggle={() => toggle(row.id)}\n />\n ))}\n </ul>\n )}\n {partial && history ? <ShellHistoryFooter history={history} empty={false} /> : null}\n </div>\n );\n};\n\nexport const SessionShellPane: FC = () => (\n <RequiresStatewireThread icon={TerminalIcon}>\n <ShellPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Computer ────────────────────────────────────────────────────────\n\nconst ComputerStateBadge: FC<{ assetId: string }> = ({ assetId }) => {\n const status = useAthenaComputerStatus({ assetId });\n const badge = status.data ? computerStateBadge(status.data) : null;\n if (!badge) return null;\n return (\n <span\n data-state={status.data?.state}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\"\n >\n <span\n aria-hidden\n className={cn(\n 'size-1.5 rounded-full',\n badge.tone === 'running' && 'bg-emerald-500',\n badge.tone === 'transition' && 'animate-pulse bg-amber-500',\n badge.tone === 'stopped' && 'bg-muted-foreground/50',\n badge.tone === 'error' && 'bg-red-500',\n )}\n />\n {badge.label}\n </span>\n );\n};\n\nconst CopySshCommand: FC<{ assetId: string }> = ({ assetId }) => {\n const ssh = useAthenaComputerSshAccess({ assetId });\n const [copied, setCopied] = useState(false);\n const command = ssh.data?.command;\n if (!command) return null;\n const copy = () => {\n void navigator.clipboard?.writeText(command).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[11px] text-foreground\" title={command}>\n {command}\n </code>\n <button\n type=\"button\"\n onClick={copy}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted',\n FOCUS_RING_CLASS,\n )}\n >\n {copied ? <CheckIcon className=\"size-3.5\" aria-hidden /> : <CopyIcon className=\"size-3.5\" aria-hidden />}\n {copied ? 'Copied' : 'Copy SSH command'}\n </button>\n </div>\n {ssh.data?.keyAuthEnabled === false ? (\n <p className=\"text-[11px] text-muted-foreground\">\n This environment's SSH gateway takes temporary tokens only; create one from the computer in Athena.\n </p>\n ) : null}\n </div>\n );\n};\n\nfunction useAssetHref(assetId: string): string | null {\n const { appUrl, backendUrl } = useAthenaConfig();\n return useMemo(() => {\n const pageOrigin = typeof window === 'undefined' ? null : window.location.origin;\n try {\n return createAthenaSpacesUrl({\n appUrl: athenaLinkAppUrl({ appUrl, backendUrl, pageOrigin }),\n assetIds: assetId,\n });\n } catch {\n return null;\n }\n }, [appUrl, backendUrl, assetId]);\n}\n\nconst OpenInAthenaLink: FC<{ assetId: string; label?: string; compact?: boolean }> = ({\n assetId,\n label = 'Open in Athena',\n compact = false,\n}) => {\n const href = useAssetHref(assetId);\n if (!href) return null;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={compact ? label : undefined}\n title={compact ? label : undefined}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md font-medium text-xs transition-colors hover:bg-muted',\n compact ? 'p-1 text-muted-foreground hover:text-foreground' : 'border border-border px-2 py-1',\n FOCUS_RING_CLASS,\n )}\n >\n <ExternalLinkIcon className=\"size-3.5\" aria-hidden />\n {compact ? null : label}\n </a>\n );\n};\n\nconst ComputerCard: FC<{ computer: SessionWorkspaceAsset }> = ({ computer }) => (\n <article\n aria-label={computer.title ?? computer.assetId}\n className=\"mx-3 mt-3 flex flex-col gap-3 rounded-xl border border-border p-3\"\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground\">\n <MonitorIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-foreground text-sm\">{computer.title ?? computer.assetId}</p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {computer.role === 'session_computer' ? 'Session computer' : 'Used by this session'}\n {computer.updatedAt ? ` · updated ${relativeTime(computer.updatedAt)}` : ''}\n </p>\n </div>\n <ComputerStateBadge assetId={computer.assetId} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <OpenInAthenaLink assetId={computer.assetId} />\n </div>\n <CopySshCommand assetId={computer.assetId} />\n </article>\n);\n\nexport const SessionComputerPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n if (!isPersisted) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer yet\">\n The computer this session works on shows here once it starts.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { primary, others } = workspaceComputers(workspace.data);\n if (!primary) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer used yet\">\n When the agent runs commands on a computer, it shows here with a link and its SSH command.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-3\">\n <ComputerLiveDesktop assetId={primary.assetId} className=\"mx-3 mt-3\" />\n <ComputerCard computer={primary} />\n {others.length > 0 ? (\n <>\n <SectionHeading>Also used</SectionHeading>\n <ul aria-label=\"Other computers\">\n {others.map((computer) => (\n <li key={computer.assetId} className=\"flex items-center gap-2 px-3 py-1.5\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate text-foreground text-sm\">\n {computer.title ?? computer.assetId}\n </span>\n <OpenInAthenaLink assetId={computer.assetId} compact label={`Open ${computer.title ?? 'computer'} in Athena`} />\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n );\n};\n\n// ─── Pull requests ───────────────────────────────────────────────────\n\nconst PullRequestRow: FC<{ pullRequest: ConversationPullRequest }> = ({ pullRequest }) => {\n const state = pullRequestChipState(pullRequest);\n const Icon = PR_STATE_ICON[state];\n const meta = [\n `${pullRequest.repoFullName}#${pullRequest.number}`,\n state,\n PR_CHECKS_LABEL[pullRequest.checksState],\n reviewDecisionLabel(pullRequest.reviewDecision),\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <li>\n <a\n href={pullRequest.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-pr-state={state}\n className={cn('flex items-start gap-2.5 px-3 py-2 transition-colors hover:bg-muted/60', FOCUS_RING_CLASS)}\n >\n <Icon className={cn('mt-0.5 size-4 shrink-0', PR_STATE_CLASS[state])} aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-foreground text-sm leading-snug\">\n {pullRequest.title || `#${pullRequest.number}`}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">{meta}</span>\n </span>\n <ExternalLinkIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n </a>\n </li>\n );\n};\n\nexport const SessionPullRequestsPane: FC = () => {\n const { threadId, isPersisted } = useSessionWorkbench();\n const list = useAthenaStatewireThreadList();\n const attention = useAthenaSessionAttention(threadId ?? undefined);\n if (!list) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests need the session list\">\n Mount the provider with enableThreadList to see the pull requests a session opened.\n </PaneEmpty>\n );\n }\n const pullRequests = isPersisted ? (attention?.pullRequests ?? []) : [];\n if (attention?.pullRequests === null && isPersisted) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests unavailable\">\n GitHub could not be read for this session right now.\n </PaneEmpty>\n );\n }\n if (pullRequests.length === 0) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"No pull requests\">\n Pull requests the agent opens show here with their checks and review state.\n </PaneEmpty>\n );\n }\n const ordered = orderedPullRequests(pullRequests);\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{ordered.length}</span>}\n >\n Pull requests\n </SectionHeading>\n <ul aria-label=\"Pull requests\">\n {ordered.map((pullRequest) => (\n <PullRequestRow key={pullRequest.url} pullRequest={pullRequest} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Attachments ─────────────────────────────────────────────────────\n\nconst ASSET_ICON: Record<string, FC<{ className?: string }>> = {\n spreadsheet: FileSpreadsheetIcon,\n document: FileTextIcon,\n presentation: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n notebook: BookOpenIcon,\n image: ImageIcon,\n folder: FolderIcon,\n markdown: FileTextIcon,\n pdf: FileTextIcon,\n txt: FileTextIcon,\n};\n\nconst AttachmentRow: FC<{ asset: SessionWorkspaceAsset; canOpenHere: boolean }> = ({\n asset,\n canOpenHere,\n}) => {\n const openAsset = useAssetPanelStore((state) => state.openAsset);\n const Icon = ASSET_ICON[asset.assetType] ?? FileIcon;\n const panelType: AssetPanelType | null = assetPanelTypeOf(asset.assetType);\n const title = asset.title ?? asset.assetId;\n const meta = [\n assetTypeLabel(asset.assetType),\n asset.updatedAt ? `updated ${relativeTime(asset.updatedAt)}` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n const body = (\n <>\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-foreground text-sm\">{title}</span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(asset.updatedAt)}>\n {meta}\n </span>\n </span>\n </>\n );\n return (\n <li className=\"flex items-start gap-1 pr-2\">\n {canOpenHere && panelType ? (\n <button\n type=\"button\"\n onClick={() => openAsset(asset.assetId, { name: title, type: panelType })}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2\">{body}</div>\n )}\n <span className=\"pt-1.5\">\n <OpenInAthenaLink assetId={asset.assetId} compact label={`Open ${title} in Athena`} />\n </span>\n </li>\n );\n};\n\nexport const SessionAttachmentsPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n const canOpenHere = useAssetPanelStore((state) => state.assetPanelHostCount > 0);\n if (!isPersisted) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { assets } = workspace.data;\n if (assets.length === 0) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{assets.length}</span>}\n >\n Created or edited\n </SectionHeading>\n <ul aria-label=\"Session files\">\n {assets.map((asset) => (\n <AttachmentRow key={asset.assetId} asset={asset} canOpenHere={canOpenHere} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Registry ────────────────────────────────────────────────────────\n\nexport const SESSION_WORKBENCH_TASKS_PANE: SessionWorkbenchPane = {\n id: 'tasks',\n title: 'Tasks',\n description: \"Follow the agent's plan step by step\",\n icon: ListChecksIcon,\n render: () => <SessionTasksPane />,\n};\n\nexport const SESSION_WORKBENCH_SHELL_PANE: SessionWorkbenchPane = {\n id: 'shell',\n title: 'Shell',\n description: 'Commands the agent ran and their output',\n icon: TerminalIcon,\n render: () => <SessionShellPane />,\n};\n\nexport const SESSION_WORKBENCH_COMPUTER_PANE: SessionWorkbenchPane = {\n id: 'computer',\n title: 'Computer',\n description: 'The machine this session works on, and how to reach it',\n icon: MonitorIcon,\n render: () => <SessionComputerPane />,\n};\n\nexport const SESSION_WORKBENCH_PULL_REQUESTS_PANE: SessionWorkbenchPane = {\n id: 'pull-requests',\n title: 'Pull requests',\n description: 'Pull requests this session opened, with checks and reviews',\n icon: GitPullRequestIcon,\n render: () => <SessionPullRequestsPane />,\n};\n\nexport const SESSION_WORKBENCH_ATTACHMENTS_PANE: SessionWorkbenchPane = {\n id: 'attachments',\n title: 'Attachments',\n description: 'Files and assets this session created or edited',\n icon: PaperclipIcon,\n render: () => <SessionAttachmentsPane />,\n};\n\n/** The built-in panes, in \"+\" menu order. Spread it to add your own. */\nexport const DEFAULT_SESSION_WORKBENCH_PANES: readonly SessionWorkbenchPane[] = [\n SESSION_WORKBENCH_TASKS_PANE,\n SESSION_WORKBENCH_SHELL_PANE,\n SESSION_WORKBENCH_COMPUTER_PANE,\n SESSION_WORKBENCH_PULL_REQUESTS_PANE,\n SESSION_WORKBENCH_ATTACHMENTS_PANE,\n];\n\n/** The panes a thread opens with until the person changes its tabs. */\nexport const DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS: readonly string[] = [\n SESSION_WORKBENCH_TASKS_PANE.id,\n SESSION_WORKBENCH_SHELL_PANE.id,\n SESSION_WORKBENCH_COMPUTER_PANE.id,\n];\n"],"names":["jsxs","jsx","AlertCircleIcon","useAuiState","hasStatewireThreadExtras","useStatewireState","readDeepAgentStreamValues","useMemo","taskProgress","deriveTaskSteps","ListChecksIcon","PlanStepMarker","cn","LoaderIcon","CheckIcon","XIcon","CircleDashedIcon","relativeTime","useSessionWorkbench","useSessionWorkbenchWorkspace","useStatewireHistory","deriveShellRows","useState","filterShellRows","TerminalIcon","SearchIcon","useAthenaComputerStatus","computerStateBadge","useAthenaComputerSshAccess","_a","CopyIcon","useAthenaConfig","createAthenaSpacesUrl","athenaLinkAppUrl","ExternalLinkIcon","MonitorIcon","workspaceComputers","ComputerLiveDesktop","Fragment","pullRequestChipState","PR_STATE_ICON","PR_CHECKS_LABEL","reviewDecisionLabel","PR_STATE_CLASS","useAthenaStatewireThreadList","useAthenaSessionAttention","GitPullRequestIcon","orderedPullRequests","FileSpreadsheetIcon","FileTextIcon","PresentationIcon","BookOpenIcon","ImageIcon","FolderIcon","useAssetPanelStore","FileIcon","assetPanelTypeOf","assetTypeLabel","PaperclipIcon"],"mappings":"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"}
1
+ {"version":3,"file":"session-workbench-panes.cjs","sources":["../../src/workbench/session-workbench-panes.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The built-in panes of `SessionWorkbench` — Tasks, Shell, Computer, Pull\n * requests and Attachments. Each reads one source:\n *\n * - Tasks: the thread state's `todos` channel (the deepagents plan), else the\n * newest `write_todos` call in the loaded transcript.\n * - Shell: every `execute` call in the loaded transcript; while the thread has\n * older history the chat has not loaded, it says so and loads the next page\n * on request (`StatewireHistoryContext`).\n * - Computer / Attachments: the session's workspace\n * (`GET /api/conversations/threads/{id}/workspace`), plus the computer's\n * status and SSH target; the Computer pane also shows the computer's screen\n * live (`ComputerLiveDesktop`).\n * - Pull requests: the thread list's live pull-request state for the session.\n */\nimport { useAuiState } from '@assistant-ui/react';\nimport { useStatewireState } from '@assistant-ui/react-statewire';\nimport {\n type ConversationPullRequest,\n hasStatewireThreadExtras,\n readDeepAgentStreamValues,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n BookOpenIcon,\n CheckIcon,\n CircleDashedIcon,\n CopyIcon,\n ExternalLinkIcon,\n FileIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n GitPullRequestIcon,\n ImageIcon,\n ListChecksIcon,\n LoaderIcon,\n MonitorIcon,\n PaperclipIcon,\n PresentationIcon,\n SearchIcon,\n TerminalIcon,\n XIcon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useMemo, useState } from 'react';\nimport { type AssetType as AssetPanelType, useAssetPanelStore } from '../assets/asset-panel-store';\nimport { athenaLinkAppUrl, createAthenaSpacesUrl } from '../lib/athena-urls';\nimport { cn } from '../lib/utils';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type StatewireHistoryState,\n useStatewireHistory,\n} from '../provider/statewire-history-context';\nimport { PR_CHECKS_LABEL, PR_STATE_CLASS, PR_STATE_ICON } from '../threads/pull-request-display';\nimport {\n orderedPullRequests,\n pullRequestChipState,\n relativeTime,\n} from '../threads/session-list-model';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { useAthenaSessionAttention } from '../threads/use-athena-session-attention';\nimport { PlanStepMarker, type PlanStepStatus } from '../tools/write-todos-tool-ui';\nimport {\n type SessionWorkbenchPane,\n useSessionWorkbench,\n useSessionWorkbenchWorkspace,\n} from './session-workbench-context';\nimport {\n assetPanelTypeOf,\n assetTypeLabel,\n computerStateBadge,\n deriveShellRows,\n deriveTaskSteps,\n filterShellRows,\n reviewDecisionLabel,\n type ShellRow,\n type ShellRowStatus,\n taskProgress,\n workspaceComputers,\n} from './session-workbench-model';\nimport { ComputerLiveDesktop } from './ComputerLiveDesktop';\nimport type { SessionWorkspaceAsset } from './session-workspace-api';\nimport { useAthenaComputerSshAccess, useAthenaComputerStatus } from './use-session-workspace';\n\n// ─── Shared pieces ───────────────────────────────────────────────────\n\nconst FOCUS_RING_CLASS =\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0';\n\nconst PaneEmpty: FC<{\n icon: FC<{ className?: string }>;\n title: string;\n children?: ReactNode;\n}> = ({ icon: Icon, title, children }) => (\n <div className=\"flex h-full min-h-40 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <Icon className=\"size-5 text-muted-foreground/70\" />\n <p className=\"font-medium text-foreground text-sm\">{title}</p>\n {children ? <p className=\"max-w-64 text-muted-foreground text-xs leading-snug\">{children}</p> : null}\n </div>\n);\n\nconst PaneError: FC<{ error: Error }> = ({ error }) => (\n <div role=\"alert\" className=\"m-3 flex items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-red-900 text-xs\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 break-words\">{error.message}</span>\n </div>\n);\n\nconst PaneSkeleton: FC = () => (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy=\"true\" aria-label=\"Loading\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n);\n\nconst SectionHeading: FC<{ children: ReactNode; trailing?: ReactNode }> = ({ children, trailing }) => (\n <div className=\"flex items-center justify-between gap-2 px-3 pt-3 pb-1.5\">\n <h3 className=\"font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">{children}</h3>\n {trailing}\n </div>\n);\n\n/** The `title` tooltip for an ISO time: the full local date and time. */\nfunction fullTime(iso: string | null): string | undefined {\n if (!iso) return undefined;\n const time = Date.parse(iso);\n return Number.isNaN(time) ? undefined : new Date(time).toLocaleString();\n}\n\n/** Statewire-only panes read the transcript and thread state; elsewhere they say so. */\nconst RequiresStatewireThread: FC<{ children: ReactNode; icon: FC<{ className?: string }> }> = ({\n children,\n icon,\n}) => {\n const extras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(extras)) {\n return <PaneEmpty icon={icon} title=\"No live session\">Open a session to see this pane.</PaneEmpty>;\n }\n return <>{children}</>;\n};\n\n// ─── Tasks ───────────────────────────────────────────────────────────\n\nconst TASK_STATUS_LABEL: Record<PlanStepStatus, string> = {\n pending: 'To do',\n in_progress: 'In progress',\n completed: 'Done',\n failed: 'Failed',\n cancelled: 'Cancelled',\n};\n\nconst TasksPaneContent: FC = () => {\n const stateTodos = useStatewireState((state) => readDeepAgentStreamValues(state).todos);\n const messages = useAuiState((state) => state.thread.messages);\n const progress = useMemo(\n () => taskProgress(deriveTaskSteps({ stateTodos, messages })),\n [stateTodos, messages],\n );\n if (progress.total === 0) {\n return (\n <PaneEmpty icon={ListChecksIcon} title=\"No plan yet\">\n When the agent writes a plan, its steps show here as it works through them.\n </PaneEmpty>\n );\n }\n const percent = Math.round((progress.done / progress.total) * 100);\n return (\n <div className=\"flex flex-col\">\n <SectionHeading\n trailing={\n <span className=\"font-medium text-foreground text-xs tabular-nums\">\n {progress.done}/{progress.total} done\n </span>\n }\n >\n Plan\n </SectionHeading>\n <div className=\"mx-3 mb-2 h-1 overflow-hidden rounded-full bg-muted\">\n {/* A runtime percentage is the one width a static utility cannot express. */}\n <div className=\"h-full rounded-full bg-primary transition-all\" style={{ width: `${percent}%` }} />\n </div>\n <ol className=\"flex flex-col pb-3\" aria-label=\"Plan steps\">\n {progress.steps.map((step, index) => (\n <li\n key={step.id ?? `${index}:${step.content}`}\n data-status={step.status}\n className=\"flex items-start gap-2.5 px-3 py-1.5\"\n >\n {step.status === 'pending' ? (\n // The row already carries its number; a pending marker repeating it reads \"11 11.\".\n <span aria-hidden className=\"size-[18px] shrink-0 rounded-full border border-border border-dashed\" />\n ) : (\n <PlanStepMarker status={step.status} index={index} />\n )}\n <span className=\"sr-only\">{TASK_STATUS_LABEL[step.status]}: </span>\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-[18px]',\n step.status === 'completed' && 'text-muted-foreground line-through',\n step.status === 'in_progress' && 'font-medium text-foreground',\n step.status === 'failed' && 'text-destructive',\n step.status === 'cancelled' && 'text-muted-foreground line-through',\n )}\n >\n <span className=\"mr-1.5 text-muted-foreground tabular-nums\">{index + 1}.</span>\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport const SessionTasksPane: FC = () => (\n <RequiresStatewireThread icon={ListChecksIcon}>\n <TasksPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Shell ───────────────────────────────────────────────────────────\n\nconst SHELL_STATUS_LABEL: Record<ShellRowStatus, string> = {\n running: 'Running',\n succeeded: 'Succeeded',\n failed: 'Failed',\n unknown: 'Finished',\n};\n\nconst ShellStatusIcon: FC<{ status: ShellRowStatus }> = ({ status }) => {\n const label = SHELL_STATUS_LABEL[status];\n if (status === 'running') {\n return <LoaderIcon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-primary\" aria-label={label} />;\n }\n if (status === 'succeeded') {\n return <CheckIcon className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" aria-label={label} />;\n }\n if (status === 'failed') {\n return <XIcon className=\"mt-0.5 size-3.5 shrink-0 text-red-600\" aria-label={label} />;\n }\n return <CircleDashedIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-label={label} />;\n};\n\nfunction shellMeta(row: ShellRow): string {\n const parts = [row.machine.label];\n if (row.exitCode !== null) parts.push(`exit ${row.exitCode}`);\n if (row.createdAt) parts.push(relativeTime(row.createdAt));\n return parts.join(' · ');\n}\n\nconst ShellRowItem: FC<{ row: ShellRow; expanded: boolean; onToggle: () => void }> = ({\n row,\n expanded,\n onToggle,\n}) => {\n const panelId = `athena-shell-${row.id}`;\n return (\n <li data-status={row.status} className=\"border-border/60 border-b last:border-b-0\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={onToggle}\n className={cn(\n 'flex w-full items-start gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n <ShellStatusIcon status={row.status} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-foreground text-xs\">\n <span className=\"text-muted-foreground\">$ </span>\n {row.firstLine || '(empty command)'}\n {row.extraLines > 0 ? (\n <span className=\"text-muted-foreground\"> (+{row.extraLines} lines)</span>\n ) : null}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(row.createdAt)}>\n {shellMeta(row)}\n </span>\n </span>\n </button>\n {expanded ? (\n <div id={panelId} className=\"px-3 pb-2.5\">\n <pre\n aria-label=\"Command\"\n className=\"mb-1.5 max-h-40 overflow-auto whitespace-pre-wrap break-all rounded-md border border-border/60 px-2 py-1.5 font-mono text-[11px] text-foreground\"\n >\n {row.command}\n </pre>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted px-2 py-1.5 font-mono text-[11px] text-foreground\">\n {row.status === 'running' ? 'Running…' : row.output || '(no output)'}\n </pre>\n {row.outputPartial ? (\n <p className=\"pt-1 text-[11px] text-muted-foreground\">\n Output shortened — the full output is on the command's card in the chat.\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * The commands below come from the part of the transcript the chat has\n * loaded; earlier ones arrive a page at a time, through the chat's own history\n * edge (the same page it loads when the reader scrolls up).\n */\nconst ShellHistoryFooter: FC<{ history: StatewireHistoryState; empty: boolean }> = ({\n history,\n empty,\n}) => {\n const { canLoadOlder, loading, loadOlder } = history;\n return (\n <div className=\"flex flex-col items-center gap-2 px-3 py-4 text-center\">\n <p className=\"text-[11px] text-muted-foreground\">\n {empty\n ? 'No commands in the part of this session loaded so far.'\n : 'Earlier commands are in the part of this session not loaded yet.'}\n </p>\n {canLoadOlder && loadOlder ? (\n <button\n type=\"button\"\n onClick={loadOlder}\n disabled={loading}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted disabled:opacity-60',\n FOCUS_RING_CLASS,\n )}\n >\n {loading ? <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden /> : null}\n {loading ? 'Loading earlier commands…' : 'Load earlier commands'}\n </button>\n ) : (\n <p className=\"text-[11px] text-muted-foreground\">\n The rest is further back than one view of the conversation loads.\n </p>\n )}\n </div>\n );\n};\n\nconst ShellPaneContent: FC = () => {\n const { threadId } = useSessionWorkbench();\n const messages = useAuiState((state) => state.thread.messages);\n const workspace = useSessionWorkbenchWorkspace().data ?? null;\n const history = useStatewireHistory(threadId);\n const partial = history?.hasOlder === true;\n const rows = useMemo(() => deriveShellRows({ messages, workspace }), [messages, workspace]);\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const visible = useMemo(() => filterShellRows(rows, query), [rows, query]);\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n if (rows.length === 0) {\n if (partial && history) return <ShellHistoryFooter history={history} empty />;\n return (\n <PaneEmpty icon={TerminalIcon} title=\"No commands yet\">\n Every shell command the agent runs shows here with where it ran and how it ended.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"sticky top-0 z-10 border-border/60 border-b bg-background px-3 py-2\">\n <label className=\"flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 focus-within:ring-2 focus-within:ring-ring/40\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search commands\"\n aria-label=\"Search commands\"\n className=\"min-w-0 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </label>\n <p className=\"pt-1.5 text-[11px] text-muted-foreground\" aria-live=\"polite\">\n {query.trim()\n ? `${visible.length} of ${rows.length} commands`\n : `${rows.length} command${rows.length === 1 ? '' : 's'}`}\n {partial ? ' so far' : ''}\n </p>\n </div>\n {visible.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-muted-foreground text-xs\">No command matches.</p>\n ) : (\n <ul aria-label=\"Shell commands\">\n {visible.map((row) => (\n <ShellRowItem\n key={row.id}\n row={row}\n expanded={expanded.has(row.id)}\n onToggle={() => toggle(row.id)}\n />\n ))}\n </ul>\n )}\n {partial && history ? <ShellHistoryFooter history={history} empty={false} /> : null}\n </div>\n );\n};\n\nexport const SessionShellPane: FC = () => (\n <RequiresStatewireThread icon={TerminalIcon}>\n <ShellPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Computer ────────────────────────────────────────────────────────\n\nconst ComputerStateBadge: FC<{ assetId: string }> = ({ assetId }) => {\n const status = useAthenaComputerStatus({ assetId });\n const badge = status.data ? computerStateBadge(status.data) : null;\n if (!badge) return null;\n return (\n <span\n data-state={status.data?.state}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\"\n >\n <span\n aria-hidden\n className={cn(\n 'size-1.5 rounded-full',\n badge.tone === 'running' && 'bg-emerald-500',\n badge.tone === 'transition' && 'animate-pulse bg-amber-500',\n badge.tone === 'stopped' && 'bg-muted-foreground/50',\n badge.tone === 'error' && 'bg-red-500',\n )}\n />\n {badge.label}\n </span>\n );\n};\n\nconst CopySshCommand: FC<{ assetId: string }> = ({ assetId }) => {\n const ssh = useAthenaComputerSshAccess({ assetId });\n const [copied, setCopied] = useState(false);\n const command = ssh.data?.command;\n if (!command) return null;\n const copy = () => {\n void navigator.clipboard?.writeText(command).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[11px] text-foreground\" title={command}>\n {command}\n </code>\n <button\n type=\"button\"\n onClick={copy}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted',\n FOCUS_RING_CLASS,\n )}\n >\n {copied ? <CheckIcon className=\"size-3.5\" aria-hidden /> : <CopyIcon className=\"size-3.5\" aria-hidden />}\n {copied ? 'Copied' : 'Copy SSH command'}\n </button>\n </div>\n {ssh.data?.keyAuthEnabled === false ? (\n <p className=\"text-[11px] text-muted-foreground\">\n This environment's SSH gateway takes temporary tokens only; create one from the computer in Athena.\n </p>\n ) : null}\n </div>\n );\n};\n\nfunction useAssetHref(assetId: string): string | null {\n const { appUrl, backendUrl } = useAthenaConfig();\n return useMemo(() => {\n const pageOrigin = typeof window === 'undefined' ? null : window.location.origin;\n try {\n return createAthenaSpacesUrl({\n appUrl: athenaLinkAppUrl({ appUrl, backendUrl, pageOrigin }),\n assetIds: assetId,\n });\n } catch {\n return null;\n }\n }, [appUrl, backendUrl, assetId]);\n}\n\nconst OpenInAthenaLink: FC<{ assetId: string; label?: string; compact?: boolean }> = ({\n assetId,\n label = 'Open in Athena',\n compact = false,\n}) => {\n const href = useAssetHref(assetId);\n if (!href) return null;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={compact ? label : undefined}\n title={compact ? label : undefined}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md font-medium text-xs transition-colors hover:bg-muted',\n compact ? 'p-1 text-muted-foreground hover:text-foreground' : 'border border-border px-2 py-1',\n FOCUS_RING_CLASS,\n )}\n >\n <ExternalLinkIcon className=\"size-3.5\" aria-hidden />\n {compact ? null : label}\n </a>\n );\n};\n\nconst ComputerCard: FC<{ computer: SessionWorkspaceAsset }> = ({ computer }) => (\n <article\n aria-label={computer.title ?? computer.assetId}\n className=\"mx-3 mt-3 flex flex-col gap-3 rounded-xl border border-border p-3\"\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground\">\n <MonitorIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-foreground text-sm\">{computer.title ?? computer.assetId}</p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {computer.role === 'session_computer' ? 'Session computer' : 'Used by this session'}\n {computer.updatedAt ? ` · updated ${relativeTime(computer.updatedAt)}` : ''}\n </p>\n </div>\n <ComputerStateBadge assetId={computer.assetId} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <OpenInAthenaLink assetId={computer.assetId} />\n </div>\n <CopySshCommand assetId={computer.assetId} />\n </article>\n);\n\nexport const SessionComputerPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n if (!isPersisted) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer yet\">\n The computer this session works on shows here once it starts.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { primary, others } = workspaceComputers(workspace.data);\n if (!primary) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer used yet\">\n When the agent runs commands on a computer, it shows here with a link and its SSH command.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-3\">\n <ComputerLiveDesktop assetId={primary.assetId} className=\"mx-3 mt-3\" />\n <ComputerCard computer={primary} />\n {others.length > 0 ? (\n <>\n <SectionHeading>Also used</SectionHeading>\n <ul aria-label=\"Other computers\">\n {others.map((computer) => (\n <li key={computer.assetId} className=\"flex items-center gap-2 px-3 py-1.5\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate text-foreground text-sm\">\n {computer.title ?? computer.assetId}\n </span>\n <OpenInAthenaLink assetId={computer.assetId} compact label={`Open ${computer.title ?? 'computer'} in Athena`} />\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n );\n};\n\n// ─── Pull requests ───────────────────────────────────────────────────\n\nconst PullRequestRow: FC<{ pullRequest: ConversationPullRequest }> = ({ pullRequest }) => {\n const state = pullRequestChipState(pullRequest);\n const Icon = PR_STATE_ICON[state];\n const meta = [\n `${pullRequest.repoFullName}#${pullRequest.number}`,\n state,\n PR_CHECKS_LABEL[pullRequest.checksState],\n reviewDecisionLabel(pullRequest.reviewDecision),\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <li>\n <a\n href={pullRequest.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-pr-state={state}\n className={cn('flex items-start gap-2.5 px-3 py-2 transition-colors hover:bg-muted/60', FOCUS_RING_CLASS)}\n >\n <Icon className={cn('mt-0.5 size-4 shrink-0', PR_STATE_CLASS[state])} aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-foreground text-sm leading-snug\">\n {pullRequest.title || `#${pullRequest.number}`}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">{meta}</span>\n </span>\n <ExternalLinkIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n </a>\n </li>\n );\n};\n\nexport const SessionPullRequestsPane: FC = () => {\n const { threadId, isPersisted } = useSessionWorkbench();\n const list = useAthenaStatewireThreadList();\n const attention = useAthenaSessionAttention(threadId ?? undefined);\n if (!list) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests need the session list\">\n Mount the provider with enableThreadList to see the pull requests a session opened.\n </PaneEmpty>\n );\n }\n const pullRequests = isPersisted ? (attention?.pullRequests ?? []) : [];\n if (attention?.pullRequests === null && isPersisted) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests unavailable\">\n GitHub could not be read for this session right now.\n </PaneEmpty>\n );\n }\n if (pullRequests.length === 0) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"No pull requests\">\n Pull requests the agent opens show here with their checks and review state.\n </PaneEmpty>\n );\n }\n const ordered = orderedPullRequests(pullRequests);\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{ordered.length}</span>}\n >\n Pull requests\n </SectionHeading>\n <ul aria-label=\"Pull requests\">\n {ordered.map((pullRequest) => (\n <PullRequestRow key={pullRequest.url} pullRequest={pullRequest} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Attachments ─────────────────────────────────────────────────────\n\nconst ASSET_ICON: Record<string, FC<{ className?: string }>> = {\n spreadsheet: FileSpreadsheetIcon,\n document: FileTextIcon,\n presentation: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n notebook: BookOpenIcon,\n image: ImageIcon,\n folder: FolderIcon,\n markdown: FileTextIcon,\n pdf: FileTextIcon,\n txt: FileTextIcon,\n};\n\nconst AttachmentRow: FC<{ asset: SessionWorkspaceAsset; canOpenHere: boolean }> = ({\n asset,\n canOpenHere,\n}) => {\n const openAsset = useAssetPanelStore((state) => state.openAsset);\n const Icon = ASSET_ICON[asset.assetType] ?? FileIcon;\n const panelType: AssetPanelType | null = assetPanelTypeOf(asset.assetType);\n const title = asset.title ?? asset.assetId;\n const meta = [\n assetTypeLabel(asset.assetType),\n asset.updatedAt ? `updated ${relativeTime(asset.updatedAt)}` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n const body = (\n <>\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-foreground text-sm\">{title}</span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(asset.updatedAt)}>\n {meta}\n </span>\n </span>\n </>\n );\n return (\n <li className=\"flex items-start gap-1 pr-2\">\n {canOpenHere && panelType ? (\n <button\n type=\"button\"\n onClick={() => openAsset(asset.assetId, { name: title, type: panelType })}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2\">{body}</div>\n )}\n <span className=\"pt-1.5\">\n <OpenInAthenaLink assetId={asset.assetId} compact label={`Open ${title} in Athena`} />\n </span>\n </li>\n );\n};\n\nexport const SessionAttachmentsPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n const canOpenHere = useAssetPanelStore((state) => state.assetPanelHostCount > 0);\n if (!isPersisted) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { assets } = workspace.data;\n if (assets.length === 0) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{assets.length}</span>}\n >\n Created or edited\n </SectionHeading>\n <ul aria-label=\"Session files\">\n {assets.map((asset) => (\n <AttachmentRow key={asset.assetId} asset={asset} canOpenHere={canOpenHere} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Registry ────────────────────────────────────────────────────────\n\nexport const SESSION_WORKBENCH_TASKS_PANE: SessionWorkbenchPane = {\n id: 'tasks',\n title: 'Tasks',\n description: \"Follow the agent's plan step by step\",\n icon: ListChecksIcon,\n render: () => <SessionTasksPane />,\n};\n\nexport const SESSION_WORKBENCH_SHELL_PANE: SessionWorkbenchPane = {\n id: 'shell',\n title: 'Shell',\n description: 'Commands the agent ran and their output',\n icon: TerminalIcon,\n render: () => <SessionShellPane />,\n};\n\nexport const SESSION_WORKBENCH_COMPUTER_PANE: SessionWorkbenchPane = {\n id: 'computer',\n title: 'Computer',\n description: 'The machine this session works on, and how to reach it',\n icon: MonitorIcon,\n render: () => <SessionComputerPane />,\n};\n\nexport const SESSION_WORKBENCH_PULL_REQUESTS_PANE: SessionWorkbenchPane = {\n id: 'pull-requests',\n title: 'Pull requests',\n description: 'Pull requests this session opened, with checks and reviews',\n icon: GitPullRequestIcon,\n render: () => <SessionPullRequestsPane />,\n};\n\nexport const SESSION_WORKBENCH_ATTACHMENTS_PANE: SessionWorkbenchPane = {\n id: 'attachments',\n title: 'Attachments',\n description: 'Files and assets this session created or edited',\n icon: PaperclipIcon,\n render: () => <SessionAttachmentsPane />,\n};\n\n/** The built-in panes, in \"+\" menu order. Spread it to add your own. */\nexport const DEFAULT_SESSION_WORKBENCH_PANES: readonly SessionWorkbenchPane[] = [\n SESSION_WORKBENCH_TASKS_PANE,\n SESSION_WORKBENCH_SHELL_PANE,\n SESSION_WORKBENCH_COMPUTER_PANE,\n SESSION_WORKBENCH_PULL_REQUESTS_PANE,\n SESSION_WORKBENCH_ATTACHMENTS_PANE,\n];\n\n/** The panes a thread opens with until the person changes its tabs. */\nexport const DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS: readonly string[] = [\n SESSION_WORKBENCH_TASKS_PANE.id,\n SESSION_WORKBENCH_SHELL_PANE.id,\n SESSION_WORKBENCH_COMPUTER_PANE.id,\n];\n"],"names":["jsxs","jsx","AlertCircleIcon","useAuiState","hasStatewireThreadExtras","useStatewireState","readDeepAgentStreamValues","useMemo","taskProgress","deriveTaskSteps","ListChecksIcon","PlanStepMarker","cn","LoaderIcon","CheckIcon","XIcon","CircleDashedIcon","relativeTime","useSessionWorkbench","useSessionWorkbenchWorkspace","useStatewireHistory","deriveShellRows","useState","filterShellRows","TerminalIcon","SearchIcon","useAthenaComputerStatus","computerStateBadge","useAthenaComputerSshAccess","_a","CopyIcon","useAthenaConfig","createAthenaSpacesUrl","athenaLinkAppUrl","ExternalLinkIcon","MonitorIcon","workspaceComputers","ComputerLiveDesktop","Fragment","pullRequestChipState","PR_STATE_ICON","PR_CHECKS_LABEL","reviewDecisionLabel","PR_STATE_CLASS","useAthenaStatewireThreadList","useAthenaSessionAttention","GitPullRequestIcon","orderedPullRequests","FileSpreadsheetIcon","FileTextIcon","PresentationIcon","BookOpenIcon","ImageIcon","FolderIcon","useAssetPanelStore","FileIcon","assetPanelTypeOf","assetTypeLabel","PaperclipIcon"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
4
- const WorkbenchLayoutContext = react.createContext(null);
3
+ const require$$0 = require("react");
4
+ const WorkbenchLayoutContext = require$$0.createContext(null);
5
5
  function useWorkbenchLayout() {
6
- return react.useContext(WorkbenchLayoutContext);
6
+ return require$$0.useContext(WorkbenchLayoutContext);
7
7
  }
8
8
  exports.WorkbenchLayoutContext = WorkbenchLayoutContext;
9
9
  exports.useWorkbenchLayout = useWorkbenchLayout;
@@ -1 +1 @@
1
- {"version":3,"file":"workbench-layout-context.cjs","sources":["../../src/workbench/workbench-layout-context.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * What `AthenaLayout` tells the `SessionWorkbench` it hosts in its right-hand\n * column: whether that column is collapsed to a rail or maximized over the\n * chat (the layout owns its width), and that the open assets render inside\n * the workbench (as its \"Open assets\" tab) instead of in a column of their own.\n */\nexport interface WorkbenchLayoutState {\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n /** Whether a session the person has not opened the workspace in starts collapsed. */\n defaultCollapsed: boolean;\n /** The column fills the layout and the chat is hidden until it is restored. */\n maximized: boolean;\n setMaximized: (maximized: boolean) => void;\n hostsAssetPanel: boolean;\n}\n\nexport const WorkbenchLayoutContext = createContext<WorkbenchLayoutState | null>(null);\n\n/** The hosting layout's state, or `null` for a workbench the host placed itself. */\nexport function useWorkbenchLayout(): WorkbenchLayoutState | null {\n return useContext(WorkbenchLayoutContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;AAmBO,MAAM,yBAAyBA,MAAAA,cAA2C,IAAI;AAG9E,SAAS,qBAAkD;AAChE,SAAOC,MAAAA,WAAW,sBAAsB;AAC1C;;;"}
1
+ {"version":3,"file":"workbench-layout-context.cjs","sources":["../../src/workbench/workbench-layout-context.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\n/**\n * What `AthenaLayout` tells the `SessionWorkbench` it hosts in its right-hand\n * column: whether that column is collapsed to a rail or maximized over the\n * chat (the layout owns its width), and that the open assets render inside\n * the workbench (as its \"Open assets\" tab) instead of in a column of their own.\n */\nexport interface WorkbenchLayoutState {\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n /** Whether a session the person has not opened the workspace in starts collapsed. */\n defaultCollapsed: boolean;\n /** The column fills the layout and the chat is hidden until it is restored. */\n maximized: boolean;\n setMaximized: (maximized: boolean) => void;\n hostsAssetPanel: boolean;\n}\n\nexport const WorkbenchLayoutContext = createContext<WorkbenchLayoutState | null>(null);\n\n/** The hosting layout's state, or `null` for a workbench the host placed itself. */\nexport function useWorkbenchLayout(): WorkbenchLayoutState | null {\n return useContext(WorkbenchLayoutContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;AAmBO,MAAM,yBAAyBA,WAAAA,cAA2C,IAAI;AAG9E,SAAS,qBAAkD;AAChE,SAAOC,WAAAA,WAAW,sBAAsB;AAC1C;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@athenaintel/react",
3
- "version": "0.42.2",
3
+ "version": "0.48.0",
4
4
  "description": "Athena React SDK — Build AI-powered chat applications with the Athena platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -140,6 +140,7 @@
140
140
  },
141
141
  "devDependencies": {
142
142
  "@athenaintel/agent-runtime": "workspace:*",
143
+ "@athenaintel/keryx-http": "workspace:*",
143
144
  "@athenaintel/references": "workspace:*",
144
145
  "@athenaintel/tiptap-markdown-table": "workspace:*",
145
146
  "@happy-dom/global-registrator": "^20.10.6",