@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,73 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+
5
+ /** Props for {@link ThreadSkeleton}. */
6
+ export interface ThreadSkeletonProps {
7
+ /** Additional CSS class names for the root container. */
8
+ readonly className?: string;
9
+ }
10
+
11
+ const AI_LINE_WIDTHS = [
12
+ [85, 72, 90],
13
+ [78, 65, 88, 70],
14
+ ] as const;
15
+
16
+ /**
17
+ * Pulse-animated skeleton that mimics the shape of a conversation
18
+ * thread. Renders alternating human-bubble and AI-response
19
+ * silhouettes so the loading state feels purposeful.
20
+ *
21
+ * Intended as an opt-in building block for consumers to show while
22
+ * session data loads. Not auto-rendered by {@link MessageThread}.
23
+ *
24
+ * All visual properties flow through `--stgm-*` tokens.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * if (isLoading) return <ThreadSkeleton className="flex-1" />;
29
+ * ```
30
+ */
31
+ export function ThreadSkeleton({ className }: ThreadSkeletonProps) {
32
+ return (
33
+ <div
34
+ className={cn("flex flex-col gap-4 pt-6 pb-4", className)}
35
+ aria-busy="true"
36
+ aria-label="Loading conversation"
37
+ >
38
+ <div className="animate-pulse space-y-4">
39
+ {/* Turn 1: Human bubble */}
40
+ <div className="ms-[20%] rounded-lg bg-muted-subtle px-4 py-3">
41
+ <div className="h-4 w-3/5 rounded bg-muted" />
42
+ </div>
43
+
44
+ {/* Turn 1: AI response */}
45
+ <div className="space-y-2 px-4">
46
+ {AI_LINE_WIDTHS[0].map((w, i) => (
47
+ <div
48
+ key={i}
49
+ className="h-4 rounded bg-muted"
50
+ style={{ width: `${w}%` }}
51
+ />
52
+ ))}
53
+ </div>
54
+
55
+ {/* Turn 2: Human bubble */}
56
+ <div className="ms-[20%] rounded-lg bg-muted-subtle px-4 py-3">
57
+ <div className="h-4 w-2/5 rounded bg-muted" />
58
+ </div>
59
+
60
+ {/* Turn 2: AI response */}
61
+ <div className="space-y-2 px-4">
62
+ {AI_LINE_WIDTHS[1].map((w, i) => (
63
+ <div
64
+ key={i}
65
+ className="h-4 rounded bg-muted"
66
+ style={{ width: `${w}%` }}
67
+ />
68
+ ))}
69
+ </div>
70
+ </div>
71
+ </div>
72
+ );
73
+ }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { memo, useEffect, useMemo, useRef, useState } from "react";
4
4
  import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
5
5
  import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
6
6
  import {
@@ -8,6 +8,7 @@ import {
8
8
  ToolCallStatus,
9
9
  } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
10
10
  import { cn } from "@stigmer/theme";
11
+ import { useRenderTracer } from "../internal/dev";
11
12
  import { ToolCallItem } from "./ToolCallItem";
12
13
  import { resolveToolCategory, extractPrimaryArg } from "./tool-categories";
13
14
 
@@ -131,6 +132,32 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
131
132
  pending: "text-muted-foreground",
132
133
  };
133
134
 
135
+ /**
136
+ * Shallow comparison for `ToolCallGroupProps`.
137
+ *
138
+ * The `toolCalls` array may be a newly allocated subset (e.g.
139
+ * `buildThreadItems` filters out `task` calls). Structural sharing
140
+ * (T04) keeps individual `ToolCall` objects stable, so we compare
141
+ * array elements by reference rather than the array itself.
142
+ *
143
+ * @internal Exported for testing — not part of the public API.
144
+ */
145
+ export function toolCallGroupPropsEqual(
146
+ prev: Readonly<ToolCallGroupProps>,
147
+ next: Readonly<ToolCallGroupProps>,
148
+ ): boolean {
149
+ if (prev.toolCalls.length !== next.toolCalls.length) return false;
150
+ for (let i = 0; i < prev.toolCalls.length; i++) {
151
+ if (prev.toolCalls[i] !== next.toolCalls[i]) return false;
152
+ }
153
+ return (
154
+ prev.subAgentExecutions === next.subAgentExecutions &&
155
+ prev.formatSummary === next.formatSummary &&
156
+ prev.defaultExpanded === next.defaultExpanded &&
157
+ prev.className === next.className
158
+ );
159
+ }
160
+
134
161
  /**
135
162
  * Renders a summary line for a group of tool calls from a single
136
163
  * AI turn. Click to expand and see individual tool calls.
@@ -146,18 +173,24 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
146
173
  * (e.g., "Shell: ls -la /tmp"). Platform builders can override
147
174
  * via the `formatSummary` prop.
148
175
  *
176
+ * Wrapped in `React.memo` with a custom comparator that checks
177
+ * `toolCalls` elements by reference (structural sharing keeps
178
+ * individual `ToolCall` objects stable for unchanged calls).
179
+ *
149
180
  * @example
150
181
  * ```tsx
151
182
  * <ToolCallGroup toolCalls={message.toolCalls} />
152
183
  * ```
153
184
  */
154
- export function ToolCallGroup({
185
+ export const ToolCallGroup = memo(function ToolCallGroup({
155
186
  toolCalls,
156
187
  subAgentExecutions,
157
188
  formatSummary,
158
189
  defaultExpanded = false,
159
190
  className,
160
191
  }: ToolCallGroupProps) {
192
+ useRenderTracer("ToolCallGroup", { toolCallCount: toolCalls.length });
193
+
161
194
  const status = deriveAggregateStatus(toolCalls);
162
195
  const isActive = status === "running" || status === "pending" || status === "waiting";
163
196
 
@@ -245,7 +278,7 @@ export function ToolCallGroup({
245
278
  </div>
246
279
  </div>
247
280
  );
248
- }
281
+ }, toolCallGroupPropsEqual);
249
282
 
250
283
  // ---------------------------------------------------------------------------
251
284
  // Inline SVG icons — same as SP1, kept inline for SDK independence
@@ -12,7 +12,7 @@ export interface UsageWidgetProps {
12
12
  /**
13
13
  * All executions for the current session — both completed and
14
14
  * actively streaming. The widget aggregates cost data across
15
- * every execution's per-message `llm_metrics`, presenting a
15
+ * every execution's `usageSummary` (proxy-maintained), presenting a
16
16
  * session-level total that never resets.
17
17
  *
18
18
  * Renders nothing when the list is empty or no execution has
@@ -0,0 +1,236 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { render, cleanup } from "@testing-library/react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
5
+ import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
6
+ import { MessageEntry } from "../MessageEntry";
7
+
8
+ afterEach(cleanup);
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // Helpers
12
+ // ---------------------------------------------------------------------------
13
+
14
+ function makeMessage(
15
+ type: MessageType,
16
+ content: string,
17
+ opts?: { isStreaming?: boolean },
18
+ ) {
19
+ const msg = create(AgentMessageSchema);
20
+ msg.type = type;
21
+ msg.content = content;
22
+ if (opts?.isStreaming) msg.isStreaming = true;
23
+ return msg;
24
+ }
25
+
26
+ function queryArticle(container: HTMLElement, name: string) {
27
+ return container.querySelector(`[role="article"][aria-label="${name}"]`);
28
+ }
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // AI Messages — Streamdown integration
32
+ // ---------------------------------------------------------------------------
33
+
34
+ describe("MessageEntry — AI messages (Streamdown)", () => {
35
+ it("renders AI message content as markdown", () => {
36
+ const msg = makeMessage(MessageType.MESSAGE_AI, "Hello **world**");
37
+ const { container } = render(<MessageEntry message={msg} />);
38
+
39
+ const article = queryArticle(container, "AI response");
40
+ expect(article).not.toBeNull();
41
+ expect(article!.textContent).toContain("Hello");
42
+ expect(article!.textContent).toContain("world");
43
+
44
+ const strong = article!.querySelector("strong");
45
+ expect(strong).not.toBeNull();
46
+ expect(strong!.textContent).toBe("world");
47
+ });
48
+
49
+ it("sets aria-busy=true when streaming", () => {
50
+ const msg = makeMessage(MessageType.MESSAGE_AI, "Streaming...", {
51
+ isStreaming: true,
52
+ });
53
+ const { container } = render(<MessageEntry message={msg} />);
54
+
55
+ const article = queryArticle(container, "AI response");
56
+ expect(article!.getAttribute("aria-busy")).toBe("true");
57
+ });
58
+
59
+ it("sets aria-busy=false when not streaming", () => {
60
+ const msg = makeMessage(MessageType.MESSAGE_AI, "Done.");
61
+ const { container } = render(<MessageEntry message={msg} />);
62
+
63
+ const article = queryArticle(container, "AI response");
64
+ expect(article!.getAttribute("aria-busy")).toBe("false");
65
+ });
66
+
67
+ it("renders GFM tables without explicit remark-gfm plugin", () => {
68
+ const tableMarkdown = [
69
+ "| A | B |",
70
+ "|---|---|",
71
+ "| 1 | 2 |",
72
+ ].join("\n");
73
+
74
+ const msg = makeMessage(MessageType.MESSAGE_AI, tableMarkdown);
75
+ const { container } = render(<MessageEntry message={msg} />);
76
+
77
+ const article = queryArticle(container, "AI response");
78
+ const table = article!.querySelector("table");
79
+ expect(table).not.toBeNull();
80
+ });
81
+
82
+ it("applies MARKDOWN_COMPONENTS overrides (paragraph styling)", () => {
83
+ const msg = makeMessage(MessageType.MESSAGE_AI, "A paragraph");
84
+ const { container } = render(<MessageEntry message={msg} />);
85
+
86
+ const article = queryArticle(container, "AI response");
87
+ const p = article!.querySelector("p");
88
+ expect(p).not.toBeNull();
89
+ expect(p!.className).toContain("text-sm");
90
+ expect(p!.className).toContain("text-foreground");
91
+ });
92
+
93
+ it("applies MARKDOWN_COMPONENTS overrides (link styling)", () => {
94
+ const msg = makeMessage(
95
+ MessageType.MESSAGE_AI,
96
+ "[click here](https://example.com)",
97
+ );
98
+ const { container } = render(<MessageEntry message={msg} />);
99
+
100
+ const article = queryArticle(container, "AI response");
101
+ const a = article!.querySelector("a");
102
+ expect(a).not.toBeNull();
103
+ expect(a!.className).toContain("text-primary");
104
+ expect(a!.getAttribute("target")).toBe("_blank");
105
+ expect(a!.getAttribute("rel")).toContain("noopener");
106
+ });
107
+
108
+ it("applies MARKDOWN_COMPONENTS overrides (code block styling)", () => {
109
+ const msg = makeMessage(
110
+ MessageType.MESSAGE_AI,
111
+ "```js\nconsole.log('hi');\n```",
112
+ );
113
+ const { container } = render(<MessageEntry message={msg} />);
114
+
115
+ const article = queryArticle(container, "AI response");
116
+ const pre = article!.querySelector("pre");
117
+ expect(pre).not.toBeNull();
118
+ expect(pre!.className).toContain("rounded-md");
119
+ expect(pre!.className).toContain("bg-muted");
120
+ });
121
+
122
+ it("wraps content in stgm-prose container", () => {
123
+ const msg = makeMessage(MessageType.MESSAGE_AI, "Hello");
124
+ const { container } = render(<MessageEntry message={msg} />);
125
+
126
+ const prose = container.querySelector(".stgm-prose");
127
+ expect(prose).not.toBeNull();
128
+ });
129
+ });
130
+
131
+ // ---------------------------------------------------------------------------
132
+ // Human messages — unchanged
133
+ // ---------------------------------------------------------------------------
134
+
135
+ describe("MessageEntry — Human messages", () => {
136
+ it("renders human message as plain text", () => {
137
+ const msg = makeMessage(MessageType.MESSAGE_HUMAN, "User question");
138
+ const { container } = render(<MessageEntry message={msg} />);
139
+
140
+ const article = queryArticle(container, "User message");
141
+ expect(article).not.toBeNull();
142
+ expect(article!.textContent).toContain("User question");
143
+ });
144
+
145
+ it("applies muted background styling", () => {
146
+ const msg = makeMessage(MessageType.MESSAGE_HUMAN, "Hello");
147
+ const { container } = render(<MessageEntry message={msg} />);
148
+
149
+ const article = queryArticle(container, "User message");
150
+ expect(article!.className).toContain("bg-muted-subtle");
151
+ });
152
+ });
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // System messages — unchanged
156
+ // ---------------------------------------------------------------------------
157
+
158
+ describe("MessageEntry — System messages", () => {
159
+ it("renders system message", () => {
160
+ const msg = makeMessage(MessageType.MESSAGE_SYSTEM, "System notice");
161
+ const { container } = render(<MessageEntry message={msg} />);
162
+
163
+ const article = queryArticle(container, "System message");
164
+ expect(article).not.toBeNull();
165
+ expect(article!.textContent).toContain("System notice");
166
+ });
167
+
168
+ it("renders with italic muted styling", () => {
169
+ const msg = makeMessage(MessageType.MESSAGE_SYSTEM, "Notice");
170
+ const { container } = render(<MessageEntry message={msg} />);
171
+
172
+ const article = queryArticle(container, "System message");
173
+ const p = article!.querySelector("p");
174
+ expect(p).not.toBeNull();
175
+ expect(p!.className).toContain("italic");
176
+ expect(p!.className).toContain("text-muted-foreground");
177
+ });
178
+ });
179
+
180
+ // ---------------------------------------------------------------------------
181
+ // Thinking messages — unchanged
182
+ // ---------------------------------------------------------------------------
183
+
184
+ describe("MessageEntry — Thinking messages", () => {
185
+ it("renders thinking message with preview", () => {
186
+ const msg = makeMessage(
187
+ MessageType.MESSAGE_THINKING,
188
+ "Let me consider this problem carefully and think through all the options.",
189
+ );
190
+ const { container } = render(<MessageEntry message={msg} />);
191
+
192
+ const article = queryArticle(container, "Model thinking");
193
+ expect(article).not.toBeNull();
194
+ });
195
+
196
+ it("shows spinner icon when streaming", () => {
197
+ const msg = makeMessage(MessageType.MESSAGE_THINKING, "", {
198
+ isStreaming: true,
199
+ });
200
+ const { container } = render(<MessageEntry message={msg} />);
201
+
202
+ const article = queryArticle(container, "Model thinking");
203
+ const svg = article!.querySelector("svg.animate-spin");
204
+ expect(svg).not.toBeNull();
205
+ });
206
+
207
+ it("returns null for empty non-streaming thinking", () => {
208
+ const msg = makeMessage(MessageType.MESSAGE_THINKING, "");
209
+ const { container } = render(<MessageEntry message={msg} />);
210
+
211
+ expect(container.innerHTML).toBe("");
212
+ });
213
+ });
214
+
215
+ // ---------------------------------------------------------------------------
216
+ // Tool / unspecified — renders nothing
217
+ // ---------------------------------------------------------------------------
218
+
219
+ describe("MessageEntry — Tool and unspecified messages", () => {
220
+ it("renders nothing for TOOL messages", () => {
221
+ const msg = makeMessage(MessageType.MESSAGE_TOOL, "tool result");
222
+ const { container } = render(<MessageEntry message={msg} />);
223
+
224
+ expect(container.innerHTML).toBe("");
225
+ });
226
+
227
+ it("renders nothing for UNSPECIFIED messages", () => {
228
+ const msg = makeMessage(
229
+ MessageType.MESSAGE_TYPE_UNSPECIFIED,
230
+ "unknown",
231
+ );
232
+ const { container } = render(<MessageEntry message={msg} />);
233
+
234
+ expect(container.innerHTML).toBe("");
235
+ });
236
+ });