@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
@@ -1,74 +1,58 @@
1
1
  import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
2
2
  /**
3
- * Per-model cost breakdown computed from per-message {@link LlmCallMetrics}.
3
+ * Per-model cost breakdown.
4
4
  */
5
5
  export interface ModelCostEntry {
6
- /** Model identifier (e.g., `"claude-3-5-sonnet-20241022"`). */
6
+ /** Model identifier (e.g. "claude-sonnet-4-20250514"). */
7
7
  readonly model: string;
8
- /** Provider that served the model (e.g., `"anthropic"`). */
8
+ /** Provider name (e.g. "anthropic", "openai"). */
9
9
  readonly provider: string;
10
- /** Estimated cost in USD for all calls to this model. */
10
+ /** Estimated cost in USD for this model's usage. */
11
11
  readonly estimatedCostUsd: number;
12
- /** Total non-cached input tokens across all calls to this model. */
12
+ /** Total input tokens consumed by this model. */
13
13
  readonly inputTokens: number;
14
- /** Total output tokens across all calls to this model. */
14
+ /** Total output tokens generated by this model. */
15
15
  readonly outputTokens: number;
16
- /** Total cache creation tokens across all calls to this model. */
16
+ /** Tokens used to create cache entries. */
17
17
  readonly cacheCreationTokens: number;
18
- /** Total cache read tokens across all calls to this model. */
18
+ /** Tokens served from cache. */
19
19
  readonly cacheReadTokens: number;
20
20
  /** Number of LLM calls made to this model. */
21
21
  readonly callCount: number;
22
22
  }
23
23
  /** Return value of {@link useSessionUsage}. */
24
24
  export interface UseSessionUsageReturn {
25
- /** Total estimated cost across all executions in the session. */
25
+ /** Aggregate estimated cost in USD across all models. */
26
26
  readonly totalCostUsd: number;
27
- /** Total tokens (all types) across all executions. */
27
+ /** Total tokens (input + output) across all models. */
28
28
  readonly totalTokens: number;
29
- /** Total input tokens (non-cached) across all executions. */
29
+ /** Total input tokens across all models. */
30
30
  readonly inputTokens: number;
31
- /** Total output tokens across all executions. */
31
+ /** Total output tokens across all models. */
32
32
  readonly outputTokens: number;
33
- /** Total cache read tokens across all executions. */
33
+ /** Total tokens served from cache across all models. */
34
34
  readonly cacheReadTokens: number;
35
- /** Total cache creation tokens across all executions. */
35
+ /** Total tokens used to create cache entries across all models. */
36
36
  readonly cacheCreationTokens: number;
37
- /** Total number of LLM calls across all executions. */
37
+ /** Total number of LLM calls in this session. */
38
38
  readonly llmCallCount: number;
39
- /** Per-model breakdown, sorted by cost descending. */
39
+ /** Per-model cost and token breakdown. */
40
40
  readonly modelBreakdown: readonly ModelCostEntry[];
41
- /** Primary model (first model encountered). */
41
+ /** Model with the highest usage in this session. */
42
42
  readonly primaryModel: string;
43
- /** Primary provider (first provider encountered). */
43
+ /** Provider of the primary model. */
44
44
  readonly primaryProvider: string;
45
- /** `true` when at least one execution has cost data. */
45
+ /** `true` when usage data is available. */
46
46
  readonly hasUsage: boolean;
47
47
  }
48
48
  /**
49
- * Pure derivation hook that aggregates usage data across all executions
50
- * in a session from per-message {@link LlmCallMetrics}.
49
+ * Usage hook for session-level cost and token aggregation.
51
50
  *
52
- * Follows the same pattern as {@link useSessionArtifacts} and
53
- * {@link useSessionWriteBacks}: `useMemo`-based derivation, no side
54
- * effects, no data fetching. Takes the same `executions` array input.
51
+ * Calls `getSessionUsageReport` to fetch real usage data from the
52
+ * billing domain. Returns zeros while loading or when no session is
53
+ * available.
55
54
  *
56
- * Per-message `llm_metrics` on `AgentMessage` (type == MESSAGE_AI) is
57
- * the single source of truth for cost data. This hook walks all messages
58
- * (main agent + sub-agents) across all executions and sums the fields.
59
- *
60
- * @param executions - All executions for a session, in chronological
61
- * order. Pass both completed and active-stream executions.
62
- *
63
- * @example
64
- * ```tsx
65
- * const conv = useSessionConversation(sessionId, org);
66
- * const allExecutions = [
67
- * ...conv.completedExecutions,
68
- * ...(conv.activeStreamExecution ? [conv.activeStreamExecution] : []),
69
- * ];
70
- * const { totalCostUsd, totalTokens, hasUsage } = useSessionUsage(allExecutions);
71
- * ```
55
+ * @param executions - All executions for a session (used to derive session ID).
72
56
  */
73
57
  export declare function useSessionUsage(executions: readonly AgentExecution[]): UseSessionUsageReturn;
74
58
  //# sourceMappingURL=useSessionUsage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionUsage.d.ts","sourceRoot":"","sources":["../../src/session/useSessionUsage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAIlG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,cAAc,EAAE,SAAS,cAAc,EAAE,CAAC;IACnD,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,cAAc,EAAE,GACpC,qBAAqB,CAqFvB"}
1
+ {"version":3,"file":"useSessionUsage.d.ts","sourceRoot":"","sources":["../../src/session/useSessionUsage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AASlG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,gCAAgC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,SAAS,cAAc,EAAE,CAAC;IACnD,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAoDD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,cAAc,EAAE,GACpC,qBAAqB,CAwBvB"}
@@ -1,107 +1,74 @@
1
1
  "use client";
2
2
  import { useMemo } from "react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { GetSessionUsageReportInputSchema, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
5
+ import { useStigmer } from "../hooks";
6
+ import { useFetch } from "../internal/useFetch";
7
+ const EMPTY = {
8
+ totalCostUsd: 0,
9
+ totalTokens: 0,
10
+ inputTokens: 0,
11
+ outputTokens: 0,
12
+ cacheReadTokens: 0,
13
+ cacheCreationTokens: 0,
14
+ llmCallCount: 0,
15
+ modelBreakdown: [],
16
+ primaryModel: "",
17
+ primaryProvider: "",
18
+ hasUsage: false,
19
+ };
20
+ function microsToUsd(micros) {
21
+ return Number(micros) / 1_000_000;
22
+ }
23
+ function mapModelUsage(m) {
24
+ return {
25
+ model: m.model,
26
+ provider: m.provider,
27
+ estimatedCostUsd: microsToUsd(m.billableCostMicros),
28
+ inputTokens: Number(m.inputTokens),
29
+ outputTokens: Number(m.outputTokens),
30
+ cacheCreationTokens: Number(m.cacheCreationInputTokens),
31
+ cacheReadTokens: Number(m.cacheReadInputTokens),
32
+ callCount: m.callCount,
33
+ };
34
+ }
35
+ function mapReport(report) {
36
+ const agg = report.totalUsage;
37
+ if (!agg)
38
+ return EMPTY;
39
+ return {
40
+ totalCostUsd: microsToUsd(agg.billableCostMicros),
41
+ totalTokens: Number(agg.totalTokens),
42
+ inputTokens: Number(agg.inputTokens),
43
+ outputTokens: Number(agg.outputTokens),
44
+ cacheReadTokens: Number(agg.cacheReadInputTokens),
45
+ cacheCreationTokens: Number(agg.cacheCreationInputTokens),
46
+ llmCallCount: agg.llmCallCount,
47
+ modelBreakdown: report.modelBreakdown.map(mapModelUsage),
48
+ primaryModel: agg.primaryModel,
49
+ primaryProvider: agg.primaryProvider,
50
+ hasUsage: true,
51
+ };
52
+ }
3
53
  /**
4
- * Pure derivation hook that aggregates usage data across all executions
5
- * in a session from per-message {@link LlmCallMetrics}.
6
- *
7
- * Follows the same pattern as {@link useSessionArtifacts} and
8
- * {@link useSessionWriteBacks}: `useMemo`-based derivation, no side
9
- * effects, no data fetching. Takes the same `executions` array input.
10
- *
11
- * Per-message `llm_metrics` on `AgentMessage` (type == MESSAGE_AI) is
12
- * the single source of truth for cost data. This hook walks all messages
13
- * (main agent + sub-agents) across all executions and sums the fields.
54
+ * Usage hook for session-level cost and token aggregation.
14
55
  *
15
- * @param executions - All executions for a session, in chronological
16
- * order. Pass both completed and active-stream executions.
56
+ * Calls `getSessionUsageReport` to fetch real usage data from the
57
+ * billing domain. Returns zeros while loading or when no session is
58
+ * available.
17
59
  *
18
- * @example
19
- * ```tsx
20
- * const conv = useSessionConversation(sessionId, org);
21
- * const allExecutions = [
22
- * ...conv.completedExecutions,
23
- * ...(conv.activeStreamExecution ? [conv.activeStreamExecution] : []),
24
- * ];
25
- * const { totalCostUsd, totalTokens, hasUsage } = useSessionUsage(allExecutions);
26
- * ```
60
+ * @param executions - All executions for a session (used to derive session ID).
27
61
  */
28
62
  export function useSessionUsage(executions) {
63
+ const stigmer = useStigmer();
64
+ const sessionId = useMemo(() => executions[0]?.spec?.sessionId ?? null, [executions]);
65
+ const { data: report } = useFetch(sessionId
66
+ ? () => stigmer.agentExecution.getSessionUsageReport(create(GetSessionUsageReportInputSchema, { sessionId }))
67
+ : null, [sessionId, stigmer], null, { cacheKey: sessionId ? `session-usage:${sessionId}` : undefined });
29
68
  return useMemo(() => {
30
- let totalCostUsd = 0;
31
- let totalTokens = 0;
32
- let inputTokens = 0;
33
- let outputTokens = 0;
34
- let cacheReadTokens = 0;
35
- let cacheCreationTokens = 0;
36
- let llmCallCount = 0;
37
- let primaryModel = "";
38
- let primaryProvider = "";
39
- const modelMap = new Map();
40
- const processMessage = (msg) => {
41
- const m = msg.llmMetrics;
42
- if (!m)
43
- return;
44
- totalCostUsd += m.estimatedCostUsd;
45
- totalTokens += m.totalTokens;
46
- inputTokens += m.inputTokens;
47
- outputTokens += m.outputTokens;
48
- cacheReadTokens += m.cacheReadTokens;
49
- cacheCreationTokens += m.cacheCreationTokens;
50
- llmCallCount++;
51
- if (!primaryModel && m.model) {
52
- primaryModel = m.model;
53
- primaryProvider = m.provider;
54
- }
55
- const key = `${m.model}\0${m.provider}`;
56
- const existing = modelMap.get(key);
57
- if (existing) {
58
- modelMap.set(key, {
59
- ...existing,
60
- estimatedCostUsd: existing.estimatedCostUsd + m.estimatedCostUsd,
61
- inputTokens: existing.inputTokens + m.inputTokens,
62
- outputTokens: existing.outputTokens + m.outputTokens,
63
- cacheCreationTokens: existing.cacheCreationTokens + m.cacheCreationTokens,
64
- cacheReadTokens: existing.cacheReadTokens + m.cacheReadTokens,
65
- callCount: existing.callCount + 1,
66
- });
67
- }
68
- else {
69
- modelMap.set(key, {
70
- model: m.model,
71
- provider: m.provider,
72
- estimatedCostUsd: m.estimatedCostUsd,
73
- inputTokens: m.inputTokens,
74
- outputTokens: m.outputTokens,
75
- cacheCreationTokens: m.cacheCreationTokens,
76
- cacheReadTokens: m.cacheReadTokens,
77
- callCount: 1,
78
- });
79
- }
80
- };
81
- for (const execution of executions) {
82
- for (const msg of execution.status?.messages ?? []) {
83
- processMessage(msg);
84
- }
85
- for (const sub of execution.status?.subAgentExecutions ?? []) {
86
- for (const msg of sub.messages) {
87
- processMessage(msg);
88
- }
89
- }
90
- }
91
- const modelBreakdown = Array.from(modelMap.values()).sort((a, b) => b.estimatedCostUsd - a.estimatedCostUsd);
92
- return {
93
- totalCostUsd,
94
- totalTokens,
95
- inputTokens,
96
- outputTokens,
97
- cacheReadTokens,
98
- cacheCreationTokens,
99
- llmCallCount,
100
- modelBreakdown,
101
- primaryModel,
102
- primaryProvider,
103
- hasUsage: llmCallCount > 0,
104
- };
105
- }, [executions]);
69
+ if (!report)
70
+ return EMPTY;
71
+ return mapReport(report);
72
+ }, [report]);
106
73
  }
107
74
  //# sourceMappingURL=useSessionUsage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionUsage.js","sourceRoot":"","sources":["../../src/session/useSessionUsage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSessionUsage.js","sourceRoot":"","sources":["../../src/session/useSessionUsage.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,gCAAgC,GAEjC,MAAM,4DAA4D,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAkDhD,MAAM,KAAK,GAA0B;IACnC,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,CAAC;IACtB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,EAAE;IACnB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,CAAa;IAClC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACnD,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QAClC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;QACpC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACvD,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC/C,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAmC;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAEvB,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACjD,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QACpC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACjD,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC;QACzD,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;QACxD,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAqC;IAErC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,EAC5C,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAC/B,SAAS;QACP,CAAC,CAAC,GAAG,EAAE,CACH,OAAO,CAAC,cAAc,CAAC,qBAAqB,CAC1C,MAAM,CAAC,gCAAgC,EAAE,EAAE,SAAS,EAAE,CAAC,CACxD;QACL,CAAC,CAAC,IAAI,EACR,CAAC,SAAS,EAAE,OAAO,CAAC,EACpB,IAA0C,EAC1C,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CACnE,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { BillingSection } from "../billing/BillingSection";
2
+ export type { BillingSectionProps } from "../billing/BillingSection";
3
+ //# sourceMappingURL=BillingSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BillingSection.d.ts","sourceRoot":"","sources":["../../src/settings/BillingSection.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ export { BillingSection } from "../billing/BillingSection";
3
+ //# sourceMappingURL=BillingSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BillingSection.js","sourceRoot":"","sources":["../../src/settings/BillingSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,6 +1,8 @@
1
1
  export { SETTINGS_NAV_GROUPS } from "./settings-nav";
2
2
  export type { SettingsNavItem, SettingsNavGroup } from "./settings-nav";
3
3
  export { ApiKeysSection } from "./ApiKeysSection";
4
+ export { BillingSection } from "./BillingSection";
5
+ export type { BillingSectionProps } from "./BillingSection";
4
6
  export { MembersSection } from "./MembersSection";
5
7
  export { OrgProfileSection } from "./OrgProfileSection";
6
8
  export { EnvironmentsSection } from "./EnvironmentsSection";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
package/settings/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { SETTINGS_NAV_GROUPS } from "./settings-nav";
2
2
  export { ApiKeysSection } from "./ApiKeysSection";
3
+ export { BillingSection } from "./BillingSection";
3
4
  export { MembersSection } from "./MembersSection";
4
5
  export { OrgProfileSection } from "./OrgProfileSection";
5
6
  export { EnvironmentsSection } from "./EnvironmentsSection";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -31,7 +31,7 @@ export const SETTINGS_NAV_GROUPS = [
31
31
  },
32
32
  {
33
33
  label: "Billing & Usage",
34
- description: "Subscription management and usage metrics.",
34
+ description: "Credit management and usage metrics.",
35
35
  items: [
36
36
  { href: "/settings/billing", label: "Billing", icon: CreditCard },
37
37
  { href: "/settings/usage", label: "Usage", icon: BarChart3 },
@@ -1 +1 @@
1
- {"version":3,"file":"settings-nav.js","sourceRoot":"","sources":["../../src/settings/settings-nav.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;AAyBtB,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kEAAkE;QACpE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;YACxE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;YACnE;gBACE,IAAI,EAAE,8BAA8B;gBACpC,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,WAAW;aAClB;SACF;KACF;IACD;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,mFAAmF;QACrF,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjE;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,IAAI;aACX;YACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE;YACpE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;SACvE;KACF;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,4CAA4C;QACzD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;YACjE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SAC7D;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"settings-nav.js","sourceRoot":"","sources":["../../src/settings/settings-nav.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;AAyBtB,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kEAAkE;QACpE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;YACxE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;YACnE;gBACE,IAAI,EAAE,8BAA8B;gBACpC,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,WAAW;aAClB;SACF;KACF;IACD;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,mFAAmF;QACrF,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjE;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,IAAI;aACX;YACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE;YACpE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;SACvE;KACF;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,sCAAsC;QACnD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;YACjE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SAC7D;KACF;CACF,CAAC"}
@@ -0,0 +1,274 @@
1
+ "use client";
2
+
3
+ import { useState, useCallback, useEffect } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import type { AutoRechargeConfig } from "@stigmer/protos/ai/stigmer/billing/v1/billing_account_pb";
6
+ import { BillingAccountStatus } from "@stigmer/protos/ai/stigmer/billing/v1/enum_pb";
7
+ import { getUserMessage } from "@stigmer/sdk";
8
+ import { useSetAutoRechargeConfig } from "./useSetAutoRechargeConfig";
9
+
10
+ /** Props for {@link AutoRechargeCard}. */
11
+ export interface AutoRechargeCardProps {
12
+ /** Organization ID. */
13
+ readonly orgId: string;
14
+ /** Current auto-recharge configuration from the billing account. */
15
+ readonly autoRecharge?: AutoRechargeConfig;
16
+ /** Whether the account has a saved payment method. */
17
+ readonly hasPaymentMethod: boolean;
18
+ /** Account status — config disabled when suspended or closed. */
19
+ readonly accountStatus: BillingAccountStatus;
20
+ /** Called after a successful save so the parent can refresh account data. */
21
+ readonly onSaved?: () => void;
22
+ /** Additional CSS class names. */
23
+ readonly className?: string;
24
+ }
25
+
26
+ const MICROS_PER_DOLLAR = BigInt(1_000_000);
27
+
28
+ function microsToDollars(micros: bigint): string {
29
+ if (micros === BigInt(0)) return "";
30
+ const dollars = Number(micros) / 1_000_000;
31
+ return dollars.toString();
32
+ }
33
+
34
+ function dollarsToMicros(value: string): bigint {
35
+ const num = parseFloat(value);
36
+ if (isNaN(num) || num < 0) return BigInt(0);
37
+ return BigInt(Math.round(num * 1_000_000));
38
+ }
39
+
40
+ /**
41
+ * Auto-recharge configuration card for the billing settings page.
42
+ *
43
+ * Shows a toggle to enable/disable auto-recharge, with input fields
44
+ * for threshold, recharge amount, and monthly cap. Displays a
45
+ * disabled state with an explanatory message when no payment method
46
+ * is on file. Validates inputs client-side before submitting.
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * <AutoRechargeCard
51
+ * orgId={orgId}
52
+ * autoRecharge={account.autoRecharge}
53
+ * hasPaymentMethod={!!account.defaultPaymentMethod?.paymentMethodId}
54
+ * accountStatus={account.status}
55
+ * onSaved={refetch}
56
+ * />
57
+ * ```
58
+ */
59
+ export function AutoRechargeCard({
60
+ orgId,
61
+ autoRecharge,
62
+ hasPaymentMethod,
63
+ accountStatus,
64
+ onSaved,
65
+ className,
66
+ }: AutoRechargeCardProps) {
67
+ const { setConfig, isSubmitting, error, clearError } =
68
+ useSetAutoRechargeConfig();
69
+
70
+ const [enabled, setEnabled] = useState(autoRecharge?.enabled ?? false);
71
+ const [threshold, setThreshold] = useState(
72
+ microsToDollars(autoRecharge?.thresholdMicros ?? BigInt(0)),
73
+ );
74
+ const [amount, setAmount] = useState(
75
+ microsToDollars(autoRecharge?.rechargeAmountMicros ?? BigInt(0)),
76
+ );
77
+ const [cap, setCap] = useState(
78
+ microsToDollars(autoRecharge?.monthlyCapMicros ?? BigInt(0)),
79
+ );
80
+ const [saved, setSaved] = useState(false);
81
+
82
+ useEffect(() => {
83
+ if (!autoRecharge) return;
84
+ setEnabled(autoRecharge.enabled);
85
+ setThreshold(microsToDollars(autoRecharge.thresholdMicros));
86
+ setAmount(microsToDollars(autoRecharge.rechargeAmountMicros));
87
+ setCap(microsToDollars(autoRecharge.monthlyCapMicros));
88
+ }, [autoRecharge]);
89
+
90
+ const isAccountActive =
91
+ accountStatus === BillingAccountStatus.billing_account_active;
92
+ const canConfigure = hasPaymentMethod && isAccountActive;
93
+
94
+ const hasChanges =
95
+ enabled !== (autoRecharge?.enabled ?? false) ||
96
+ dollarsToMicros(threshold) !==
97
+ (autoRecharge?.thresholdMicros ?? BigInt(0)) ||
98
+ dollarsToMicros(amount) !==
99
+ (autoRecharge?.rechargeAmountMicros ?? BigInt(0)) ||
100
+ dollarsToMicros(cap) !== (autoRecharge?.monthlyCapMicros ?? BigInt(0));
101
+
102
+ const handleSave = useCallback(async () => {
103
+ clearError();
104
+ setSaved(false);
105
+
106
+ try {
107
+ await setConfig({
108
+ orgId,
109
+ enabled,
110
+ thresholdMicros: dollarsToMicros(threshold),
111
+ rechargeAmountMicros: dollarsToMicros(amount),
112
+ monthlyCapMicros: dollarsToMicros(cap),
113
+ });
114
+ setSaved(true);
115
+ onSaved?.();
116
+ setTimeout(() => setSaved(false), 3000);
117
+ } catch {
118
+ // error state is managed by the hook
119
+ }
120
+ }, [orgId, enabled, threshold, amount, cap, setConfig, clearError, onSaved]);
121
+
122
+ return (
123
+ <div
124
+ className={cn(
125
+ "rounded-lg border border-border bg-card px-4 py-4",
126
+ className,
127
+ )}
128
+ >
129
+ <div className="flex items-center justify-between">
130
+ <div>
131
+ <h3 className="text-xs font-semibold text-foreground">
132
+ Auto-Recharge
133
+ </h3>
134
+ <p className="mt-0.5 text-[0.7rem] text-muted-foreground">
135
+ Automatically add credits when your balance runs low.
136
+ </p>
137
+ </div>
138
+ <button
139
+ type="button"
140
+ role="switch"
141
+ aria-checked={enabled}
142
+ disabled={!canConfigure || isSubmitting}
143
+ onClick={() => setEnabled((prev) => !prev)}
144
+ className={cn(
145
+ "relative inline-flex h-5 w-9 shrink-0 rounded-full transition-colors",
146
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
147
+ "disabled:cursor-not-allowed disabled:opacity-50",
148
+ enabled ? "bg-primary" : "bg-muted",
149
+ )}
150
+ >
151
+ <span
152
+ className={cn(
153
+ "pointer-events-none block size-4 rounded-full bg-background shadow-sm ring-0 transition-transform",
154
+ enabled ? "translate-x-4" : "translate-x-0.5",
155
+ "mt-0.5",
156
+ )}
157
+ />
158
+ </button>
159
+ </div>
160
+
161
+ {!hasPaymentMethod && (
162
+ <p className="mt-3 text-xs text-muted-foreground">
163
+ A saved payment method is required to enable auto-recharge.
164
+ Purchase a credit pack first to save a card.
165
+ </p>
166
+ )}
167
+
168
+ {canConfigure && (
169
+ <div className="mt-4 space-y-3">
170
+ <DollarInput
171
+ id="ar-threshold"
172
+ label="When balance drops below"
173
+ value={threshold}
174
+ onChange={setThreshold}
175
+ disabled={isSubmitting}
176
+ placeholder="e.g. 5"
177
+ />
178
+ <DollarInput
179
+ id="ar-amount"
180
+ label="Recharge amount"
181
+ value={amount}
182
+ onChange={setAmount}
183
+ disabled={isSubmitting}
184
+ placeholder="e.g. 50"
185
+ />
186
+ <DollarInput
187
+ id="ar-cap"
188
+ label="Monthly cap"
189
+ value={cap}
190
+ onChange={setCap}
191
+ disabled={isSubmitting}
192
+ placeholder="e.g. 200"
193
+ />
194
+
195
+ <div className="flex items-center gap-3 pt-1">
196
+ <button
197
+ type="button"
198
+ disabled={!hasChanges || isSubmitting}
199
+ onClick={handleSave}
200
+ className={cn(
201
+ "rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
202
+ "bg-primary text-primary-foreground hover:bg-primary/90",
203
+ "disabled:pointer-events-none disabled:opacity-50",
204
+ )}
205
+ aria-busy={isSubmitting}
206
+ >
207
+ {isSubmitting ? "Saving\u2026" : "Save"}
208
+ </button>
209
+ {saved && (
210
+ <span className="text-xs text-emerald-600 dark:text-emerald-400">
211
+ Saved
212
+ </span>
213
+ )}
214
+ </div>
215
+
216
+ {error && (
217
+ <p className="text-xs text-destructive" role="alert">
218
+ {getUserMessage(error)}
219
+ </p>
220
+ )}
221
+ </div>
222
+ )}
223
+ </div>
224
+ );
225
+ }
226
+
227
+ // ---------------------------------------------------------------------------
228
+ // DollarInput (internal)
229
+ // ---------------------------------------------------------------------------
230
+
231
+ function DollarInput({
232
+ id,
233
+ label,
234
+ value,
235
+ onChange,
236
+ disabled,
237
+ placeholder,
238
+ }: {
239
+ id: string;
240
+ label: string;
241
+ value: string;
242
+ onChange: (v: string) => void;
243
+ disabled?: boolean;
244
+ placeholder?: string;
245
+ }) {
246
+ return (
247
+ <div>
248
+ <label htmlFor={id} className="block text-xs text-muted-foreground">
249
+ {label}
250
+ </label>
251
+ <div className="relative mt-1">
252
+ <span className="pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-xs text-muted-foreground">
253
+ $
254
+ </span>
255
+ <input
256
+ id={id}
257
+ type="number"
258
+ min="0"
259
+ step="any"
260
+ value={value}
261
+ onChange={(e) => onChange(e.target.value)}
262
+ disabled={disabled}
263
+ placeholder={placeholder}
264
+ className={cn(
265
+ "w-full rounded-md border border-input bg-background py-1.5 pl-6 pr-3 text-xs tabular-nums",
266
+ "text-foreground placeholder:text-muted-foreground/60",
267
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
268
+ "disabled:cursor-not-allowed disabled:opacity-50",
269
+ )}
270
+ />
271
+ </div>
272
+ </div>
273
+ );
274
+ }