@athenaintel/react 0.57.2 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (799) hide show
  1. package/README.md +759 -9
  2. package/dist/agent-runtime/src/addressed-agents.cjs +16 -0
  3. package/dist/agent-runtime/src/addressed-agents.cjs.map +1 -0
  4. package/dist/agent-runtime/src/addressed-agents.d.ts +30 -0
  5. package/dist/agent-runtime/src/addressed-agents.js +16 -0
  6. package/dist/agent-runtime/src/addressed-agents.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-label.cjs +4 -3
  8. package/dist/agent-runtime/src/answer-label.cjs.map +1 -1
  9. package/dist/agent-runtime/src/answer-label.d.ts +13 -6
  10. package/dist/agent-runtime/src/answer-label.js +4 -3
  11. package/dist/agent-runtime/src/answer-label.js.map +1 -1
  12. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -1
  13. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +1 -1
  14. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -1
  15. package/dist/agent-runtime/src/chat-outbox-entry.cjs +101 -0
  16. package/dist/agent-runtime/src/chat-outbox-entry.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-entry.d.ts +99 -0
  18. package/dist/agent-runtime/src/chat-outbox-entry.js +101 -0
  19. package/dist/agent-runtime/src/chat-outbox-entry.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-legacy.cjs +252 -0
  21. package/dist/agent-runtime/src/chat-outbox-legacy.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-legacy.d.ts +96 -0
  23. package/dist/agent-runtime/src/chat-outbox-legacy.js +252 -0
  24. package/dist/agent-runtime/src/chat-outbox-legacy.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox-policy.cjs +30 -0
  26. package/dist/agent-runtime/src/chat-outbox-policy.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox-policy.d.ts +42 -0
  28. package/dist/agent-runtime/src/chat-outbox-policy.js +30 -0
  29. package/dist/agent-runtime/src/chat-outbox-policy.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-outbox-storage.cjs +306 -0
  31. package/dist/agent-runtime/src/chat-outbox-storage.cjs.map +1 -0
  32. package/dist/agent-runtime/src/chat-outbox-storage.d.ts +194 -0
  33. package/dist/agent-runtime/src/chat-outbox-storage.js +306 -0
  34. package/dist/agent-runtime/src/chat-outbox-storage.js.map +1 -0
  35. package/dist/agent-runtime/src/chat-outbox-thread.cjs +21 -94
  36. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -1
  37. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +22 -18
  38. package/dist/agent-runtime/src/chat-outbox-thread.js +21 -94
  39. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -1
  40. package/dist/agent-runtime/src/chat-outbox.cjs +492 -547
  41. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  42. package/dist/agent-runtime/src/chat-outbox.d.ts +110 -142
  43. package/dist/agent-runtime/src/chat-outbox.js +492 -547
  44. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  45. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  46. package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
  47. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  48. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
  49. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  50. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
  51. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
  52. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  53. package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
  54. package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
  55. package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
  56. package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
  57. package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
  58. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  59. package/dist/agent-runtime/src/edit-command.d.ts +1 -1
  60. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  61. package/dist/agent-runtime/src/errors.cjs +1 -0
  62. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  63. package/dist/agent-runtime/src/errors.js +1 -0
  64. package/dist/agent-runtime/src/errors.js.map +1 -1
  65. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
  66. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  67. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
  68. package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
  69. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  70. package/dist/agent-runtime/src/index.d.ts +14 -8
  71. package/dist/agent-runtime/src/lane-follow.cjs +289 -0
  72. package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
  73. package/dist/agent-runtime/src/lane-follow.js +289 -0
  74. package/dist/agent-runtime/src/lane-follow.js.map +1 -0
  75. package/dist/agent-runtime/src/lane-images.cjs +387 -0
  76. package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
  77. package/dist/agent-runtime/src/lane-images.js +387 -0
  78. package/dist/agent-runtime/src/lane-images.js.map +1 -0
  79. package/dist/agent-runtime/src/message-window.js +1 -1
  80. package/dist/agent-runtime/src/messages.cjs +19 -1
  81. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  82. package/dist/agent-runtime/src/messages.d.ts +8 -0
  83. package/dist/agent-runtime/src/messages.js +21 -3
  84. package/dist/agent-runtime/src/messages.js.map +1 -1
  85. package/dist/agent-runtime/src/named-agents.cjs +301 -0
  86. package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
  87. package/dist/agent-runtime/src/named-agents.d.ts +246 -0
  88. package/dist/agent-runtime/src/named-agents.js +301 -0
  89. package/dist/agent-runtime/src/named-agents.js.map +1 -0
  90. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  91. package/dist/agent-runtime/src/offline-status.d.ts +66 -2
  92. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  93. package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
  94. package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
  95. package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
  96. package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
  97. package/dist/agent-runtime/src/queue.cjs +2 -2
  98. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  99. package/dist/agent-runtime/src/queue.d.ts +20 -25
  100. package/dist/agent-runtime/src/queue.js +2 -2
  101. package/dist/agent-runtime/src/queue.js.map +1 -1
  102. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
  103. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  104. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
  105. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
  106. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  107. package/dist/agent-runtime/src/run-send.cjs +54 -0
  108. package/dist/agent-runtime/src/run-send.cjs.map +1 -0
  109. package/dist/agent-runtime/src/run-send.d.ts +51 -0
  110. package/dist/agent-runtime/src/run-send.js +54 -0
  111. package/dist/agent-runtime/src/run-send.js.map +1 -0
  112. package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
  113. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
  114. package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
  115. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
  116. package/dist/agent-runtime/src/runtime.d.ts +9 -5
  117. package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
  118. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
  119. package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
  120. package/dist/agent-runtime/src/sealed-idb.js +64 -0
  121. package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
  122. package/dist/agent-runtime/src/send-recovery.cjs +90 -118
  123. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  124. package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
  125. package/dist/agent-runtime/src/send-recovery.js +90 -118
  126. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  127. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
  128. package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
  129. package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
  130. package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
  131. package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
  132. package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
  133. package/dist/agent-runtime/src/statewire-state.cjs +4 -0
  134. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
  135. package/dist/agent-runtime/src/statewire-state.js +4 -0
  136. package/dist/agent-runtime/src/statewire-state.js.map +1 -1
  137. package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
  138. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  139. package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
  140. package/dist/agent-runtime/src/statewire-transport.js +8 -2
  141. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  142. package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
  143. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
  144. package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
  145. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
  146. package/dist/agent-runtime/src/subagents.cjs +22 -29
  147. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  148. package/dist/agent-runtime/src/subagents.js +23 -30
  149. package/dist/agent-runtime/src/subagents.js.map +1 -1
  150. package/dist/agent-runtime/src/thread-extras.cjs +27 -19
  151. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
  152. package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
  153. package/dist/agent-runtime/src/thread-extras.js +27 -19
  154. package/dist/agent-runtime/src/thread-extras.js.map +1 -1
  155. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
  156. package/dist/agent-runtime/src/tool-metadata.cjs +12 -0
  157. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  158. package/dist/agent-runtime/src/tool-metadata.js +12 -0
  159. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  160. package/dist/agent-runtime/src/tool-names.cjs +21 -0
  161. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  162. package/dist/agent-runtime/src/tool-names.d.ts +8 -0
  163. package/dist/agent-runtime/src/tool-names.js +21 -0
  164. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  165. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
  166. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
  167. package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
  168. package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
  169. package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
  170. package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
  171. package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
  172. package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
  173. package/dist/agent-runtime/src/typed-interrupts.js +48 -0
  174. package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
  175. package/dist/agent-runtime/src/types.d.ts +1 -1
  176. package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
  177. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  178. package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
  179. package/dist/agent-runtime/src/use-conversation-list.js +1 -0
  180. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  181. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
  182. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  183. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +14 -22
  184. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
  185. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  186. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
  187. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  188. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
  189. package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
  190. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  191. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
  192. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  193. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
  194. package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
  195. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  196. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
  197. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  198. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
  199. package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
  200. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  201. package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
  202. package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
  203. package/dist/agent-runtime/src/work-in.d.ts +127 -0
  204. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  205. package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
  206. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  207. package/dist/assets/asset-panel-store.cjs +13 -5
  208. package/dist/assets/asset-panel-store.cjs.map +1 -1
  209. package/dist/assets/asset-panel-store.d.ts +33 -2
  210. package/dist/assets/asset-panel-store.js +13 -5
  211. package/dist/assets/asset-panel-store.js.map +1 -1
  212. package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
  213. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  214. package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
  215. package/dist/auth/AthenaCredentialSourceContext.js +11 -0
  216. package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
  217. package/dist/auth/account-identity.cjs +13 -2
  218. package/dist/auth/account-identity.cjs.map +1 -1
  219. package/dist/auth/account-identity.d.ts +9 -0
  220. package/dist/auth/account-identity.js +13 -2
  221. package/dist/auth/account-identity.js.map +1 -1
  222. package/dist/auth/credential-source.cjs +20 -4
  223. package/dist/auth/credential-source.cjs.map +1 -1
  224. package/dist/auth/credential-source.d.ts +9 -0
  225. package/dist/auth/credential-source.js +20 -4
  226. package/dist/auth/credential-source.js.map +1 -1
  227. package/dist/catalog/chat-pickers.cjs +31 -0
  228. package/dist/catalog/chat-pickers.cjs.map +1 -1
  229. package/dist/catalog/chat-pickers.d.ts +17 -0
  230. package/dist/catalog/chat-pickers.js +33 -2
  231. package/dist/catalog/chat-pickers.js.map +1 -1
  232. package/dist/catalog/runtime-catalog.cjs +63 -3
  233. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  234. package/dist/catalog/runtime-catalog.d.ts +63 -3
  235. package/dist/catalog/runtime-catalog.js +64 -4
  236. package/dist/catalog/runtime-catalog.js.map +1 -1
  237. package/dist/chat/AthenaChat.cjs +290 -97
  238. package/dist/chat/AthenaChat.cjs.map +1 -1
  239. package/dist/chat/AthenaChat.d.ts +80 -4
  240. package/dist/chat/AthenaChat.js +290 -97
  241. package/dist/chat/AthenaChat.js.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.cjs +35 -5
  243. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  244. package/dist/chat/StatewireApprovalCard.d.ts +55 -2
  245. package/dist/chat/StatewireApprovalCard.js +37 -7
  246. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +17 -2
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
  250. package/dist/chat/StatewireQueuedMessages.js +18 -3
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/chat-agent-mentions.cjs +70 -0
  253. package/dist/chat/chat-agent-mentions.cjs.map +1 -0
  254. package/dist/chat/chat-agent-mentions.d.ts +13 -0
  255. package/dist/chat/chat-agent-mentions.js +70 -0
  256. package/dist/chat/chat-agent-mentions.js.map +1 -0
  257. package/dist/chat/composer-actions.cjs +12 -0
  258. package/dist/chat/composer-actions.cjs.map +1 -0
  259. package/dist/chat/composer-actions.d.ts +22 -0
  260. package/dist/chat/composer-actions.js +12 -0
  261. package/dist/chat/composer-actions.js.map +1 -0
  262. package/dist/chat/follow-up-suggestions.cjs +185 -0
  263. package/dist/chat/follow-up-suggestions.cjs.map +1 -0
  264. package/dist/chat/follow-up-suggestions.d.ts +64 -0
  265. package/dist/chat/follow-up-suggestions.js +185 -0
  266. package/dist/chat/follow-up-suggestions.js.map +1 -0
  267. package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
  268. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  269. package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
  270. package/dist/chat/super-grouping/ToolTimeline.js +4 -3
  271. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  272. package/dist/chat/turn-changes.cjs +284 -0
  273. package/dist/chat/turn-changes.cjs.map +1 -0
  274. package/dist/chat/turn-changes.d.ts +130 -0
  275. package/dist/chat/turn-changes.js +284 -0
  276. package/dist/chat/turn-changes.js.map +1 -0
  277. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
  278. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
  279. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
  280. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
  281. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
  282. package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
  283. package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
  284. package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
  285. package/dist/chat/typed-interrupts/approval-cards.js +250 -0
  286. package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
  287. package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
  288. package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
  289. package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
  290. package/dist/chat/typed-interrupts/form-cards.js +289 -0
  291. package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
  292. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
  293. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
  294. package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
  295. package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
  296. package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
  297. package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
  298. package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
  299. package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
  300. package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
  301. package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
  302. package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
  303. package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
  304. package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
  305. package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
  306. package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
  307. package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
  308. package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
  309. package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
  310. package/dist/chat/typed-interrupts/request-file-card.js +159 -0
  311. package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
  312. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
  313. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
  314. package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
  315. package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
  316. package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
  317. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
  318. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
  319. package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
  320. package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
  321. package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
  322. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
  323. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
  324. package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
  325. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
  326. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
  327. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
  328. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
  329. package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
  330. package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
  331. package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
  332. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
  333. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
  334. package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
  335. package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
  336. package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
  337. package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
  338. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
  339. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
  340. package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
  341. package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
  342. package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
  343. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
  344. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
  345. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
  346. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
  347. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
  348. package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
  349. package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
  350. package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
  351. package/dist/chat-ui/composer/composer-named-agents.js +13 -0
  352. package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
  353. package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
  354. package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
  355. package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
  356. package/dist/chat-ui/composer/slash-command-menu.js +143 -0
  357. package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
  358. package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
  359. package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
  360. package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
  361. package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
  362. package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
  363. package/dist/chat-ui/composer/slash-commands.cjs +74 -0
  364. package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
  365. package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
  366. package/dist/chat-ui/composer/slash-commands.js +74 -0
  367. package/dist/chat-ui/composer/slash-commands.js.map +1 -0
  368. package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
  369. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  370. package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
  371. package/dist/chat-ui/composer/tiptap-composer.js +135 -9
  372. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  373. package/dist/chat-ui/index.cjs +3 -0
  374. package/dist/chat-ui/index.cjs.map +1 -1
  375. package/dist/chat-ui/index.d.ts +3 -2
  376. package/dist/chat-ui/index.js +3 -0
  377. package/dist/chat-ui/index.js.map +1 -1
  378. package/dist/chat-ui/mentions/mention-chip.cjs +1 -1
  379. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/mention-chip.js +2 -2
  381. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  382. package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
  383. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  384. package/dist/chat-ui/mentions/mention-extension.js +8 -1
  385. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  386. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
  387. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
  388. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
  389. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +2 -0
  391. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +3 -1
  393. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  394. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
  395. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  396. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
  397. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  398. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +36 -0
  399. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  400. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +42 -0
  401. package/dist/chat-ui/mentions/suggestions/data/api-client.js +36 -0
  402. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  403. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +235 -19
  404. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  405. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
  406. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +236 -20
  407. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  408. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
  409. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
  410. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
  411. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
  412. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  413. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +26 -6
  414. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
  415. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  416. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
  417. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
  418. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
  419. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
  420. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
  421. package/dist/chat-ui/statewire.d.ts +1 -1
  422. package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
  423. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  424. package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
  425. package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
  426. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  427. package/dist/collab/client.cjs +17 -5
  428. package/dist/collab/client.cjs.map +1 -1
  429. package/dist/collab/client.d.ts +22 -7
  430. package/dist/collab/client.js +17 -5
  431. package/dist/collab/client.js.map +1 -1
  432. package/dist/composer/ComposerAttachedReferences.cjs +119 -0
  433. package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
  434. package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
  435. package/dist/composer/ComposerAttachedReferences.js +119 -0
  436. package/dist/composer/ComposerAttachedReferences.js.map +1 -0
  437. package/dist/composer/ComposerNamedAgents.cjs +63 -0
  438. package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
  439. package/dist/composer/ComposerNamedAgents.d.ts +16 -0
  440. package/dist/composer/ComposerNamedAgents.js +63 -0
  441. package/dist/composer/ComposerNamedAgents.js.map +1 -0
  442. package/dist/composer/attached-references.cjs +159 -0
  443. package/dist/composer/attached-references.cjs.map +1 -0
  444. package/dist/composer/attached-references.d.ts +86 -0
  445. package/dist/composer/attached-references.js +159 -0
  446. package/dist/composer/attached-references.js.map +1 -0
  447. package/dist/composer/build-composed-message.cjs +14 -7
  448. package/dist/composer/build-composed-message.cjs.map +1 -1
  449. package/dist/composer/build-composed-message.d.ts +6 -1
  450. package/dist/composer/build-composed-message.js +14 -7
  451. package/dist/composer/build-composed-message.js.map +1 -1
  452. package/dist/composer/composer-handoff.cjs +6 -2
  453. package/dist/composer/composer-handoff.cjs.map +1 -1
  454. package/dist/composer/composer-handoff.d.ts +7 -1
  455. package/dist/composer/composer-handoff.js +6 -2
  456. package/dist/composer/composer-handoff.js.map +1 -1
  457. package/dist/composer/folder-upload.cjs +149 -0
  458. package/dist/composer/folder-upload.cjs.map +1 -0
  459. package/dist/composer/folder-upload.d.ts +79 -0
  460. package/dist/composer/folder-upload.js +149 -0
  461. package/dist/composer/folder-upload.js.map +1 -0
  462. package/dist/composer/index.d.ts +1 -1
  463. package/dist/composer/useAttachToChat.cjs +35 -0
  464. package/dist/composer/useAttachToChat.cjs.map +1 -0
  465. package/dist/composer/useAttachToChat.d.ts +54 -0
  466. package/dist/composer/useAttachToChat.js +35 -0
  467. package/dist/composer/useAttachToChat.js.map +1 -0
  468. package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
  469. package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
  470. package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
  471. package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
  472. package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
  473. package/dist/composer/useFileUpload.cjs +95 -7
  474. package/dist/composer/useFileUpload.cjs.map +1 -1
  475. package/dist/composer/useFileUpload.d.ts +21 -2
  476. package/dist/composer/useFileUpload.js +95 -7
  477. package/dist/composer/useFileUpload.js.map +1 -1
  478. package/dist/data/athena-api-error.cjs +125 -0
  479. package/dist/data/athena-api-error.cjs.map +1 -0
  480. package/dist/data/athena-api-error.d.ts +96 -0
  481. package/dist/data/athena-api-error.js +125 -0
  482. package/dist/data/athena-api-error.js.map +1 -0
  483. package/dist/data/athena-data-client.cjs +106 -0
  484. package/dist/data/athena-data-client.cjs.map +1 -0
  485. package/dist/data/athena-data-client.d.ts +74 -0
  486. package/dist/data/athena-data-client.js +106 -0
  487. package/dist/data/athena-data-client.js.map +1 -0
  488. package/dist/data/athena-member.cjs +93 -0
  489. package/dist/data/athena-member.cjs.map +1 -0
  490. package/dist/data/athena-member.d.ts +125 -0
  491. package/dist/data/athena-member.js +93 -0
  492. package/dist/data/athena-member.js.map +1 -0
  493. package/dist/data/athena-request.cjs +458 -0
  494. package/dist/data/athena-request.cjs.map +1 -0
  495. package/dist/data/athena-request.d.ts +120 -0
  496. package/dist/data/athena-request.js +458 -0
  497. package/dist/data/athena-request.js.map +1 -0
  498. package/dist/data/use-athena-fetch.cjs +14 -0
  499. package/dist/data/use-athena-fetch.cjs.map +1 -0
  500. package/dist/data/use-athena-fetch.d.ts +19 -0
  501. package/dist/data/use-athena-fetch.js +14 -0
  502. package/dist/data/use-athena-fetch.js.map +1 -0
  503. package/dist/data/use-athena-graphql.cjs +66 -0
  504. package/dist/data/use-athena-graphql.cjs.map +1 -0
  505. package/dist/data/use-athena-graphql.d.ts +56 -0
  506. package/dist/data/use-athena-graphql.js +66 -0
  507. package/dist/data/use-athena-graphql.js.map +1 -0
  508. package/dist/data/use-athena-rest.cjs +33 -0
  509. package/dist/data/use-athena-rest.cjs.map +1 -0
  510. package/dist/data/use-athena-rest.d.ts +21 -0
  511. package/dist/data/use-athena-rest.js +33 -0
  512. package/dist/data/use-athena-rest.js.map +1 -0
  513. package/dist/data/use-semantic-query.cjs +44 -0
  514. package/dist/data/use-semantic-query.cjs.map +1 -0
  515. package/dist/data/use-semantic-query.d.ts +92 -0
  516. package/dist/data/use-semantic-query.js +44 -0
  517. package/dist/data/use-semantic-query.js.map +1 -0
  518. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  519. package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
  520. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  521. package/dist/diagnostics/errors.cjs +7 -0
  522. package/dist/diagnostics/errors.cjs.map +1 -1
  523. package/dist/diagnostics/errors.d.ts +7 -0
  524. package/dist/diagnostics/errors.js +7 -0
  525. package/dist/diagnostics/errors.js.map +1 -1
  526. package/dist/index.cjs +155 -11
  527. package/dist/index.cjs.map +1 -1
  528. package/dist/index.d.ts +72 -13
  529. package/dist/index.js +148 -4
  530. package/dist/index.js.map +1 -1
  531. package/dist/keryx-http/src/initial-sync.cjs +64 -16
  532. package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
  533. package/dist/keryx-http/src/initial-sync.d.ts +31 -1
  534. package/dist/keryx-http/src/initial-sync.js +64 -16
  535. package/dist/keryx-http/src/initial-sync.js.map +1 -1
  536. package/dist/keryx-http/src/own-awareness.cjs +20 -0
  537. package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
  538. package/dist/keryx-http/src/own-awareness.d.ts +50 -0
  539. package/dist/keryx-http/src/own-awareness.js +20 -0
  540. package/dist/keryx-http/src/own-awareness.js.map +1 -0
  541. package/dist/keryx-http/src/update-attributions.cjs +26 -1
  542. package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
  543. package/dist/keryx-http/src/update-attributions.d.ts +10 -1
  544. package/dist/keryx-http/src/update-attributions.js +26 -1
  545. package/dist/keryx-http/src/update-attributions.js.map +1 -1
  546. package/dist/offline/chat-outbox.cjs +262 -26
  547. package/dist/offline/chat-outbox.cjs.map +1 -1
  548. package/dist/offline/chat-outbox.d.ts +90 -12
  549. package/dist/offline/chat-outbox.js +263 -27
  550. package/dist/offline/chat-outbox.js.map +1 -1
  551. package/dist/provider/AthenaProvider.cjs +56 -19
  552. package/dist/provider/AthenaProvider.cjs.map +1 -1
  553. package/dist/provider/AthenaProvider.d.ts +24 -8
  554. package/dist/provider/AthenaProvider.js +57 -20
  555. package/dist/provider/AthenaProvider.js.map +1 -1
  556. package/dist/react/package.json.cjs +1 -1
  557. package/dist/react/package.json.js +1 -1
  558. package/dist/references/src/anchors/types.cjs +5 -0
  559. package/dist/references/src/anchors/types.cjs.map +1 -1
  560. package/dist/references/src/anchors/types.js +5 -0
  561. package/dist/references/src/anchors/types.js.map +1 -1
  562. package/dist/references/src/attachable.cjs +149 -0
  563. package/dist/references/src/attachable.cjs.map +1 -0
  564. package/dist/references/src/attachable.d.ts +87 -0
  565. package/dist/references/src/attachable.js +149 -0
  566. package/dist/references/src/attachable.js.map +1 -0
  567. package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
  568. package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
  569. package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
  570. package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
  571. package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
  572. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
  573. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  574. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
  575. package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
  576. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
  577. package/dist/runtime/statewire-plan-mode.cjs +71 -0
  578. package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
  579. package/dist/runtime/statewire-plan-mode.d.ts +88 -0
  580. package/dist/runtime/statewire-plan-mode.js +71 -0
  581. package/dist/runtime/statewire-plan-mode.js.map +1 -0
  582. package/dist/runtime/statewire-run-config.cjs +3 -1
  583. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  584. package/dist/runtime/statewire-run-config.d.ts +7 -0
  585. package/dist/runtime/statewire-run-config.js +3 -1
  586. package/dist/runtime/statewire-run-config.js.map +1 -1
  587. package/dist/runtime/statewire-session-key.cjs +11 -5
  588. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  589. package/dist/runtime/statewire-session-key.d.ts +22 -10
  590. package/dist/runtime/statewire-session-key.js +11 -5
  591. package/dist/runtime/statewire-session-key.js.map +1 -1
  592. package/dist/runtime/useAthenaStatewireRuntime.cjs +65 -8
  593. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  594. package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
  595. package/dist/runtime/useAthenaStatewireRuntime.js +67 -10
  596. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  597. package/dist/search/useAthenaAssets.cjs +394 -0
  598. package/dist/search/useAthenaAssets.cjs.map +1 -0
  599. package/dist/search/useAthenaAssets.d.ts +186 -0
  600. package/dist/search/useAthenaAssets.js +394 -0
  601. package/dist/search/useAthenaAssets.js.map +1 -0
  602. package/dist/sheet-range/index.cjs +4 -0
  603. package/dist/sheet-range/index.cjs.map +1 -1
  604. package/dist/sheet-range/index.d.ts +4 -2
  605. package/dist/sheet-range/index.js +4 -0
  606. package/dist/sheet-range/index.js.map +1 -1
  607. package/dist/sheet-range/query-range.cjs +102 -0
  608. package/dist/sheet-range/query-range.cjs.map +1 -0
  609. package/dist/sheet-range/query-range.d.ts +46 -0
  610. package/dist/sheet-range/query-range.js +102 -0
  611. package/dist/sheet-range/query-range.js.map +1 -0
  612. package/dist/styles.css +1 -1
  613. package/dist/subagents/index.cjs +49 -0
  614. package/dist/subagents/index.cjs.map +1 -0
  615. package/dist/subagents/index.d.ts +16 -0
  616. package/dist/subagents/index.js +49 -0
  617. package/dist/subagents/index.js.map +1 -0
  618. package/dist/subagents/lane-follow.cjs +19 -0
  619. package/dist/subagents/lane-follow.cjs.map +1 -0
  620. package/dist/subagents/lane-follow.d.ts +9 -0
  621. package/dist/subagents/lane-follow.js +19 -0
  622. package/dist/subagents/lane-follow.js.map +1 -0
  623. package/dist/subagents/lane-model.cjs +178 -0
  624. package/dist/subagents/lane-model.cjs.map +1 -0
  625. package/dist/subagents/lane-model.d.ts +140 -0
  626. package/dist/subagents/lane-model.js +178 -0
  627. package/dist/subagents/lane-model.js.map +1 -0
  628. package/dist/subagents/lane-parts.cjs +517 -0
  629. package/dist/subagents/lane-parts.cjs.map +1 -0
  630. package/dist/subagents/lane-parts.d.ts +130 -0
  631. package/dist/subagents/lane-parts.js +517 -0
  632. package/dist/subagents/lane-parts.js.map +1 -0
  633. package/dist/subagents/subagent-lane-group.cjs +215 -0
  634. package/dist/subagents/subagent-lane-group.cjs.map +1 -0
  635. package/dist/subagents/subagent-lane-group.d.ts +67 -0
  636. package/dist/subagents/subagent-lane-group.js +215 -0
  637. package/dist/subagents/subagent-lane-group.js.map +1 -0
  638. package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
  639. package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
  640. package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
  641. package/dist/subagents/subagent-transcript-drawer.js +431 -0
  642. package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
  643. package/dist/subagents/task-subagent-group.cjs +115 -0
  644. package/dist/subagents/task-subagent-group.cjs.map +1 -0
  645. package/dist/subagents/task-subagent-group.d.ts +36 -0
  646. package/dist/subagents/task-subagent-group.js +115 -0
  647. package/dist/subagents/task-subagent-group.js.map +1 -0
  648. package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
  649. package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
  650. package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
  651. package/dist/subagents/use-omitted-images-in-view.js +68 -0
  652. package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
  653. package/dist/threads/Inbox.cjs +2 -2
  654. package/dist/threads/Inbox.cjs.map +1 -1
  655. package/dist/threads/SessionList.cjs +6 -6
  656. package/dist/threads/SessionList.cjs.map +1 -1
  657. package/dist/threads/SessionsPage.cjs +13 -7
  658. package/dist/threads/SessionsPage.cjs.map +1 -1
  659. package/dist/threads/SessionsPage.d.ts +10 -1
  660. package/dist/threads/SessionsPage.js +9 -3
  661. package/dist/threads/SessionsPage.js.map +1 -1
  662. package/dist/threads/session-list-model.cjs.map +1 -1
  663. package/dist/threads/session-list-model.d.ts +2 -1
  664. package/dist/threads/session-list-model.js.map +1 -1
  665. package/dist/threads/session-row-parts.cjs +3 -3
  666. package/dist/threads/session-row-parts.cjs.map +1 -1
  667. package/dist/threads/sessions-page-model.cjs +13 -5
  668. package/dist/threads/sessions-page-model.cjs.map +1 -1
  669. package/dist/threads/sessions-page-model.d.ts +7 -0
  670. package/dist/threads/sessions-page-model.js +11 -3
  671. package/dist/threads/sessions-page-model.js.map +1 -1
  672. package/dist/threads/sessions-page-storage.cjs +8 -8
  673. package/dist/threads/sessions-page-storage.cjs.map +1 -1
  674. package/dist/threads/sessions-page-storage.d.ts +5 -1
  675. package/dist/threads/sessions-page-storage.js +8 -8
  676. package/dist/threads/sessions-page-storage.js.map +1 -1
  677. package/dist/threads/use-athena-sessions.cjs +1 -0
  678. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  679. package/dist/threads/use-athena-sessions.d.ts +7 -0
  680. package/dist/threads/use-athena-sessions.js +1 -0
  681. package/dist/threads/use-athena-sessions.js.map +1 -1
  682. package/dist/threads/use-athena-thread-agent.cjs +31 -0
  683. package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
  684. package/dist/threads/use-athena-thread-agent.d.ts +38 -0
  685. package/dist/threads/use-athena-thread-agent.js +31 -0
  686. package/dist/threads/use-athena-thread-agent.js.map +1 -0
  687. package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
  688. package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
  689. package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
  690. package/dist/threads/use-athena-thread-plan-mode.js +18 -0
  691. package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
  692. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  693. package/dist/tools/agent-creations.cjs +97 -0
  694. package/dist/tools/agent-creations.cjs.map +1 -0
  695. package/dist/tools/agent-creations.d.ts +38 -0
  696. package/dist/tools/agent-creations.js +97 -0
  697. package/dist/tools/agent-creations.js.map +1 -0
  698. package/dist/tools/agent-highlights.cjs +100 -0
  699. package/dist/tools/agent-highlights.cjs.map +1 -0
  700. package/dist/tools/agent-highlights.d.ts +57 -0
  701. package/dist/tools/agent-highlights.js +100 -0
  702. package/dist/tools/agent-highlights.js.map +1 -0
  703. package/dist/tools/append-document-tool-ui.cjs +1 -0
  704. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  705. package/dist/tools/append-document-tool-ui.d.ts +7 -0
  706. package/dist/tools/append-document-tool-ui.js +2 -1
  707. package/dist/tools/append-document-tool-ui.js.map +1 -1
  708. package/dist/tools/auto-open-tools.cjs +144 -71
  709. package/dist/tools/auto-open-tools.cjs.map +1 -1
  710. package/dist/tools/auto-open-tools.d.ts +131 -1
  711. package/dist/tools/auto-open-tools.js +145 -72
  712. package/dist/tools/auto-open-tools.js.map +1 -1
  713. package/dist/tools/browser-tool-uis.cjs +594 -0
  714. package/dist/tools/browser-tool-uis.cjs.map +1 -0
  715. package/dist/tools/browser-tool-uis.d.ts +8 -0
  716. package/dist/tools/browser-tool-uis.js +594 -0
  717. package/dist/tools/browser-tool-uis.js.map +1 -0
  718. package/dist/tools/computer-asset-tool-uis.cjs +313 -0
  719. package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
  720. package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
  721. package/dist/tools/computer-asset-tool-uis.js +313 -0
  722. package/dist/tools/computer-asset-tool-uis.js.map +1 -0
  723. package/dist/tools/document-edit-tool-uis.cjs +218 -0
  724. package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
  725. package/dist/tools/document-edit-tool-uis.d.ts +40 -0
  726. package/dist/tools/document-edit-tool-uis.js +218 -0
  727. package/dist/tools/document-edit-tool-uis.js.map +1 -0
  728. package/dist/tools/drive-tool-uis.cjs +425 -0
  729. package/dist/tools/drive-tool-uis.cjs.map +1 -0
  730. package/dist/tools/drive-tool-uis.d.ts +120 -0
  731. package/dist/tools/drive-tool-uis.js +425 -0
  732. package/dist/tools/drive-tool-uis.js.map +1 -0
  733. package/dist/tools/email-calendar-tool-uis.cjs +789 -0
  734. package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
  735. package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
  736. package/dist/tools/email-calendar-tool-uis.js +789 -0
  737. package/dist/tools/email-calendar-tool-uis.js.map +1 -0
  738. package/dist/tools/ontology-tool-uis.cjs +83 -0
  739. package/dist/tools/ontology-tool-uis.cjs.map +1 -0
  740. package/dist/tools/ontology-tool-uis.d.ts +9 -0
  741. package/dist/tools/ontology-tool-uis.js +83 -0
  742. package/dist/tools/ontology-tool-uis.js.map +1 -0
  743. package/dist/tools/orchestration-tool-uis.cjs +586 -0
  744. package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
  745. package/dist/tools/orchestration-tool-uis.d.ts +141 -0
  746. package/dist/tools/orchestration-tool-uis.js +586 -0
  747. package/dist/tools/orchestration-tool-uis.js.map +1 -0
  748. package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
  749. package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
  750. package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
  751. package/dist/tools/presentation-edit-tool-uis.js +516 -0
  752. package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
  753. package/dist/tools/project-tool-uis.cjs +213 -0
  754. package/dist/tools/project-tool-uis.cjs.map +1 -0
  755. package/dist/tools/project-tool-uis.d.ts +14 -0
  756. package/dist/tools/project-tool-uis.js +213 -0
  757. package/dist/tools/project-tool-uis.js.map +1 -0
  758. package/dist/tools/sandbox-tool-uis.cjs +491 -0
  759. package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
  760. package/dist/tools/sandbox-tool-uis.d.ts +116 -0
  761. package/dist/tools/sandbox-tool-uis.js +491 -0
  762. package/dist/tools/sandbox-tool-uis.js.map +1 -0
  763. package/dist/tools/sheet-query-tool-ui.cjs +138 -0
  764. package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
  765. package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
  766. package/dist/tools/sheet-query-tool-ui.js +138 -0
  767. package/dist/tools/sheet-query-tool-ui.js.map +1 -0
  768. package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
  769. package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
  770. package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
  771. package/dist/tools/studio-screenshot-tool-uis.js +262 -0
  772. package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
  773. package/dist/tools/subagent-task-tool-ui.cjs +24 -475
  774. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  775. package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
  776. package/dist/tools/subagent-task-tool-ui.js +28 -479
  777. package/dist/tools/subagent-task-tool-ui.js.map +1 -1
  778. package/dist/tools/tool-summary.cjs +36 -0
  779. package/dist/tools/tool-summary.cjs.map +1 -1
  780. package/dist/tools/tool-summary.js +36 -0
  781. package/dist/tools/tool-summary.js.map +1 -1
  782. package/dist/tools/tool-uis.cjs +181 -53
  783. package/dist/tools/tool-uis.cjs.map +1 -1
  784. package/dist/tools/tool-uis.d.ts +40 -0
  785. package/dist/tools/tool-uis.js +183 -55
  786. package/dist/tools/tool-uis.js.map +1 -1
  787. package/dist/typed-interrupts/index.cjs +15 -0
  788. package/dist/typed-interrupts/index.cjs.map +1 -0
  789. package/dist/typed-interrupts/index.d.ts +20 -0
  790. package/dist/typed-interrupts/index.js +15 -0
  791. package/dist/typed-interrupts/index.js.map +1 -0
  792. package/dist/workbench/session-workbench-panes.cjs +6 -6
  793. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  794. package/package.json +28 -6
  795. package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
  796. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
  797. package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
  798. package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
  799. package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
@@ -38,13 +38,22 @@ export declare const UPDATE_ATTRIBUTIONS_TRAILER_V1 = 1;
38
38
  /**
39
39
  * Run `run` with every update it writes into `doc` marked with `attributions`. Synchronous only:
40
40
  * the scope ends when `run` returns. Nested scopes restore the outer one.
41
+ *
42
+ * A transaction `run` begins while another transaction's events are delivered (an editor binding
43
+ * writing the fix a remote change needs, from inside that change's observers) is queued by Yjs, and
44
+ * its update is emitted, and sent, after `run` returns. Such a transaction is marked as it begins,
45
+ * so its update carries `attributions` too: a housekeeping write never goes out as the person's.
41
46
  */
42
47
  export declare function runWithDocUpdateAttributions<T>({ doc, attributions, run, }: {
43
48
  doc: object;
44
49
  attributions: readonly UpdateAttribution[];
45
50
  run: () => T;
46
51
  }): T;
47
- /** The attributions the update being written into `doc` right now carries, if any. */
52
+ /**
53
+ * The attributions the update being written into `doc` right now carries, if any: those of the
54
+ * scope that began the transaction whose update `doc` is emitting, else those of the scope open
55
+ * now.
56
+ */
48
57
  export declare function docUpdateAttributions(doc: object): readonly UpdateAttribution[] | undefined;
49
58
  /** The lib0 varUint at `start` in `bytes` and where the next field begins; `null` past the end. */
50
59
  export declare function readVarUint({ bytes, start, }: {
@@ -9,6 +9,27 @@ function docScopes() {
9
9
  const host = globalThis;
10
10
  return host[DOC_SCOPES] ?? (host[DOC_SCOPES] = /* @__PURE__ */ new WeakMap());
11
11
  }
12
+ const TRANSACTION_MARKS = Symbol.for("@athenaintel/keryx-http/update-attribution-transactions");
13
+ function transactionMarks() {
14
+ const host = globalThis;
15
+ return host[TRANSACTION_MARKS] ?? (host[TRANSACTION_MARKS] = { marked: /* @__PURE__ */ new WeakMap(), emitting: /* @__PURE__ */ new WeakMap(), followed: /* @__PURE__ */ new WeakSet() });
16
+ }
17
+ function hasTransactionEvents(doc) {
18
+ const events = doc;
19
+ return typeof events.on === "function" && typeof events.off === "function";
20
+ }
21
+ function markTransactionsBegun(doc, attributions) {
22
+ if (!hasTransactionEvents(doc)) return null;
23
+ const marks = transactionMarks();
24
+ if (!marks.followed.has(doc)) {
25
+ marks.followed.add(doc);
26
+ doc.on("afterTransactionCleanup", (transaction) => marks.emitting.set(doc, transaction));
27
+ doc.on("afterAllTransactions", () => marks.emitting.delete(doc));
28
+ }
29
+ const mark = (transaction) => marks.marked.set(transaction, attributions);
30
+ doc.on("beforeTransaction", mark);
31
+ return () => doc.off("beforeTransaction", mark);
32
+ }
12
33
  function runWithDocUpdateAttributions({
13
34
  doc,
14
35
  attributions,
@@ -17,15 +38,19 @@ function runWithDocUpdateAttributions({
17
38
  const scopes = docScopes();
18
39
  const outer = scopes.get(doc);
19
40
  scopes.set(doc, attributions);
41
+ const stopMarking = markTransactionsBegun(doc, attributions);
20
42
  try {
21
43
  return run();
22
44
  } finally {
45
+ stopMarking == null ? void 0 : stopMarking();
23
46
  if (outer === void 0) scopes.delete(doc);
24
47
  else scopes.set(doc, outer);
25
48
  }
26
49
  }
27
50
  function docUpdateAttributions(doc) {
28
- return docScopes().get(doc);
51
+ const marks = transactionMarks();
52
+ const emitting = marks.emitting.get(doc);
53
+ return (emitting === void 0 ? void 0 : marks.marked.get(emitting)) ?? docScopes().get(doc);
29
54
  }
30
55
  function readVarUint({
31
56
  bytes,
@@ -1 +1 @@
1
- {"version":3,"file":"update-attributions.js","sources":["../../../../keryx-http/src/update-attributions.ts"],"sourcesContent":["/**\n * Attributions one Keryx socket update carries of its own.\n *\n * A Keryx connection's attributions are fixed when its socket opens, so every update a client\n * sends is attributed to the person whose client it is. A write the client makes on its own (the\n * sheet leader re-issuing `=AOP` formulas or re-pushing `=IMPORTRANGE` values, a restored result,\n * an editor binding re-keying what an older binding stored) read as that person's edit and woke\n * \"people only\" subscriptions. Keryx reads a trailer after the update in a sync update message\n * (`readUpdateAttributions` in `patches/@y%2Fhub@0.10.1.patch`): `varUint(1)`, `varUint(n)`, then\n * `n` pairs of `varString` key and value. It accepts only `origin: background`, which it counts as\n * system work (`actorOf` in `keryx/src/compaction-activity.ts`), and the pairs that name a Quick\n * Edit step (`@athenaintel/keryx-http/quick-edit`: `session_id`/`run_kind` on the apply,\n * `quick_edit_undo`/`quick_edit_redo` with `quick_edit_op` on an undo or redo), each value in\n * exactly its shape. A Keryx without that hunk reads the update and ignores the bytes after it, so\n * a trailer never costs an update; a pair it does not allow is dropped and the rest kept.\n *\n * A writer marks its writes by making them inside {@link runWithDocUpdateAttributions} for the\n * doc; the transport's socket ({@link attributingWebSocket}) appends the trailer to each sync\n * update it sends while that scope is open. Both Keryx transports wrap their sockets with it:\n * Olympus's rooms (`KeryxYjsProviderV14`) and `@athenaintel/react/collab`'s `connectGenericDoc`\n * (Midas, the phone's editor page). y-websocket sends a local update from inside the doc's\n * `update` event, which fires inside the write itself, so the trailer always rides on the update\n * the scope wrote. A write made while the socket is closed is not sent then: it reaches Keryx in\n * the reconnect's sync step 2, which can carry no trailer. A transport that hands its socket the\n * room's {@link UnconfirmedAttributedWrites} (`@athenaintel/keryx-http/unconfirmed-update-attributions`)\n * sends each such write ahead of that sync step 2 as its own marked update; without one it stays\n * the person's.\n */\n\n/** One custom attribution, as Keryx stores it on the items an update wrote. */\nexport interface UpdateAttribution {\n k: string;\n v: string;\n}\n\n/** The pair a housekeeping write carries; Agora and Keryx spell it the same way. */\nexport const BACKGROUND_UPDATE_ATTRIBUTIONS: readonly UpdateAttribution[] = [\n { k: 'origin', v: 'background' },\n];\n\n/** The trailer format Keryx reads (`updateAttributionsTrailerV1`). */\nexport const UPDATE_ATTRIBUTIONS_TRAILER_V1 = 1;\n\n/** y-protocols: a sync message, and its update sub-type. */\nconst MESSAGE_SYNC = 0;\nconst MESSAGE_SYNC_UPDATE = 2;\n\n/**\n * The open scopes live on `globalThis`, not in module scope, because two copies of this module can\n * run in one page: `@athenaintel/react` bundles it into its dist (this package is private, so the\n * published SDK must inline it) while a host may import it from this package. A scope a writer\n * opens through one copy must be the one the transport's socket reads through the other.\n */\nconst DOC_SCOPES = Symbol.for('@athenaintel/keryx-http/update-attribution-scopes');\n\ntype DocScopesHost = typeof globalThis & {\n [DOC_SCOPES]?: WeakMap<object, readonly UpdateAttribution[]>;\n};\n\n// process-local: browser-only scopes, each keyed by the doc it guards and cleared in the same synchronous call that set it\nfunction docScopes(): WeakMap<object, readonly UpdateAttribution[]> {\n const host = globalThis as DocScopesHost;\n return (host[DOC_SCOPES] ??= new WeakMap());\n}\n\n/**\n * Run `run` with every update it writes into `doc` marked with `attributions`. Synchronous only:\n * the scope ends when `run` returns. Nested scopes restore the outer one.\n */\nexport function runWithDocUpdateAttributions<T>({\n doc,\n attributions,\n run,\n}: {\n doc: object;\n attributions: readonly UpdateAttribution[];\n run: () => T;\n}): T {\n const scopes = docScopes();\n const outer = scopes.get(doc);\n scopes.set(doc, attributions);\n try {\n return run();\n } finally {\n if (outer === undefined) scopes.delete(doc);\n else scopes.set(doc, outer);\n }\n}\n\n/** The attributions the update being written into `doc` right now carries, if any. */\nexport function docUpdateAttributions(doc: object): readonly UpdateAttribution[] | undefined {\n return docScopes().get(doc);\n}\n\n/** The lib0 varUint at `start` in `bytes` and where the next field begins; `null` past the end. */\nexport function readVarUint({\n bytes,\n start,\n}: {\n bytes: Uint8Array;\n start: number;\n}): { value: number; next: number } | null {\n let value = 0;\n let multiplier = 1;\n for (let pos = start; pos < bytes.length; pos += 1) {\n const byte = bytes[pos];\n if (byte === undefined) return null;\n value += (byte & 0x7f) * multiplier;\n if (byte < 0x80) return { value, next: pos + 1 };\n multiplier *= 0x80;\n if (multiplier > Number.MAX_SAFE_INTEGER) return null;\n }\n return null;\n}\n\n/** Append `value` to `out` as a lib0 varUint. */\nexport function writeVarUint({ out, value }: { out: number[]; value: number }): void {\n let rest = value;\n while (rest > 0x7f) {\n out.push(0x80 | (rest % 0x80));\n rest = Math.floor(rest / 0x80);\n }\n out.push(rest);\n}\n\n/** Exactly one sync update message, with nothing after the update. */\nfunction isBareSyncUpdate(message: Uint8Array): boolean {\n const type = readVarUint({ bytes: message, start: 0 });\n if (type?.value !== MESSAGE_SYNC) return false;\n const syncType = readVarUint({ bytes: message, start: type.next });\n if (syncType?.value !== MESSAGE_SYNC_UPDATE) return false;\n const length = readVarUint({ bytes: message, start: syncType.next });\n return length !== null && length.next + length.value === message.length;\n}\n\n/**\n * `message` with the trailer for `attributions` appended, when it is a bare sync update message;\n * any other message (sync step 1 or 2, awareness, one that already ends in a trailer) is returned\n * as it is.\n */\nexport function withUpdateAttributionsTrailer({\n message,\n attributions,\n}: {\n message: Uint8Array;\n attributions: readonly UpdateAttribution[];\n}): Uint8Array {\n if (attributions.length === 0 || !isBareSyncUpdate(message)) return message;\n const trailer: number[] = [];\n writeVarUint({ out: trailer, value: UPDATE_ATTRIBUTIONS_TRAILER_V1 });\n writeVarUint({ out: trailer, value: attributions.length });\n const utf8 = new TextEncoder();\n for (const { k, v } of attributions) {\n for (const text of [k, v]) {\n const bytes = utf8.encode(text);\n writeVarUint({ out: trailer, value: bytes.length });\n for (const byte of bytes) trailer.push(byte);\n }\n }\n const out = new Uint8Array(message.length + trailer.length);\n out.set(message, 0);\n out.set(trailer, message.length);\n return out;\n}\n\n/** What {@link attributingWebSocket} needs of a socket: the `send` y-websocket writes frames with. */\nexport interface SendingSocket {\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n}\n\n/** One socket of a room, as the room's attributed writes Keryx has not acknowledged see it. */\nexport interface AttributedWritesSocket {\n /** Keryx sent `frame` on the socket: what it carries, Keryx holds. */\n received(frame: Uint8Array): void;\n /** The socket sends `frame` (now, or once Keryx has sent what it holds; see the implementation). */\n send(frame: Uint8Array): void;\n}\n\n/**\n * The room's attributed writes Keryx has not acknowledged yet, as its sockets see them\n * (`UnconfirmedUpdateAttributions` in `@athenaintel/keryx-http/unconfirmed-update-attributions`).\n */\nexport interface UnconfirmedAttributedWrites {\n /**\n * A socket opened, sending through `send`. `hears`: the socket hands it every frame Keryx sends\n * (`received`), ahead of the transport.\n */\n connect(params: { send: (frame: Uint8Array) => void; hears: boolean }): AttributedWritesSocket;\n}\n\n/** The bytes of a binary frame a socket received, or `null` for one that is not (a string, a `Blob`). */\nfunction receivedBytes(data: unknown): Uint8Array | null {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (ArrayBuffer.isView(data))\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n return null;\n}\n\n/**\n * Hands `onFrame` every binary frame `socket` receives; whether it can. A listener added before\n * y-websocket sets `onmessage` runs ahead of it. A socket without `addEventListener` hands nothing.\n */\nfunction listenToFrames({\n socket,\n onFrame,\n}: {\n socket: SendingSocket;\n onFrame: (frame: Uint8Array) => void;\n}): boolean {\n if (!('addEventListener' in socket) || typeof socket.addEventListener !== 'function') {\n return false;\n }\n socket.addEventListener('message', (event: { data?: unknown }) => {\n const frame = receivedBytes(event.data);\n if (frame) onFrame(frame);\n });\n return true;\n}\n\n/**\n * `Base` with `send` appending the trailer of `attributionsFor()` to each sync update it sends.\n * With the room's `unconfirmed` attributed writes, each socket also tells them every frame Keryx\n * sends and sends its frames through them, so a sync step 2 goes out behind the kept writes it\n * carries. A `Proxy` keeps the constructor's statics and type, so it drops in as y-websocket's\n * `WebSocketPolyfill`.\n */\nexport function attributingWebSocket<TBase extends new (...args: never[]) => SendingSocket>({\n Base,\n attributionsFor,\n unconfirmed,\n}: {\n Base: TBase;\n attributionsFor: () => readonly UpdateAttribution[] | undefined;\n unconfirmed?: UnconfirmedAttributedWrites;\n}): TBase {\n // No WebSocket where the provider is built (server render, a test without one): nothing to wrap,\n // and the transport fails at connect as it always did.\n if (typeof Base !== 'function') return Base;\n return new Proxy(Base, {\n construct(target, args) {\n const socket: SendingSocket = Reflect.construct(target, args);\n const send = socket.send.bind(socket);\n let connection: AttributedWritesSocket | null = null;\n if (unconfirmed) {\n const hears = listenToFrames({ socket, onFrame: (frame) => connection?.received(frame) });\n connection = unconfirmed.connect({ send, hears });\n }\n socket.send = (data) => {\n if (!(data instanceof Uint8Array)) {\n send(data);\n return;\n }\n const attributions = attributionsFor();\n const message = attributions\n ? withUpdateAttributionsTrailer({ message: data, attributions })\n : data;\n if (connection) connection.send(message);\n else send(message);\n };\n return socket;\n },\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-attributions.js","sources":["../../../../keryx-http/src/update-attributions.ts"],"sourcesContent":["/**\n * Attributions one Keryx socket update carries of its own.\n *\n * A Keryx connection's attributions are fixed when its socket opens, so every update a client\n * sends is attributed to the person whose client it is. A write the client makes on its own (the\n * sheet leader re-issuing `=AOP` formulas or re-pushing `=IMPORTRANGE` values, a restored result,\n * an editor binding re-keying what an older binding stored) read as that person's edit and woke\n * \"people only\" subscriptions. Keryx reads a trailer after the update in a sync update message\n * (`readUpdateAttributions` in `patches/@y%2Fhub@0.10.1.patch`): `varUint(1)`, `varUint(n)`, then\n * `n` pairs of `varString` key and value. It accepts only `origin: background`, which it counts as\n * system work (`actorOf` in `keryx/src/compaction-activity.ts`), and the pairs that name a Quick\n * Edit step (`@athenaintel/keryx-http/quick-edit`: `session_id`/`run_kind` on the apply,\n * `quick_edit_undo`/`quick_edit_redo` with `quick_edit_op` on an undo or redo), each value in\n * exactly its shape. A Keryx without that hunk reads the update and ignores the bytes after it, so\n * a trailer never costs an update; a pair it does not allow is dropped and the rest kept.\n *\n * A writer marks its writes by making them inside {@link runWithDocUpdateAttributions} for the\n * doc; the transport's socket ({@link attributingWebSocket}) appends the trailer to each sync\n * update it sends while that scope is open. Both Keryx transports wrap their sockets with it:\n * Olympus's rooms (`KeryxYjsProviderV14`) and `@athenaintel/react/collab`'s `connectGenericDoc`\n * (Midas, the phone's editor page). y-websocket sends a local update from inside the doc's\n * `update` event, which fires inside the write itself, so the trailer always rides on the update\n * the scope wrote. A write made while the socket is closed is not sent then: it reaches Keryx in\n * the reconnect's sync step 2, which can carry no trailer. A transport that hands its socket the\n * room's {@link UnconfirmedAttributedWrites} (`@athenaintel/keryx-http/unconfirmed-update-attributions`)\n * sends each such write ahead of that sync step 2 as its own marked update; without one it stays\n * the person's.\n */\n\n/** One custom attribution, as Keryx stores it on the items an update wrote. */\nexport interface UpdateAttribution {\n k: string;\n v: string;\n}\n\n/** The pair a housekeeping write carries; Agora and Keryx spell it the same way. */\nexport const BACKGROUND_UPDATE_ATTRIBUTIONS: readonly UpdateAttribution[] = [\n { k: 'origin', v: 'background' },\n];\n\n/** The trailer format Keryx reads (`updateAttributionsTrailerV1`). */\nexport const UPDATE_ATTRIBUTIONS_TRAILER_V1 = 1;\n\n/** y-protocols: a sync message, and its update sub-type. */\nconst MESSAGE_SYNC = 0;\nconst MESSAGE_SYNC_UPDATE = 2;\n\n/**\n * The open scopes live on `globalThis`, not in module scope, because two copies of this module can\n * run in one page: `@athenaintel/react` bundles it into its dist (this package is private, so the\n * published SDK must inline it) while a host may import it from this package. A scope a writer\n * opens through one copy must be the one the transport's socket reads through the other.\n */\nconst DOC_SCOPES = Symbol.for('@athenaintel/keryx-http/update-attribution-scopes');\n\ntype DocScopesHost = typeof globalThis & {\n [DOC_SCOPES]?: WeakMap<object, readonly UpdateAttribution[]>;\n};\n\n// process-local: browser-only scopes, each keyed by the doc it guards and cleared in the same synchronous call that set it\nfunction docScopes(): WeakMap<object, readonly UpdateAttribution[]> {\n const host = globalThis as DocScopesHost;\n return (host[DOC_SCOPES] ??= new WeakMap());\n}\n\n/**\n * The transactions a scope began, by the attributions their update carries, and the transaction\n * whose update each doc is emitting now: on `globalThis` for the same reason as {@link DOC_SCOPES}.\n */\nconst TRANSACTION_MARKS = Symbol.for('@athenaintel/keryx-http/update-attribution-transactions');\n\ninterface TransactionMarks {\n /** A transaction a scope began, by the attributions its update carries. */\n readonly marked: WeakMap<object, readonly UpdateAttribution[]>;\n /** The transaction whose update each doc emits now (from its cleanup to the end of the drain). */\n readonly emitting: WeakMap<object, object>;\n /** The docs whose emitting transaction is followed. */\n readonly followed: WeakSet<object>;\n}\n\ntype TransactionMarksHost = typeof globalThis & { [TRANSACTION_MARKS]?: TransactionMarks };\n\n// process-local: browser-only, keyed weakly by the doc and its transactions, which drop them with them\nfunction transactionMarks(): TransactionMarks {\n const host = globalThis as TransactionMarksHost;\n return (host[TRANSACTION_MARKS] ??= { marked: new WeakMap(), emitting: new WeakMap(), followed: new WeakSet() });\n}\n\n/** What a scope listens to on a doc: Yjs 13's and `@y/y`'s `on`/`off` alike. */\ninterface TransactionEvents {\n on(name: string, listener: (transaction: object) => void): void;\n off(name: string, listener: (transaction: object) => void): void;\n}\n\nfunction hasTransactionEvents(doc: object): doc is TransactionEvents {\n const events = doc as Partial<TransactionEvents>;\n return typeof events.on === 'function' && typeof events.off === 'function';\n}\n\n/**\n * Mark every transaction of `doc` that begins until the returned function is called with\n * `attributions`, and follow which transaction's update `doc` emits. Yjs emits a transaction's\n * update right after its `afterTransactionCleanup`, and sends none outside a drain.\n */\nfunction markTransactionsBegun(doc: object, attributions: readonly UpdateAttribution[]): (() => void) | null {\n if (!hasTransactionEvents(doc)) return null;\n const marks = transactionMarks();\n if (!marks.followed.has(doc)) {\n marks.followed.add(doc);\n doc.on('afterTransactionCleanup', (transaction) => marks.emitting.set(doc, transaction));\n doc.on('afterAllTransactions', () => marks.emitting.delete(doc));\n }\n const mark = (transaction: object) => marks.marked.set(transaction, attributions);\n doc.on('beforeTransaction', mark);\n return () => doc.off('beforeTransaction', mark);\n}\n\n/**\n * Run `run` with every update it writes into `doc` marked with `attributions`. Synchronous only:\n * the scope ends when `run` returns. Nested scopes restore the outer one.\n *\n * A transaction `run` begins while another transaction's events are delivered (an editor binding\n * writing the fix a remote change needs, from inside that change's observers) is queued by Yjs, and\n * its update is emitted, and sent, after `run` returns. Such a transaction is marked as it begins,\n * so its update carries `attributions` too: a housekeeping write never goes out as the person's.\n */\nexport function runWithDocUpdateAttributions<T>({\n doc,\n attributions,\n run,\n}: {\n doc: object;\n attributions: readonly UpdateAttribution[];\n run: () => T;\n}): T {\n const scopes = docScopes();\n const outer = scopes.get(doc);\n scopes.set(doc, attributions);\n const stopMarking = markTransactionsBegun(doc, attributions);\n try {\n return run();\n } finally {\n stopMarking?.();\n if (outer === undefined) scopes.delete(doc);\n else scopes.set(doc, outer);\n }\n}\n\n/**\n * The attributions the update being written into `doc` right now carries, if any: those of the\n * scope that began the transaction whose update `doc` is emitting, else those of the scope open\n * now.\n */\nexport function docUpdateAttributions(doc: object): readonly UpdateAttribution[] | undefined {\n const marks = transactionMarks();\n const emitting = marks.emitting.get(doc);\n return (emitting === undefined ? undefined : marks.marked.get(emitting)) ?? docScopes().get(doc);\n}\n\n/** The lib0 varUint at `start` in `bytes` and where the next field begins; `null` past the end. */\nexport function readVarUint({\n bytes,\n start,\n}: {\n bytes: Uint8Array;\n start: number;\n}): { value: number; next: number } | null {\n let value = 0;\n let multiplier = 1;\n for (let pos = start; pos < bytes.length; pos += 1) {\n const byte = bytes[pos];\n if (byte === undefined) return null;\n value += (byte & 0x7f) * multiplier;\n if (byte < 0x80) return { value, next: pos + 1 };\n multiplier *= 0x80;\n if (multiplier > Number.MAX_SAFE_INTEGER) return null;\n }\n return null;\n}\n\n/** Append `value` to `out` as a lib0 varUint. */\nexport function writeVarUint({ out, value }: { out: number[]; value: number }): void {\n let rest = value;\n while (rest > 0x7f) {\n out.push(0x80 | (rest % 0x80));\n rest = Math.floor(rest / 0x80);\n }\n out.push(rest);\n}\n\n/** Exactly one sync update message, with nothing after the update. */\nfunction isBareSyncUpdate(message: Uint8Array): boolean {\n const type = readVarUint({ bytes: message, start: 0 });\n if (type?.value !== MESSAGE_SYNC) return false;\n const syncType = readVarUint({ bytes: message, start: type.next });\n if (syncType?.value !== MESSAGE_SYNC_UPDATE) return false;\n const length = readVarUint({ bytes: message, start: syncType.next });\n return length !== null && length.next + length.value === message.length;\n}\n\n/**\n * `message` with the trailer for `attributions` appended, when it is a bare sync update message;\n * any other message (sync step 1 or 2, awareness, one that already ends in a trailer) is returned\n * as it is.\n */\nexport function withUpdateAttributionsTrailer({\n message,\n attributions,\n}: {\n message: Uint8Array;\n attributions: readonly UpdateAttribution[];\n}): Uint8Array {\n if (attributions.length === 0 || !isBareSyncUpdate(message)) return message;\n const trailer: number[] = [];\n writeVarUint({ out: trailer, value: UPDATE_ATTRIBUTIONS_TRAILER_V1 });\n writeVarUint({ out: trailer, value: attributions.length });\n const utf8 = new TextEncoder();\n for (const { k, v } of attributions) {\n for (const text of [k, v]) {\n const bytes = utf8.encode(text);\n writeVarUint({ out: trailer, value: bytes.length });\n for (const byte of bytes) trailer.push(byte);\n }\n }\n const out = new Uint8Array(message.length + trailer.length);\n out.set(message, 0);\n out.set(trailer, message.length);\n return out;\n}\n\n/** What {@link attributingWebSocket} needs of a socket: the `send` y-websocket writes frames with. */\nexport interface SendingSocket {\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n}\n\n/** One socket of a room, as the room's attributed writes Keryx has not acknowledged see it. */\nexport interface AttributedWritesSocket {\n /** Keryx sent `frame` on the socket: what it carries, Keryx holds. */\n received(frame: Uint8Array): void;\n /** The socket sends `frame` (now, or once Keryx has sent what it holds; see the implementation). */\n send(frame: Uint8Array): void;\n}\n\n/**\n * The room's attributed writes Keryx has not acknowledged yet, as its sockets see them\n * (`UnconfirmedUpdateAttributions` in `@athenaintel/keryx-http/unconfirmed-update-attributions`).\n */\nexport interface UnconfirmedAttributedWrites {\n /**\n * A socket opened, sending through `send`. `hears`: the socket hands it every frame Keryx sends\n * (`received`), ahead of the transport.\n */\n connect(params: { send: (frame: Uint8Array) => void; hears: boolean }): AttributedWritesSocket;\n}\n\n/** The bytes of a binary frame a socket received, or `null` for one that is not (a string, a `Blob`). */\nfunction receivedBytes(data: unknown): Uint8Array | null {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (ArrayBuffer.isView(data))\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n return null;\n}\n\n/**\n * Hands `onFrame` every binary frame `socket` receives; whether it can. A listener added before\n * y-websocket sets `onmessage` runs ahead of it. A socket without `addEventListener` hands nothing.\n */\nfunction listenToFrames({\n socket,\n onFrame,\n}: {\n socket: SendingSocket;\n onFrame: (frame: Uint8Array) => void;\n}): boolean {\n if (!('addEventListener' in socket) || typeof socket.addEventListener !== 'function') {\n return false;\n }\n socket.addEventListener('message', (event: { data?: unknown }) => {\n const frame = receivedBytes(event.data);\n if (frame) onFrame(frame);\n });\n return true;\n}\n\n/**\n * `Base` with `send` appending the trailer of `attributionsFor()` to each sync update it sends.\n * With the room's `unconfirmed` attributed writes, each socket also tells them every frame Keryx\n * sends and sends its frames through them, so a sync step 2 goes out behind the kept writes it\n * carries. A `Proxy` keeps the constructor's statics and type, so it drops in as y-websocket's\n * `WebSocketPolyfill`.\n */\nexport function attributingWebSocket<TBase extends new (...args: never[]) => SendingSocket>({\n Base,\n attributionsFor,\n unconfirmed,\n}: {\n Base: TBase;\n attributionsFor: () => readonly UpdateAttribution[] | undefined;\n unconfirmed?: UnconfirmedAttributedWrites;\n}): TBase {\n // No WebSocket where the provider is built (server render, a test without one): nothing to wrap,\n // and the transport fails at connect as it always did.\n if (typeof Base !== 'function') return Base;\n return new Proxy(Base, {\n construct(target, args) {\n const socket: SendingSocket = Reflect.construct(target, args);\n const send = socket.send.bind(socket);\n let connection: AttributedWritesSocket | null = null;\n if (unconfirmed) {\n const hears = listenToFrames({ socket, onFrame: (frame) => connection?.received(frame) });\n connection = unconfirmed.connect({ send, hears });\n }\n socket.send = (data) => {\n if (!(data instanceof Uint8Array)) {\n send(data);\n return;\n }\n const attributions = attributionsFor();\n const message = attributions\n ? withUpdateAttributionsTrailer({ message: data, attributions })\n : data;\n if (connection) connection.send(message);\n else send(message);\n };\n return socket;\n },\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,57 +1,293 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const chatOutboxStore = require("../agent-runtime/src/chat-outbox-store.cjs");
3
+ const chatOutboxStorage = require("../agent-runtime/src/chat-outbox-storage.cjs");
4
4
  const chatOutbox = require("../agent-runtime/src/chat-outbox.cjs");
5
- const ownerStores = /* @__PURE__ */ new Map();
5
+ const chatOutboxLegacy = require("../agent-runtime/src/chat-outbox-legacy.cjs");
6
+ const quotaSafeLocalStorageSession = require("../agent-runtime/src/quota-safe-local-storage-session.cjs");
7
+ async function resolveChatSessionKeeping(owner) {
8
+ const namespace = await owner.namespace;
9
+ if (namespace !== null) {
10
+ const writeKey = await owner.host.current.getKey("write").catch(() => null);
11
+ if (writeKey) return { kind: "sealed", namespace, principal: owner.principal, codec: owner.codec };
12
+ const threads = await threadsKeptSealed(owner, namespace);
13
+ if (threads.size > 0) {
14
+ return {
15
+ kind: "memory",
16
+ scope: owner.memoryScope,
17
+ principal: owner.principal,
18
+ sealedThreads: { namespace, codec: owner.drainCodec, threads }
19
+ };
20
+ }
21
+ }
22
+ return { kind: "memory", scope: owner.memoryScope, principal: owner.principal };
23
+ }
24
+ async function threadsKeptSealed(owner, namespace) {
25
+ const readKey = await owner.host.current.getKey("read").catch(() => null);
26
+ if (!readKey) return /* @__PURE__ */ new Set();
27
+ const listing = await chatOutboxStorage.listChatOutboxes({
28
+ backend: chatOutboxStorage.chatSessionBackend(),
29
+ namespace,
30
+ principal: owner.principal,
31
+ codec: owner.codec
32
+ }).catch(() => EMPTY_LISTING);
33
+ return new Set(
34
+ listing.threads.filter(({ entries }) => entries.length > 0).map(({ threadId }) => threadId)
35
+ );
36
+ }
37
+ const SDK_CHAT_SESSION_ENVIRONMENT = "athena-sdk";
38
+ const owners = /* @__PURE__ */ new Map();
6
39
  function keylessHost(ownerId) {
7
40
  return { ownerId, getKey: async () => null };
8
41
  }
9
- function ownerStore(ownerId, host) {
10
- let owner = ownerStores.get(ownerId);
42
+ function canKeepSealedSessions() {
43
+ return typeof indexedDB !== "undefined" && typeof crypto !== "undefined" && typeof crypto.subtle !== "undefined";
44
+ }
45
+ function memorySource(ownerId) {
46
+ return {
47
+ backend: chatOutboxStorage.chatSessionMemoryBackend(),
48
+ namespace: chatOutboxStorage.chatSessionMemoryNamespace(ownerId),
49
+ principal: quotaSafeLocalStorageSession.sessionPrincipal(ownerId)
50
+ };
51
+ }
52
+ function sealedSource(owner, namespace) {
53
+ return {
54
+ backend: chatOutboxStorage.chatSessionBackend(),
55
+ namespace,
56
+ principal: owner.principal,
57
+ codec: owner.codec,
58
+ legacy: owner.legacy
59
+ };
60
+ }
61
+ const EMPTY_LISTING = { threads: [], unreadable: 0 };
62
+ function mergeListings(a, b) {
63
+ if (b.threads.length === 0 && b.unreadable === 0) return a;
64
+ if (a.threads.length === 0 && a.unreadable === 0) return b;
65
+ const byThread = /* @__PURE__ */ new Map();
66
+ for (const thread of [...a.threads, ...b.threads]) {
67
+ const list = byThread.get(thread.threadId) ?? [];
68
+ for (const entry of thread.entries) if (!list.some(({ id }) => id === entry.id)) list.push(entry);
69
+ byThread.set(thread.threadId, list);
70
+ }
71
+ const threads = [...byThread].map(([threadId, entries]) => ({
72
+ threadId,
73
+ entries: entries.sort((x, y) => x.queuedAt - y.queuedAt)
74
+ })).sort((x, y) => {
75
+ var _a, _b;
76
+ return (((_a = x.entries[0]) == null ? void 0 : _a.queuedAt) ?? 0) - (((_b = y.entries[0]) == null ? void 0 : _b.queuedAt) ?? 0);
77
+ });
78
+ return { threads, unreadable: a.unreadable + b.unreadable };
79
+ }
80
+ function listingSignature(listing) {
81
+ return JSON.stringify([
82
+ listing.unreadable,
83
+ listing.threads.map(({ threadId, entries }) => [
84
+ threadId,
85
+ entries.map(({ id, state, failed, queuedAt, text }) => [id, state, failed, queuedAt, text])
86
+ ])
87
+ ]);
88
+ }
89
+ function mergedDirectory({
90
+ memory,
91
+ sealed
92
+ }) {
93
+ let sealedDirectory = null;
94
+ let cached = null;
95
+ const listeners = /* @__PURE__ */ new Set();
96
+ let stops = [];
97
+ let generation = 0;
98
+ let heard = listingSignature(EMPTY_LISTING);
99
+ const notify = () => {
100
+ const signature = listingSignature(directory.getSnapshot());
101
+ if (signature === heard) return;
102
+ heard = signature;
103
+ for (const listener of [...listeners]) {
104
+ try {
105
+ listener();
106
+ } catch {
107
+ }
108
+ }
109
+ };
110
+ const start = () => {
111
+ const started = ++generation;
112
+ stops.push(memory.subscribe(notify));
113
+ memory.refresh();
114
+ void sealed.then((directory2) => {
115
+ sealedDirectory = directory2;
116
+ if (!directory2 || started !== generation || listeners.size === 0) return;
117
+ stops.push(directory2.subscribe(notify));
118
+ directory2.refresh();
119
+ });
120
+ };
121
+ const directory = {
122
+ getSnapshot() {
123
+ const memorySnapshot = memory.getSnapshot();
124
+ const sealedSnapshot = (sealedDirectory == null ? void 0 : sealedDirectory.getSnapshot()) ?? EMPTY_LISTING;
125
+ if (!cached || cached.memory !== memorySnapshot || cached.sealed !== sealedSnapshot) {
126
+ cached = {
127
+ memory: memorySnapshot,
128
+ sealed: sealedSnapshot,
129
+ merged: mergeListings(sealedSnapshot, memorySnapshot)
130
+ };
131
+ }
132
+ return cached.merged;
133
+ },
134
+ subscribe(listener) {
135
+ listeners.add(listener);
136
+ if (listeners.size === 1) start();
137
+ return () => {
138
+ listeners.delete(listener);
139
+ if (listeners.size === 0) {
140
+ generation += 1;
141
+ for (const stop of stops) stop();
142
+ stops = [];
143
+ }
144
+ };
145
+ },
146
+ refresh() {
147
+ memory.refresh();
148
+ sealedDirectory == null ? void 0 : sealedDirectory.refresh();
149
+ }
150
+ };
151
+ return directory;
152
+ }
153
+ function sessionKeys(current) {
154
+ let keysOf = null;
155
+ const keys = /* @__PURE__ */ new Map();
156
+ const getKey = (purpose) => {
157
+ const host = current.current;
158
+ if (keysOf !== host) {
159
+ keysOf = host;
160
+ keys.clear();
161
+ }
162
+ let key = keys.get(purpose);
163
+ if (!key) {
164
+ const asked = host.getKey(purpose).catch(() => null);
165
+ key = asked;
166
+ keys.set(purpose, asked);
167
+ void asked.then((value) => {
168
+ if (value === null && keys.get(purpose) === asked) keys.delete(purpose);
169
+ });
170
+ }
171
+ return key;
172
+ };
173
+ return { getKey, forget: () => keys.clear() };
174
+ }
175
+ function ownerStorage(ownerId, host) {
176
+ let owner = owners.get(ownerId);
11
177
  if (!owner) {
12
178
  const current = { current: host ?? keylessHost(ownerId) };
179
+ const principal = quotaSafeLocalStorageSession.sessionPrincipal(ownerId);
180
+ const sealedAvailable = canKeepSealedSessions();
181
+ const namespace = sealedAvailable ? chatOutboxStorage.chatSessionNamespace({ environment: SDK_CHAT_SESSION_ENVIRONMENT, ownerId }).then(async (resolved) => {
182
+ await chatOutboxStorage.adoptUnscopedChatSessions({
183
+ backend: chatOutboxStorage.chatSessionBackend(),
184
+ namespace: resolved,
185
+ principal
186
+ }).catch(() => 0);
187
+ return resolved;
188
+ }).catch(() => null) : Promise.resolve(null);
189
+ const keys = sessionKeys(current);
190
+ const codec = chatOutboxStorage.createSealedSessionCodec({ getKey: keys.getKey, scope: ownerId });
191
+ const drainCodec = chatOutboxStorage.createSealedSessionCodec({
192
+ getKey: (purpose) => keys.getKey(purpose === "write" ? "read" : purpose),
193
+ scope: ownerId
194
+ });
195
+ const legacy = chatOutboxLegacy.createLegacyChatOutboxReader({
196
+ ownerId,
197
+ getKey: () => current.current.getKey("read")
198
+ });
199
+ const directory = mergedDirectory({
200
+ memory: chatOutboxStorage.createChatOutboxDirectory(memorySource(ownerId)),
201
+ sealed: namespace.then(
202
+ (resolved) => resolved === null ? null : chatOutboxStorage.createChatOutboxDirectory(sealedSource({ codec, legacy, principal }, resolved))
203
+ )
204
+ });
13
205
  owner = {
206
+ ownerId,
207
+ principal,
208
+ codec,
209
+ drainCodec,
210
+ legacy,
211
+ namespace,
212
+ memoryScope: ownerId,
14
213
  host: current,
15
- store: chatOutboxStore.createIndexedDbChatOutboxStore({
16
- ownerId,
17
- getKey: (_ownerId, purpose) => current.current.getKey(purpose)
18
- })
214
+ directory,
215
+ forgetKeys: keys.forget
19
216
  };
20
- ownerStores.set(ownerId, owner);
217
+ owners.set(ownerId, owner);
21
218
  }
22
219
  if (host) owner.host.current = host;
23
- return owner.store;
220
+ return owner;
221
+ }
222
+ function chatOutboxStorageFor(host) {
223
+ return ownerStorage(host.ownerId, host);
24
224
  }
25
- function chatOutboxStoreFor(host) {
26
- return ownerStore(host.ownerId, host);
225
+ async function sealedSourceOf(owner) {
226
+ const namespace = await owner.namespace;
227
+ return namespace === null ? null : sealedSource(owner, namespace);
27
228
  }
28
- function countChatOutboxMessages(ownerId) {
29
- return ownerStore(ownerId).count();
229
+ async function countChatOutboxMessages(ownerId) {
230
+ const owner = ownerStorage(ownerId);
231
+ const sealed = await sealedSourceOf(owner);
232
+ const [kept, inMemory] = await Promise.all([
233
+ sealed ? chatOutboxStorage.countChatOutboxMessages(sealed) : 0,
234
+ chatOutboxStorage.countChatOutboxMessages(memorySource(ownerId))
235
+ ]);
236
+ return kept + inMemory;
30
237
  }
31
238
  function subscribeChatOutbox(ownerId, listener) {
32
- return ownerStore(ownerId).subscribe(listener);
239
+ return ownerStorage(ownerId).directory.subscribe(listener);
33
240
  }
34
- async function listChatOutboxMessages(ownerId, now = Date.now()) {
35
- const records = await ownerStore(ownerId).listAll();
36
- return records.map(({ entry, claim, failure, memoryOnly }) => ({
241
+ function summaryOf(entry, { inMemory, now }) {
242
+ return {
37
243
  id: entry.id,
38
244
  threadId: entry.threadId,
39
245
  text: entry.text,
40
246
  newChat: entry.newChat,
41
- status: failure ? "failed" : claim && now - claim.at < chatOutbox.CHAT_OUTBOX_CLAIM_LEASE_MS ? "sending" : now - entry.queuedAt > chatOutbox.CHAT_OUTBOX_ASK_AFTER_MS ? "ask" : "waiting",
42
- inMemory: memoryOnly === true
43
- }));
247
+ status: entry.failed ? "failed" : entry.state !== void 0 && entry.state !== "held" ? "sending" : now - entry.queuedAt > chatOutbox.CHAT_OUTBOX_ASK_AFTER_MS ? "ask" : "waiting",
248
+ inMemory,
249
+ queuedAt: entry.queuedAt
250
+ };
251
+ }
252
+ async function listChatOutboxMessages(ownerId, now = Date.now()) {
253
+ const owner = ownerStorage(ownerId);
254
+ const sealed = await sealedSourceOf(owner);
255
+ const [kept, inMemory] = await Promise.all([
256
+ sealed ? chatOutboxStorage.listChatOutboxes(sealed) : EMPTY_LISTING,
257
+ chatOutboxStorage.listChatOutboxes(memorySource(ownerId))
258
+ ]);
259
+ const summaries = [
260
+ ...kept.threads.flatMap(
261
+ ({ entries }) => entries.map((entry) => summaryOf(entry, { inMemory: false, now }))
262
+ ),
263
+ ...inMemory.threads.flatMap(
264
+ ({ entries }) => entries.map((entry) => summaryOf(entry, { inMemory: true, now }))
265
+ )
266
+ ];
267
+ return summaries.sort((a, b) => a.queuedAt - b.queuedAt);
44
268
  }
45
- function clearChatOutbox(ownerId) {
46
- return ownerStore(ownerId).clear();
269
+ async function clearChatOutbox(ownerId) {
270
+ const owner = ownerStorage(ownerId);
271
+ const sealed = await sealedSourceOf(owner);
272
+ owner.forgetKeys();
273
+ if (sealed) await chatOutboxStorage.clearChatOutboxes(sealed);
274
+ else await owner.legacy.clear();
275
+ await chatOutboxStorage.clearChatOutboxes(memorySource(ownerId));
276
+ owner.directory.refresh();
47
277
  }
48
- function clearUnopenableChatOutbox(ownerId) {
49
- return chatOutboxStore.createIndexedDbChatOutboxStore({ ownerId, getKey: async () => null }).clear();
278
+ async function clearUnopenableChatOutbox(ownerId) {
279
+ const owner = ownerStorage(ownerId);
280
+ owner.forgetKeys();
281
+ const sealed = await sealedSourceOf(owner);
282
+ if (sealed) await chatOutboxStorage.clearChatOutboxes(sealed);
283
+ else await owner.legacy.clear();
284
+ owner.directory.refresh();
50
285
  }
51
- exports.chatOutboxStoreFor = chatOutboxStoreFor;
286
+ exports.chatOutboxStorageFor = chatOutboxStorageFor;
52
287
  exports.clearChatOutbox = clearChatOutbox;
53
288
  exports.clearUnopenableChatOutbox = clearUnopenableChatOutbox;
54
289
  exports.countChatOutboxMessages = countChatOutboxMessages;
55
290
  exports.listChatOutboxMessages = listChatOutboxMessages;
291
+ exports.resolveChatSessionKeeping = resolveChatSessionKeeping;
56
292
  exports.subscribeChatOutbox = subscribeChatOutbox;
57
293
  //# sourceMappingURL=chat-outbox.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-outbox.cjs","sources":["../../src/offline/chat-outbox.ts"],"sourcesContent":["import {\n CHAT_OUTBOX_ASK_AFTER_MS,\n CHAT_OUTBOX_CLAIM_LEASE_MS,\n type ChatOutboxKeyPurpose,\n type ChatOutboxSignal,\n type ChatOutboxStore,\n createIndexedDbChatOutboxStore,\n} from '@athenaintel/agent-runtime';\n\n/**\n * Opt-in: messages typed while Athena can't be reached wait on this device, sealed with the host's\n * key, and are sent once Athena is back while the app is in front, after a countdown the person\n * can cancel (`@athenaintel/agent-runtime`'s chat outbox, shown at the top of the queue tray).\n * Without it a send goes to the transport as before.\n *\n * - `ownerId` names whose they are (the signed-in person, with the environment). Another owner's\n * messages are never shown or sent: each owner's are sealed under their own key.\n * - `getKey(purpose)` returns the AES-GCM key: `read` opens what is kept (the key if one exists,\n * never made for this), `write` keeps a new message (only while the deployment lets devices keep\n * copies). `null` keeps a new message in memory only, for as long as the page stays open. Unlike\n * the chat history's, this key guards the only copy of what someone wrote: a host must never\n * replace or drop it except at a sign-out the person chose.\n * - `reachability` says Athena can be reached: the host's own model (the device online AND agora\n * answering a health read, as Midas's main process decides it), by default the browser being\n * online. Either way a conversation whose own channel keeps failing to connect counts as out of\n * reach too.\n * - `foreground` says the app is in front; by default a visible document. A desktop host passes\n * `windowInFrontSignal()` (visible and focused).\n * - `openThread` opens another of the person's conversations the tray lists as holding waiting\n * messages (`newChat`: one that never started). Without it, a provider with a thread list\n * switches to it; otherwise the tray names it without Open.\n */\nexport interface AthenaChatOutbox {\n ownerId: string;\n getKey: (purpose: ChatOutboxKeyPurpose) => Promise<CryptoKey | null>;\n reachability?: ChatOutboxSignal;\n foreground?: ChatOutboxSignal;\n openThread?: (target: { threadId: string; newChat: boolean }) => void;\n}\n\ninterface OwnerStore {\n store: ChatOutboxStore;\n /** The latest host for this owner: the store asks it for the key. */\n host: { current: AthenaChatOutbox };\n}\n\n// process-local: one store per owner in this page, so every provider of the person (a chat in a\n// tab, another in a pane) shares one change bus and one memory of the messages this device could\n// not keep: a thread switch or a closed tab never loses them, and a sign-out counts them.\nconst ownerStores = new Map<string, OwnerStore>();\n\n/** A host that has no key to give (counting and deleting never need one). */\nfunction keylessHost(ownerId: string): AthenaChatOutbox {\n return { ownerId, getKey: async () => null };\n}\n\nfunction ownerStore(ownerId: string, host?: AthenaChatOutbox): ChatOutboxStore {\n let owner = ownerStores.get(ownerId);\n if (!owner) {\n const current = { current: host ?? keylessHost(ownerId) };\n owner = {\n host: current,\n store: createIndexedDbChatOutboxStore({\n ownerId,\n getKey: (_ownerId, purpose) => current.current.getKey(purpose),\n }),\n };\n ownerStores.set(ownerId, owner);\n }\n if (host) owner.host.current = host;\n return owner.store;\n}\n\n/** The page's chat outbox store for `host`'s owner, made on first use. */\nexport function chatOutboxStoreFor(host: AthenaChatOutbox): ChatOutboxStore {\n return ownerStore(host.ownerId, host);\n}\n\n/**\n * How many messages wait for `ownerId` (kept on the device, including records this build cannot\n * open, and waiting in this page's memory), counted without opening them. Rejects when the\n * device's records cannot be counted at all.\n */\nexport function countChatOutboxMessages(ownerId: string): Promise<number> {\n return ownerStore(ownerId).count();\n}\n\n/**\n * Calls `listener` after any change to `ownerId`'s waiting messages, this window's or another's\n * (one kept, handed to its conversation, cancelled, failed or retried), so a host can show how many\n * wait (`countChatOutboxMessages`) without asking on a timer. Returns what stops it.\n */\nexport function subscribeChatOutbox(ownerId: string, listener: () => void): () => void {\n return ownerStore(ownerId).subscribe(listener);\n}\n\n/** A message waiting in an owner's outbox, as a host lists it (its \"Waiting to sync\" list). */\nexport interface ChatOutboxMessageSummary {\n id: string;\n threadId: string;\n /** The text as it will be sent. */\n text: string;\n /** Typed into a chat that had never started. */\n newChat: boolean;\n /**\n * Where it stands, as the queue tray shows it: waiting to be sent, being handed to its\n * conversation now (a window's claim on it still holds), waiting for the person (it waited more\n * than a day: Send, Edit or Discard), or failed (Retry or Discard; never retried on its own).\n */\n status: 'waiting' | 'sending' | 'ask' | 'failed';\n /** Kept only in this page's memory: this device could not keep it. */\n inMemory: boolean;\n}\n\n/**\n * The messages waiting for `ownerId` that this page can open (oldest first), each with where it\n * stands, for a host's list of what waits to sync; the tray in the conversation acts on them.\n * Records this page cannot open (no key here, a newer build's) are left out, so a host counts with\n * `countChatOutboxMessages`.\n */\nexport async function listChatOutboxMessages(\n ownerId: string,\n now: number = Date.now(),\n): Promise<ChatOutboxMessageSummary[]> {\n const records = await ownerStore(ownerId).listAll();\n return records.map(({ entry, claim, failure, memoryOnly }) => ({\n id: entry.id,\n threadId: entry.threadId,\n text: entry.text,\n newChat: entry.newChat,\n status: failure\n ? 'failed'\n : claim && now - claim.at < CHAT_OUTBOX_CLAIM_LEASE_MS\n ? 'sending'\n : now - entry.queuedAt > CHAT_OUTBOX_ASK_AFTER_MS\n ? 'ask'\n : 'waiting',\n inMemory: memoryOnly === true,\n }));\n}\n\n/** A sign-out the person chose: every message waiting for `ownerId` goes, on the device and in memory. */\nexport function clearChatOutbox(ownerId: string): Promise<void> {\n return ownerStore(ownerId).clear();\n}\n\n/**\n * Deletes the records kept on this device for `ownerId`, never the messages waiting in this page's\n * memory: for a host whose key for them no longer exists (a chosen sign-out deleted it before the\n * page could delete the records), so nothing can ever open them and they must not be counted.\n */\nexport function clearUnopenableChatOutbox(ownerId: string): Promise<void> {\n return createIndexedDbChatOutboxStore({ ownerId, getKey: async () => null }).clear();\n}\n"],"names":["createIndexedDbChatOutboxStore","CHAT_OUTBOX_CLAIM_LEASE_MS","CHAT_OUTBOX_ASK_AFTER_MS"],"mappings":";;;;AAiDA,MAAM,kCAAkB,IAAA;AAGxB,SAAS,YAAY,SAAmC;AACtD,SAAO,EAAE,SAAS,QAAQ,YAAY,KAAA;AACxC;AAEA,SAAS,WAAW,SAAiB,MAA0C;AAC7E,MAAI,QAAQ,YAAY,IAAI,OAAO;AACnC,MAAI,CAAC,OAAO;AACV,UAAM,UAAU,EAAE,SAAS,QAAQ,YAAY,OAAO,EAAA;AACtD,YAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAOA,gBAAAA,+BAA+B;AAAA,QACpC;AAAA,QACA,QAAQ,CAAC,UAAU,YAAY,QAAQ,QAAQ,OAAO,OAAO;AAAA,MAAA,CAC9D;AAAA,IAAA;AAEH,gBAAY,IAAI,SAAS,KAAK;AAAA,EAChC;AACA,MAAI,KAAM,OAAM,KAAK,UAAU;AAC/B,SAAO,MAAM;AACf;AAGO,SAAS,mBAAmB,MAAyC;AAC1E,SAAO,WAAW,KAAK,SAAS,IAAI;AACtC;AAOO,SAAS,wBAAwB,SAAkC;AACxE,SAAO,WAAW,OAAO,EAAE,MAAA;AAC7B;AAOO,SAAS,oBAAoB,SAAiB,UAAkC;AACrF,SAAO,WAAW,OAAO,EAAE,UAAU,QAAQ;AAC/C;AA0BA,eAAsB,uBACpB,SACA,MAAc,KAAK,OACkB;AACrC,QAAM,UAAU,MAAM,WAAW,OAAO,EAAE,QAAA;AAC1C,SAAO,QAAQ,IAAI,CAAC,EAAE,OAAO,OAAO,SAAS,kBAAkB;AAAA,IAC7D,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,QAAQ,UACJ,WACA,SAAS,MAAM,MAAM,KAAKC,WAAAA,6BACxB,YACA,MAAM,MAAM,WAAWC,WAAAA,2BACrB,QACA;AAAA,IACR,UAAU,eAAe;AAAA,EAAA,EACzB;AACJ;AAGO,SAAS,gBAAgB,SAAgC;AAC9D,SAAO,WAAW,OAAO,EAAE,MAAA;AAC7B;AAOO,SAAS,0BAA0B,SAAgC;AACxE,SAAOF,gBAAAA,+BAA+B,EAAE,SAAS,QAAQ,YAAY,KAAA,CAAM,EAAE,MAAA;AAC/E;;;;;;;"}
1
+ {"version":3,"file":"chat-outbox.cjs","sources":["../../src/offline/chat-outbox.ts"],"sourcesContent":["import {\n adoptUnscopedChatSessions,\n CHAT_OUTBOX_ASK_AFTER_MS,\n type ChatOutboxDirectory,\n type ChatOutboxDirectoryThread,\n type ChatOutboxListedEntry,\n type ChatOutboxListing,\n type ChatOutboxSignal,\n type ChatOutboxStorageSource,\n type ChatSessionKeyProvider,\n type ChatSessionKeyPurpose,\n chatSessionBackend,\n chatSessionMemoryBackend,\n chatSessionMemoryNamespace,\n chatSessionNamespace,\n clearChatOutboxes,\n countChatOutboxMessages as countChatOutboxSource,\n createChatOutboxDirectory,\n createLegacyChatOutboxReader,\n createSealedSessionCodec,\n type LegacyChatOutboxReader,\n listChatOutboxes,\n sessionPrincipal,\n} from '@athenaintel/agent-runtime';\n\n/**\n * Opt-in: messages typed while Athena can't be reached wait on this device, sealed with the host's\n * key, and are sent once Athena is back while the app is in front, after a countdown the person\n * can cancel (`@athenaintel/agent-runtime`'s chat outbox, shown at the top of the queue tray).\n * Without it a send goes to the transport as before.\n *\n * - `ownerId` names whose they are (the signed-in person, with the environment). Another owner's\n * messages are never shown or sent: each owner's are sealed under their own key.\n * - `getKey(purpose)` returns the AES-GCM key: `read` opens what is kept (the key if one exists,\n * never made for this), `write` keeps a new message (only while the deployment lets devices keep\n * copies). With no `write` key when a conversation opens, its messages wait in memory only, for\n * as long as the page stays open. Unlike the chat history's, this key guards the only copy of\n * what someone wrote: a host must never replace or drop it except at a sign-out the person chose.\n * - `reachability` says Athena can be reached: the host's own model (the device online AND agora\n * answering a health read, as Midas's main process decides it), by default the browser being\n * online. Either way a conversation whose own channel keeps failing to connect counts as out of\n * reach too.\n * - `foreground` says the app is in front; by default a visible document. A desktop host passes\n * `windowInFrontSignal()` (visible and focused).\n * - `openThread` opens another of the person's conversations the tray lists as holding waiting\n * messages (`newChat`: one that never started). Without it, a provider with a thread list\n * switches to it; otherwise the tray names it without Open.\n */\nexport interface AthenaChatOutbox {\n ownerId: string;\n getKey: ChatSessionKeyProvider;\n reachability?: ChatOutboxSignal;\n foreground?: ChatOutboxSignal;\n openThread?: (target: { threadId: string; newChat: boolean }) => void;\n}\n\n/**\n * Where a conversation's session (and so its waiting messages) lives when the provider keeps a\n * chat outbox: `pending` until the owner's namespace and write key are known, then sealed in\n * IndexedDB, or in page memory where there is no write key (or no IndexedDB).\n */\nexport type AthenaChatSessionKeeping =\n | { kind: 'pending' }\n | {\n kind: 'sealed';\n namespace: string;\n /** The owner's statewire principal ({@link ChatOutboxOwnerStorage.principal}). */\n principal: string;\n codec: ChatOutboxOwnerStorage['codec'];\n }\n | {\n kind: 'memory';\n scope: string;\n /** The owner's statewire principal ({@link ChatOutboxOwnerStorage.principal}). */\n principal: string;\n /**\n * Conversations that already kept messages sealed on this device when the write key went\n * (the deployment stopped letting devices keep copies): they reopen that record with the\n * read key, so what waits there can still be sent, edited or discarded.\n */\n sealedThreads?: {\n namespace: string;\n codec: ChatOutboxOwnerStorage['codec'];\n threads: ReadonlySet<string>;\n };\n };\n\n/**\n * Where `owner`'s conversations keep their sessions now: sealed when this page can keep sealed\n * sessions and the host gives a write key, in memory otherwise.\n */\nexport async function resolveChatSessionKeeping(\n owner: ChatOutboxOwnerStorage,\n): Promise<Exclude<AthenaChatSessionKeeping, { kind: 'pending' }>> {\n const namespace = await owner.namespace;\n if (namespace !== null) {\n const writeKey = await owner.host.current.getKey('write').catch(() => null);\n if (writeKey) return { kind: 'sealed', namespace, principal: owner.principal, codec: owner.codec };\n const threads = await threadsKeptSealed(owner, namespace);\n if (threads.size > 0) {\n return {\n kind: 'memory',\n scope: owner.memoryScope,\n principal: owner.principal,\n sealedThreads: { namespace, codec: owner.drainCodec, threads },\n };\n }\n }\n return { kind: 'memory', scope: owner.memoryScope, principal: owner.principal };\n}\n\n/** Threads whose sealed record holds waiting messages this page can open with the read key. */\nasync function threadsKeptSealed(\n owner: ChatOutboxOwnerStorage,\n namespace: string,\n): Promise<ReadonlySet<string>> {\n const readKey = await owner.host.current.getKey('read').catch(() => null);\n if (!readKey) return new Set();\n const listing = await listChatOutboxes({\n backend: chatSessionBackend(),\n namespace,\n principal: owner.principal,\n codec: owner.codec,\n }).catch(() => EMPTY_LISTING);\n return new Set(\n listing.threads.filter(({ entries }) => entries.length > 0).map(({ threadId }) => threadId),\n );\n}\n\n/** The environment chat sessions of the SDK are kept under (`ownerId` already names the deployment). */\nconst SDK_CHAT_SESSION_ENVIRONMENT = 'athena-sdk';\n\n/**\n * Where one owner's waiting messages live in this page: each conversation's statewire session\n * (sealed in IndexedDB, or in page memory where there is no write key), the previous build's\n * store until each conversation moves its messages over, and one live list of all of them.\n */\nexport interface ChatOutboxOwnerStorage {\n ownerId: string;\n /**\n * The owner's statewire principal (`user:<ownerId>`): the owner is the account the host names,\n * and every session record sits under it (`<namespace><principal>:<threadId>`).\n */\n principal: string;\n /** Seals and opens this owner's session records with the latest host's key. */\n codec: ReturnType<typeof createSealedSessionCodec>;\n /**\n * Reopens a record already kept on the device once there is no write key, rewriting it with the\n * read key only as its waiting messages are sent or discarded (`sealedThreads`).\n */\n drainCodec: ReturnType<typeof createSealedSessionCodec>;\n /** The previous build's sealed store (`athena-chat-outbox:v1`). */\n legacy: LegacyChatOutboxReader;\n /** The owner's sealed-session namespace; `null` where this page cannot keep sealed sessions. */\n namespace: Promise<string | null>;\n /** The page-memory sessions' scope (`ChatSessionStorage({kind: 'memory', scope})`). */\n memoryScope: string;\n /** Every conversation's waiting messages, sealed and in memory. */\n directory: ChatOutboxDirectory;\n /** The latest host of this owner: the codec and the legacy reader ask it for the key. */\n host: { current: AthenaChatOutbox };\n /** Drops the keys the codec kept (a sign-out): the next seal asks the host again. */\n forgetKeys: () => void;\n}\n\n// process-local: one storage per owner in this page, so every provider of the person (a chat in a\n// tab, another in a pane) shares one codec (statewire keys a session by it), one live list and the\n// page-memory sessions of conversations this device could not keep.\nconst owners = new Map<string, ChatOutboxOwnerStorage>();\n\n/** A host that has no key to give (counting and deleting never need one). */\nfunction keylessHost(ownerId: string): AthenaChatOutbox {\n return { ownerId, getKey: async () => null };\n}\n\nfunction canKeepSealedSessions(): boolean {\n return (\n typeof indexedDB !== 'undefined' &&\n typeof crypto !== 'undefined' &&\n typeof crypto.subtle !== 'undefined'\n );\n}\n\nfunction memorySource(ownerId: string): ChatOutboxStorageSource {\n return {\n backend: chatSessionMemoryBackend(),\n namespace: chatSessionMemoryNamespace(ownerId),\n principal: sessionPrincipal(ownerId),\n };\n}\n\nfunction sealedSource(\n owner: Pick<ChatOutboxOwnerStorage, 'codec' | 'legacy' | 'principal'>,\n namespace: string,\n): ChatOutboxStorageSource {\n return {\n backend: chatSessionBackend(),\n namespace,\n principal: owner.principal,\n codec: owner.codec,\n legacy: owner.legacy,\n };\n}\n\nconst EMPTY_LISTING: ChatOutboxListing = { threads: [], unreadable: 0 };\n\n/** Both listings as one: a thread's entries from either, oldest first; threads by their oldest. */\nfunction mergeListings(a: ChatOutboxListing, b: ChatOutboxListing): ChatOutboxListing {\n if (b.threads.length === 0 && b.unreadable === 0) return a;\n if (a.threads.length === 0 && a.unreadable === 0) return b;\n const byThread = new Map<string, ChatOutboxListedEntry[]>();\n for (const thread of [...a.threads, ...b.threads]) {\n const list = byThread.get(thread.threadId) ?? [];\n for (const entry of thread.entries) if (!list.some(({ id }) => id === entry.id)) list.push(entry);\n byThread.set(thread.threadId, list);\n }\n const threads: ChatOutboxDirectoryThread[] = [...byThread]\n .map(([threadId, entries]) => ({\n threadId,\n entries: entries.sort((x, y) => x.queuedAt - y.queuedAt),\n }))\n .sort((x, y) => (x.entries[0]?.queuedAt ?? 0) - (y.entries[0]?.queuedAt ?? 0));\n return { threads, unreadable: a.unreadable + b.unreadable };\n}\n\n/** What a listing shows, as one string: two reads of the same messages compare equal. */\nfunction listingSignature(listing: ChatOutboxListing): string {\n return JSON.stringify([\n listing.unreadable,\n listing.threads.map(({ threadId, entries }) => [\n threadId,\n entries.map(({ id, state, failed, queuedAt, text }) => [id, state, failed, queuedAt, text]),\n ]),\n ]);\n}\n\n/**\n * The sealed directory (once the namespace resolves) and the memory one as one directory, with one\n * snapshot object per pair of inner snapshots.\n */\nfunction mergedDirectory({\n memory,\n sealed,\n}: {\n memory: ChatOutboxDirectory;\n sealed: Promise<ChatOutboxDirectory | null>;\n}): ChatOutboxDirectory {\n let sealedDirectory: ChatOutboxDirectory | null = null;\n let cached: { memory: ChatOutboxListing; sealed: ChatOutboxListing; merged: ChatOutboxListing } | null = null;\n const listeners = new Set<() => void>();\n let stops: (() => void)[] = [];\n let generation = 0;\n // Inner directories hand out a new listing on every read: listeners hear only a change.\n let heard = listingSignature(EMPTY_LISTING);\n const notify = () => {\n const signature = listingSignature(directory.getSnapshot());\n if (signature === heard) return;\n heard = signature;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // A listener's fault never reaches the directory.\n }\n }\n };\n const start = () => {\n const started = ++generation;\n stops.push(memory.subscribe(notify));\n memory.refresh();\n void sealed.then((directory) => {\n sealedDirectory = directory;\n if (!directory || started !== generation || listeners.size === 0) return;\n stops.push(directory.subscribe(notify));\n directory.refresh();\n });\n };\n const directory: ChatOutboxDirectory = {\n getSnapshot() {\n const memorySnapshot = memory.getSnapshot();\n const sealedSnapshot = sealedDirectory?.getSnapshot() ?? EMPTY_LISTING;\n if (!cached || cached.memory !== memorySnapshot || cached.sealed !== sealedSnapshot) {\n cached = {\n memory: memorySnapshot,\n sealed: sealedSnapshot,\n merged: mergeListings(sealedSnapshot, memorySnapshot),\n };\n }\n return cached.merged;\n },\n subscribe(listener) {\n listeners.add(listener);\n if (listeners.size === 1) start();\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n generation += 1;\n for (const stop of stops) stop();\n stops = [];\n }\n };\n },\n refresh() {\n memory.refresh();\n sealedDirectory?.refresh();\n },\n };\n return directory;\n}\n\n/**\n * The key the sealed sessions use, per purpose, asked of the latest host once and kept while that\n * host stays: a session seals its record on every save, and a host that asks its key of another\n * process (the desktop's main) must not be asked on each one. No key is asked again next time.\n */\nfunction sessionKeys(current: { current: AthenaChatOutbox }): {\n getKey: ChatSessionKeyProvider;\n forget: () => void;\n} {\n let keysOf: AthenaChatOutbox | null = null;\n const keys = new Map<ChatSessionKeyPurpose, Promise<CryptoKey | null>>();\n const getKey: ChatSessionKeyProvider = (purpose) => {\n const host = current.current;\n if (keysOf !== host) {\n keysOf = host;\n keys.clear();\n }\n let key = keys.get(purpose);\n if (!key) {\n const asked = host.getKey(purpose).catch(() => null);\n key = asked;\n keys.set(purpose, asked);\n void asked.then((value) => {\n if (value === null && keys.get(purpose) === asked) keys.delete(purpose);\n });\n }\n return key;\n };\n return { getKey, forget: () => keys.clear() };\n}\n\nfunction ownerStorage(ownerId: string, host?: AthenaChatOutbox): ChatOutboxOwnerStorage {\n let owner = owners.get(ownerId);\n if (!owner) {\n const current = { current: host ?? keylessHost(ownerId) };\n const principal = sessionPrincipal(ownerId);\n const sealedAvailable = canKeepSealedSessions();\n // The namespace is the owner's: the records statewire 0.24 kept in it without the principal in\n // the key are theirs, and move under it before anything mounts or lists them.\n const namespace: Promise<string | null> = sealedAvailable\n ? chatSessionNamespace({ environment: SDK_CHAT_SESSION_ENVIRONMENT, ownerId })\n .then(async (resolved) => {\n await adoptUnscopedChatSessions({\n backend: chatSessionBackend(),\n namespace: resolved,\n principal,\n }).catch(() => 0);\n return resolved;\n })\n .catch(() => null)\n : Promise.resolve(null);\n const keys = sessionKeys(current);\n const codec = createSealedSessionCodec({ getKey: keys.getKey, scope: ownerId });\n const drainCodec = createSealedSessionCodec({\n getKey: (purpose) => keys.getKey(purpose === 'write' ? 'read' : purpose),\n scope: ownerId,\n });\n const legacy = createLegacyChatOutboxReader({\n ownerId,\n getKey: () => current.current.getKey('read'),\n });\n const directory = mergedDirectory({\n memory: createChatOutboxDirectory(memorySource(ownerId)),\n sealed: namespace.then((resolved) =>\n resolved === null\n ? null\n : createChatOutboxDirectory(sealedSource({ codec, legacy, principal }, resolved)),\n ),\n });\n owner = {\n ownerId,\n principal,\n codec,\n drainCodec,\n legacy,\n namespace,\n memoryScope: ownerId,\n host: current,\n directory,\n forgetKeys: keys.forget,\n };\n owners.set(ownerId, owner);\n }\n if (host) owner.host.current = host;\n return owner;\n}\n\n/** The page's chat outbox storage for `host`'s owner, made on first use. */\nexport function chatOutboxStorageFor(host: AthenaChatOutbox): ChatOutboxOwnerStorage {\n return ownerStorage(host.ownerId, host);\n}\n\n/** The owner's sealed source, or `null` where this page keeps no sealed sessions. */\nasync function sealedSourceOf(owner: ChatOutboxOwnerStorage): Promise<ChatOutboxStorageSource | null> {\n const namespace = await owner.namespace;\n return namespace === null ? null : sealedSource(owner, namespace);\n}\n\n/**\n * How many messages wait for `ownerId` (kept on the device, including records this build cannot\n * open, and waiting in this page's memory), counted without asking for a key it does not have.\n * Rejects when the device's records cannot be counted at all.\n */\nexport async function countChatOutboxMessages(ownerId: string): Promise<number> {\n const owner = ownerStorage(ownerId);\n const sealed = await sealedSourceOf(owner);\n const [kept, inMemory] = await Promise.all([\n sealed ? countChatOutboxSource(sealed) : 0,\n countChatOutboxSource(memorySource(ownerId)),\n ]);\n return kept + inMemory;\n}\n\n/**\n * Calls `listener` after any change to `ownerId`'s waiting messages, this window's or another's\n * (one kept, handed to its conversation, cancelled, failed or retried), so a host can show how many\n * wait (`countChatOutboxMessages`) without asking on a timer. Returns what stops it.\n */\nexport function subscribeChatOutbox(ownerId: string, listener: () => void): () => void {\n return ownerStorage(ownerId).directory.subscribe(listener);\n}\n\n/** A message waiting in an owner's outbox, as a host lists it (its \"Waiting to sync\" list). */\nexport interface ChatOutboxMessageSummary {\n id: string;\n threadId: string;\n /** The text as it will be sent. */\n text: string;\n /** Typed into a chat that had never started. */\n newChat: boolean;\n /**\n * Where it stands, as the queue tray shows it: waiting to be sent, handed to its conversation\n * (released from the outbox and on its way, or sent and not answered yet), waiting for the person\n * (it waited more than a day: Send, Edit or Discard), or failed (Retry, Edit or Discard; never\n * retried on its own).\n */\n status: 'waiting' | 'sending' | 'ask' | 'failed';\n /** Kept only in this page's memory: this device could not keep it. */\n inMemory: boolean;\n /**\n * When it was typed, or sent where it went at once (epoch ms). A host counts a message `sending`\n * as waiting to sync only once it goes unaccepted for a while (`messageWaitsToSync` in\n * `@athenaintel/agent-runtime/offline-status`): the list holds every send until its answer is\n * written back, an ordinary one on its way included.\n */\n queuedAt: number;\n}\n\nfunction summaryOf(\n entry: ChatOutboxListedEntry,\n { inMemory, now }: { inMemory: boolean; now: number },\n): ChatOutboxMessageSummary {\n return {\n id: entry.id,\n threadId: entry.threadId,\n text: entry.text,\n newChat: entry.newChat,\n status: entry.failed\n ? 'failed'\n : entry.state !== undefined && entry.state !== 'held'\n ? 'sending'\n : now - entry.queuedAt > CHAT_OUTBOX_ASK_AFTER_MS\n ? 'ask'\n : 'waiting',\n inMemory,\n queuedAt: entry.queuedAt,\n };\n}\n\n/**\n * The messages waiting for `ownerId` that this page can open (oldest first), each with where it\n * stands, for a host's list of what waits to sync; the tray in the conversation acts on them.\n * Records this page cannot open (no key here, a newer build's) are left out, so a host counts with\n * `countChatOutboxMessages`.\n */\nexport async function listChatOutboxMessages(\n ownerId: string,\n now: number = Date.now(),\n): Promise<ChatOutboxMessageSummary[]> {\n const owner = ownerStorage(ownerId);\n const sealed = await sealedSourceOf(owner);\n const [kept, inMemory] = await Promise.all([\n sealed ? listChatOutboxes(sealed) : EMPTY_LISTING,\n listChatOutboxes(memorySource(ownerId)),\n ]);\n const summaries = [\n ...kept.threads.flatMap(({ entries }) =>\n entries.map((entry) => summaryOf(entry, { inMemory: false, now })),\n ),\n ...inMemory.threads.flatMap(({ entries }) =>\n entries.map((entry) => summaryOf(entry, { inMemory: true, now })),\n ),\n ];\n return summaries.sort((a, b) => a.queuedAt - b.queuedAt);\n}\n\n/** A sign-out the person chose: every message waiting for `ownerId` goes, on the device and in memory. */\nexport async function clearChatOutbox(ownerId: string): Promise<void> {\n const owner = ownerStorage(ownerId);\n const sealed = await sealedSourceOf(owner);\n owner.forgetKeys();\n if (sealed) await clearChatOutboxes(sealed);\n else await owner.legacy.clear();\n await clearChatOutboxes(memorySource(ownerId));\n owner.directory.refresh();\n}\n\n/**\n * Deletes the records kept on this device for `ownerId`, never the messages waiting in this page's\n * memory: for a host whose key for them no longer exists (a chosen sign-out deleted it before the\n * page could delete the records), so nothing can ever open them and they must not be counted.\n */\nexport async function clearUnopenableChatOutbox(ownerId: string): Promise<void> {\n const owner = ownerStorage(ownerId);\n owner.forgetKeys();\n const sealed = await sealedSourceOf(owner);\n if (sealed) await clearChatOutboxes(sealed);\n else await owner.legacy.clear();\n owner.directory.refresh();\n}\n"],"names":["listChatOutboxes","chatSessionBackend","chatSessionMemoryBackend","chatSessionMemoryNamespace","sessionPrincipal","directory","chatSessionNamespace","adoptUnscopedChatSessions","createSealedSessionCodec","createLegacyChatOutboxReader","createChatOutboxDirectory","countChatOutboxSource","CHAT_OUTBOX_ASK_AFTER_MS","clearChatOutboxes"],"mappings":"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"}