@athenaintel/react 0.57.1 → 0.59.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 (811) hide show
  1. package/README.md +778 -9
  2. package/dist/agent-runtime/src/addressed-agents.cjs +16 -0
  3. package/dist/agent-runtime/src/addressed-agents.cjs.map +1 -0
  4. package/dist/agent-runtime/src/addressed-agents.d.ts +30 -0
  5. package/dist/agent-runtime/src/addressed-agents.js +16 -0
  6. package/dist/agent-runtime/src/addressed-agents.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-label.cjs +4 -3
  8. package/dist/agent-runtime/src/answer-label.cjs.map +1 -1
  9. package/dist/agent-runtime/src/answer-label.d.ts +13 -6
  10. package/dist/agent-runtime/src/answer-label.js +4 -3
  11. package/dist/agent-runtime/src/answer-label.js.map +1 -1
  12. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -1
  13. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +1 -1
  14. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -1
  15. package/dist/agent-runtime/src/chat-outbox-entry.cjs +101 -0
  16. package/dist/agent-runtime/src/chat-outbox-entry.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-entry.d.ts +99 -0
  18. package/dist/agent-runtime/src/chat-outbox-entry.js +101 -0
  19. package/dist/agent-runtime/src/chat-outbox-entry.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-legacy.cjs +252 -0
  21. package/dist/agent-runtime/src/chat-outbox-legacy.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-legacy.d.ts +96 -0
  23. package/dist/agent-runtime/src/chat-outbox-legacy.js +252 -0
  24. package/dist/agent-runtime/src/chat-outbox-legacy.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox-policy.cjs +30 -0
  26. package/dist/agent-runtime/src/chat-outbox-policy.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox-policy.d.ts +42 -0
  28. package/dist/agent-runtime/src/chat-outbox-policy.js +30 -0
  29. package/dist/agent-runtime/src/chat-outbox-policy.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-outbox-storage.cjs +306 -0
  31. package/dist/agent-runtime/src/chat-outbox-storage.cjs.map +1 -0
  32. package/dist/agent-runtime/src/chat-outbox-storage.d.ts +194 -0
  33. package/dist/agent-runtime/src/chat-outbox-storage.js +306 -0
  34. package/dist/agent-runtime/src/chat-outbox-storage.js.map +1 -0
  35. package/dist/agent-runtime/src/chat-outbox-thread.cjs +21 -94
  36. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -1
  37. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +22 -18
  38. package/dist/agent-runtime/src/chat-outbox-thread.js +21 -94
  39. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -1
  40. package/dist/agent-runtime/src/chat-outbox.cjs +492 -547
  41. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  42. package/dist/agent-runtime/src/chat-outbox.d.ts +110 -142
  43. package/dist/agent-runtime/src/chat-outbox.js +492 -547
  44. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  45. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  46. package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
  47. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  48. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
  49. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  50. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
  51. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
  52. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  53. package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
  54. package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
  55. package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
  56. package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
  57. package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
  58. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  59. package/dist/agent-runtime/src/edit-command.d.ts +1 -1
  60. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  61. package/dist/agent-runtime/src/errors.cjs +1 -0
  62. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  63. package/dist/agent-runtime/src/errors.js +1 -0
  64. package/dist/agent-runtime/src/errors.js.map +1 -1
  65. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
  66. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  67. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
  68. package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
  69. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  70. package/dist/agent-runtime/src/index.d.ts +14 -8
  71. package/dist/agent-runtime/src/lane-follow.cjs +289 -0
  72. package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
  73. package/dist/agent-runtime/src/lane-follow.js +289 -0
  74. package/dist/agent-runtime/src/lane-follow.js.map +1 -0
  75. package/dist/agent-runtime/src/lane-images.cjs +387 -0
  76. package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
  77. package/dist/agent-runtime/src/lane-images.js +387 -0
  78. package/dist/agent-runtime/src/lane-images.js.map +1 -0
  79. package/dist/agent-runtime/src/message-window.js +1 -1
  80. package/dist/agent-runtime/src/messages.cjs +19 -1
  81. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  82. package/dist/agent-runtime/src/messages.d.ts +8 -0
  83. package/dist/agent-runtime/src/messages.js +21 -3
  84. package/dist/agent-runtime/src/messages.js.map +1 -1
  85. package/dist/agent-runtime/src/named-agents.cjs +301 -0
  86. package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
  87. package/dist/agent-runtime/src/named-agents.d.ts +246 -0
  88. package/dist/agent-runtime/src/named-agents.js +301 -0
  89. package/dist/agent-runtime/src/named-agents.js.map +1 -0
  90. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  91. package/dist/agent-runtime/src/offline-status.d.ts +66 -2
  92. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  93. package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
  94. package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
  95. package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
  96. package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
  97. package/dist/agent-runtime/src/queue.cjs +2 -2
  98. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  99. package/dist/agent-runtime/src/queue.d.ts +20 -25
  100. package/dist/agent-runtime/src/queue.js +2 -2
  101. package/dist/agent-runtime/src/queue.js.map +1 -1
  102. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
  103. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  104. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
  105. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
  106. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  107. package/dist/agent-runtime/src/run-send.cjs +54 -0
  108. package/dist/agent-runtime/src/run-send.cjs.map +1 -0
  109. package/dist/agent-runtime/src/run-send.d.ts +51 -0
  110. package/dist/agent-runtime/src/run-send.js +54 -0
  111. package/dist/agent-runtime/src/run-send.js.map +1 -0
  112. package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
  113. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
  114. package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
  115. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
  116. package/dist/agent-runtime/src/runtime.d.ts +9 -5
  117. package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
  118. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
  119. package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
  120. package/dist/agent-runtime/src/sealed-idb.js +64 -0
  121. package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
  122. package/dist/agent-runtime/src/send-recovery.cjs +90 -118
  123. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  124. package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
  125. package/dist/agent-runtime/src/send-recovery.js +90 -118
  126. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  127. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
  128. package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
  129. package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
  130. package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
  131. package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
  132. package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
  133. package/dist/agent-runtime/src/statewire-state.cjs +4 -0
  134. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
  135. package/dist/agent-runtime/src/statewire-state.js +4 -0
  136. package/dist/agent-runtime/src/statewire-state.js.map +1 -1
  137. package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
  138. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  139. package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
  140. package/dist/agent-runtime/src/statewire-transport.js +8 -2
  141. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  142. package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
  143. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
  144. package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
  145. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
  146. package/dist/agent-runtime/src/subagents.cjs +22 -29
  147. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  148. package/dist/agent-runtime/src/subagents.js +23 -30
  149. package/dist/agent-runtime/src/subagents.js.map +1 -1
  150. package/dist/agent-runtime/src/thread-extras.cjs +27 -19
  151. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
  152. package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
  153. package/dist/agent-runtime/src/thread-extras.js +27 -19
  154. package/dist/agent-runtime/src/thread-extras.js.map +1 -1
  155. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
  156. package/dist/agent-runtime/src/tool-metadata.cjs +12 -0
  157. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  158. package/dist/agent-runtime/src/tool-metadata.js +12 -0
  159. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  160. package/dist/agent-runtime/src/tool-names.cjs +21 -0
  161. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  162. package/dist/agent-runtime/src/tool-names.d.ts +8 -0
  163. package/dist/agent-runtime/src/tool-names.js +21 -0
  164. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  165. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
  166. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
  167. package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
  168. package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
  169. package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
  170. package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
  171. package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
  172. package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
  173. package/dist/agent-runtime/src/typed-interrupts.js +48 -0
  174. package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
  175. package/dist/agent-runtime/src/types.d.ts +1 -1
  176. package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
  177. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  178. package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
  179. package/dist/agent-runtime/src/use-conversation-list.js +1 -0
  180. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  181. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
  182. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  183. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +14 -22
  184. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
  185. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  186. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
  187. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  188. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
  189. package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
  190. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  191. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
  192. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  193. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
  194. package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
  195. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  196. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
  197. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  198. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
  199. package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
  200. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  201. package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
  202. package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
  203. package/dist/agent-runtime/src/work-in.d.ts +127 -0
  204. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  205. package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
  206. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  207. package/dist/assets/asset-panel-store.cjs +13 -5
  208. package/dist/assets/asset-panel-store.cjs.map +1 -1
  209. package/dist/assets/asset-panel-store.d.ts +33 -2
  210. package/dist/assets/asset-panel-store.js +13 -5
  211. package/dist/assets/asset-panel-store.js.map +1 -1
  212. package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
  213. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  214. package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
  215. package/dist/auth/AthenaCredentialSourceContext.js +11 -0
  216. package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
  217. package/dist/auth/account-identity.cjs +13 -2
  218. package/dist/auth/account-identity.cjs.map +1 -1
  219. package/dist/auth/account-identity.d.ts +9 -0
  220. package/dist/auth/account-identity.js +13 -2
  221. package/dist/auth/account-identity.js.map +1 -1
  222. package/dist/auth/credential-source.cjs +20 -4
  223. package/dist/auth/credential-source.cjs.map +1 -1
  224. package/dist/auth/credential-source.d.ts +9 -0
  225. package/dist/auth/credential-source.js +20 -4
  226. package/dist/auth/credential-source.js.map +1 -1
  227. package/dist/catalog/chat-pickers.cjs +31 -0
  228. package/dist/catalog/chat-pickers.cjs.map +1 -1
  229. package/dist/catalog/chat-pickers.d.ts +17 -0
  230. package/dist/catalog/chat-pickers.js +33 -2
  231. package/dist/catalog/chat-pickers.js.map +1 -1
  232. package/dist/catalog/runtime-catalog.cjs +63 -3
  233. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  234. package/dist/catalog/runtime-catalog.d.ts +63 -3
  235. package/dist/catalog/runtime-catalog.js +64 -4
  236. package/dist/catalog/runtime-catalog.js.map +1 -1
  237. package/dist/chat/AthenaChat.cjs +337 -99
  238. package/dist/chat/AthenaChat.cjs.map +1 -1
  239. package/dist/chat/AthenaChat.d.ts +80 -4
  240. package/dist/chat/AthenaChat.js +337 -99
  241. package/dist/chat/AthenaChat.js.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.cjs +35 -5
  243. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  244. package/dist/chat/StatewireApprovalCard.d.ts +55 -2
  245. package/dist/chat/StatewireApprovalCard.js +37 -7
  246. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +17 -2
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
  250. package/dist/chat/StatewireQueuedMessages.js +18 -3
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/chat-agent-mentions.cjs +70 -0
  253. package/dist/chat/chat-agent-mentions.cjs.map +1 -0
  254. package/dist/chat/chat-agent-mentions.d.ts +13 -0
  255. package/dist/chat/chat-agent-mentions.js +70 -0
  256. package/dist/chat/chat-agent-mentions.js.map +1 -0
  257. package/dist/chat/composer-actions.cjs +12 -0
  258. package/dist/chat/composer-actions.cjs.map +1 -0
  259. package/dist/chat/composer-actions.d.ts +22 -0
  260. package/dist/chat/composer-actions.js +12 -0
  261. package/dist/chat/composer-actions.js.map +1 -0
  262. package/dist/chat/follow-up-suggestions.cjs +185 -0
  263. package/dist/chat/follow-up-suggestions.cjs.map +1 -0
  264. package/dist/chat/follow-up-suggestions.d.ts +64 -0
  265. package/dist/chat/follow-up-suggestions.js +185 -0
  266. package/dist/chat/follow-up-suggestions.js.map +1 -0
  267. package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
  268. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  269. package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
  270. package/dist/chat/super-grouping/ToolTimeline.js +4 -3
  271. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  272. package/dist/chat/turn-changes.cjs +284 -0
  273. package/dist/chat/turn-changes.cjs.map +1 -0
  274. package/dist/chat/turn-changes.d.ts +130 -0
  275. package/dist/chat/turn-changes.js +284 -0
  276. package/dist/chat/turn-changes.js.map +1 -0
  277. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
  278. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
  279. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
  280. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
  281. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
  282. package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
  283. package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
  284. package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
  285. package/dist/chat/typed-interrupts/approval-cards.js +250 -0
  286. package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
  287. package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
  288. package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
  289. package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
  290. package/dist/chat/typed-interrupts/form-cards.js +289 -0
  291. package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
  292. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
  293. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
  294. package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
  295. package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
  296. package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
  297. package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
  298. package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
  299. package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
  300. package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
  301. package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
  302. package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
  303. package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
  304. package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
  305. package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
  306. package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
  307. package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
  308. package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
  309. package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
  310. package/dist/chat/typed-interrupts/request-file-card.js +159 -0
  311. package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
  312. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
  313. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
  314. package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
  315. package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
  316. package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
  317. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
  318. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
  319. package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
  320. package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
  321. package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
  322. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
  323. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
  324. package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
  325. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
  326. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
  327. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
  328. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
  329. package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
  330. package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
  331. package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
  332. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
  333. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
  334. package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
  335. package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
  336. package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
  337. package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
  338. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
  339. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
  340. package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
  341. package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
  342. package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
  343. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
  344. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
  345. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
  346. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
  347. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
  348. package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
  349. package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
  350. package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
  351. package/dist/chat-ui/composer/composer-named-agents.js +13 -0
  352. package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
  353. package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
  354. package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
  355. package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
  356. package/dist/chat-ui/composer/slash-command-menu.js +143 -0
  357. package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
  358. package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
  359. package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
  360. package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
  361. package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
  362. package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
  363. package/dist/chat-ui/composer/slash-commands.cjs +74 -0
  364. package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
  365. package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
  366. package/dist/chat-ui/composer/slash-commands.js +74 -0
  367. package/dist/chat-ui/composer/slash-commands.js.map +1 -0
  368. package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
  369. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  370. package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
  371. package/dist/chat-ui/composer/tiptap-composer.js +135 -9
  372. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  373. package/dist/chat-ui/index.cjs +3 -0
  374. package/dist/chat-ui/index.cjs.map +1 -1
  375. package/dist/chat-ui/index.d.ts +3 -2
  376. package/dist/chat-ui/index.js +3 -0
  377. package/dist/chat-ui/index.js.map +1 -1
  378. package/dist/chat-ui/mentions/mention-chip.cjs +1 -1
  379. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/mention-chip.js +2 -2
  381. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  382. package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
  383. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  384. package/dist/chat-ui/mentions/mention-extension.js +8 -1
  385. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  386. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
  387. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
  388. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
  389. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +2 -0
  391. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +3 -1
  393. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  394. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
  395. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  396. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
  397. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  398. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +36 -0
  399. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  400. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +42 -0
  401. package/dist/chat-ui/mentions/suggestions/data/api-client.js +36 -0
  402. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  403. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +235 -19
  404. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  405. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
  406. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +236 -20
  407. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  408. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
  409. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
  410. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
  411. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
  412. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  413. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +26 -6
  414. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
  415. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  416. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
  417. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
  418. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
  419. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
  420. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
  421. package/dist/chat-ui/statewire.d.ts +1 -1
  422. package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
  423. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  424. package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
  425. package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
  426. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  427. package/dist/collab/client.cjs +17 -5
  428. package/dist/collab/client.cjs.map +1 -1
  429. package/dist/collab/client.d.ts +22 -7
  430. package/dist/collab/client.js +17 -5
  431. package/dist/collab/client.js.map +1 -1
  432. package/dist/composer/ComposerAttachedReferences.cjs +119 -0
  433. package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
  434. package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
  435. package/dist/composer/ComposerAttachedReferences.js +119 -0
  436. package/dist/composer/ComposerAttachedReferences.js.map +1 -0
  437. package/dist/composer/ComposerNamedAgents.cjs +63 -0
  438. package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
  439. package/dist/composer/ComposerNamedAgents.d.ts +16 -0
  440. package/dist/composer/ComposerNamedAgents.js +63 -0
  441. package/dist/composer/ComposerNamedAgents.js.map +1 -0
  442. package/dist/composer/attached-references.cjs +159 -0
  443. package/dist/composer/attached-references.cjs.map +1 -0
  444. package/dist/composer/attached-references.d.ts +86 -0
  445. package/dist/composer/attached-references.js +159 -0
  446. package/dist/composer/attached-references.js.map +1 -0
  447. package/dist/composer/build-composed-message.cjs +14 -7
  448. package/dist/composer/build-composed-message.cjs.map +1 -1
  449. package/dist/composer/build-composed-message.d.ts +6 -1
  450. package/dist/composer/build-composed-message.js +14 -7
  451. package/dist/composer/build-composed-message.js.map +1 -1
  452. package/dist/composer/composer-handoff.cjs +6 -2
  453. package/dist/composer/composer-handoff.cjs.map +1 -1
  454. package/dist/composer/composer-handoff.d.ts +7 -1
  455. package/dist/composer/composer-handoff.js +6 -2
  456. package/dist/composer/composer-handoff.js.map +1 -1
  457. package/dist/composer/folder-upload.cjs +149 -0
  458. package/dist/composer/folder-upload.cjs.map +1 -0
  459. package/dist/composer/folder-upload.d.ts +79 -0
  460. package/dist/composer/folder-upload.js +149 -0
  461. package/dist/composer/folder-upload.js.map +1 -0
  462. package/dist/composer/index.d.ts +1 -1
  463. package/dist/composer/useAttachToChat.cjs +35 -0
  464. package/dist/composer/useAttachToChat.cjs.map +1 -0
  465. package/dist/composer/useAttachToChat.d.ts +54 -0
  466. package/dist/composer/useAttachToChat.js +35 -0
  467. package/dist/composer/useAttachToChat.js.map +1 -0
  468. package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
  469. package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
  470. package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
  471. package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
  472. package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
  473. package/dist/composer/useFileUpload.cjs +95 -7
  474. package/dist/composer/useFileUpload.cjs.map +1 -1
  475. package/dist/composer/useFileUpload.d.ts +21 -2
  476. package/dist/composer/useFileUpload.js +95 -7
  477. package/dist/composer/useFileUpload.js.map +1 -1
  478. package/dist/data/athena-api-error.cjs +125 -0
  479. package/dist/data/athena-api-error.cjs.map +1 -0
  480. package/dist/data/athena-api-error.d.ts +96 -0
  481. package/dist/data/athena-api-error.js +125 -0
  482. package/dist/data/athena-api-error.js.map +1 -0
  483. package/dist/data/athena-data-client.cjs +106 -0
  484. package/dist/data/athena-data-client.cjs.map +1 -0
  485. package/dist/data/athena-data-client.d.ts +74 -0
  486. package/dist/data/athena-data-client.js +106 -0
  487. package/dist/data/athena-data-client.js.map +1 -0
  488. package/dist/data/athena-member.cjs +93 -0
  489. package/dist/data/athena-member.cjs.map +1 -0
  490. package/dist/data/athena-member.d.ts +125 -0
  491. package/dist/data/athena-member.js +93 -0
  492. package/dist/data/athena-member.js.map +1 -0
  493. package/dist/data/athena-request.cjs +458 -0
  494. package/dist/data/athena-request.cjs.map +1 -0
  495. package/dist/data/athena-request.d.ts +120 -0
  496. package/dist/data/athena-request.js +458 -0
  497. package/dist/data/athena-request.js.map +1 -0
  498. package/dist/data/use-athena-fetch.cjs +14 -0
  499. package/dist/data/use-athena-fetch.cjs.map +1 -0
  500. package/dist/data/use-athena-fetch.d.ts +19 -0
  501. package/dist/data/use-athena-fetch.js +14 -0
  502. package/dist/data/use-athena-fetch.js.map +1 -0
  503. package/dist/data/use-athena-graphql.cjs +66 -0
  504. package/dist/data/use-athena-graphql.cjs.map +1 -0
  505. package/dist/data/use-athena-graphql.d.ts +56 -0
  506. package/dist/data/use-athena-graphql.js +66 -0
  507. package/dist/data/use-athena-graphql.js.map +1 -0
  508. package/dist/data/use-athena-rest.cjs +33 -0
  509. package/dist/data/use-athena-rest.cjs.map +1 -0
  510. package/dist/data/use-athena-rest.d.ts +21 -0
  511. package/dist/data/use-athena-rest.js +33 -0
  512. package/dist/data/use-athena-rest.js.map +1 -0
  513. package/dist/data/use-semantic-query.cjs +44 -0
  514. package/dist/data/use-semantic-query.cjs.map +1 -0
  515. package/dist/data/use-semantic-query.d.ts +92 -0
  516. package/dist/data/use-semantic-query.js +44 -0
  517. package/dist/data/use-semantic-query.js.map +1 -0
  518. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  519. package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
  520. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  521. package/dist/diagnostics/errors.cjs +7 -0
  522. package/dist/diagnostics/errors.cjs.map +1 -1
  523. package/dist/diagnostics/errors.d.ts +7 -0
  524. package/dist/diagnostics/errors.js +7 -0
  525. package/dist/diagnostics/errors.js.map +1 -1
  526. package/dist/index.cjs +155 -11
  527. package/dist/index.cjs.map +1 -1
  528. package/dist/index.d.ts +72 -13
  529. package/dist/index.js +148 -4
  530. package/dist/index.js.map +1 -1
  531. package/dist/keryx-http/src/initial-sync.cjs +64 -16
  532. package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
  533. package/dist/keryx-http/src/initial-sync.d.ts +31 -1
  534. package/dist/keryx-http/src/initial-sync.js +64 -16
  535. package/dist/keryx-http/src/initial-sync.js.map +1 -1
  536. package/dist/keryx-http/src/own-awareness.cjs +20 -0
  537. package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
  538. package/dist/keryx-http/src/own-awareness.d.ts +50 -0
  539. package/dist/keryx-http/src/own-awareness.js +20 -0
  540. package/dist/keryx-http/src/own-awareness.js.map +1 -0
  541. package/dist/keryx-http/src/update-attributions.cjs +26 -1
  542. package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
  543. package/dist/keryx-http/src/update-attributions.d.ts +10 -1
  544. package/dist/keryx-http/src/update-attributions.js +26 -1
  545. package/dist/keryx-http/src/update-attributions.js.map +1 -1
  546. package/dist/offline/chat-outbox.cjs +262 -26
  547. package/dist/offline/chat-outbox.cjs.map +1 -1
  548. package/dist/offline/chat-outbox.d.ts +90 -12
  549. package/dist/offline/chat-outbox.js +263 -27
  550. package/dist/offline/chat-outbox.js.map +1 -1
  551. package/dist/provider/AthenaProvider.cjs +63 -19
  552. package/dist/provider/AthenaProvider.cjs.map +1 -1
  553. package/dist/provider/AthenaProvider.d.ts +24 -8
  554. package/dist/provider/AthenaProvider.js +66 -22
  555. package/dist/provider/AthenaProvider.js.map +1 -1
  556. package/dist/react/package.json.cjs +1 -1
  557. package/dist/react/package.json.js +1 -1
  558. package/dist/references/src/anchors/types.cjs +5 -0
  559. package/dist/references/src/anchors/types.cjs.map +1 -1
  560. package/dist/references/src/anchors/types.js +5 -0
  561. package/dist/references/src/anchors/types.js.map +1 -1
  562. package/dist/references/src/attachable.cjs +149 -0
  563. package/dist/references/src/attachable.cjs.map +1 -0
  564. package/dist/references/src/attachable.d.ts +87 -0
  565. package/dist/references/src/attachable.js +149 -0
  566. package/dist/references/src/attachable.js.map +1 -0
  567. package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
  568. package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
  569. package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
  570. package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
  571. package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
  572. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
  573. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  574. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
  575. package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
  576. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
  577. package/dist/runtime/statewire-plan-mode.cjs +71 -0
  578. package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
  579. package/dist/runtime/statewire-plan-mode.d.ts +88 -0
  580. package/dist/runtime/statewire-plan-mode.js +71 -0
  581. package/dist/runtime/statewire-plan-mode.js.map +1 -0
  582. package/dist/runtime/statewire-run-config.cjs +18 -1
  583. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  584. package/dist/runtime/statewire-run-config.d.ts +20 -0
  585. package/dist/runtime/statewire-run-config.js +18 -1
  586. package/dist/runtime/statewire-run-config.js.map +1 -1
  587. package/dist/runtime/statewire-session-key.cjs +11 -5
  588. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  589. package/dist/runtime/statewire-session-key.d.ts +22 -10
  590. package/dist/runtime/statewire-session-key.js +11 -5
  591. package/dist/runtime/statewire-session-key.js.map +1 -1
  592. package/dist/runtime/useAthenaStatewireRuntime.cjs +65 -8
  593. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  594. package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
  595. package/dist/runtime/useAthenaStatewireRuntime.js +67 -10
  596. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  597. package/dist/search/useAthenaAssets.cjs +394 -0
  598. package/dist/search/useAthenaAssets.cjs.map +1 -0
  599. package/dist/search/useAthenaAssets.d.ts +186 -0
  600. package/dist/search/useAthenaAssets.js +394 -0
  601. package/dist/search/useAthenaAssets.js.map +1 -0
  602. package/dist/sheet-range/index.cjs +4 -0
  603. package/dist/sheet-range/index.cjs.map +1 -1
  604. package/dist/sheet-range/index.d.ts +4 -2
  605. package/dist/sheet-range/index.js +4 -0
  606. package/dist/sheet-range/index.js.map +1 -1
  607. package/dist/sheet-range/query-range.cjs +102 -0
  608. package/dist/sheet-range/query-range.cjs.map +1 -0
  609. package/dist/sheet-range/query-range.d.ts +46 -0
  610. package/dist/sheet-range/query-range.js +102 -0
  611. package/dist/sheet-range/query-range.js.map +1 -0
  612. package/dist/styles.css +1 -1
  613. package/dist/subagents/index.cjs +49 -0
  614. package/dist/subagents/index.cjs.map +1 -0
  615. package/dist/subagents/index.d.ts +16 -0
  616. package/dist/subagents/index.js +49 -0
  617. package/dist/subagents/index.js.map +1 -0
  618. package/dist/subagents/lane-follow.cjs +19 -0
  619. package/dist/subagents/lane-follow.cjs.map +1 -0
  620. package/dist/subagents/lane-follow.d.ts +9 -0
  621. package/dist/subagents/lane-follow.js +19 -0
  622. package/dist/subagents/lane-follow.js.map +1 -0
  623. package/dist/subagents/lane-model.cjs +178 -0
  624. package/dist/subagents/lane-model.cjs.map +1 -0
  625. package/dist/subagents/lane-model.d.ts +140 -0
  626. package/dist/subagents/lane-model.js +178 -0
  627. package/dist/subagents/lane-model.js.map +1 -0
  628. package/dist/subagents/lane-parts.cjs +517 -0
  629. package/dist/subagents/lane-parts.cjs.map +1 -0
  630. package/dist/subagents/lane-parts.d.ts +130 -0
  631. package/dist/subagents/lane-parts.js +517 -0
  632. package/dist/subagents/lane-parts.js.map +1 -0
  633. package/dist/subagents/subagent-lane-group.cjs +215 -0
  634. package/dist/subagents/subagent-lane-group.cjs.map +1 -0
  635. package/dist/subagents/subagent-lane-group.d.ts +67 -0
  636. package/dist/subagents/subagent-lane-group.js +215 -0
  637. package/dist/subagents/subagent-lane-group.js.map +1 -0
  638. package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
  639. package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
  640. package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
  641. package/dist/subagents/subagent-transcript-drawer.js +431 -0
  642. package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
  643. package/dist/subagents/task-subagent-group.cjs +115 -0
  644. package/dist/subagents/task-subagent-group.cjs.map +1 -0
  645. package/dist/subagents/task-subagent-group.d.ts +36 -0
  646. package/dist/subagents/task-subagent-group.js +115 -0
  647. package/dist/subagents/task-subagent-group.js.map +1 -0
  648. package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
  649. package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
  650. package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
  651. package/dist/subagents/use-omitted-images-in-view.js +68 -0
  652. package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
  653. package/dist/threads/Inbox.cjs +2 -2
  654. package/dist/threads/Inbox.cjs.map +1 -1
  655. package/dist/threads/SessionList.cjs +27 -24
  656. package/dist/threads/SessionList.cjs.map +1 -1
  657. package/dist/threads/SessionList.js +22 -19
  658. package/dist/threads/SessionList.js.map +1 -1
  659. package/dist/threads/SessionsPage.cjs +13 -7
  660. package/dist/threads/SessionsPage.cjs.map +1 -1
  661. package/dist/threads/SessionsPage.d.ts +10 -1
  662. package/dist/threads/SessionsPage.js +9 -3
  663. package/dist/threads/SessionsPage.js.map +1 -1
  664. package/dist/threads/live-session-rows.cjs +207 -0
  665. package/dist/threads/live-session-rows.cjs.map +1 -0
  666. package/dist/threads/live-session-rows.d.ts +175 -0
  667. package/dist/threads/live-session-rows.js +207 -0
  668. package/dist/threads/live-session-rows.js.map +1 -0
  669. package/dist/threads/session-list-model.cjs.map +1 -1
  670. package/dist/threads/session-list-model.d.ts +2 -1
  671. package/dist/threads/session-list-model.js.map +1 -1
  672. package/dist/threads/session-row-parts.cjs +3 -3
  673. package/dist/threads/session-row-parts.cjs.map +1 -1
  674. package/dist/threads/sessions-page-model.cjs +13 -5
  675. package/dist/threads/sessions-page-model.cjs.map +1 -1
  676. package/dist/threads/sessions-page-model.d.ts +7 -0
  677. package/dist/threads/sessions-page-model.js +11 -3
  678. package/dist/threads/sessions-page-model.js.map +1 -1
  679. package/dist/threads/sessions-page-storage.cjs +8 -8
  680. package/dist/threads/sessions-page-storage.cjs.map +1 -1
  681. package/dist/threads/sessions-page-storage.d.ts +5 -1
  682. package/dist/threads/sessions-page-storage.js +8 -8
  683. package/dist/threads/sessions-page-storage.js.map +1 -1
  684. package/dist/threads/statewire-thread-list.cjs +173 -20
  685. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  686. package/dist/threads/statewire-thread-list.d.ts +44 -1
  687. package/dist/threads/statewire-thread-list.js +174 -21
  688. package/dist/threads/statewire-thread-list.js.map +1 -1
  689. package/dist/threads/use-athena-sessions.cjs +1 -0
  690. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  691. package/dist/threads/use-athena-sessions.d.ts +7 -0
  692. package/dist/threads/use-athena-sessions.js +1 -0
  693. package/dist/threads/use-athena-sessions.js.map +1 -1
  694. package/dist/threads/use-athena-thread-agent.cjs +31 -0
  695. package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
  696. package/dist/threads/use-athena-thread-agent.d.ts +38 -0
  697. package/dist/threads/use-athena-thread-agent.js +31 -0
  698. package/dist/threads/use-athena-thread-agent.js.map +1 -0
  699. package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
  700. package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
  701. package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
  702. package/dist/threads/use-athena-thread-plan-mode.js +18 -0
  703. package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
  704. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  705. package/dist/tools/agent-creations.cjs +97 -0
  706. package/dist/tools/agent-creations.cjs.map +1 -0
  707. package/dist/tools/agent-creations.d.ts +38 -0
  708. package/dist/tools/agent-creations.js +97 -0
  709. package/dist/tools/agent-creations.js.map +1 -0
  710. package/dist/tools/agent-highlights.cjs +100 -0
  711. package/dist/tools/agent-highlights.cjs.map +1 -0
  712. package/dist/tools/agent-highlights.d.ts +57 -0
  713. package/dist/tools/agent-highlights.js +100 -0
  714. package/dist/tools/agent-highlights.js.map +1 -0
  715. package/dist/tools/append-document-tool-ui.cjs +1 -0
  716. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  717. package/dist/tools/append-document-tool-ui.d.ts +7 -0
  718. package/dist/tools/append-document-tool-ui.js +2 -1
  719. package/dist/tools/append-document-tool-ui.js.map +1 -1
  720. package/dist/tools/auto-open-tools.cjs +144 -71
  721. package/dist/tools/auto-open-tools.cjs.map +1 -1
  722. package/dist/tools/auto-open-tools.d.ts +131 -1
  723. package/dist/tools/auto-open-tools.js +145 -72
  724. package/dist/tools/auto-open-tools.js.map +1 -1
  725. package/dist/tools/browser-tool-uis.cjs +594 -0
  726. package/dist/tools/browser-tool-uis.cjs.map +1 -0
  727. package/dist/tools/browser-tool-uis.d.ts +8 -0
  728. package/dist/tools/browser-tool-uis.js +594 -0
  729. package/dist/tools/browser-tool-uis.js.map +1 -0
  730. package/dist/tools/computer-asset-tool-uis.cjs +313 -0
  731. package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
  732. package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
  733. package/dist/tools/computer-asset-tool-uis.js +313 -0
  734. package/dist/tools/computer-asset-tool-uis.js.map +1 -0
  735. package/dist/tools/document-edit-tool-uis.cjs +218 -0
  736. package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
  737. package/dist/tools/document-edit-tool-uis.d.ts +40 -0
  738. package/dist/tools/document-edit-tool-uis.js +218 -0
  739. package/dist/tools/document-edit-tool-uis.js.map +1 -0
  740. package/dist/tools/drive-tool-uis.cjs +425 -0
  741. package/dist/tools/drive-tool-uis.cjs.map +1 -0
  742. package/dist/tools/drive-tool-uis.d.ts +120 -0
  743. package/dist/tools/drive-tool-uis.js +425 -0
  744. package/dist/tools/drive-tool-uis.js.map +1 -0
  745. package/dist/tools/email-calendar-tool-uis.cjs +789 -0
  746. package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
  747. package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
  748. package/dist/tools/email-calendar-tool-uis.js +789 -0
  749. package/dist/tools/email-calendar-tool-uis.js.map +1 -0
  750. package/dist/tools/ontology-tool-uis.cjs +83 -0
  751. package/dist/tools/ontology-tool-uis.cjs.map +1 -0
  752. package/dist/tools/ontology-tool-uis.d.ts +9 -0
  753. package/dist/tools/ontology-tool-uis.js +83 -0
  754. package/dist/tools/ontology-tool-uis.js.map +1 -0
  755. package/dist/tools/orchestration-tool-uis.cjs +586 -0
  756. package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
  757. package/dist/tools/orchestration-tool-uis.d.ts +141 -0
  758. package/dist/tools/orchestration-tool-uis.js +586 -0
  759. package/dist/tools/orchestration-tool-uis.js.map +1 -0
  760. package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
  761. package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
  762. package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
  763. package/dist/tools/presentation-edit-tool-uis.js +516 -0
  764. package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
  765. package/dist/tools/project-tool-uis.cjs +213 -0
  766. package/dist/tools/project-tool-uis.cjs.map +1 -0
  767. package/dist/tools/project-tool-uis.d.ts +14 -0
  768. package/dist/tools/project-tool-uis.js +213 -0
  769. package/dist/tools/project-tool-uis.js.map +1 -0
  770. package/dist/tools/sandbox-tool-uis.cjs +491 -0
  771. package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
  772. package/dist/tools/sandbox-tool-uis.d.ts +116 -0
  773. package/dist/tools/sandbox-tool-uis.js +491 -0
  774. package/dist/tools/sandbox-tool-uis.js.map +1 -0
  775. package/dist/tools/sheet-query-tool-ui.cjs +138 -0
  776. package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
  777. package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
  778. package/dist/tools/sheet-query-tool-ui.js +138 -0
  779. package/dist/tools/sheet-query-tool-ui.js.map +1 -0
  780. package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
  781. package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
  782. package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
  783. package/dist/tools/studio-screenshot-tool-uis.js +262 -0
  784. package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
  785. package/dist/tools/subagent-task-tool-ui.cjs +24 -475
  786. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  787. package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
  788. package/dist/tools/subagent-task-tool-ui.js +28 -479
  789. package/dist/tools/subagent-task-tool-ui.js.map +1 -1
  790. package/dist/tools/tool-summary.cjs +36 -0
  791. package/dist/tools/tool-summary.cjs.map +1 -1
  792. package/dist/tools/tool-summary.js +36 -0
  793. package/dist/tools/tool-summary.js.map +1 -1
  794. package/dist/tools/tool-uis.cjs +181 -53
  795. package/dist/tools/tool-uis.cjs.map +1 -1
  796. package/dist/tools/tool-uis.d.ts +40 -0
  797. package/dist/tools/tool-uis.js +183 -55
  798. package/dist/tools/tool-uis.js.map +1 -1
  799. package/dist/typed-interrupts/index.cjs +15 -0
  800. package/dist/typed-interrupts/index.cjs.map +1 -0
  801. package/dist/typed-interrupts/index.d.ts +20 -0
  802. package/dist/typed-interrupts/index.js +15 -0
  803. package/dist/typed-interrupts/index.js.map +1 -0
  804. package/dist/workbench/session-workbench-panes.cjs +6 -6
  805. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  806. package/package.json +28 -6
  807. package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
  808. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
  809. package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
  810. package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
  811. package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SessionsPage.js","sources":["../../src/threads/SessionsPage.tsx"],"sourcesContent":["/**\n * `SessionsPage` — a full-page, Devin-style session list: filter chips that\n * the server applies (status, pull requests, unread, pinned, creator, agent,\n * mode, origin, created / updated date), a title search, display options\n * (sort, direction, grouping, columns), an attention-coloured status column\n * that says what the person must do next, row actions (read, pin, archive)\n * and a CSV export of the loaded rows. Live through the thread-list\n * provider's conversation index; renders nothing outside\n * `<AthenaProvider enableThreadList>`.\n */\nimport {\n ArchiveIcon,\n CheckIcon,\n DownloadIcon,\n FilterIcon,\n MailIcon,\n MailOpenIcon,\n PinIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n SlidersHorizontalIcon,\n XIcon,\n} from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\nimport { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { SessionListSkeleton, type SessionOpenTarget } from './SessionList';\nimport { pullRequestChip, relativeTime, sessionOriginLabel } from './session-list-model';\nimport { FOCUS_RING_CLASS, PullRequestChip, RowIconButton, StatusChip } from './session-row-parts';\nimport {\n agentLabel,\n channelLabel,\n creatorLabel,\n datePresetBounds,\n groupSessionsBy,\n runStatusLabel,\n SESSIONS_COLUMNS,\n SESSIONS_DATE_PRESETS,\n type SessionsColumnId,\n type SessionsDatePreset,\n type SessionsGroupBy,\n type SessionsLabels,\n sessionsCsv,\n sessionsFilterChips,\n plainExcerpt,\n sessionStatusChip,\n} from './sessions-page-model';\nimport {\n readSessionsPageSettings,\n type SessionsPageDisplay,\n writeSessionsPageSettings,\n} from './sessions-page-storage';\nimport {\n type AthenaSessionsQuery,\n type AthenaSessionsQueryField,\n DEFAULT_COLLAB_CHANNEL,\n normalizeSessionsQuery,\n SESSION_RUN_STATUSES,\n type SessionRunStatus,\n sessionsQueryKey,\n} from './sessions-query';\nimport {\n AthenaSessionsLiveContext,\n type AthenaStatewireThreadListState,\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { useAthenaSessions } from './use-athena-sessions';\n\nexport interface SessionsPageProps {\n className?: string;\n /** Heading (default \"Sessions\"). */\n title?: string;\n /**\n * Called after a row is selected (the provider's chat switches to it), so\n * a host can navigate to its chat view.\n */\n onOpenSession?: (target: SessionOpenTarget) => void;\n /** Names for collab agents and channels (filters, the Mode column, CSV); ids show otherwise. */\n labels?: SessionsLabels;\n /**\n * Namespaces what this browser remembers — \"Save as default\" and the\n * display options — so a host with several pages keeps them apart\n * (default `\"default\"`).\n */\n storageKey?: string;\n /** The filters before anything is saved as default. */\n defaultQuery?: AthenaSessionsQuery;\n /** Rows per page (default 50). */\n pageSize?: number;\n /** Offer \"New session\" (default `true`). */\n showNewSession?: boolean;\n /** Called after \"New session\" starts a fresh chat, so a host can show its chat view. */\n onNewSession?: () => void;\n}\n\n/** What each query field is called in notices. */\nconst FIELD_LABEL: Record<AthenaSessionsQueryField, string> = {\n search: 'search',\n collabAgentIds: 'agent',\n collabChannelIds: 'mode',\n startChannels: 'origin',\n createdAfter: 'created date',\n createdBefore: 'created date',\n updatedAfter: 'updated date',\n updatedBefore: 'updated date',\n favoritesOnly: 'pinned',\n unreadOnly: 'unread',\n runStatuses: 'status',\n sessionStatuses: 'session status',\n hasPullRequests: 'pull requests',\n createdByMe: 'creator',\n excludeDismissed: 'dismissed',\n excludeTriggered: 'who started it',\n sort: 'sort',\n direction: 'sort direction',\n};\n\n/** \"agent\", \"agent and mode\", \"agent, mode and unread\". */\nfunction fieldList(fields: readonly AthenaSessionsQueryField[]): string {\n const names = [...new Set(fields.map((field) => FIELD_LABEL[field]))];\n return names.length <= 1 ? (names[0] ?? '') : `${names.slice(0, -1).join(', ')} and ${names.at(-1)}`;\n}\n\nconst COLUMN_WIDTH: Record<SessionsColumnId, string> = {\n status: 'w-56',\n origin: 'w-24',\n mode: 'w-28',\n pullRequests: 'w-24',\n creator: 'w-32',\n created: 'w-24',\n updated: 'w-24',\n};\n\n/** Save `text` as a file in the browser. */\nfunction downloadText(filename: string, text: string, type: string): void {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(new Blob([text], { type }));\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\nconst SECTION_HEADING_CLASS =\n 'px-3 pb-1 pt-3 text-left font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide';\n\n/** A pressable option in a filter or display menu. */\nconst MenuOption: FC<{\n label: string;\n selected: boolean;\n onSelect: () => void;\n disabled?: boolean;\n role?: 'menuitemcheckbox' | 'menuitemradio';\n}> = ({ label, selected, onSelect, disabled = false, role = 'menuitemcheckbox' }) => (\n <button\n type=\"button\"\n role={role}\n aria-checked={selected}\n disabled={disabled}\n onClick={onSelect}\n className={cn(\n 'flex w-full items-center gap-2 rounded-sm px-2 py-1 text-left text-xs transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border border-border',\n selected && 'border-primary bg-primary text-primary-foreground',\n )}\n >\n {selected ? <CheckIcon className=\"size-3\" /> : null}\n </span>\n <span className=\"truncate\">{label}</span>\n </button>\n);\n\nconst MenuSection: FC<{ title: string; hint?: string | null; children: ReactNode }> = ({\n title,\n hint,\n children,\n}) => (\n <section aria-label={title} className=\"py-1\">\n <h4 className=\"px-2 pb-0.5 font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">\n {title}\n </h4>\n {hint ? <p className=\"px-2 pb-1 text-[11px] text-muted-foreground\">{hint}</p> : null}\n {children}\n </section>\n);\n\nfunction toggleValue<T extends string>(values: readonly T[] | undefined, value: T): T[] {\n const current = values ?? [];\n return current.includes(value) ? current.filter((item) => item !== value) : [...current, value];\n}\n\nfunction datePresetOf(after: string | undefined, before: string | undefined, presets: Record<SessionsDatePreset, { after?: string; before?: string }>): SessionsDatePreset | null {\n for (const preset of SESSIONS_DATE_PRESETS) {\n const bounds = presets[preset.id];\n if ((bounds.after ?? undefined) === after && (bounds.before ?? undefined) === before) {\n return preset.id;\n }\n }\n return null;\n}\n\ninterface FilterMenuProps {\n query: AthenaSessionsQuery;\n setQuery: (update: (query: AthenaSessionsQuery) => AthenaSessionsQuery) => void;\n unavailable: ReadonlySet<AthenaSessionsQueryField>;\n agentOptions: readonly string[];\n channelOptions: readonly string[];\n originOptions: readonly string[];\n labels: SessionsLabels | undefined;\n}\n\nconst UNAVAILABLE_HINT = 'This Athena server cannot filter by this yet.';\n\n/** Every filter, stacked by kind; each option toggles at once. */\nconst FilterMenu: FC<FilterMenuProps> = ({\n query,\n setQuery,\n unavailable,\n agentOptions,\n channelOptions,\n originOptions,\n labels,\n}) => {\n // The presets' bounds are captured when the menu opens, so a selected\n // preset stays recognisable while it is open.\n const [presetBounds] = useState(() =>\n Object.fromEntries(\n SESSIONS_DATE_PRESETS.map((preset) => [preset.id, datePresetBounds(preset.id)]),\n ) as Record<SessionsDatePreset, { after?: string; before?: string }>,\n );\n const createdPreset = datePresetOf(query.createdAfter, query.createdBefore, presetBounds);\n const updatedPreset = datePresetOf(query.updatedAfter, query.updatedBefore, presetBounds);\n const setPreset = (\n kind: 'created' | 'updated',\n preset: SessionsDatePreset | null,\n ) =>\n setQuery((current) => {\n const bounds = preset ? presetBounds[preset] : {};\n return kind === 'created'\n ? { ...current, createdAfter: bounds.after, createdBefore: bounds.before }\n : { ...current, updatedAfter: bounds.after, updatedBefore: bounds.before };\n });\n const disabledHint = (field: AthenaSessionsQueryField) =>\n unavailable.has(field) ? UNAVAILABLE_HINT : null;\n\n return (\n <div role=\"menu\" aria-label=\"Filters\" className=\"max-h-[70vh] overflow-y-auto p-1\">\n <MenuSection title=\"Status\" hint={disabledHint('runStatuses')}>\n {SESSION_RUN_STATUSES.map((status) => (\n <MenuOption\n key={status}\n label={runStatusLabel(status)}\n selected={query.runStatuses?.includes(status) ?? false}\n disabled={unavailable.has('runStatuses')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n runStatuses: toggleValue<SessionRunStatus>(current.runStatuses, status),\n }))\n }\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Pull requests\" hint={disabledHint('hasPullRequests')}>\n {(\n [\n ['Has pull requests', true],\n ['No pull requests', false],\n ] as const\n ).map(([label, value]) => (\n <MenuOption\n key={label}\n role=\"menuitemradio\"\n label={label}\n selected={query.hasPullRequests === value}\n disabled={unavailable.has('hasPullRequests')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n hasPullRequests: current.hasPullRequests === value ? undefined : value,\n }))\n }\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Read and pinned\">\n <MenuOption\n label=\"Unread\"\n selected={query.unreadOnly === true}\n disabled={unavailable.has('unreadOnly')}\n onSelect={() => setQuery((current) => ({ ...current, unreadOnly: !current.unreadOnly }))}\n />\n <MenuOption\n label=\"Pinned\"\n selected={query.favoritesOnly === true}\n disabled={unavailable.has('favoritesOnly')}\n onSelect={() =>\n setQuery((current) => ({ ...current, favoritesOnly: !current.favoritesOnly }))\n }\n />\n </MenuSection>\n <MenuSection title=\"Creator\" hint={disabledHint('createdByMe')}>\n {(\n [\n ['You', true],\n ['Shared with you', false],\n ] as const\n ).map(([label, value]) => (\n <MenuOption\n key={label}\n role=\"menuitemradio\"\n label={label}\n selected={query.createdByMe === value}\n disabled={unavailable.has('createdByMe')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n createdByMe: current.createdByMe === value ? undefined : value,\n }))\n }\n />\n ))}\n <MenuOption\n label=\"Started by a person\"\n selected={query.excludeTriggered === true}\n onSelect={() =>\n setQuery((current) => ({ ...current, excludeTriggered: !current.excludeTriggered }))\n }\n />\n </MenuSection>\n {agentOptions.length > 0 ? (\n <MenuSection title=\"Agent\" hint={disabledHint('collabAgentIds')}>\n {agentOptions.map((agentId) => (\n <MenuOption\n key={agentId}\n label={agentLabel(agentId, labels)}\n selected={query.collabAgentIds?.includes(agentId) ?? false}\n disabled={unavailable.has('collabAgentIds')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n collabAgentIds: toggleValue(current.collabAgentIds, agentId),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n {agentOptions.length > 0 ? (\n <MenuSection\n title=\"Mode\"\n hint={\n disabledHint('collabChannelIds') ??\n (query.collabAgentIds?.length ? null : 'Pick an agent first: a mode is one of its channels.')\n }\n >\n {channelOptions.map((channelId) => (\n <MenuOption\n key={channelId}\n label={channelLabel(channelId, labels)}\n selected={query.collabChannelIds?.includes(channelId) ?? false}\n disabled={unavailable.has('collabChannelIds') || !query.collabAgentIds?.length}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n collabChannelIds: toggleValue(current.collabChannelIds, channelId),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n {originOptions.length > 0 ? (\n <MenuSection title=\"Origin\" hint={disabledHint('startChannels')}>\n {originOptions.map((channel) => (\n <MenuOption\n key={channel}\n label={sessionOriginLabel({ startChannel: channel, appId: null, triggerType: null }) ?? channel}\n selected={query.startChannels?.includes(channel) ?? false}\n disabled={unavailable.has('startChannels')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n startChannels: toggleValue(current.startChannels, channel),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n <MenuSection title=\"Created\">\n {SESSIONS_DATE_PRESETS.map((preset) => (\n <MenuOption\n key={preset.id}\n role=\"menuitemradio\"\n label={preset.label}\n selected={createdPreset === preset.id}\n onSelect={() => setPreset('created', createdPreset === preset.id ? null : preset.id)}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Updated\">\n {SESSIONS_DATE_PRESETS.map((preset) => (\n <MenuOption\n key={preset.id}\n role=\"menuitemradio\"\n label={preset.label}\n selected={updatedPreset === preset.id}\n onSelect={() => setPreset('updated', updatedPreset === preset.id ? null : preset.id)}\n />\n ))}\n </MenuSection>\n </div>\n );\n};\n\nconst DisplayMenu: FC<{\n query: AthenaSessionsQuery;\n setQuery: (update: (query: AthenaSessionsQuery) => AthenaSessionsQuery) => void;\n display: SessionsPageDisplay;\n setDisplay: (update: (display: SessionsPageDisplay) => SessionsPageDisplay) => void;\n}> = ({ query, setQuery, display, setDisplay }) => {\n const sort = query.sort ?? 'updated';\n const direction = query.direction ?? 'desc';\n return (\n <div role=\"menu\" aria-label=\"Display options\" className=\"p-1\">\n <MenuSection title=\"Sort by\">\n {(\n [\n ['updated', 'Last updated'],\n ['created', 'Created'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={sort === value}\n onSelect={() => setQuery((current) => ({ ...current, sort: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Order\">\n {(\n [\n ['desc', 'Newest first'],\n ['asc', 'Oldest first'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={direction === value}\n onSelect={() => setQuery((current) => ({ ...current, direction: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Group by\">\n {(\n [\n ['attention', 'What it needs'],\n ['status', 'Run status'],\n ['none', 'No grouping'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={display.groupBy === value}\n onSelect={() => setDisplay((current) => ({ ...current, groupBy: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Columns\">\n {SESSIONS_COLUMNS.map((column) => (\n <MenuOption\n key={column.id}\n label={column.label}\n selected={display.columns.includes(column.id)}\n onSelect={() =>\n setDisplay((current) => ({\n ...current,\n columns: current.columns.includes(column.id)\n ? current.columns.filter((id) => id !== column.id)\n : SESSIONS_COLUMNS.map((candidate) => candidate.id).filter(\n (id) => id === column.id || current.columns.includes(id),\n ),\n }))\n }\n />\n ))}\n </MenuSection>\n </div>\n );\n};\n\nconst HEADER_BUTTON_CLASS = cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-md border border-border/60 px-2.5 font-medium text-muted-foreground text-xs transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n);\n\nconst SessionsRow: FC<{\n row: AthenaStatewireThreadSummary;\n columns: readonly SessionsColumnId[];\n isActive: boolean;\n labels: SessionsLabels | undefined;\n list: AthenaStatewireThreadListState;\n onOpen: (row: AthenaStatewireThreadSummary) => void;\n}> = ({ row, columns, isActive, labels, list, onOpen }) => {\n const status = sessionStatusChip(row);\n const excerpt = plainExcerpt(row.preview);\n const chip = pullRequestChip(row.pullRequests);\n const origin = sessionOriginLabel(row);\n const cell = (id: SessionsColumnId): ReactNode => {\n switch (id) {\n case 'status':\n return <StatusChip label={status.label} tone={status.tone} detail={status.detail} />;\n case 'origin':\n return origin ? (\n <span className=\"rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground\">\n {origin}\n </span>\n ) : null;\n case 'mode':\n return row.collabAgentId ? (\n <span className=\"truncate text-muted-foreground text-xs\">\n {channelLabel(row.collabChannelId, labels)}\n </span>\n ) : null;\n case 'pullRequests':\n return chip ? <PullRequestChip chip={chip} pullRequests={row.pullRequests ?? []} /> : null;\n case 'creator':\n return (\n <span className=\"truncate text-muted-foreground text-xs\">{creatorLabel(row.createdByMe)}</span>\n );\n case 'created':\n return (\n <span className=\"text-muted-foreground text-xs\">\n {row.createdAt ? relativeTime(row.createdAt) : ''}\n </span>\n );\n case 'updated':\n return <span className=\"text-muted-foreground text-xs\">{relativeTime(row.updatedAt)}</span>;\n }\n };\n return (\n <tr\n data-thread-id={row.id}\n data-active={isActive || undefined}\n data-unread={row.isUnread || undefined}\n onClick={() => onOpen(row)}\n className={cn(\n 'group cursor-pointer border-border/40 border-b transition-colors hover:bg-muted/40',\n isActive && 'bg-muted',\n )}\n >\n <td className=\"min-w-0 py-2 pr-2 pl-3 align-top\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span\n role={row.isUnread ? 'img' : undefined}\n aria-label={row.isUnread ? 'Unread' : undefined}\n aria-hidden={row.isUnread ? undefined : true}\n className={cn('size-2 shrink-0 rounded-full', row.isUnread ? 'bg-primary' : 'bg-transparent')}\n />\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onOpen(row);\n }}\n className={cn(\n 'min-w-0 truncate text-left text-foreground text-sm',\n row.isUnread ? 'font-semibold' : 'font-medium',\n FOCUS_RING_CLASS,\n )}\n >\n {row.title ?? 'Untitled'}\n </button>\n {row.isFavorited ? (\n <PinIcon role=\"img\" aria-label=\"Pinned\" className=\"size-3 shrink-0 fill-current text-muted-foreground\" />\n ) : null}\n </div>\n {excerpt ? <p className=\"mt-0.5 truncate pl-4 text-muted-foreground text-xs\">{excerpt}</p> : null}\n </td>\n {columns.map((id) => (\n <td key={id} data-column={id} className=\"min-w-0 truncate px-2 py-2 align-top\">\n {cell(id)}\n </td>\n ))}\n <td className=\"py-1.5 pr-2 align-top\">\n <div data-row-actions className=\"flex items-center justify-end gap-0.5\">\n <RowIconButton\n label={row.isUnread ? 'Mark read' : 'Mark unread'}\n action=\"read-state\"\n pending={list.readStatePendingThreadIds.has(row.id)}\n onClick={() =>\n list.setReadState({ threadId: row.id, isUnread: !row.isUnread, updatedAt: row.updatedAt })\n }\n >\n {row.isUnread ? <MailOpenIcon className=\"size-3.5\" aria-hidden /> : <MailIcon className=\"size-3.5\" aria-hidden />}\n </RowIconButton>\n {list.favoriteToggleAvailable ? (\n <RowIconButton\n label={row.isFavorited ? 'Unpin session' : 'Pin session'}\n action=\"pin\"\n pressed={row.isFavorited}\n pending={list.favoritePendingThreadIds.has(row.id)}\n onClick={() => list.setFavorited({ threadId: row.id, isFavorited: !row.isFavorited })}\n >\n <PinIcon className={cn('size-3.5', row.isFavorited && 'fill-current')} aria-hidden />\n </RowIconButton>\n ) : null}\n {list.archiveAvailable ? (\n <RowIconButton\n label=\"Archive session\"\n action=\"archive\"\n pending={list.archivePendingThreadIds.has(row.id)}\n onClick={() => list.archiveThread(row.id)}\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </RowIconButton>\n ) : null}\n </div>\n </td>\n </tr>\n );\n};\n\nfunction SessionsPageBody({\n className,\n title = 'Sessions',\n onOpenSession,\n labels,\n storageKey = 'default',\n defaultQuery,\n pageSize,\n showNewSession = true,\n onNewSession,\n list,\n}: SessionsPageProps & { list: AthenaStatewireThreadListState }) {\n const [initial] = useState(() => readSessionsPageSettings(storageKey));\n const [savedDefault, setSavedDefault] = useState<AthenaSessionsQuery | null>(initial.defaultQuery);\n const [query, setQueryState] = useState<AthenaSessionsQuery>(\n () => initial.defaultQuery ?? normalizeSessionsQuery(defaultQuery ?? {}),\n );\n const [display, setDisplayState] = useState<SessionsPageDisplay>(initial.display);\n const [searchInput, setSearchInput] = useState(query.search ?? '');\n\n const setQuery = (update: (current: AthenaSessionsQuery) => AthenaSessionsQuery) =>\n setQueryState((current) => normalizeSessionsQuery(update(current)));\n const setDisplay = (update: (current: SessionsPageDisplay) => SessionsPageDisplay) =>\n setDisplayState((current) => {\n const next = update(current);\n writeSessionsPageSettings(storageKey, { defaultQuery: savedDefault, display: next });\n return next;\n });\n\n // The search box types freely; the list follows a beat later.\n useEffect(() => {\n const handle = setTimeout(() => {\n setQueryState((current) => {\n const search = searchInput.trim();\n if ((current.search ?? '') === search) return current;\n return normalizeSessionsQuery({ ...current, search });\n });\n }, 250);\n return () => clearTimeout(handle);\n }, [searchInput]);\n\n const sessions = useAthenaSessions({ query, ...(pageSize ? { pageSize } : {}) });\n const unavailable = useMemo(\n () => new Set([...sessions.unsupportedFields, ...sessions.unavailableFields]),\n [sessions.unsupportedFields, sessions.unavailableFields],\n );\n\n // Filter options: every agent, channel and origin this page has shown, so\n // narrowing the list never hides the option that would widen it again.\n const seenRef = useRef({ agents: new Set<string>(), channels: new Set<string>(), origins: new Set<string>() });\n for (const row of sessions.rows) {\n if (row.collabAgentId) {\n seenRef.current.agents.add(row.collabAgentId);\n seenRef.current.channels.add(row.collabChannelId || DEFAULT_COLLAB_CHANNEL);\n }\n if (row.startChannel) seenRef.current.origins.add(row.startChannel);\n }\n const agentOptions = [\n ...new Set([...Object.keys(labels?.agents ?? {}), ...seenRef.current.agents, ...(query.collabAgentIds ?? [])]),\n ];\n const channelOptions = [\n ...new Set([\n DEFAULT_COLLAB_CHANNEL,\n ...Object.keys(labels?.channels ?? {}),\n ...seenRef.current.channels,\n ...(query.collabChannelIds ?? []),\n ]),\n ];\n const originOptions = [...new Set([...seenRef.current.origins, ...(query.startChannels ?? [])])];\n\n const chips = sessionsFilterChips(query, labels);\n const sections = groupSessionsBy(sessions.rows, display.groupBy);\n const columns = SESSIONS_COLUMNS.map((column) => column.id).filter((id) => display.columns.includes(id));\n const { search: _search, ...queryWithoutSearch } = query;\n const isSavedDefault =\n savedDefault !== null && sessionsQueryKey(savedDefault) === sessionsQueryKey(queryWithoutSearch);\n const hasFilters = chips.length > 0;\n\n const open = (row: AthenaStatewireThreadSummary) => {\n list.selectThread(row.id);\n onOpenSession?.({ threadId: row.id, title: row.title });\n };\n const saveAsDefault = () => {\n const saved = normalizeSessionsQuery(queryWithoutSearch);\n setSavedDefault(saved);\n writeSessionsPageSettings(storageKey, { defaultQuery: saved, display });\n };\n const resetToDefault = () => {\n setQueryState({ ...(savedDefault ?? normalizeSessionsQuery(defaultQuery ?? {})) });\n setSearchInput('');\n };\n const clearFilters = () => {\n setQuery((current) => ({ sort: current.sort, direction: current.direction, search: current.search }));\n };\n const removeChip = (field: AthenaSessionsQueryField) =>\n setQuery((current) => {\n const next: AthenaSessionsQuery = { ...current, [field]: undefined };\n if (field === 'collabAgentIds') next.collabChannelIds = undefined;\n return next;\n });\n const exportCsv = () =>\n downloadText(\n `sessions-${new Date().toISOString().slice(0, 10)}.csv`,\n sessionsCsv(sessions.rows, labels),\n 'text/csv;charset=utf-8',\n );\n\n // Skeletons only while there is nothing to show; a changed query keeps the\n // previous rows (narrowed by it) until its own page answers.\n const showSkeleton =\n sessions.rows.length === 0 && (!sessions.hasResolvedFirstPage || sessions.isFetching);\n\n return (\n <div\n data-testid=\"sessions-page\"\n className={cn('athena-sdk-chrome flex min-h-0 flex-col gap-3 p-4', className)}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"font-semibold text-base text-foreground\">{title}</h2>\n <span data-testid=\"sessions-count\" className=\"text-muted-foreground text-xs\">\n {sessions.rows.length}\n {sessions.hasNextPage ? '+' : ''}\n </span>\n <div className=\"flex-1\" />\n <label className=\"relative block w-64 max-w-full\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n type=\"search\"\n value={searchInput}\n onChange={(event) => setSearchInput(event.target.value)}\n placeholder=\"Search sessions…\"\n className=\"h-8 w-full rounded-md border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <Popover>\n <PopoverTrigger asChild>\n <button type=\"button\" className={HEADER_BUTTON_CLASS} aria-label=\"Display options\">\n <SlidersHorizontalIcon className=\"size-3.5\" aria-hidden />\n Display\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56\">\n <DisplayMenu query={query} setQuery={setQuery} display={display} setDisplay={setDisplay} />\n </PopoverContent>\n </Popover>\n <button\n type=\"button\"\n onClick={exportCsv}\n disabled={sessions.rows.length === 0}\n className={HEADER_BUTTON_CLASS}\n title=\"Export the loaded sessions as CSV\"\n >\n <DownloadIcon className=\"size-3.5\" aria-hidden />\n Export CSV\n </button>\n <button\n type=\"button\"\n onClick={sessions.refresh}\n disabled={sessions.isFetching}\n className={HEADER_BUTTON_CLASS}\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n >\n <RefreshCwIcon className={cn('size-3.5', sessions.isFetching && 'animate-spin')} aria-hidden />\n </button>\n {showNewSession ? (\n <button\n type=\"button\"\n onClick={() => {\n list.newThread();\n onNewSession?.();\n }}\n className={cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 font-medium text-primary-foreground text-xs transition-colors hover:bg-primary/90',\n FOCUS_RING_CLASS,\n )}\n >\n <PlusIcon className=\"size-3.5\" aria-hidden />\n New session\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5\" data-testid=\"sessions-filters\">\n <Popover>\n <PopoverTrigger asChild>\n <button type=\"button\" className={HEADER_BUTTON_CLASS}>\n <FilterIcon className=\"size-3.5\" aria-hidden />\n Filter\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64\">\n <FilterMenu\n query={query}\n setQuery={setQuery}\n unavailable={unavailable}\n agentOptions={agentOptions}\n channelOptions={channelOptions}\n originOptions={originOptions}\n labels={labels}\n />\n </PopoverContent>\n </Popover>\n {chips.map((chip) => (\n <span\n key={chip.field + chip.label}\n data-filter-chip={chip.field}\n className=\"inline-flex h-7 items-center gap-1 rounded-full border border-border/60 bg-muted/40 pr-1 pl-2.5 text-foreground text-xs\"\n >\n {chip.label}\n <button\n type=\"button\"\n aria-label={`Remove filter ${chip.label}`}\n onClick={() => removeChip(chip.field)}\n className={cn('rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground', FOCUS_RING_CLASS)}\n >\n <XIcon className=\"size-3\" aria-hidden />\n </button>\n </span>\n ))}\n {hasFilters ? (\n <button type=\"button\" onClick={clearFilters} className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground', FOCUS_RING_CLASS)}>\n Clear\n </button>\n ) : null}\n <div className=\"flex-1\" />\n {savedDefault !== null && !isSavedDefault ? (\n <button type=\"button\" onClick={resetToDefault} className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground', FOCUS_RING_CLASS)}>\n Reset to default\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={saveAsDefault}\n disabled={isSavedDefault}\n className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {isSavedDefault ? 'Saved as default' : 'Save as default'}\n </button>\n </div>\n\n {sessions.degradedFields.length > 0 || sessions.unavailableFields.length > 0 ? (\n <p\n role=\"status\"\n data-testid=\"sessions-degraded\"\n className=\"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-amber-900 text-xs\"\n >\n {sessions.degradedFields.length > 0\n ? `This Athena server cannot filter by ${fieldList(sessions.degradedFields)} yet, so they apply to the sessions loaded so far. `\n : ''}\n {sessions.unavailableFields.length > 0\n ? `Filtering by ${fieldList(sessions.unavailableFields)} is not available on this server yet and is off.`\n : ''}\n </p>\n ) : null}\n\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {showSkeleton ? (\n <SessionListSkeleton rows={6} />\n ) : sections.length === 0 ? (\n <div data-testid=\"sessions-empty\" className=\"flex flex-col items-center gap-2 py-12 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n {hasFilters || query.search ? 'No sessions match these filters.' : 'No sessions yet.'}\n </p>\n {hasFilters ? (\n <button type=\"button\" onClick={clearFilters} className={HEADER_BUTTON_CLASS}>\n Clear filters\n </button>\n ) : null}\n </div>\n ) : (\n <table className=\"w-full table-fixed border-collapse text-sm\" aria-busy={sessions.isFetching || undefined}>\n <thead>\n <tr className=\"border-border/60 border-b text-left text-[11px] text-muted-foreground uppercase tracking-wide\">\n <th scope=\"col\" className=\"py-2 pl-7 font-medium\">\n Session\n </th>\n {columns.map((id) => (\n <th key={id} scope=\"col\" className={cn('px-2 py-2 font-medium', COLUMN_WIDTH[id])}>\n {SESSIONS_COLUMNS.find((column) => column.id === id)?.label}\n </th>\n ))}\n <th scope=\"col\" className=\"w-24 py-2 pr-2\">\n <span className=\"sr-only\">Actions</span>\n </th>\n </tr>\n </thead>\n {sections.map((section) => (\n <tbody key={section.key} data-group={section.label ?? undefined}>\n {section.label ? (\n <tr>\n <th colSpan={columns.length + 2} scope=\"colgroup\" className={SECTION_HEADING_CLASS}>\n {section.label}\n <span className=\"ml-1.5 font-normal normal-case tracking-normal\">{section.items.length}</span>\n </th>\n </tr>\n ) : null}\n {section.items.map((row) => (\n <SessionsRow\n key={row.id}\n row={row}\n columns={columns}\n isActive={row.id === list.activeThreadId}\n labels={labels}\n list={list}\n onOpen={open}\n />\n ))}\n </tbody>\n ))}\n </table>\n )}\n {sessions.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n onClick={sessions.fetchNextPage}\n disabled={sessions.isFetchingNextPage}\n className={cn('mt-2 w-full rounded-md py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {sessions.isFetchingNextPage ? 'Loading…' : sessions.isFetchNextPageError ? 'Retry loading more' : 'Load more'}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * A full-page session list with server-side filters, display options, an\n * attention-coloured status column and CSV export. Renders nothing outside\n * `<AthenaProvider enableThreadList>`.\n */\nexport function SessionsPage(props: SessionsPageProps) {\n const list = useAthenaStatewireThreadList();\n const live = useContext(AthenaSessionsLiveContext);\n if (!list || !live) return null;\n return <SessionsPageBody {...props} list={list} />;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"SessionsPage.js","sources":["../../src/threads/SessionsPage.tsx"],"sourcesContent":["/**\n * `SessionsPage` — a full-page, Devin-style session list: filter chips that\n * the server applies (status, pull requests, unread, pinned, creator, agent,\n * mode, origin, created / updated date), a title search, display options\n * (sort, direction, grouping, columns), an attention-coloured status column\n * that says what the person must do next, row actions (read, pin, archive)\n * and a CSV export of the loaded rows. Live through the thread-list\n * provider's conversation index; renders nothing outside\n * `<AthenaProvider enableThreadList>`.\n */\nimport {\n ArchiveIcon,\n CheckIcon,\n DownloadIcon,\n FilterIcon,\n MailIcon,\n MailOpenIcon,\n PinIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n SlidersHorizontalIcon,\n XIcon,\n} from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\nimport { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { SessionListSkeleton, type SessionOpenTarget } from './SessionList';\nimport { pullRequestChip, relativeTime, sessionOriginLabel } from './session-list-model';\nimport { FOCUS_RING_CLASS, PullRequestChip, RowIconButton, StatusChip } from './session-row-parts';\nimport {\n agentLabel,\n channelLabel,\n creatorLabel,\n DEFAULT_HIDDEN_SESSIONS_COLUMNS,\n datePresetBounds,\n groupSessionsBy,\n runStatusLabel,\n SESSIONS_COLUMNS,\n SESSIONS_DATE_PRESETS,\n type SessionsColumnId,\n type SessionsDatePreset,\n type SessionsGroupBy,\n type SessionsLabels,\n sessionsCsv,\n sessionsFilterChips,\n plainExcerpt,\n sessionStatusChip,\n visibleSessionsColumns,\n} from './sessions-page-model';\nimport {\n DEFAULT_SESSIONS_PAGE_DISPLAY,\n readSessionsPageSettings,\n type SessionsPageDisplay,\n writeSessionsPageSettings,\n} from './sessions-page-storage';\nimport {\n type AthenaSessionsQuery,\n type AthenaSessionsQueryField,\n DEFAULT_COLLAB_CHANNEL,\n normalizeSessionsQuery,\n SESSION_RUN_STATUSES,\n type SessionRunStatus,\n sessionsQueryKey,\n} from './sessions-query';\nimport {\n AthenaSessionsLiveContext,\n type AthenaStatewireThreadListState,\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { useAthenaSessions } from './use-athena-sessions';\n\nexport interface SessionsPageProps {\n className?: string;\n /** Heading (default \"Sessions\"). */\n title?: string;\n /**\n * Called after a row is selected (the provider's chat switches to it), so\n * a host can navigate to its chat view.\n */\n onOpenSession?: (target: SessionOpenTarget) => void;\n /** Names for collab agents and channels (filters, the Mode column, CSV); ids show otherwise. */\n labels?: SessionsLabels;\n /**\n * Namespaces what this browser remembers — \"Save as default\" and the\n * display options — so a host with several pages keeps them apart\n * (default `\"default\"`).\n */\n storageKey?: string;\n /** The filters before anything is saved as default. */\n defaultQuery?: AthenaSessionsQuery;\n /**\n * The columns hidden until the person shows them from Display ▸ Columns;\n * every other column shows. Default `DEFAULT_HIDDEN_SESSIONS_COLUMNS` (Mode,\n * Creator, Created). An app whose sessions have no pull requests passes\n * `[...DEFAULT_HIDDEN_SESSIONS_COLUMNS, 'pullRequests']`. Read once, while\n * this browser remembers no display for `storageKey`; after that, the\n * person's own choice of columns is kept.\n */\n defaultHiddenColumns?: readonly SessionsColumnId[];\n /** Rows per page (default 50). */\n pageSize?: number;\n /** Offer \"New session\" (default `true`). */\n showNewSession?: boolean;\n /** Called after \"New session\" starts a fresh chat, so a host can show its chat view. */\n onNewSession?: () => void;\n}\n\n/** What each query field is called in notices. */\nconst FIELD_LABEL: Record<AthenaSessionsQueryField, string> = {\n search: 'search',\n collabAgentIds: 'agent',\n collabChannelIds: 'mode',\n startChannels: 'origin',\n createdAfter: 'created date',\n createdBefore: 'created date',\n updatedAfter: 'updated date',\n updatedBefore: 'updated date',\n favoritesOnly: 'pinned',\n unreadOnly: 'unread',\n runStatuses: 'status',\n sessionStatuses: 'session status',\n hasPullRequests: 'pull requests',\n createdByMe: 'creator',\n excludeDismissed: 'dismissed',\n excludeTriggered: 'who started it',\n sort: 'sort',\n direction: 'sort direction',\n};\n\n/** \"agent\", \"agent and mode\", \"agent, mode and unread\". */\nfunction fieldList(fields: readonly AthenaSessionsQueryField[]): string {\n const names = [...new Set(fields.map((field) => FIELD_LABEL[field]))];\n return names.length <= 1 ? (names[0] ?? '') : `${names.slice(0, -1).join(', ')} and ${names.at(-1)}`;\n}\n\nconst COLUMN_WIDTH: Record<SessionsColumnId, string> = {\n status: 'w-56',\n origin: 'w-24',\n mode: 'w-28',\n pullRequests: 'w-24',\n creator: 'w-32',\n created: 'w-24',\n updated: 'w-24',\n};\n\n/** Save `text` as a file in the browser. */\nfunction downloadText(filename: string, text: string, type: string): void {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(new Blob([text], { type }));\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\nconst SECTION_HEADING_CLASS =\n 'px-3 pb-1 pt-3 text-left font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide';\n\n/** A pressable option in a filter or display menu. */\nconst MenuOption: FC<{\n label: string;\n selected: boolean;\n onSelect: () => void;\n disabled?: boolean;\n role?: 'menuitemcheckbox' | 'menuitemradio';\n}> = ({ label, selected, onSelect, disabled = false, role = 'menuitemcheckbox' }) => (\n <button\n type=\"button\"\n role={role}\n aria-checked={selected}\n disabled={disabled}\n onClick={onSelect}\n className={cn(\n 'flex w-full items-center gap-2 rounded-sm px-2 py-1 text-left text-xs transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border border-border',\n selected && 'border-primary bg-primary text-primary-foreground',\n )}\n >\n {selected ? <CheckIcon className=\"size-3\" /> : null}\n </span>\n <span className=\"truncate\">{label}</span>\n </button>\n);\n\nconst MenuSection: FC<{ title: string; hint?: string | null; children: ReactNode }> = ({\n title,\n hint,\n children,\n}) => (\n <section aria-label={title} className=\"py-1\">\n <h4 className=\"px-2 pb-0.5 font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">\n {title}\n </h4>\n {hint ? <p className=\"px-2 pb-1 text-[11px] text-muted-foreground\">{hint}</p> : null}\n {children}\n </section>\n);\n\nfunction toggleValue<T extends string>(values: readonly T[] | undefined, value: T): T[] {\n const current = values ?? [];\n return current.includes(value) ? current.filter((item) => item !== value) : [...current, value];\n}\n\nfunction datePresetOf(after: string | undefined, before: string | undefined, presets: Record<SessionsDatePreset, { after?: string; before?: string }>): SessionsDatePreset | null {\n for (const preset of SESSIONS_DATE_PRESETS) {\n const bounds = presets[preset.id];\n if ((bounds.after ?? undefined) === after && (bounds.before ?? undefined) === before) {\n return preset.id;\n }\n }\n return null;\n}\n\ninterface FilterMenuProps {\n query: AthenaSessionsQuery;\n setQuery: (update: (query: AthenaSessionsQuery) => AthenaSessionsQuery) => void;\n unavailable: ReadonlySet<AthenaSessionsQueryField>;\n agentOptions: readonly string[];\n channelOptions: readonly string[];\n originOptions: readonly string[];\n labels: SessionsLabels | undefined;\n}\n\nconst UNAVAILABLE_HINT = 'This Athena server cannot filter by this yet.';\n\n/** Every filter, stacked by kind; each option toggles at once. */\nconst FilterMenu: FC<FilterMenuProps> = ({\n query,\n setQuery,\n unavailable,\n agentOptions,\n channelOptions,\n originOptions,\n labels,\n}) => {\n // The presets' bounds are captured when the menu opens, so a selected\n // preset stays recognisable while it is open.\n const [presetBounds] = useState(() =>\n Object.fromEntries(\n SESSIONS_DATE_PRESETS.map((preset) => [preset.id, datePresetBounds(preset.id)]),\n ) as Record<SessionsDatePreset, { after?: string; before?: string }>,\n );\n const createdPreset = datePresetOf(query.createdAfter, query.createdBefore, presetBounds);\n const updatedPreset = datePresetOf(query.updatedAfter, query.updatedBefore, presetBounds);\n const setPreset = (\n kind: 'created' | 'updated',\n preset: SessionsDatePreset | null,\n ) =>\n setQuery((current) => {\n const bounds = preset ? presetBounds[preset] : {};\n return kind === 'created'\n ? { ...current, createdAfter: bounds.after, createdBefore: bounds.before }\n : { ...current, updatedAfter: bounds.after, updatedBefore: bounds.before };\n });\n const disabledHint = (field: AthenaSessionsQueryField) =>\n unavailable.has(field) ? UNAVAILABLE_HINT : null;\n\n return (\n <div role=\"menu\" aria-label=\"Filters\" className=\"max-h-[70vh] overflow-y-auto p-1\">\n <MenuSection title=\"Status\" hint={disabledHint('runStatuses')}>\n {SESSION_RUN_STATUSES.map((status) => (\n <MenuOption\n key={status}\n label={runStatusLabel(status)}\n selected={query.runStatuses?.includes(status) ?? false}\n disabled={unavailable.has('runStatuses')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n runStatuses: toggleValue<SessionRunStatus>(current.runStatuses, status),\n }))\n }\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Pull requests\" hint={disabledHint('hasPullRequests')}>\n {(\n [\n ['Has pull requests', true],\n ['No pull requests', false],\n ] as const\n ).map(([label, value]) => (\n <MenuOption\n key={label}\n role=\"menuitemradio\"\n label={label}\n selected={query.hasPullRequests === value}\n disabled={unavailable.has('hasPullRequests')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n hasPullRequests: current.hasPullRequests === value ? undefined : value,\n }))\n }\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Read and pinned\">\n <MenuOption\n label=\"Unread\"\n selected={query.unreadOnly === true}\n disabled={unavailable.has('unreadOnly')}\n onSelect={() => setQuery((current) => ({ ...current, unreadOnly: !current.unreadOnly }))}\n />\n <MenuOption\n label=\"Pinned\"\n selected={query.favoritesOnly === true}\n disabled={unavailable.has('favoritesOnly')}\n onSelect={() =>\n setQuery((current) => ({ ...current, favoritesOnly: !current.favoritesOnly }))\n }\n />\n </MenuSection>\n <MenuSection title=\"Creator\" hint={disabledHint('createdByMe')}>\n {(\n [\n ['You', true],\n ['Shared with you', false],\n ] as const\n ).map(([label, value]) => (\n <MenuOption\n key={label}\n role=\"menuitemradio\"\n label={label}\n selected={query.createdByMe === value}\n disabled={unavailable.has('createdByMe')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n createdByMe: current.createdByMe === value ? undefined : value,\n }))\n }\n />\n ))}\n <MenuOption\n label=\"Started by a person\"\n selected={query.excludeTriggered === true}\n onSelect={() =>\n setQuery((current) => ({ ...current, excludeTriggered: !current.excludeTriggered }))\n }\n />\n </MenuSection>\n {agentOptions.length > 0 ? (\n <MenuSection title=\"Agent\" hint={disabledHint('collabAgentIds')}>\n {agentOptions.map((agentId) => (\n <MenuOption\n key={agentId}\n label={agentLabel(agentId, labels)}\n selected={query.collabAgentIds?.includes(agentId) ?? false}\n disabled={unavailable.has('collabAgentIds')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n collabAgentIds: toggleValue(current.collabAgentIds, agentId),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n {agentOptions.length > 0 ? (\n <MenuSection\n title=\"Mode\"\n hint={\n disabledHint('collabChannelIds') ??\n (query.collabAgentIds?.length ? null : 'Pick an agent first: a mode is one of its channels.')\n }\n >\n {channelOptions.map((channelId) => (\n <MenuOption\n key={channelId}\n label={channelLabel(channelId, labels)}\n selected={query.collabChannelIds?.includes(channelId) ?? false}\n disabled={unavailable.has('collabChannelIds') || !query.collabAgentIds?.length}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n collabChannelIds: toggleValue(current.collabChannelIds, channelId),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n {originOptions.length > 0 ? (\n <MenuSection title=\"Origin\" hint={disabledHint('startChannels')}>\n {originOptions.map((channel) => (\n <MenuOption\n key={channel}\n label={sessionOriginLabel({ startChannel: channel, appId: null, triggerType: null }) ?? channel}\n selected={query.startChannels?.includes(channel) ?? false}\n disabled={unavailable.has('startChannels')}\n onSelect={() =>\n setQuery((current) => ({\n ...current,\n startChannels: toggleValue(current.startChannels, channel),\n }))\n }\n />\n ))}\n </MenuSection>\n ) : null}\n <MenuSection title=\"Created\">\n {SESSIONS_DATE_PRESETS.map((preset) => (\n <MenuOption\n key={preset.id}\n role=\"menuitemradio\"\n label={preset.label}\n selected={createdPreset === preset.id}\n onSelect={() => setPreset('created', createdPreset === preset.id ? null : preset.id)}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Updated\">\n {SESSIONS_DATE_PRESETS.map((preset) => (\n <MenuOption\n key={preset.id}\n role=\"menuitemradio\"\n label={preset.label}\n selected={updatedPreset === preset.id}\n onSelect={() => setPreset('updated', updatedPreset === preset.id ? null : preset.id)}\n />\n ))}\n </MenuSection>\n </div>\n );\n};\n\nconst DisplayMenu: FC<{\n query: AthenaSessionsQuery;\n setQuery: (update: (query: AthenaSessionsQuery) => AthenaSessionsQuery) => void;\n display: SessionsPageDisplay;\n setDisplay: (update: (display: SessionsPageDisplay) => SessionsPageDisplay) => void;\n}> = ({ query, setQuery, display, setDisplay }) => {\n const sort = query.sort ?? 'updated';\n const direction = query.direction ?? 'desc';\n return (\n <div role=\"menu\" aria-label=\"Display options\" className=\"p-1\">\n <MenuSection title=\"Sort by\">\n {(\n [\n ['updated', 'Last updated'],\n ['created', 'Created'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={sort === value}\n onSelect={() => setQuery((current) => ({ ...current, sort: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Order\">\n {(\n [\n ['desc', 'Newest first'],\n ['asc', 'Oldest first'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={direction === value}\n onSelect={() => setQuery((current) => ({ ...current, direction: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Group by\">\n {(\n [\n ['attention', 'What it needs'],\n ['status', 'Run status'],\n ['none', 'No grouping'],\n ] as const\n ).map(([value, label]) => (\n <MenuOption\n key={value}\n role=\"menuitemradio\"\n label={label}\n selected={display.groupBy === value}\n onSelect={() => setDisplay((current) => ({ ...current, groupBy: value }))}\n />\n ))}\n </MenuSection>\n <MenuSection title=\"Columns\">\n {SESSIONS_COLUMNS.map((column) => (\n <MenuOption\n key={column.id}\n label={column.label}\n selected={display.columns.includes(column.id)}\n onSelect={() =>\n setDisplay((current) => ({\n ...current,\n columns: current.columns.includes(column.id)\n ? current.columns.filter((id) => id !== column.id)\n : SESSIONS_COLUMNS.map((candidate) => candidate.id).filter(\n (id) => id === column.id || current.columns.includes(id),\n ),\n }))\n }\n />\n ))}\n </MenuSection>\n </div>\n );\n};\n\nconst HEADER_BUTTON_CLASS = cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-md border border-border/60 px-2.5 font-medium text-muted-foreground text-xs transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n);\n\nconst SessionsRow: FC<{\n row: AthenaStatewireThreadSummary;\n columns: readonly SessionsColumnId[];\n isActive: boolean;\n labels: SessionsLabels | undefined;\n list: AthenaStatewireThreadListState;\n onOpen: (row: AthenaStatewireThreadSummary) => void;\n}> = ({ row, columns, isActive, labels, list, onOpen }) => {\n const status = sessionStatusChip(row);\n const excerpt = plainExcerpt(row.preview);\n const chip = pullRequestChip(row.pullRequests);\n const origin = sessionOriginLabel(row);\n const cell = (id: SessionsColumnId): ReactNode => {\n switch (id) {\n case 'status':\n return <StatusChip label={status.label} tone={status.tone} detail={status.detail} />;\n case 'origin':\n return origin ? (\n <span className=\"rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground\">\n {origin}\n </span>\n ) : null;\n case 'mode':\n return row.collabAgentId ? (\n <span className=\"truncate text-muted-foreground text-xs\">\n {channelLabel(row.collabChannelId, labels)}\n </span>\n ) : null;\n case 'pullRequests':\n return chip ? <PullRequestChip chip={chip} pullRequests={row.pullRequests ?? []} /> : null;\n case 'creator':\n return (\n <span className=\"truncate text-muted-foreground text-xs\">{creatorLabel(row.createdByMe)}</span>\n );\n case 'created':\n return (\n <span className=\"text-muted-foreground text-xs\">\n {row.createdAt ? relativeTime(row.createdAt) : ''}\n </span>\n );\n case 'updated':\n return <span className=\"text-muted-foreground text-xs\">{relativeTime(row.updatedAt)}</span>;\n }\n };\n return (\n <tr\n data-thread-id={row.id}\n data-active={isActive || undefined}\n data-unread={row.isUnread || undefined}\n onClick={() => onOpen(row)}\n className={cn(\n 'group cursor-pointer border-border/40 border-b transition-colors hover:bg-muted/40',\n isActive && 'bg-muted',\n )}\n >\n <td className=\"min-w-0 py-2 pr-2 pl-3 align-top\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span\n role={row.isUnread ? 'img' : undefined}\n aria-label={row.isUnread ? 'Unread' : undefined}\n aria-hidden={row.isUnread ? undefined : true}\n className={cn('size-2 shrink-0 rounded-full', row.isUnread ? 'bg-primary' : 'bg-transparent')}\n />\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onOpen(row);\n }}\n className={cn(\n 'min-w-0 truncate text-left text-foreground text-sm',\n row.isUnread ? 'font-semibold' : 'font-medium',\n FOCUS_RING_CLASS,\n )}\n >\n {row.title ?? 'Untitled'}\n </button>\n {row.isFavorited ? (\n <PinIcon role=\"img\" aria-label=\"Pinned\" className=\"size-3 shrink-0 fill-current text-muted-foreground\" />\n ) : null}\n </div>\n {excerpt ? <p className=\"mt-0.5 truncate pl-4 text-muted-foreground text-xs\">{excerpt}</p> : null}\n </td>\n {columns.map((id) => (\n <td key={id} data-column={id} className=\"min-w-0 truncate px-2 py-2 align-top\">\n {cell(id)}\n </td>\n ))}\n <td className=\"py-1.5 pr-2 align-top\">\n <div data-row-actions className=\"flex items-center justify-end gap-0.5\">\n <RowIconButton\n label={row.isUnread ? 'Mark read' : 'Mark unread'}\n action=\"read-state\"\n pending={list.readStatePendingThreadIds.has(row.id)}\n onClick={() =>\n list.setReadState({ threadId: row.id, isUnread: !row.isUnread, updatedAt: row.updatedAt })\n }\n >\n {row.isUnread ? <MailOpenIcon className=\"size-3.5\" aria-hidden /> : <MailIcon className=\"size-3.5\" aria-hidden />}\n </RowIconButton>\n {list.favoriteToggleAvailable ? (\n <RowIconButton\n label={row.isFavorited ? 'Unpin session' : 'Pin session'}\n action=\"pin\"\n pressed={row.isFavorited}\n pending={list.favoritePendingThreadIds.has(row.id)}\n onClick={() => list.setFavorited({ threadId: row.id, isFavorited: !row.isFavorited })}\n >\n <PinIcon className={cn('size-3.5', row.isFavorited && 'fill-current')} aria-hidden />\n </RowIconButton>\n ) : null}\n {list.archiveAvailable ? (\n <RowIconButton\n label=\"Archive session\"\n action=\"archive\"\n pending={list.archivePendingThreadIds.has(row.id)}\n onClick={() => list.archiveThread(row.id)}\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </RowIconButton>\n ) : null}\n </div>\n </td>\n </tr>\n );\n};\n\nfunction SessionsPageBody({\n className,\n title = 'Sessions',\n onOpenSession,\n labels,\n storageKey = 'default',\n defaultQuery,\n defaultHiddenColumns = DEFAULT_HIDDEN_SESSIONS_COLUMNS,\n pageSize,\n showNewSession = true,\n onNewSession,\n list,\n}: SessionsPageProps & { list: AthenaStatewireThreadListState }) {\n const [initial] = useState(() =>\n readSessionsPageSettings(storageKey, {\n ...DEFAULT_SESSIONS_PAGE_DISPLAY,\n columns: visibleSessionsColumns(defaultHiddenColumns),\n }),\n );\n const [savedDefault, setSavedDefault] = useState<AthenaSessionsQuery | null>(initial.defaultQuery);\n const [query, setQueryState] = useState<AthenaSessionsQuery>(\n () => initial.defaultQuery ?? normalizeSessionsQuery(defaultQuery ?? {}),\n );\n const [display, setDisplayState] = useState<SessionsPageDisplay>(initial.display);\n const [searchInput, setSearchInput] = useState(query.search ?? '');\n\n const setQuery = (update: (current: AthenaSessionsQuery) => AthenaSessionsQuery) =>\n setQueryState((current) => normalizeSessionsQuery(update(current)));\n const setDisplay = (update: (current: SessionsPageDisplay) => SessionsPageDisplay) =>\n setDisplayState((current) => {\n const next = update(current);\n writeSessionsPageSettings(storageKey, { defaultQuery: savedDefault, display: next });\n return next;\n });\n\n // The search box types freely; the list follows a beat later.\n useEffect(() => {\n const handle = setTimeout(() => {\n setQueryState((current) => {\n const search = searchInput.trim();\n if ((current.search ?? '') === search) return current;\n return normalizeSessionsQuery({ ...current, search });\n });\n }, 250);\n return () => clearTimeout(handle);\n }, [searchInput]);\n\n const sessions = useAthenaSessions({ query, ...(pageSize ? { pageSize } : {}) });\n const unavailable = useMemo(\n () => new Set([...sessions.unsupportedFields, ...sessions.unavailableFields]),\n [sessions.unsupportedFields, sessions.unavailableFields],\n );\n\n // Filter options: every agent, channel and origin this page has shown, so\n // narrowing the list never hides the option that would widen it again.\n const seenRef = useRef({ agents: new Set<string>(), channels: new Set<string>(), origins: new Set<string>() });\n for (const row of sessions.rows) {\n if (row.collabAgentId) {\n seenRef.current.agents.add(row.collabAgentId);\n seenRef.current.channels.add(row.collabChannelId || DEFAULT_COLLAB_CHANNEL);\n }\n if (row.startChannel) seenRef.current.origins.add(row.startChannel);\n }\n const agentOptions = [\n ...new Set([...Object.keys(labels?.agents ?? {}), ...seenRef.current.agents, ...(query.collabAgentIds ?? [])]),\n ];\n const channelOptions = [\n ...new Set([\n DEFAULT_COLLAB_CHANNEL,\n ...Object.keys(labels?.channels ?? {}),\n ...seenRef.current.channels,\n ...(query.collabChannelIds ?? []),\n ]),\n ];\n const originOptions = [...new Set([...seenRef.current.origins, ...(query.startChannels ?? [])])];\n\n const chips = sessionsFilterChips(query, labels);\n const sections = groupSessionsBy(sessions.rows, display.groupBy);\n const columns = SESSIONS_COLUMNS.map((column) => column.id).filter((id) => display.columns.includes(id));\n const { search: _search, ...queryWithoutSearch } = query;\n const isSavedDefault =\n savedDefault !== null && sessionsQueryKey(savedDefault) === sessionsQueryKey(queryWithoutSearch);\n const hasFilters = chips.length > 0;\n\n const open = (row: AthenaStatewireThreadSummary) => {\n list.selectThread(row.id);\n onOpenSession?.({ threadId: row.id, title: row.title });\n };\n const saveAsDefault = () => {\n const saved = normalizeSessionsQuery(queryWithoutSearch);\n setSavedDefault(saved);\n writeSessionsPageSettings(storageKey, { defaultQuery: saved, display });\n };\n const resetToDefault = () => {\n setQueryState({ ...(savedDefault ?? normalizeSessionsQuery(defaultQuery ?? {})) });\n setSearchInput('');\n };\n const clearFilters = () => {\n setQuery((current) => ({ sort: current.sort, direction: current.direction, search: current.search }));\n };\n const removeChip = (field: AthenaSessionsQueryField) =>\n setQuery((current) => {\n const next: AthenaSessionsQuery = { ...current, [field]: undefined };\n if (field === 'collabAgentIds') next.collabChannelIds = undefined;\n return next;\n });\n const exportCsv = () =>\n downloadText(\n `sessions-${new Date().toISOString().slice(0, 10)}.csv`,\n sessionsCsv(sessions.rows, labels),\n 'text/csv;charset=utf-8',\n );\n\n // Skeletons only while there is nothing to show; a changed query keeps the\n // previous rows (narrowed by it) until its own page answers.\n const showSkeleton =\n sessions.rows.length === 0 && (!sessions.hasResolvedFirstPage || sessions.isFetching);\n\n return (\n <div\n data-testid=\"sessions-page\"\n className={cn('athena-sdk-chrome flex min-h-0 flex-col gap-3 p-4', className)}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"font-semibold text-base text-foreground\">{title}</h2>\n <span data-testid=\"sessions-count\" className=\"text-muted-foreground text-xs\">\n {sessions.rows.length}\n {sessions.hasNextPage ? '+' : ''}\n </span>\n <div className=\"flex-1\" />\n <label className=\"relative block w-64 max-w-full\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n type=\"search\"\n value={searchInput}\n onChange={(event) => setSearchInput(event.target.value)}\n placeholder=\"Search sessions…\"\n className=\"h-8 w-full rounded-md border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <Popover>\n <PopoverTrigger asChild>\n <button type=\"button\" className={HEADER_BUTTON_CLASS} aria-label=\"Display options\">\n <SlidersHorizontalIcon className=\"size-3.5\" aria-hidden />\n Display\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56\">\n <DisplayMenu query={query} setQuery={setQuery} display={display} setDisplay={setDisplay} />\n </PopoverContent>\n </Popover>\n <button\n type=\"button\"\n onClick={exportCsv}\n disabled={sessions.rows.length === 0}\n className={HEADER_BUTTON_CLASS}\n title=\"Export the loaded sessions as CSV\"\n >\n <DownloadIcon className=\"size-3.5\" aria-hidden />\n Export CSV\n </button>\n <button\n type=\"button\"\n onClick={sessions.refresh}\n disabled={sessions.isFetching}\n className={HEADER_BUTTON_CLASS}\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n >\n <RefreshCwIcon className={cn('size-3.5', sessions.isFetching && 'animate-spin')} aria-hidden />\n </button>\n {showNewSession ? (\n <button\n type=\"button\"\n onClick={() => {\n list.newThread();\n onNewSession?.();\n }}\n className={cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 font-medium text-primary-foreground text-xs transition-colors hover:bg-primary/90',\n FOCUS_RING_CLASS,\n )}\n >\n <PlusIcon className=\"size-3.5\" aria-hidden />\n New session\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5\" data-testid=\"sessions-filters\">\n <Popover>\n <PopoverTrigger asChild>\n <button type=\"button\" className={HEADER_BUTTON_CLASS}>\n <FilterIcon className=\"size-3.5\" aria-hidden />\n Filter\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64\">\n <FilterMenu\n query={query}\n setQuery={setQuery}\n unavailable={unavailable}\n agentOptions={agentOptions}\n channelOptions={channelOptions}\n originOptions={originOptions}\n labels={labels}\n />\n </PopoverContent>\n </Popover>\n {chips.map((chip) => (\n <span\n key={chip.field + chip.label}\n data-filter-chip={chip.field}\n className=\"inline-flex h-7 items-center gap-1 rounded-full border border-border/60 bg-muted/40 pr-1 pl-2.5 text-foreground text-xs\"\n >\n {chip.label}\n <button\n type=\"button\"\n aria-label={`Remove filter ${chip.label}`}\n onClick={() => removeChip(chip.field)}\n className={cn('rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground', FOCUS_RING_CLASS)}\n >\n <XIcon className=\"size-3\" aria-hidden />\n </button>\n </span>\n ))}\n {hasFilters ? (\n <button type=\"button\" onClick={clearFilters} className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground', FOCUS_RING_CLASS)}>\n Clear\n </button>\n ) : null}\n <div className=\"flex-1\" />\n {savedDefault !== null && !isSavedDefault ? (\n <button type=\"button\" onClick={resetToDefault} className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground', FOCUS_RING_CLASS)}>\n Reset to default\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={saveAsDefault}\n disabled={isSavedDefault}\n className={cn('px-1.5 text-muted-foreground text-xs hover:text-foreground disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {isSavedDefault ? 'Saved as default' : 'Save as default'}\n </button>\n </div>\n\n {sessions.degradedFields.length > 0 || sessions.unavailableFields.length > 0 ? (\n <p\n role=\"status\"\n data-testid=\"sessions-degraded\"\n className=\"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-amber-900 text-xs\"\n >\n {sessions.degradedFields.length > 0\n ? `This Athena server cannot filter by ${fieldList(sessions.degradedFields)} yet, so they apply to the sessions loaded so far. `\n : ''}\n {sessions.unavailableFields.length > 0\n ? `Filtering by ${fieldList(sessions.unavailableFields)} is not available on this server yet and is off.`\n : ''}\n </p>\n ) : null}\n\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {showSkeleton ? (\n <SessionListSkeleton rows={6} />\n ) : sections.length === 0 ? (\n <div data-testid=\"sessions-empty\" className=\"flex flex-col items-center gap-2 py-12 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n {hasFilters || query.search ? 'No sessions match these filters.' : 'No sessions yet.'}\n </p>\n {hasFilters ? (\n <button type=\"button\" onClick={clearFilters} className={HEADER_BUTTON_CLASS}>\n Clear filters\n </button>\n ) : null}\n </div>\n ) : (\n <table className=\"w-full table-fixed border-collapse text-sm\" aria-busy={sessions.isFetching || undefined}>\n <thead>\n <tr className=\"border-border/60 border-b text-left text-[11px] text-muted-foreground uppercase tracking-wide\">\n <th scope=\"col\" className=\"py-2 pl-7 font-medium\">\n Session\n </th>\n {columns.map((id) => (\n <th key={id} scope=\"col\" className={cn('px-2 py-2 font-medium', COLUMN_WIDTH[id])}>\n {SESSIONS_COLUMNS.find((column) => column.id === id)?.label}\n </th>\n ))}\n <th scope=\"col\" className=\"w-24 py-2 pr-2\">\n <span className=\"sr-only\">Actions</span>\n </th>\n </tr>\n </thead>\n {sections.map((section) => (\n <tbody key={section.key} data-group={section.label ?? undefined}>\n {section.label ? (\n <tr>\n <th colSpan={columns.length + 2} scope=\"colgroup\" className={SECTION_HEADING_CLASS}>\n {section.label}\n <span className=\"ml-1.5 font-normal normal-case tracking-normal\">{section.items.length}</span>\n </th>\n </tr>\n ) : null}\n {section.items.map((row) => (\n <SessionsRow\n key={row.id}\n row={row}\n columns={columns}\n isActive={row.id === list.activeThreadId}\n labels={labels}\n list={list}\n onOpen={open}\n />\n ))}\n </tbody>\n ))}\n </table>\n )}\n {sessions.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n onClick={sessions.fetchNextPage}\n disabled={sessions.isFetchingNextPage}\n className={cn('mt-2 w-full rounded-md py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {sessions.isFetchingNextPage ? 'Loading…' : sessions.isFetchNextPageError ? 'Retry loading more' : 'Load more'}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * A full-page session list with server-side filters, display options, an\n * attention-coloured status column and CSV export. Renders nothing outside\n * `<AthenaProvider enableThreadList>`.\n */\nexport function SessionsPage(props: SessionsPageProps) {\n const list = useAthenaStatewireThreadList();\n const live = useContext(AthenaSessionsLiveContext);\n if (!list || !live) return null;\n return <SessionsPageBody {...props} list={list} />;\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const conversationList = require("../agent-runtime/src/conversation-list.cjs");
4
+ const AGENT_HOME_EXCLUDED_START_CHANNELS = /* @__PURE__ */ new Set([
5
+ "task",
6
+ "agent_orchestration"
7
+ ]);
8
+ const LISTED_ASSET_TYPE = "session";
9
+ function isAgentHomeIndexEntry(entry, homeAgentId) {
10
+ if (!homeAgentId || entry.collab_agent_id !== homeAgentId) return false;
11
+ return !AGENT_HOME_EXCLUDED_START_CHANNELS.has(entry.start_channel ?? "");
12
+ }
13
+ function inSessionListScope(entry, scope) {
14
+ const appIds = [...scope.appId ? [scope.appId] : [], ...scope.additionalAppIds];
15
+ const agentId = scope.homeAgentApplied ? scope.homeAgentId : void 0;
16
+ if (appIds.length === 0) return agentId ? isAgentHomeIndexEntry(entry, agentId) : true;
17
+ return appIds.includes(entry.app_id ?? "") || isAgentHomeIndexEntry(entry, agentId);
18
+ }
19
+ function timestampMs(value) {
20
+ const parsed = Date.parse(value);
21
+ return Number.isNaN(parsed) ? 0 : parsed;
22
+ }
23
+ function withIndexedSessions({
24
+ conversations,
25
+ loadedConversations,
26
+ entries,
27
+ scope,
28
+ searching,
29
+ hasResolvedFirstPage,
30
+ hasNextPage
31
+ }) {
32
+ if (!entries || entries.length === 0 || searching || !hasResolvedFirstPage) return conversations;
33
+ const listed = new Set(conversations.map((conversation) => conversation.threadId));
34
+ let windowTailMs = null;
35
+ if (hasNextPage) {
36
+ for (const conversation of loadedConversations) {
37
+ const ms = timestampMs(conversation.updatedAt);
38
+ if (windowTailMs === null || ms < windowTailMs) windowTailMs = ms;
39
+ }
40
+ }
41
+ const added = [];
42
+ for (const entry of entries) {
43
+ if (listed.has(entry.thread_id)) continue;
44
+ if (entry.asset_type !== LISTED_ASSET_TYPE) continue;
45
+ if (!inSessionListScope(entry, scope)) continue;
46
+ if (windowTailMs !== null && timestampMs(entry.updated_at) < windowTailMs) continue;
47
+ listed.add(entry.thread_id);
48
+ added.push(conversationList.summaryFromConversationIndexEntry(entry));
49
+ }
50
+ return added.length === 0 ? conversations : [...conversations, ...added];
51
+ }
52
+ const LOCAL_SEND_TTL_MS = 6e4;
53
+ const PENDING_TITLE_MAX_LENGTH = 200;
54
+ function pendingSessionTitle(text) {
55
+ const line = (text ?? "").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/\s+/g, " ").trim();
56
+ if (!line) return null;
57
+ return line.length <= PENDING_TITLE_MAX_LENGTH ? line : `${line.slice(0, PENDING_TITLE_MAX_LENGTH - 1).trimEnd()}…`;
58
+ }
59
+ function localSessionSend({
60
+ threadId,
61
+ text,
62
+ sentAtMs,
63
+ newChat,
64
+ startChannel,
65
+ serverConversations
66
+ }) {
67
+ let newestMs = 0;
68
+ let baselineUpdatedAt = null;
69
+ for (const conversation of serverConversations) {
70
+ const ms = timestampMs(conversation.updatedAt);
71
+ if (ms > newestMs) newestMs = ms;
72
+ if (conversation.threadId === threadId) baselineUpdatedAt = conversation.updatedAt;
73
+ }
74
+ return {
75
+ threadId,
76
+ sentAtMs,
77
+ sortAt: new Date(Math.max(sentAtMs, newestMs + 1)).toISOString(),
78
+ baselineUpdatedAt,
79
+ newChat: newChat && baselineUpdatedAt === null,
80
+ title: pendingSessionTitle(text),
81
+ startChannel
82
+ };
83
+ }
84
+ function isLocalSendReported(send, serverRow) {
85
+ if (!serverRow) return false;
86
+ return send.baselineUpdatedAt === null || serverRow.updatedAt !== send.baselineUpdatedAt;
87
+ }
88
+ function withoutLocalSends(sends, threadIds) {
89
+ if (!threadIds.some((threadId) => sends.has(threadId))) return sends;
90
+ const next = new Map(sends);
91
+ for (const threadId of threadIds) next.delete(threadId);
92
+ return next;
93
+ }
94
+ function settledLocalSends({
95
+ sends,
96
+ serverConversations,
97
+ nowMs,
98
+ ttlMs = LOCAL_SEND_TTL_MS
99
+ }) {
100
+ if (sends.size === 0) return [];
101
+ const byThread = new Map(serverConversations.map((row) => [row.threadId, row]));
102
+ const settled = [];
103
+ for (const send of sends.values()) {
104
+ if (nowMs - send.sentAtMs >= ttlMs || isLocalSendReported(send, byThread.get(send.threadId))) {
105
+ settled.push(send.threadId);
106
+ }
107
+ }
108
+ return settled;
109
+ }
110
+ function withSentMessage(row, send) {
111
+ return {
112
+ ...row,
113
+ updatedAt: timestampMs(row.updatedAt) >= timestampMs(send.sortAt) ? row.updatedAt : send.sortAt,
114
+ state: "running",
115
+ sessionStatus: "active",
116
+ runStatus: "running",
117
+ attention: "working",
118
+ nextAction: null,
119
+ attentionSource: null,
120
+ isUnread: false
121
+ };
122
+ }
123
+ function pendingConversation(send, appId) {
124
+ const sentAt = new Date(send.sentAtMs).toISOString();
125
+ return {
126
+ threadId: send.threadId,
127
+ title: send.title ?? "",
128
+ updatedAt: send.sortAt,
129
+ createdAt: sentAt,
130
+ state: "running",
131
+ runtime: null,
132
+ // What the server stamps on the session's first run, when that is known here: the row's
133
+ // origin badge reads as the server's row will, never as a label made from the app id.
134
+ sourceChannel: send.startChannel,
135
+ assetType: LISTED_ASSET_TYPE,
136
+ assetId: null,
137
+ appId: appId ?? null,
138
+ triggerType: null,
139
+ preview: send.title,
140
+ messageCount: null,
141
+ isUnread: false,
142
+ sessionStatus: "active",
143
+ runStatus: "running",
144
+ attention: "working",
145
+ nextAction: null,
146
+ attentionSource: null,
147
+ isFavorited: false,
148
+ createdByMe: true
149
+ };
150
+ }
151
+ function withLocalSends({
152
+ conversations,
153
+ sends,
154
+ appId,
155
+ showPendingSessions
156
+ }) {
157
+ if (sends.size === 0) return { conversations, pendingThreadIds: EMPTY_IDS };
158
+ const listed = /* @__PURE__ */ new Set();
159
+ let changed = false;
160
+ const rows = conversations.map((row) => {
161
+ listed.add(row.threadId);
162
+ const send = sends.get(row.threadId);
163
+ if (!send || isLocalSendReported(send, row)) return row;
164
+ changed = true;
165
+ return withSentMessage(row, send);
166
+ });
167
+ const pendingThreadIds = /* @__PURE__ */ new Set();
168
+ if (showPendingSessions) {
169
+ for (const send of sends.values()) {
170
+ if (!send.newChat || listed.has(send.threadId)) continue;
171
+ pendingThreadIds.add(send.threadId);
172
+ rows.push(pendingConversation(send, appId));
173
+ changed = true;
174
+ }
175
+ }
176
+ return {
177
+ conversations: changed ? rows : conversations,
178
+ pendingThreadIds: pendingThreadIds.size === 0 ? EMPTY_IDS : pendingThreadIds
179
+ };
180
+ }
181
+ const EMPTY_IDS = /* @__PURE__ */ new Set();
182
+ function sortNewestFirst(rows) {
183
+ var _a, _b;
184
+ const keyed = rows.map((row, index) => ({ row, index, ms: timestampMs(row.updatedAt) }));
185
+ let ordered = true;
186
+ for (let i = 1; i < keyed.length; i++) {
187
+ if ((((_a = keyed[i - 1]) == null ? void 0 : _a.ms) ?? 0) < (((_b = keyed[i]) == null ? void 0 : _b.ms) ?? 0)) {
188
+ ordered = false;
189
+ break;
190
+ }
191
+ }
192
+ if (ordered) return rows;
193
+ keyed.sort((a, b) => b.ms - a.ms || a.index - b.index);
194
+ return keyed.map(({ row }) => row);
195
+ }
196
+ exports.LOCAL_SEND_TTL_MS = LOCAL_SEND_TTL_MS;
197
+ exports.inSessionListScope = inSessionListScope;
198
+ exports.isAgentHomeIndexEntry = isAgentHomeIndexEntry;
199
+ exports.isLocalSendReported = isLocalSendReported;
200
+ exports.localSessionSend = localSessionSend;
201
+ exports.pendingSessionTitle = pendingSessionTitle;
202
+ exports.settledLocalSends = settledLocalSends;
203
+ exports.sortNewestFirst = sortNewestFirst;
204
+ exports.withIndexedSessions = withIndexedSessions;
205
+ exports.withLocalSends = withLocalSends;
206
+ exports.withoutLocalSends = withoutLocalSends;
207
+ //# sourceMappingURL=live-session-rows.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-session-rows.cjs","sources":["../../src/threads/live-session-rows.ts"],"sourcesContent":["/**\n * The rows the session list shows between one server answer and the next.\n *\n * The list's rows come from the fetched REST pages, and the signed-in user's\n * live conversation index updates them in place. Two gaps are filled here, so\n * the list follows what just happened without waiting for a re-read:\n *\n * - **Sessions the index pushed that the page does not list yet.** A session\n * just started (in this tab or anywhere else) reaches the index in about a\n * second; the re-read the list runs for it takes several more (measured on\n * staging 2026-11-06: push at +1.8 s, row drawn at +5.5 s). The pushed entry\n * is drawn at once, while the re-read still fills in what the index never\n * carries (pull requests, who started it).\n * - **A message this tab just sent.** The session moves to the top as working\n * the moment it is sent (a chat the server does not know yet gets a pending\n * row titled with the message), until the server reports the send.\n *\n * Rows are kept newest first by `updatedAt`, the server's own order, so a\n * session that just became active moves up instead of staying where its last\n * fetched copy was.\n *\n * Pure functions over the shared contract rows: the provider composes them,\n * and they are tested on their own.\n */\nimport {\n type ConversationIndexEntry,\n type ConversationSummary,\n summaryFromConversationIndexEntry,\n} from '@athenaintel/agent-runtime';\n\n/**\n * Start channels of an agent's sessions that the server leaves out when it lists the conversations\n * with a home agent (`home_agent_id`): the agent's tasks and the sessions an orchestrating agent\n * starts.\n */\nconst AGENT_HOME_EXCLUDED_START_CHANNELS: ReadonlySet<string> = new Set([\n 'task',\n 'agent_orchestration',\n]);\n\n/** The REST thread list only lists this asset type (`sdk_thread_list.py`); the index carries more. */\nconst LISTED_ASSET_TYPE = 'session';\n\n/**\n * Whether a pushed index entry is one of the conversations with `homeAgentId`'s agent that the\n * server lists beside the app scope: the agent's, and not one of its tasks or orchestration\n * sessions. An entry from a pod that predates `collab_agent_id` is not.\n */\nexport function isAgentHomeIndexEntry(\n entry: { collab_agent_id?: string | null; start_channel?: string | null },\n homeAgentId: string | undefined,\n): boolean {\n if (!homeAgentId || entry.collab_agent_id !== homeAgentId) return false;\n return !AGENT_HOME_EXCLUDED_START_CHANNELS.has(entry.start_channel ?? '');\n}\n\n/** Which sessions a list shows: its app scope, as the server applies it to every read. */\nexport interface SessionListScope {\n /** The provider's `appId`; the app's own sessions. */\n appId: string | undefined;\n /** Other apps whose sessions the list shows too (a union with `appId`). */\n additionalAppIds: readonly string[];\n /** The collab agent whose conversations the list also asks for (`home_agent_id`). */\n homeAgentId: string | undefined;\n /**\n * Whether the list's latest first page said the server widened it to the home agent's\n * conversations. A server that did not never lists them.\n */\n homeAgentApplied: boolean;\n}\n\n/**\n * Whether the server lists a session with these stamps in a list of this scope — the app filter\n * and the home-agent union exactly as `sdk_thread_list.py` applies them. With no app ids the list\n * holds every app's sessions, unless it was widened to an agent, which then makes it that agent's.\n */\nexport function inSessionListScope(\n entry: { app_id: string | null; collab_agent_id?: string | null; start_channel?: string | null },\n scope: SessionListScope,\n): boolean {\n const appIds = [...(scope.appId ? [scope.appId] : []), ...scope.additionalAppIds];\n const agentId = scope.homeAgentApplied ? scope.homeAgentId : undefined;\n if (appIds.length === 0) return agentId ? isAgentHomeIndexEntry(entry, agentId) : true;\n return appIds.includes(entry.app_id ?? '') || isAgentHomeIndexEntry(entry, agentId);\n}\n\nfunction timestampMs(value: string): number {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/**\n * The listed rows plus every session the index pushed that the list should show and does not\n * list yet: in the list's scope, a listed asset type, and — while older pages remain unread — no\n * older than the oldest loaded row, so a row is never drawn below sessions that are not loaded\n * yet. Nothing is added while a search is active (the server matches it; the index cannot) or\n * before the first page has answered (the page decides what the list starts with). Identity is\n * kept when nothing is added. The rows are not re-sorted here ({@link sortNewestFirst}).\n */\nexport function withIndexedSessions({\n conversations,\n loadedConversations,\n entries,\n scope,\n searching,\n hasResolvedFirstPage,\n hasNextPage,\n}: {\n /** The rows the list shows (fetched pages, pinned rows, folded with the index). */\n conversations: readonly ConversationSummary[];\n /** The fetched pages' rows alone: the window older pages continue below. */\n loadedConversations: readonly ConversationSummary[];\n entries: readonly ConversationIndexEntry[] | null;\n scope: SessionListScope;\n searching: boolean;\n hasResolvedFirstPage: boolean;\n hasNextPage: boolean;\n}): readonly ConversationSummary[] {\n if (!entries || entries.length === 0 || searching || !hasResolvedFirstPage) return conversations;\n const listed = new Set(conversations.map((conversation) => conversation.threadId));\n let windowTailMs: number | null = null;\n if (hasNextPage) {\n for (const conversation of loadedConversations) {\n const ms = timestampMs(conversation.updatedAt);\n if (windowTailMs === null || ms < windowTailMs) windowTailMs = ms;\n }\n }\n const added: ConversationSummary[] = [];\n for (const entry of entries) {\n if (listed.has(entry.thread_id)) continue;\n if (entry.asset_type !== LISTED_ASSET_TYPE) continue;\n if (!inSessionListScope(entry, scope)) continue;\n if (windowTailMs !== null && timestampMs(entry.updated_at) < windowTailMs) continue;\n listed.add(entry.thread_id);\n added.push(summaryFromConversationIndexEntry(entry));\n }\n return added.length === 0 ? conversations : [...conversations, ...added];\n}\n\n/** How long a sent message holds its session's row before the server's own copy must take over. */\nexport const LOCAL_SEND_TTL_MS = 60_000;\n\n/** The longest provisional title kept from a sent message; the server's own title replaces it. */\nconst PENDING_TITLE_MAX_LENGTH = 200;\n\n/**\n * A message this tab sent that the server has not reported yet. Held by the provider; it\n * shapes the session's row until the server's copy of the session reflects the send.\n */\nexport interface LocalSessionSend {\n threadId: string;\n /** When this tab sent it (the client's clock, ms since the epoch). */\n sentAtMs: number;\n /**\n * The instant the row sorts at until the server reports the send: the send time, and never\n * older than the newest row the list showed when it was sent, so the session leads the list\n * even on a client whose clock runs behind the server's.\n */\n sortAt: string;\n /**\n * The session's `updatedAt` as the list showed it when the message was sent; `null` when the\n * list did not show the session (a new chat, or an older session the loaded pages do not\n * reach). The send is reported once the server's row differs.\n */\n baselineUpdatedAt: string | null;\n /**\n * Whether the session was a chat this tab started that the server had not listed yet. Only\n * such a send gets a pending row: a session missing from the loaded pages may well exist.\n */\n newChat: boolean;\n /** The message as one line, the pending title of a chat the server does not know yet. */\n title: string | null;\n /**\n * The provenance the session's first run stamps, when it is known here (the SDK's own `web`,\n * or a host's `extraRunConfig.start_channel`); `null` when the backend decides it (a collab\n * channel stamps its own kind). A new chat's pending row shows it as its origin.\n */\n startChannel: string | null;\n}\n\n/**\n * A sent message as the one-line provisional title of its session: markdown links reduced to\n * their text (a mention reads as its name), whitespace folded, and long messages cut. `null`\n * when nothing is left (an attachment sent alone).\n */\nexport function pendingSessionTitle(text: string | null | undefined): string | null {\n const line = (text ?? '')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\s+/g, ' ')\n .trim();\n if (!line) return null;\n return line.length <= PENDING_TITLE_MAX_LENGTH\n ? line\n : `${line.slice(0, PENDING_TITLE_MAX_LENGTH - 1).trimEnd()}…`;\n}\n\n/**\n * Record a send against the rows the server last reported: the baseline the server must move\n * past, and the instant the row sorts at until it does.\n */\nexport function localSessionSend({\n threadId,\n text,\n sentAtMs,\n newChat,\n startChannel,\n serverConversations,\n}: {\n threadId: string;\n text: string | null | undefined;\n sentAtMs: number;\n /** The session was a chat this tab started that the server had not listed yet. */\n newChat: boolean;\n /** The `start_channel` the send stamps (`effectiveStatewireStartChannel`); `null` if unknown. */\n startChannel: string | null;\n /** The server's rows as the list shows them (fetched pages and pushed index entries). */\n serverConversations: readonly ConversationSummary[];\n}): LocalSessionSend {\n let newestMs = 0;\n let baselineUpdatedAt: string | null = null;\n for (const conversation of serverConversations) {\n const ms = timestampMs(conversation.updatedAt);\n if (ms > newestMs) newestMs = ms;\n if (conversation.threadId === threadId) baselineUpdatedAt = conversation.updatedAt;\n }\n return {\n threadId,\n sentAtMs,\n sortAt: new Date(Math.max(sentAtMs, newestMs + 1)).toISOString(),\n baselineUpdatedAt,\n newChat: newChat && baselineUpdatedAt === null,\n title: pendingSessionTitle(text),\n startChannel,\n };\n}\n\n/**\n * Whether the server's copy of the session reflects the send: a session the list did not show\n * is reported once the server lists it at all; a listed session once its `updatedAt` moved.\n */\nexport function isLocalSendReported(\n send: LocalSessionSend,\n serverRow: ConversationSummary | undefined,\n): boolean {\n if (!serverRow) return false;\n return send.baselineUpdatedAt === null || serverRow.updatedAt !== send.baselineUpdatedAt;\n}\n\n/** The sends without `threadIds`; the same map when it holds none of them. */\nexport function withoutLocalSends(\n sends: ReadonlyMap<string, LocalSessionSend>,\n threadIds: readonly string[],\n): ReadonlyMap<string, LocalSessionSend> {\n if (!threadIds.some((threadId) => sends.has(threadId))) return sends;\n const next = new Map(sends);\n for (const threadId of threadIds) next.delete(threadId);\n return next;\n}\n\n/** The sends to forget: reported by the server, or older than {@link LOCAL_SEND_TTL_MS}. */\nexport function settledLocalSends({\n sends,\n serverConversations,\n nowMs,\n ttlMs = LOCAL_SEND_TTL_MS,\n}: {\n sends: ReadonlyMap<string, LocalSessionSend>;\n serverConversations: readonly ConversationSummary[];\n nowMs: number;\n ttlMs?: number;\n}): string[] {\n if (sends.size === 0) return [];\n const byThread = new Map(serverConversations.map((row) => [row.threadId, row]));\n const settled: string[] = [];\n for (const send of sends.values()) {\n if (nowMs - send.sentAtMs >= ttlMs || isLocalSendReported(send, byThread.get(send.threadId))) {\n settled.push(send.threadId);\n }\n }\n return settled;\n}\n\n/** The session as working, sorted at the send, until the server reports the send. */\nfunction withSentMessage(row: ConversationSummary, send: LocalSessionSend): ConversationSummary {\n return {\n ...row,\n updatedAt: timestampMs(row.updatedAt) >= timestampMs(send.sortAt) ? row.updatedAt : send.sortAt,\n state: 'running',\n sessionStatus: 'active',\n runStatus: 'running',\n attention: 'working',\n nextAction: null,\n attentionSource: null,\n isUnread: false,\n };\n}\n\n/** The pending row of a chat the server does not know yet, as the server will first list it. */\nfunction pendingConversation(send: LocalSessionSend, appId: string | undefined): ConversationSummary {\n const sentAt = new Date(send.sentAtMs).toISOString();\n return {\n threadId: send.threadId,\n title: send.title ?? '',\n updatedAt: send.sortAt,\n createdAt: sentAt,\n state: 'running',\n runtime: null,\n // What the server stamps on the session's first run, when that is known here: the row's\n // origin badge reads as the server's row will, never as a label made from the app id.\n sourceChannel: send.startChannel,\n assetType: LISTED_ASSET_TYPE,\n assetId: null,\n appId: appId ?? null,\n triggerType: null,\n preview: send.title,\n messageCount: null,\n isUnread: false,\n sessionStatus: 'active',\n runStatus: 'running',\n attention: 'working',\n nextAction: null,\n attentionSource: null,\n isFavorited: false,\n createdByMe: true,\n };\n}\n\n/**\n * The rows with this tab's unreported sends applied: a listed session the server has not\n * reported the send for shows as working and sorts at the send; a new chat this tab started\n * gets a pending row, if the list's scope holds this app's new sessions and no search is\n * active. A session the loaded pages do not reach gets nothing here: it exists, and the\n * server's push (or re-read) brings it to the top. Returns the rows and the ids of the pending\n * rows (which the server does not know, so writes cannot be offered on them). Identity is kept\n * when no send applies.\n */\nexport function withLocalSends({\n conversations,\n sends,\n appId,\n showPendingSessions,\n}: {\n conversations: readonly ConversationSummary[];\n sends: ReadonlyMap<string, LocalSessionSend>;\n /** The app new sessions are tagged with (the provider's `appId`). */\n appId: string | undefined;\n /** Whether a new chat's pending row belongs in this list (its scope and search allow it). */\n showPendingSessions: boolean;\n}): { conversations: readonly ConversationSummary[]; pendingThreadIds: ReadonlySet<string> } {\n if (sends.size === 0) return { conversations, pendingThreadIds: EMPTY_IDS };\n const listed = new Set<string>();\n let changed = false;\n const rows = conversations.map((row) => {\n listed.add(row.threadId);\n const send = sends.get(row.threadId);\n if (!send || isLocalSendReported(send, row)) return row;\n changed = true;\n return withSentMessage(row, send);\n });\n const pendingThreadIds = new Set<string>();\n if (showPendingSessions) {\n for (const send of sends.values()) {\n if (!send.newChat || listed.has(send.threadId)) continue;\n pendingThreadIds.add(send.threadId);\n rows.push(pendingConversation(send, appId));\n changed = true;\n }\n }\n return {\n conversations: changed ? rows : conversations,\n pendingThreadIds: pendingThreadIds.size === 0 ? EMPTY_IDS : pendingThreadIds,\n };\n}\n\nconst EMPTY_IDS: ReadonlySet<string> = new Set();\n\n/**\n * The rows newest first by `updatedAt` (the order the server lists them in), keeping the given\n * order between rows of the same instant. Identity is kept when the rows are already in order.\n */\nexport function sortNewestFirst<T extends { updatedAt: string }>(rows: readonly T[]): readonly T[] {\n const keyed = rows.map((row, index) => ({ row, index, ms: timestampMs(row.updatedAt) }));\n let ordered = true;\n for (let i = 1; i < keyed.length; i++) {\n if ((keyed[i - 1]?.ms ?? 0) < (keyed[i]?.ms ?? 0)) {\n ordered = false;\n break;\n }\n }\n if (ordered) return rows;\n keyed.sort((a, b) => b.ms - a.ms || a.index - b.index);\n return keyed.map(({ row }) => row);\n}\n"],"names":["summaryFromConversationIndexEntry"],"mappings":"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"}