@athenaintel/react 0.41.2 → 0.42.1

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 (451) hide show
  1. package/README.md +108 -9
  2. package/dist/agent-runtime/src/asset-attachment.d.ts +98 -0
  3. package/dist/agent-runtime/src/athena-asset-drag.d.ts +32 -0
  4. package/dist/agent-runtime/src/auth-denial.d.ts +29 -0
  5. package/dist/agent-runtime/src/chat-outbox-attachments.cjs +41 -0
  6. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -0
  7. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +38 -0
  8. package/dist/agent-runtime/src/chat-outbox-attachments.js +41 -0
  9. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -0
  10. package/dist/agent-runtime/src/chat-outbox-signals.cjs +63 -0
  11. package/dist/agent-runtime/src/chat-outbox-signals.cjs.map +1 -0
  12. package/dist/agent-runtime/src/chat-outbox-signals.d.ts +12 -0
  13. package/dist/agent-runtime/src/chat-outbox-signals.js +63 -0
  14. package/dist/agent-runtime/src/chat-outbox-signals.js.map +1 -0
  15. package/dist/agent-runtime/src/chat-outbox-store.cjs +509 -0
  16. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.d.ts +203 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.js +509 -0
  19. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-thread.cjs +136 -0
  21. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +118 -0
  23. package/dist/agent-runtime/src/chat-outbox-thread.js +136 -0
  24. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox.cjs +696 -0
  26. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox.d.ts +285 -0
  28. package/dist/agent-runtime/src/chat-outbox.js +696 -0
  29. package/dist/agent-runtime/src/chat-outbox.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-socket-reachability.d.ts +45 -0
  31. package/dist/agent-runtime/src/client-tool-bridge.d.ts +152 -0
  32. package/dist/agent-runtime/src/client-tools.d.ts +133 -0
  33. package/dist/agent-runtime/src/composer-markdown.cjs +10 -0
  34. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  35. package/dist/agent-runtime/src/composer-markdown.d.ts +108 -0
  36. package/dist/agent-runtime/src/composer-markdown.js +10 -0
  37. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  38. package/dist/agent-runtime/src/config-mutations.d.ts +51 -0
  39. package/dist/agent-runtime/src/conversation-index.d.ts +110 -0
  40. package/dist/agent-runtime/src/conversation-list.d.ts +343 -0
  41. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -2
  42. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  43. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +166 -0
  44. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -2
  45. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  46. package/dist/agent-runtime/src/desktop-handoff.d.ts +139 -0
  47. package/dist/agent-runtime/src/durable-thread-snapshot-cache.cjs +158 -0
  48. package/dist/agent-runtime/src/durable-thread-snapshot-cache.cjs.map +1 -0
  49. package/dist/agent-runtime/src/durable-thread-snapshot-cache.d.ts +60 -0
  50. package/dist/agent-runtime/src/durable-thread-snapshot-cache.js +158 -0
  51. package/dist/agent-runtime/src/durable-thread-snapshot-cache.js.map +1 -0
  52. package/dist/agent-runtime/src/edit-command.d.ts +156 -0
  53. package/dist/agent-runtime/src/errors.d.ts +174 -0
  54. package/dist/agent-runtime/src/execute-output.d.ts +31 -0
  55. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +16 -2
  56. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  57. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +202 -0
  58. package/dist/agent-runtime/src/generated/runconfig-contract.js +16 -2
  59. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  60. package/dist/agent-runtime/src/github-wake-event.d.ts +77 -0
  61. package/dist/agent-runtime/src/index.d.ts +74 -0
  62. package/dist/agent-runtime/src/interrupts.cjs +17 -0
  63. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  64. package/dist/agent-runtime/src/interrupts.d.ts +348 -0
  65. package/dist/agent-runtime/src/interrupts.js +17 -0
  66. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  67. package/dist/agent-runtime/src/lane-follow.d.ts +121 -0
  68. package/dist/agent-runtime/src/lane-history.cjs +209 -0
  69. package/dist/agent-runtime/src/lane-history.cjs.map +1 -0
  70. package/dist/agent-runtime/src/lane-history.d.ts +175 -0
  71. package/dist/agent-runtime/src/lane-history.js +209 -0
  72. package/dist/agent-runtime/src/lane-history.js.map +1 -0
  73. package/dist/agent-runtime/src/lane-images.d.ts +184 -0
  74. package/dist/agent-runtime/src/message-author.d.ts +43 -0
  75. package/dist/agent-runtime/src/message-text.cjs +15 -0
  76. package/dist/agent-runtime/src/message-text.cjs.map +1 -0
  77. package/dist/agent-runtime/src/message-text.d.ts +47 -0
  78. package/dist/agent-runtime/src/message-text.js +15 -0
  79. package/dist/agent-runtime/src/message-text.js.map +1 -0
  80. package/dist/agent-runtime/src/message-window.cjs +15 -1
  81. package/dist/agent-runtime/src/message-window.cjs.map +1 -1
  82. package/dist/agent-runtime/src/message-window.d.ts +159 -0
  83. package/dist/agent-runtime/src/message-window.js +16 -2
  84. package/dist/agent-runtime/src/message-window.js.map +1 -1
  85. package/dist/agent-runtime/src/messages.cjs +88 -4
  86. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  87. package/dist/agent-runtime/src/messages.d.ts +603 -0
  88. package/dist/agent-runtime/src/messages.js +88 -4
  89. package/dist/agent-runtime/src/messages.js.map +1 -1
  90. package/dist/agent-runtime/src/model-context.d.ts +22 -0
  91. package/dist/agent-runtime/src/offline-status.d.ts +157 -0
  92. package/dist/agent-runtime/src/optimistic-content.d.ts +21 -0
  93. package/dist/agent-runtime/src/protocol.cjs +12 -4
  94. package/dist/agent-runtime/src/protocol.cjs.map +1 -1
  95. package/dist/agent-runtime/src/protocol.d.ts +119 -0
  96. package/dist/agent-runtime/src/protocol.js +13 -5
  97. package/dist/agent-runtime/src/protocol.js.map +1 -1
  98. package/dist/agent-runtime/src/ptc-subcalls.d.ts +51 -0
  99. package/dist/agent-runtime/src/queue.d.ts +138 -0
  100. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +154 -0
  101. package/dist/agent-runtime/src/running-tool-placeholder.cjs +11 -0
  102. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -0
  103. package/dist/agent-runtime/src/running-tool-placeholder.d.ts +25 -0
  104. package/dist/agent-runtime/src/running-tool-placeholder.js +11 -0
  105. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -0
  106. package/dist/agent-runtime/src/runtime-messages.d.ts +104 -0
  107. package/dist/agent-runtime/src/screen-point.d.ts +151 -0
  108. package/dist/agent-runtime/src/sealed-idb.cjs +112 -0
  109. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -0
  110. package/dist/agent-runtime/src/sealed-idb.d.ts +106 -0
  111. package/dist/agent-runtime/src/sealed-idb.js +112 -0
  112. package/dist/agent-runtime/src/sealed-idb.js.map +1 -0
  113. package/dist/agent-runtime/src/send-recovery.d.ts +40 -0
  114. package/dist/agent-runtime/src/statewire-attach-observer.d.ts +194 -0
  115. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +74 -0
  116. package/dist/agent-runtime/src/statewire-state.d.ts +29 -0
  117. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  118. package/dist/agent-runtime/src/statewire-suspended.d.ts +27 -0
  119. package/dist/agent-runtime/src/statewire-suspended.js.map +1 -1
  120. package/dist/agent-runtime/src/statewire-transport.d.ts +40 -0
  121. package/dist/agent-runtime/src/streaming-markdown.d.ts +46 -0
  122. package/dist/agent-runtime/src/subagent-transcripts.cjs +209 -0
  123. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -0
  124. package/dist/agent-runtime/src/subagent-transcripts.d.ts +71 -0
  125. package/dist/agent-runtime/src/subagent-transcripts.js +209 -0
  126. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -0
  127. package/dist/agent-runtime/src/subagents.cjs +253 -0
  128. package/dist/agent-runtime/src/subagents.cjs.map +1 -0
  129. package/dist/agent-runtime/src/subagents.d.ts +311 -0
  130. package/dist/agent-runtime/src/subagents.js +253 -0
  131. package/dist/agent-runtime/src/subagents.js.map +1 -0
  132. package/dist/agent-runtime/src/subscription-wake-event.d.ts +111 -0
  133. package/dist/agent-runtime/src/thread-extras.d.ts +43 -0
  134. package/dist/agent-runtime/src/thread-handoff.d.ts +364 -0
  135. package/dist/agent-runtime/src/thread-prewarm-controller.d.ts +76 -0
  136. package/dist/agent-runtime/src/thread-prewarm.d.ts +118 -0
  137. package/dist/agent-runtime/src/thread-snapshot-cache.d.ts +99 -0
  138. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs +329 -0
  139. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs.map +1 -0
  140. package/dist/agent-runtime/src/thread-snapshot-mirror.d.ts +101 -0
  141. package/dist/agent-runtime/src/thread-snapshot-mirror.js +329 -0
  142. package/dist/agent-runtime/src/thread-snapshot-mirror.js.map +1 -0
  143. package/dist/agent-runtime/src/thread-status.d.ts +53 -0
  144. package/dist/agent-runtime/src/tool-metadata.d.ts +146 -0
  145. package/dist/agent-runtime/src/tool-names.cjs +67 -0
  146. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  147. package/dist/agent-runtime/src/tool-names.d.ts +60 -0
  148. package/dist/agent-runtime/src/tool-names.js +68 -1
  149. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  150. package/dist/agent-runtime/src/tool-outputs.d.ts +35 -0
  151. package/dist/agent-runtime/src/tool-result.cjs +1 -0
  152. package/dist/agent-runtime/src/tool-result.cjs.map +1 -1
  153. package/dist/agent-runtime/src/tool-result.d.ts +126 -0
  154. package/dist/agent-runtime/src/tool-result.js +1 -0
  155. package/dist/agent-runtime/src/tool-result.js.map +1 -1
  156. package/dist/agent-runtime/src/types.d.ts +159 -0
  157. package/dist/agent-runtime/src/use-conversation-list.d.ts +76 -0
  158. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +136 -0
  159. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -0
  160. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +64 -0
  161. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +136 -0
  162. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -0
  163. package/dist/agent-runtime/src/use-deep-agent-config.d.ts +169 -0
  164. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +13 -0
  165. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  166. package/dist/agent-runtime/src/use-deep-agent-edit-submit.d.ts +22 -0
  167. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js +13 -0
  168. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
  169. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +20 -2
  170. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  171. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +168 -0
  172. package/dist/agent-runtime/src/use-deep-agent-runtime.js +20 -2
  173. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  174. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +12 -4
  175. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  176. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +320 -0
  177. package/dist/agent-runtime/src/use-deep-agent-thread.js +12 -4
  178. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  179. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +999 -0
  180. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -0
  181. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +409 -0
  182. package/dist/agent-runtime/src/use-deep-agent-voice.js +999 -0
  183. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -0
  184. package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +102 -0
  185. package/dist/agent-runtime/src/use-historical-edit-attachments.d.ts +2 -0
  186. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +84 -0
  187. package/dist/agent-runtime/src/voice-presentation.d.ts +80 -0
  188. package/dist/agent-runtime/src/voice-turn-grouping.d.ts +28 -0
  189. package/dist/agent-runtime/src/voice-wire-types.d.ts +15 -0
  190. package/dist/agent-runtime/src/withdrawn-turns.d.ts +97 -0
  191. package/dist/chat/AthenaChat.cjs +77 -6
  192. package/dist/chat/AthenaChat.cjs.map +1 -1
  193. package/dist/chat/AthenaChat.js +78 -7
  194. package/dist/chat/AthenaChat.js.map +1 -1
  195. package/dist/chat/StatewireApprovalCard.d.ts +1 -1
  196. package/dist/chat/StatewireClientToolBridge.d.ts +1 -1
  197. package/dist/chat/StatewireQueuedMessages.cjs +11 -4
  198. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  199. package/dist/chat/StatewireQueuedMessages.d.ts +1 -1
  200. package/dist/chat/StatewireQueuedMessages.js +11 -4
  201. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  202. package/dist/chat/chat-outbox-rows.cjs +223 -0
  203. package/dist/chat/chat-outbox-rows.cjs.map +1 -0
  204. package/dist/chat/chat-outbox-rows.d.ts +29 -0
  205. package/dist/chat/chat-outbox-rows.js +223 -0
  206. package/dist/chat/chat-outbox-rows.js.map +1 -0
  207. package/dist/chat/statewire-approval.d.ts +1 -1
  208. package/dist/chat/statewire-client-tools.d.ts +1 -1
  209. package/dist/chat/super-grouping/SuperGroupingCard.cjs +3 -1
  210. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  211. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +7 -1
  212. package/dist/chat/super-grouping/SuperGroupingCard.js +3 -1
  213. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  214. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +7 -2
  215. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  216. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +2 -2
  217. package/dist/chat/super-grouping/SuperGroupingTranscript.js +7 -2
  218. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  219. package/dist/chat/super-grouping/activity-timeline.cjs +19 -11
  220. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  221. package/dist/chat/super-grouping/activity-timeline.d.ts +25 -9
  222. package/dist/chat/super-grouping/activity-timeline.js +19 -11
  223. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  224. package/dist/chat/use-statewire-approval-request.cjs +36 -0
  225. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  226. package/dist/chat/use-statewire-approval-request.d.ts +49 -1
  227. package/dist/chat/use-statewire-approval-request.js +39 -3
  228. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  229. package/dist/chat-ui/composer/tiptap-composer.cjs +102 -3
  230. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  231. package/dist/chat-ui/composer/tiptap-composer.d.ts +32 -1
  232. package/dist/chat-ui/composer/tiptap-composer.js +103 -4
  233. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  234. package/dist/chat-ui/header/conversation-history-panel.d.ts +1 -1
  235. package/dist/chat-ui/index.d.ts +1 -1
  236. package/dist/chat-ui/messages/message-components.cjs +15 -0
  237. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  238. package/dist/chat-ui/messages/message-components.js +15 -0
  239. package/dist/chat-ui/messages/message-components.js.map +1 -1
  240. package/dist/chat-ui/messages/runtime-message.d.ts +1 -1
  241. package/dist/chat-ui/messages/statewire-continue-run.d.ts +1 -1
  242. package/dist/chat-ui/messages/user-edit-composer.cjs +15 -2
  243. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  244. package/dist/chat-ui/messages/user-edit-composer.d.ts +4 -2
  245. package/dist/chat-ui/messages/user-edit-composer.js +15 -2
  246. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
  247. package/dist/chat-ui/messages/wake-marker.d.ts +1 -1
  248. package/dist/chat-ui/rich-text/chat-text-schema.cjs +1 -0
  249. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
  250. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +3 -0
  251. package/dist/chat-ui/rich-text/chat-text-schema.js +1 -0
  252. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
  253. package/dist/chat-ui/statewire.cjs +1 -0
  254. package/dist/chat-ui/statewire.cjs.map +1 -1
  255. package/dist/chat-ui/statewire.d.ts +2 -2
  256. package/dist/chat-ui/statewire.js +2 -1
  257. package/dist/chat-ui/thread/statewire-history-edge.d.ts +1 -1
  258. package/dist/composer/AttachmentContext.cjs +8 -4
  259. package/dist/composer/AttachmentContext.cjs.map +1 -1
  260. package/dist/composer/AttachmentContext.d.ts +7 -0
  261. package/dist/composer/AttachmentContext.js +8 -4
  262. package/dist/composer/AttachmentContext.js.map +1 -1
  263. package/dist/composer/build-composed-message.cjs +34 -0
  264. package/dist/composer/build-composed-message.cjs.map +1 -1
  265. package/dist/composer/build-composed-message.d.ts +20 -0
  266. package/dist/composer/build-composed-message.js +35 -1
  267. package/dist/composer/build-composed-message.js.map +1 -1
  268. package/dist/composer/composer-handoff.cjs +39 -2
  269. package/dist/composer/composer-handoff.cjs.map +1 -1
  270. package/dist/composer/composer-handoff.d.ts +28 -3
  271. package/dist/composer/composer-handoff.js +39 -2
  272. package/dist/composer/composer-handoff.js.map +1 -1
  273. package/dist/composer/useAttachFiles.cjs +15 -2
  274. package/dist/composer/useAttachFiles.cjs.map +1 -1
  275. package/dist/composer/useAttachFiles.d.ts +11 -0
  276. package/dist/composer/useAttachFiles.js +15 -2
  277. package/dist/composer/useAttachFiles.js.map +1 -1
  278. package/dist/composer/useSendMessage.cjs.map +1 -1
  279. package/dist/composer/useSendMessage.d.ts +4 -3
  280. package/dist/composer/useSendMessage.js.map +1 -1
  281. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  282. package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
  283. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  284. package/dist/index.cjs +18 -0
  285. package/dist/index.cjs.map +1 -1
  286. package/dist/index.d.ts +15 -6
  287. package/dist/index.js +19 -1
  288. package/dist/index.js.map +1 -1
  289. package/dist/offline/chat-outbox.cjs +57 -0
  290. package/dist/offline/chat-outbox.cjs.map +1 -0
  291. package/dist/offline/chat-outbox.d.ts +80 -0
  292. package/dist/offline/chat-outbox.js +57 -0
  293. package/dist/offline/chat-outbox.js.map +1 -0
  294. package/dist/offline/offline-history.cjs +77 -0
  295. package/dist/offline/offline-history.cjs.map +1 -0
  296. package/dist/offline/offline-history.d.ts +60 -0
  297. package/dist/offline/offline-history.js +77 -0
  298. package/dist/offline/offline-history.js.map +1 -0
  299. package/dist/provider/AthenaProvider.cjs +206 -9
  300. package/dist/provider/AthenaProvider.cjs.map +1 -1
  301. package/dist/provider/AthenaProvider.d.ts +22 -1
  302. package/dist/provider/AthenaProvider.js +207 -10
  303. package/dist/provider/AthenaProvider.js.map +1 -1
  304. package/dist/provider/statewire-window-context.d.ts +1 -1
  305. package/dist/react/package.json.cjs +1 -1
  306. package/dist/react/package.json.js +1 -1
  307. package/dist/references/src/anchors/file-line-range.d.ts +58 -0
  308. package/dist/references/src/anchors/format.d.ts +21 -0
  309. package/dist/references/src/anchors/message-anchors.d.ts +71 -0
  310. package/dist/references/src/anchors/parse.d.ts +8 -0
  311. package/dist/references/src/anchors/registry-contract.d.ts +24 -0
  312. package/dist/references/src/anchors/registry.d.ts +19 -0
  313. package/dist/references/src/anchors/schemas.d.ts +194 -0
  314. package/dist/references/src/anchors/serialize.d.ts +8 -0
  315. package/dist/references/src/anchors/time.d.ts +78 -0
  316. package/dist/references/src/anchors/types.d.ts +474 -0
  317. package/dist/references/src/asset-bounds.d.ts +27 -0
  318. package/dist/references/src/asset-links.d.ts +23 -0
  319. package/dist/references/src/asset-reference.d.ts +16 -0
  320. package/dist/references/src/formats/format-catalog.d.ts +79 -0
  321. package/dist/references/src/formats/markdown/parse-reference-markdown.d.ts +28 -0
  322. package/dist/references/src/formats/markdown/reference-display-name.d.ts +6 -0
  323. package/dist/references/src/formats/object/asset-object.d.ts +9 -0
  324. package/dist/references/src/formats/object/callable-object.d.ts +6 -0
  325. package/dist/references/src/formats/object/decode-reference-object-payload.d.ts +3 -0
  326. package/dist/references/src/formats/object/external-url-object.d.ts +9 -0
  327. package/dist/references/src/formats/object/group-object.d.ts +9 -0
  328. package/dist/references/src/formats/object/navigation-object.d.ts +9 -0
  329. package/dist/references/src/formats/object/parse-reference-object.d.ts +11 -0
  330. package/dist/references/src/formats/object/person-object.d.ts +9 -0
  331. package/dist/references/src/formats/uri/asset-mention-uri.d.ts +9 -0
  332. package/dist/references/src/formats/uri/asset-spaces-url.d.ts +9 -0
  333. package/dist/references/src/formats/uri/callable-mention-uris.d.ts +9 -0
  334. package/dist/references/src/formats/uri/detect-uri-wire.d.ts +9 -0
  335. package/dist/references/src/formats/uri/group-mention-uri.d.ts +12 -0
  336. package/dist/references/src/formats/uri/navigation-spaces-url.d.ts +14 -0
  337. package/dist/references/src/formats/uri/parse-reference-uri.d.ts +20 -0
  338. package/dist/references/src/formats/uri/person-mention-uri.d.ts +9 -0
  339. package/dist/references/src/formats/uri/template-placeholder.d.ts +12 -0
  340. package/dist/references/src/index.d.ts +47 -0
  341. package/dist/references/src/legacy/index.d.ts +14 -0
  342. package/dist/references/src/legacy/pre-reference-asset-url.d.ts +57 -0
  343. package/dist/references/src/legacy/pre-reference-citation-bridge.d.ts +22 -0
  344. package/dist/references/src/legacy/pre-reference-citation.d.ts +138 -0
  345. package/dist/references/src/legacy/pre-reference-external-url.d.ts +31 -0
  346. package/dist/references/src/legacy/pre-reference-format.d.ts +8 -0
  347. package/dist/references/src/legacy/pre-reference-mention.d.ts +27 -0
  348. package/dist/references/src/legacy/pre-reference-object.d.ts +8 -0
  349. package/dist/references/src/legacy/pre-reference-uri.d.ts +12 -0
  350. package/dist/references/src/legacy.d.ts +2 -0
  351. package/dist/references/src/mention-href-patterns.d.ts +19 -0
  352. package/dist/references/src/mention-node/index.d.ts +5 -0
  353. package/dist/references/src/mention-node/mention-node.d.ts +31 -0
  354. package/dist/references/src/mention-node/resolve-node-attrs.d.ts +27 -0
  355. package/dist/references/src/parse-reference.d.ts +23 -0
  356. package/dist/references/src/schemas.d.ts +463 -0
  357. package/dist/references/src/serialize-reference.d.ts +50 -0
  358. package/dist/references/src/sheet-name.d.ts +10 -0
  359. package/dist/references/src/tool-option-schemas.d.ts +597 -0
  360. package/dist/references/src/types.d.ts +125 -0
  361. package/dist/references/src/version-ref.d.ts +30 -0
  362. package/dist/runtime/statewire-lifecycle.d.ts +1 -1
  363. package/dist/runtime/statewire-model-lane.d.ts +1 -1
  364. package/dist/runtime/statewire-server-lane-context.d.ts +1 -1
  365. package/dist/runtime/statewire-session-key.cjs +7 -0
  366. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  367. package/dist/runtime/statewire-session-key.d.ts +16 -0
  368. package/dist/runtime/statewire-session-key.js +8 -1
  369. package/dist/runtime/statewire-session-key.js.map +1 -1
  370. package/dist/runtime/statewire-session-lane.cjs +48 -0
  371. package/dist/runtime/statewire-session-lane.cjs.map +1 -0
  372. package/dist/runtime/statewire-session-lane.d.ts +29 -0
  373. package/dist/runtime/statewire-session-lane.js +48 -0
  374. package/dist/runtime/statewire-session-lane.js.map +1 -0
  375. package/dist/runtime/statewire-thread-config-lane.d.ts +1 -1
  376. package/dist/runtime/useAthenaStatewireRuntime.cjs +16 -5
  377. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  378. package/dist/runtime/useAthenaStatewireRuntime.d.ts +15 -1
  379. package/dist/runtime/useAthenaStatewireRuntime.js +17 -6
  380. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  381. package/dist/styles.css +1 -1
  382. package/dist/threads/api.d.ts +1 -1
  383. package/dist/threads/conversation-list-fetcher.d.ts +1 -1
  384. package/dist/threads/index-triggered-refresh.cjs +164 -0
  385. package/dist/threads/index-triggered-refresh.cjs.map +1 -0
  386. package/dist/threads/index-triggered-refresh.d.ts +70 -0
  387. package/dist/threads/index-triggered-refresh.js +164 -0
  388. package/dist/threads/index-triggered-refresh.js.map +1 -0
  389. package/dist/threads/offline-session-list.cjs +75 -0
  390. package/dist/threads/offline-session-list.cjs.map +1 -0
  391. package/dist/threads/offline-session-list.d.ts +27 -0
  392. package/dist/threads/offline-session-list.js +75 -0
  393. package/dist/threads/offline-session-list.js.map +1 -0
  394. package/dist/threads/pull-request-display.d.ts +1 -1
  395. package/dist/threads/session-list-model.d.ts +1 -1
  396. package/dist/threads/session-list-tab-share.cjs +150 -0
  397. package/dist/threads/session-list-tab-share.cjs.map +1 -0
  398. package/dist/threads/session-list-tab-share.d.ts +73 -0
  399. package/dist/threads/session-list-tab-share.js +150 -0
  400. package/dist/threads/session-list-tab-share.js.map +1 -0
  401. package/dist/threads/session-row-parts.d.ts +1 -1
  402. package/dist/threads/sessions-query.d.ts +1 -1
  403. package/dist/threads/statewire-thread-list.cjs +105 -20
  404. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  405. package/dist/threads/statewire-thread-list.d.ts +31 -3
  406. package/dist/threads/statewire-thread-list.js +107 -22
  407. package/dist/threads/statewire-thread-list.js.map +1 -1
  408. package/dist/threads/thread-prefetcher.d.ts +1 -1
  409. package/dist/threads/use-athena-session-attention.d.ts +1 -1
  410. package/dist/threads/use-athena-sessions.cjs +32 -22
  411. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  412. package/dist/threads/use-athena-sessions.js +33 -23
  413. package/dist/threads/use-athena-sessions.js.map +1 -1
  414. package/dist/threads/use-rest-conversation-history.d.ts +1 -1
  415. package/dist/threads/use-statewire-conversation-history.d.ts +5 -5
  416. package/dist/tiptap-markdown-table/src/markdown-table-serializer.d.ts +56 -0
  417. package/dist/tools/NestedPtcMessages.cjs +14 -9
  418. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  419. package/dist/tools/NestedPtcMessages.d.ts +9 -0
  420. package/dist/tools/NestedPtcMessages.js +6 -1
  421. package/dist/tools/NestedPtcMessages.js.map +1 -1
  422. package/dist/tools/index.d.ts +1 -1
  423. package/dist/tools/primitives.d.ts +1 -1
  424. package/dist/tools/subagent-task-tool-ui.cjs +494 -0
  425. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -0
  426. package/dist/tools/subagent-task-tool-ui.d.ts +109 -0
  427. package/dist/tools/subagent-task-tool-ui.js +494 -0
  428. package/dist/tools/subagent-task-tool-ui.js.map +1 -0
  429. package/dist/tools/tool-fallback.d.ts +1 -1
  430. package/dist/tools/tool-icons.d.ts +1 -1
  431. package/dist/tools/tool-summary.d.ts +1 -1
  432. package/dist/tools/tool-uis.cjs +4 -0
  433. package/dist/tools/tool-uis.cjs.map +1 -1
  434. package/dist/tools/tool-uis.js +4 -0
  435. package/dist/tools/tool-uis.js.map +1 -1
  436. package/dist/voice/chat.cjs +6 -0
  437. package/dist/voice/chat.cjs.map +1 -0
  438. package/dist/voice/chat.d.ts +2 -0
  439. package/dist/voice/chat.js +6 -0
  440. package/dist/voice/chat.js.map +1 -0
  441. package/dist/voice/livekit-join.cjs +119 -0
  442. package/dist/voice/livekit-join.cjs.map +1 -0
  443. package/dist/voice/livekit-join.d.ts +8 -0
  444. package/dist/voice/livekit-join.js +119 -0
  445. package/dist/voice/livekit-join.js.map +1 -0
  446. package/dist/voice/livekit.cjs +32 -0
  447. package/dist/voice/livekit.cjs.map +1 -0
  448. package/dist/voice/livekit.d.ts +80 -0
  449. package/dist/voice/livekit.js +32 -0
  450. package/dist/voice/livekit.js.map +1 -0
  451. package/package.json +20 -10
@@ -0,0 +1,209 @@
1
+ import { createExternalMessageConversionCache } from "@assistant-ui/core/react";
2
+ import { DEEP_AGENT_REPEATS_RESULT_KEY } from "./generated/runconfig-contract.js";
3
+ import { getMessageText } from "./message-text.js";
4
+ import { sanitizeLangChainMessages, createDeepAgentMessageConversionCache } from "./messages.js";
5
+ import { TASK_TOOL_NAME } from "./tool-names.js";
6
+ function laneTranscriptOf(artifact) {
7
+ if (typeof artifact !== "object" || artifact === null) return void 0;
8
+ const state = artifact.subgraph_state;
9
+ if (typeof state !== "object" || state === null) return void 0;
10
+ const messages = state.messages;
11
+ return Array.isArray(messages) ? messages : void 0;
12
+ }
13
+ const restoredTranscripts = /* @__PURE__ */ new WeakMap();
14
+ function withRepeatedResult(transcript, content) {
15
+ const last = transcript[transcript.length - 1];
16
+ if (last === void 0 || last[DEEP_AGENT_REPEATS_RESULT_KEY] !== true || typeof content !== "string" && !Array.isArray(content)) {
17
+ return transcript;
18
+ }
19
+ const cached = restoredTranscripts.get(transcript);
20
+ if (cached !== void 0 && cached.content === content) return cached.transcript;
21
+ const restored = [...transcript.slice(0, -1), { ...last, content }];
22
+ restoredTranscripts.set(transcript, { content, transcript: restored });
23
+ return restored;
24
+ }
25
+ const convertibleChunkTurns = /* @__PURE__ */ new WeakMap();
26
+ function asConvertibleTurn(message) {
27
+ const type = message.type;
28
+ if (type !== "AIMessageChunk") return message;
29
+ const cached = convertibleChunkTurns.get(message);
30
+ if (cached !== void 0) return cached;
31
+ const turn = { ...message, type: "ai" };
32
+ convertibleChunkTurns.set(message, turn);
33
+ return turn;
34
+ }
35
+ function answeringTurn(step) {
36
+ var _a;
37
+ const turn = asConvertibleTurn(step);
38
+ return turn.type === "ai" && (((_a = turn.tool_calls) == null ? void 0 : _a.length) ?? 0) === 0 ? turn : null;
39
+ }
40
+ const isTextBlock = (block) => typeof block === "object" && block !== null && "type" in block && block.type === "text";
41
+ function shownText(content) {
42
+ if (typeof content === "string") return content;
43
+ if (!Array.isArray(content)) return "";
44
+ let text = "";
45
+ for (const block of content) {
46
+ if (isTextBlock(block) && typeof block.text === "string") text += block.text;
47
+ }
48
+ return text;
49
+ }
50
+ function blankTurn(step) {
51
+ const turn = answeringTurn(step);
52
+ if (turn === null || shownText(turn.content).trim() !== "") return null;
53
+ return typeof turn.content === "string" || turn.content.every(isTextBlock) ? turn : null;
54
+ }
55
+ const reportedLanes = /* @__PURE__ */ new WeakMap();
56
+ function withLaneReport(transcript, report) {
57
+ if (report === void 0 || report.trim() === "" || transcript.length === 0) return transcript;
58
+ let at = transcript.length - 1;
59
+ let closing = transcript[at];
60
+ while (closing !== void 0 && blankTurn(closing) !== null) {
61
+ at -= 1;
62
+ closing = transcript[at];
63
+ }
64
+ const answered = closing !== void 0 && answeringTurn(closing) !== null && shownText(closing.content).trim() !== "";
65
+ if (answered) return transcript;
66
+ const cached = reportedLanes.get(transcript);
67
+ if (cached !== void 0 && cached.report === report) return cached.transcript;
68
+ const last = transcript[transcript.length - 1];
69
+ const blank = last === void 0 ? null : blankTurn(last);
70
+ const closed = blank !== null ? [...transcript.slice(0, -1), { ...blank, content: report }] : [...transcript, { id: `${(last == null ? void 0 : last.id) ?? "lane"}:report`, type: "ai", content: report }];
71
+ reportedLanes.set(transcript, { report, transcript: closed });
72
+ return closed;
73
+ }
74
+ function transcriptSources(transcript) {
75
+ return sanitizeLangChainMessages(transcript.map(asConvertibleTurn));
76
+ }
77
+ const reportedTranscripts = /* @__PURE__ */ new WeakSet();
78
+ function reportUnconvertibleTranscript(transcript, error) {
79
+ if (reportedTranscripts.has(transcript)) return;
80
+ reportedTranscripts.add(transcript);
81
+ console.warn("[agent-runtime] a subagent transcript could not be converted", error);
82
+ }
83
+ function sameJson(a, b) {
84
+ if (Object.is(a, b)) return true;
85
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
86
+ if (Array.isArray(a) || Array.isArray(b)) {
87
+ return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((item, index) => sameJson(item, b[index]));
88
+ }
89
+ const left = a;
90
+ const right = b;
91
+ const keys = Object.keys(left);
92
+ return keys.length === Object.keys(right).length && keys.every(
93
+ (key) => Object.prototype.hasOwnProperty.call(right, key) && sameJson(left[key], right[key])
94
+ );
95
+ }
96
+ function steadyStepObjects() {
97
+ let held = /* @__PURE__ */ new Map();
98
+ return (transcript) => {
99
+ const next = /* @__PURE__ */ new Map();
100
+ let kept = false;
101
+ const steadied = transcript.map((entry) => {
102
+ const id = entry.id;
103
+ if (typeof id !== "string") return entry;
104
+ const before = held.get(id);
105
+ const step = before !== void 0 && sameJson(before, entry) ? before : entry;
106
+ next.set(id, step);
107
+ if (step !== entry) kept = true;
108
+ return step;
109
+ });
110
+ held = next;
111
+ return kept ? steadied : transcript;
112
+ };
113
+ }
114
+ function createSubagentLaneConversion() {
115
+ const memory = createSubagentTranscriptConversionCache();
116
+ const steady = steadyStepObjects();
117
+ let last = null;
118
+ return (transcript, running) => {
119
+ if (last !== null && last.transcript === transcript && last.running === running) {
120
+ return last.messages;
121
+ }
122
+ let messages;
123
+ try {
124
+ messages = memory.convert(transcriptSources(steady(transcript)), running);
125
+ } catch (error) {
126
+ reportUnconvertibleTranscript(transcript, error);
127
+ }
128
+ last = { transcript, running, messages };
129
+ return messages;
130
+ };
131
+ }
132
+ function subagentTranscriptAttacher() {
133
+ const lanes = /* @__PURE__ */ new Map();
134
+ const attachedRows = /* @__PURE__ */ new WeakMap();
135
+ const attachedParts = /* @__PURE__ */ new WeakMap();
136
+ const laneMessages = (toolCallId, transcript, running) => {
137
+ let lane = lanes.get(toolCallId);
138
+ if (lane === void 0) {
139
+ lane = createSubagentLaneConversion();
140
+ lanes.set(toolCallId, lane);
141
+ }
142
+ return lane(transcript, running);
143
+ };
144
+ const attach = (row) => {
145
+ if (row.role !== "assistant") return row;
146
+ const cached = attachedRows.get(row);
147
+ if (cached !== void 0) return cached;
148
+ let content = null;
149
+ for (const [index, part] of row.content.entries()) {
150
+ if (part.type !== "tool-call" || part.toolName !== TASK_TOOL_NAME) continue;
151
+ const nested = laneTranscriptOf(part.artifact);
152
+ if (nested === void 0) continue;
153
+ const running = part.isPreliminary === true;
154
+ const restored = withRepeatedResult(nested, part.result);
155
+ const transcript = running || part.isError === true ? restored : withLaneReport(restored, getMessageText({ content: part.result }));
156
+ const messages = laneMessages(part.toolCallId, transcript, running);
157
+ if (messages === void 0) continue;
158
+ const kept = attachedParts.get(part);
159
+ const attached = kept !== void 0 && kept.messages === messages ? kept.part : { ...part, messages };
160
+ attachedParts.set(part, { messages, part: attached });
161
+ content ?? (content = [...row.content]);
162
+ content[index] = attached;
163
+ }
164
+ const attachedRow = content === null ? row : { ...row, content };
165
+ attachedRows.set(row, attachedRow);
166
+ return attachedRow;
167
+ };
168
+ return (rows) => {
169
+ const attached = rows.map(attach);
170
+ if (lanes.size === 0) return attached;
171
+ const held = /* @__PURE__ */ new Set();
172
+ for (const row of rows) {
173
+ if (row.role !== "assistant") continue;
174
+ for (const part of row.content) {
175
+ if (part.type !== "tool-call" || part.toolName !== TASK_TOOL_NAME) continue;
176
+ held.add(part.toolCallId);
177
+ }
178
+ }
179
+ for (const toolCallId of lanes.keys()) {
180
+ if (!held.has(toolCallId)) lanes.delete(toolCallId);
181
+ }
182
+ return attached;
183
+ };
184
+ }
185
+ function createSubagentTranscriptConversionCache() {
186
+ const thread = createDeepAgentMessageConversionCache();
187
+ const attach = subagentTranscriptAttacher();
188
+ let previousRows = null;
189
+ let previous = [];
190
+ return {
191
+ convert(messages, isRunning) {
192
+ const rows = thread.convert(messages, isRunning);
193
+ if (rows === previousRows) return previous;
194
+ previousRows = rows;
195
+ const next = attach(rows);
196
+ const unchanged = next.length === previous.length && next.every((row, index) => row === previous[index]);
197
+ if (!unchanged) previous = next;
198
+ return previous;
199
+ }
200
+ };
201
+ }
202
+ createExternalMessageConversionCache();
203
+ export {
204
+ createSubagentLaneConversion,
205
+ createSubagentTranscriptConversionCache,
206
+ withLaneReport,
207
+ withRepeatedResult
208
+ };
209
+ //# sourceMappingURL=subagent-transcripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-transcripts.js","sources":["../../../../agent-runtime/src/subagent-transcripts.ts"],"sourcesContent":["/**\n * A subagent's transcript as assistant-ui's native nested thread.\n *\n * The backend nests a `task` subagent's transcript in its card's ToolMessage,\n * at `artifact.subgraph_state.messages`: the newest steps on the running\n * placeholder, the whole transcript on the real result. The conversion cache\n * built here converts that transcript through the thread's own pipeline and\n * sets it as the `task` tool-call part's `messages`, assistant-ui's channel for\n * a tool call's nested conversation. `ReadonlyThreadProvider` (the provider\n * under `MessagePartPrimitive.Messages`) renders it as a read-only thread under\n * the parent's tool UIs, and `thread.tasks` derives child work from it.\n *\n * Hosts opt in (`useDeepAgentThread({ createConversionCache })`). It builds on\n * the shared conversion memory from outside, so the shared converter, which\n * ships in every surface's startup bundle (the Office pane's startup and total\n * budgets have no room to spare), stays as it is, and a surface that draws no\n * subagent transcript pays nothing for it.\n */\nimport type {\n ThreadAssistantMessagePart,\n ThreadMessage,\n ToolCallMessagePart,\n} from '@assistant-ui/core';\nimport {\n convertExternalMessages,\n createExternalMessageConversionCache,\n} from '@assistant-ui/core/react';\nimport type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport { DEEP_AGENT_REPEATS_RESULT_KEY } from './generated/runconfig-contract';\nimport { getMessageText } from './message-text';\nimport {\n convertDeepAgentLangChainMessage,\n createDeepAgentMessageConversionCache,\n type DeepAgentConversionMemory,\n markPreliminaryToolResults,\n sanitizeLangChainMessages,\n} from './messages';\nimport { TASK_TOOL_NAME } from './tool-names';\n\n/** The transcript nested on a `task` card's artifact, or `undefined` when it carries none. */\nfunction laneTranscriptOf(artifact: unknown): readonly LangChainMessage[] | undefined {\n if (typeof artifact !== 'object' || artifact === null) return undefined;\n const state: unknown = (artifact as { subgraph_state?: unknown }).subgraph_state;\n if (typeof state !== 'object' || state === null) return undefined;\n const messages: unknown = (state as { messages?: unknown }).messages;\n return Array.isArray(messages) ? (messages as LangChainMessage[]) : undefined;\n}\n\nconst restoredTranscripts = new WeakMap<\n readonly LangChainMessage[],\n { readonly content: unknown; readonly transcript: readonly LangChainMessage[] }\n>();\n\n/**\n * A card's nested transcript with its report restored. On a cut finished card\n * the last step can ride with empty content and `DEEP_AGENT_REPEATS_RESULT_KEY`:\n * its text is the subagent's report, the card's own `content`, which the card\n * carries anyway. The step gets that content back. Any other transcript comes\n * back as it is. Memoized per transcript, so a lane's conversion sees one array.\n */\nexport function withRepeatedResult(\n transcript: readonly LangChainMessage[],\n content: unknown\n): readonly LangChainMessage[] {\n const last = transcript[transcript.length - 1];\n if (\n last === undefined ||\n (last as Record<string, unknown>)[DEEP_AGENT_REPEATS_RESULT_KEY] !== true ||\n (typeof content !== 'string' && !Array.isArray(content))\n ) {\n return transcript;\n }\n const cached = restoredTranscripts.get(transcript);\n if (cached !== undefined && cached.content === content) return cached.transcript;\n const restored = [...transcript.slice(0, -1), { ...last, content } as LangChainMessage];\n restoredTranscripts.set(transcript, { content, transcript: restored });\n return restored;\n}\n\ntype AssistantLangChainMessage = Extract<LangChainMessage, { type: 'ai' }>;\n\nconst convertibleChunkTurns = new WeakMap<LangChainMessage, LangChainMessage>();\n\n/**\n * A nested assistant turn stored under the chunk class name (the legacy\n * assistant-stream fold keeps `AIMessageChunk`) as the `ai` message it is: the\n * shipped converter maps only `ai`, and would drop the turn.\n */\nfunction asConvertibleTurn(message: LangChainMessage): LangChainMessage {\n const type: string = message.type;\n if (type !== 'AIMessageChunk') return message;\n const cached = convertibleChunkTurns.get(message);\n if (cached !== undefined) return cached;\n const turn: LangChainMessage = { ...(message as AssistantLangChainMessage), type: 'ai' };\n convertibleChunkTurns.set(message, turn);\n return turn;\n}\n\n/** A lane step as the assistant turn it is when it calls nothing; `null` for any other step. */\nfunction answeringTurn(step: LangChainMessage): AssistantLangChainMessage | null {\n const turn = asConvertibleTurn(step);\n return turn.type === 'ai' && (turn.tool_calls?.length ?? 0) === 0 ? turn : null;\n}\n\nconst isTextBlock = (block: unknown): block is { type: 'text'; text?: unknown } =>\n typeof block === 'object' && block !== null && 'type' in block && block.type === 'text';\n\n/** The text a step's content shows: the string, or its text blocks joined. */\nfunction shownText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n let text = '';\n for (const block of content) {\n if (isTextBlock(block) && typeof block.text === 'string') text += block.text;\n }\n return text;\n}\n\n/** A turn that calls nothing and shows nothing: no text, and no block of another kind. */\nfunction blankTurn(step: LangChainMessage): AssistantLangChainMessage | null {\n const turn = answeringTurn(step);\n if (turn === null || shownText(turn.content).trim() !== '') return null;\n return typeof turn.content === 'string' || turn.content.every(isTextBlock) ? turn : null;\n}\n\nconst reportedLanes = new WeakMap<\n readonly LangChainMessage[],\n { readonly report: string; readonly transcript: readonly LangChainMessage[] }\n>();\n\n/**\n * A finished lane's transcript, closed by its report. A `task` card's content\n * is its subagent's report, the text of the lane's last turn. A transcript\n * that ends on that turn (an assistant step that calls nothing and says\n * something, which {@link withRepeatedResult} restores when it rides marked)\n * comes back as it is, even when blank steps follow it. A lane stored without\n * it shows the report as its closing answer: a lane whose last step is a blank\n * assistant step (lanes that finished before the host marked a repeated\n * report) gets the report in that step, its id and stamps kept, and a lane\n * that ends on a tool result or a turn that calls tools gets a closing step\n * after its last one. An empty report or transcript changes nothing. For\n * display only: the wire and the stored lane are untouched. Memoized per\n * transcript, so a lane's conversion sees one array.\n */\nexport function withLaneReport(\n transcript: readonly LangChainMessage[],\n report: string | undefined\n): readonly LangChainMessage[] {\n if (report === undefined || report.trim() === '' || transcript.length === 0) return transcript;\n // The lane's closing turn: its last step past any blank ones.\n let at = transcript.length - 1;\n let closing = transcript[at];\n while (closing !== undefined && blankTurn(closing) !== null) {\n at -= 1;\n closing = transcript[at];\n }\n const answered =\n closing !== undefined &&\n answeringTurn(closing) !== null &&\n shownText(closing.content).trim() !== '';\n if (answered) return transcript;\n const cached = reportedLanes.get(transcript);\n if (cached !== undefined && cached.report === report) return cached.transcript;\n const last = transcript[transcript.length - 1];\n const blank = last === undefined ? null : blankTurn(last);\n const closed: readonly LangChainMessage[] =\n blank !== null\n ? [...transcript.slice(0, -1), { ...blank, content: report }]\n : [...transcript, { id: `${last?.id ?? 'lane'}:report`, type: 'ai', content: report }];\n reportedLanes.set(transcript, { report, transcript: closed });\n return closed;\n}\n\n/** A nested transcript as the thread's own pipeline reads it (see {@link sanitizeLangChainMessages}). */\nfunction transcriptSources(transcript: readonly LangChainMessage[]): LangChainMessage[] {\n return sanitizeLangChainMessages(transcript.map(asConvertibleTurn));\n}\n\nconst reportedTranscripts = new WeakSet<readonly LangChainMessage[]>();\n\n/**\n * A nested transcript the shipped converter refused (it throws on, e.g., a\n * result whose tool name differs from its call's): reported once, and its card\n * goes without a nested thread instead of taking the whole thread down.\n */\nfunction reportUnconvertibleTranscript(\n transcript: readonly LangChainMessage[],\n error: unknown\n): void {\n if (reportedTranscripts.has(transcript)) return;\n reportedTranscripts.add(transcript);\n console.warn('[agent-runtime] a subagent transcript could not be converted', error);\n}\n\n/** Whether two values the wire carries (JSON: no functions, no cycles) are equal. */\nfunction sameJson(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((item, index) => sameJson(item, b[index]))\n );\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) && sameJson(left[key], right[key])\n )\n );\n}\n\n/**\n * Keeps a lane's unchanged steps as the objects it already converted. The host\n * replaces a card's whole document whenever the card changes, so every step it\n * carries arrives as a new object, and the conversion memory, which tells the\n * steps a turn continues by object, would see a new turn each time the card's\n * cut drops its oldest step and the turn's first step changes. A step whose id\n * and content are unchanged is the object held for that id. O(the steps' size).\n */\nfunction steadyStepObjects(): (\n transcript: readonly LangChainMessage[]\n) => readonly LangChainMessage[] {\n let held = new Map<string, LangChainMessage>();\n return (transcript) => {\n const next = new Map<string, LangChainMessage>();\n let kept = false;\n const steadied = transcript.map((entry) => {\n const id = entry.id;\n if (typeof id !== 'string') return entry;\n const before = held.get(id);\n const step = before !== undefined && sameJson(before, entry) ? before : entry;\n next.set(id, step);\n if (step !== entry) kept = true;\n return step;\n });\n held = next;\n return kept ? steadied : transcript;\n };\n}\n\n/** One lane's transcript, converted: `undefined` when the converter refused it. */\nexport type SubagentLaneConversion = (\n transcript: readonly LangChainMessage[],\n running: boolean\n) => readonly ThreadMessage[] | undefined;\n\n/**\n * One `task` lane's own conversion memory, for whatever converts that lane:\n * its unchanged steps keep their converted objects while it streams (a step the\n * wire sends again unchanged included, see {@link steadyStepObjects}), and its\n * turn keeps its row key (`deepAgentRowKey`) and part keys when the turn's head\n * moves — the oldest steps of a cut card falling off as the lane runs, or older\n * steps a transcript drawer pages in. A surface that keeps its disclosures under\n * that key keeps them open through both. A transcript array converted last time\n * is not converted again.\n */\nexport function createSubagentLaneConversion(): SubagentLaneConversion {\n const memory = createSubagentTranscriptConversionCache();\n const steady = steadyStepObjects();\n let last: {\n readonly transcript: readonly LangChainMessage[];\n readonly running: boolean;\n readonly messages: readonly ThreadMessage[] | undefined;\n } | null = null;\n return (transcript, running) => {\n if (last !== null && last.transcript === transcript && last.running === running) {\n return last.messages;\n }\n let messages: readonly ThreadMessage[] | undefined;\n try {\n messages = memory.convert(transcriptSources(steady(transcript)), running);\n } catch (error) {\n reportUnconvertibleTranscript(transcript, error);\n }\n last = { transcript, running, messages };\n return messages;\n };\n}\n\n/**\n * Sets each `task` part of a pass's converted rows to carry its nested\n * transcript as `messages`, for one attach. Each lane has its own conversion\n * memory, so its unchanged steps keep their converted objects while it\n * streams, as the thread's own messages do, and a lane whose transcript array\n * did not change is not converted again. A row, and a part whose lane did not\n * change, keep their identity: the same row always comes back as the same\n * object. A lane's memory lives only while a row of the pass holds its `task`\n * call: a lane a rewind removes, a branch switch hides or the window leaves\n * behind is let go with its transcript, and converted afresh if it returns.\n */\nfunction subagentTranscriptAttacher(): (rows: readonly ThreadMessage[]) => ThreadMessage[] {\n const lanes = new Map<string, SubagentLaneConversion>();\n const attachedRows = new WeakMap<ThreadMessage, ThreadMessage>();\n const attachedParts = new WeakMap<\n ToolCallMessagePart,\n { readonly messages: readonly ThreadMessage[]; readonly part: ToolCallMessagePart }\n >();\n\n const laneMessages = (\n toolCallId: string,\n transcript: readonly LangChainMessage[],\n running: boolean\n ): readonly ThreadMessage[] | undefined => {\n let lane = lanes.get(toolCallId);\n if (lane === undefined) {\n lane = createSubagentLaneConversion();\n lanes.set(toolCallId, lane);\n }\n return lane(transcript, running);\n };\n\n const attach = (row: ThreadMessage): ThreadMessage => {\n if (row.role !== 'assistant') return row;\n const cached = attachedRows.get(row);\n if (cached !== undefined) return cached;\n let content: ThreadAssistantMessagePart[] | null = null;\n for (const [index, part] of row.content.entries()) {\n if (part.type !== 'tool-call' || part.toolName !== TASK_TOOL_NAME) continue;\n const nested = laneTranscriptOf(part.artifact);\n if (nested === undefined) continue;\n // A running lane's placeholder is preliminary: its newest nested turn streams.\n const running = part.isPreliminary === true;\n const restored = withRepeatedResult(nested, part.result);\n const transcript =\n running || part.isError === true\n ? restored\n : withLaneReport(restored, getMessageText({ content: part.result }));\n const messages = laneMessages(part.toolCallId, transcript, running);\n if (messages === undefined) continue;\n const kept = attachedParts.get(part);\n const attached =\n kept !== undefined && kept.messages === messages ? kept.part : { ...part, messages };\n attachedParts.set(part, { messages, part: attached });\n content ??= [...row.content];\n content[index] = attached;\n }\n const attachedRow: ThreadMessage = content === null ? row : { ...row, content };\n attachedRows.set(row, attachedRow);\n return attachedRow;\n };\n\n return (rows) => {\n const attached = rows.map(attach);\n if (lanes.size === 0) return attached;\n const held = new Set<string>();\n for (const row of rows) {\n if (row.role !== 'assistant') continue;\n for (const part of row.content) {\n if (part.type !== 'tool-call' || part.toolName !== TASK_TOOL_NAME) continue;\n held.add(part.toolCallId);\n }\n }\n for (const toolCallId of lanes.keys()) {\n if (!held.has(toolCallId)) lanes.delete(toolCallId);\n }\n return attached;\n };\n}\n\n/**\n * A conversion memory for one attach (see\n * `useDeepAgentThread({ createConversionCache })`): the shared one's rows, with\n * each `task` tool-call part carrying its subagent's converted transcript as\n * `messages`. A pass that changes no row hands back the previous list itself.\n */\nexport function createSubagentTranscriptConversionCache(): DeepAgentConversionMemory {\n const thread = createDeepAgentMessageConversionCache();\n const attach = subagentTranscriptAttacher();\n let previousRows: ThreadMessage[] | null = null;\n let previous: ThreadMessage[] = [];\n return {\n convert(messages, isRunning) {\n const rows = thread.convert(messages, isRunning);\n if (rows === previousRows) return previous;\n previousRows = rows;\n const next = attach(rows);\n const unchanged =\n next.length === previous.length && next.every((row, index) => row === previous[index]);\n if (!unchanged) previous = next;\n return previous;\n },\n };\n}\n\n/**\n * Shared by every in-eval transcript: entries are keyed by source message, so\n * none outlives the wire state holding it and threads cannot collide.\n */\nconst inEvalTranscriptCache = createExternalMessageConversionCache();\nconst IN_EVAL_TRANSCRIPT_METADATA = {};\nconst inEvalTranscripts = new WeakMap<\n readonly LangChainMessage[],\n { readonly running: boolean; readonly messages: readonly ThreadMessage[] }\n>();\n\nconst NO_MESSAGES: readonly ThreadMessage[] = [];\n\n/**\n * An in-eval dispatch's live transcript (a `ptc_subagents` entry's `messages`)\n * as a nested thread, converted like a `task` lane's. Memoized per transcript\n * array; a step the lane did not change keeps its converted object. A\n * transcript the converter refuses reads as empty.\n */\nexport function convertSubagentTranscript(\n transcript: readonly LangChainMessage[],\n running: boolean\n): readonly ThreadMessage[] {\n const cached = inEvalTranscripts.get(transcript);\n if (cached !== undefined && cached.running === running) return cached.messages;\n let messages: readonly ThreadMessage[] = NO_MESSAGES;\n try {\n messages = convertExternalMessages(\n transcriptSources(transcript),\n convertDeepAgentLangChainMessage,\n running,\n IN_EVAL_TRANSCRIPT_METADATA,\n inEvalTranscriptCache\n ).map(markPreliminaryToolResults);\n } catch (error) {\n reportUnconvertibleTranscript(transcript, error);\n }\n inEvalTranscripts.set(transcript, { running, messages });\n return messages;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const core = require("@assistant-ui/core");
4
+ const store = require("@assistant-ui/store");
5
+ const react = require("react");
6
+ const runconfigContract = require("./generated/runconfig-contract.cjs");
7
+ const messageText = require("./message-text.cjs");
8
+ const subagentTranscripts = require("./subagent-transcripts.cjs");
9
+ const toolNames = require("./tool-names.cjs");
10
+ function isTerminalSubagentStatus(status) {
11
+ return status === "complete" || status === "error";
12
+ }
13
+ function subagentNameFromArgs(args) {
14
+ if (!args) return "subagent";
15
+ return String(args.subagent_type ?? args.subagentType ?? args.subagent ?? "subagent");
16
+ }
17
+ function nestedMessagesFromArtifact(artifact) {
18
+ var _a;
19
+ const a = artifact;
20
+ return ((_a = a == null ? void 0 : a.subgraph_state) == null ? void 0 : _a.messages) ?? [];
21
+ }
22
+ const isCount = (value) => typeof value === "number" && Number.isInteger(value) && value >= 0;
23
+ function readTruncatedLane(toolMessage) {
24
+ if (typeof toolMessage !== "object" || toolMessage === null) return null;
25
+ const marker = toolMessage[runconfigContract.DEEP_AGENT_TRUNCATED_LANE_KEY];
26
+ if (typeof marker !== "object" || marker === null) return null;
27
+ const { messages, tool_calls: toolCalls, finished } = marker;
28
+ return isCount(messages) && isCount(toolCalls) ? { messages, toolCalls, finished: finished === true } : null;
29
+ }
30
+ function readLaneUsage(wire) {
31
+ if (typeof wire !== "object" || wire === null) return null;
32
+ const usage = wire[runconfigContract.DEEP_AGENT_LANE_USAGE_KEY];
33
+ if (typeof usage !== "object" || usage === null) return null;
34
+ const { input_tokens: inputTokens, output_tokens: outputTokens } = usage;
35
+ return isCount(inputTokens) && isCount(outputTokens) ? { inputTokens, outputTokens } : null;
36
+ }
37
+ function laneTokenUsage(wire, steps, status, cut) {
38
+ const settled = isTerminalSubagentStatus(status);
39
+ const whole = readLaneUsage(wire);
40
+ if (whole !== null) return { ...whole, partial: !settled };
41
+ return steps === void 0 ? void 0 : { ...steps, partial: !settled || cut };
42
+ }
43
+ const transcriptStepUsageCache = /* @__PURE__ */ new WeakMap();
44
+ function transcriptStepUsage(messages) {
45
+ const cached = transcriptStepUsageCache.get(messages);
46
+ if (cached !== void 0) return cached ?? void 0;
47
+ let inputTokens = 0;
48
+ let outputTokens = 0;
49
+ let counted = false;
50
+ for (const message of messages) {
51
+ for (const step of message.metadata.steps ?? []) {
52
+ if (step.usage === void 0) continue;
53
+ inputTokens += step.usage.inputTokens;
54
+ outputTokens += step.usage.outputTokens;
55
+ counted = true;
56
+ }
57
+ }
58
+ const usage = counted ? { inputTokens, outputTokens } : null;
59
+ transcriptStepUsageCache.set(messages, usage);
60
+ return usage ?? void 0;
61
+ }
62
+ function nestedTodosFromArtifact(artifact) {
63
+ var _a;
64
+ const a = artifact;
65
+ const todos = (_a = a == null ? void 0 : a.subgraph_state) == null ? void 0 : _a.todos;
66
+ return Array.isArray(todos) ? todos : void 0;
67
+ }
68
+ const EMPTY_TRANSCRIPT_DERIVATION = {
69
+ currentText: "",
70
+ model: void 0,
71
+ lastToolCall: void 0,
72
+ toolCallCount: 0,
73
+ todos: void 0
74
+ };
75
+ const transcriptDerivationCache = /* @__PURE__ */ new WeakMap();
76
+ function deriveTranscript(transcript) {
77
+ var _a, _b;
78
+ if (transcript.length === 0) return EMPTY_TRANSCRIPT_DERIVATION;
79
+ const cached = transcriptDerivationCache.get(transcript);
80
+ if (cached !== void 0) return cached;
81
+ let currentText = "";
82
+ let model;
83
+ let lastToolCall;
84
+ let toolCallCount = 0;
85
+ let todos;
86
+ for (const message of transcript) {
87
+ if (message.role !== "assistant") continue;
88
+ const turnModel = (_b = (_a = message.metadata) == null ? void 0 : _a.custom) == null ? void 0 : _b.model;
89
+ if (typeof turnModel === "string" && turnModel) model = turnModel;
90
+ for (const part of message.content) {
91
+ if (part.type === "text") {
92
+ if (part.text) currentText = part.text;
93
+ continue;
94
+ }
95
+ if (part.type !== "tool-call") continue;
96
+ toolCallCount += 1;
97
+ lastToolCall = { id: part.toolCallId, name: part.toolName, args: part.args };
98
+ if (part.toolName !== "write_todos") continue;
99
+ const list = part.args.todos;
100
+ if (Array.isArray(list)) todos = list;
101
+ }
102
+ }
103
+ const derivation = {
104
+ currentText,
105
+ model,
106
+ lastToolCall,
107
+ toolCallCount,
108
+ todos
109
+ };
110
+ transcriptDerivationCache.set(transcript, derivation);
111
+ return derivation;
112
+ }
113
+ const NO_TRANSCRIPT = [];
114
+ function taskSubagent(part, toolMessage) {
115
+ const args = part.args;
116
+ const transcript = part.messages ?? NO_TRANSCRIPT;
117
+ const derived = deriveTranscript(transcript);
118
+ const messageCount = nestedMessagesFromArtifact(part.artifact).length;
119
+ const lane = readTruncatedLane(toolMessage);
120
+ const todos = nestedTodosFromArtifact(part.artifact);
121
+ const status = part.result === void 0 ? "queued" : part.isPreliminary === true ? "running" : part.isError === true ? "error" : "complete";
122
+ const usage = laneTokenUsage(
123
+ toolMessage,
124
+ transcriptStepUsage(transcript),
125
+ status,
126
+ lane !== null && lane.messages > messageCount
127
+ );
128
+ return {
129
+ id: part.toolCallId,
130
+ name: subagentNameFromArgs(args),
131
+ description: typeof args.description === "string" ? args.description : "",
132
+ status,
133
+ ...part.result !== void 0 && { output: messageText.getMessageText({ content: part.result }) },
134
+ toolCallCount: Math.max(derived.toolCallCount, (lane == null ? void 0 : lane.toolCalls) ?? 0),
135
+ messages: transcript,
136
+ messageCount,
137
+ ...lane !== null && { omittedMessageCount: Math.max(0, lane.messages - messageCount) },
138
+ ...typeof (toolMessage == null ? void 0 : toolMessage.id) === "string" && {
139
+ source: {
140
+ messageId: toolMessage.id,
141
+ transcript: subagentTranscripts.withRepeatedResult(nestedMessagesFromArtifact(part.artifact), part.result),
142
+ ...lane !== null && { truncated: lane }
143
+ }
144
+ },
145
+ ...todos !== void 0 && { todos },
146
+ ...derived.lastToolCall !== void 0 && { lastToolCall: derived.lastToolCall },
147
+ currentText: derived.currentText,
148
+ ...derived.model !== void 0 && { model: derived.model },
149
+ ...usage !== void 0 && { usage }
150
+ };
151
+ }
152
+ function toolMessagesOfTurn(message) {
153
+ const byCall = /* @__PURE__ */ new Map();
154
+ for (const source of core.getExternalStoreMessages(message)) {
155
+ if (source.type === "tool") byCall.set(source.tool_call_id, source);
156
+ }
157
+ return byCall;
158
+ }
159
+ const taskSubagentByPart = /* @__PURE__ */ new WeakMap();
160
+ const taskSubagentsByTurn = /* @__PURE__ */ new WeakMap();
161
+ function taskSubagentsOfTurn(message) {
162
+ const cached = taskSubagentsByTurn.get(message);
163
+ if (cached !== void 0) return cached;
164
+ const lanes = /* @__PURE__ */ new Map();
165
+ if (message.role === "assistant") {
166
+ let toolMessages = null;
167
+ for (const part of message.content) {
168
+ if (part.type !== "tool-call" || part.toolName !== toolNames.TASK_TOOL_NAME) continue;
169
+ let lane = taskSubagentByPart.get(part);
170
+ if (lane === void 0) {
171
+ toolMessages ?? (toolMessages = toolMessagesOfTurn(message));
172
+ lane = taskSubagent(part, toolMessages.get(part.toolCallId));
173
+ taskSubagentByPart.set(part, lane);
174
+ }
175
+ lanes.set(part.toolCallId, lane);
176
+ }
177
+ }
178
+ taskSubagentsByTurn.set(message, lanes);
179
+ return lanes;
180
+ }
181
+ function findToolCall({
182
+ messages,
183
+ toolCallIds
184
+ }) {
185
+ if (messages === void 0) return void 0;
186
+ for (const message of messages) {
187
+ if (message.role !== "assistant") continue;
188
+ for (const part of message.content) {
189
+ if (part.type === "tool-call" && toolCallIds.has(part.toolCallId)) return part;
190
+ }
191
+ }
192
+ return void 0;
193
+ }
194
+ function subagentAwaitingApproval({
195
+ lane,
196
+ toolCallIds
197
+ }) {
198
+ if (toolCallIds.size === 0 || isTerminalSubagentStatus(lane.status)) return false;
199
+ return toolCallIds.has(lane.id) || findToolCall({ messages: lane.messages, toolCallIds }) !== void 0;
200
+ }
201
+ function subagentToolCallAwaitingApproval({
202
+ lane,
203
+ toolCallIds
204
+ }) {
205
+ if (toolCallIds.size === 0 || isTerminalSubagentStatus(lane.status)) return void 0;
206
+ const part = findToolCall({ messages: lane.messages, toolCallIds });
207
+ return part === void 0 ? void 0 : { id: part.toolCallId, name: part.toolName, args: part.args };
208
+ }
209
+ function turnToolCallsAwaitingApproval({
210
+ message,
211
+ toolCallIds
212
+ }) {
213
+ if (toolCallIds.size === 0 || message.role !== "assistant") return [];
214
+ const ids = [];
215
+ for (const part of message.content) {
216
+ if (part.type !== "tool-call") continue;
217
+ if (toolCallIds.has(part.toolCallId)) {
218
+ ids.push(part.toolCallId);
219
+ continue;
220
+ }
221
+ if (part.toolName !== toolNames.TASK_TOOL_NAME) continue;
222
+ const settled = part.result !== void 0 && part.isPreliminary !== true;
223
+ if (!settled && findToolCall({ messages: part.messages, toolCallIds }) !== void 0) {
224
+ ids.push(part.toolCallId);
225
+ }
226
+ }
227
+ return ids;
228
+ }
229
+ const NO_WAITING_TOOL_CALLS = /* @__PURE__ */ new Set();
230
+ const TOOL_CALL_ID_SEPARATOR = "\n";
231
+ function useTurnToolCallsAwaitingApproval(toolCallIds) {
232
+ const key = store.useAuiState(
233
+ (s) => toolCallIds.size === 0 ? "" : turnToolCallsAwaitingApproval({ message: s.message, toolCallIds }).join(
234
+ TOOL_CALL_ID_SEPARATOR
235
+ )
236
+ );
237
+ return react.useMemo(
238
+ () => key === "" ? NO_WAITING_TOOL_CALLS : new Set(key.split(TOOL_CALL_ID_SEPARATOR)),
239
+ [key]
240
+ );
241
+ }
242
+ exports.isTerminalSubagentStatus = isTerminalSubagentStatus;
243
+ exports.nestedMessagesFromArtifact = nestedMessagesFromArtifact;
244
+ exports.nestedTodosFromArtifact = nestedTodosFromArtifact;
245
+ exports.readLaneUsage = readLaneUsage;
246
+ exports.readTruncatedLane = readTruncatedLane;
247
+ exports.subagentAwaitingApproval = subagentAwaitingApproval;
248
+ exports.subagentToolCallAwaitingApproval = subagentToolCallAwaitingApproval;
249
+ exports.taskSubagentsOfTurn = taskSubagentsOfTurn;
250
+ exports.transcriptStepUsage = transcriptStepUsage;
251
+ exports.turnToolCallsAwaitingApproval = turnToolCallsAwaitingApproval;
252
+ exports.useTurnToolCallsAwaitingApproval = useTurnToolCallsAwaitingApproval;
253
+ //# sourceMappingURL=subagents.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagents.cjs","sources":["../../../../agent-runtime/src/subagents.ts"],"sourcesContent":["/**\n * Subagent discovery: every subagent lane a deep-agent thread has spawned, as\n * the card view model the surfaces that draw subagent lanes render. Two\n * dispatch paths feed lanes keyed by dispatch id:\n *\n * - top-level `task` tool calls, read from the call's own tool-call part\n * ({@link taskSubagentsOfTurn}): the part's result and `isPreliminary` say\n * where the lane is, and its `messages` (the nested thread\n * `createSubagentTranscriptConversionCache` converts) are the transcript;\n * - in-eval `task()` dispatches ({@link deriveEvalSubagents}), whose only\n * signals are the live `ptc_subagents` state channel and the summaries a\n * finished `eval` ToolMessage persists in `artifact.ptc_subagents`.\n */\nimport {\n getExternalStoreMessages,\n type ThreadMessage,\n type ToolCallMessagePart,\n} from '@assistant-ui/core';\nimport type { LangChainMessage, LangChainToolCall } from '@assistant-ui/react-langgraph';\nimport { useAuiState } from '@assistant-ui/store';\nimport { useMemo } from 'react';\nimport {\n DEEP_AGENT_LANE_USAGE_KEY,\n DEEP_AGENT_TRUNCATED_LANE_KEY,\n} from './generated/runconfig-contract';\nimport { getMessageText } from './message-text';\nimport { convertSubagentTranscript, withRepeatedResult } from './subagent-transcripts';\nimport { EVAL_TOOL_NAME, TASK_TOOL_NAME } from './tool-names';\nimport type { PtcSubagentEntry, Todo } from './types';\n\n/**\n * Where a subagent lane is:\n *\n * - `queued` — the dispatch has not started: a `task` call with no result yet\n * (waiting for a dispatch slot or an approval; the backend shows the running\n * card once the dispatch holds its slot), or an in-eval dispatch waiting for\n * one of the bridge's concurrency slots.\n * - `running` — a `task` call's result is still the backend's running\n * placeholder (its part is `isPreliminary`), and the nested transcript fills\n * in live; or an in-eval dispatch's lifecycle says it runs.\n * - `complete` / `error` — the real result replaced the placeholder; `error`\n * when it is an error result.\n */\nexport type SubagentStatus = 'queued' | 'running' | 'complete' | 'error';\n\n/** True for the settled lifecycle states (`complete` / `error`). */\nexport function isTerminalSubagentStatus(status: SubagentStatus): boolean {\n return status === 'complete' || status === 'error';\n}\n\n/** Aggregate lane lifecycle counts for one fan-out (orchestration strip + header chip). */\nexport interface SubagentStatusCounts {\n total: number;\n queued: number;\n running: number;\n complete: number;\n failed: number;\n /** complete + failed — the settled count progress displays use. */\n terminal: number;\n}\n\nexport function countSubagentStatuses(\n snapshots: readonly SubagentDiscoverySnapshot[]\n): SubagentStatusCounts {\n const counts: SubagentStatusCounts = {\n total: snapshots.length,\n queued: 0,\n running: 0,\n complete: 0,\n failed: 0,\n terminal: 0,\n };\n for (const snapshot of snapshots) {\n if (snapshot.status === 'queued') counts.queued += 1;\n else if (snapshot.status === 'running') counts.running += 1;\n else if (snapshot.status === 'complete') counts.complete += 1;\n else counts.failed += 1;\n }\n counts.terminal = counts.complete + counts.failed;\n return counts;\n}\n\n/**\n * Discovery snapshot for one subagent invocation. Mirrors LangChain's\n * `SubagentDiscoverySnapshot`: `id` is the `task` tool-call id that spawned the\n * subagent (the dispatch id for an in-eval dispatch), so cards nest under the\n * coordinator turn that delegated the work.\n */\nexport interface SubagentDiscoverySnapshot {\n /** The `task` tool-call id that spawned the subagent. */\n id: string;\n /** Subagent type/name, from the `task` call's `subagent_type` arg. */\n name: string;\n /** The one-line task brief from the `task` call's `description` arg. */\n description: string;\n /** Lifecycle state — see {@link SubagentStatus}. */\n status: SubagentStatus;\n /** The call's result text (empty while it is the running placeholder). */\n output?: string;\n /** Number of nested tool calls the subagent made. */\n toolCallCount: number;\n /**\n * The subagent's transcript as a nested thread: a `task` part's native\n * `messages`, or an in-eval dispatch's live transcript converted the same way.\n */\n messages: readonly ThreadMessage[];\n /** Messages in the transcript as the wire carries them, before conversion joins a turn's steps. */\n messageCount: number;\n /**\n * Nested messages the wire left off: a cut card carries its newest steps\n * ({@link readTruncatedLane}) — a running card always, a finished one on a\n * version-2 view — and the rest pages in through `history/lane`; an in-eval\n * dispatch's streamed transcript is cut the same way, running or finished.\n * Absent when the transcript rides whole.\n */\n omittedMessageCount?: number;\n /**\n * Where the lane's steps ride, what `history/lane` pages the rest of the lane\n * under (`useDeepAgentLaneHistory`): a `task` lane's card, an in-eval lane's\n * registry entry while it streams its steps, or, once they no longer ride,\n * its subagent checkpoint (`checkpointed`), when agora recorded where that is\n * (`ns`). Absent for any other in-eval lane with no streamed steps (a summary\n * written before agora recorded the namespace, an older host).\n */\n source?: SubagentLaneSource;\n /** The subagent's own plan, nested by the backend on the task artifact (`subgraph_state.todos`). */\n todos?: Todo[];\n /** The newest tool call in the transcript — the card's \"last action\" ticker. */\n lastToolCall?: LangChainToolCall;\n /** The newest assistant text in the transcript — the card's thought preview. */\n currentText: string;\n /**\n * The `eval` tool-call id that dispatched this subagent, when it was spawned\n * from INSIDE the code interpreter (`task()` in the REPL) rather than by a\n * top-level `task` tool call. The eval card uses it to render lanes for its\n * own dispatches.\n */\n evalId?: string;\n /**\n * Backend-reported runtime for a finished in-eval dispatch (from the terminal\n * lifecycle event). Authoritative over client-side timing — it survives a page\n * refresh, where local first-seen timestamps are gone.\n */\n durationMs?: number;\n /** The model that produced the transcript, from its newest assistant turn's model stamp. */\n model?: string;\n /**\n * The lane's token use: the whole lane's as the host counts it\n * (`DEEP_AGENT_LANE_USAGE_KEY`), else the sum of the native step usage\n * (`metadata.steps[].usage`) of the steps the transcript holds. Absent while\n * no step reports any.\n */\n usage?: SubagentTokenUsage;\n}\n\n/** A subagent lane's token use. */\nexport interface SubagentTokenUsage {\n /** Input tokens, the prompt cache's reads and writes included. */\n readonly inputTokens: number;\n readonly outputTokens: number;\n /**\n * Less than the lane will have used: the lane still runs (its newest step may\n * not have reported yet), or no host total arrived and the sum covers only\n * the steps held of a lane cut to its newest ones.\n */\n readonly partial: boolean;\n}\n\n/** Input and output tokens of some model calls. */\nexport interface TokenCounts {\n readonly inputTokens: number;\n readonly outputTokens: number;\n}\n\nfunction subagentNameFromArgs(args: Readonly<Record<string, unknown>> | undefined): string {\n if (!args) return 'subagent';\n return String(args.subagent_type ?? args.subagentType ?? args.subagent ?? 'subagent');\n}\n\n/**\n * The subagent's streamed transcript as the wire carries it, read from a task\n * ToolMessage's `artifact.subgraph_state.messages` (the shape the backend nests\n * it under — see the route's `_subagent_subgraph_state`).\n */\nexport function nestedMessagesFromArtifact(artifact: unknown): LangChainMessage[] {\n const a = artifact as { subgraph_state?: { messages?: LangChainMessage[] } } | undefined;\n return a?.subgraph_state?.messages ?? [];\n}\n\n/** What the wire left off a cut `task` card's nested transcript. */\nexport interface TruncatedLane {\n /** Nested messages the host holds for the lane. */\n messages: number;\n /** Tool calls across all of them. */\n toolCalls: number;\n /**\n * The card is a finished lane's, cut for a version-2 view. Only a host that\n * serves `history/lane` cuts a finished card.\n */\n finished: boolean;\n}\n\n/**\n * Where a lane's steps ride, and what `history/lane` pages the rest of them\n * under: a `task` lane's card, by its message id, or an in-eval dispatch's\n * `ptc_subagents` registry entry, by its dispatch id.\n */\nexport type SubagentLaneSource = {\n /** The steps as the wire carries them (a card's report restored, {@link withRepeatedResult}). */\n readonly transcript: readonly LangChainMessage[];\n /** The cut marker; absent while every step rides. */\n readonly truncated?: TruncatedLane;\n /**\n * No steps ride, and `history/lane {lane}` pages the subagent's own steps\n * from its checkpoint: an in-eval lane a later run in this activation left\n * only its summary and `ns`, or a reopened session's lane (its registry gone,\n * the summary its eval persisted records `ns`).\n */\n readonly checkpointed?: true;\n} & (\n | {\n /** The card's message id: the running placeholder's, then the result's. */\n readonly messageId: string;\n readonly lane?: undefined;\n }\n | {\n /** The dispatch id: the in-eval lane's registry key. */\n readonly lane: string;\n readonly messageId?: undefined;\n }\n);\n\nconst isCount = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0;\n\n/**\n * The cut marker off a `task` card's raw wire message: the host carries only\n * the lane's newest nested steps and names the whole transcript here\n * (`DEEP_AGENT_TRUNCATED_LANE_KEY`), on a running card and, for a version-2\n * view, on a finished one. `null` when the transcript rides whole.\n */\nexport function readTruncatedLane(toolMessage: unknown): TruncatedLane | null {\n if (typeof toolMessage !== 'object' || toolMessage === null) return null;\n const marker = (toolMessage as Record<string, unknown>)[DEEP_AGENT_TRUNCATED_LANE_KEY];\n if (typeof marker !== 'object' || marker === null) return null;\n const { messages, tool_calls: toolCalls, finished } = marker as Record<string, unknown>;\n return isCount(messages) && isCount(toolCalls)\n ? { messages, toolCalls, finished: finished === true }\n : null;\n}\n\n/**\n * The whole lane's token use the host carries on a `task` card's raw wire\n * message or an in-eval lane's `ptc_subagents` entry\n * (`DEEP_AGENT_LANE_USAGE_KEY`), however much of the lane the wire carries.\n * `null` when it carries none (an older host, or no step reported usage).\n */\nexport function readLaneUsage(wire: unknown): TokenCounts | null {\n if (typeof wire !== 'object' || wire === null) return null;\n const usage = (wire as Record<string, unknown>)[DEEP_AGENT_LANE_USAGE_KEY];\n if (typeof usage !== 'object' || usage === null) return null;\n const { input_tokens: inputTokens, output_tokens: outputTokens } = usage as Record<\n string,\n unknown\n >;\n return isCount(inputTokens) && isCount(outputTokens) ? { inputTokens, outputTokens } : null;\n}\n\n/**\n * A lane's token use: the host's total when it sent one, else what the native\n * steps of the transcript held add up to, partial while the lane runs or when\n * that transcript is cut. `undefined` while neither counts anything.\n */\nfunction laneTokenUsage(\n wire: unknown,\n steps: TokenCounts | undefined,\n status: SubagentStatus,\n cut: boolean\n): SubagentTokenUsage | undefined {\n const settled = isTerminalSubagentStatus(status);\n const whole = readLaneUsage(wire);\n if (whole !== null) return { ...whole, partial: !settled };\n return steps === undefined ? undefined : { ...steps, partial: !settled || cut };\n}\n\nconst transcriptStepUsageCache = new WeakMap<readonly ThreadMessage[], TokenCounts | null>();\n\n/**\n * What the model calls of a converted transcript used, from assistant-ui's\n * native step usage (`metadata.steps[].usage`, one step per model call a turn\n * joined). `undefined` when no step reports usage. Memoized per transcript\n * array, which the conversion caches keep while the transcript is unchanged.\n */\nexport function transcriptStepUsage(messages: readonly ThreadMessage[]): TokenCounts | undefined {\n const cached = transcriptStepUsageCache.get(messages);\n if (cached !== undefined) return cached ?? undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let counted = false;\n for (const message of messages) {\n for (const step of message.metadata.steps ?? []) {\n if (step.usage === undefined) continue;\n inputTokens += step.usage.inputTokens;\n outputTokens += step.usage.outputTokens;\n counted = true;\n }\n }\n const usage = counted ? { inputTokens, outputTokens } : null;\n transcriptStepUsageCache.set(messages, usage);\n return usage ?? undefined;\n}\n\n/**\n * The subagent's own plan, read from a task ToolMessage's\n * `artifact.subgraph_state.todos` (the backend mirrors the subagent's isolated\n * `todos` state channel there — see the route's `_forward_subagent_todos`).\n * `undefined` (not `[]`) when the subagent never wrote a plan, so the UI can\n * distinguish \"no plan\" from \"plan with zero items\".\n */\nexport function nestedTodosFromArtifact(artifact: unknown): Todo[] | undefined {\n const a = artifact as { subgraph_state?: { todos?: unknown } } | undefined;\n const todos = a?.subgraph_state?.todos;\n return Array.isArray(todos) ? (todos as Todo[]) : undefined;\n}\n\n/**\n * The persisted in-eval dispatch summaries from an `eval` ToolMessage's\n * `artifact.ptc_subagents` (written by the backend when the eval ends). Unlike\n * the live `ptc_subagents` state channel — which dies with the stream — these\n * survive checkpoint reload, so reopened sessions can still render each\n * dispatch's terminal status, duration, output, and error.\n */\nexport function ptcSubagentsFromArtifact(artifact: unknown): PtcSubagentEntry[] {\n const a = artifact as { ptc_subagents?: unknown } | undefined;\n const entries = a?.ptc_subagents;\n if (!Array.isArray(entries)) return [];\n return entries.filter(\n (entry): entry is PtcSubagentEntry =>\n !!entry &&\n typeof entry === 'object' &&\n typeof (entry as { id?: unknown }).id === 'string' &&\n !!(entry as { id?: string }).id\n );\n}\n\n/**\n * What one transcript contributes to a lane: the newest assistant text\n * (thought preview), the newest tool call and the count (\"last action\"\n * ticker), the producing model, and the plan recovered from the newest\n * `write_todos` call — the fallback for in-eval lanes, whose isolated `todos`\n * state channel never reaches the wire (the task path nests todos on the\n * artifact instead); the call args carry the same list, so the progress ring\n * can still fill. A pure function of the transcript array.\n */\ninterface TranscriptDerivation {\n currentText: string;\n model: string | undefined;\n lastToolCall: LangChainToolCall | undefined;\n toolCallCount: number;\n todos: Todo[] | undefined;\n}\n\nconst EMPTY_TRANSCRIPT_DERIVATION: TranscriptDerivation = {\n currentText: '',\n model: undefined,\n lastToolCall: undefined,\n toolCallCount: 0,\n todos: undefined,\n};\n\n/**\n * Per-transcript cache for {@link deriveTranscript}: a lane's converted\n * transcript keeps its array while the lane does not change (the conversion\n * caches hand back the previous array), so only lanes still streaming are\n * read again.\n */\nconst transcriptDerivationCache = new WeakMap<readonly ThreadMessage[], TranscriptDerivation>();\n\nfunction deriveTranscript(transcript: readonly ThreadMessage[]): TranscriptDerivation {\n if (transcript.length === 0) return EMPTY_TRANSCRIPT_DERIVATION;\n const cached = transcriptDerivationCache.get(transcript);\n if (cached !== undefined) return cached;\n let currentText = '';\n let model: string | undefined;\n let lastToolCall: LangChainToolCall | undefined;\n let toolCallCount = 0;\n let todos: Todo[] | undefined;\n for (const message of transcript) {\n if (message.role !== 'assistant') continue;\n // A joined turn's `metadata.custom` merges its steps' stamps, the later\n // step's winning (`joinExternalMessages`), so this is the newest stamp.\n const turnModel: unknown = message.metadata?.custom?.model;\n if (typeof turnModel === 'string' && turnModel) model = turnModel;\n for (const part of message.content) {\n if (part.type === 'text') {\n if (part.text) currentText = part.text;\n continue;\n }\n if (part.type !== 'tool-call') continue;\n toolCallCount += 1;\n lastToolCall = { id: part.toolCallId, name: part.toolName, args: part.args };\n if (part.toolName !== 'write_todos') continue;\n const list: unknown = part.args.todos;\n if (Array.isArray(list)) todos = list as Todo[];\n }\n }\n const derivation: TranscriptDerivation = {\n currentText,\n model,\n lastToolCall,\n toolCallCount,\n todos,\n };\n transcriptDerivationCache.set(transcript, derivation);\n return derivation;\n}\n\nconst NO_TRANSCRIPT: readonly ThreadMessage[] = [];\n\n/**\n * The lane of one `task` tool-call part. `toolMessage` is the raw ToolMessage\n * answering it, which carries the wire's cut marker for a running lane.\n */\nfunction taskSubagent(\n part: ToolCallMessagePart,\n toolMessage: LangChainMessage | undefined\n): SubagentDiscoverySnapshot {\n const args: Readonly<Record<string, unknown>> = part.args;\n const transcript = part.messages ?? NO_TRANSCRIPT;\n const derived = deriveTranscript(transcript);\n const messageCount = nestedMessagesFromArtifact(part.artifact).length;\n const lane = readTruncatedLane(toolMessage);\n const todos = nestedTodosFromArtifact(part.artifact);\n const status: SubagentStatus =\n part.result === undefined\n ? 'queued'\n : part.isPreliminary === true\n ? 'running'\n : part.isError === true\n ? 'error'\n : 'complete';\n const usage = laneTokenUsage(\n toolMessage,\n transcriptStepUsage(transcript),\n status,\n lane !== null && lane.messages > messageCount\n );\n return {\n id: part.toolCallId,\n name: subagentNameFromArgs(args),\n description: typeof args.description === 'string' ? args.description : '',\n status,\n ...(part.result !== undefined && { output: getMessageText({ content: part.result }) }),\n toolCallCount: Math.max(derived.toolCallCount, lane?.toolCalls ?? 0),\n messages: transcript,\n messageCount,\n ...(lane !== null && { omittedMessageCount: Math.max(0, lane.messages - messageCount) }),\n ...(typeof toolMessage?.id === 'string' && {\n source: {\n messageId: toolMessage.id,\n transcript: withRepeatedResult(nestedMessagesFromArtifact(part.artifact), part.result),\n ...(lane !== null && { truncated: lane }),\n },\n }),\n ...(todos !== undefined && { todos }),\n ...(derived.lastToolCall !== undefined && { lastToolCall: derived.lastToolCall }),\n currentText: derived.currentText,\n ...(derived.model !== undefined && { model: derived.model }),\n ...(usage !== undefined && { usage }),\n };\n}\n\n/** The raw ToolMessage answering each tool call of a converted turn, from the sources bound to it. */\nfunction toolMessagesOfTurn(message: ThreadMessage): Map<string, LangChainMessage> {\n const byCall = new Map<string, LangChainMessage>();\n for (const source of getExternalStoreMessages<LangChainMessage>(message)) {\n if (source.type === 'tool') byCall.set(source.tool_call_id, source);\n }\n return byCall;\n}\n\n/**\n * Per-part lane cache: a re-converted turn keeps the part object of every call\n * whose ToolMessage did not change (the conversion cache's `keepUnchangedParts`),\n * so a streaming lane re-derives only itself.\n */\nconst taskSubagentByPart = new WeakMap<ToolCallMessagePart, SubagentDiscoverySnapshot>();\nconst taskSubagentsByTurn = new WeakMap<ThreadMessage, ReadonlyMap<string, SubagentDiscoverySnapshot>>();\n\n/**\n * The lane of every `task` call in one converted turn (a `ThreadMessage`, or the\n * message state assistant-ui publishes for it), keyed by tool-call id in call\n * order. Memoized per turn and per part.\n */\nexport function taskSubagentsOfTurn(\n message: ThreadMessage\n): ReadonlyMap<string, SubagentDiscoverySnapshot> {\n const cached = taskSubagentsByTurn.get(message);\n if (cached !== undefined) return cached;\n const lanes = new Map<string, SubagentDiscoverySnapshot>();\n if (message.role === 'assistant') {\n let toolMessages: Map<string, LangChainMessage> | null = null;\n for (const part of message.content) {\n if (part.type !== 'tool-call' || part.toolName !== TASK_TOOL_NAME) continue;\n let lane = taskSubagentByPart.get(part);\n if (lane === undefined) {\n toolMessages ??= toolMessagesOfTurn(message);\n lane = taskSubagent(part, toolMessages.get(part.toolCallId));\n taskSubagentByPart.set(part, lane);\n }\n lanes.set(part.toolCallId, lane);\n }\n }\n taskSubagentsByTurn.set(message, lanes);\n return lanes;\n}\n\n/** The lane of every `task` call in a converted thread, in transcript order. */\nexport function taskSubagentsOfThread(\n messages: readonly ThreadMessage[]\n): SubagentDiscoverySnapshot[] {\n return messages.flatMap((message) => [...taskSubagentsOfTurn(message).values()]);\n}\n\n/**\n * Point a lane at an in-eval dispatch's live transcript, converted into a nested\n * thread, with the live fields it derives. Never regresses a known tool-call\n * count: a countless later event must not reset a lane to \"0 tool calls\".\n */\nfunction applyLaneTranscript(\n snap: SubagentDiscoverySnapshot,\n transcript: readonly LangChainMessage[]\n): void {\n snap.messages = convertSubagentTranscript(transcript, snap.status === 'running');\n snap.messageCount = transcript.length;\n const derived = deriveTranscript(snap.messages);\n if (derived.currentText) snap.currentText = derived.currentText;\n if (derived.model) snap.model = derived.model;\n if (derived.lastToolCall) snap.lastToolCall = derived.lastToolCall;\n snap.toolCallCount = Math.max(snap.toolCallCount, derived.toolCallCount);\n // An in-eval lane has no artifact todos channel: recover the plan from its\n // `write_todos` calls.\n snap.todos = snap.todos ?? derived.todos;\n}\n\n/**\n * The lanes of in-eval dispatches, from two sources: the *persisted* summaries\n * each finished `eval` ToolMessage carries in `artifact.ptc_subagents`\n * (terminal truth; the only source after a session reopen), then the *live*\n * `ptc_subagents` state channel (`ptcSubagents`) for dispatches still\n * streaming. A live entry never downgrades a terminal snapshot back to\n * `running` — a stale lifecycle entry whose terminal event was lost must not\n * resurrect a perpetually-running lane the persisted summary already settled.\n * A lane whose steps no longer ride but whose subagent checkpoint namespace is\n * recorded (`ns`) is `checkpointed`, and `history/lane {lane}` pages its\n * steps: a live entry a later run stripped to its summary, or a persisted\n * summary with no live entry (the registry died with the activation that\n * streamed it). A live entry speaks for its lane over the summary.\n */\nexport function deriveEvalSubagents(\n messages: readonly LangChainMessage[],\n ptcSubagents?: Record<string, PtcSubagentEntry>\n): Map<string, SubagentDiscoverySnapshot> {\n const byDispatchId = new Map<string, SubagentDiscoverySnapshot>();\n // Persisted in-eval dispatch summaries (terminal truth; survives reopen).\n for (const m of messages) {\n if (m.type !== 'tool' || m.name !== EVAL_TOOL_NAME) continue;\n for (const entry of ptcSubagentsFromArtifact(m.artifact)) {\n mergePtcSubagentEntry(byDispatchId, entry, {\n // The eval ended when these summaries were written, so any lane the\n // backend could not settle is a cancelled dispatch, never \"running\".\n status: entry.status === 'complete' ? 'complete' : 'error',\n fallbackEvalId: m.tool_call_id,\n });\n noteCheckpointedLane(byDispatchId.get(entry.id), entry);\n }\n }\n // Live lifecycle entries (the only signal while an eval is still streaming).\n if (ptcSubagents) {\n for (const entry of Object.values(ptcSubagents)) {\n if (!entry || typeof entry !== 'object' || typeof entry.id !== 'string' || !entry.id) {\n continue;\n }\n // This activation's registry speaks for the lane: the steps it streams,\n // else its own namespace, else nothing to page.\n const existing = byDispatchId.get(entry.id);\n if (existing?.source?.checkpointed === true) existing.source = undefined;\n mergePtcSubagentEntry(byDispatchId, entry, {\n status:\n entry.status === 'complete'\n ? 'complete'\n : entry.status === 'error'\n ? 'error'\n : entry.status === 'queued'\n ? 'queued'\n : 'running',\n });\n noteCheckpointedLane(byDispatchId.get(entry.id), entry);\n }\n }\n return byDispatchId;\n}\n\n/** Lifecycle progression order — a merge may only move a lane forward. */\nfunction subagentStatusRank(status: SubagentStatus): number {\n if (status === 'queued') return 0;\n if (status === 'running') return 1;\n return 2;\n}\n\nfunction mergePtcSubagentEntry(\n byDispatchId: Map<string, SubagentDiscoverySnapshot>,\n entry: PtcSubagentEntry,\n options: { status: SubagentStatus; fallbackEvalId?: string }\n): void {\n const { status, fallbackEvalId } = options;\n const existing = byDispatchId.get(entry.id);\n if (existing) {\n // A lane only ever moves FORWARD (queued → running → terminal): a stale\n // entry whose later event was lost must not resurrect a running lane to\n // queued or a finished lane to running — and a settled terminal outcome\n // never flips to the other terminal (first settled source wins).\n if (\n status === existing.status ||\n subagentStatusRank(status) > subagentStatusRank(existing.status)\n ) {\n existing.status = status;\n }\n const evalId = entry.eval_id ?? fallbackEvalId;\n if (evalId) existing.evalId = evalId;\n if (typeof entry.duration_ms === 'number') existing.durationMs = entry.duration_ms;\n // A count only arrives on terminal events; never let a countless later\n // event (or an older backend) regress a known count.\n if (typeof entry.tool_call_count === 'number') {\n existing.toolCallCount = Math.max(existing.toolCallCount, entry.tool_call_count);\n }\n if (Array.isArray(entry.messages) && entry.messages.length > 0) {\n applyLaneTranscript(existing, entry.messages);\n }\n applyLaneCut(existing, entry);\n applyLaneUsage(existing, entry);\n // Prefer the real output (Athena's in-eval output bridge); fall back to the\n // error string only when no (non-empty) output was captured. Same\n // empty-string/nullish rule as the create branch below.\n if (entry.output) existing.output = entry.output;\n else if (entry.error && !existing.output) existing.output = entry.error;\n return;\n }\n // `||` (not `??`) so an empty-string output falls back to the error, matching\n // the merge branch's truthy check above.\n const initialOutput = entry.output || entry.error;\n const evalId = entry.eval_id ?? fallbackEvalId;\n const created: SubagentDiscoverySnapshot = {\n id: entry.id,\n name: String(entry.subagent_type ?? 'subagent'),\n description: entry.label ?? entry.description ?? '',\n status,\n toolCallCount: typeof entry.tool_call_count === 'number' ? entry.tool_call_count : 0,\n messages: NO_TRANSCRIPT,\n messageCount: 0,\n currentText: '',\n ...(evalId ? { evalId } : {}),\n ...(typeof entry.duration_ms === 'number' ? { durationMs: entry.duration_ms } : {}),\n ...(initialOutput ? { output: initialOutput } : {}),\n };\n if (Array.isArray(entry.messages) && entry.messages.length > 0) {\n applyLaneTranscript(created, entry.messages);\n }\n applyLaneCut(created, entry);\n applyLaneUsage(created, entry);\n byDispatchId.set(entry.id, created);\n}\n\n/**\n * Where an in-eval dispatch's streamed steps ride, and what the wire left off\n * them, read off its entry's cut marker (`DEEP_AGENT_TRUNCATED_LANE_KEY`) as a\n * `task` card's is: the steps left off, and the whole lane's tool calls.\n */\nfunction applyLaneCut(snap: SubagentDiscoverySnapshot, entry: PtcSubagentEntry): void {\n const lane = readTruncatedLane(entry);\n if (Array.isArray(entry.messages) && entry.messages.length > 0) {\n snap.source = {\n lane: entry.id,\n transcript: entry.messages,\n ...(lane !== null && { truncated: lane }),\n };\n }\n if (lane === null) return;\n snap.omittedMessageCount = Math.max(0, lane.messages - snap.messageCount);\n snap.toolCallCount = Math.max(snap.toolCallCount, lane.toolCalls);\n}\n\nconst NO_LANE_STEPS: readonly LangChainMessage[] = [];\n\n/**\n * An entry that recorded its subagent's checkpoint namespace (`ns`, a registry\n * entry or the summary an eval persisted, since agora writes it) pages its\n * lane from that checkpoint when no streamed steps carry it.\n */\nfunction noteCheckpointedLane(\n snap: SubagentDiscoverySnapshot | undefined,\n entry: PtcSubagentEntry\n): void {\n if (snap === undefined || snap.source !== undefined) return;\n if (typeof entry.ns !== 'string' || !entry.ns) return;\n snap.source = { lane: entry.id, transcript: NO_LANE_STEPS, checkpointed: true };\n}\n\n/**\n * An in-eval lane's token use, from its entry's host total or the native steps\n * of its live transcript. A merge that brings neither keeps what the lane has.\n */\nfunction applyLaneUsage(snap: SubagentDiscoverySnapshot, entry: PtcSubagentEntry): void {\n const usage = laneTokenUsage(\n entry,\n transcriptStepUsage(snap.messages),\n snap.status,\n (snap.omittedMessageCount ?? 0) > 0\n );\n if (usage !== undefined) snap.usage = usage;\n}\n\n/**\n * The first call of a nested thread with one of `toolCallIds`: the calls a\n * subagent made are the tool-call parts of its transcript, ids included.\n */\nfunction findToolCall({\n messages,\n toolCallIds,\n}: {\n messages: readonly ThreadMessage[] | undefined;\n toolCallIds: ReadonlySet<string>;\n}): ToolCallMessagePart | undefined {\n if (messages === undefined) return undefined;\n for (const message of messages) {\n if (message.role !== 'assistant') continue;\n for (const part of message.content) {\n if (part.type === 'tool-call' && toolCallIds.has(part.toolCallId)) return part;\n }\n }\n return undefined;\n}\n\n/**\n * Whether a subagent lane waits on a person's approval, given the gated calls\n * still waiting on one (`toolCallIdsAwaitingApproval`): its own dispatch is the\n * gated call (a per-dispatch `task` gate), or a call it made is (a gated tool\n * raised inside the delegated subagent). The approval names the gated call's\n * `tool_call_id` and never the lane, and a lane's transcript carries the calls\n * it made with their ids, so the call id is the join. A settled lane waits on\n * nobody.\n */\nexport function subagentAwaitingApproval({\n lane,\n toolCallIds,\n}: {\n lane: Pick<SubagentDiscoverySnapshot, 'id' | 'status' | 'messages'>;\n /** The gated calls still waiting on a decision (`toolCallIdsAwaitingApproval`). */\n toolCallIds: ReadonlySet<string>;\n}): boolean {\n if (toolCallIds.size === 0 || isTerminalSubagentStatus(lane.status)) return false;\n return (\n toolCallIds.has(lane.id) ||\n findToolCall({ messages: lane.messages, toolCallIds }) !== undefined\n );\n}\n\n/**\n * The call a subagent made that waits on a person's approval (a gated tool\n * raised inside the delegated subagent), read off its transcript — what the\n * lane card names while it waits. `undefined` when the lane made none, which\n * includes a lane whose own dispatch is the gated call.\n */\nexport function subagentToolCallAwaitingApproval({\n lane,\n toolCallIds,\n}: {\n lane: Pick<SubagentDiscoverySnapshot, 'status' | 'messages'>;\n /** The gated calls still waiting on a decision (`toolCallIdsAwaitingApproval`). */\n toolCallIds: ReadonlySet<string>;\n}): LangChainToolCall | undefined {\n if (toolCallIds.size === 0 || isTerminalSubagentStatus(lane.status)) return undefined;\n const part = findToolCall({ messages: lane.messages, toolCallIds });\n return part === undefined\n ? undefined\n : { id: part.toolCallId, name: part.toolName, args: part.args };\n}\n\n/**\n * The calls of one converted turn that wait on a person's approval, in turn\n * order: a gated call of the turn itself, or a `task` call not yet settled\n * (no result, or the running placeholder) whose lane holds a gated call — the\n * steps the turn's step list reads as waiting rather than running or done.\n */\nexport function turnToolCallsAwaitingApproval({\n message,\n toolCallIds,\n}: {\n message: ThreadMessage;\n /** The gated calls still waiting on a decision (`toolCallIdsAwaitingApproval`). */\n toolCallIds: ReadonlySet<string>;\n}): string[] {\n if (toolCallIds.size === 0 || message.role !== 'assistant') return [];\n const ids: string[] = [];\n for (const part of message.content) {\n if (part.type !== 'tool-call') continue;\n if (toolCallIds.has(part.toolCallId)) {\n ids.push(part.toolCallId);\n continue;\n }\n if (part.toolName !== TASK_TOOL_NAME) continue;\n const settled = part.result !== undefined && part.isPreliminary !== true;\n if (!settled && findToolCall({ messages: part.messages, toolCallIds }) !== undefined) {\n ids.push(part.toolCallId);\n }\n }\n return ids;\n}\n\nconst NO_WAITING_TOOL_CALLS: ReadonlySet<string> = new Set();\n/** Joins call ids into one selector value; an id never holds it. */\nconst TOOL_CALL_ID_SEPARATOR = '\\n';\n\n/**\n * {@link turnToolCallsAwaitingApproval} for the message in scope: what a\n * turn's step list takes as `waitingToolCallIds`, given the run's waiting\n * calls (`toolCallIdsAwaitingApproval`). Selected as a joined string, so a\n * streamed token re-renders the caller only when the waiting steps change, and\n * the set keeps its identity while they do not. Olympus's activity card and\n * the SDK chat's turns both read it.\n */\nexport function useTurnToolCallsAwaitingApproval(\n toolCallIds: ReadonlySet<string>\n): ReadonlySet<string> {\n const key = useAuiState((s) =>\n toolCallIds.size === 0\n ? ''\n : turnToolCallsAwaitingApproval({ message: s.message, toolCallIds }).join(\n TOOL_CALL_ID_SEPARATOR\n )\n );\n return useMemo(\n () => (key === '' ? NO_WAITING_TOOL_CALLS : new Set(key.split(TOOL_CALL_ID_SEPARATOR))),\n [key]\n );\n}\n\n/** Result text shown for a dispatch whose owning run ended before it finished. */\nexport const ORPHANED_SUBAGENT_OUTPUT =\n 'Interrupted — the run that dispatched this subagent ended before it finished.';\n\n/**\n * Settle snapshots orphaned by their dispatching context: once the owner (e.g.\n * the `eval` tool call whose in-eval `task()` issued them) is itself terminal,\n * nothing can ever deliver a `complete`/`error` lifecycle event for a lane still\n * `queued`/`running` — the dispatch coroutines were cancelled with the eval. Those\n * lanes are coerced to `error` with an interruption message so the UI can't show\n * perpetual \"Running · no activity\" ghosts. Returns the input array unchanged\n * (same reference) when there is nothing to settle.\n */\nexport function finalizeOrphanedSubagents(\n snapshots: readonly SubagentDiscoverySnapshot[],\n ownerTerminal: boolean\n): readonly SubagentDiscoverySnapshot[] {\n if (!ownerTerminal || snapshots.every((s) => isTerminalSubagentStatus(s.status))) {\n return snapshots;\n }\n return snapshots.map((s) =>\n isTerminalSubagentStatus(s.status)\n ? s\n : { ...s, status: 'error', output: s.output || ORPHANED_SUBAGENT_OUTPUT }\n );\n}\n\n/**\n * The `task` tool calls sharing `toolCallId`'s parent AI message — the parallel\n * fan-out siblings, in declaration order. Parallel `task` calls always live on ONE\n * AI message's `tool_calls`, so \"same parent message\" IS the parallelism boundary;\n * sequential delegations sit on separate AI messages and form singleton groups.\n * The FIRST sibling is the group's `anchorId`: its tool-part render draws the whole\n * side-by-side group and the other siblings render nothing, keeping the layout\n * change fully inside the `task` tool UI. Falls back to a singleton group when the\n * parent AI message isn't among `messages` (a turn's bound sources, or a raw\n * transcript).\n */\nexport interface TaskSiblingGroup {\n /** Sibling `task` tool-call ids in declaration order. */\n ids: string[];\n /** The first sibling — the one tool-part render that owns the group's UI. */\n anchorId: string;\n}\n\nexport function taskSiblingGroup(\n messages: readonly LangChainMessage[],\n toolCallId: string\n): TaskSiblingGroup {\n for (const m of messages) {\n if (m.type !== 'ai' || !m.tool_calls) continue;\n if (!m.tool_calls.some((tc) => tc.id === toolCallId)) continue;\n const ids = m.tool_calls\n .filter((tc) => tc.name === TASK_TOOL_NAME && tc.id)\n .map((tc) => tc.id as string);\n if (ids.length > 0) return { ids, anchorId: ids[0] ?? toolCallId };\n break;\n }\n return { ids: [toolCallId], anchorId: toolCallId };\n}\n"],"names":["DEEP_AGENT_TRUNCATED_LANE_KEY","DEEP_AGENT_LANE_USAGE_KEY","getMessageText","withRepeatedResult","getExternalStoreMessages","TASK_TOOL_NAME","useAuiState","useMemo"],"mappings":"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"}