@stigmer/react 0.3.4 → 0.4.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 (450) hide show
  1. package/billing/AutoRechargeCard.d.ts +38 -0
  2. package/billing/AutoRechargeCard.d.ts.map +1 -0
  3. package/billing/AutoRechargeCard.js +90 -0
  4. package/billing/AutoRechargeCard.js.map +1 -0
  5. package/billing/BillingSection.d.ts +32 -0
  6. package/billing/BillingSection.d.ts.map +1 -0
  7. package/billing/BillingSection.js +81 -0
  8. package/billing/BillingSection.js.map +1 -0
  9. package/billing/CreditBalanceCard.d.ts +25 -0
  10. package/billing/CreditBalanceCard.d.ts.map +1 -0
  11. package/billing/CreditBalanceCard.js +28 -0
  12. package/billing/CreditBalanceCard.js.map +1 -0
  13. package/billing/CreditLedgerTable.d.ts +22 -0
  14. package/billing/CreditLedgerTable.d.ts.map +1 -0
  15. package/billing/CreditLedgerTable.js +75 -0
  16. package/billing/CreditLedgerTable.js.map +1 -0
  17. package/billing/CreditPackGrid.d.ts +31 -0
  18. package/billing/CreditPackGrid.d.ts.map +1 -0
  19. package/billing/CreditPackGrid.js +35 -0
  20. package/billing/CreditPackGrid.js.map +1 -0
  21. package/billing/LowBalanceBanner.d.ts +26 -0
  22. package/billing/LowBalanceBanner.d.ts.map +1 -0
  23. package/billing/LowBalanceBanner.js +33 -0
  24. package/billing/LowBalanceBanner.js.map +1 -0
  25. package/billing/PaymentMethodCard.d.ts +35 -0
  26. package/billing/PaymentMethodCard.d.ts.map +1 -0
  27. package/billing/PaymentMethodCard.js +48 -0
  28. package/billing/PaymentMethodCard.js.map +1 -0
  29. package/billing/credit-packs.d.ts +25 -0
  30. package/billing/credit-packs.d.ts.map +1 -0
  31. package/billing/credit-packs.js +39 -0
  32. package/billing/credit-packs.js.map +1 -0
  33. package/billing/format.d.ts +39 -0
  34. package/billing/format.d.ts.map +1 -0
  35. package/billing/format.js +90 -0
  36. package/billing/format.js.map +1 -0
  37. package/billing/index.d.ts +32 -0
  38. package/billing/index.d.ts.map +1 -0
  39. package/billing/index.js +21 -0
  40. package/billing/index.js.map +1 -0
  41. package/billing/useBillingAccount.d.ts +40 -0
  42. package/billing/useBillingAccount.d.ts.map +1 -0
  43. package/billing/useBillingAccount.js +35 -0
  44. package/billing/useBillingAccount.js.map +1 -0
  45. package/billing/useBillingUsageReport.d.ts +42 -0
  46. package/billing/useBillingUsageReport.d.ts.map +1 -0
  47. package/billing/useBillingUsageReport.js +43 -0
  48. package/billing/useBillingUsageReport.js.map +1 -0
  49. package/billing/useCreateBillingPortalSession.d.ts +35 -0
  50. package/billing/useCreateBillingPortalSession.d.ts.map +1 -0
  51. package/billing/useCreateBillingPortalSession.js +50 -0
  52. package/billing/useCreateBillingPortalSession.js.map +1 -0
  53. package/billing/useCreateCheckoutSession.d.ts +54 -0
  54. package/billing/useCreateCheckoutSession.d.ts.map +1 -0
  55. package/billing/useCreateCheckoutSession.js +58 -0
  56. package/billing/useCreateCheckoutSession.js.map +1 -0
  57. package/billing/useCreditLedger.d.ts +48 -0
  58. package/billing/useCreditLedger.d.ts.map +1 -0
  59. package/billing/useCreditLedger.js +39 -0
  60. package/billing/useCreditLedger.js.map +1 -0
  61. package/billing/useCustomerModelPricing.d.ts +41 -0
  62. package/billing/useCustomerModelPricing.d.ts.map +1 -0
  63. package/billing/useCustomerModelPricing.js +37 -0
  64. package/billing/useCustomerModelPricing.js.map +1 -0
  65. package/billing/useSetAutoRechargeConfig.d.ts +50 -0
  66. package/billing/useSetAutoRechargeConfig.d.ts.map +1 -0
  67. package/billing/useSetAutoRechargeConfig.js +53 -0
  68. package/billing/useSetAutoRechargeConfig.js.map +1 -0
  69. package/composer/ComposerToolbar.js +1 -1
  70. package/composer/ComposerToolbar.js.map +1 -1
  71. package/composer/SessionComposer.d.ts +1 -1
  72. package/composer/SessionComposer.d.ts.map +1 -1
  73. package/composer/SessionComposer.js +19 -4
  74. package/composer/SessionComposer.js.map +1 -1
  75. package/composer/__tests__/SessionComposer-memo.test.d.ts +2 -0
  76. package/composer/__tests__/SessionComposer-memo.test.d.ts.map +1 -0
  77. package/composer/__tests__/SessionComposer-memo.test.js +23 -0
  78. package/composer/__tests__/SessionComposer-memo.test.js.map +1 -0
  79. package/execution/ApprovalCard.d.ts +5 -1
  80. package/execution/ApprovalCard.d.ts.map +1 -1
  81. package/execution/ApprovalCard.js +7 -3
  82. package/execution/ApprovalCard.js.map +1 -1
  83. package/execution/ExecutionPhaseBadge.d.ts +1 -1
  84. package/execution/ExecutionPhaseBadge.d.ts.map +1 -1
  85. package/execution/ExecutionPhaseBadge.js +3 -2
  86. package/execution/ExecutionPhaseBadge.js.map +1 -1
  87. package/execution/MessageEntry.d.ts +7 -3
  88. package/execution/MessageEntry.d.ts.map +1 -1
  89. package/execution/MessageEntry.js +19 -8
  90. package/execution/MessageEntry.js.map +1 -1
  91. package/execution/MessageThread.d.ts +84 -3
  92. package/execution/MessageThread.d.ts.map +1 -1
  93. package/execution/MessageThread.js +113 -65
  94. package/execution/MessageThread.js.map +1 -1
  95. package/execution/SetupProgress.d.ts +1 -1
  96. package/execution/SetupProgress.d.ts.map +1 -1
  97. package/execution/SetupProgress.js +3 -3
  98. package/execution/SetupProgress.js.map +1 -1
  99. package/execution/SubAgentSection.d.ts +5 -1
  100. package/execution/SubAgentSection.d.ts.map +1 -1
  101. package/execution/SubAgentSection.js +13 -7
  102. package/execution/SubAgentSection.js.map +1 -1
  103. package/execution/ThreadSkeleton.d.ts +22 -0
  104. package/execution/ThreadSkeleton.d.ts.map +1 -0
  105. package/execution/ThreadSkeleton.js +26 -0
  106. package/execution/ThreadSkeleton.js.map +1 -0
  107. package/execution/ToolCallGroup.d.ts +16 -1
  108. package/execution/ToolCallGroup.d.ts.map +1 -1
  109. package/execution/ToolCallGroup.js +31 -3
  110. package/execution/ToolCallGroup.js.map +1 -1
  111. package/execution/UsageWidget.d.ts +1 -1
  112. package/execution/__tests__/message-entry.test.d.ts +2 -0
  113. package/execution/__tests__/message-entry.test.d.ts.map +1 -0
  114. package/execution/__tests__/message-entry.test.js +178 -0
  115. package/execution/__tests__/message-entry.test.js.map +1 -0
  116. package/execution/__tests__/thread-keys.test.d.ts +2 -0
  117. package/execution/__tests__/thread-keys.test.d.ts.map +1 -0
  118. package/execution/__tests__/thread-keys.test.js +289 -0
  119. package/execution/__tests__/thread-keys.test.js.map +1 -0
  120. package/execution/__tests__/thread-memoization.test.d.ts +2 -0
  121. package/execution/__tests__/thread-memoization.test.d.ts.map +1 -0
  122. package/execution/__tests__/thread-memoization.test.js +262 -0
  123. package/execution/__tests__/thread-memoization.test.js.map +1 -0
  124. package/execution/__tests__/thread-skeleton.test.d.ts +2 -0
  125. package/execution/__tests__/thread-skeleton.test.d.ts.map +1 -0
  126. package/execution/__tests__/thread-skeleton.test.js +35 -0
  127. package/execution/__tests__/thread-skeleton.test.js.map +1 -0
  128. package/execution/__tests__/useExecutionStream.test.js +73 -10
  129. package/execution/__tests__/useExecutionStream.test.js.map +1 -1
  130. package/execution/__tests__/useSessionVariables-stability.test.d.ts +2 -0
  131. package/execution/__tests__/useSessionVariables-stability.test.d.ts.map +1 -0
  132. package/execution/__tests__/useSessionVariables-stability.test.js +69 -0
  133. package/execution/__tests__/useSessionVariables-stability.test.js.map +1 -0
  134. package/execution/__tests__/virtualized-thread.test.d.ts +2 -0
  135. package/execution/__tests__/virtualized-thread.test.d.ts.map +1 -0
  136. package/execution/__tests__/virtualized-thread.test.js +274 -0
  137. package/execution/__tests__/virtualized-thread.test.js.map +1 -0
  138. package/execution/index.d.ts +2 -0
  139. package/execution/index.d.ts.map +1 -1
  140. package/execution/index.js +1 -0
  141. package/execution/index.js.map +1 -1
  142. package/execution/useExecutionStream.d.ts +35 -10
  143. package/execution/useExecutionStream.d.ts.map +1 -1
  144. package/execution/useExecutionStream.js +79 -40
  145. package/execution/useExecutionStream.js.map +1 -1
  146. package/execution/useSessionVariables.d.ts.map +1 -1
  147. package/execution/useSessionVariables.js +4 -3
  148. package/execution/useSessionVariables.js.map +1 -1
  149. package/github/useGitHubConnection.d.ts.map +1 -1
  150. package/github/useGitHubConnection.js +5 -4
  151. package/github/useGitHubConnection.js.map +1 -1
  152. package/identity-account/index.d.ts +2 -0
  153. package/identity-account/index.d.ts.map +1 -0
  154. package/identity-account/index.js +2 -0
  155. package/identity-account/index.js.map +1 -0
  156. package/identity-account/useIdentityAccountGate.d.ts +81 -0
  157. package/identity-account/useIdentityAccountGate.d.ts.map +1 -0
  158. package/identity-account/useIdentityAccountGate.js +100 -0
  159. package/identity-account/useIdentityAccountGate.js.map +1 -0
  160. package/index.d.ts +10 -4
  161. package/index.d.ts.map +1 -1
  162. package/index.js +8 -2
  163. package/index.js.map +1 -1
  164. package/internal/FetchCacheProvider.d.ts +44 -0
  165. package/internal/FetchCacheProvider.d.ts.map +1 -0
  166. package/internal/FetchCacheProvider.js +61 -0
  167. package/internal/FetchCacheProvider.js.map +1 -0
  168. package/internal/JumpToLatestButton.d.ts +14 -0
  169. package/internal/JumpToLatestButton.d.ts.map +1 -0
  170. package/internal/JumpToLatestButton.js +19 -0
  171. package/internal/JumpToLatestButton.js.map +1 -0
  172. package/internal/ThreadItemWrapper.d.ts +20 -0
  173. package/internal/ThreadItemWrapper.d.ts.map +1 -0
  174. package/internal/ThreadItemWrapper.js +44 -0
  175. package/internal/ThreadItemWrapper.js.map +1 -0
  176. package/internal/VirtualizedThread.d.ts +25 -0
  177. package/internal/VirtualizedThread.d.ts.map +1 -0
  178. package/internal/VirtualizedThread.js +58 -0
  179. package/internal/VirtualizedThread.js.map +1 -0
  180. package/internal/__tests__/fetch-cache.test.d.ts +2 -0
  181. package/internal/__tests__/fetch-cache.test.d.ts.map +1 -0
  182. package/internal/__tests__/fetch-cache.test.js +182 -0
  183. package/internal/__tests__/fetch-cache.test.js.map +1 -0
  184. package/internal/__tests__/stream-controller.test.d.ts +2 -0
  185. package/internal/__tests__/stream-controller.test.d.ts.map +1 -0
  186. package/internal/__tests__/stream-controller.test.js +294 -0
  187. package/internal/__tests__/stream-controller.test.js.map +1 -0
  188. package/internal/__tests__/thread-animation.test.d.ts +2 -0
  189. package/internal/__tests__/thread-animation.test.d.ts.map +1 -0
  190. package/internal/__tests__/thread-animation.test.js +79 -0
  191. package/internal/__tests__/thread-animation.test.js.map +1 -0
  192. package/internal/__tests__/useAutoScroll.test.d.ts +2 -0
  193. package/internal/__tests__/useAutoScroll.test.d.ts.map +1 -0
  194. package/internal/__tests__/useAutoScroll.test.js +188 -0
  195. package/internal/__tests__/useAutoScroll.test.js.map +1 -0
  196. package/internal/__tests__/useFetch-cache.test.d.ts +2 -0
  197. package/internal/__tests__/useFetch-cache.test.d.ts.map +1 -0
  198. package/internal/__tests__/useFetch-cache.test.js +137 -0
  199. package/internal/__tests__/useFetch-cache.test.js.map +1 -0
  200. package/internal/dev/__tests__/use-key-stability.test.d.ts +2 -0
  201. package/internal/dev/__tests__/use-key-stability.test.d.ts.map +1 -0
  202. package/internal/dev/__tests__/use-key-stability.test.js +72 -0
  203. package/internal/dev/__tests__/use-key-stability.test.js.map +1 -0
  204. package/internal/dev/__tests__/use-render-tracer.test.d.ts +2 -0
  205. package/internal/dev/__tests__/use-render-tracer.test.d.ts.map +1 -0
  206. package/internal/dev/__tests__/use-render-tracer.test.js +55 -0
  207. package/internal/dev/__tests__/use-render-tracer.test.js.map +1 -0
  208. package/internal/dev/dom-counter.d.ts +14 -0
  209. package/internal/dev/dom-counter.d.ts.map +1 -0
  210. package/internal/dev/dom-counter.js +39 -0
  211. package/internal/dev/dom-counter.js.map +1 -0
  212. package/internal/dev/index.d.ts +6 -0
  213. package/internal/dev/index.d.ts.map +1 -0
  214. package/internal/dev/index.js +6 -0
  215. package/internal/dev/index.js.map +1 -0
  216. package/internal/dev/profiler-wrapper.d.ts +16 -0
  217. package/internal/dev/profiler-wrapper.d.ts.map +1 -0
  218. package/internal/dev/profiler-wrapper.js +31 -0
  219. package/internal/dev/profiler-wrapper.js.map +1 -0
  220. package/internal/dev/use-key-stability.d.ts +22 -0
  221. package/internal/dev/use-key-stability.d.ts.map +1 -0
  222. package/internal/dev/use-key-stability.js +67 -0
  223. package/internal/dev/use-key-stability.js.map +1 -0
  224. package/internal/dev/use-render-tracer.d.ts +13 -0
  225. package/internal/dev/use-render-tracer.d.ts.map +1 -0
  226. package/internal/dev/use-render-tracer.js +57 -0
  227. package/internal/dev/use-render-tracer.js.map +1 -0
  228. package/internal/dev/use-stream-rate.d.ts +23 -0
  229. package/internal/dev/use-stream-rate.d.ts.map +1 -0
  230. package/internal/dev/use-stream-rate.js +94 -0
  231. package/internal/dev/use-stream-rate.js.map +1 -0
  232. package/internal/fetch-cache.d.ts +72 -0
  233. package/internal/fetch-cache.d.ts.map +1 -0
  234. package/internal/fetch-cache.js +118 -0
  235. package/internal/fetch-cache.js.map +1 -0
  236. package/internal/store/__tests__/conversation-store.test.d.ts +2 -0
  237. package/internal/store/__tests__/conversation-store.test.d.ts.map +1 -0
  238. package/internal/store/__tests__/conversation-store.test.js +200 -0
  239. package/internal/store/__tests__/conversation-store.test.js.map +1 -0
  240. package/internal/store/__tests__/structural-share.test.d.ts +2 -0
  241. package/internal/store/__tests__/structural-share.test.d.ts.map +1 -0
  242. package/internal/store/__tests__/structural-share.test.js +368 -0
  243. package/internal/store/__tests__/structural-share.test.js.map +1 -0
  244. package/internal/store/conversation-store.d.ts +62 -0
  245. package/internal/store/conversation-store.d.ts.map +1 -0
  246. package/internal/store/conversation-store.js +95 -0
  247. package/internal/store/conversation-store.js.map +1 -0
  248. package/internal/store/index.d.ts +31 -0
  249. package/internal/store/index.d.ts.map +1 -0
  250. package/internal/store/index.js +54 -0
  251. package/internal/store/index.js.map +1 -0
  252. package/internal/store/structural-share.d.ts +13 -0
  253. package/internal/store/structural-share.d.ts.map +1 -0
  254. package/internal/store/structural-share.js +240 -0
  255. package/internal/store/structural-share.js.map +1 -0
  256. package/internal/stream-controller.d.ts +85 -0
  257. package/internal/stream-controller.d.ts.map +1 -0
  258. package/internal/stream-controller.js +146 -0
  259. package/internal/stream-controller.js.map +1 -0
  260. package/internal/useAutoScroll.d.ts +32 -0
  261. package/internal/useAutoScroll.d.ts.map +1 -0
  262. package/internal/useAutoScroll.js +97 -0
  263. package/internal/useAutoScroll.js.map +1 -0
  264. package/internal/useFetch.d.ts +14 -0
  265. package/internal/useFetch.d.ts.map +1 -1
  266. package/internal/useFetch.js +32 -2
  267. package/internal/useFetch.js.map +1 -1
  268. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  269. package/mcp-server/McpServerDetailView.js +3 -3
  270. package/mcp-server/McpServerDetailView.js.map +1 -1
  271. package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
  272. package/mcp-server/useMcpServerOAuthConnect.js +37 -9
  273. package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
  274. package/package.json +7 -5
  275. package/session/__tests__/useNewSessionFlow.test.js +16 -0
  276. package/session/__tests__/useNewSessionFlow.test.js.map +1 -1
  277. package/session/__tests__/usePersistedModel.test.d.ts +2 -0
  278. package/session/__tests__/usePersistedModel.test.d.ts.map +1 -0
  279. package/session/__tests__/usePersistedModel.test.js +82 -0
  280. package/session/__tests__/usePersistedModel.test.js.map +1 -0
  281. package/session/__tests__/useSession.test.d.ts +2 -0
  282. package/session/__tests__/useSession.test.d.ts.map +1 -0
  283. package/session/__tests__/useSession.test.js +130 -0
  284. package/session/__tests__/useSession.test.js.map +1 -0
  285. package/session/useNewSessionFlow.d.ts.map +1 -1
  286. package/session/useNewSessionFlow.js +12 -6
  287. package/session/useNewSessionFlow.js.map +1 -1
  288. package/session/usePersistedModel.d.ts +3 -0
  289. package/session/usePersistedModel.d.ts.map +1 -1
  290. package/session/usePersistedModel.js +27 -2
  291. package/session/usePersistedModel.js.map +1 -1
  292. package/session/useSession.d.ts.map +1 -1
  293. package/session/useSession.js +1 -1
  294. package/session/useSession.js.map +1 -1
  295. package/session/useSessionConversation.d.ts.map +1 -1
  296. package/session/useSessionConversation.js +9 -1
  297. package/session/useSessionConversation.js.map +1 -1
  298. package/session/useSessionExecutions.d.ts.map +1 -1
  299. package/session/useSessionExecutions.js +1 -1
  300. package/session/useSessionExecutions.js.map +1 -1
  301. package/session/useSessionPageFlow.js +1 -1
  302. package/session/useSessionPageFlow.js.map +1 -1
  303. package/session/useSessionUsage.d.ts +24 -40
  304. package/session/useSessionUsage.d.ts.map +1 -1
  305. package/session/useSessionUsage.js +64 -97
  306. package/session/useSessionUsage.js.map +1 -1
  307. package/settings/BillingSection.d.ts +3 -0
  308. package/settings/BillingSection.d.ts.map +1 -0
  309. package/settings/BillingSection.js +3 -0
  310. package/settings/BillingSection.js.map +1 -0
  311. package/settings/index.d.ts +2 -0
  312. package/settings/index.d.ts.map +1 -1
  313. package/settings/index.js +1 -0
  314. package/settings/index.js.map +1 -1
  315. package/settings/settings-nav.js +1 -1
  316. package/settings/settings-nav.js.map +1 -1
  317. package/src/billing/AutoRechargeCard.tsx +274 -0
  318. package/src/billing/BillingSection.tsx +255 -0
  319. package/src/billing/CreditBalanceCard.tsx +81 -0
  320. package/src/billing/CreditLedgerTable.tsx +281 -0
  321. package/src/billing/CreditPackGrid.tsx +132 -0
  322. package/src/billing/LowBalanceBanner.tsx +67 -0
  323. package/src/billing/PaymentMethodCard.tsx +133 -0
  324. package/src/billing/credit-packs.ts +54 -0
  325. package/src/billing/format.ts +97 -0
  326. package/src/billing/index.ts +51 -0
  327. package/src/billing/useBillingAccount.ts +64 -0
  328. package/src/billing/useBillingUsageReport.ts +73 -0
  329. package/src/billing/useCreateBillingPortalSession.ts +76 -0
  330. package/src/billing/useCreateCheckoutSession.ts +101 -0
  331. package/src/billing/useCreditLedger.ts +79 -0
  332. package/src/billing/useCustomerModelPricing.ts +67 -0
  333. package/src/billing/useSetAutoRechargeConfig.ts +90 -0
  334. package/src/composer/ComposerToolbar.tsx +1 -1
  335. package/src/composer/SessionComposer.tsx +22 -4
  336. package/src/composer/__tests__/SessionComposer-memo.test.ts +26 -0
  337. package/src/execution/ApprovalCard.tsx +7 -3
  338. package/src/execution/ExecutionPhaseBadge.tsx +3 -2
  339. package/src/execution/MessageEntry.tsx +27 -16
  340. package/src/execution/MessageThread.tsx +308 -131
  341. package/src/execution/SetupProgress.tsx +3 -3
  342. package/src/execution/SubAgentSection.tsx +14 -6
  343. package/src/execution/ThreadSkeleton.tsx +73 -0
  344. package/src/execution/ToolCallGroup.tsx +36 -3
  345. package/src/execution/UsageWidget.tsx +1 -1
  346. package/src/execution/__tests__/message-entry.test.tsx +236 -0
  347. package/src/execution/__tests__/thread-keys.test.ts +409 -0
  348. package/src/execution/__tests__/thread-memoization.test.ts +320 -0
  349. package/src/execution/__tests__/thread-skeleton.test.tsx +44 -0
  350. package/src/execution/__tests__/useExecutionStream.test.tsx +109 -12
  351. package/src/execution/__tests__/useSessionVariables-stability.test.ts +95 -0
  352. package/src/execution/__tests__/virtualized-thread.test.tsx +401 -0
  353. package/src/execution/index.ts +3 -0
  354. package/src/execution/useExecutionStream.ts +123 -48
  355. package/src/execution/useSessionVariables.ts +17 -12
  356. package/src/github/useGitHubConnection.ts +18 -13
  357. package/src/identity-account/index.ts +5 -0
  358. package/src/identity-account/useIdentityAccountGate.ts +163 -0
  359. package/src/index.ts +73 -0
  360. package/src/internal/FetchCacheProvider.tsx +74 -0
  361. package/src/internal/JumpToLatestButton.tsx +61 -0
  362. package/src/internal/ThreadItemWrapper.tsx +65 -0
  363. package/src/internal/VirtualizedThread.tsx +162 -0
  364. package/src/internal/__tests__/fetch-cache.test.ts +230 -0
  365. package/src/internal/__tests__/stream-controller.test.ts +395 -0
  366. package/src/internal/__tests__/thread-animation.test.tsx +121 -0
  367. package/src/internal/__tests__/useAutoScroll.test.tsx +261 -0
  368. package/src/internal/__tests__/useFetch-cache.test.ts +214 -0
  369. package/src/internal/dev/__tests__/use-key-stability.test.ts +124 -0
  370. package/src/internal/dev/__tests__/use-render-tracer.test.ts +78 -0
  371. package/src/internal/dev/dom-counter.ts +47 -0
  372. package/src/internal/dev/index.ts +5 -0
  373. package/src/internal/dev/profiler-wrapper.tsx +52 -0
  374. package/src/internal/dev/use-key-stability.ts +86 -0
  375. package/src/internal/dev/use-render-tracer.ts +70 -0
  376. package/src/internal/dev/use-stream-rate.ts +138 -0
  377. package/src/internal/fetch-cache.ts +155 -0
  378. package/src/internal/store/__tests__/conversation-store.test.ts +257 -0
  379. package/src/internal/store/__tests__/structural-share.test.ts +454 -0
  380. package/src/internal/store/conversation-store.ts +128 -0
  381. package/src/internal/store/index.ts +68 -0
  382. package/src/internal/store/structural-share.ts +318 -0
  383. package/src/internal/stream-controller.ts +201 -0
  384. package/src/internal/useAutoScroll.ts +121 -0
  385. package/src/internal/useFetch.ts +51 -2
  386. package/src/mcp-server/McpServerDetailView.tsx +15 -0
  387. package/src/mcp-server/useMcpServerOAuthConnect.ts +37 -9
  388. package/src/session/__tests__/useNewSessionFlow.test.tsx +22 -0
  389. package/src/session/__tests__/usePersistedModel.test.tsx +117 -0
  390. package/src/session/__tests__/useSession.test.tsx +187 -0
  391. package/src/session/useNewSessionFlow.ts +12 -6
  392. package/src/session/usePersistedModel.ts +28 -2
  393. package/src/session/useSession.ts +1 -0
  394. package/src/session/useSessionConversation.ts +11 -2
  395. package/src/session/useSessionExecutions.ts +1 -0
  396. package/src/session/useSessionPageFlow.ts +1 -1
  397. package/src/session/useSessionUsage.ts +102 -123
  398. package/src/settings/BillingSection.tsx +4 -0
  399. package/src/settings/index.ts +2 -0
  400. package/src/settings/settings-nav.ts +1 -1
  401. package/src/styles.css +31 -0
  402. package/src/usage/AgentBreakdownList.tsx +147 -0
  403. package/src/usage/CreditRunwayIndicator.tsx +71 -0
  404. package/src/usage/ExportButton.tsx +115 -0
  405. package/src/usage/HarnessSplitCard.tsx +103 -0
  406. package/src/usage/OrgUsagePanel.tsx +109 -45
  407. package/src/usage/index.ts +15 -0
  408. package/src/usage/useExportCSV.ts +115 -0
  409. package/src/usage/useOrgUsageReport.ts +2 -1
  410. package/src/workspace/__tests__/useWorkspaceEntries-stability.test.ts +76 -0
  411. package/src/workspace/useWorkspaceEntries.ts +16 -11
  412. package/styles.css +1 -1
  413. package/usage/AgentBreakdownList.d.ts +21 -0
  414. package/usage/AgentBreakdownList.d.ts.map +1 -0
  415. package/usage/AgentBreakdownList.js +44 -0
  416. package/usage/AgentBreakdownList.js.map +1 -0
  417. package/usage/CreditRunwayIndicator.d.ts +21 -0
  418. package/usage/CreditRunwayIndicator.d.ts.map +1 -0
  419. package/usage/CreditRunwayIndicator.js +38 -0
  420. package/usage/CreditRunwayIndicator.js.map +1 -0
  421. package/usage/ExportButton.d.ts +20 -0
  422. package/usage/ExportButton.d.ts.map +1 -0
  423. package/usage/ExportButton.js +36 -0
  424. package/usage/ExportButton.js.map +1 -0
  425. package/usage/HarnessSplitCard.d.ts +17 -0
  426. package/usage/HarnessSplitCard.d.ts.map +1 -0
  427. package/usage/HarnessSplitCard.js +38 -0
  428. package/usage/HarnessSplitCard.js.map +1 -0
  429. package/usage/OrgUsagePanel.d.ts.map +1 -1
  430. package/usage/OrgUsagePanel.js +30 -22
  431. package/usage/OrgUsagePanel.js.map +1 -1
  432. package/usage/index.d.ts +10 -0
  433. package/usage/index.d.ts.map +1 -1
  434. package/usage/index.js +5 -0
  435. package/usage/index.js.map +1 -1
  436. package/usage/useExportCSV.d.ts +23 -0
  437. package/usage/useExportCSV.d.ts.map +1 -0
  438. package/usage/useExportCSV.js +81 -0
  439. package/usage/useExportCSV.js.map +1 -0
  440. package/usage/useOrgUsageReport.d.ts +2 -1
  441. package/usage/useOrgUsageReport.d.ts.map +1 -1
  442. package/usage/useOrgUsageReport.js +2 -1
  443. package/usage/useOrgUsageReport.js.map +1 -1
  444. package/workspace/__tests__/useWorkspaceEntries-stability.test.d.ts +2 -0
  445. package/workspace/__tests__/useWorkspaceEntries-stability.test.d.ts.map +1 -0
  446. package/workspace/__tests__/useWorkspaceEntries-stability.test.js +57 -0
  447. package/workspace/__tests__/useWorkspaceEntries-stability.test.js.map +1 -0
  448. package/workspace/useWorkspaceEntries.d.ts.map +1 -1
  449. package/workspace/useWorkspaceEntries.js +5 -4
  450. package/workspace/useWorkspaceEntries.js.map +1 -1
@@ -0,0 +1,13 @@
1
+ import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
2
+ /**
3
+ * Compares two `AgentExecution` snapshots and returns a hybrid object
4
+ * that reuses old references for unchanged subtrees.
5
+ *
6
+ * The runner appends new messages and mutates the streaming tail.
7
+ * Messages at stable indices with unchanged content keep the previous
8
+ * reference so downstream `React.memo` can skip re-renders.
9
+ *
10
+ * When `prev` is `null` (first snapshot), returns `next` unchanged.
11
+ */
12
+ export declare function structuralShare(prev: AgentExecution | null, next: AgentExecution): AgentExecution;
13
+ //# sourceMappingURL=structural-share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-share.d.ts","sourceRoot":"","sources":["../../../src/internal/store/structural-share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAMlG;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,GAAG,IAAI,EAC3B,IAAI,EAAE,cAAc,GACnB,cAAc,CA2DhB"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Compares two `AgentExecution` snapshots and returns a hybrid object
3
+ * that reuses old references for unchanged subtrees.
4
+ *
5
+ * The runner appends new messages and mutates the streaming tail.
6
+ * Messages at stable indices with unchanged content keep the previous
7
+ * reference so downstream `React.memo` can skip re-renders.
8
+ *
9
+ * When `prev` is `null` (first snapshot), returns `next` unchanged.
10
+ */
11
+ export function structuralShare(prev, next) {
12
+ if (prev === null)
13
+ return next;
14
+ const prevStatus = prev.status;
15
+ const nextStatus = next.status;
16
+ if (!prevStatus || !nextStatus)
17
+ return next;
18
+ const sharedMessages = shareMessages(prevStatus.messages, nextStatus.messages);
19
+ const sharedSubAgents = shareSubAgents(prevStatus.subAgentExecutions, nextStatus.subAgentExecutions);
20
+ const sharedApprovals = shareApprovals(prevStatus.pendingApprovals, nextStatus.pendingApprovals);
21
+ const sharedTodos = shareTodos(prevStatus.todos, nextStatus.todos);
22
+ const messagesUnchanged = sharedMessages === prevStatus.messages;
23
+ const subAgentsUnchanged = sharedSubAgents === prevStatus.subAgentExecutions;
24
+ const approvalsUnchanged = sharedApprovals === prevStatus.pendingApprovals;
25
+ const todosUnchanged = sharedTodos === prevStatus.todos;
26
+ const statusFieldsUnchanged = prevStatus.phase === nextStatus.phase &&
27
+ prevStatus.error === nextStatus.error &&
28
+ prevStatus.startedAt === nextStatus.startedAt &&
29
+ prevStatus.completedAt === nextStatus.completedAt &&
30
+ prevStatus.runnerId === nextStatus.runnerId;
31
+ if (messagesUnchanged &&
32
+ subAgentsUnchanged &&
33
+ approvalsUnchanged &&
34
+ todosUnchanged &&
35
+ statusFieldsUnchanged &&
36
+ prevStatus.artifacts.length === nextStatus.artifacts.length &&
37
+ prevStatus.workspaceWriteBacks.length ===
38
+ nextStatus.workspaceWriteBacks.length) {
39
+ return prev;
40
+ }
41
+ const sharedStatus = Object.create(Object.getPrototypeOf(nextStatus));
42
+ Object.assign(sharedStatus, nextStatus);
43
+ sharedStatus.messages = sharedMessages;
44
+ sharedStatus.subAgentExecutions = sharedSubAgents;
45
+ sharedStatus.pendingApprovals = sharedApprovals;
46
+ sharedStatus.todos = sharedTodos;
47
+ const sharedExec = Object.create(Object.getPrototypeOf(next));
48
+ Object.assign(sharedExec, next);
49
+ sharedExec.status = sharedStatus;
50
+ return sharedExec;
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Messages — compare by index (append-only slots)
54
+ // ---------------------------------------------------------------------------
55
+ function shareMessages(prev, next) {
56
+ if (prev.length === 0 && next.length === 0)
57
+ return prev;
58
+ if (prev.length === 0)
59
+ return next;
60
+ let allSame = prev.length === next.length;
61
+ const result = new Array(next.length);
62
+ for (let i = 0; i < next.length; i++) {
63
+ if (i < prev.length && messageEqual(prev[i], next[i])) {
64
+ result[i] = prev[i];
65
+ }
66
+ else {
67
+ result[i] = shareToolCalls(i < prev.length ? prev[i] : null, next[i]);
68
+ allSame = false;
69
+ }
70
+ }
71
+ return allSame ? prev : result;
72
+ }
73
+ function messageEqual(a, b) {
74
+ return (a.type === b.type &&
75
+ a.content === b.content &&
76
+ a.isStreaming === b.isStreaming &&
77
+ a.timestamp === b.timestamp &&
78
+ a.toolCalls.length === b.toolCalls.length &&
79
+ toolCallsEqual(a.toolCalls, b.toolCalls));
80
+ }
81
+ function toolCallsEqual(a, b) {
82
+ if (a.length !== b.length)
83
+ return false;
84
+ for (let i = 0; i < a.length; i++) {
85
+ if (!toolCallEqual(a[i], b[i]))
86
+ return false;
87
+ }
88
+ return true;
89
+ }
90
+ /**
91
+ * When the message itself has changed, try to preserve unchanged
92
+ * tool call references within it. Returns a new message with the
93
+ * tool calls array potentially reusing old references.
94
+ */
95
+ function shareToolCalls(prev, next) {
96
+ if (!prev || prev.toolCalls.length === 0 || next.toolCalls.length === 0) {
97
+ return next;
98
+ }
99
+ const prevById = new Map();
100
+ for (const tc of prev.toolCalls) {
101
+ if (tc.id)
102
+ prevById.set(tc.id, tc);
103
+ }
104
+ if (prevById.size === 0)
105
+ return next;
106
+ let allSame = prev.toolCalls.length === next.toolCalls.length;
107
+ const shared = new Array(next.toolCalls.length);
108
+ for (let i = 0; i < next.toolCalls.length; i++) {
109
+ const ntc = next.toolCalls[i];
110
+ const ptc = ntc.id ? prevById.get(ntc.id) : undefined;
111
+ if (ptc && toolCallEqual(ptc, ntc)) {
112
+ shared[i] = ptc;
113
+ }
114
+ else {
115
+ shared[i] = ntc;
116
+ allSame = false;
117
+ }
118
+ }
119
+ if (allSame)
120
+ return next;
121
+ const sharedMsg = Object.create(Object.getPrototypeOf(next));
122
+ Object.assign(sharedMsg, next);
123
+ sharedMsg.toolCalls = shared;
124
+ return sharedMsg;
125
+ }
126
+ function toolCallEqual(a, b) {
127
+ return (a.id === b.id &&
128
+ a.status === b.status &&
129
+ a.isStreaming === b.isStreaming &&
130
+ a.result === b.result &&
131
+ a.completedAt === b.completedAt &&
132
+ a.error === b.error &&
133
+ a.name === b.name &&
134
+ a.argsPreview === b.argsPreview);
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Sub-agent executions — compare by `id`
138
+ // ---------------------------------------------------------------------------
139
+ function shareSubAgents(prev, next) {
140
+ if (prev.length === 0 && next.length === 0)
141
+ return prev;
142
+ if (prev.length === 0)
143
+ return next;
144
+ const prevById = new Map();
145
+ for (const sa of prev) {
146
+ if (sa.id)
147
+ prevById.set(sa.id, sa);
148
+ }
149
+ let allSame = prev.length === next.length;
150
+ const result = new Array(next.length);
151
+ for (let i = 0; i < next.length; i++) {
152
+ const nsa = next[i];
153
+ const psa = nsa.id ? prevById.get(nsa.id) : undefined;
154
+ if (psa && subAgentEqual(psa, nsa)) {
155
+ result[i] = psa;
156
+ }
157
+ else if (psa) {
158
+ result[i] = shareSubAgentMessages(psa, nsa);
159
+ allSame = false;
160
+ }
161
+ else {
162
+ result[i] = nsa;
163
+ allSame = false;
164
+ }
165
+ }
166
+ return allSame ? prev : result;
167
+ }
168
+ function subAgentEqual(a, b) {
169
+ return (a.id === b.id &&
170
+ a.status === b.status &&
171
+ a.output === b.output &&
172
+ a.error === b.error &&
173
+ a.completedAt === b.completedAt &&
174
+ a.messages.length === b.messages.length &&
175
+ a.subject === b.subject &&
176
+ subAgentMessagesEqual(a.messages, b.messages));
177
+ }
178
+ function subAgentMessagesEqual(a, b) {
179
+ if (a.length !== b.length)
180
+ return false;
181
+ for (let i = 0; i < a.length; i++) {
182
+ if (!messageEqual(a[i], b[i]))
183
+ return false;
184
+ }
185
+ return true;
186
+ }
187
+ function shareSubAgentMessages(prev, next) {
188
+ const sharedMsgs = shareMessages(prev.messages, next.messages);
189
+ if (sharedMsgs === prev.messages && subAgentEqual(prev, next)) {
190
+ return prev;
191
+ }
192
+ const shared = Object.create(Object.getPrototypeOf(next));
193
+ Object.assign(shared, next);
194
+ shared.messages = sharedMsgs;
195
+ return shared;
196
+ }
197
+ // ---------------------------------------------------------------------------
198
+ // Pending approvals — compare by `toolCallId`
199
+ // ---------------------------------------------------------------------------
200
+ function shareApprovals(prev, next) {
201
+ if (prev.length === 0 && next.length === 0)
202
+ return prev;
203
+ if (prev.length !== next.length)
204
+ return next;
205
+ const prevById = new Map();
206
+ for (const a of prev) {
207
+ prevById.set(a.toolCallId, a);
208
+ }
209
+ for (const na of next) {
210
+ const pa = prevById.get(na.toolCallId);
211
+ if (!pa || !approvalEqual(pa, na))
212
+ return next;
213
+ }
214
+ return prev;
215
+ }
216
+ function approvalEqual(a, b) {
217
+ return (a.toolCallId === b.toolCallId &&
218
+ a.toolName === b.toolName &&
219
+ a.message === b.message &&
220
+ a.argsPreview === b.argsPreview &&
221
+ a.requestedAt === b.requestedAt &&
222
+ a.fromSubAgent === b.fromSubAgent);
223
+ }
224
+ // ---------------------------------------------------------------------------
225
+ // Todos — compare by map key
226
+ // ---------------------------------------------------------------------------
227
+ function shareTodos(prev, next) {
228
+ const prevKeys = Object.keys(prev);
229
+ const nextKeys = Object.keys(next);
230
+ if (prevKeys.length === 0 && nextKeys.length === 0)
231
+ return prev;
232
+ if (prevKeys.length !== nextKeys.length)
233
+ return next;
234
+ for (const key of nextKeys) {
235
+ if (!(key in prev) || prev[key] !== next[key])
236
+ return next;
237
+ }
238
+ return prev;
239
+ }
240
+ //# sourceMappingURL=structural-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-share.js","sourceRoot":"","sources":["../../../src/internal/store/structural-share.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
2
+ export type ControllerStage = "idle" | "connecting" | "streaming" | "complete" | "error";
3
+ export type ControllerState = {
4
+ readonly stage: "idle";
5
+ } | {
6
+ readonly stage: "connecting";
7
+ readonly executionId: string;
8
+ } | {
9
+ readonly stage: "streaming";
10
+ readonly executionId: string;
11
+ } | {
12
+ readonly stage: "complete";
13
+ readonly executionId: string;
14
+ } | {
15
+ readonly stage: "error";
16
+ readonly executionId: string;
17
+ readonly error: Error;
18
+ };
19
+ /**
20
+ * Callback interface for the stream controller to communicate with
21
+ * its host (the React hook). All mutations to external state go
22
+ * through these callbacks.
23
+ */
24
+ export interface StreamControllerSink {
25
+ /** Ingest a snapshot into the store (applies structural sharing). */
26
+ ingestSnapshot(snapshot: AgentExecution): void;
27
+ /** Transition the store's stream lifecycle state. */
28
+ setStreamState(state: ControllerState): void;
29
+ }
30
+ /**
31
+ * Framework-agnostic finite state machine that manages the lifecycle
32
+ * of a single execution stream subscription.
33
+ *
34
+ * Responsibilities:
35
+ * - Track FSM state transitions (idle → connecting → streaming → complete/error)
36
+ * - Buffer incoming snapshots and coalesce via `requestAnimationFrame`
37
+ * - Flush terminal snapshots immediately (no rAF delay)
38
+ * - Provide abort/reconnect semantics
39
+ *
40
+ * This class has no React dependency. It communicates outward through
41
+ * a {@link StreamControllerSink} and a `scheduleFlush` function
42
+ * (typically `requestAnimationFrame`).
43
+ */
44
+ export declare class StreamController {
45
+ private _state;
46
+ private _bufferedSnapshot;
47
+ private _rafId;
48
+ private _sink;
49
+ private _scheduleFlush;
50
+ private _cancelFlush;
51
+ constructor(sink: StreamControllerSink, scheduleFlush?: (cb: () => void) => number, cancelFlush?: (id: number) => void);
52
+ /** Current FSM state (read-only). */
53
+ get state(): ControllerState;
54
+ /**
55
+ * Transition to `connecting` for the given execution ID.
56
+ * If already active for a different ID, resets first.
57
+ */
58
+ start(executionId: string): void;
59
+ /**
60
+ * Handle an incoming snapshot from the gRPC stream.
61
+ * Non-terminal snapshots are buffered for rAF coalescing.
62
+ * Terminal snapshots flush immediately.
63
+ */
64
+ handleSnapshot(snapshot: AgentExecution): void;
65
+ /**
66
+ * Handle stream completion (iterator exhausted without error).
67
+ * If we still have a buffered snapshot, flush it first.
68
+ */
69
+ handleStreamEnd(): void;
70
+ /**
71
+ * Handle a stream error. Flushes any buffered snapshot first
72
+ * so the UI shows the last known good state alongside the error.
73
+ */
74
+ handleError(error: Error): void;
75
+ /** Reset to idle. Cancels any pending flush. */
76
+ reset(): void;
77
+ /** Whether the controller has a buffered snapshot awaiting flush. */
78
+ get hasPendingFlush(): boolean;
79
+ private _activeExecutionId;
80
+ private _transition;
81
+ private _scheduleFlushOnce;
82
+ private _flushBuffer;
83
+ private _cancelPendingFlush;
84
+ }
85
+ //# sourceMappingURL=stream-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-controller.d.ts","sourceRoot":"","sources":["../../src/internal/stream-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AASlG,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5D;IACE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,CAAC;AAIN;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,qDAAqD;IACrD,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC9C;AAMD;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,YAAY,CAAuB;gBAGzC,IAAI,EAAE,oBAAoB,EAC1B,aAAa,GAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,MAEgB,EACnD,WAAW,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAEb;IAOlB,qCAAqC;IACrC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMhC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAsB9C;;;OAGG;IACH,eAAe,IAAI,IAAI;IAUvB;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAS/B,gDAAgD;IAChD,KAAK,IAAI,IAAI;IAQb,qEAAqE;IACrE,IAAI,eAAe,IAAI,OAAO,CAE7B;IAMD,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;CAM5B"}
@@ -0,0 +1,146 @@
1
+ import { isTerminalPhase } from "../execution/execution-phases";
2
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
3
+ const IDLE = { stage: "idle" };
4
+ // ---------------------------------------------------------------------------
5
+ // StreamController
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Framework-agnostic finite state machine that manages the lifecycle
9
+ * of a single execution stream subscription.
10
+ *
11
+ * Responsibilities:
12
+ * - Track FSM state transitions (idle → connecting → streaming → complete/error)
13
+ * - Buffer incoming snapshots and coalesce via `requestAnimationFrame`
14
+ * - Flush terminal snapshots immediately (no rAF delay)
15
+ * - Provide abort/reconnect semantics
16
+ *
17
+ * This class has no React dependency. It communicates outward through
18
+ * a {@link StreamControllerSink} and a `scheduleFlush` function
19
+ * (typically `requestAnimationFrame`).
20
+ */
21
+ export class StreamController {
22
+ _state = IDLE;
23
+ _bufferedSnapshot = null;
24
+ _rafId = null;
25
+ _sink;
26
+ _scheduleFlush;
27
+ _cancelFlush;
28
+ constructor(sink, scheduleFlush = typeof requestAnimationFrame !== "undefined"
29
+ ? requestAnimationFrame
30
+ : (cb) => setTimeout(cb, 16), cancelFlush = typeof cancelAnimationFrame !== "undefined"
31
+ ? cancelAnimationFrame
32
+ : clearTimeout) {
33
+ this._sink = sink;
34
+ this._scheduleFlush = scheduleFlush;
35
+ this._cancelFlush = cancelFlush;
36
+ }
37
+ /** Current FSM state (read-only). */
38
+ get state() {
39
+ return this._state;
40
+ }
41
+ /**
42
+ * Transition to `connecting` for the given execution ID.
43
+ * If already active for a different ID, resets first.
44
+ */
45
+ start(executionId) {
46
+ this._cancelPendingFlush();
47
+ this._bufferedSnapshot = null;
48
+ this._transition({ stage: "connecting", executionId });
49
+ }
50
+ /**
51
+ * Handle an incoming snapshot from the gRPC stream.
52
+ * Non-terminal snapshots are buffered for rAF coalescing.
53
+ * Terminal snapshots flush immediately.
54
+ */
55
+ handleSnapshot(snapshot) {
56
+ const executionId = this._activeExecutionId();
57
+ if (!executionId)
58
+ return;
59
+ const phase = snapshot.status?.phase ?? ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
60
+ const terminal = isTerminalPhase(phase);
61
+ if (terminal) {
62
+ this._cancelPendingFlush();
63
+ this._bufferedSnapshot = null;
64
+ this._sink.ingestSnapshot(snapshot);
65
+ this._transition({ stage: "complete", executionId });
66
+ }
67
+ else {
68
+ if (this._state.stage === "connecting") {
69
+ this._transition({ stage: "streaming", executionId });
70
+ }
71
+ this._bufferedSnapshot = snapshot;
72
+ this._scheduleFlushOnce();
73
+ }
74
+ }
75
+ /**
76
+ * Handle stream completion (iterator exhausted without error).
77
+ * If we still have a buffered snapshot, flush it first.
78
+ */
79
+ handleStreamEnd() {
80
+ const executionId = this._activeExecutionId();
81
+ if (!executionId)
82
+ return;
83
+ this._flushBuffer();
84
+ if (this._state.stage !== "complete") {
85
+ this._transition({ stage: "complete", executionId });
86
+ }
87
+ }
88
+ /**
89
+ * Handle a stream error. Flushes any buffered snapshot first
90
+ * so the UI shows the last known good state alongside the error.
91
+ */
92
+ handleError(error) {
93
+ const executionId = this._activeExecutionId();
94
+ if (!executionId)
95
+ return;
96
+ this._cancelPendingFlush();
97
+ this._flushBuffer();
98
+ this._transition({ stage: "error", executionId, error });
99
+ }
100
+ /** Reset to idle. Cancels any pending flush. */
101
+ reset() {
102
+ this._cancelPendingFlush();
103
+ this._bufferedSnapshot = null;
104
+ if (this._state.stage !== "idle") {
105
+ this._transition(IDLE);
106
+ }
107
+ }
108
+ /** Whether the controller has a buffered snapshot awaiting flush. */
109
+ get hasPendingFlush() {
110
+ return this._rafId !== null;
111
+ }
112
+ // -------------------------------------------------------------------------
113
+ // Private
114
+ // -------------------------------------------------------------------------
115
+ _activeExecutionId() {
116
+ if (this._state.stage === "idle")
117
+ return null;
118
+ return this._state.executionId;
119
+ }
120
+ _transition(next) {
121
+ this._state = next;
122
+ this._sink.setStreamState(next);
123
+ }
124
+ _scheduleFlushOnce() {
125
+ if (this._rafId !== null)
126
+ return;
127
+ this._rafId = this._scheduleFlush(() => {
128
+ this._rafId = null;
129
+ this._flushBuffer();
130
+ });
131
+ }
132
+ _flushBuffer() {
133
+ if (this._bufferedSnapshot) {
134
+ const snap = this._bufferedSnapshot;
135
+ this._bufferedSnapshot = null;
136
+ this._sink.ingestSnapshot(snap);
137
+ }
138
+ }
139
+ _cancelPendingFlush() {
140
+ if (this._rafId !== null) {
141
+ this._cancelFlush(this._rafId);
142
+ this._rafId = null;
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=stream-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-controller.js","sourceRoot":"","sources":["../../src/internal/stream-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface UseAutoScrollReturn {
2
+ /** Attach to the scrollable container. */
3
+ readonly scrollRef: React.RefObject<HTMLDivElement | null>;
4
+ /** Attach to a zero-height div as the last child of the scroll container. */
5
+ readonly sentinelRef: React.RefObject<HTMLDivElement | null>;
6
+ /** Attach to a wrapper div around the thread content (ResizeObserver target). */
7
+ readonly contentRef: React.RefObject<HTMLDivElement | null>;
8
+ /** True when the thread auto-scrolls to follow new content. */
9
+ readonly isFollowing: boolean;
10
+ /** Scroll to the latest content and re-engage follow mode. */
11
+ readonly jumpToLatest: () => void;
12
+ }
13
+ /**
14
+ * Two-state auto-scroll state machine for chat threads.
15
+ *
16
+ * **Following** — content is pinned to the bottom; new content
17
+ * (streaming tokens, new messages, tool panel expansion) triggers a
18
+ * `requestAnimationFrame`-batched scroll-to-bottom.
19
+ *
20
+ * **Disengaged** — the user scrolled away from the bottom; no
21
+ * automatic scrolling occurs. Call {@link UseAutoScrollReturn.jumpToLatest}
22
+ * to re-engage.
23
+ *
24
+ * State transitions are driven by an `IntersectionObserver` on a
25
+ * bottom sentinel element. A `ResizeObserver` on the content wrapper
26
+ * detects height growth and triggers rAF-batched scroll writes when
27
+ * in the Following state.
28
+ *
29
+ * @internal Not part of the public API.
30
+ */
31
+ export declare function useAutoScroll(): UseAutoScrollReturn;
32
+ //# sourceMappingURL=useAutoScroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoScroll.d.ts","sourceRoot":"","sources":["../../src/internal/useAutoScroll.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3D,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7D,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5D,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CA6EnD"}
@@ -0,0 +1,97 @@
1
+ "use client";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ /**
4
+ * Near-bottom tolerance in pixels. The sentinel is considered visible
5
+ * (and follow mode stays engaged) when the user is within this distance
6
+ * of the bottom. Matches the threshold used by the previous scroll
7
+ * implementation.
8
+ */
9
+ const NEAR_BOTTOM_MARGIN_PX = 80;
10
+ /**
11
+ * Two-state auto-scroll state machine for chat threads.
12
+ *
13
+ * **Following** — content is pinned to the bottom; new content
14
+ * (streaming tokens, new messages, tool panel expansion) triggers a
15
+ * `requestAnimationFrame`-batched scroll-to-bottom.
16
+ *
17
+ * **Disengaged** — the user scrolled away from the bottom; no
18
+ * automatic scrolling occurs. Call {@link UseAutoScrollReturn.jumpToLatest}
19
+ * to re-engage.
20
+ *
21
+ * State transitions are driven by an `IntersectionObserver` on a
22
+ * bottom sentinel element. A `ResizeObserver` on the content wrapper
23
+ * detects height growth and triggers rAF-batched scroll writes when
24
+ * in the Following state.
25
+ *
26
+ * @internal Not part of the public API.
27
+ */
28
+ export function useAutoScroll() {
29
+ const scrollRef = useRef(null);
30
+ const sentinelRef = useRef(null);
31
+ const contentRef = useRef(null);
32
+ const [isFollowing, setIsFollowing] = useState(true);
33
+ const isFollowingRef = useRef(true);
34
+ const rafIdRef = useRef(0);
35
+ // Keep ref in sync with state so observer callbacks read the latest
36
+ // value without re-subscribing on every state change.
37
+ useEffect(() => {
38
+ isFollowingRef.current = isFollowing;
39
+ }, [isFollowing]);
40
+ // --- IntersectionObserver: sentinel visibility drives state ---
41
+ useEffect(() => {
42
+ const sentinel = sentinelRef.current;
43
+ const scroller = scrollRef.current;
44
+ if (!sentinel || !scroller)
45
+ return;
46
+ // Establish initial position at the bottom so the first IO
47
+ // callback sees the sentinel as intersecting.
48
+ scroller.scrollTop = scroller.scrollHeight;
49
+ const io = new IntersectionObserver((entries) => {
50
+ const entry = entries[0];
51
+ if (!entry)
52
+ return;
53
+ const visible = entry.isIntersecting;
54
+ isFollowingRef.current = visible;
55
+ setIsFollowing(visible);
56
+ }, {
57
+ root: scroller,
58
+ rootMargin: `0px 0px ${NEAR_BOTTOM_MARGIN_PX}px 0px`,
59
+ threshold: 0,
60
+ });
61
+ io.observe(sentinel);
62
+ return () => io.disconnect();
63
+ }, []);
64
+ // --- ResizeObserver: scroll on content height growth while following ---
65
+ useEffect(() => {
66
+ const content = contentRef.current;
67
+ if (!content || !scrollRef.current)
68
+ return;
69
+ const ro = new ResizeObserver(() => {
70
+ if (!isFollowingRef.current)
71
+ return;
72
+ cancelAnimationFrame(rafIdRef.current);
73
+ rafIdRef.current = requestAnimationFrame(() => {
74
+ const el = scrollRef.current;
75
+ if (el)
76
+ el.scrollTop = el.scrollHeight;
77
+ });
78
+ });
79
+ ro.observe(content);
80
+ return () => {
81
+ ro.disconnect();
82
+ cancelAnimationFrame(rafIdRef.current);
83
+ };
84
+ }, []);
85
+ const jumpToLatest = useCallback(() => {
86
+ const el = scrollRef.current;
87
+ if (!el)
88
+ return;
89
+ el.scrollTop = el.scrollHeight;
90
+ // Eagerly set following — IO callback will confirm when the
91
+ // sentinel becomes visible after the scroll.
92
+ isFollowingRef.current = true;
93
+ setIsFollowing(true);
94
+ }, []);
95
+ return { scrollRef, sentinelRef, contentRef, isFollowing, jumpToLatest };
96
+ }
97
+ //# sourceMappingURL=useAutoScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoScroll.js","sourceRoot":"","sources":["../../src/internal/useAutoScroll.ts"],"names":[],"mappings":"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"}