@athenaintel/react 0.19.0 → 0.21.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 (987) hide show
  1. package/README.md +171 -11
  2. package/dist/assets/AssetPanel.cjs +277 -0
  3. package/dist/assets/AssetPanel.cjs.map +1 -0
  4. package/dist/assets/AssetPanel.js +277 -0
  5. package/dist/assets/AssetPanel.js.map +1 -0
  6. package/dist/assets/AthenaAssetEmbed.cjs +151 -0
  7. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -0
  8. package/dist/assets/AthenaAssetEmbed.js +151 -0
  9. package/dist/assets/AthenaAssetEmbed.js.map +1 -0
  10. package/dist/assets/AthenaLayout.cjs +69 -0
  11. package/dist/assets/AthenaLayout.cjs.map +1 -0
  12. package/dist/assets/AthenaLayout.js +69 -0
  13. package/dist/assets/AthenaLayout.js.map +1 -0
  14. package/dist/assets/asset-embed-messages.cjs +39 -0
  15. package/dist/assets/asset-embed-messages.cjs.map +1 -0
  16. package/dist/assets/asset-embed-messages.js +39 -0
  17. package/dist/assets/asset-embed-messages.js.map +1 -0
  18. package/dist/assets/asset-panel-store.cjs +124 -0
  19. package/dist/assets/asset-panel-store.cjs.map +1 -0
  20. package/dist/assets/asset-panel-store.js +124 -0
  21. package/dist/assets/asset-panel-store.js.map +1 -0
  22. package/dist/assets/asset-panel-url.cjs +40 -0
  23. package/dist/assets/asset-panel-url.cjs.map +1 -0
  24. package/dist/assets/asset-panel-url.js +40 -0
  25. package/dist/assets/asset-panel-url.js.map +1 -0
  26. package/dist/assets/use-asset-embed.cjs +370 -0
  27. package/dist/assets/use-asset-embed.cjs.map +1 -0
  28. package/dist/assets/use-asset-embed.js +370 -0
  29. package/dist/assets/use-asset-embed.js.map +1 -0
  30. package/dist/{AthenaAuthContext-B3AwLA5Z.cjs → auth/AthenaAuthContext.cjs} +5 -4
  31. package/dist/auth/AthenaAuthContext.cjs.map +1 -0
  32. package/dist/{AthenaAuthContext-DQsdayH2.js → auth/AthenaAuthContext.js} +3 -3
  33. package/dist/auth/AthenaAuthContext.js.map +1 -0
  34. package/dist/auth/AthenaAuthProvider.cjs +141 -0
  35. package/dist/auth/AthenaAuthProvider.cjs.map +1 -0
  36. package/dist/auth/AthenaAuthProvider.js +141 -0
  37. package/dist/auth/AthenaAuthProvider.js.map +1 -0
  38. package/dist/{auth.cjs → auth/AthenaSSOProvider.cjs} +14 -151
  39. package/dist/auth/AthenaSSOProvider.cjs.map +1 -0
  40. package/dist/{auth.js → auth/AthenaSSOProvider.js} +4 -142
  41. package/dist/auth/AthenaSSOProvider.js.map +1 -0
  42. package/dist/auth/index.cjs +10 -0
  43. package/dist/auth/index.cjs.map +1 -0
  44. package/dist/auth/index.js +10 -0
  45. package/dist/auth/index.js.map +1 -0
  46. package/dist/chat/AthenaChat.cjs +753 -0
  47. package/dist/chat/AthenaChat.cjs.map +1 -0
  48. package/dist/chat/AthenaChat.d.ts +3 -2
  49. package/dist/chat/AthenaChat.js +753 -0
  50. package/dist/chat/AthenaChat.js.map +1 -0
  51. package/dist/chat/AthenaChatErrorBoundary.cjs +53 -0
  52. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -0
  53. package/dist/chat/AthenaChatErrorBoundary.js +53 -0
  54. package/dist/chat/AthenaChatErrorBoundary.js.map +1 -0
  55. package/dist/chat/StatewireApprovalCard.cjs +189 -0
  56. package/dist/chat/StatewireApprovalCard.cjs.map +1 -0
  57. package/dist/chat/StatewireApprovalCard.d.ts +14 -0
  58. package/dist/chat/StatewireApprovalCard.js +189 -0
  59. package/dist/chat/StatewireApprovalCard.js.map +1 -0
  60. package/dist/chat/StatewireClientToolBridge.cjs +51 -0
  61. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -0
  62. package/dist/chat/StatewireClientToolBridge.js +51 -0
  63. package/dist/chat/StatewireClientToolBridge.js.map +1 -0
  64. package/dist/chat/StatewireQueuedMessages.cjs +433 -0
  65. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -0
  66. package/dist/chat/StatewireQueuedMessages.d.ts +3 -4
  67. package/dist/chat/StatewireQueuedMessages.js +433 -0
  68. package/dist/chat/StatewireQueuedMessages.js.map +1 -0
  69. package/dist/chat/athena-citation-links.cjs +342 -0
  70. package/dist/chat/athena-citation-links.cjs.map +1 -0
  71. package/dist/chat/athena-citation-links.js +342 -0
  72. package/dist/chat/athena-citation-links.js.map +1 -0
  73. package/dist/chat/run-activity.cjs +28 -0
  74. package/dist/chat/run-activity.cjs.map +1 -0
  75. package/dist/chat/run-activity.js +28 -0
  76. package/dist/chat/run-activity.js.map +1 -0
  77. package/dist/chat/statewire-banners.cjs +83 -0
  78. package/dist/chat/statewire-banners.cjs.map +1 -0
  79. package/dist/chat/statewire-banners.js +83 -0
  80. package/dist/chat/statewire-banners.js.map +1 -0
  81. package/dist/chat/statewire-client-tools.cjs +74 -0
  82. package/dist/chat/statewire-client-tools.cjs.map +1 -0
  83. package/dist/chat/statewire-client-tools.js +74 -0
  84. package/dist/chat/statewire-client-tools.js.map +1 -0
  85. package/dist/chat/super-grouping/CollapsibleGroup.cjs +158 -0
  86. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -0
  87. package/dist/chat/super-grouping/CollapsibleGroup.js +158 -0
  88. package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -0
  89. package/dist/chat/super-grouping/SuperGroupingCard.cjs +243 -0
  90. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -0
  91. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +14 -7
  92. package/dist/chat/super-grouping/SuperGroupingCard.js +243 -0
  93. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -0
  94. package/dist/chat/super-grouping/ToolTimeline.cjs +131 -0
  95. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -0
  96. package/dist/chat/super-grouping/ToolTimeline.d.ts +16 -0
  97. package/dist/chat/super-grouping/ToolTimeline.js +131 -0
  98. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -0
  99. package/dist/chat/super-grouping/activity-timeline.cjs +157 -0
  100. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -0
  101. package/dist/chat/super-grouping/activity-timeline.d.ts +6 -3
  102. package/dist/chat/super-grouping/activity-timeline.js +157 -0
  103. package/dist/chat/super-grouping/activity-timeline.js.map +1 -0
  104. package/dist/chat/super-grouping/grouping-function.cjs +55 -0
  105. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -0
  106. package/dist/chat/super-grouping/grouping-function.js +55 -0
  107. package/dist/chat/super-grouping/grouping-function.js.map +1 -0
  108. package/dist/chat/super-grouping/index.cjs +26 -0
  109. package/dist/chat/super-grouping/index.cjs.map +1 -0
  110. package/dist/chat/super-grouping/index.js +26 -0
  111. package/dist/chat/super-grouping/index.js.map +1 -0
  112. package/dist/chat/super-grouping/timeline-step.cjs +65 -0
  113. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -0
  114. package/dist/chat/super-grouping/timeline-step.d.ts +17 -0
  115. package/dist/chat/super-grouping/timeline-step.js +65 -0
  116. package/dist/chat/super-grouping/timeline-step.js.map +1 -0
  117. package/dist/chat/super-grouping/toolkit-map.cjs +96 -0
  118. package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -0
  119. package/dist/chat/super-grouping/toolkit-map.js +96 -0
  120. package/dist/chat/super-grouping/toolkit-map.js.map +1 -0
  121. package/dist/chat/tiptap-text.cjs +101 -0
  122. package/dist/chat/tiptap-text.cjs.map +1 -0
  123. package/dist/chat/tiptap-text.js +101 -0
  124. package/dist/chat/tiptap-text.js.map +1 -0
  125. package/dist/chat/tooltip-icon-button.cjs +32 -0
  126. package/dist/chat/tooltip-icon-button.cjs.map +1 -0
  127. package/dist/chat/tooltip-icon-button.js +32 -0
  128. package/dist/chat/tooltip-icon-button.js.map +1 -0
  129. package/dist/chat/use-athena-run-live.cjs +24 -0
  130. package/dist/chat/use-athena-run-live.cjs.map +1 -0
  131. package/dist/chat/use-athena-run-live.d.ts +10 -0
  132. package/dist/chat/use-athena-run-live.js +24 -0
  133. package/dist/chat/use-athena-run-live.js.map +1 -0
  134. package/dist/chat/use-statewire-approval-request.cjs +51 -0
  135. package/dist/chat/use-statewire-approval-request.cjs.map +1 -0
  136. package/dist/chat/use-statewire-approval-request.d.ts +12 -2
  137. package/dist/chat/use-statewire-approval-request.js +51 -0
  138. package/dist/chat/use-statewire-approval-request.js.map +1 -0
  139. package/dist/chat-ui/auth/sign-in-card.cjs +128 -0
  140. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -0
  141. package/dist/chat-ui/auth/sign-in-card.js +128 -0
  142. package/dist/chat-ui/auth/sign-in-card.js.map +1 -0
  143. package/dist/chat-ui/composer/composer-action.cjs +11 -0
  144. package/dist/chat-ui/composer/composer-action.cjs.map +1 -0
  145. package/dist/chat-ui/composer/composer-action.d.ts +5 -8
  146. package/dist/chat-ui/composer/composer-action.js +11 -0
  147. package/dist/chat-ui/composer/composer-action.js.map +1 -0
  148. package/dist/chat-ui/composer/pending-attachment-uploads.cjs +25 -0
  149. package/dist/chat-ui/composer/pending-attachment-uploads.cjs.map +1 -0
  150. package/dist/chat-ui/composer/pending-attachment-uploads.js +25 -0
  151. package/dist/chat-ui/composer/pending-attachment-uploads.js.map +1 -0
  152. package/dist/chat-ui/composer/tiptap-composer.cjs +549 -0
  153. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -0
  154. package/dist/chat-ui/composer/tiptap-composer.d.ts +44 -7
  155. package/dist/chat-ui/composer/tiptap-composer.js +549 -0
  156. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -0
  157. package/dist/chat-ui/header/chat-header.cjs +33 -0
  158. package/dist/chat-ui/header/chat-header.cjs.map +1 -0
  159. package/dist/chat-ui/header/chat-header.js +33 -0
  160. package/dist/chat-ui/header/chat-header.js.map +1 -0
  161. package/dist/chat-ui/header/conversation-history-panel.cjs +369 -0
  162. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -0
  163. package/dist/chat-ui/header/conversation-history-panel.js +369 -0
  164. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -0
  165. package/dist/chat-ui/index.cjs +140 -0
  166. package/dist/chat-ui/index.cjs.map +1 -0
  167. package/dist/chat-ui/index.d.ts +4 -3
  168. package/dist/chat-ui/index.js +140 -0
  169. package/dist/chat-ui/index.js.map +1 -0
  170. package/dist/chat-ui/lib/asset-urls.cjs +18 -0
  171. package/dist/chat-ui/lib/asset-urls.cjs.map +1 -0
  172. package/dist/chat-ui/lib/asset-urls.js +18 -0
  173. package/dist/chat-ui/lib/asset-urls.js.map +1 -0
  174. package/dist/chat-ui/mentions/mention-chip.cjs +253 -0
  175. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -0
  176. package/dist/chat-ui/mentions/mention-chip.d.ts +11 -0
  177. package/dist/chat-ui/mentions/mention-chip.js +253 -0
  178. package/dist/chat-ui/mentions/mention-chip.js.map +1 -0
  179. package/dist/chat-ui/mentions/mention-extension.cjs +196 -0
  180. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -0
  181. package/dist/chat-ui/mentions/mention-extension.d.ts +26 -2
  182. package/dist/chat-ui/mentions/mention-extension.js +196 -0
  183. package/dist/chat-ui/mentions/mention-extension.js.map +1 -0
  184. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +35 -0
  185. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -0
  186. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +35 -0
  187. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -0
  188. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +95 -0
  189. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -0
  190. package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +5 -0
  191. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +95 -0
  192. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -0
  193. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +116 -0
  194. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -0
  195. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +116 -0
  196. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -0
  197. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +31 -0
  198. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -0
  199. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js +31 -0
  200. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js.map +1 -0
  201. package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.cjs +27 -0
  202. package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.cjs.map +1 -0
  203. package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.js +27 -0
  204. package/dist/chat-ui/mentions/suggestions/components/menu-breadcrumbs.js.map +1 -0
  205. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +65 -0
  206. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -0
  207. package/dist/chat-ui/mentions/suggestions/components/menu-item.d.ts +2 -2
  208. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +65 -0
  209. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -0
  210. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +63 -0
  211. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -0
  212. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +2 -2
  213. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +63 -0
  214. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -0
  215. package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.cjs +11 -0
  216. package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.cjs.map +1 -0
  217. package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.js +11 -0
  218. package/dist/chat-ui/mentions/suggestions/components/menu-skeleton.js.map +1 -0
  219. package/dist/chat-ui/mentions/suggestions/components/menu-summary.cjs +33 -0
  220. package/dist/chat-ui/mentions/suggestions/components/menu-summary.cjs.map +1 -0
  221. package/dist/chat-ui/mentions/suggestions/components/menu-summary.js +33 -0
  222. package/dist/chat-ui/mentions/suggestions/components/menu-summary.js.map +1 -0
  223. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +58 -0
  224. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -0
  225. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.js +58 -0
  226. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.js.map +1 -0
  227. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +81 -0
  228. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -0
  229. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.js +81 -0
  230. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.js.map +1 -0
  231. package/dist/chat-ui/mentions/suggestions/components/utils.cjs +18 -0
  232. package/dist/chat-ui/mentions/suggestions/components/utils.cjs.map +1 -0
  233. package/dist/chat-ui/mentions/suggestions/components/utils.js +18 -0
  234. package/dist/chat-ui/mentions/suggestions/components/utils.js.map +1 -0
  235. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +124 -0
  236. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -0
  237. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +13 -2
  238. package/dist/chat-ui/mentions/suggestions/data/api-client.js +124 -0
  239. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -0
  240. package/dist/chat-ui/mentions/suggestions/data/item-cache.cjs +37 -0
  241. package/dist/chat-ui/mentions/suggestions/data/item-cache.cjs.map +1 -0
  242. package/dist/chat-ui/mentions/suggestions/data/item-cache.js +37 -0
  243. package/dist/chat-ui/mentions/suggestions/data/item-cache.js.map +1 -0
  244. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +134 -0
  245. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -0
  246. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +134 -0
  247. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -0
  248. package/dist/chat-ui/mentions/suggestions/data/scope-registry.cjs +91 -0
  249. package/dist/chat-ui/mentions/suggestions/data/scope-registry.cjs.map +1 -0
  250. package/dist/chat-ui/mentions/suggestions/data/scope-registry.js +91 -0
  251. package/dist/chat-ui/mentions/suggestions/data/scope-registry.js.map +1 -0
  252. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +137 -0
  253. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -0
  254. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +137 -0
  255. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -0
  256. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +375 -0
  257. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -0
  258. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +16 -1
  259. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +375 -0
  260. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -0
  261. package/dist/chat-ui/mentions/suggestions/data/types.cjs +9 -0
  262. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -0
  263. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +14 -0
  264. package/dist/chat-ui/mentions/suggestions/data/types.js +9 -0
  265. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -0
  266. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +173 -0
  267. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -0
  268. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +14 -4
  269. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +173 -0
  270. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -0
  271. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +45 -0
  272. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -0
  273. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +45 -0
  274. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -0
  275. package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.cjs +43 -0
  276. package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.cjs.map +1 -0
  277. package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.js +43 -0
  278. package/dist/chat-ui/mentions/suggestions/data/utils/filter-items.js.map +1 -0
  279. package/dist/chat-ui/mentions/suggestions/data/utils/match-query.cjs +14 -0
  280. package/dist/chat-ui/mentions/suggestions/data/utils/match-query.cjs.map +1 -0
  281. package/dist/chat-ui/mentions/suggestions/data/utils/match-query.js +14 -0
  282. package/dist/chat-ui/mentions/suggestions/data/utils/match-query.js.map +1 -0
  283. package/dist/chat-ui/mentions/suggestions/data/utils/score-match.cjs +48 -0
  284. package/dist/chat-ui/mentions/suggestions/data/utils/score-match.cjs.map +1 -0
  285. package/dist/chat-ui/mentions/suggestions/data/utils/score-match.js +48 -0
  286. package/dist/chat-ui/mentions/suggestions/data/utils/score-match.js.map +1 -0
  287. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +71 -0
  288. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -0
  289. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +71 -0
  290. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -0
  291. package/dist/chat-ui/messages/continue-pill.cjs +54 -0
  292. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -0
  293. package/dist/chat-ui/messages/continue-pill.js +54 -0
  294. package/dist/chat-ui/messages/continue-pill.js.map +1 -0
  295. package/dist/chat-ui/messages/message-actions-config.cjs +12 -0
  296. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -0
  297. package/dist/chat-ui/messages/message-actions-config.js +12 -0
  298. package/dist/chat-ui/messages/message-actions-config.js.map +1 -0
  299. package/dist/chat-ui/messages/message-components.cjs +320 -0
  300. package/dist/chat-ui/messages/message-components.cjs.map +1 -0
  301. package/dist/chat-ui/messages/message-components.d.ts +1 -1
  302. package/dist/chat-ui/messages/message-components.js +320 -0
  303. package/dist/chat-ui/messages/message-components.js.map +1 -0
  304. package/dist/chat-ui/messages/running-indicator.cjs +49 -0
  305. package/dist/chat-ui/messages/running-indicator.cjs.map +1 -0
  306. package/dist/chat-ui/messages/running-indicator.js +49 -0
  307. package/dist/chat-ui/messages/running-indicator.js.map +1 -0
  308. package/dist/chat-ui/messages/runtime-message.cjs +66 -0
  309. package/dist/chat-ui/messages/runtime-message.cjs.map +1 -0
  310. package/dist/chat-ui/messages/runtime-message.js +66 -0
  311. package/dist/chat-ui/messages/runtime-message.js.map +1 -0
  312. package/dist/{statewire-continue-run-nE9VCKUh.cjs → chat-ui/messages/statewire-continue-run.cjs} +61 -23
  313. package/dist/chat-ui/messages/statewire-continue-run.cjs.map +1 -0
  314. package/dist/chat-ui/messages/statewire-continue-run.d.ts +19 -5
  315. package/dist/{statewire-continue-run-D34gS7_1.js → chat-ui/messages/statewire-continue-run.js} +51 -14
  316. package/dist/chat-ui/messages/statewire-continue-run.js.map +1 -0
  317. package/dist/chat-ui/messages/user-edit-composer.cjs +62 -0
  318. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -0
  319. package/dist/chat-ui/messages/user-edit-composer.js +62 -0
  320. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -0
  321. package/dist/chat-ui/messages/voice-delegation-card.cjs +51 -0
  322. package/dist/chat-ui/messages/voice-delegation-card.cjs.map +1 -0
  323. package/dist/chat-ui/messages/voice-delegation-card.d.ts +26 -0
  324. package/dist/chat-ui/messages/voice-delegation-card.js +51 -0
  325. package/dist/chat-ui/messages/voice-delegation-card.js.map +1 -0
  326. package/dist/chat-ui/rich-text/chat-message-body.cjs +76 -0
  327. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -0
  328. package/dist/chat-ui/rich-text/chat-message-body.d.ts +5 -0
  329. package/dist/chat-ui/rich-text/chat-message-body.js +76 -0
  330. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -0
  331. package/dist/chat-ui/rich-text/chat-node-views.cjs +51 -0
  332. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -0
  333. package/dist/chat-ui/rich-text/chat-node-views.d.ts +13 -0
  334. package/dist/chat-ui/rich-text/chat-node-views.js +51 -0
  335. package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -0
  336. package/dist/chat-ui/rich-text/chat-text-schema.cjs +70 -0
  337. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -0
  338. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +7 -0
  339. package/dist/chat-ui/rich-text/chat-text-schema.js +70 -0
  340. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -0
  341. package/dist/chat-ui/rich-text/dom-output-spec.cjs +83 -0
  342. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -0
  343. package/dist/chat-ui/rich-text/dom-output-spec.d.ts +11 -0
  344. package/dist/chat-ui/rich-text/dom-output-spec.js +83 -0
  345. package/dist/chat-ui/rich-text/dom-output-spec.js.map +1 -0
  346. package/dist/chat-ui/statewire.cjs +40 -0
  347. package/dist/chat-ui/statewire.cjs.map +1 -0
  348. package/dist/chat-ui/statewire.js +40 -0
  349. package/dist/chat-ui/statewire.js.map +1 -0
  350. package/dist/chat-ui/thread/chat-composer-dock.cjs +37 -0
  351. package/dist/chat-ui/thread/chat-composer-dock.cjs.map +1 -0
  352. package/dist/chat-ui/thread/chat-composer-dock.js +37 -0
  353. package/dist/chat-ui/thread/chat-composer-dock.js.map +1 -0
  354. package/dist/chat-ui/thread/chat-thread-shell.cjs +102 -0
  355. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -0
  356. package/dist/chat-ui/thread/chat-thread-shell.js +102 -0
  357. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -0
  358. package/dist/chat-ui/thread/composer-send-or-stop.cjs +75 -0
  359. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -0
  360. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +0 -6
  361. package/dist/chat-ui/thread/composer-send-or-stop.js +75 -0
  362. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -0
  363. package/dist/chat-ui/thread/statewire-history-edge.cjs +135 -0
  364. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -0
  365. package/dist/chat-ui/thread/statewire-history-edge.js +135 -0
  366. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -0
  367. package/dist/{collab.cjs → collab/client.cjs} +6 -166
  368. package/dist/collab/client.cjs.map +1 -0
  369. package/dist/{collab.js → collab/client.js} +5 -164
  370. package/dist/collab/client.js.map +1 -0
  371. package/dist/collab/close-policy.cjs +14 -0
  372. package/dist/collab/close-policy.cjs.map +1 -0
  373. package/dist/collab/close-policy.js +14 -0
  374. package/dist/collab/close-policy.js.map +1 -0
  375. package/dist/collab/index.cjs +17 -0
  376. package/dist/collab/index.cjs.map +1 -0
  377. package/dist/collab/index.js +17 -0
  378. package/dist/collab/index.js.map +1 -0
  379. package/dist/collab/mint.cjs +59 -0
  380. package/dist/collab/mint.cjs.map +1 -0
  381. package/dist/collab/mint.js +59 -0
  382. package/dist/collab/mint.js.map +1 -0
  383. package/dist/collab/react.cjs +58 -0
  384. package/dist/collab/react.cjs.map +1 -0
  385. package/dist/collab/react.js +58 -0
  386. package/dist/collab/react.js.map +1 -0
  387. package/dist/collab/shape.cjs +45 -0
  388. package/dist/collab/shape.cjs.map +1 -0
  389. package/dist/collab/shape.js +45 -0
  390. package/dist/collab/shape.js.map +1 -0
  391. package/dist/composer/AttachmentContext.cjs +40 -0
  392. package/dist/composer/AttachmentContext.cjs.map +1 -0
  393. package/dist/composer/AttachmentContext.js +40 -0
  394. package/dist/composer/AttachmentContext.js.map +1 -0
  395. package/dist/composer/ComposerAttachmentPreview.cjs +39 -0
  396. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -0
  397. package/dist/composer/ComposerAttachmentPreview.js +39 -0
  398. package/dist/composer/ComposerAttachmentPreview.js.map +1 -0
  399. package/dist/composer/ComposerDropZone.cjs +61 -0
  400. package/dist/composer/ComposerDropZone.cjs.map +1 -0
  401. package/dist/composer/ComposerDropZone.d.ts +1 -1
  402. package/dist/composer/ComposerDropZone.js +61 -0
  403. package/dist/composer/ComposerDropZone.js.map +1 -0
  404. package/dist/composer/ComposerQuotePreview.cjs +42 -0
  405. package/dist/composer/ComposerQuotePreview.cjs.map +1 -0
  406. package/dist/composer/ComposerQuotePreview.js +42 -0
  407. package/dist/composer/ComposerQuotePreview.js.map +1 -0
  408. package/dist/composer/FileUploadButton.cjs +65 -0
  409. package/dist/composer/FileUploadButton.cjs.map +1 -0
  410. package/dist/composer/FileUploadButton.d.ts +1 -1
  411. package/dist/composer/FileUploadButton.js +65 -0
  412. package/dist/composer/FileUploadButton.js.map +1 -0
  413. package/dist/composer/QuoteContext.cjs +68 -0
  414. package/dist/composer/QuoteContext.cjs.map +1 -0
  415. package/dist/composer/QuoteContext.js +68 -0
  416. package/dist/composer/QuoteContext.js.map +1 -0
  417. package/dist/composer/build-composed-message.cjs +25 -0
  418. package/dist/composer/build-composed-message.cjs.map +1 -0
  419. package/dist/composer/build-composed-message.js +25 -0
  420. package/dist/composer/build-composed-message.js.map +1 -0
  421. package/dist/composer/clipboard.cjs +62 -0
  422. package/dist/composer/clipboard.cjs.map +1 -0
  423. package/dist/composer/clipboard.d.ts +27 -3
  424. package/dist/composer/clipboard.js +62 -0
  425. package/dist/composer/clipboard.js.map +1 -0
  426. package/dist/composer/useAppendToComposer.cjs +21 -0
  427. package/dist/composer/useAppendToComposer.cjs.map +1 -0
  428. package/dist/composer/useAppendToComposer.js +21 -0
  429. package/dist/composer/useAppendToComposer.js.map +1 -0
  430. package/dist/composer/useAttachFiles.cjs +40 -0
  431. package/dist/composer/useAttachFiles.cjs.map +1 -0
  432. package/dist/composer/useAttachFiles.d.ts +24 -0
  433. package/dist/composer/useAttachFiles.js +40 -0
  434. package/dist/composer/useAttachFiles.js.map +1 -0
  435. package/dist/composer/useComposerAttachment.cjs +25 -0
  436. package/dist/composer/useComposerAttachment.cjs.map +1 -0
  437. package/dist/composer/useComposerAttachment.js +25 -0
  438. package/dist/composer/useComposerAttachment.js.map +1 -0
  439. package/dist/composer/useFileUpload.cjs +123 -0
  440. package/dist/composer/useFileUpload.cjs.map +1 -0
  441. package/dist/composer/useFileUpload.js +123 -0
  442. package/dist/composer/useFileUpload.js.map +1 -0
  443. package/dist/composer/useSendMessage.cjs +22 -0
  444. package/dist/composer/useSendMessage.cjs.map +1 -0
  445. package/dist/composer/useSendMessage.js +22 -0
  446. package/dist/composer/useSendMessage.js.map +1 -0
  447. package/dist/diagnostics/athena-diagnostics.cjs +329 -0
  448. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -0
  449. package/dist/diagnostics/athena-diagnostics.js +329 -0
  450. package/dist/diagnostics/athena-diagnostics.js.map +1 -0
  451. package/dist/diagnostics/errors.cjs +89 -0
  452. package/dist/diagnostics/errors.cjs.map +1 -0
  453. package/dist/diagnostics/errors.js +89 -0
  454. package/dist/diagnostics/errors.js.map +1 -0
  455. package/dist/diagnostics/useAthenaDiagnostics.cjs +16 -0
  456. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -0
  457. package/dist/diagnostics/useAthenaDiagnostics.js +16 -0
  458. package/dist/diagnostics/useAthenaDiagnostics.js.map +1 -0
  459. package/dist/index.cjs +275 -27882
  460. package/dist/index.cjs.map +1 -1
  461. package/dist/index.d.ts +6 -4
  462. package/dist/index.js +162 -27759
  463. package/dist/index.js.map +1 -1
  464. package/dist/lib/athena-urls.cjs +194 -0
  465. package/dist/lib/athena-urls.cjs.map +1 -0
  466. package/dist/lib/athena-urls.d.ts +20 -5
  467. package/dist/lib/athena-urls.js +194 -0
  468. package/dist/lib/athena-urls.js.map +1 -0
  469. package/dist/lib/posthog/before-send.cjs +58 -0
  470. package/dist/lib/posthog/before-send.cjs.map +1 -0
  471. package/dist/lib/posthog/before-send.js +58 -0
  472. package/dist/lib/posthog/before-send.js.map +1 -0
  473. package/dist/lib/posthog/capture-gate.cjs +322 -0
  474. package/dist/lib/posthog/capture-gate.cjs.map +1 -0
  475. package/dist/lib/posthog/capture-gate.js +322 -0
  476. package/dist/lib/posthog/capture-gate.js.map +1 -0
  477. package/dist/lib/posthog/wrap-posthog-client.cjs +163 -0
  478. package/dist/lib/posthog/wrap-posthog-client.cjs.map +1 -0
  479. package/dist/lib/posthog/wrap-posthog-client.js +163 -0
  480. package/dist/lib/posthog/wrap-posthog-client.js.map +1 -0
  481. package/dist/lib/utils.cjs +12 -0
  482. package/dist/lib/utils.cjs.map +1 -0
  483. package/dist/lib/utils.js +9 -0
  484. package/dist/lib/utils.js.map +1 -0
  485. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs +77 -0
  486. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs.map +1 -0
  487. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js +77 -0
  488. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js.map +1 -0
  489. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs +181 -0
  490. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs.map +1 -0
  491. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js +181 -0
  492. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js.map +1 -0
  493. package/dist/node_modules/qrcode-generator/dist/qrcode.cjs +32 -0
  494. package/dist/node_modules/qrcode-generator/dist/qrcode.cjs.map +1 -0
  495. package/dist/node_modules/qrcode-generator/dist/qrcode.js +31 -0
  496. package/dist/node_modules/qrcode-generator/dist/qrcode.js.map +1 -0
  497. package/dist/node_modules/zod/v4/classic/errors.cjs +44 -0
  498. package/dist/node_modules/zod/v4/classic/errors.cjs.map +1 -0
  499. package/dist/node_modules/zod/v4/classic/errors.js +44 -0
  500. package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
  501. package/dist/node_modules/zod/v4/classic/iso.cjs +43 -0
  502. package/dist/node_modules/zod/v4/classic/iso.cjs.map +1 -0
  503. package/dist/node_modules/zod/v4/classic/iso.js +43 -0
  504. package/dist/node_modules/zod/v4/classic/iso.js.map +1 -0
  505. package/dist/node_modules/zod/v4/classic/parse.cjs +29 -0
  506. package/dist/node_modules/zod/v4/classic/parse.cjs.map +1 -0
  507. package/dist/node_modules/zod/v4/classic/parse.js +29 -0
  508. package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
  509. package/dist/node_modules/zod/v4/classic/schemas.cjs +871 -0
  510. package/dist/node_modules/zod/v4/classic/schemas.cjs.map +1 -0
  511. package/dist/node_modules/zod/v4/classic/schemas.js +871 -0
  512. package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
  513. package/dist/node_modules/zod/v4/core/api.cjs +570 -0
  514. package/dist/node_modules/zod/v4/core/api.cjs.map +1 -0
  515. package/dist/node_modules/zod/v4/core/api.js +570 -0
  516. package/dist/node_modules/zod/v4/core/api.js.map +1 -0
  517. package/dist/node_modules/zod/v4/core/checks.cjs +411 -0
  518. package/dist/node_modules/zod/v4/core/checks.cjs.map +1 -0
  519. package/dist/node_modules/zod/v4/core/checks.js +411 -0
  520. package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
  521. package/dist/node_modules/zod/v4/core/core.cjs +77 -0
  522. package/dist/node_modules/zod/v4/core/core.cjs.map +1 -0
  523. package/dist/node_modules/zod/v4/core/core.js +77 -0
  524. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  525. package/dist/node_modules/zod/v4/core/doc.cjs +38 -0
  526. package/dist/node_modules/zod/v4/core/doc.cjs.map +1 -0
  527. package/dist/node_modules/zod/v4/core/doc.js +38 -0
  528. package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
  529. package/dist/node_modules/zod/v4/core/errors.cjs +76 -0
  530. package/dist/node_modules/zod/v4/core/errors.cjs.map +1 -0
  531. package/dist/node_modules/zod/v4/core/errors.js +76 -0
  532. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  533. package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +312 -0
  534. package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +1 -0
  535. package/dist/node_modules/zod/v4/core/json-schema-processors.js +312 -0
  536. package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
  537. package/dist/node_modules/zod/v4/core/parse.cjs +96 -0
  538. package/dist/node_modules/zod/v4/core/parse.cjs.map +1 -0
  539. package/dist/node_modules/zod/v4/core/parse.js +96 -0
  540. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  541. package/dist/node_modules/zod/v4/core/regexes.cjs +86 -0
  542. package/dist/node_modules/zod/v4/core/regexes.cjs.map +1 -0
  543. package/dist/node_modules/zod/v4/core/regexes.js +86 -0
  544. package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
  545. package/dist/node_modules/zod/v4/core/registries.cjs +52 -0
  546. package/dist/node_modules/zod/v4/core/registries.cjs.map +1 -0
  547. package/dist/node_modules/zod/v4/core/registries.js +52 -0
  548. package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
  549. package/dist/node_modules/zod/v4/core/schemas.cjs +1412 -0
  550. package/dist/node_modules/zod/v4/core/schemas.cjs.map +1 -0
  551. package/dist/node_modules/zod/v4/core/schemas.js +1413 -0
  552. package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
  553. package/dist/node_modules/zod/v4/core/to-json-schema.cjs +370 -0
  554. package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +1 -0
  555. package/dist/node_modules/zod/v4/core/to-json-schema.js +370 -0
  556. package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
  557. package/dist/node_modules/zod/v4/core/util.cjs +444 -0
  558. package/dist/node_modules/zod/v4/core/util.cjs.map +1 -0
  559. package/dist/node_modules/zod/v4/core/util.js +444 -0
  560. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  561. package/dist/node_modules/zod/v4/core/versions.cjs +9 -0
  562. package/dist/node_modules/zod/v4/core/versions.cjs.map +1 -0
  563. package/dist/node_modules/zod/v4/core/versions.js +9 -0
  564. package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
  565. package/dist/packages/agent-runtime/src/asset-attachment.cjs +19 -0
  566. package/dist/packages/agent-runtime/src/asset-attachment.cjs.map +1 -0
  567. package/dist/packages/agent-runtime/src/asset-attachment.js +19 -0
  568. package/dist/packages/agent-runtime/src/asset-attachment.js.map +1 -0
  569. package/dist/packages/agent-runtime/src/auth-denial.cjs +28 -0
  570. package/dist/packages/agent-runtime/src/auth-denial.cjs.map +1 -0
  571. package/dist/packages/agent-runtime/src/auth-denial.js +28 -0
  572. package/dist/packages/agent-runtime/src/auth-denial.js.map +1 -0
  573. package/dist/packages/agent-runtime/src/client-tool-bridge.cjs +276 -0
  574. package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +1 -0
  575. package/dist/packages/agent-runtime/src/client-tool-bridge.js +276 -0
  576. package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +1 -0
  577. package/dist/packages/agent-runtime/src/client-tools.cjs +137 -0
  578. package/dist/packages/agent-runtime/src/client-tools.cjs.map +1 -0
  579. package/dist/packages/agent-runtime/src/client-tools.js +137 -0
  580. package/dist/packages/agent-runtime/src/client-tools.js.map +1 -0
  581. package/dist/packages/agent-runtime/src/conversation-index.cjs +80 -0
  582. package/dist/packages/agent-runtime/src/conversation-index.cjs.map +1 -0
  583. package/dist/packages/agent-runtime/src/conversation-index.js +80 -0
  584. package/dist/packages/agent-runtime/src/conversation-index.js.map +1 -0
  585. package/dist/packages/agent-runtime/src/conversation-list.cjs +90 -0
  586. package/dist/packages/agent-runtime/src/conversation-list.cjs.map +1 -0
  587. package/dist/packages/agent-runtime/src/conversation-list.js +90 -0
  588. package/dist/packages/agent-runtime/src/conversation-list.js.map +1 -0
  589. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs +55 -0
  590. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -0
  591. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js +55 -0
  592. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -0
  593. package/dist/packages/agent-runtime/src/edit-command.cjs +89 -0
  594. package/dist/packages/agent-runtime/src/edit-command.cjs.map +1 -0
  595. package/dist/packages/agent-runtime/src/edit-command.js +89 -0
  596. package/dist/packages/agent-runtime/src/edit-command.js.map +1 -0
  597. package/dist/packages/agent-runtime/src/errors.cjs +95 -0
  598. package/dist/packages/agent-runtime/src/errors.cjs.map +1 -0
  599. package/dist/packages/agent-runtime/src/errors.js +95 -0
  600. package/dist/packages/agent-runtime/src/errors.js.map +1 -0
  601. package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs +238 -0
  602. package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -0
  603. package/dist/packages/agent-runtime/src/generated/runconfig-contract.js +238 -0
  604. package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +1 -0
  605. package/dist/packages/agent-runtime/src/interrupts.cjs +141 -0
  606. package/dist/packages/agent-runtime/src/interrupts.cjs.map +1 -0
  607. package/dist/packages/agent-runtime/src/interrupts.js +141 -0
  608. package/dist/packages/agent-runtime/src/interrupts.js.map +1 -0
  609. package/dist/packages/agent-runtime/src/message-author.cjs +31 -0
  610. package/dist/packages/agent-runtime/src/message-author.cjs.map +1 -0
  611. package/dist/packages/agent-runtime/src/message-author.js +31 -0
  612. package/dist/packages/agent-runtime/src/message-author.js.map +1 -0
  613. package/dist/packages/agent-runtime/src/message-window.cjs +85 -0
  614. package/dist/packages/agent-runtime/src/message-window.cjs.map +1 -0
  615. package/dist/packages/agent-runtime/src/message-window.js +85 -0
  616. package/dist/packages/agent-runtime/src/message-window.js.map +1 -0
  617. package/dist/packages/agent-runtime/src/messages.cjs +463 -0
  618. package/dist/packages/agent-runtime/src/messages.cjs.map +1 -0
  619. package/dist/packages/agent-runtime/src/messages.js +463 -0
  620. package/dist/packages/agent-runtime/src/messages.js.map +1 -0
  621. package/dist/packages/agent-runtime/src/model-context.cjs +13 -0
  622. package/dist/packages/agent-runtime/src/model-context.cjs.map +1 -0
  623. package/dist/packages/agent-runtime/src/model-context.js +13 -0
  624. package/dist/packages/agent-runtime/src/model-context.js.map +1 -0
  625. package/dist/packages/agent-runtime/src/optimistic-content.cjs +17 -0
  626. package/dist/packages/agent-runtime/src/optimistic-content.cjs.map +1 -0
  627. package/dist/packages/agent-runtime/src/optimistic-content.js +17 -0
  628. package/dist/packages/agent-runtime/src/optimistic-content.js.map +1 -0
  629. package/dist/packages/agent-runtime/src/protocol.cjs +31 -0
  630. package/dist/packages/agent-runtime/src/protocol.cjs.map +1 -0
  631. package/dist/packages/agent-runtime/src/protocol.js +31 -0
  632. package/dist/packages/agent-runtime/src/protocol.js.map +1 -0
  633. package/dist/packages/agent-runtime/src/queue.cjs +67 -0
  634. package/dist/packages/agent-runtime/src/queue.cjs.map +1 -0
  635. package/dist/packages/agent-runtime/src/queue.js +67 -0
  636. package/dist/packages/agent-runtime/src/queue.js.map +1 -0
  637. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs +329 -0
  638. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -0
  639. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js +329 -0
  640. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -0
  641. package/dist/packages/agent-runtime/src/runtime-messages.cjs +187 -0
  642. package/dist/packages/agent-runtime/src/runtime-messages.cjs.map +1 -0
  643. package/dist/packages/agent-runtime/src/runtime-messages.js +187 -0
  644. package/dist/packages/agent-runtime/src/runtime-messages.js.map +1 -0
  645. package/dist/packages/agent-runtime/src/screen-point.cjs +68 -0
  646. package/dist/packages/agent-runtime/src/screen-point.cjs.map +1 -0
  647. package/dist/packages/agent-runtime/src/screen-point.js +68 -0
  648. package/dist/packages/agent-runtime/src/screen-point.js.map +1 -0
  649. package/dist/packages/agent-runtime/src/send-recovery.cjs +128 -0
  650. package/dist/packages/agent-runtime/src/send-recovery.cjs.map +1 -0
  651. package/dist/packages/agent-runtime/src/send-recovery.js +128 -0
  652. package/dist/packages/agent-runtime/src/send-recovery.js.map +1 -0
  653. package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs +249 -0
  654. package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs.map +1 -0
  655. package/dist/packages/agent-runtime/src/statewire-attach-observer.js +249 -0
  656. package/dist/packages/agent-runtime/src/statewire-attach-observer.js.map +1 -0
  657. package/dist/packages/agent-runtime/src/statewire-state.cjs +16 -0
  658. package/dist/packages/agent-runtime/src/statewire-state.cjs.map +1 -0
  659. package/dist/packages/agent-runtime/src/statewire-state.js +16 -0
  660. package/dist/packages/agent-runtime/src/statewire-state.js.map +1 -0
  661. package/dist/packages/agent-runtime/src/statewire-suspended.cjs +41 -0
  662. package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +1 -0
  663. package/dist/packages/agent-runtime/src/statewire-suspended.js +41 -0
  664. package/dist/packages/agent-runtime/src/statewire-suspended.js.map +1 -0
  665. package/dist/packages/agent-runtime/src/statewire-transport.cjs +11 -0
  666. package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +1 -0
  667. package/dist/packages/agent-runtime/src/statewire-transport.js +11 -0
  668. package/dist/packages/agent-runtime/src/statewire-transport.js.map +1 -0
  669. package/dist/packages/agent-runtime/src/streaming-markdown.cjs +214 -0
  670. package/dist/packages/agent-runtime/src/streaming-markdown.cjs.map +1 -0
  671. package/dist/packages/agent-runtime/src/streaming-markdown.js +214 -0
  672. package/dist/packages/agent-runtime/src/streaming-markdown.js.map +1 -0
  673. package/dist/packages/agent-runtime/src/thread-extras.cjs +38 -0
  674. package/dist/packages/agent-runtime/src/thread-extras.cjs.map +1 -0
  675. package/dist/packages/agent-runtime/src/thread-extras.js +38 -0
  676. package/dist/packages/agent-runtime/src/thread-extras.js.map +1 -0
  677. package/dist/packages/agent-runtime/src/thread-handoff.cjs +85 -0
  678. package/dist/packages/agent-runtime/src/thread-handoff.cjs.map +1 -0
  679. package/dist/packages/agent-runtime/src/thread-handoff.js +85 -0
  680. package/dist/packages/agent-runtime/src/thread-handoff.js.map +1 -0
  681. package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs +90 -0
  682. package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -0
  683. package/dist/packages/agent-runtime/src/thread-snapshot-cache.js +90 -0
  684. package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +1 -0
  685. package/dist/packages/agent-runtime/src/thread-status.cjs +49 -0
  686. package/dist/packages/agent-runtime/src/thread-status.cjs.map +1 -0
  687. package/dist/packages/agent-runtime/src/thread-status.js +49 -0
  688. package/dist/packages/agent-runtime/src/thread-status.js.map +1 -0
  689. package/dist/packages/agent-runtime/src/tool-metadata.cjs +1794 -0
  690. package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +1 -0
  691. package/dist/packages/agent-runtime/src/tool-metadata.js +1794 -0
  692. package/dist/packages/agent-runtime/src/tool-metadata.js.map +1 -0
  693. package/dist/packages/agent-runtime/src/tool-outputs.cjs +46 -0
  694. package/dist/packages/agent-runtime/src/tool-outputs.cjs.map +1 -0
  695. package/dist/packages/agent-runtime/src/tool-outputs.js +46 -0
  696. package/dist/packages/agent-runtime/src/tool-outputs.js.map +1 -0
  697. package/dist/packages/agent-runtime/src/tool-result.cjs +151 -0
  698. package/dist/packages/agent-runtime/src/tool-result.cjs.map +1 -0
  699. package/dist/packages/agent-runtime/src/tool-result.js +151 -0
  700. package/dist/packages/agent-runtime/src/tool-result.js.map +1 -0
  701. package/dist/packages/agent-runtime/src/use-conversation-list.cjs +139 -0
  702. package/dist/packages/agent-runtime/src/use-conversation-list.cjs.map +1 -0
  703. package/dist/packages/agent-runtime/src/use-conversation-list.js +139 -0
  704. package/dist/packages/agent-runtime/src/use-conversation-list.js.map +1 -0
  705. package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs +14 -0
  706. package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
  707. package/dist/packages/agent-runtime/src/use-deep-agent-config.js +14 -0
  708. package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +1 -0
  709. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs +44 -0
  710. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -0
  711. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js +44 -0
  712. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -0
  713. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs +148 -0
  714. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -0
  715. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js +148 -0
  716. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +1 -0
  717. package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs +407 -0
  718. package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -0
  719. package/dist/packages/agent-runtime/src/use-deep-agent-thread.js +407 -0
  720. package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +1 -0
  721. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs +133 -0
  722. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -0
  723. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js +133 -0
  724. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -0
  725. package/dist/packages/agent-runtime/src/voice-presentation.cjs +37 -0
  726. package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +1 -0
  727. package/dist/packages/agent-runtime/src/voice-presentation.js +37 -0
  728. package/dist/packages/agent-runtime/src/voice-presentation.js.map +1 -0
  729. package/dist/packages/react/package.json.cjs +9 -0
  730. package/dist/packages/react/package.json.cjs.map +1 -0
  731. package/dist/packages/react/package.json.js +9 -0
  732. package/dist/packages/react/package.json.js.map +1 -0
  733. package/dist/{AthenaContext-B1QMhIP-.cjs → provider/AthenaContext.cjs} +5 -4
  734. package/dist/provider/AthenaContext.cjs.map +1 -0
  735. package/dist/{AthenaContext-MOslgOmE.js → provider/AthenaContext.js} +3 -3
  736. package/dist/provider/AthenaContext.js.map +1 -0
  737. package/dist/provider/AthenaProvider.cjs +404 -0
  738. package/dist/provider/AthenaProvider.cjs.map +1 -0
  739. package/dist/provider/AthenaProvider.js +404 -0
  740. package/dist/provider/AthenaProvider.js.map +1 -0
  741. package/dist/provider/PostHogProvider.cjs +81 -0
  742. package/dist/provider/PostHogProvider.cjs.map +1 -0
  743. package/dist/provider/PostHogProvider.js +59 -0
  744. package/dist/provider/PostHogProvider.js.map +1 -0
  745. package/dist/provider/config.d.ts +8 -7
  746. package/dist/provider/statewire-lifecycle-context.cjs +10 -0
  747. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -0
  748. package/dist/provider/statewire-lifecycle-context.js +10 -0
  749. package/dist/provider/statewire-lifecycle-context.js.map +1 -0
  750. package/dist/provider/statewire-window-context.cjs +10 -0
  751. package/dist/provider/statewire-window-context.cjs.map +1 -0
  752. package/dist/provider/statewire-window-context.js +10 -0
  753. package/dist/provider/statewire-window-context.js.map +1 -0
  754. package/dist/runtime/auth.cjs +309 -0
  755. package/dist/runtime/auth.cjs.map +1 -0
  756. package/dist/runtime/auth.d.ts +19 -18
  757. package/dist/runtime/auth.js +309 -0
  758. package/dist/runtime/auth.js.map +1 -0
  759. package/dist/runtime/statewire-auth-headers.cjs +18 -0
  760. package/dist/runtime/statewire-auth-headers.cjs.map +1 -0
  761. package/dist/runtime/statewire-auth-headers.js +18 -0
  762. package/dist/runtime/statewire-auth-headers.js.map +1 -0
  763. package/dist/runtime/statewire-lifecycle.cjs +68 -0
  764. package/dist/runtime/statewire-lifecycle.cjs.map +1 -0
  765. package/dist/runtime/statewire-lifecycle.js +68 -0
  766. package/dist/runtime/statewire-lifecycle.js.map +1 -0
  767. package/dist/runtime/statewire-run-config.cjs +68 -0
  768. package/dist/runtime/statewire-run-config.cjs.map +1 -0
  769. package/dist/runtime/statewire-run-config.js +68 -0
  770. package/dist/runtime/statewire-run-config.js.map +1 -0
  771. package/dist/runtime/statewire-session-key.cjs +11 -0
  772. package/dist/runtime/statewire-session-key.cjs.map +1 -0
  773. package/dist/runtime/statewire-session-key.js +11 -0
  774. package/dist/runtime/statewire-session-key.js.map +1 -0
  775. package/dist/runtime/useAthenaStatewireRuntime.cjs +180 -0
  776. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -0
  777. package/dist/runtime/useAthenaStatewireRuntime.js +181 -0
  778. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -0
  779. package/dist/styles.css +1 -1
  780. package/dist/theme/index.cjs +182 -0
  781. package/dist/theme/index.cjs.map +1 -0
  782. package/dist/theme/index.js +182 -0
  783. package/dist/theme/index.js.map +1 -0
  784. package/dist/threads/ThreadList.cjs +55 -0
  785. package/dist/threads/ThreadList.cjs.map +1 -0
  786. package/dist/threads/ThreadList.js +55 -0
  787. package/dist/threads/ThreadList.js.map +1 -0
  788. package/dist/threads/api.cjs +208 -0
  789. package/dist/threads/api.cjs.map +1 -0
  790. package/dist/threads/api.js +208 -0
  791. package/dist/threads/api.js.map +1 -0
  792. package/dist/threads/conversation-list-fetcher.cjs +74 -0
  793. package/dist/threads/conversation-list-fetcher.cjs.map +1 -0
  794. package/dist/threads/conversation-list-fetcher.js +74 -0
  795. package/dist/threads/conversation-list-fetcher.js.map +1 -0
  796. package/dist/threads/mint-thread-id.cjs +7 -0
  797. package/dist/threads/mint-thread-id.cjs.map +1 -0
  798. package/dist/threads/mint-thread-id.js +7 -0
  799. package/dist/threads/mint-thread-id.js.map +1 -0
  800. package/dist/threads/statewire-thread-list.cjs +232 -0
  801. package/dist/threads/statewire-thread-list.cjs.map +1 -0
  802. package/dist/threads/statewire-thread-list.js +232 -0
  803. package/dist/threads/statewire-thread-list.js.map +1 -0
  804. package/dist/threads/thread-id-context.cjs +22 -0
  805. package/dist/threads/thread-id-context.cjs.map +1 -0
  806. package/dist/threads/thread-id-context.d.ts +9 -0
  807. package/dist/threads/thread-id-context.js +22 -0
  808. package/dist/threads/thread-id-context.js.map +1 -0
  809. package/dist/threads/title.cjs +95 -0
  810. package/dist/threads/title.cjs.map +1 -0
  811. package/dist/threads/title.js +95 -0
  812. package/dist/threads/title.js.map +1 -0
  813. package/dist/threads/use-rest-conversation-history.cjs +80 -0
  814. package/dist/threads/use-rest-conversation-history.cjs.map +1 -0
  815. package/dist/threads/use-rest-conversation-history.js +80 -0
  816. package/dist/threads/use-rest-conversation-history.js.map +1 -0
  817. package/dist/threads/use-statewire-conversation-history.cjs +244 -0
  818. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -0
  819. package/dist/threads/use-statewire-conversation-history.d.ts +1 -0
  820. package/dist/threads/use-statewire-conversation-history.js +244 -0
  821. package/dist/threads/use-statewire-conversation-history.js.map +1 -0
  822. package/dist/threads/useAthenaThreadManager.cjs +24 -0
  823. package/dist/threads/useAthenaThreadManager.cjs.map +1 -0
  824. package/dist/threads/useAthenaThreadManager.js +24 -0
  825. package/dist/threads/useAthenaThreadManager.js.map +1 -0
  826. package/dist/toolkits/index.cjs +279 -0
  827. package/dist/toolkits/index.cjs.map +1 -0
  828. package/dist/toolkits/index.js +279 -0
  829. package/dist/toolkits/index.js.map +1 -0
  830. package/dist/tools/NestedPtcMessages.cjs +46 -0
  831. package/dist/tools/NestedPtcMessages.cjs.map +1 -0
  832. package/dist/tools/NestedPtcMessages.js +46 -0
  833. package/dist/tools/NestedPtcMessages.js.map +1 -0
  834. package/dist/tools/append-document-tool-ui.cjs +145 -0
  835. package/dist/tools/append-document-tool-ui.cjs.map +1 -0
  836. package/dist/tools/append-document-tool-ui.js +145 -0
  837. package/dist/tools/append-document-tool-ui.js.map +1 -0
  838. package/dist/tools/asset-utils.cjs +16 -0
  839. package/dist/tools/asset-utils.cjs.map +1 -0
  840. package/dist/tools/asset-utils.js +16 -0
  841. package/dist/tools/asset-utils.js.map +1 -0
  842. package/dist/tools/auto-open-tools.cjs +121 -0
  843. package/dist/tools/auto-open-tools.cjs.map +1 -0
  844. package/dist/tools/auto-open-tools.js +121 -0
  845. package/dist/tools/auto-open-tools.js.map +1 -0
  846. package/dist/tools/file-tool-uis.cjs +108 -0
  847. package/dist/tools/file-tool-uis.cjs.map +1 -0
  848. package/dist/tools/file-tool-uis.js +108 -0
  849. package/dist/tools/file-tool-uis.js.map +1 -0
  850. package/dist/tools/index.cjs +57 -0
  851. package/dist/tools/index.cjs.map +1 -0
  852. package/dist/tools/index.d.ts +1 -0
  853. package/dist/tools/index.js +57 -0
  854. package/dist/tools/index.js.map +1 -0
  855. package/dist/tools/misc-tool-uis.cjs +55 -0
  856. package/dist/tools/misc-tool-uis.cjs.map +1 -0
  857. package/dist/{misc-tool-uis-gAiQw0Yl.js → tools/misc-tool-uis.js} +18 -7
  858. package/dist/tools/misc-tool-uis.js.map +1 -0
  859. package/dist/tools/primitives.cjs +167 -0
  860. package/dist/tools/primitives.cjs.map +1 -0
  861. package/dist/tools/primitives.js +167 -0
  862. package/dist/tools/primitives.js.map +1 -0
  863. package/dist/tools/read-asset-tool-ui.cjs +284 -0
  864. package/dist/tools/read-asset-tool-ui.cjs.map +1 -0
  865. package/dist/tools/read-asset-tool-ui.js +284 -0
  866. package/dist/tools/read-asset-tool-ui.js.map +1 -0
  867. package/dist/tools/todo-plan-store.cjs +88 -0
  868. package/dist/tools/todo-plan-store.cjs.map +1 -0
  869. package/dist/tools/todo-plan-store.js +88 -0
  870. package/dist/tools/todo-plan-store.js.map +1 -0
  871. package/dist/tools/tool-fallback.cjs +668 -0
  872. package/dist/tools/tool-fallback.cjs.map +1 -0
  873. package/dist/tools/tool-fallback.js +668 -0
  874. package/dist/tools/tool-fallback.js.map +1 -0
  875. package/dist/tools/tool-icons.cjs +61 -0
  876. package/dist/tools/tool-icons.cjs.map +1 -0
  877. package/dist/tools/tool-icons.js +61 -0
  878. package/dist/tools/tool-icons.js.map +1 -0
  879. package/dist/tools/tool-uis.cjs +3049 -0
  880. package/dist/tools/tool-uis.cjs.map +1 -0
  881. package/dist/tools/tool-uis.js +3049 -0
  882. package/dist/tools/tool-uis.js.map +1 -0
  883. package/dist/tools/voice-update-tool-ui.cjs +90 -0
  884. package/dist/tools/voice-update-tool-ui.cjs.map +1 -0
  885. package/dist/tools/voice-update-tool-ui.d.ts +27 -0
  886. package/dist/tools/voice-update-tool-ui.js +90 -0
  887. package/dist/tools/voice-update-tool-ui.js.map +1 -0
  888. package/dist/tools/write-todos-tool-ui.cjs +270 -0
  889. package/dist/tools/write-todos-tool-ui.cjs.map +1 -0
  890. package/dist/tools/write-todos-tool-ui.js +270 -0
  891. package/dist/tools/write-todos-tool-ui.js.map +1 -0
  892. package/dist/ui/button.cjs +57 -0
  893. package/dist/ui/button.cjs.map +1 -0
  894. package/dist/ui/button.js +57 -0
  895. package/dist/ui/button.js.map +1 -0
  896. package/dist/ui/collapsible.cjs +17 -0
  897. package/dist/ui/collapsible.cjs.map +1 -0
  898. package/dist/ui/collapsible.js +17 -0
  899. package/dist/ui/collapsible.js.map +1 -0
  900. package/dist/ui/tooltip.cjs +48 -0
  901. package/dist/ui/tooltip.cjs.map +1 -0
  902. package/dist/ui/tooltip.js +48 -0
  903. package/dist/ui/tooltip.js.map +1 -0
  904. package/dist/version.cjs +6 -0
  905. package/dist/version.cjs.map +1 -0
  906. package/dist/version.js +6 -0
  907. package/dist/version.js.map +1 -0
  908. package/dist/voice/index.cjs +6 -0
  909. package/dist/voice/index.cjs.map +1 -0
  910. package/dist/voice/index.d.ts +2 -0
  911. package/dist/voice/index.js +6 -0
  912. package/dist/voice/index.js.map +1 -0
  913. package/dist/voice/use-athena-voice-session.cjs +315 -0
  914. package/dist/voice/use-athena-voice-session.cjs.map +1 -0
  915. package/dist/voice/use-athena-voice-session.d.ts +145 -0
  916. package/dist/voice/use-athena-voice-session.js +315 -0
  917. package/dist/voice/use-athena-voice-session.js.map +1 -0
  918. package/package.json +32 -20
  919. package/dist/AthenaAuthContext-B3AwLA5Z.cjs.map +0 -1
  920. package/dist/AthenaAuthContext-DQsdayH2.js.map +0 -1
  921. package/dist/AthenaContext-B1QMhIP-.cjs.map +0 -1
  922. package/dist/AthenaContext-MOslgOmE.js.map +0 -1
  923. package/dist/SuperGroupingCard-BsWbHyV_.js +0 -795
  924. package/dist/SuperGroupingCard-BsWbHyV_.js.map +0 -1
  925. package/dist/SuperGroupingCard-CRRFUgjN.cjs +0 -794
  926. package/dist/SuperGroupingCard-CRRFUgjN.cjs.map +0 -1
  927. package/dist/auth.cjs.map +0 -1
  928. package/dist/auth.js.map +0 -1
  929. package/dist/chat/ComposerEditorContext.d.ts +0 -36
  930. package/dist/chat/tiptap-composer.d.ts +0 -7
  931. package/dist/chat-ui-statewire.cjs +0 -25
  932. package/dist/chat-ui-statewire.cjs.map +0 -1
  933. package/dist/chat-ui-statewire.js +0 -25
  934. package/dist/chat-ui-statewire.js.map +0 -1
  935. package/dist/chat-ui.cjs +0 -2484
  936. package/dist/chat-ui.cjs.map +0 -1
  937. package/dist/chat-ui.js +0 -2486
  938. package/dist/chat-ui.js.map +0 -1
  939. package/dist/collab.cjs.map +0 -1
  940. package/dist/collab.js.map +0 -1
  941. package/dist/mentions/composer-keybinds.d.ts +0 -5
  942. package/dist/mentions/mention-extension.d.ts +0 -6
  943. package/dist/mentions/mention-icons.d.ts +0 -4
  944. package/dist/mentions/mention-node-view.d.ts +0 -2
  945. package/dist/mentions/mention-suggestion-list.d.ts +0 -14
  946. package/dist/mentions/mention-suggestion-popup.d.ts +0 -15
  947. package/dist/mentions/mention-suggestions-extension.d.ts +0 -11
  948. package/dist/mentions/mention-types.d.ts +0 -21
  949. package/dist/mentions/mention-utils.d.ts +0 -23
  950. package/dist/mentions/use-mention-suggestions.d.ts +0 -29
  951. package/dist/misc-tool-uis-B2e0Okkn.cjs +0 -43
  952. package/dist/misc-tool-uis-B2e0Okkn.cjs.map +0 -1
  953. package/dist/misc-tool-uis-gAiQw0Yl.js.map +0 -1
  954. package/dist/statewire-continue-run-D34gS7_1.js.map +0 -1
  955. package/dist/statewire-continue-run-nE9VCKUh.cjs.map +0 -1
  956. package/dist/statewire-history-edge-C8uyTEjX.cjs +0 -1711
  957. package/dist/statewire-history-edge-C8uyTEjX.cjs.map +0 -1
  958. package/dist/statewire-history-edge-CPohUKMt.js +0 -1712
  959. package/dist/statewire-history-edge-CPohUKMt.js.map +0 -1
  960. package/dist/super-grouping.cjs +0 -22
  961. package/dist/super-grouping.cjs.map +0 -1
  962. package/dist/super-grouping.js +0 -22
  963. package/dist/super-grouping.js.map +0 -1
  964. package/dist/tool-fallback-DkQ3DLkn.js +0 -4281
  965. package/dist/tool-fallback-DkQ3DLkn.js.map +0 -1
  966. package/dist/tool-fallback-kfhpJQZa.cjs +0 -4297
  967. package/dist/tool-fallback-kfhpJQZa.cjs.map +0 -1
  968. package/dist/tools.cjs +0 -41
  969. package/dist/tools.cjs.map +0 -1
  970. package/dist/tools.js +0 -41
  971. package/dist/tools.js.map +0 -1
  972. package/dist/trash-2-B5OaNAL7.cjs +0 -5096
  973. package/dist/trash-2-B5OaNAL7.cjs.map +0 -1
  974. package/dist/trash-2-CCwSURL-.js +0 -5081
  975. package/dist/trash-2-CCwSURL-.js.map +0 -1
  976. package/dist/use-rest-conversation-history-Cm8qMRxp.cjs +0 -32397
  977. package/dist/use-rest-conversation-history-Cm8qMRxp.cjs.map +0 -1
  978. package/dist/use-rest-conversation-history-veDZS-oL.js +0 -32361
  979. package/dist/use-rest-conversation-history-veDZS-oL.js.map +0 -1
  980. package/dist/wrench-BEf72cyP.cjs +0 -417
  981. package/dist/wrench-BEf72cyP.cjs.map +0 -1
  982. package/dist/wrench-CbrOlVYm.js +0 -418
  983. package/dist/wrench-CbrOlVYm.js.map +0 -1
  984. package/dist/x-Dfd2NzK0.cjs +0 -42
  985. package/dist/x-Dfd2NzK0.cjs.map +0 -1
  986. package/dist/x-_DntAa_a.js +0 -43
  987. package/dist/x-_DntAa_a.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-messages.cjs","sources":["../../../../../agent-runtime/src/runtime-messages.ts"],"sourcesContent":["/**\n * Typed runtime messages — the one description of \"the runtime ended this run\"\n * that every chat surface renders from.\n *\n * The deep-agent backend records how a run ended in two shapes that ride\n * ordinary `ai` messages (a new LangChain message type would crash the shipped\n * converter, whose convertible set is closed):\n *\n * - a **run-lifecycle marker** (`athena_run_marker`: `cancelled` / `failed`,\n * plus `athena_run_marker_source`) — see {@link readRunMarkerFromSourceMessages};\n * - a **handoff message** (`athena_handoff: true`) — the closing summary the\n * runtime asked the model to write when a guard or the step budget ended the\n * run, instead of fabricating an internal sentence.\n *\n * Both now carry the canonical `athena_termination_reason`\n * (`agora/graphs/athena_deep_agent/termination.py`). This module reads all of\n * that into one {@link AthenaRuntimeMessage} so Olympus, mobile, the Chrome\n * extension, and the Office add-in agree on kind, severity, copy, and the\n * sole-vs-grouped distinction — the last of which is load-bearing: a marker\n * appended after the assistant's own work is chunked into that message, and\n * replacing the whole row would hide completed prose and tool cards.\n */\n\nimport { getExternalStoreMessages } from '@assistant-ui/core';\nimport type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport {\n ATHENA_HANDOFF_KEY,\n ATHENA_RUN_MARKER_CANCELLED,\n ATHENA_RUN_MARKER_FAILED,\n ATHENA_RUN_MARKER_KEY,\n ATHENA_RUN_MARKER_SOURCE_KEY,\n ATHENA_STOP_SOURCE_SEND_NOW,\n ATHENA_TERMINATION_REASON_KEY,\n isServerUpdateStopSource,\n} from './messages';\n\n/** The backend's canonical reason vocabulary (`KNOWN_TERMINATION_REASONS`). */\nexport const TERMINATION_REASONS = [\n 'completed',\n 'user_stop',\n 'send_now',\n 'voice_steer',\n 'transport_cancel',\n 'pod_drain',\n 'fence_lost',\n 'instance_closed',\n 'unattributed_stop',\n 'recursion_limit',\n 'step_budget',\n 'duplicate_call_guard',\n 'synthetic_stop',\n 'ended_after_tools',\n 'error',\n 'model_refusal',\n 'abandoned',\n] as const;\n\nexport type AthenaTerminationReason = (typeof TERMINATION_REASONS)[number];\n\n/**\n * How a runtime ending renders:\n * - `stopped` — a cancellation the user (or a client action) asked for;\n * - `paused` — a pod-drain pause; the run resumes from its checkpoint;\n * - `failed` — the graph raised, hit the recursion limit, or was abandoned;\n * - `handoff` — the runtime ended the run and the model wrote a closing\n * summary (the message text), which renders as prose under a banner.\n */\nexport type AthenaRuntimeMessageKind = 'stopped' | 'paused' | 'failed' | 'handoff';\n\nexport type AthenaRuntimeMessageSeverity = 'info' | 'warning' | 'error';\n\nexport interface TerminationDescription {\n /** Short label for the banner / status row. */\n title: string;\n /** One sentence of reason-specific explanation, when it adds information. */\n detail: string | undefined;\n}\n\nexport interface AthenaRuntimeMessage {\n kind: AthenaRuntimeMessageKind;\n /** Canonical reason (may be a value newer than this client knows). */\n reason: string | undefined;\n severity: AthenaRuntimeMessageSeverity;\n title: string;\n detail: string | undefined;\n /** The message's own text: a marker's backend copy, or the handoff summary. */\n text: string | undefined;\n /**\n * A `send_now` promotion cancels the live run as plumbing, not as a\n * user-visible stop: keep it in the data, paint nothing.\n */\n silent: boolean;\n /**\n * True when the runtime message is the ONLY source message behind this\n * thread message (it owns the whole row). False when the chunk also holds\n * the assistant's own work, which must keep rendering.\n */\n isSoleSourceMessage: boolean;\n}\n\nconst MAX_STEPS_HINT = 'Raise “Max steps” in the agent settings for longer runs.';\n\n/**\n * Copy for a runtime ending. Reasons this client does not know fall back to\n * the kind's generic title, so a newer backend never renders as an empty row.\n */\nexport function describeTerminationReason(\n kind: AthenaRuntimeMessageKind,\n reason: string | undefined\n): TerminationDescription {\n switch (kind) {\n case 'paused':\n return {\n title: 'Paused by a server update',\n detail: 'Progress up to this point is saved — send a message to continue.',\n };\n case 'stopped':\n switch (reason) {\n case 'voice_steer':\n return {\n title: 'Redirected by a spoken follow-up',\n detail:\n 'The voice conversation changed the request; the work continues with the new instructions.',\n };\n case 'transport_cancel':\n return {\n title: 'Run cancelled',\n detail:\n 'Cancelled by a page reload, navigation, or closed view — not an explicit Stop. Send a follow-up to continue.',\n };\n case 'fence_lost':\n return {\n title: 'Run superseded',\n detail: 'Another activation took over this thread.',\n };\n case 'instance_closed':\n return {\n title: 'Run stopped',\n detail: 'The client that started it went away.',\n };\n default:\n return { title: 'Conversation stopped', detail: undefined };\n }\n case 'failed':\n switch (reason) {\n case 'recursion_limit':\n return {\n title: 'Step limit reached',\n detail: `The run was stopped before finishing; the work so far is saved. ${MAX_STEPS_HINT}`,\n };\n case 'abandoned':\n return {\n title: 'Run stopped unexpectedly',\n detail:\n 'The server handling it went away mid-run (a crash, restart, or deploy). The work so far is saved.',\n };\n default:\n return { title: 'Run failed', detail: undefined };\n }\n case 'handoff':\n switch (reason) {\n case 'duplicate_call_guard':\n return {\n title: 'Run ended by the runtime',\n detail:\n 'The same tool calls were repeating with identical arguments and no new progress, so the agent was asked to wrap up.',\n };\n case 'step_budget':\n return {\n title: 'Run ended by the runtime',\n detail: `The step budget ran out, so the agent was asked to wrap up. ${MAX_STEPS_HINT}`,\n };\n default:\n return {\n title: 'Run ended by the runtime',\n detail: 'The agent was asked to wrap up.',\n };\n }\n }\n}\n\nconst SEVERITY: Record<AthenaRuntimeMessageKind, AthenaRuntimeMessageSeverity> = {\n stopped: 'info',\n paused: 'info',\n failed: 'error',\n handoff: 'warning',\n};\n\ntype Kwargs = Record<string, unknown> | undefined;\n\nfunction metadataOf(kwargs: Kwargs): Record<string, unknown> | undefined {\n const metadata = kwargs?.metadata;\n return typeof metadata === 'object' && metadata !== null\n ? (metadata as Record<string, unknown>)\n : undefined;\n}\n\n/** The termination reason stamped on `additional_kwargs` (top-level or mirror). */\nexport function readTerminationReason(kwargs: Kwargs): string | undefined {\n const top = kwargs?.[ATHENA_TERMINATION_REASON_KEY];\n if (typeof top === 'string') return top;\n const mirrored = metadataOf(kwargs)?.[ATHENA_TERMINATION_REASON_KEY];\n return typeof mirrored === 'string' ? mirrored : undefined;\n}\n\nfunction readHandoff(kwargs: Kwargs): boolean {\n return kwargs?.[ATHENA_HANDOFF_KEY] === true || metadataOf(kwargs)?.[ATHENA_HANDOFF_KEY] === true;\n}\n\nfunction textOf(content: unknown): string | undefined {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return undefined;\n const texts = content\n .map((block) =>\n typeof block === 'string'\n ? block\n : block && typeof block === 'object' && (block as { type?: unknown }).type === 'text'\n ? (block as { text?: unknown }).text\n : undefined\n )\n .filter((text): text is string => typeof text === 'string' && text.length > 0);\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\nfunction fromMarker(\n marker: string,\n source: string | undefined,\n reason: string | undefined\n): Pick<AthenaRuntimeMessage, 'kind' | 'reason' | 'silent'> | undefined {\n if (marker === ATHENA_RUN_MARKER_CANCELLED) {\n const kind: AthenaRuntimeMessageKind = isServerUpdateStopSource(source) ? 'paused' : 'stopped';\n return {\n kind,\n reason: reason ?? (source === 'unattributed' ? 'unattributed_stop' : source),\n silent: source === ATHENA_STOP_SOURCE_SEND_NOW,\n };\n }\n if (marker === ATHENA_RUN_MARKER_FAILED) {\n return { kind: 'failed', reason: reason ?? 'error', silent: false };\n }\n return undefined;\n}\n\nfunction build(\n partial: Pick<AthenaRuntimeMessage, 'kind' | 'reason' | 'silent'>,\n text: string | undefined,\n isSoleSourceMessage: boolean\n): AthenaRuntimeMessage {\n const description = describeTerminationReason(partial.kind, partial.reason);\n return {\n kind: partial.kind,\n reason: partial.reason,\n severity: SEVERITY[partial.kind],\n title: description.title,\n detail: description.detail,\n text,\n silent: partial.silent,\n isSoleSourceMessage,\n };\n}\n\n/**\n * Read the runtime ending behind a thread message, from its bound source\n * messages first (a marker or handoff chunked after the assistant's own turn\n * is never the first source, so the joined `metadata.custom` would miss it —\n * see {@link readRunMarkerFromSourceMessages}), then from joined metadata for\n * surfaces without bound sources.\n */\nexport function readRuntimeMessageFromSourceMessages(\n message: Parameters<typeof getExternalStoreMessages>[0] & {\n metadata?: { custom?: Record<string, unknown> | undefined } | undefined;\n content?: unknown;\n }\n): AthenaRuntimeMessage | undefined {\n const sources = getExternalStoreMessages<LangChainMessage>(message);\n for (const source of sources) {\n if (source?.type !== 'ai') continue;\n const kwargs = source.additional_kwargs as Kwargs;\n const marker = kwargs?.[ATHENA_RUN_MARKER_KEY];\n const reason = readTerminationReason(kwargs);\n const text = textOf(source.content);\n if (typeof marker === 'string') {\n const markerSource = kwargs?.[ATHENA_RUN_MARKER_SOURCE_KEY];\n const partial = fromMarker(\n marker,\n typeof markerSource === 'string' ? markerSource : undefined,\n reason\n );\n if (partial) return build(partial, text, sources.length === 1);\n }\n if (readHandoff(kwargs)) {\n return build({ kind: 'handoff', reason, silent: false }, text, sources.length === 1);\n }\n }\n const custom = message.metadata?.custom;\n if (!custom) return undefined;\n const parts = message.content;\n const sole = Array.isArray(parts) ? parts.length <= 1 : true;\n const joinedMarker = custom[ATHENA_RUN_MARKER_KEY];\n const joinedReason = readTerminationReason({ metadata: custom });\n if (typeof joinedMarker === 'string') {\n const joinedSource = custom[ATHENA_RUN_MARKER_SOURCE_KEY];\n const partial = fromMarker(\n joinedMarker,\n typeof joinedSource === 'string' ? joinedSource : undefined,\n joinedReason\n );\n if (partial) return build(partial, undefined, sole);\n }\n if (custom[ATHENA_HANDOFF_KEY] === true) {\n return build({ kind: 'handoff', reason: joinedReason, silent: false }, undefined, sole);\n }\n return undefined;\n}\n\n/**\n * The backend marker copy worth showing under a runtime card, or `undefined`.\n *\n * A failure marker's text carries the specific error (\"The run failed:\n * provider returned 502\"), so it is shown when no reason-specific detail\n * exists. Stop/pause copy only restates the title, and a handoff's text is the\n * message body itself, so neither is repeated. Marker copy leads with an emoji\n * for raw-transcript readers; the card's icon plays that role, so it is\n * stripped. Shared by every presenter so mobile and DOM cannot drift.\n */\nexport function runtimeMessageMarkerText(message: AthenaRuntimeMessage): string | undefined {\n if (message.kind !== 'failed' || message.detail) return undefined;\n const text = message.text?.replace(/^(?:⏹️|⏸️|⚠️|\\s)+/u, '').trim();\n if (!text || text === message.title) return undefined;\n return text;\n}\n\n/**\n * The runtime message's kind when it owns the whole row, else `undefined`.\n *\n * Returns a primitive so it is safe as a `useAuiState` selector (the reader\n * above builds a fresh object per call; an object snapshot would loop the\n * render under `Object.is` comparison).\n */\nexport function readSoleRuntimeMessageKind(\n message: Parameters<typeof readRuntimeMessageFromSourceMessages>[0]\n): AthenaRuntimeMessageKind | undefined {\n const found = readRuntimeMessageFromSourceMessages(message);\n return found?.isSoleSourceMessage ? found.kind : undefined;\n}\n"],"names":["ATHENA_TERMINATION_REASON_KEY","ATHENA_HANDOFF_KEY","ATHENA_RUN_MARKER_CANCELLED","isServerUpdateStopSource","ATHENA_STOP_SOURCE_SEND_NOW","ATHENA_RUN_MARKER_FAILED","getExternalStoreMessages","ATHENA_RUN_MARKER_KEY","ATHENA_RUN_MARKER_SOURCE_KEY"],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import { getExternalStoreMessages } from "@assistant-ui/core";
2
+ import { ATHENA_RUN_MARKER_KEY, ATHENA_RUN_MARKER_SOURCE_KEY, ATHENA_HANDOFF_KEY, ATHENA_TERMINATION_REASON_KEY, ATHENA_RUN_MARKER_CANCELLED, ATHENA_STOP_SOURCE_SEND_NOW, ATHENA_RUN_MARKER_FAILED, isServerUpdateStopSource } from "./messages.js";
3
+ const MAX_STEPS_HINT = "Raise “Max steps” in the agent settings for longer runs.";
4
+ function describeTerminationReason(kind, reason) {
5
+ switch (kind) {
6
+ case "paused":
7
+ return {
8
+ title: "Paused by a server update",
9
+ detail: "Progress up to this point is saved — send a message to continue."
10
+ };
11
+ case "stopped":
12
+ switch (reason) {
13
+ case "voice_steer":
14
+ return {
15
+ title: "Redirected by a spoken follow-up",
16
+ detail: "The voice conversation changed the request; the work continues with the new instructions."
17
+ };
18
+ case "transport_cancel":
19
+ return {
20
+ title: "Run cancelled",
21
+ detail: "Cancelled by a page reload, navigation, or closed view — not an explicit Stop. Send a follow-up to continue."
22
+ };
23
+ case "fence_lost":
24
+ return {
25
+ title: "Run superseded",
26
+ detail: "Another activation took over this thread."
27
+ };
28
+ case "instance_closed":
29
+ return {
30
+ title: "Run stopped",
31
+ detail: "The client that started it went away."
32
+ };
33
+ default:
34
+ return { title: "Conversation stopped", detail: void 0 };
35
+ }
36
+ case "failed":
37
+ switch (reason) {
38
+ case "recursion_limit":
39
+ return {
40
+ title: "Step limit reached",
41
+ detail: `The run was stopped before finishing; the work so far is saved. ${MAX_STEPS_HINT}`
42
+ };
43
+ case "abandoned":
44
+ return {
45
+ title: "Run stopped unexpectedly",
46
+ detail: "The server handling it went away mid-run (a crash, restart, or deploy). The work so far is saved."
47
+ };
48
+ default:
49
+ return { title: "Run failed", detail: void 0 };
50
+ }
51
+ case "handoff":
52
+ switch (reason) {
53
+ case "duplicate_call_guard":
54
+ return {
55
+ title: "Run ended by the runtime",
56
+ detail: "The same tool calls were repeating with identical arguments and no new progress, so the agent was asked to wrap up."
57
+ };
58
+ case "step_budget":
59
+ return {
60
+ title: "Run ended by the runtime",
61
+ detail: `The step budget ran out, so the agent was asked to wrap up. ${MAX_STEPS_HINT}`
62
+ };
63
+ default:
64
+ return {
65
+ title: "Run ended by the runtime",
66
+ detail: "The agent was asked to wrap up."
67
+ };
68
+ }
69
+ }
70
+ }
71
+ const SEVERITY = {
72
+ stopped: "info",
73
+ paused: "info",
74
+ failed: "error",
75
+ handoff: "warning"
76
+ };
77
+ function metadataOf(kwargs) {
78
+ const metadata = kwargs == null ? void 0 : kwargs.metadata;
79
+ return typeof metadata === "object" && metadata !== null ? metadata : void 0;
80
+ }
81
+ function readTerminationReason(kwargs) {
82
+ var _a;
83
+ const top = kwargs == null ? void 0 : kwargs[ATHENA_TERMINATION_REASON_KEY];
84
+ if (typeof top === "string") return top;
85
+ const mirrored = (_a = metadataOf(kwargs)) == null ? void 0 : _a[ATHENA_TERMINATION_REASON_KEY];
86
+ return typeof mirrored === "string" ? mirrored : void 0;
87
+ }
88
+ function readHandoff(kwargs) {
89
+ var _a;
90
+ return (kwargs == null ? void 0 : kwargs[ATHENA_HANDOFF_KEY]) === true || ((_a = metadataOf(kwargs)) == null ? void 0 : _a[ATHENA_HANDOFF_KEY]) === true;
91
+ }
92
+ function textOf(content) {
93
+ if (typeof content === "string") return content;
94
+ if (!Array.isArray(content)) return void 0;
95
+ const texts = content.map(
96
+ (block) => typeof block === "string" ? block : block && typeof block === "object" && block.type === "text" ? block.text : void 0
97
+ ).filter((text) => typeof text === "string" && text.length > 0);
98
+ return texts.length > 0 ? texts.join("\n") : void 0;
99
+ }
100
+ function fromMarker(marker, source, reason) {
101
+ if (marker === ATHENA_RUN_MARKER_CANCELLED) {
102
+ const kind = isServerUpdateStopSource(source) ? "paused" : "stopped";
103
+ return {
104
+ kind,
105
+ reason: reason ?? (source === "unattributed" ? "unattributed_stop" : source),
106
+ silent: source === ATHENA_STOP_SOURCE_SEND_NOW
107
+ };
108
+ }
109
+ if (marker === ATHENA_RUN_MARKER_FAILED) {
110
+ return { kind: "failed", reason: reason ?? "error", silent: false };
111
+ }
112
+ return void 0;
113
+ }
114
+ function build(partial, text, isSoleSourceMessage) {
115
+ const description = describeTerminationReason(partial.kind, partial.reason);
116
+ return {
117
+ kind: partial.kind,
118
+ reason: partial.reason,
119
+ severity: SEVERITY[partial.kind],
120
+ title: description.title,
121
+ detail: description.detail,
122
+ text,
123
+ silent: partial.silent,
124
+ isSoleSourceMessage
125
+ };
126
+ }
127
+ function readRuntimeMessageFromSourceMessages(message) {
128
+ var _a;
129
+ const sources = getExternalStoreMessages(message);
130
+ for (const source of sources) {
131
+ if ((source == null ? void 0 : source.type) !== "ai") continue;
132
+ const kwargs = source.additional_kwargs;
133
+ const marker = kwargs == null ? void 0 : kwargs[ATHENA_RUN_MARKER_KEY];
134
+ const reason = readTerminationReason(kwargs);
135
+ const text = textOf(source.content);
136
+ if (typeof marker === "string") {
137
+ const markerSource = kwargs == null ? void 0 : kwargs[ATHENA_RUN_MARKER_SOURCE_KEY];
138
+ const partial = fromMarker(
139
+ marker,
140
+ typeof markerSource === "string" ? markerSource : void 0,
141
+ reason
142
+ );
143
+ if (partial) return build(partial, text, sources.length === 1);
144
+ }
145
+ if (readHandoff(kwargs)) {
146
+ return build({ kind: "handoff", reason, silent: false }, text, sources.length === 1);
147
+ }
148
+ }
149
+ const custom = (_a = message.metadata) == null ? void 0 : _a.custom;
150
+ if (!custom) return void 0;
151
+ const parts = message.content;
152
+ const sole = Array.isArray(parts) ? parts.length <= 1 : true;
153
+ const joinedMarker = custom[ATHENA_RUN_MARKER_KEY];
154
+ const joinedReason = readTerminationReason({ metadata: custom });
155
+ if (typeof joinedMarker === "string") {
156
+ const joinedSource = custom[ATHENA_RUN_MARKER_SOURCE_KEY];
157
+ const partial = fromMarker(
158
+ joinedMarker,
159
+ typeof joinedSource === "string" ? joinedSource : void 0,
160
+ joinedReason
161
+ );
162
+ if (partial) return build(partial, void 0, sole);
163
+ }
164
+ if (custom[ATHENA_HANDOFF_KEY] === true) {
165
+ return build({ kind: "handoff", reason: joinedReason, silent: false }, void 0, sole);
166
+ }
167
+ return void 0;
168
+ }
169
+ function runtimeMessageMarkerText(message) {
170
+ var _a;
171
+ if (message.kind !== "failed" || message.detail) return void 0;
172
+ const text = (_a = message.text) == null ? void 0 : _a.replace(/^(?:⏹️|⏸️|⚠️|\s)+/u, "").trim();
173
+ if (!text || text === message.title) return void 0;
174
+ return text;
175
+ }
176
+ function readSoleRuntimeMessageKind(message) {
177
+ const found = readRuntimeMessageFromSourceMessages(message);
178
+ return (found == null ? void 0 : found.isSoleSourceMessage) ? found.kind : void 0;
179
+ }
180
+ export {
181
+ describeTerminationReason,
182
+ readRuntimeMessageFromSourceMessages,
183
+ readSoleRuntimeMessageKind,
184
+ readTerminationReason,
185
+ runtimeMessageMarkerText
186
+ };
187
+ //# sourceMappingURL=runtime-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-messages.js","sources":["../../../../../agent-runtime/src/runtime-messages.ts"],"sourcesContent":["/**\n * Typed runtime messages — the one description of \"the runtime ended this run\"\n * that every chat surface renders from.\n *\n * The deep-agent backend records how a run ended in two shapes that ride\n * ordinary `ai` messages (a new LangChain message type would crash the shipped\n * converter, whose convertible set is closed):\n *\n * - a **run-lifecycle marker** (`athena_run_marker`: `cancelled` / `failed`,\n * plus `athena_run_marker_source`) — see {@link readRunMarkerFromSourceMessages};\n * - a **handoff message** (`athena_handoff: true`) — the closing summary the\n * runtime asked the model to write when a guard or the step budget ended the\n * run, instead of fabricating an internal sentence.\n *\n * Both now carry the canonical `athena_termination_reason`\n * (`agora/graphs/athena_deep_agent/termination.py`). This module reads all of\n * that into one {@link AthenaRuntimeMessage} so Olympus, mobile, the Chrome\n * extension, and the Office add-in agree on kind, severity, copy, and the\n * sole-vs-grouped distinction — the last of which is load-bearing: a marker\n * appended after the assistant's own work is chunked into that message, and\n * replacing the whole row would hide completed prose and tool cards.\n */\n\nimport { getExternalStoreMessages } from '@assistant-ui/core';\nimport type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport {\n ATHENA_HANDOFF_KEY,\n ATHENA_RUN_MARKER_CANCELLED,\n ATHENA_RUN_MARKER_FAILED,\n ATHENA_RUN_MARKER_KEY,\n ATHENA_RUN_MARKER_SOURCE_KEY,\n ATHENA_STOP_SOURCE_SEND_NOW,\n ATHENA_TERMINATION_REASON_KEY,\n isServerUpdateStopSource,\n} from './messages';\n\n/** The backend's canonical reason vocabulary (`KNOWN_TERMINATION_REASONS`). */\nexport const TERMINATION_REASONS = [\n 'completed',\n 'user_stop',\n 'send_now',\n 'voice_steer',\n 'transport_cancel',\n 'pod_drain',\n 'fence_lost',\n 'instance_closed',\n 'unattributed_stop',\n 'recursion_limit',\n 'step_budget',\n 'duplicate_call_guard',\n 'synthetic_stop',\n 'ended_after_tools',\n 'error',\n 'model_refusal',\n 'abandoned',\n] as const;\n\nexport type AthenaTerminationReason = (typeof TERMINATION_REASONS)[number];\n\n/**\n * How a runtime ending renders:\n * - `stopped` — a cancellation the user (or a client action) asked for;\n * - `paused` — a pod-drain pause; the run resumes from its checkpoint;\n * - `failed` — the graph raised, hit the recursion limit, or was abandoned;\n * - `handoff` — the runtime ended the run and the model wrote a closing\n * summary (the message text), which renders as prose under a banner.\n */\nexport type AthenaRuntimeMessageKind = 'stopped' | 'paused' | 'failed' | 'handoff';\n\nexport type AthenaRuntimeMessageSeverity = 'info' | 'warning' | 'error';\n\nexport interface TerminationDescription {\n /** Short label for the banner / status row. */\n title: string;\n /** One sentence of reason-specific explanation, when it adds information. */\n detail: string | undefined;\n}\n\nexport interface AthenaRuntimeMessage {\n kind: AthenaRuntimeMessageKind;\n /** Canonical reason (may be a value newer than this client knows). */\n reason: string | undefined;\n severity: AthenaRuntimeMessageSeverity;\n title: string;\n detail: string | undefined;\n /** The message's own text: a marker's backend copy, or the handoff summary. */\n text: string | undefined;\n /**\n * A `send_now` promotion cancels the live run as plumbing, not as a\n * user-visible stop: keep it in the data, paint nothing.\n */\n silent: boolean;\n /**\n * True when the runtime message is the ONLY source message behind this\n * thread message (it owns the whole row). False when the chunk also holds\n * the assistant's own work, which must keep rendering.\n */\n isSoleSourceMessage: boolean;\n}\n\nconst MAX_STEPS_HINT = 'Raise “Max steps” in the agent settings for longer runs.';\n\n/**\n * Copy for a runtime ending. Reasons this client does not know fall back to\n * the kind's generic title, so a newer backend never renders as an empty row.\n */\nexport function describeTerminationReason(\n kind: AthenaRuntimeMessageKind,\n reason: string | undefined\n): TerminationDescription {\n switch (kind) {\n case 'paused':\n return {\n title: 'Paused by a server update',\n detail: 'Progress up to this point is saved — send a message to continue.',\n };\n case 'stopped':\n switch (reason) {\n case 'voice_steer':\n return {\n title: 'Redirected by a spoken follow-up',\n detail:\n 'The voice conversation changed the request; the work continues with the new instructions.',\n };\n case 'transport_cancel':\n return {\n title: 'Run cancelled',\n detail:\n 'Cancelled by a page reload, navigation, or closed view — not an explicit Stop. Send a follow-up to continue.',\n };\n case 'fence_lost':\n return {\n title: 'Run superseded',\n detail: 'Another activation took over this thread.',\n };\n case 'instance_closed':\n return {\n title: 'Run stopped',\n detail: 'The client that started it went away.',\n };\n default:\n return { title: 'Conversation stopped', detail: undefined };\n }\n case 'failed':\n switch (reason) {\n case 'recursion_limit':\n return {\n title: 'Step limit reached',\n detail: `The run was stopped before finishing; the work so far is saved. ${MAX_STEPS_HINT}`,\n };\n case 'abandoned':\n return {\n title: 'Run stopped unexpectedly',\n detail:\n 'The server handling it went away mid-run (a crash, restart, or deploy). The work so far is saved.',\n };\n default:\n return { title: 'Run failed', detail: undefined };\n }\n case 'handoff':\n switch (reason) {\n case 'duplicate_call_guard':\n return {\n title: 'Run ended by the runtime',\n detail:\n 'The same tool calls were repeating with identical arguments and no new progress, so the agent was asked to wrap up.',\n };\n case 'step_budget':\n return {\n title: 'Run ended by the runtime',\n detail: `The step budget ran out, so the agent was asked to wrap up. ${MAX_STEPS_HINT}`,\n };\n default:\n return {\n title: 'Run ended by the runtime',\n detail: 'The agent was asked to wrap up.',\n };\n }\n }\n}\n\nconst SEVERITY: Record<AthenaRuntimeMessageKind, AthenaRuntimeMessageSeverity> = {\n stopped: 'info',\n paused: 'info',\n failed: 'error',\n handoff: 'warning',\n};\n\ntype Kwargs = Record<string, unknown> | undefined;\n\nfunction metadataOf(kwargs: Kwargs): Record<string, unknown> | undefined {\n const metadata = kwargs?.metadata;\n return typeof metadata === 'object' && metadata !== null\n ? (metadata as Record<string, unknown>)\n : undefined;\n}\n\n/** The termination reason stamped on `additional_kwargs` (top-level or mirror). */\nexport function readTerminationReason(kwargs: Kwargs): string | undefined {\n const top = kwargs?.[ATHENA_TERMINATION_REASON_KEY];\n if (typeof top === 'string') return top;\n const mirrored = metadataOf(kwargs)?.[ATHENA_TERMINATION_REASON_KEY];\n return typeof mirrored === 'string' ? mirrored : undefined;\n}\n\nfunction readHandoff(kwargs: Kwargs): boolean {\n return kwargs?.[ATHENA_HANDOFF_KEY] === true || metadataOf(kwargs)?.[ATHENA_HANDOFF_KEY] === true;\n}\n\nfunction textOf(content: unknown): string | undefined {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return undefined;\n const texts = content\n .map((block) =>\n typeof block === 'string'\n ? block\n : block && typeof block === 'object' && (block as { type?: unknown }).type === 'text'\n ? (block as { text?: unknown }).text\n : undefined\n )\n .filter((text): text is string => typeof text === 'string' && text.length > 0);\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\nfunction fromMarker(\n marker: string,\n source: string | undefined,\n reason: string | undefined\n): Pick<AthenaRuntimeMessage, 'kind' | 'reason' | 'silent'> | undefined {\n if (marker === ATHENA_RUN_MARKER_CANCELLED) {\n const kind: AthenaRuntimeMessageKind = isServerUpdateStopSource(source) ? 'paused' : 'stopped';\n return {\n kind,\n reason: reason ?? (source === 'unattributed' ? 'unattributed_stop' : source),\n silent: source === ATHENA_STOP_SOURCE_SEND_NOW,\n };\n }\n if (marker === ATHENA_RUN_MARKER_FAILED) {\n return { kind: 'failed', reason: reason ?? 'error', silent: false };\n }\n return undefined;\n}\n\nfunction build(\n partial: Pick<AthenaRuntimeMessage, 'kind' | 'reason' | 'silent'>,\n text: string | undefined,\n isSoleSourceMessage: boolean\n): AthenaRuntimeMessage {\n const description = describeTerminationReason(partial.kind, partial.reason);\n return {\n kind: partial.kind,\n reason: partial.reason,\n severity: SEVERITY[partial.kind],\n title: description.title,\n detail: description.detail,\n text,\n silent: partial.silent,\n isSoleSourceMessage,\n };\n}\n\n/**\n * Read the runtime ending behind a thread message, from its bound source\n * messages first (a marker or handoff chunked after the assistant's own turn\n * is never the first source, so the joined `metadata.custom` would miss it —\n * see {@link readRunMarkerFromSourceMessages}), then from joined metadata for\n * surfaces without bound sources.\n */\nexport function readRuntimeMessageFromSourceMessages(\n message: Parameters<typeof getExternalStoreMessages>[0] & {\n metadata?: { custom?: Record<string, unknown> | undefined } | undefined;\n content?: unknown;\n }\n): AthenaRuntimeMessage | undefined {\n const sources = getExternalStoreMessages<LangChainMessage>(message);\n for (const source of sources) {\n if (source?.type !== 'ai') continue;\n const kwargs = source.additional_kwargs as Kwargs;\n const marker = kwargs?.[ATHENA_RUN_MARKER_KEY];\n const reason = readTerminationReason(kwargs);\n const text = textOf(source.content);\n if (typeof marker === 'string') {\n const markerSource = kwargs?.[ATHENA_RUN_MARKER_SOURCE_KEY];\n const partial = fromMarker(\n marker,\n typeof markerSource === 'string' ? markerSource : undefined,\n reason\n );\n if (partial) return build(partial, text, sources.length === 1);\n }\n if (readHandoff(kwargs)) {\n return build({ kind: 'handoff', reason, silent: false }, text, sources.length === 1);\n }\n }\n const custom = message.metadata?.custom;\n if (!custom) return undefined;\n const parts = message.content;\n const sole = Array.isArray(parts) ? parts.length <= 1 : true;\n const joinedMarker = custom[ATHENA_RUN_MARKER_KEY];\n const joinedReason = readTerminationReason({ metadata: custom });\n if (typeof joinedMarker === 'string') {\n const joinedSource = custom[ATHENA_RUN_MARKER_SOURCE_KEY];\n const partial = fromMarker(\n joinedMarker,\n typeof joinedSource === 'string' ? joinedSource : undefined,\n joinedReason\n );\n if (partial) return build(partial, undefined, sole);\n }\n if (custom[ATHENA_HANDOFF_KEY] === true) {\n return build({ kind: 'handoff', reason: joinedReason, silent: false }, undefined, sole);\n }\n return undefined;\n}\n\n/**\n * The backend marker copy worth showing under a runtime card, or `undefined`.\n *\n * A failure marker's text carries the specific error (\"The run failed:\n * provider returned 502\"), so it is shown when no reason-specific detail\n * exists. Stop/pause copy only restates the title, and a handoff's text is the\n * message body itself, so neither is repeated. Marker copy leads with an emoji\n * for raw-transcript readers; the card's icon plays that role, so it is\n * stripped. Shared by every presenter so mobile and DOM cannot drift.\n */\nexport function runtimeMessageMarkerText(message: AthenaRuntimeMessage): string | undefined {\n if (message.kind !== 'failed' || message.detail) return undefined;\n const text = message.text?.replace(/^(?:⏹️|⏸️|⚠️|\\s)+/u, '').trim();\n if (!text || text === message.title) return undefined;\n return text;\n}\n\n/**\n * The runtime message's kind when it owns the whole row, else `undefined`.\n *\n * Returns a primitive so it is safe as a `useAuiState` selector (the reader\n * above builds a fresh object per call; an object snapshot would loop the\n * render under `Object.is` comparison).\n */\nexport function readSoleRuntimeMessageKind(\n message: Parameters<typeof readRuntimeMessageFromSourceMessages>[0]\n): AthenaRuntimeMessageKind | undefined {\n const found = readRuntimeMessageFromSourceMessages(message);\n return found?.isSoleSourceMessage ? found.kind : undefined;\n}\n"],"names":[],"mappings":";;AAoGA,MAAM,iBAAiB;AAMhB,SAAS,0BACd,MACA,QACwB;AACxB,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,IAEZ,KAAK;AACH,cAAQ,QAAA;AAAA,QACN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QACE;AAAA,UAAA;AAAA,QAEN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QACE;AAAA,UAAA;AAAA,QAEN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAEZ,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAEZ;AACE,iBAAO,EAAE,OAAO,wBAAwB,QAAQ,OAAA;AAAA,MAAU;AAAA,IAEhE,KAAK;AACH,cAAQ,QAAA;AAAA,QACN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,mEAAmE,cAAc;AAAA,UAAA;AAAA,QAE7F,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QACE;AAAA,UAAA;AAAA,QAEN;AACE,iBAAO,EAAE,OAAO,cAAc,QAAQ,OAAA;AAAA,MAAU;AAAA,IAEtD,KAAK;AACH,cAAQ,QAAA;AAAA,QACN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QACE;AAAA,UAAA;AAAA,QAEN,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,+DAA+D,cAAc;AAAA,UAAA;AAAA,QAEzF;AACE,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,MACV;AAAA,EACJ;AAEN;AAEA,MAAM,WAA2E;AAAA,EAC/E,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAIA,SAAS,WAAW,QAAqD;AACvE,QAAM,WAAW,iCAAQ;AACzB,SAAO,OAAO,aAAa,YAAY,aAAa,OAC/C,WACD;AACN;AAGO,SAAS,sBAAsB,QAAoC;;AACxE,QAAM,MAAM,iCAAS;AACrB,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAM,YAAW,gBAAW,MAAM,MAAjB,mBAAqB;AACtC,SAAO,OAAO,aAAa,WAAW,WAAW;AACnD;AAEA,SAAS,YAAY,QAAyB;;AAC5C,UAAO,iCAAS,yBAAwB,UAAQ,gBAAW,MAAM,MAAjB,mBAAqB,yBAAwB;AAC/F;AAEA,SAAS,OAAO,SAAsC;AACpD,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,QAAM,QAAQ,QACX;AAAA,IAAI,CAAC,UACJ,OAAO,UAAU,WACb,QACA,SAAS,OAAO,UAAU,YAAa,MAA6B,SAAS,SAC1E,MAA6B,OAC9B;AAAA,EAAA,EAEP,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC;AAC/E,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,WACP,QACA,QACA,QACsE;AACtE,MAAI,WAAW,6BAA6B;AAC1C,UAAM,OAAiC,yBAAyB,MAAM,IAAI,WAAW;AACrF,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,WAAW,WAAW,iBAAiB,sBAAsB;AAAA,MACrE,QAAQ,WAAW;AAAA,IAAA;AAAA,EAEvB;AACA,MAAI,WAAW,0BAA0B;AACvC,WAAO,EAAE,MAAM,UAAU,QAAQ,UAAU,SAAS,QAAQ,MAAA;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,MACP,SACA,MACA,qBACsB;AACtB,QAAM,cAAc,0BAA0B,QAAQ,MAAM,QAAQ,MAAM;AAC1E,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,UAAU,SAAS,QAAQ,IAAI;AAAA,IAC/B,OAAO,YAAY;AAAA,IACnB,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB;AAAA,EAAA;AAEJ;AASO,SAAS,qCACd,SAIkC;;AAClC,QAAM,UAAU,yBAA2C,OAAO;AAClE,aAAW,UAAU,SAAS;AAC5B,SAAI,iCAAQ,UAAS,KAAM;AAC3B,UAAM,SAAS,OAAO;AACtB,UAAM,SAAS,iCAAS;AACxB,UAAM,SAAS,sBAAsB,MAAM;AAC3C,UAAM,OAAO,OAAO,OAAO,OAAO;AAClC,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,eAAe,iCAAS;AAC9B,YAAM,UAAU;AAAA,QACd;AAAA,QACA,OAAO,iBAAiB,WAAW,eAAe;AAAA,QAClD;AAAA,MAAA;AAEF,UAAI,QAAS,QAAO,MAAM,SAAS,MAAM,QAAQ,WAAW,CAAC;AAAA,IAC/D;AACA,QAAI,YAAY,MAAM,GAAG;AACvB,aAAO,MAAM,EAAE,MAAM,WAAW,QAAQ,QAAQ,MAAA,GAAS,MAAM,QAAQ,WAAW,CAAC;AAAA,IACrF;AAAA,EACF;AACA,QAAM,UAAS,aAAQ,aAAR,mBAAkB;AACjC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,QAAQ;AACtB,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,UAAU,IAAI;AACxD,QAAM,eAAe,OAAO,qBAAqB;AACjD,QAAM,eAAe,sBAAsB,EAAE,UAAU,QAAQ;AAC/D,MAAI,OAAO,iBAAiB,UAAU;AACpC,UAAM,eAAe,OAAO,4BAA4B;AACxD,UAAM,UAAU;AAAA,MACd;AAAA,MACA,OAAO,iBAAiB,WAAW,eAAe;AAAA,MAClD;AAAA,IAAA;AAEF,QAAI,QAAS,QAAO,MAAM,SAAS,QAAW,IAAI;AAAA,EACpD;AACA,MAAI,OAAO,kBAAkB,MAAM,MAAM;AACvC,WAAO,MAAM,EAAE,MAAM,WAAW,QAAQ,cAAc,QAAQ,MAAA,GAAS,QAAW,IAAI;AAAA,EACxF;AACA,SAAO;AACT;AAYO,SAAS,yBAAyB,SAAmD;;AAC1F,MAAI,QAAQ,SAAS,YAAY,QAAQ,OAAQ,QAAO;AACxD,QAAM,QAAO,aAAQ,SAAR,mBAAc,QAAQ,sBAAsB,IAAI;AAC7D,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAO,QAAO;AAC5C,SAAO;AACT;AASO,SAAS,2BACd,SACsC;AACtC,QAAM,QAAQ,qCAAqC,OAAO;AAC1D,UAAO,+BAAO,uBAAsB,MAAM,OAAO;AACnD;"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const SCREEN_POINT_PROTOCOL = "athena-point:";
4
+ const SCREEN_POINT_HREF_PREFIX = `${SCREEN_POINT_PROTOCOL}//`;
5
+ const SCREEN_POINT_MAX_EXTENT = 32767;
6
+ const NUMBER_PATTERN = /^~?\s*(-?\d+(?:\.\d+)?)$/;
7
+ function parseCoordinateNumber(raw) {
8
+ if (raw === null || raw.trim() === "") return { ok: false, error: "missing" };
9
+ const match = NUMBER_PATTERN.exec(raw.trim());
10
+ if (!match) return { ok: false, error: "non-finite-number" };
11
+ const value = Number(match[1]);
12
+ if (!Number.isFinite(value)) return { ok: false, error: "non-finite-number" };
13
+ if (value < 0) return { ok: false, error: "negative-number" };
14
+ if (value > SCREEN_POINT_MAX_EXTENT) return { ok: false, error: "extent-too-large" };
15
+ return { ok: true, value: Math.round(value) };
16
+ }
17
+ function isScreenPointHref(href) {
18
+ return typeof href === "string" && href.startsWith(SCREEN_POINT_HREF_PREFIX);
19
+ }
20
+ function parseScreenPointHref(href) {
21
+ if (!isScreenPointHref(href)) return { ok: false, error: "not-screen-point" };
22
+ const queryStart = href.indexOf("?");
23
+ if (queryStart === -1) return { ok: false, error: "missing-coordinate" };
24
+ const params = new URLSearchParams(href.slice(queryStart + 1));
25
+ const x = parseCoordinateNumber(params.get("x"));
26
+ const y = parseCoordinateNumber(params.get("y"));
27
+ if (!x.ok) return { ok: false, error: x.error === "missing" ? "missing-coordinate" : x.error };
28
+ if (!y.ok) return { ok: false, error: y.error === "missing" ? "missing-coordinate" : y.error };
29
+ const widthRaw = params.get("w") ?? params.get("width") ?? params.get("basisWidth");
30
+ const heightRaw = params.get("h") ?? params.get("height") ?? params.get("basisHeight");
31
+ let basis = null;
32
+ if (widthRaw !== null || heightRaw !== null) {
33
+ const width = parseCoordinateNumber(widthRaw);
34
+ const height = parseCoordinateNumber(heightRaw);
35
+ if (!width.ok || !height.ok) {
36
+ const failed = !width.ok ? width : height;
37
+ if (failed.ok) return { ok: false, error: "degenerate-basis" };
38
+ return {
39
+ ok: false,
40
+ error: failed.error === "missing" ? "degenerate-basis" : failed.error
41
+ };
42
+ }
43
+ if (width.value <= 0 || height.value <= 0) return { ok: false, error: "degenerate-basis" };
44
+ basis = { width: width.value, height: height.value };
45
+ if (x.value > basis.width || y.value > basis.height) {
46
+ return { ok: false, error: "out-of-bounds" };
47
+ }
48
+ }
49
+ const tabRaw = params.get("tab") ?? params.get("tab_id") ?? params.get("tabId");
50
+ let tabId = null;
51
+ if (tabRaw !== null && tabRaw.trim() !== "") {
52
+ const tab = Number(tabRaw);
53
+ tabId = Number.isInteger(tab) && tab >= 0 ? tab : null;
54
+ }
55
+ return { ok: true, point: { x: x.value, y: y.value, basis, tabId } };
56
+ }
57
+ function formatScreenPoint(point) {
58
+ const pair = `(${point.x}, ${point.y})`;
59
+ if (!point.basis) return `${pair} — screenshot size not recorded`;
60
+ return `${pair} in a ${point.basis.width}×${point.basis.height} screenshot`;
61
+ }
62
+ exports.SCREEN_POINT_HREF_PREFIX = SCREEN_POINT_HREF_PREFIX;
63
+ exports.SCREEN_POINT_MAX_EXTENT = SCREEN_POINT_MAX_EXTENT;
64
+ exports.SCREEN_POINT_PROTOCOL = SCREEN_POINT_PROTOCOL;
65
+ exports.formatScreenPoint = formatScreenPoint;
66
+ exports.isScreenPointHref = isScreenPointHref;
67
+ exports.parseScreenPointHref = parseScreenPointHref;
68
+ //# sourceMappingURL=screen-point.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-point.cjs","sources":["../../../../../agent-runtime/src/screen-point.ts"],"sourcesContent":["/**\n * Screen points: the agent's on-screen coordinates as structured, renderable\n * data.\n *\n * Browser agents already speak in `[x, y]` pairs — the `coordinate` argument\n * of `chrome_computer` / `device_computer` / `computer` is a pixel in the\n * screenshot the model was shown. In prose those pairs arrive as free text\n * (\"Delete at ~(1038, 81)\"), which no surface can render as anything but\n * characters. A screen point is that same pair written as a markdown link\n * whose destination carries the pair *and the dimensions of the screenshot it\n * was read from*:\n *\n * [Delete](athena-point://screenshot?x=1038&y=81&w=1280&h=720&tab=8811)\n *\n * The agent keeps its native vocabulary (the coordinate it already has, the\n * screenshot size it was told) and does no arithmetic; every chat surface\n * that understands the scheme renders the link as a chip and, because the\n * basis dimensions travel with the point, can place a marker at the right\n * relative spot on any later rendition of that screenshot however the\n * transcript is laid out or the user's window is resized. Surfaces that do\n * not understand the scheme show the label as plain text (a link with an\n * unknown protocol), which is exactly the prose we have today — the format\n * degrades to the status quo, never below it.\n *\n * Pure string and number work, UI-library-free, shared by every chat surface\n * (Olympus, the React SDK hosts, the Chrome extension side panel) so a point\n * that is valid on one surface is valid on all of them.\n */\n\n/** URL scheme of a screen-point link. */\nexport const SCREEN_POINT_PROTOCOL = \"athena-point:\";\n/** Host of a screen-point link: the coordinate space the pair lives in. */\nexport const SCREEN_POINT_HOST = \"screenshot\";\n/** `href.startsWith(SCREEN_POINT_HREF_PREFIX)` is the cheap pre-check every renderer runs. */\nexport const SCREEN_POINT_HREF_PREFIX = `${SCREEN_POINT_PROTOCOL}//`;\n/**\n * The largest coordinate or dimension a point may carry. No screenshot the\n * runtime delivers approaches this; anything larger is a typo or a unit mix-up.\n */\nexport const SCREEN_POINT_MAX_EXTENT = 32_767;\n/**\n * The model-facing CUA screenshot size the Chrome extension emits by default\n * (`athena-in-chrome/extension/src/background.ts`, `CHROME_DEFAULT_WIDTH` /\n * `CHROME_DEFAULT_HEIGHT` in `chrome_browser_tools.py`). Surfaces may offer\n * it as the fallback basis for a point that omits `w`/`h`, clearly labelled\n * as assumed.\n */\nexport const DEFAULT_CUA_SCREENSHOT_SIZE = { width: 1280, height: 720 } as const;\n\n/** Width and height of a coordinate space, in that space's pixels. */\nexport interface ScreenSize {\n width: number;\n height: number;\n}\n\n/**\n * A point in screenshot space. `basis` is the size of the screenshot the pair\n * was read from; `null` when the link omitted it, in which case the point can\n * be shown but not placed. `tabId` is the Chrome tab the screenshot came from\n * when the agent had one.\n */\nexport interface ScreenPoint {\n x: number;\n y: number;\n basis: ScreenSize | null;\n tabId: number | null;\n}\n\n/**\n * Why a link that starts with the scheme could not become a point. Rendered\n * surfaces show the label as text with the reason in a tooltip, so a broken\n * link never becomes an interactive marker that points nowhere.\n */\nexport type ScreenPointParseError =\n | \"not-screen-point\"\n | \"missing-coordinate\"\n | \"non-finite-number\"\n | \"negative-number\"\n | \"degenerate-basis\"\n | \"out-of-bounds\"\n | \"extent-too-large\";\n\nexport type ScreenPointParseResult =\n | { ok: true; point: ScreenPoint }\n | { ok: false; error: ScreenPointParseError };\n\n/** A number the agent may have written with a decimal point or a `~`: keep the integer pixel. */\nconst NUMBER_PATTERN = /^~?\\s*(-?\\d+(?:\\.\\d+)?)$/;\n\ntype NumberParse =\n | { ok: true; value: number }\n | { ok: false; error: \"non-finite-number\" | \"negative-number\" | \"extent-too-large\" }\n | { ok: false; error: \"missing\" };\n\nfunction parseCoordinateNumber(raw: string | null): NumberParse {\n if (raw === null || raw.trim() === \"\") return { ok: false, error: \"missing\" };\n const match = NUMBER_PATTERN.exec(raw.trim());\n if (!match) return { ok: false, error: \"non-finite-number\" };\n const value = Number(match[1]);\n if (!Number.isFinite(value)) return { ok: false, error: \"non-finite-number\" };\n if (value < 0) return { ok: false, error: \"negative-number\" };\n if (value > SCREEN_POINT_MAX_EXTENT) return { ok: false, error: \"extent-too-large\" };\n return { ok: true, value: Math.round(value) };\n}\n\n/** Whether `href` is a screen-point link at all (the cheap pre-check). */\nexport function isScreenPointHref(href: string | null | undefined): href is string {\n return typeof href === \"string\" && href.startsWith(SCREEN_POINT_HREF_PREFIX);\n}\n\n/**\n * Parse a screen-point link. Accepts the canonical form\n * `athena-point://screenshot?x=…&y=…&w=…&h=…&tab=…` and tolerates what a\n * model plausibly writes instead: `width`/`height` for `w`/`h`, `tab_id` for\n * `tab`, decimals, a leading `~`, and an empty or different host. Rejects,\n * with a reason, anything that would place a marker in the wrong spot:\n * non-finite or negative numbers, a zero or negative basis, a point outside\n * its basis, and absurd extents.\n */\nexport function parseScreenPointHref(href: string | null | undefined): ScreenPointParseResult {\n if (!isScreenPointHref(href)) return { ok: false, error: \"not-screen-point\" };\n\n // `new URL` treats a non-special scheme with an empty host inconsistently\n // across engines; the query is the only part we read, so slice it off.\n const queryStart = href.indexOf(\"?\");\n if (queryStart === -1) return { ok: false, error: \"missing-coordinate\" };\n const params = new URLSearchParams(href.slice(queryStart + 1));\n\n const x = parseCoordinateNumber(params.get(\"x\"));\n const y = parseCoordinateNumber(params.get(\"y\"));\n if (!x.ok) return { ok: false, error: x.error === \"missing\" ? \"missing-coordinate\" : x.error };\n if (!y.ok) return { ok: false, error: y.error === \"missing\" ? \"missing-coordinate\" : y.error };\n\n const widthRaw = params.get(\"w\") ?? params.get(\"width\") ?? params.get(\"basisWidth\");\n const heightRaw = params.get(\"h\") ?? params.get(\"height\") ?? params.get(\"basisHeight\");\n let basis: ScreenSize | null = null;\n if (widthRaw !== null || heightRaw !== null) {\n const width = parseCoordinateNumber(widthRaw);\n const height = parseCoordinateNumber(heightRaw);\n // One dimension without the other is not a basis.\n if (!width.ok || !height.ok) {\n const failed = !width.ok ? width : height;\n if (failed.ok) return { ok: false, error: \"degenerate-basis\" };\n return {\n ok: false,\n error: failed.error === \"missing\" ? \"degenerate-basis\" : failed.error,\n };\n }\n if (width.value <= 0 || height.value <= 0) return { ok: false, error: \"degenerate-basis\" };\n basis = { width: width.value, height: height.value };\n if (x.value > basis.width || y.value > basis.height) {\n return { ok: false, error: \"out-of-bounds\" };\n }\n }\n\n const tabRaw = params.get(\"tab\") ?? params.get(\"tab_id\") ?? params.get(\"tabId\");\n let tabId: number | null = null;\n if (tabRaw !== null && tabRaw.trim() !== \"\") {\n const tab = Number(tabRaw);\n tabId = Number.isInteger(tab) && tab >= 0 ? tab : null;\n }\n\n return { ok: true, point: { x: x.value, y: y.value, basis, tabId } };\n}\n\n/** The canonical link for a point — what the prompt teaches the agent to write. */\nexport function serializeScreenPointHref(point: ScreenPoint): string {\n const params = new URLSearchParams();\n params.set(\"x\", String(point.x));\n params.set(\"y\", String(point.y));\n if (point.basis) {\n params.set(\"w\", String(point.basis.width));\n params.set(\"h\", String(point.basis.height));\n }\n if (point.tabId !== null) params.set(\"tab\", String(point.tabId));\n return `${SCREEN_POINT_HREF_PREFIX}${SCREEN_POINT_HOST}?${params.toString()}`;\n}\n\n/**\n * Where the point sits as a fraction of its basis, `0..1` on each axis, or\n * `null` when the point has no basis to be relative to. This is the only\n * number a renderer needs: `left: ${fx * 100}%` places the marker on any\n * rendition of the screenshot, whatever size it is drawn at.\n */\nexport function screenPointFraction(point: ScreenPoint): { fx: number; fy: number } | null {\n if (!point.basis) return null;\n return { fx: point.x / point.basis.width, fy: point.y / point.basis.height };\n}\n\n/** Whether two sizes are the same to within the few-pixel jitter a resize or scrollbar introduces. */\nexport function sameScreenSize({\n a,\n b,\n tolerancePx = 4,\n}: {\n a: ScreenSize;\n b: ScreenSize;\n tolerancePx?: number;\n}): boolean {\n return Math.abs(a.width - b.width) <= tolerancePx && Math.abs(a.height - b.height) <= tolerancePx;\n}\n\n/**\n * How a point's basis relates to the screenshot it is about to be drawn on.\n * Mirrors the runtime's dispatch contract (`browser_coordinate_contract.json`):\n * the same size or a few pixels of jitter is `identity`; a uniform ratio on\n * both axes (browser zoom, a resized window at the same aspect) is\n * `uniform-scale` and the fraction still lands on the same element; anything\n * else is a `mismatch` — a different aspect ratio means the screenshot shows a\n * different framing (chrome headroom, a rotated device, a different tab) and\n * a fraction placed on it would point at the wrong thing.\n */\nexport type ScreenBasisFit =\n | { kind: \"identity\" }\n | { kind: \"uniform-scale\"; scale: number }\n | { kind: \"mismatch\"; aspectDelta: number };\n\nexport function fitScreenBasis({\n basis,\n target,\n aspectTolerance = 0.02,\n}: {\n basis: ScreenSize;\n target: ScreenSize;\n aspectTolerance?: number;\n}): ScreenBasisFit {\n if (\n basis.width <= 0 ||\n basis.height <= 0 ||\n target.width <= 0 ||\n target.height <= 0 ||\n ![basis.width, basis.height, target.width, target.height].every(Number.isFinite)\n ) {\n return { kind: \"mismatch\", aspectDelta: Number.POSITIVE_INFINITY };\n }\n if (sameScreenSize({ a: basis, b: target })) return { kind: \"identity\" };\n const scaleX = target.width / basis.width;\n const scaleY = target.height / basis.height;\n const aspectDelta = Math.abs(scaleX - scaleY) / Math.max(scaleX, scaleY);\n if (aspectDelta <= aspectTolerance) return { kind: \"uniform-scale\", scale: (scaleX + scaleY) / 2 };\n return { kind: \"mismatch\", aspectDelta };\n}\n\n/** Human-readable point for tooltips and accessible names: `(1038, 81) in a 1280×720 screenshot`. */\nexport function formatScreenPoint(point: ScreenPoint): string {\n const pair = `(${point.x}, ${point.y})`;\n if (!point.basis) return `${pair} — screenshot size not recorded`;\n return `${pair} in a ${point.basis.width}×${point.basis.height} screenshot`;\n}\n\n/** The sentence a surface shows for a link that failed to parse. */\nexport function describeScreenPointError(error: ScreenPointParseError): string {\n switch (error) {\n case \"not-screen-point\":\n return \"Not a screen point\";\n case \"missing-coordinate\":\n return \"Screen point is missing x or y\";\n case \"non-finite-number\":\n return \"Screen point has a non-numeric value\";\n case \"negative-number\":\n return \"Screen point has a negative value\";\n case \"degenerate-basis\":\n return \"Screen point has an invalid screenshot size\";\n case \"out-of-bounds\":\n return \"Screen point lies outside its screenshot\";\n case \"extent-too-large\":\n return \"Screen point value is implausibly large\";\n }\n}\n\n/**\n * Screen points written into a text block, in order. Used by surfaces that\n * work on the raw markdown (the static message body's node parser, the\n * extension's plain-text composer) and by tests. Only the link form is\n * recognised — a bare `(1038, 81)` in prose is text, never a point, so a\n * model that was not taught the scheme changes nothing.\n */\nexport function findScreenPointLinks(\n text: string,\n): Array<{ start: number; end: number; label: string; href: string }> {\n const results: Array<{ start: number; end: number; label: string; href: string }> = [];\n const pattern = /\\[([^\\]\\n]*)\\]\\((athena-point:\\/\\/[^\\s)]*)\\)/g;\n for (const match of text.matchAll(pattern)) {\n if (match.index === undefined) continue;\n results.push({\n start: match.index,\n end: match.index + match[0].length,\n label: match[1],\n href: match[2],\n });\n }\n return results;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ const SCREEN_POINT_PROTOCOL = "athena-point:";
2
+ const SCREEN_POINT_HREF_PREFIX = `${SCREEN_POINT_PROTOCOL}//`;
3
+ const SCREEN_POINT_MAX_EXTENT = 32767;
4
+ const NUMBER_PATTERN = /^~?\s*(-?\d+(?:\.\d+)?)$/;
5
+ function parseCoordinateNumber(raw) {
6
+ if (raw === null || raw.trim() === "") return { ok: false, error: "missing" };
7
+ const match = NUMBER_PATTERN.exec(raw.trim());
8
+ if (!match) return { ok: false, error: "non-finite-number" };
9
+ const value = Number(match[1]);
10
+ if (!Number.isFinite(value)) return { ok: false, error: "non-finite-number" };
11
+ if (value < 0) return { ok: false, error: "negative-number" };
12
+ if (value > SCREEN_POINT_MAX_EXTENT) return { ok: false, error: "extent-too-large" };
13
+ return { ok: true, value: Math.round(value) };
14
+ }
15
+ function isScreenPointHref(href) {
16
+ return typeof href === "string" && href.startsWith(SCREEN_POINT_HREF_PREFIX);
17
+ }
18
+ function parseScreenPointHref(href) {
19
+ if (!isScreenPointHref(href)) return { ok: false, error: "not-screen-point" };
20
+ const queryStart = href.indexOf("?");
21
+ if (queryStart === -1) return { ok: false, error: "missing-coordinate" };
22
+ const params = new URLSearchParams(href.slice(queryStart + 1));
23
+ const x = parseCoordinateNumber(params.get("x"));
24
+ const y = parseCoordinateNumber(params.get("y"));
25
+ if (!x.ok) return { ok: false, error: x.error === "missing" ? "missing-coordinate" : x.error };
26
+ if (!y.ok) return { ok: false, error: y.error === "missing" ? "missing-coordinate" : y.error };
27
+ const widthRaw = params.get("w") ?? params.get("width") ?? params.get("basisWidth");
28
+ const heightRaw = params.get("h") ?? params.get("height") ?? params.get("basisHeight");
29
+ let basis = null;
30
+ if (widthRaw !== null || heightRaw !== null) {
31
+ const width = parseCoordinateNumber(widthRaw);
32
+ const height = parseCoordinateNumber(heightRaw);
33
+ if (!width.ok || !height.ok) {
34
+ const failed = !width.ok ? width : height;
35
+ if (failed.ok) return { ok: false, error: "degenerate-basis" };
36
+ return {
37
+ ok: false,
38
+ error: failed.error === "missing" ? "degenerate-basis" : failed.error
39
+ };
40
+ }
41
+ if (width.value <= 0 || height.value <= 0) return { ok: false, error: "degenerate-basis" };
42
+ basis = { width: width.value, height: height.value };
43
+ if (x.value > basis.width || y.value > basis.height) {
44
+ return { ok: false, error: "out-of-bounds" };
45
+ }
46
+ }
47
+ const tabRaw = params.get("tab") ?? params.get("tab_id") ?? params.get("tabId");
48
+ let tabId = null;
49
+ if (tabRaw !== null && tabRaw.trim() !== "") {
50
+ const tab = Number(tabRaw);
51
+ tabId = Number.isInteger(tab) && tab >= 0 ? tab : null;
52
+ }
53
+ return { ok: true, point: { x: x.value, y: y.value, basis, tabId } };
54
+ }
55
+ function formatScreenPoint(point) {
56
+ const pair = `(${point.x}, ${point.y})`;
57
+ if (!point.basis) return `${pair} — screenshot size not recorded`;
58
+ return `${pair} in a ${point.basis.width}×${point.basis.height} screenshot`;
59
+ }
60
+ export {
61
+ SCREEN_POINT_HREF_PREFIX,
62
+ SCREEN_POINT_MAX_EXTENT,
63
+ SCREEN_POINT_PROTOCOL,
64
+ formatScreenPoint,
65
+ isScreenPointHref,
66
+ parseScreenPointHref
67
+ };
68
+ //# sourceMappingURL=screen-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-point.js","sources":["../../../../../agent-runtime/src/screen-point.ts"],"sourcesContent":["/**\n * Screen points: the agent's on-screen coordinates as structured, renderable\n * data.\n *\n * Browser agents already speak in `[x, y]` pairs — the `coordinate` argument\n * of `chrome_computer` / `device_computer` / `computer` is a pixel in the\n * screenshot the model was shown. In prose those pairs arrive as free text\n * (\"Delete at ~(1038, 81)\"), which no surface can render as anything but\n * characters. A screen point is that same pair written as a markdown link\n * whose destination carries the pair *and the dimensions of the screenshot it\n * was read from*:\n *\n * [Delete](athena-point://screenshot?x=1038&y=81&w=1280&h=720&tab=8811)\n *\n * The agent keeps its native vocabulary (the coordinate it already has, the\n * screenshot size it was told) and does no arithmetic; every chat surface\n * that understands the scheme renders the link as a chip and, because the\n * basis dimensions travel with the point, can place a marker at the right\n * relative spot on any later rendition of that screenshot however the\n * transcript is laid out or the user's window is resized. Surfaces that do\n * not understand the scheme show the label as plain text (a link with an\n * unknown protocol), which is exactly the prose we have today — the format\n * degrades to the status quo, never below it.\n *\n * Pure string and number work, UI-library-free, shared by every chat surface\n * (Olympus, the React SDK hosts, the Chrome extension side panel) so a point\n * that is valid on one surface is valid on all of them.\n */\n\n/** URL scheme of a screen-point link. */\nexport const SCREEN_POINT_PROTOCOL = \"athena-point:\";\n/** Host of a screen-point link: the coordinate space the pair lives in. */\nexport const SCREEN_POINT_HOST = \"screenshot\";\n/** `href.startsWith(SCREEN_POINT_HREF_PREFIX)` is the cheap pre-check every renderer runs. */\nexport const SCREEN_POINT_HREF_PREFIX = `${SCREEN_POINT_PROTOCOL}//`;\n/**\n * The largest coordinate or dimension a point may carry. No screenshot the\n * runtime delivers approaches this; anything larger is a typo or a unit mix-up.\n */\nexport const SCREEN_POINT_MAX_EXTENT = 32_767;\n/**\n * The model-facing CUA screenshot size the Chrome extension emits by default\n * (`athena-in-chrome/extension/src/background.ts`, `CHROME_DEFAULT_WIDTH` /\n * `CHROME_DEFAULT_HEIGHT` in `chrome_browser_tools.py`). Surfaces may offer\n * it as the fallback basis for a point that omits `w`/`h`, clearly labelled\n * as assumed.\n */\nexport const DEFAULT_CUA_SCREENSHOT_SIZE = { width: 1280, height: 720 } as const;\n\n/** Width and height of a coordinate space, in that space's pixels. */\nexport interface ScreenSize {\n width: number;\n height: number;\n}\n\n/**\n * A point in screenshot space. `basis` is the size of the screenshot the pair\n * was read from; `null` when the link omitted it, in which case the point can\n * be shown but not placed. `tabId` is the Chrome tab the screenshot came from\n * when the agent had one.\n */\nexport interface ScreenPoint {\n x: number;\n y: number;\n basis: ScreenSize | null;\n tabId: number | null;\n}\n\n/**\n * Why a link that starts with the scheme could not become a point. Rendered\n * surfaces show the label as text with the reason in a tooltip, so a broken\n * link never becomes an interactive marker that points nowhere.\n */\nexport type ScreenPointParseError =\n | \"not-screen-point\"\n | \"missing-coordinate\"\n | \"non-finite-number\"\n | \"negative-number\"\n | \"degenerate-basis\"\n | \"out-of-bounds\"\n | \"extent-too-large\";\n\nexport type ScreenPointParseResult =\n | { ok: true; point: ScreenPoint }\n | { ok: false; error: ScreenPointParseError };\n\n/** A number the agent may have written with a decimal point or a `~`: keep the integer pixel. */\nconst NUMBER_PATTERN = /^~?\\s*(-?\\d+(?:\\.\\d+)?)$/;\n\ntype NumberParse =\n | { ok: true; value: number }\n | { ok: false; error: \"non-finite-number\" | \"negative-number\" | \"extent-too-large\" }\n | { ok: false; error: \"missing\" };\n\nfunction parseCoordinateNumber(raw: string | null): NumberParse {\n if (raw === null || raw.trim() === \"\") return { ok: false, error: \"missing\" };\n const match = NUMBER_PATTERN.exec(raw.trim());\n if (!match) return { ok: false, error: \"non-finite-number\" };\n const value = Number(match[1]);\n if (!Number.isFinite(value)) return { ok: false, error: \"non-finite-number\" };\n if (value < 0) return { ok: false, error: \"negative-number\" };\n if (value > SCREEN_POINT_MAX_EXTENT) return { ok: false, error: \"extent-too-large\" };\n return { ok: true, value: Math.round(value) };\n}\n\n/** Whether `href` is a screen-point link at all (the cheap pre-check). */\nexport function isScreenPointHref(href: string | null | undefined): href is string {\n return typeof href === \"string\" && href.startsWith(SCREEN_POINT_HREF_PREFIX);\n}\n\n/**\n * Parse a screen-point link. Accepts the canonical form\n * `athena-point://screenshot?x=…&y=…&w=…&h=…&tab=…` and tolerates what a\n * model plausibly writes instead: `width`/`height` for `w`/`h`, `tab_id` for\n * `tab`, decimals, a leading `~`, and an empty or different host. Rejects,\n * with a reason, anything that would place a marker in the wrong spot:\n * non-finite or negative numbers, a zero or negative basis, a point outside\n * its basis, and absurd extents.\n */\nexport function parseScreenPointHref(href: string | null | undefined): ScreenPointParseResult {\n if (!isScreenPointHref(href)) return { ok: false, error: \"not-screen-point\" };\n\n // `new URL` treats a non-special scheme with an empty host inconsistently\n // across engines; the query is the only part we read, so slice it off.\n const queryStart = href.indexOf(\"?\");\n if (queryStart === -1) return { ok: false, error: \"missing-coordinate\" };\n const params = new URLSearchParams(href.slice(queryStart + 1));\n\n const x = parseCoordinateNumber(params.get(\"x\"));\n const y = parseCoordinateNumber(params.get(\"y\"));\n if (!x.ok) return { ok: false, error: x.error === \"missing\" ? \"missing-coordinate\" : x.error };\n if (!y.ok) return { ok: false, error: y.error === \"missing\" ? \"missing-coordinate\" : y.error };\n\n const widthRaw = params.get(\"w\") ?? params.get(\"width\") ?? params.get(\"basisWidth\");\n const heightRaw = params.get(\"h\") ?? params.get(\"height\") ?? params.get(\"basisHeight\");\n let basis: ScreenSize | null = null;\n if (widthRaw !== null || heightRaw !== null) {\n const width = parseCoordinateNumber(widthRaw);\n const height = parseCoordinateNumber(heightRaw);\n // One dimension without the other is not a basis.\n if (!width.ok || !height.ok) {\n const failed = !width.ok ? width : height;\n if (failed.ok) return { ok: false, error: \"degenerate-basis\" };\n return {\n ok: false,\n error: failed.error === \"missing\" ? \"degenerate-basis\" : failed.error,\n };\n }\n if (width.value <= 0 || height.value <= 0) return { ok: false, error: \"degenerate-basis\" };\n basis = { width: width.value, height: height.value };\n if (x.value > basis.width || y.value > basis.height) {\n return { ok: false, error: \"out-of-bounds\" };\n }\n }\n\n const tabRaw = params.get(\"tab\") ?? params.get(\"tab_id\") ?? params.get(\"tabId\");\n let tabId: number | null = null;\n if (tabRaw !== null && tabRaw.trim() !== \"\") {\n const tab = Number(tabRaw);\n tabId = Number.isInteger(tab) && tab >= 0 ? tab : null;\n }\n\n return { ok: true, point: { x: x.value, y: y.value, basis, tabId } };\n}\n\n/** The canonical link for a point — what the prompt teaches the agent to write. */\nexport function serializeScreenPointHref(point: ScreenPoint): string {\n const params = new URLSearchParams();\n params.set(\"x\", String(point.x));\n params.set(\"y\", String(point.y));\n if (point.basis) {\n params.set(\"w\", String(point.basis.width));\n params.set(\"h\", String(point.basis.height));\n }\n if (point.tabId !== null) params.set(\"tab\", String(point.tabId));\n return `${SCREEN_POINT_HREF_PREFIX}${SCREEN_POINT_HOST}?${params.toString()}`;\n}\n\n/**\n * Where the point sits as a fraction of its basis, `0..1` on each axis, or\n * `null` when the point has no basis to be relative to. This is the only\n * number a renderer needs: `left: ${fx * 100}%` places the marker on any\n * rendition of the screenshot, whatever size it is drawn at.\n */\nexport function screenPointFraction(point: ScreenPoint): { fx: number; fy: number } | null {\n if (!point.basis) return null;\n return { fx: point.x / point.basis.width, fy: point.y / point.basis.height };\n}\n\n/** Whether two sizes are the same to within the few-pixel jitter a resize or scrollbar introduces. */\nexport function sameScreenSize({\n a,\n b,\n tolerancePx = 4,\n}: {\n a: ScreenSize;\n b: ScreenSize;\n tolerancePx?: number;\n}): boolean {\n return Math.abs(a.width - b.width) <= tolerancePx && Math.abs(a.height - b.height) <= tolerancePx;\n}\n\n/**\n * How a point's basis relates to the screenshot it is about to be drawn on.\n * Mirrors the runtime's dispatch contract (`browser_coordinate_contract.json`):\n * the same size or a few pixels of jitter is `identity`; a uniform ratio on\n * both axes (browser zoom, a resized window at the same aspect) is\n * `uniform-scale` and the fraction still lands on the same element; anything\n * else is a `mismatch` — a different aspect ratio means the screenshot shows a\n * different framing (chrome headroom, a rotated device, a different tab) and\n * a fraction placed on it would point at the wrong thing.\n */\nexport type ScreenBasisFit =\n | { kind: \"identity\" }\n | { kind: \"uniform-scale\"; scale: number }\n | { kind: \"mismatch\"; aspectDelta: number };\n\nexport function fitScreenBasis({\n basis,\n target,\n aspectTolerance = 0.02,\n}: {\n basis: ScreenSize;\n target: ScreenSize;\n aspectTolerance?: number;\n}): ScreenBasisFit {\n if (\n basis.width <= 0 ||\n basis.height <= 0 ||\n target.width <= 0 ||\n target.height <= 0 ||\n ![basis.width, basis.height, target.width, target.height].every(Number.isFinite)\n ) {\n return { kind: \"mismatch\", aspectDelta: Number.POSITIVE_INFINITY };\n }\n if (sameScreenSize({ a: basis, b: target })) return { kind: \"identity\" };\n const scaleX = target.width / basis.width;\n const scaleY = target.height / basis.height;\n const aspectDelta = Math.abs(scaleX - scaleY) / Math.max(scaleX, scaleY);\n if (aspectDelta <= aspectTolerance) return { kind: \"uniform-scale\", scale: (scaleX + scaleY) / 2 };\n return { kind: \"mismatch\", aspectDelta };\n}\n\n/** Human-readable point for tooltips and accessible names: `(1038, 81) in a 1280×720 screenshot`. */\nexport function formatScreenPoint(point: ScreenPoint): string {\n const pair = `(${point.x}, ${point.y})`;\n if (!point.basis) return `${pair} — screenshot size not recorded`;\n return `${pair} in a ${point.basis.width}×${point.basis.height} screenshot`;\n}\n\n/** The sentence a surface shows for a link that failed to parse. */\nexport function describeScreenPointError(error: ScreenPointParseError): string {\n switch (error) {\n case \"not-screen-point\":\n return \"Not a screen point\";\n case \"missing-coordinate\":\n return \"Screen point is missing x or y\";\n case \"non-finite-number\":\n return \"Screen point has a non-numeric value\";\n case \"negative-number\":\n return \"Screen point has a negative value\";\n case \"degenerate-basis\":\n return \"Screen point has an invalid screenshot size\";\n case \"out-of-bounds\":\n return \"Screen point lies outside its screenshot\";\n case \"extent-too-large\":\n return \"Screen point value is implausibly large\";\n }\n}\n\n/**\n * Screen points written into a text block, in order. Used by surfaces that\n * work on the raw markdown (the static message body's node parser, the\n * extension's plain-text composer) and by tests. Only the link form is\n * recognised — a bare `(1038, 81)` in prose is text, never a point, so a\n * model that was not taught the scheme changes nothing.\n */\nexport function findScreenPointLinks(\n text: string,\n): Array<{ start: number; end: number; label: string; href: string }> {\n const results: Array<{ start: number; end: number; label: string; href: string }> = [];\n const pattern = /\\[([^\\]\\n]*)\\]\\((athena-point:\\/\\/[^\\s)]*)\\)/g;\n for (const match of text.matchAll(pattern)) {\n if (match.index === undefined) continue;\n results.push({\n start: match.index,\n end: match.index + match[0].length,\n label: match[1],\n href: match[2],\n });\n }\n return results;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const statewireState = require("./statewire-state.cjs");
4
+ const AUTO_RETRY_FATES = /* @__PURE__ */ new Set(["lost", "aborted"]);
5
+ const MAX_AUTO_RETRIES_PER_MESSAGE = 3;
6
+ const MAX_AUTO_RETRY_AGE_MS = 24 * 60 * 60 * 1e3;
7
+ function shouldAutoRetryFailedSend(failure) {
8
+ return failure !== void 0 && AUTO_RETRY_FATES.has(failure.fate);
9
+ }
10
+ function awaitsLostPredecessor(entry) {
11
+ return entry.sendFailure.fate === "aborted" && entry.sendFailure.predecessorLost === true;
12
+ }
13
+ function commandMessageId(update) {
14
+ var _a, _b;
15
+ const first = (_a = update.params) == null ? void 0 : _a[0];
16
+ const id = (_b = first == null ? void 0 : first.message) == null ? void 0 : _b.id;
17
+ return typeof id === "string" ? id : null;
18
+ }
19
+ function createDeepAgentSendRecovery(options) {
20
+ const now = options.now ?? Date.now;
21
+ const schedule = options.schedule ?? ((task) => queueMicrotask(task));
22
+ let disposed = false;
23
+ let hydrated = false;
24
+ let armed = false;
25
+ let sweepScheduled = false;
26
+ const attempts = /* @__PURE__ */ new Map();
27
+ const surfacedSkips = /* @__PURE__ */ new Set();
28
+ const surfacedDeferrals = /* @__PURE__ */ new Set();
29
+ const inFlight = /* @__PURE__ */ new Set();
30
+ const deferred = /* @__PURE__ */ new Set();
31
+ const record = (event, data) => {
32
+ var _a, _b;
33
+ (_b = (_a = options.diagnostics) == null ? void 0 : _a.call(options)) == null ? void 0 : _b.record(event, data);
34
+ };
35
+ const sweep = () => {
36
+ var _a;
37
+ sweepScheduled = false;
38
+ if (disposed || !hydrated || !armed) return;
39
+ const lane = options.lane();
40
+ if (lane === null) return;
41
+ armed = false;
42
+ deferred.clear();
43
+ const stamps = ((_a = options.failureStamps) == null ? void 0 : _a.call(options)) ?? null;
44
+ let lostPredecessorPending = false;
45
+ for (const entry of lane.failed) {
46
+ if (!shouldAutoRetryFailedSend(entry.sendFailure)) continue;
47
+ if (inFlight.has(entry.id)) {
48
+ if (entry.sendFailure.fate === "lost") lostPredecessorPending = true;
49
+ continue;
50
+ }
51
+ if (awaitsLostPredecessor(entry) && (lostPredecessorPending || inFlight.size > 0)) {
52
+ deferred.add(entry.id);
53
+ if (!surfacedDeferrals.has(entry.id)) {
54
+ surfacedDeferrals.add(entry.id);
55
+ record("send-recovery/deferred", { messageId: entry.id });
56
+ }
57
+ continue;
58
+ }
59
+ const isLost = entry.sendFailure.fate === "lost";
60
+ const stamp = stamps == null ? void 0 : stamps.get(entry.id);
61
+ if (stamp !== void 0 && now() - stamp > MAX_AUTO_RETRY_AGE_MS) {
62
+ if (!surfacedSkips.has(entry.id)) {
63
+ surfacedSkips.add(entry.id);
64
+ record("send-recovery/stale", { messageId: entry.id, ageMs: Math.round(now() - stamp) });
65
+ }
66
+ if (isLost) lostPredecessorPending = true;
67
+ continue;
68
+ }
69
+ const attempt = (attempts.get(entry.id) ?? 0) + 1;
70
+ if (attempt > MAX_AUTO_RETRIES_PER_MESSAGE) {
71
+ if (!surfacedSkips.has(entry.id)) {
72
+ surfacedSkips.add(entry.id);
73
+ record("send-recovery/exhausted", { messageId: entry.id });
74
+ }
75
+ if (isLost) lostPredecessorPending = true;
76
+ continue;
77
+ }
78
+ try {
79
+ lane.retryFailed(entry.id);
80
+ attempts.set(entry.id, attempt);
81
+ inFlight.add(entry.id);
82
+ if (isLost) lostPredecessorPending = true;
83
+ record("send-recovery/retry", {
84
+ messageId: entry.id,
85
+ fate: entry.sendFailure.fate,
86
+ attempt
87
+ });
88
+ } catch {
89
+ record("send-recovery/raced", { messageId: entry.id });
90
+ }
91
+ }
92
+ if (deferred.size > 0) armed = true;
93
+ };
94
+ const scheduleSweep = () => {
95
+ if (disposed || sweepScheduled || !hydrated || !armed) return;
96
+ sweepScheduled = true;
97
+ schedule(sweep);
98
+ };
99
+ return {
100
+ observeStateChange(state) {
101
+ if (disposed) return;
102
+ if (!hydrated && statewireState.isDeepAgentStateHydrated(state)) {
103
+ hydrated = true;
104
+ armed = true;
105
+ }
106
+ scheduleSweep();
107
+ },
108
+ observeCommand(update) {
109
+ if (disposed || update.status !== "settled") return;
110
+ const messageId = commandMessageId(update);
111
+ if (messageId !== null) inFlight.delete(messageId);
112
+ if (!shouldAutoRetryFailedSend(update.failure) && deferred.size === 0) return;
113
+ armed = true;
114
+ scheduleSweep();
115
+ },
116
+ observeFailedLaneChange() {
117
+ if (disposed) return;
118
+ armed = true;
119
+ scheduleSweep();
120
+ },
121
+ dispose() {
122
+ disposed = true;
123
+ }
124
+ };
125
+ }
126
+ exports.createDeepAgentSendRecovery = createDeepAgentSendRecovery;
127
+ exports.shouldAutoRetryFailedSend = shouldAutoRetryFailedSend;
128
+ //# sourceMappingURL=send-recovery.cjs.map