@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,155 @@
1
+ /**
2
+ * Lightweight keyed cache that survives React component remounts.
3
+ *
4
+ * Designed to sit above remount boundaries (via {@link FetchCacheProvider})
5
+ * so hooks backed by `useFetch` can seed their initial state from a
6
+ * previous mount's result instead of showing a loading skeleton.
7
+ *
8
+ * This is **not** a query library. It intentionally omits deduplication,
9
+ * automatic background refetch, retry, devtools, and suspense integration.
10
+ * `useFetch` already provides stale-while-revalidate semantics — this
11
+ * class only gives it memory across mounts.
12
+ *
13
+ * @internal Consumed by `useFetch` via context; not part of the public
14
+ * `@stigmer/react` API surface. The `FetchCacheProvider` component is
15
+ * the public entry point.
16
+ */
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Types
20
+ // ---------------------------------------------------------------------------
21
+
22
+ interface CacheEntry {
23
+ data: unknown;
24
+ /** Epoch ms when the entry was written. */
25
+ timestamp: number;
26
+ }
27
+
28
+ /** Configuration for `FetchCache`. */
29
+ export interface FetchCacheOptions {
30
+ /**
31
+ * Maximum number of entries before the oldest are evicted.
32
+ * @default 100
33
+ */
34
+ readonly maxEntries?: number;
35
+ /**
36
+ * Time-to-live in milliseconds. Entries older than this are
37
+ * treated as missing on read and lazily purged.
38
+ * @default 300_000 (5 minutes)
39
+ */
40
+ readonly ttl?: number;
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // FetchCache
45
+ // ---------------------------------------------------------------------------
46
+
47
+ export class FetchCache {
48
+ private readonly _entries = new Map<string, CacheEntry>();
49
+ private readonly _maxEntries: number;
50
+ private readonly _ttl: number;
51
+
52
+ constructor(options?: FetchCacheOptions) {
53
+ this._maxEntries = options?.maxEntries ?? 100;
54
+ this._ttl = options?.ttl ?? 5 * 60 * 1_000;
55
+ }
56
+
57
+ /**
58
+ * Retrieve a cached value. Returns `undefined` when the key is
59
+ * missing or the entry has expired.
60
+ */
61
+ get<T>(key: string): T | undefined {
62
+ const entry = this._entries.get(key);
63
+ if (!entry) return undefined;
64
+ if (this._isExpired(entry)) {
65
+ this._entries.delete(key);
66
+ return undefined;
67
+ }
68
+ return entry.data as T;
69
+ }
70
+
71
+ /** `true` when a non-expired entry exists for `key`. */
72
+ has(key: string): boolean {
73
+ return this.get(key) !== undefined;
74
+ }
75
+
76
+ /** Write (or overwrite) a cache entry and evict if over capacity. */
77
+ set(key: string, data: unknown): void {
78
+ // Delete first so the re-insertion moves `key` to the end of
79
+ // the Map's insertion order — gives us LRU semantics for free.
80
+ this._entries.delete(key);
81
+ this._entries.set(key, { data, timestamp: Date.now() });
82
+ this._evict();
83
+ }
84
+
85
+ /** Remove a single entry. */
86
+ invalidate(key: string): void {
87
+ this._entries.delete(key);
88
+ }
89
+
90
+ /**
91
+ * Remove all entries whose key starts with `prefix`.
92
+ *
93
+ * Useful for bulk invalidation scoped to a resource type
94
+ * (e.g. `invalidatePrefix("session:")` on logout).
95
+ */
96
+ invalidatePrefix(prefix: string): void {
97
+ for (const key of this._entries.keys()) {
98
+ if (key.startsWith(prefix)) {
99
+ this._entries.delete(key);
100
+ }
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Fire-and-forget fetch that writes the result to the cache.
106
+ * Errors are silently swallowed — the worst case is a cache miss.
107
+ */
108
+ prefetch<T>(key: string, fetchFn: () => Promise<T>): void {
109
+ fetchFn().then(
110
+ (data) => this.set(key, data),
111
+ () => {
112
+ /* intentional no-op */
113
+ },
114
+ );
115
+ }
116
+
117
+ /** Drop all entries. */
118
+ clear(): void {
119
+ this._entries.clear();
120
+ }
121
+
122
+ /** Number of live (non-expired) entries. Mainly useful in tests. */
123
+ get size(): number {
124
+ // Lazy purge expired entries on size read so the count is accurate.
125
+ for (const [key, entry] of this._entries) {
126
+ if (this._isExpired(entry)) this._entries.delete(key);
127
+ }
128
+ return this._entries.size;
129
+ }
130
+
131
+ // -----------------------------------------------------------------------
132
+ // Private
133
+ // -----------------------------------------------------------------------
134
+
135
+ private _isExpired(entry: CacheEntry): boolean {
136
+ return Date.now() - entry.timestamp > this._ttl;
137
+ }
138
+
139
+ /**
140
+ * Evict the oldest entries (by insertion order) when the cache
141
+ * exceeds `maxEntries`. Because `Map` preserves insertion order
142
+ * and `set` always re-inserts at the tail, the iterator yields
143
+ * entries from oldest to newest — giving us LRU eviction.
144
+ */
145
+ private _evict(): void {
146
+ if (this._entries.size <= this._maxEntries) return;
147
+ const excess = this._entries.size - this._maxEntries;
148
+ const iter = this._entries.keys();
149
+ for (let i = 0; i < excess; i++) {
150
+ const { value: key, done } = iter.next();
151
+ if (done) break;
152
+ this._entries.delete(key);
153
+ }
154
+ }
155
+ }
@@ -0,0 +1,257 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import {
4
+ AgentExecutionSchema,
5
+ AgentExecutionStatusSchema,
6
+ type AgentExecution,
7
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
8
+ import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
9
+ import {
10
+ ExecutionPhase,
11
+ MessageType,
12
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
13
+ import { ConversationStore, type StreamState } from "../conversation-store";
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Helpers
17
+ // ---------------------------------------------------------------------------
18
+
19
+ function makeExec(
20
+ phase: ExecutionPhase,
21
+ messages?: Array<{ type: MessageType; content: string }>,
22
+ ): AgentExecution {
23
+ const exec = create(AgentExecutionSchema);
24
+ const status = create(AgentExecutionStatusSchema);
25
+ status.phase = phase;
26
+ if (messages) {
27
+ status.messages = messages.map((m) => {
28
+ const msg = create(AgentMessageSchema);
29
+ msg.type = m.type;
30
+ msg.content = m.content;
31
+ return msg;
32
+ });
33
+ }
34
+ exec.status = status;
35
+ return exec;
36
+ }
37
+
38
+ // ---------------------------------------------------------------------------
39
+ // Tests
40
+ // ---------------------------------------------------------------------------
41
+
42
+ describe("ConversationStore", () => {
43
+ describe("initial state", () => {
44
+ it("starts with null execution and idle stream state", () => {
45
+ const store = new ConversationStore();
46
+ expect(store.getExecution()).toBeNull();
47
+ expect(store.getStreamState()).toEqual({ stage: "idle" });
48
+ });
49
+ });
50
+
51
+ describe("subscribe / unsubscribe", () => {
52
+ it("notifies listeners on state changes", () => {
53
+ const store = new ConversationStore();
54
+ const listener = vi.fn();
55
+ store.subscribe(listener);
56
+
57
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
58
+ expect(listener).toHaveBeenCalledTimes(1);
59
+ });
60
+
61
+ it("stops notifying after unsubscribe", () => {
62
+ const store = new ConversationStore();
63
+ const listener = vi.fn();
64
+ const unsub = store.subscribe(listener);
65
+
66
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
67
+ expect(listener).toHaveBeenCalledTimes(1);
68
+
69
+ unsub();
70
+ store.setStreamState({ stage: "streaming", executionId: "e1" });
71
+ expect(listener).toHaveBeenCalledTimes(1);
72
+ });
73
+
74
+ it("supports multiple listeners", () => {
75
+ const store = new ConversationStore();
76
+ const l1 = vi.fn();
77
+ const l2 = vi.fn();
78
+ store.subscribe(l1);
79
+ store.subscribe(l2);
80
+
81
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
82
+ expect(l1).toHaveBeenCalledTimes(1);
83
+ expect(l2).toHaveBeenCalledTimes(1);
84
+ });
85
+ });
86
+
87
+ describe("ingestSnapshot", () => {
88
+ it("stores execution and notifies listeners", () => {
89
+ const store = new ConversationStore();
90
+ const listener = vi.fn();
91
+ store.subscribe(listener);
92
+
93
+ const snapshot = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
94
+ { type: MessageType.MESSAGE_AI, content: "hello" },
95
+ ]);
96
+ store.ingestSnapshot(snapshot);
97
+
98
+ expect(store.getExecution()).toBe(snapshot);
99
+ expect(listener).toHaveBeenCalledTimes(1);
100
+ });
101
+
102
+ it("does not notify when structural sharing produces the same reference", () => {
103
+ const store = new ConversationStore();
104
+ const snapshot = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
105
+ { type: MessageType.MESSAGE_AI, content: "hello" },
106
+ ]);
107
+ store.ingestSnapshot(snapshot);
108
+
109
+ const listener = vi.fn();
110
+ store.subscribe(listener);
111
+
112
+ const identical = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
113
+ { type: MessageType.MESSAGE_AI, content: "hello" },
114
+ ]);
115
+ store.ingestSnapshot(identical);
116
+
117
+ expect(listener).not.toHaveBeenCalled();
118
+ expect(store.getExecution()).toBe(snapshot);
119
+ });
120
+
121
+ it("applies structural sharing: preserves unchanged message refs", () => {
122
+ const store = new ConversationStore();
123
+ const snap1 = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
124
+ { type: MessageType.MESSAGE_HUMAN, content: "question" },
125
+ { type: MessageType.MESSAGE_AI, content: "partial" },
126
+ ]);
127
+ store.ingestSnapshot(snap1);
128
+
129
+ const prevMsgs = store.getExecution()!.status!.messages;
130
+ const humanMsg = prevMsgs[0];
131
+
132
+ const snap2 = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
133
+ { type: MessageType.MESSAGE_HUMAN, content: "question" },
134
+ { type: MessageType.MESSAGE_AI, content: "partial answer growing" },
135
+ ]);
136
+ store.ingestSnapshot(snap2);
137
+
138
+ const result = store.getExecution()!;
139
+ expect(result.status!.messages[0]).toBe(humanMsg);
140
+ expect(result.status!.messages[1].content).toBe(
141
+ "partial answer growing",
142
+ );
143
+ });
144
+ });
145
+
146
+ describe("setStreamState", () => {
147
+ it("transitions between stages and notifies", () => {
148
+ const store = new ConversationStore();
149
+ const listener = vi.fn();
150
+ store.subscribe(listener);
151
+
152
+ const states: StreamState[] = [
153
+ { stage: "connecting", executionId: "e1" },
154
+ { stage: "streaming", executionId: "e1" },
155
+ { stage: "complete", executionId: "e1" },
156
+ ];
157
+
158
+ for (const state of states) {
159
+ store.setStreamState(state);
160
+ }
161
+
162
+ expect(listener).toHaveBeenCalledTimes(3);
163
+ expect(store.getStreamState()).toEqual({
164
+ stage: "complete",
165
+ executionId: "e1",
166
+ });
167
+ });
168
+
169
+ it("does not notify when set to the same state", () => {
170
+ const store = new ConversationStore();
171
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
172
+
173
+ const listener = vi.fn();
174
+ store.subscribe(listener);
175
+
176
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
177
+ expect(listener).not.toHaveBeenCalled();
178
+ });
179
+
180
+ it("handles error state", () => {
181
+ const store = new ConversationStore();
182
+ const err = new Error("network failure");
183
+ store.setStreamState({ stage: "error", executionId: "e1", error: err });
184
+
185
+ const state = store.getStreamState();
186
+ expect(state.stage).toBe("error");
187
+ if (state.stage === "error") {
188
+ expect(state.error).toBe(err);
189
+ }
190
+ });
191
+ });
192
+
193
+ describe("reset", () => {
194
+ it("clears execution and stream state", () => {
195
+ const store = new ConversationStore();
196
+ store.ingestSnapshot(
197
+ makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
198
+ { type: MessageType.MESSAGE_AI, content: "hi" },
199
+ ]),
200
+ );
201
+ store.setStreamState({ stage: "streaming", executionId: "e1" });
202
+
203
+ const listener = vi.fn();
204
+ store.subscribe(listener);
205
+
206
+ store.reset();
207
+
208
+ expect(store.getExecution()).toBeNull();
209
+ expect(store.getStreamState()).toEqual({ stage: "idle" });
210
+ expect(listener).toHaveBeenCalledTimes(1);
211
+ });
212
+
213
+ it("does not notify when already in initial state", () => {
214
+ const store = new ConversationStore();
215
+ const listener = vi.fn();
216
+ store.subscribe(listener);
217
+
218
+ store.reset();
219
+ expect(listener).not.toHaveBeenCalled();
220
+ });
221
+ });
222
+
223
+ describe("getExecution / getStreamState referential stability", () => {
224
+ it("getExecution returns the same reference across calls when unchanged", () => {
225
+ const store = new ConversationStore();
226
+ const snap = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS);
227
+ store.ingestSnapshot(snap);
228
+
229
+ const ref1 = store.getExecution();
230
+ const ref2 = store.getExecution();
231
+ expect(ref1).toBe(ref2);
232
+ });
233
+
234
+ it("getStreamState returns the same reference across calls when unchanged", () => {
235
+ const store = new ConversationStore();
236
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
237
+
238
+ const ref1 = store.getStreamState();
239
+ const ref2 = store.getStreamState();
240
+ expect(ref1).toBe(ref2);
241
+ });
242
+
243
+ it("subscribe and getters are bound methods (safe to destructure)", () => {
244
+ const store = new ConversationStore();
245
+ const { subscribe, getExecution, getStreamState } = store;
246
+
247
+ expect(getExecution()).toBeNull();
248
+ expect(getStreamState()).toEqual({ stage: "idle" });
249
+
250
+ const listener = vi.fn();
251
+ const unsub = subscribe(listener);
252
+ store.setStreamState({ stage: "connecting", executionId: "e1" });
253
+ expect(listener).toHaveBeenCalledTimes(1);
254
+ unsub();
255
+ });
256
+ });
257
+ });