@stigmer/react 0.3.3 → 0.4.0
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.
- package/billing/AutoRechargeCard.d.ts +38 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -0
- package/billing/AutoRechargeCard.js +90 -0
- package/billing/AutoRechargeCard.js.map +1 -0
- package/billing/BillingSection.d.ts +32 -0
- package/billing/BillingSection.d.ts.map +1 -0
- package/billing/BillingSection.js +81 -0
- package/billing/BillingSection.js.map +1 -0
- package/billing/CreditBalanceCard.d.ts +25 -0
- package/billing/CreditBalanceCard.d.ts.map +1 -0
- package/billing/CreditBalanceCard.js +28 -0
- package/billing/CreditBalanceCard.js.map +1 -0
- package/billing/CreditLedgerTable.d.ts +22 -0
- package/billing/CreditLedgerTable.d.ts.map +1 -0
- package/billing/CreditLedgerTable.js +75 -0
- package/billing/CreditLedgerTable.js.map +1 -0
- package/billing/CreditPackGrid.d.ts +31 -0
- package/billing/CreditPackGrid.d.ts.map +1 -0
- package/billing/CreditPackGrid.js +35 -0
- package/billing/CreditPackGrid.js.map +1 -0
- package/billing/LowBalanceBanner.d.ts +26 -0
- package/billing/LowBalanceBanner.d.ts.map +1 -0
- package/billing/LowBalanceBanner.js +33 -0
- package/billing/LowBalanceBanner.js.map +1 -0
- package/billing/PaymentMethodCard.d.ts +35 -0
- package/billing/PaymentMethodCard.d.ts.map +1 -0
- package/billing/PaymentMethodCard.js +48 -0
- package/billing/PaymentMethodCard.js.map +1 -0
- package/billing/credit-packs.d.ts +25 -0
- package/billing/credit-packs.d.ts.map +1 -0
- package/billing/credit-packs.js +39 -0
- package/billing/credit-packs.js.map +1 -0
- package/billing/format.d.ts +39 -0
- package/billing/format.d.ts.map +1 -0
- package/billing/format.js +90 -0
- package/billing/format.js.map +1 -0
- package/billing/index.d.ts +32 -0
- package/billing/index.d.ts.map +1 -0
- package/billing/index.js +21 -0
- package/billing/index.js.map +1 -0
- package/billing/useBillingAccount.d.ts +40 -0
- package/billing/useBillingAccount.d.ts.map +1 -0
- package/billing/useBillingAccount.js +35 -0
- package/billing/useBillingAccount.js.map +1 -0
- package/billing/useBillingUsageReport.d.ts +42 -0
- package/billing/useBillingUsageReport.d.ts.map +1 -0
- package/billing/useBillingUsageReport.js +43 -0
- package/billing/useBillingUsageReport.js.map +1 -0
- package/billing/useCreateBillingPortalSession.d.ts +35 -0
- package/billing/useCreateBillingPortalSession.d.ts.map +1 -0
- package/billing/useCreateBillingPortalSession.js +50 -0
- package/billing/useCreateBillingPortalSession.js.map +1 -0
- package/billing/useCreateCheckoutSession.d.ts +54 -0
- package/billing/useCreateCheckoutSession.d.ts.map +1 -0
- package/billing/useCreateCheckoutSession.js +58 -0
- package/billing/useCreateCheckoutSession.js.map +1 -0
- package/billing/useCreditLedger.d.ts +48 -0
- package/billing/useCreditLedger.d.ts.map +1 -0
- package/billing/useCreditLedger.js +39 -0
- package/billing/useCreditLedger.js.map +1 -0
- package/billing/useCustomerModelPricing.d.ts +41 -0
- package/billing/useCustomerModelPricing.d.ts.map +1 -0
- package/billing/useCustomerModelPricing.js +37 -0
- package/billing/useCustomerModelPricing.js.map +1 -0
- package/billing/useSetAutoRechargeConfig.d.ts +50 -0
- package/billing/useSetAutoRechargeConfig.d.ts.map +1 -0
- package/billing/useSetAutoRechargeConfig.js +53 -0
- package/billing/useSetAutoRechargeConfig.js.map +1 -0
- package/composer/ComposerToolbar.js +1 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +19 -4
- package/composer/SessionComposer.js.map +1 -1
- package/composer/__tests__/SessionComposer-memo.test.d.ts +2 -0
- package/composer/__tests__/SessionComposer-memo.test.d.ts.map +1 -0
- package/composer/__tests__/SessionComposer-memo.test.js +23 -0
- package/composer/__tests__/SessionComposer-memo.test.js.map +1 -0
- package/execution/ApprovalCard.d.ts +5 -1
- package/execution/ApprovalCard.d.ts.map +1 -1
- package/execution/ApprovalCard.js +7 -3
- package/execution/ApprovalCard.js.map +1 -1
- package/execution/ExecutionPhaseBadge.d.ts +1 -1
- package/execution/ExecutionPhaseBadge.d.ts.map +1 -1
- package/execution/ExecutionPhaseBadge.js +3 -2
- package/execution/ExecutionPhaseBadge.js.map +1 -1
- package/execution/MessageEntry.d.ts +7 -3
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +19 -8
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +84 -3
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +113 -65
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +3 -3
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts +5 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +13 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/ThreadSkeleton.d.ts +22 -0
- package/execution/ThreadSkeleton.d.ts.map +1 -0
- package/execution/ThreadSkeleton.js +26 -0
- package/execution/ThreadSkeleton.js.map +1 -0
- package/execution/ToolCallGroup.d.ts +16 -1
- package/execution/ToolCallGroup.d.ts.map +1 -1
- package/execution/ToolCallGroup.js +31 -3
- package/execution/ToolCallGroup.js.map +1 -1
- package/execution/UsageWidget.d.ts +1 -1
- package/execution/__tests__/message-entry.test.d.ts +2 -0
- package/execution/__tests__/message-entry.test.d.ts.map +1 -0
- package/execution/__tests__/message-entry.test.js +178 -0
- package/execution/__tests__/message-entry.test.js.map +1 -0
- package/execution/__tests__/thread-keys.test.d.ts +2 -0
- package/execution/__tests__/thread-keys.test.d.ts.map +1 -0
- package/execution/__tests__/thread-keys.test.js +289 -0
- package/execution/__tests__/thread-keys.test.js.map +1 -0
- package/execution/__tests__/thread-memoization.test.d.ts +2 -0
- package/execution/__tests__/thread-memoization.test.d.ts.map +1 -0
- package/execution/__tests__/thread-memoization.test.js +262 -0
- package/execution/__tests__/thread-memoization.test.js.map +1 -0
- package/execution/__tests__/thread-skeleton.test.d.ts +2 -0
- package/execution/__tests__/thread-skeleton.test.d.ts.map +1 -0
- package/execution/__tests__/thread-skeleton.test.js +35 -0
- package/execution/__tests__/thread-skeleton.test.js.map +1 -0
- package/execution/__tests__/useExecutionStream.test.js +73 -10
- package/execution/__tests__/useExecutionStream.test.js.map +1 -1
- package/execution/__tests__/useSessionVariables-stability.test.d.ts +2 -0
- package/execution/__tests__/useSessionVariables-stability.test.d.ts.map +1 -0
- package/execution/__tests__/useSessionVariables-stability.test.js +69 -0
- package/execution/__tests__/useSessionVariables-stability.test.js.map +1 -0
- package/execution/__tests__/virtualized-thread.test.d.ts +2 -0
- package/execution/__tests__/virtualized-thread.test.d.ts.map +1 -0
- package/execution/__tests__/virtualized-thread.test.js +274 -0
- package/execution/__tests__/virtualized-thread.test.js.map +1 -0
- package/execution/index.d.ts +2 -0
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +1 -0
- package/execution/index.js.map +1 -1
- package/execution/useExecutionStream.d.ts +35 -10
- package/execution/useExecutionStream.d.ts.map +1 -1
- package/execution/useExecutionStream.js +79 -40
- package/execution/useExecutionStream.js.map +1 -1
- package/execution/useSessionVariables.d.ts.map +1 -1
- package/execution/useSessionVariables.js +4 -3
- package/execution/useSessionVariables.js.map +1 -1
- package/github/useGitHubConnection.d.ts.map +1 -1
- package/github/useGitHubConnection.js +5 -4
- package/github/useGitHubConnection.js.map +1 -1
- package/identity-account/index.d.ts +2 -0
- package/identity-account/index.d.ts.map +1 -0
- package/identity-account/index.js +2 -0
- package/identity-account/index.js.map +1 -0
- package/identity-account/useIdentityAccountGate.d.ts +81 -0
- package/identity-account/useIdentityAccountGate.d.ts.map +1 -0
- package/identity-account/useIdentityAccountGate.js +100 -0
- package/identity-account/useIdentityAccountGate.js.map +1 -0
- package/index.d.ts +10 -4
- package/index.d.ts.map +1 -1
- package/index.js +8 -2
- package/index.js.map +1 -1
- package/internal/FetchCacheProvider.d.ts +44 -0
- package/internal/FetchCacheProvider.d.ts.map +1 -0
- package/internal/FetchCacheProvider.js +61 -0
- package/internal/FetchCacheProvider.js.map +1 -0
- package/internal/JumpToLatestButton.d.ts +14 -0
- package/internal/JumpToLatestButton.d.ts.map +1 -0
- package/internal/JumpToLatestButton.js +19 -0
- package/internal/JumpToLatestButton.js.map +1 -0
- package/internal/ThreadItemWrapper.d.ts +20 -0
- package/internal/ThreadItemWrapper.d.ts.map +1 -0
- package/internal/ThreadItemWrapper.js +44 -0
- package/internal/ThreadItemWrapper.js.map +1 -0
- package/internal/VirtualizedThread.d.ts +25 -0
- package/internal/VirtualizedThread.d.ts.map +1 -0
- package/internal/VirtualizedThread.js +58 -0
- package/internal/VirtualizedThread.js.map +1 -0
- package/internal/__tests__/fetch-cache.test.d.ts +2 -0
- package/internal/__tests__/fetch-cache.test.d.ts.map +1 -0
- package/internal/__tests__/fetch-cache.test.js +182 -0
- package/internal/__tests__/fetch-cache.test.js.map +1 -0
- package/internal/__tests__/stream-controller.test.d.ts +2 -0
- package/internal/__tests__/stream-controller.test.d.ts.map +1 -0
- package/internal/__tests__/stream-controller.test.js +294 -0
- package/internal/__tests__/stream-controller.test.js.map +1 -0
- package/internal/__tests__/thread-animation.test.d.ts +2 -0
- package/internal/__tests__/thread-animation.test.d.ts.map +1 -0
- package/internal/__tests__/thread-animation.test.js +79 -0
- package/internal/__tests__/thread-animation.test.js.map +1 -0
- package/internal/__tests__/useAutoScroll.test.d.ts +2 -0
- package/internal/__tests__/useAutoScroll.test.d.ts.map +1 -0
- package/internal/__tests__/useAutoScroll.test.js +188 -0
- package/internal/__tests__/useAutoScroll.test.js.map +1 -0
- package/internal/__tests__/useFetch-cache.test.d.ts +2 -0
- package/internal/__tests__/useFetch-cache.test.d.ts.map +1 -0
- package/internal/__tests__/useFetch-cache.test.js +137 -0
- package/internal/__tests__/useFetch-cache.test.js.map +1 -0
- package/internal/dev/__tests__/use-key-stability.test.d.ts +2 -0
- package/internal/dev/__tests__/use-key-stability.test.d.ts.map +1 -0
- package/internal/dev/__tests__/use-key-stability.test.js +72 -0
- package/internal/dev/__tests__/use-key-stability.test.js.map +1 -0
- package/internal/dev/__tests__/use-render-tracer.test.d.ts +2 -0
- package/internal/dev/__tests__/use-render-tracer.test.d.ts.map +1 -0
- package/internal/dev/__tests__/use-render-tracer.test.js +55 -0
- package/internal/dev/__tests__/use-render-tracer.test.js.map +1 -0
- package/internal/dev/dom-counter.d.ts +14 -0
- package/internal/dev/dom-counter.d.ts.map +1 -0
- package/internal/dev/dom-counter.js +39 -0
- package/internal/dev/dom-counter.js.map +1 -0
- package/internal/dev/index.d.ts +6 -0
- package/internal/dev/index.d.ts.map +1 -0
- package/internal/dev/index.js +6 -0
- package/internal/dev/index.js.map +1 -0
- package/internal/dev/profiler-wrapper.d.ts +16 -0
- package/internal/dev/profiler-wrapper.d.ts.map +1 -0
- package/internal/dev/profiler-wrapper.js +31 -0
- package/internal/dev/profiler-wrapper.js.map +1 -0
- package/internal/dev/use-key-stability.d.ts +22 -0
- package/internal/dev/use-key-stability.d.ts.map +1 -0
- package/internal/dev/use-key-stability.js +67 -0
- package/internal/dev/use-key-stability.js.map +1 -0
- package/internal/dev/use-render-tracer.d.ts +13 -0
- package/internal/dev/use-render-tracer.d.ts.map +1 -0
- package/internal/dev/use-render-tracer.js +57 -0
- package/internal/dev/use-render-tracer.js.map +1 -0
- package/internal/dev/use-stream-rate.d.ts +23 -0
- package/internal/dev/use-stream-rate.d.ts.map +1 -0
- package/internal/dev/use-stream-rate.js +94 -0
- package/internal/dev/use-stream-rate.js.map +1 -0
- package/internal/fetch-cache.d.ts +72 -0
- package/internal/fetch-cache.d.ts.map +1 -0
- package/internal/fetch-cache.js +118 -0
- package/internal/fetch-cache.js.map +1 -0
- package/internal/store/__tests__/conversation-store.test.d.ts +2 -0
- package/internal/store/__tests__/conversation-store.test.d.ts.map +1 -0
- package/internal/store/__tests__/conversation-store.test.js +200 -0
- package/internal/store/__tests__/conversation-store.test.js.map +1 -0
- package/internal/store/__tests__/structural-share.test.d.ts +2 -0
- package/internal/store/__tests__/structural-share.test.d.ts.map +1 -0
- package/internal/store/__tests__/structural-share.test.js +368 -0
- package/internal/store/__tests__/structural-share.test.js.map +1 -0
- package/internal/store/conversation-store.d.ts +62 -0
- package/internal/store/conversation-store.d.ts.map +1 -0
- package/internal/store/conversation-store.js +95 -0
- package/internal/store/conversation-store.js.map +1 -0
- package/internal/store/index.d.ts +31 -0
- package/internal/store/index.d.ts.map +1 -0
- package/internal/store/index.js +54 -0
- package/internal/store/index.js.map +1 -0
- package/internal/store/structural-share.d.ts +13 -0
- package/internal/store/structural-share.d.ts.map +1 -0
- package/internal/store/structural-share.js +240 -0
- package/internal/store/structural-share.js.map +1 -0
- package/internal/stream-controller.d.ts +85 -0
- package/internal/stream-controller.d.ts.map +1 -0
- package/internal/stream-controller.js +146 -0
- package/internal/stream-controller.js.map +1 -0
- package/internal/useAutoScroll.d.ts +32 -0
- package/internal/useAutoScroll.d.ts.map +1 -0
- package/internal/useAutoScroll.js +97 -0
- package/internal/useAutoScroll.js.map +1 -0
- package/internal/useFetch.d.ts +14 -0
- package/internal/useFetch.d.ts.map +1 -1
- package/internal/useFetch.js +32 -2
- package/internal/useFetch.js.map +1 -1
- package/package.json +7 -5
- package/session/__tests__/useNewSessionFlow.test.js +16 -0
- package/session/__tests__/useNewSessionFlow.test.js.map +1 -1
- package/session/__tests__/usePersistedModel.test.d.ts +2 -0
- package/session/__tests__/usePersistedModel.test.d.ts.map +1 -0
- package/session/__tests__/usePersistedModel.test.js +82 -0
- package/session/__tests__/usePersistedModel.test.js.map +1 -0
- package/session/__tests__/useSession.test.d.ts +2 -0
- package/session/__tests__/useSession.test.d.ts.map +1 -0
- package/session/__tests__/useSession.test.js +130 -0
- package/session/__tests__/useSession.test.js.map +1 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +12 -6
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/usePersistedModel.d.ts +3 -0
- package/session/usePersistedModel.d.ts.map +1 -1
- package/session/usePersistedModel.js +27 -2
- package/session/usePersistedModel.js.map +1 -1
- package/session/useSession.d.ts.map +1 -1
- package/session/useSession.js +1 -1
- package/session/useSession.js.map +1 -1
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +9 -1
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionExecutions.d.ts.map +1 -1
- package/session/useSessionExecutions.js +1 -1
- package/session/useSessionExecutions.js.map +1 -1
- package/session/useSessionPageFlow.js +1 -1
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionUsage.d.ts +24 -40
- package/session/useSessionUsage.d.ts.map +1 -1
- package/session/useSessionUsage.js +64 -97
- package/session/useSessionUsage.js.map +1 -1
- package/settings/BillingSection.d.ts +3 -0
- package/settings/BillingSection.d.ts.map +1 -0
- package/settings/BillingSection.js +3 -0
- package/settings/BillingSection.js.map +1 -0
- package/settings/index.d.ts +2 -0
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +1 -0
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.js +1 -1
- package/settings/settings-nav.js.map +1 -1
- package/src/billing/AutoRechargeCard.tsx +274 -0
- package/src/billing/BillingSection.tsx +255 -0
- package/src/billing/CreditBalanceCard.tsx +81 -0
- package/src/billing/CreditLedgerTable.tsx +281 -0
- package/src/billing/CreditPackGrid.tsx +132 -0
- package/src/billing/LowBalanceBanner.tsx +67 -0
- package/src/billing/PaymentMethodCard.tsx +133 -0
- package/src/billing/credit-packs.ts +54 -0
- package/src/billing/format.ts +97 -0
- package/src/billing/index.ts +51 -0
- package/src/billing/useBillingAccount.ts +64 -0
- package/src/billing/useBillingUsageReport.ts +73 -0
- package/src/billing/useCreateBillingPortalSession.ts +76 -0
- package/src/billing/useCreateCheckoutSession.ts +101 -0
- package/src/billing/useCreditLedger.ts +79 -0
- package/src/billing/useCustomerModelPricing.ts +67 -0
- package/src/billing/useSetAutoRechargeConfig.ts +90 -0
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +22 -4
- package/src/composer/__tests__/SessionComposer-memo.test.ts +26 -0
- package/src/execution/ApprovalCard.tsx +7 -3
- package/src/execution/ExecutionPhaseBadge.tsx +3 -2
- package/src/execution/MessageEntry.tsx +27 -16
- package/src/execution/MessageThread.tsx +308 -131
- package/src/execution/SetupProgress.tsx +3 -3
- package/src/execution/SubAgentSection.tsx +14 -6
- package/src/execution/ThreadSkeleton.tsx +73 -0
- package/src/execution/ToolCallGroup.tsx +36 -3
- package/src/execution/UsageWidget.tsx +1 -1
- package/src/execution/__tests__/message-entry.test.tsx +236 -0
- package/src/execution/__tests__/thread-keys.test.ts +409 -0
- package/src/execution/__tests__/thread-memoization.test.ts +320 -0
- package/src/execution/__tests__/thread-skeleton.test.tsx +44 -0
- package/src/execution/__tests__/useExecutionStream.test.tsx +109 -12
- package/src/execution/__tests__/useSessionVariables-stability.test.ts +95 -0
- package/src/execution/__tests__/virtualized-thread.test.tsx +401 -0
- package/src/execution/index.ts +3 -0
- package/src/execution/useExecutionStream.ts +123 -48
- package/src/execution/useSessionVariables.ts +17 -12
- package/src/github/useGitHubConnection.ts +18 -13
- package/src/identity-account/index.ts +5 -0
- package/src/identity-account/useIdentityAccountGate.ts +163 -0
- package/src/index.ts +73 -0
- package/src/internal/FetchCacheProvider.tsx +74 -0
- package/src/internal/JumpToLatestButton.tsx +61 -0
- package/src/internal/ThreadItemWrapper.tsx +65 -0
- package/src/internal/VirtualizedThread.tsx +162 -0
- package/src/internal/__tests__/fetch-cache.test.ts +230 -0
- package/src/internal/__tests__/stream-controller.test.ts +395 -0
- package/src/internal/__tests__/thread-animation.test.tsx +121 -0
- package/src/internal/__tests__/useAutoScroll.test.tsx +261 -0
- package/src/internal/__tests__/useFetch-cache.test.ts +214 -0
- package/src/internal/dev/__tests__/use-key-stability.test.ts +124 -0
- package/src/internal/dev/__tests__/use-render-tracer.test.ts +78 -0
- package/src/internal/dev/dom-counter.ts +47 -0
- package/src/internal/dev/index.ts +5 -0
- package/src/internal/dev/profiler-wrapper.tsx +52 -0
- package/src/internal/dev/use-key-stability.ts +86 -0
- package/src/internal/dev/use-render-tracer.ts +70 -0
- package/src/internal/dev/use-stream-rate.ts +138 -0
- package/src/internal/fetch-cache.ts +155 -0
- package/src/internal/store/__tests__/conversation-store.test.ts +257 -0
- package/src/internal/store/__tests__/structural-share.test.ts +454 -0
- package/src/internal/store/conversation-store.ts +128 -0
- package/src/internal/store/index.ts +68 -0
- package/src/internal/store/structural-share.ts +318 -0
- package/src/internal/stream-controller.ts +201 -0
- package/src/internal/useAutoScroll.ts +121 -0
- package/src/internal/useFetch.ts +51 -2
- package/src/session/__tests__/useNewSessionFlow.test.tsx +22 -0
- package/src/session/__tests__/usePersistedModel.test.tsx +117 -0
- package/src/session/__tests__/useSession.test.tsx +187 -0
- package/src/session/useNewSessionFlow.ts +12 -6
- package/src/session/usePersistedModel.ts +28 -2
- package/src/session/useSession.ts +1 -0
- package/src/session/useSessionConversation.ts +11 -2
- package/src/session/useSessionExecutions.ts +1 -0
- package/src/session/useSessionPageFlow.ts +1 -1
- package/src/session/useSessionUsage.ts +102 -123
- package/src/settings/BillingSection.tsx +4 -0
- package/src/settings/index.ts +2 -0
- package/src/settings/settings-nav.ts +1 -1
- package/src/styles.css +31 -0
- package/src/usage/AgentBreakdownList.tsx +147 -0
- package/src/usage/CreditRunwayIndicator.tsx +71 -0
- package/src/usage/ExportButton.tsx +115 -0
- package/src/usage/HarnessSplitCard.tsx +103 -0
- package/src/usage/OrgUsagePanel.tsx +109 -45
- package/src/usage/index.ts +15 -0
- package/src/usage/useExportCSV.ts +115 -0
- package/src/usage/useOrgUsageReport.ts +2 -1
- package/src/workspace/__tests__/useWorkspaceEntries-stability.test.ts +76 -0
- package/src/workspace/useWorkspaceEntries.ts +16 -11
- package/styles.css +1 -1
- package/usage/AgentBreakdownList.d.ts +21 -0
- package/usage/AgentBreakdownList.d.ts.map +1 -0
- package/usage/AgentBreakdownList.js +44 -0
- package/usage/AgentBreakdownList.js.map +1 -0
- package/usage/CreditRunwayIndicator.d.ts +21 -0
- package/usage/CreditRunwayIndicator.d.ts.map +1 -0
- package/usage/CreditRunwayIndicator.js +38 -0
- package/usage/CreditRunwayIndicator.js.map +1 -0
- package/usage/ExportButton.d.ts +20 -0
- package/usage/ExportButton.d.ts.map +1 -0
- package/usage/ExportButton.js +36 -0
- package/usage/ExportButton.js.map +1 -0
- package/usage/HarnessSplitCard.d.ts +17 -0
- package/usage/HarnessSplitCard.d.ts.map +1 -0
- package/usage/HarnessSplitCard.js +38 -0
- package/usage/HarnessSplitCard.js.map +1 -0
- package/usage/OrgUsagePanel.d.ts.map +1 -1
- package/usage/OrgUsagePanel.js +30 -22
- package/usage/OrgUsagePanel.js.map +1 -1
- package/usage/index.d.ts +10 -0
- package/usage/index.d.ts.map +1 -1
- package/usage/index.js +5 -0
- package/usage/index.js.map +1 -1
- package/usage/useExportCSV.d.ts +23 -0
- package/usage/useExportCSV.d.ts.map +1 -0
- package/usage/useExportCSV.js +81 -0
- package/usage/useExportCSV.js.map +1 -0
- package/usage/useOrgUsageReport.d.ts +2 -1
- package/usage/useOrgUsageReport.d.ts.map +1 -1
- package/usage/useOrgUsageReport.js +2 -1
- package/usage/useOrgUsageReport.js.map +1 -1
- package/workspace/__tests__/useWorkspaceEntries-stability.test.d.ts +2 -0
- package/workspace/__tests__/useWorkspaceEntries-stability.test.d.ts.map +1 -0
- package/workspace/__tests__/useWorkspaceEntries-stability.test.js +57 -0
- package/workspace/__tests__/useWorkspaceEntries-stability.test.js.map +1 -0
- package/workspace/useWorkspaceEntries.d.ts.map +1 -1
- package/workspace/useWorkspaceEntries.js +5 -4
- package/workspace/useWorkspaceEntries.js.map +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AutoRechargeConfig } from "@stigmer/protos/ai/stigmer/billing/v1/billing_account_pb";
|
|
2
|
+
import { BillingAccountStatus } from "@stigmer/protos/ai/stigmer/billing/v1/enum_pb";
|
|
3
|
+
/** Props for {@link AutoRechargeCard}. */
|
|
4
|
+
export interface AutoRechargeCardProps {
|
|
5
|
+
/** Organization ID. */
|
|
6
|
+
readonly orgId: string;
|
|
7
|
+
/** Current auto-recharge configuration from the billing account. */
|
|
8
|
+
readonly autoRecharge?: AutoRechargeConfig;
|
|
9
|
+
/** Whether the account has a saved payment method. */
|
|
10
|
+
readonly hasPaymentMethod: boolean;
|
|
11
|
+
/** Account status — config disabled when suspended or closed. */
|
|
12
|
+
readonly accountStatus: BillingAccountStatus;
|
|
13
|
+
/** Called after a successful save so the parent can refresh account data. */
|
|
14
|
+
readonly onSaved?: () => void;
|
|
15
|
+
/** Additional CSS class names. */
|
|
16
|
+
readonly className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Auto-recharge configuration card for the billing settings page.
|
|
20
|
+
*
|
|
21
|
+
* Shows a toggle to enable/disable auto-recharge, with input fields
|
|
22
|
+
* for threshold, recharge amount, and monthly cap. Displays a
|
|
23
|
+
* disabled state with an explanatory message when no payment method
|
|
24
|
+
* is on file. Validates inputs client-side before submitting.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <AutoRechargeCard
|
|
29
|
+
* orgId={orgId}
|
|
30
|
+
* autoRecharge={account.autoRecharge}
|
|
31
|
+
* hasPaymentMethod={!!account.defaultPaymentMethod?.paymentMethodId}
|
|
32
|
+
* accountStatus={account.status}
|
|
33
|
+
* onSaved={refetch}
|
|
34
|
+
* />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function AutoRechargeCard({ orgId, autoRecharge, hasPaymentMethod, accountStatus, onSaved, className, }: AutoRechargeCardProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=AutoRechargeCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoRechargeCard.d.ts","sourceRoot":"","sources":["../../src/billing/AutoRechargeCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAIrF,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,uBAAuB;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAC3C,sDAAsD;IACtD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,iEAAiE;IACjE,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAgBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,SAAS,GACV,EAAE,qBAAqB,2CA+JvB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback, useEffect } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { BillingAccountStatus } from "@stigmer/protos/ai/stigmer/billing/v1/enum_pb";
|
|
6
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
7
|
+
import { useSetAutoRechargeConfig } from "./useSetAutoRechargeConfig";
|
|
8
|
+
const MICROS_PER_DOLLAR = BigInt(1_000_000);
|
|
9
|
+
function microsToDollars(micros) {
|
|
10
|
+
if (micros === BigInt(0))
|
|
11
|
+
return "";
|
|
12
|
+
const dollars = Number(micros) / 1_000_000;
|
|
13
|
+
return dollars.toString();
|
|
14
|
+
}
|
|
15
|
+
function dollarsToMicros(value) {
|
|
16
|
+
const num = parseFloat(value);
|
|
17
|
+
if (isNaN(num) || num < 0)
|
|
18
|
+
return BigInt(0);
|
|
19
|
+
return BigInt(Math.round(num * 1_000_000));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Auto-recharge configuration card for the billing settings page.
|
|
23
|
+
*
|
|
24
|
+
* Shows a toggle to enable/disable auto-recharge, with input fields
|
|
25
|
+
* for threshold, recharge amount, and monthly cap. Displays a
|
|
26
|
+
* disabled state with an explanatory message when no payment method
|
|
27
|
+
* is on file. Validates inputs client-side before submitting.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <AutoRechargeCard
|
|
32
|
+
* orgId={orgId}
|
|
33
|
+
* autoRecharge={account.autoRecharge}
|
|
34
|
+
* hasPaymentMethod={!!account.defaultPaymentMethod?.paymentMethodId}
|
|
35
|
+
* accountStatus={account.status}
|
|
36
|
+
* onSaved={refetch}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function AutoRechargeCard({ orgId, autoRecharge, hasPaymentMethod, accountStatus, onSaved, className, }) {
|
|
41
|
+
const { setConfig, isSubmitting, error, clearError } = useSetAutoRechargeConfig();
|
|
42
|
+
const [enabled, setEnabled] = useState(autoRecharge?.enabled ?? false);
|
|
43
|
+
const [threshold, setThreshold] = useState(microsToDollars(autoRecharge?.thresholdMicros ?? BigInt(0)));
|
|
44
|
+
const [amount, setAmount] = useState(microsToDollars(autoRecharge?.rechargeAmountMicros ?? BigInt(0)));
|
|
45
|
+
const [cap, setCap] = useState(microsToDollars(autoRecharge?.monthlyCapMicros ?? BigInt(0)));
|
|
46
|
+
const [saved, setSaved] = useState(false);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!autoRecharge)
|
|
49
|
+
return;
|
|
50
|
+
setEnabled(autoRecharge.enabled);
|
|
51
|
+
setThreshold(microsToDollars(autoRecharge.thresholdMicros));
|
|
52
|
+
setAmount(microsToDollars(autoRecharge.rechargeAmountMicros));
|
|
53
|
+
setCap(microsToDollars(autoRecharge.monthlyCapMicros));
|
|
54
|
+
}, [autoRecharge]);
|
|
55
|
+
const isAccountActive = accountStatus === BillingAccountStatus.billing_account_active;
|
|
56
|
+
const canConfigure = hasPaymentMethod && isAccountActive;
|
|
57
|
+
const hasChanges = enabled !== (autoRecharge?.enabled ?? false) ||
|
|
58
|
+
dollarsToMicros(threshold) !==
|
|
59
|
+
(autoRecharge?.thresholdMicros ?? BigInt(0)) ||
|
|
60
|
+
dollarsToMicros(amount) !==
|
|
61
|
+
(autoRecharge?.rechargeAmountMicros ?? BigInt(0)) ||
|
|
62
|
+
dollarsToMicros(cap) !== (autoRecharge?.monthlyCapMicros ?? BigInt(0));
|
|
63
|
+
const handleSave = useCallback(async () => {
|
|
64
|
+
clearError();
|
|
65
|
+
setSaved(false);
|
|
66
|
+
try {
|
|
67
|
+
await setConfig({
|
|
68
|
+
orgId,
|
|
69
|
+
enabled,
|
|
70
|
+
thresholdMicros: dollarsToMicros(threshold),
|
|
71
|
+
rechargeAmountMicros: dollarsToMicros(amount),
|
|
72
|
+
monthlyCapMicros: dollarsToMicros(cap),
|
|
73
|
+
});
|
|
74
|
+
setSaved(true);
|
|
75
|
+
onSaved?.();
|
|
76
|
+
setTimeout(() => setSaved(false), 3000);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// error state is managed by the hook
|
|
80
|
+
}
|
|
81
|
+
}, [orgId, enabled, threshold, amount, cap, setConfig, clearError, onSaved]);
|
|
82
|
+
return (_jsxs("div", { className: cn("rounded-lg border border-border bg-card px-4 py-4", className), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xs font-semibold text-foreground", children: "Auto-Recharge" }), _jsx("p", { className: "mt-0.5 text-[0.7rem] text-muted-foreground", children: "Automatically add credits when your balance runs low." })] }), _jsx("button", { type: "button", role: "switch", "aria-checked": enabled, disabled: !canConfigure || isSubmitting, onClick: () => setEnabled((prev) => !prev), className: cn("relative inline-flex h-5 w-9 shrink-0 rounded-full transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", enabled ? "bg-primary" : "bg-muted"), children: _jsx("span", { className: cn("pointer-events-none block size-4 rounded-full bg-background shadow-sm ring-0 transition-transform", enabled ? "translate-x-4" : "translate-x-0.5", "mt-0.5") }) })] }), !hasPaymentMethod && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "A saved payment method is required to enable auto-recharge. Purchase a credit pack first to save a card." })), canConfigure && (_jsxs("div", { className: "mt-4 space-y-3", children: [_jsx(DollarInput, { id: "ar-threshold", label: "When balance drops below", value: threshold, onChange: setThreshold, disabled: isSubmitting, placeholder: "e.g. 5" }), _jsx(DollarInput, { id: "ar-amount", label: "Recharge amount", value: amount, onChange: setAmount, disabled: isSubmitting, placeholder: "e.g. 50" }), _jsx(DollarInput, { id: "ar-cap", label: "Monthly cap", value: cap, onChange: setCap, disabled: isSubmitting, placeholder: "e.g. 200" }), _jsxs("div", { className: "flex items-center gap-3 pt-1", children: [_jsx("button", { type: "button", disabled: !hasChanges || isSubmitting, onClick: handleSave, className: cn("rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-50"), "aria-busy": isSubmitting, children: isSubmitting ? "Saving\u2026" : "Save" }), saved && (_jsx("span", { className: "text-xs text-emerald-600 dark:text-emerald-400", children: "Saved" }))] }), error && (_jsx("p", { className: "text-xs text-destructive", role: "alert", children: getUserMessage(error) }))] }))] }));
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// DollarInput (internal)
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
function DollarInput({ id, label, value, onChange, disabled, placeholder, }) {
|
|
88
|
+
return (_jsxs("div", { children: [_jsx("label", { htmlFor: id, className: "block text-xs text-muted-foreground", children: label }), _jsxs("div", { className: "relative mt-1", children: [_jsx("span", { className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-xs text-muted-foreground", children: "$" }), _jsx("input", { id: id, type: "number", min: "0", step: "any", value: value, onChange: (e) => onChange(e.target.value), disabled: disabled, placeholder: placeholder, className: cn("w-full rounded-md border border-input bg-background py-1.5 pl-6 pr-3 text-xs tabular-nums", "text-foreground placeholder:text-muted-foreground/60", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50") })] })] }));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=AutoRechargeCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoRechargeCard.js","sourceRoot":"","sources":["../../src/billing/AutoRechargeCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Props for {@link BillingSection}. */
|
|
2
|
+
export interface BillingSectionProps {
|
|
3
|
+
/**
|
|
4
|
+
* Whether a checkout just completed (e.g., `?checkout=success`).
|
|
5
|
+
*
|
|
6
|
+
* When `true`, an optimistic banner is shown indicating that
|
|
7
|
+
* credits will appear shortly. This prop is typically driven
|
|
8
|
+
* by the host application's URL query parameters.
|
|
9
|
+
*/
|
|
10
|
+
readonly checkoutSuccess?: boolean;
|
|
11
|
+
/** Callback to dismiss the checkout success banner. */
|
|
12
|
+
readonly onDismissCheckoutSuccess?: () => void;
|
|
13
|
+
/** Additional CSS class names. */
|
|
14
|
+
readonly className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Top-level billing settings section.
|
|
18
|
+
*
|
|
19
|
+
* Composes the billing sub-components into a cohesive settings page:
|
|
20
|
+
* low-balance warning, checkout success banner, credit balance display,
|
|
21
|
+
* credit pack purchase grid, and transaction history. Handles the
|
|
22
|
+
* deployment mode gate (billing unavailable in local mode) and the
|
|
23
|
+
* org-not-selected state.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // In a settings page:
|
|
28
|
+
* <BillingSection checkoutSuccess={searchParams.checkout === "success"} />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function BillingSection({ checkoutSuccess, onDismissCheckoutSuccess, className, }: BillingSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=BillingSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BillingSection.d.ts","sourceRoot":"","sources":["../../src/billing/BillingSection.tsx"],"names":[],"mappings":"AAmBA,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,EAC7B,eAAe,EACf,wBAAwB,EACxB,SAAS,GACV,EAAE,mBAAmB,2CAmCrB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from "react";
|
|
4
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
5
|
+
import { useDeploymentMode } from "../deployment-mode";
|
|
6
|
+
import { CloudFeatureNotice } from "../internal/CloudFeatureNotice";
|
|
7
|
+
import { useOrg } from "../organization/OrgProvider";
|
|
8
|
+
import { useBillingAccount } from "./useBillingAccount";
|
|
9
|
+
import { useCreateCheckoutSession } from "./useCreateCheckoutSession";
|
|
10
|
+
import { useCreateBillingPortalSession } from "./useCreateBillingPortalSession";
|
|
11
|
+
import { CreditBalanceCard } from "./CreditBalanceCard";
|
|
12
|
+
import { PaymentMethodCard } from "./PaymentMethodCard";
|
|
13
|
+
import { AutoRechargeCard } from "./AutoRechargeCard";
|
|
14
|
+
import { CreditPackGrid } from "./CreditPackGrid";
|
|
15
|
+
import { CreditLedgerTable } from "./CreditLedgerTable";
|
|
16
|
+
import { LowBalanceBanner } from "./LowBalanceBanner";
|
|
17
|
+
/**
|
|
18
|
+
* Top-level billing settings section.
|
|
19
|
+
*
|
|
20
|
+
* Composes the billing sub-components into a cohesive settings page:
|
|
21
|
+
* low-balance warning, checkout success banner, credit balance display,
|
|
22
|
+
* credit pack purchase grid, and transaction history. Handles the
|
|
23
|
+
* deployment mode gate (billing unavailable in local mode) and the
|
|
24
|
+
* org-not-selected state.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* // In a settings page:
|
|
29
|
+
* <BillingSection checkoutSuccess={searchParams.checkout === "success"} />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function BillingSection({ checkoutSuccess, onDismissCheckoutSuccess, className, }) {
|
|
33
|
+
const { activeOrg } = useOrg();
|
|
34
|
+
const mode = useDeploymentMode();
|
|
35
|
+
const orgId = activeOrg?.metadata?.id ?? "";
|
|
36
|
+
return (_jsxs("section", { "aria-labelledby": "billing-heading", className: className, children: [_jsx("h2", { id: "billing-heading", className: "text-foreground mb-1 text-sm font-semibold", children: "Billing" }), _jsx("p", { className: "text-muted-foreground mb-4 text-xs", children: "Manage credits, purchase credit packs, and view transaction history." }), mode === "local" ? (_jsx(CloudFeatureNotice, { children: "Billing is available on Stigmer Cloud. Connect to a Cloud organization to manage credits and purchase credit packs." })) : !orgId ? (_jsx("p", { className: "text-muted-foreground py-4 text-center text-xs", children: "Select an organization to view billing." })) : (_jsx(BillingContent, { orgId: orgId, checkoutSuccess: checkoutSuccess, onDismissCheckoutSuccess: onDismissCheckoutSuccess }))] }));
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// BillingContent (internal)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function BillingContent({ orgId, checkoutSuccess, onDismissCheckoutSuccess, }) {
|
|
42
|
+
const { account, isLoading, error, refetch } = useBillingAccount(orgId);
|
|
43
|
+
const { createSession, isSubmitting, error: checkoutError, clearError } = useCreateCheckoutSession();
|
|
44
|
+
const { openPortal, isLoading: isPortalLoading } = useCreateBillingPortalSession();
|
|
45
|
+
const [purchasingPackId, setPurchasingPackId] = useState(null);
|
|
46
|
+
const handlePurchase = useCallback((packId) => {
|
|
47
|
+
setPurchasingPackId(packId);
|
|
48
|
+
clearError();
|
|
49
|
+
const baseUrl = typeof window !== "undefined" ? window.location.origin : "";
|
|
50
|
+
const billingPath = `${baseUrl}/settings/billing`;
|
|
51
|
+
createSession({
|
|
52
|
+
orgId,
|
|
53
|
+
packId,
|
|
54
|
+
successUrl: `${billingPath}?checkout=success`,
|
|
55
|
+
cancelUrl: billingPath,
|
|
56
|
+
}).catch(() => {
|
|
57
|
+
setPurchasingPackId(null);
|
|
58
|
+
});
|
|
59
|
+
}, [orgId, createSession, clearError]);
|
|
60
|
+
if (isLoading) {
|
|
61
|
+
return (_jsxs("div", { className: "space-y-4", "aria-busy": "true", "aria-label": "Loading billing", children: [_jsx("div", { className: "h-24 animate-pulse rounded-lg bg-muted-subtle" }), _jsx("div", { className: "grid grid-cols-3 gap-3", children: Array.from({ length: 3 }, (_, i) => (_jsx("div", { className: "h-36 animate-pulse rounded-lg bg-muted-subtle" }, i))) }), _jsx("div", { className: "h-48 animate-pulse rounded-lg bg-muted-subtle" })] }));
|
|
62
|
+
}
|
|
63
|
+
if (error) {
|
|
64
|
+
return (_jsx("p", { className: "text-destructive text-xs", role: "alert", children: getUserMessage(error) }));
|
|
65
|
+
}
|
|
66
|
+
if (!account)
|
|
67
|
+
return null;
|
|
68
|
+
const balance = account.balance;
|
|
69
|
+
if (!balance)
|
|
70
|
+
return null;
|
|
71
|
+
const isLowBalance = balance.availableMicros < account.lowBalanceThresholdMicros;
|
|
72
|
+
return (_jsxs("div", { className: "space-y-6", children: [checkoutSuccess && (_jsx(CheckoutSuccessBanner, { onDismiss: onDismissCheckoutSuccess })), _jsx(LowBalanceBanner, { availableMicros: balance.availableMicros, thresholdMicros: account.lowBalanceThresholdMicros }), _jsx(CreditBalanceCard, { balance: balance, isLowBalance: isLowBalance }), _jsx(PaymentMethodCard, { paymentMethod: account.defaultPaymentMethod, accountStatus: account.status, isPortalLoading: isPortalLoading, onManage: () => openPortal(orgId) }), _jsx(AutoRechargeCard, { orgId: orgId, autoRecharge: account.autoRecharge, hasPaymentMethod: account.defaultPaymentMethod != null &&
|
|
73
|
+
account.defaultPaymentMethod.paymentMethodId !== "", accountStatus: account.status, onSaved: refetch }), _jsx(CreditPackGrid, { accountStatus: account.status, purchasingPackId: isSubmitting ? purchasingPackId : null, onPurchase: handlePurchase }), checkoutError && (_jsx("p", { className: "text-destructive text-xs", role: "alert", children: getUserMessage(checkoutError) })), _jsx(CreditLedgerTable, { orgId: orgId })] }));
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// CheckoutSuccessBanner (internal)
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function CheckoutSuccessBanner({ onDismiss, }) {
|
|
79
|
+
return (_jsxs("div", { role: "status", className: "flex items-center justify-between gap-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3.5 py-3 text-xs text-emerald-700 dark:text-emerald-300", children: [_jsxs("p", { children: [_jsx("span", { className: "font-medium", children: "Payment received" }), " \u2014 ", "credits will appear in your balance shortly."] }), onDismiss && (_jsx("button", { type: "button", onClick: onDismiss, className: "shrink-0 rounded p-0.5 transition-colors hover:bg-emerald-500/10", "aria-label": "Dismiss", children: _jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M18 6 6 18" }), _jsx("path", { d: "m6 6 12 12" })] }) }))] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=BillingSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BillingSection.js","sourceRoot":"","sources":["../../src/billing/BillingSection.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CreditBalance } from "@stigmer/protos/ai/stigmer/billing/v1/billing_account_pb";
|
|
2
|
+
/** Props for {@link CreditBalanceCard}. */
|
|
3
|
+
export interface CreditBalanceCardProps {
|
|
4
|
+
/** The credit balance breakdown from the billing account. */
|
|
5
|
+
readonly balance: CreditBalance;
|
|
6
|
+
/** Whether the balance is below the low-balance threshold. */
|
|
7
|
+
readonly isLowBalance?: boolean;
|
|
8
|
+
/** Additional CSS class names. */
|
|
9
|
+
readonly className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Prominent display of the organization's available credit balance.
|
|
13
|
+
*
|
|
14
|
+
* Shows the total available balance as the primary figure, with
|
|
15
|
+
* a secondary breakdown of promotional vs. purchased credits and
|
|
16
|
+
* any reserved amount. Uses semantic colors to indicate balance
|
|
17
|
+
* health: green for healthy, amber for low, red for zero/negative.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <CreditBalanceCard balance={account.balance} isLowBalance={isLow} />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function CreditBalanceCard({ balance, isLowBalance, className, }: CreditBalanceCardProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=CreditBalanceCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditBalanceCard.d.ts","sourceRoot":"","sources":["../../src/billing/CreditBalanceCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAC;AAG9F,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,YAAY,EACZ,SAAS,GACV,EAAE,sBAAsB,2CA+CxB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
import { formatCreditBalance } from "./format";
|
|
5
|
+
/**
|
|
6
|
+
* Prominent display of the organization's available credit balance.
|
|
7
|
+
*
|
|
8
|
+
* Shows the total available balance as the primary figure, with
|
|
9
|
+
* a secondary breakdown of promotional vs. purchased credits and
|
|
10
|
+
* any reserved amount. Uses semantic colors to indicate balance
|
|
11
|
+
* health: green for healthy, amber for low, red for zero/negative.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <CreditBalanceCard balance={account.balance} isLowBalance={isLow} />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function CreditBalanceCard({ balance, isLowBalance, className, }) {
|
|
19
|
+
const available = balance.availableMicros;
|
|
20
|
+
const zero = BigInt(0);
|
|
21
|
+
const isZeroOrNegative = available <= zero;
|
|
22
|
+
return (_jsxs("div", { className: cn("rounded-lg border border-border bg-card px-4 py-4", className), children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground", children: "Available Credits" }), _jsx("div", { className: cn("mt-1 text-2xl font-bold tabular-nums", isZeroOrNegative
|
|
23
|
+
? "text-destructive"
|
|
24
|
+
: isLowBalance
|
|
25
|
+
? "text-warning-foreground"
|
|
26
|
+
: "text-foreground"), children: formatCreditBalance(available) }), _jsxs("div", { className: "mt-3 flex flex-wrap gap-x-4 gap-y-1 text-xs tabular-nums text-muted-foreground", children: [balance.purchasedMicros > zero && (_jsxs("span", { children: ["Purchased: ", formatCreditBalance(balance.purchasedMicros)] })), balance.promotionalMicros > zero && (_jsxs("span", { children: ["Promotional: ", formatCreditBalance(balance.promotionalMicros)] })), balance.reservedMicros > zero && (_jsxs("span", { children: ["Reserved: ", formatCreditBalance(balance.reservedMicros)] }))] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=CreditBalanceCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditBalanceCard.js","sourceRoot":"","sources":["../../src/billing/CreditBalanceCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAY/C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,OAAO,EACP,YAAY,EACZ,SAAS,GACc;IACvB,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,gBAAgB,GAAG,SAAS,IAAI,IAAI,CAAC;IAE3C,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,mDAAmD,EACnD,SAAS,CACV,aAED,cAAK,SAAS,EAAC,2CAA2C,kCAEpD,EACN,cACE,SAAS,EAAE,EAAE,CACX,sCAAsC,EACtC,gBAAgB;oBACd,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,YAAY;wBACZ,CAAC,CAAC,yBAAyB;wBAC3B,CAAC,CAAC,iBAAiB,CACxB,YAEA,mBAAmB,CAAC,SAAS,CAAC,GAC3B,EAEN,eAAK,SAAS,EAAC,gFAAgF,aAC5F,OAAO,CAAC,eAAe,GAAG,IAAI,IAAI,CACjC,0CACc,mBAAmB,CAAC,OAAO,CAAC,eAAe,CAAC,IACnD,CACR,EACA,OAAO,CAAC,iBAAiB,GAAG,IAAI,IAAI,CACnC,4CACgB,mBAAmB,CAAC,OAAO,CAAC,iBAAiB,CAAC,IACvD,CACR,EACA,OAAO,CAAC,cAAc,GAAG,IAAI,IAAI,CAChC,yCACa,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,IACjD,CACR,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Props for {@link CreditLedgerTable}. */
|
|
2
|
+
export interface CreditLedgerTableProps {
|
|
3
|
+
/** Organization ID to fetch ledger entries for. */
|
|
4
|
+
readonly orgId: string;
|
|
5
|
+
/** Additional CSS class names. */
|
|
6
|
+
readonly className?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Paginated transaction history table showing credit ledger entries.
|
|
10
|
+
*
|
|
11
|
+
* Displays entries with type badges, signed amounts, and running
|
|
12
|
+
* balance. Supports pagination with simple prev/next controls.
|
|
13
|
+
* Uses semantic colors: green for credits, red for debits, gray
|
|
14
|
+
* for holds and releases.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <CreditLedgerTable orgId={activeOrg.metadata.id} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function CreditLedgerTable({ orgId, className, }: CreditLedgerTableProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=CreditLedgerTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditLedgerTable.d.ts","sourceRoot":"","sources":["../../src/billing/CreditLedgerTable.tsx"],"names":[],"mappings":"AAgBA,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,GACV,EAAE,sBAAsB,2CA8DxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { formatLedgerAmount, formatCreditBalance, formatLedgerDate, ledgerEntryLabel, isCredit, isHold, } from "./format";
|
|
7
|
+
import { useCreditLedger } from "./useCreditLedger";
|
|
8
|
+
/**
|
|
9
|
+
* Paginated transaction history table showing credit ledger entries.
|
|
10
|
+
*
|
|
11
|
+
* Displays entries with type badges, signed amounts, and running
|
|
12
|
+
* balance. Supports pagination with simple prev/next controls.
|
|
13
|
+
* Uses semantic colors: green for credits, red for debits, gray
|
|
14
|
+
* for holds and releases.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <CreditLedgerTable orgId={activeOrg.metadata.id} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function CreditLedgerTable({ orgId, className, }) {
|
|
22
|
+
const [pageNum, setPageNum] = useState(1);
|
|
23
|
+
const options = { pageNum, pageSize: 10 };
|
|
24
|
+
const { ledger, isLoading, error } = useCreditLedger(orgId, options);
|
|
25
|
+
if (isLoading) {
|
|
26
|
+
return (_jsxs("div", { className: cn("space-y-2", className), "aria-busy": "true", children: [_jsx("div", { className: "h-4 w-32 animate-pulse rounded bg-muted-subtle" }), Array.from({ length: 5 }, (_, i) => (_jsx("div", { className: "h-10 animate-pulse rounded-lg bg-muted-subtle" }, i)))] }));
|
|
27
|
+
}
|
|
28
|
+
if (error) {
|
|
29
|
+
return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(error) }));
|
|
30
|
+
}
|
|
31
|
+
const entries = ledger?.entries ?? [];
|
|
32
|
+
const totalPages = ledger?.totalPages ?? 0;
|
|
33
|
+
return (_jsxs("div", { className: className, children: [_jsx("h3", { className: "mb-2 text-xs font-semibold text-foreground", children: "Transaction History" }), entries.length === 0 ? (_jsx(EmptyLedger, {})) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "rounded-lg border border-border bg-card", role: "table", "aria-label": "Credit ledger", children: [_jsx(LedgerHeader, {}), entries.map((entry) => (_jsx(LedgerRow, { entry: entry }, entry.entryId)))] }), totalPages > 1 && (_jsx(Pagination, { pageNum: pageNum, totalPages: totalPages, onPageChange: setPageNum }))] }))] }));
|
|
34
|
+
}
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// LedgerHeader (internal)
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
function LedgerHeader() {
|
|
39
|
+
return (_jsxs("div", { role: "row", className: "grid grid-cols-[1fr_auto_auto] gap-x-4 border-b border-border px-3.5 py-2 text-[0.65rem] font-medium uppercase tracking-wider text-muted-foreground sm:grid-cols-[auto_1fr_auto_auto]", children: [_jsx("span", { role: "columnheader", className: "hidden sm:block", children: "Date" }), _jsx("span", { role: "columnheader", children: "Type" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Amount" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Balance" })] }));
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// LedgerRow (internal)
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
function LedgerRow({ entry }) {
|
|
45
|
+
const entryType = entry.type;
|
|
46
|
+
const credit = isCredit(entryType);
|
|
47
|
+
const hold = isHold(entryType);
|
|
48
|
+
return (_jsxs("div", { role: "row", className: "grid grid-cols-[1fr_auto_auto] items-center gap-x-4 border-b border-border-muted px-3.5 py-2.5 last:border-b-0 sm:grid-cols-[auto_1fr_auto_auto]", children: [_jsx("span", { role: "cell", className: "hidden text-xs tabular-nums text-muted-foreground sm:block sm:w-36", children: entry.createdAt
|
|
49
|
+
? formatLedgerDate(entry.createdAt.seconds)
|
|
50
|
+
: "\u2014" }), _jsxs("div", { role: "cell", className: "min-w-0", children: [_jsx("span", { className: cn("inline-block rounded-full px-2 py-0.5 text-[0.65rem] font-medium", credit
|
|
51
|
+
? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
|
|
52
|
+
: hold
|
|
53
|
+
? "bg-muted text-muted-foreground"
|
|
54
|
+
: "bg-destructive/10 text-destructive"), children: ledgerEntryLabel(entryType) }), entry.source?.description && (_jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: entry.source.description })), entry.createdAt && (_jsx("span", { className: "mt-0.5 block text-[0.6rem] tabular-nums text-muted-foreground sm:hidden", children: formatLedgerDate(entry.createdAt.seconds) }))] }), _jsx("span", { role: "cell", className: cn("text-right text-xs font-medium tabular-nums", credit
|
|
55
|
+
? "text-emerald-600 dark:text-emerald-400"
|
|
56
|
+
: hold
|
|
57
|
+
? "text-muted-foreground"
|
|
58
|
+
: "text-destructive"), children: formatLedgerAmount(entry.amountMicros) }), _jsx("span", { role: "cell", className: "text-right text-xs tabular-nums text-muted-foreground", children: formatCreditBalance(entry.balanceAfterMicros) })] }));
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Pagination (internal)
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
function Pagination({ pageNum, totalPages, onPageChange, }) {
|
|
64
|
+
return (_jsxs("div", { className: "mt-3 flex items-center justify-between", role: "navigation", "aria-label": "Ledger pagination", children: [_jsx("button", { type: "button", disabled: pageNum <= 1, onClick: () => onPageChange(pageNum - 1), className: "rounded-md px-2.5 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-40", children: "Previous" }), _jsxs("span", { className: "text-xs tabular-nums text-muted-foreground", children: ["Page ", pageNum, " of ", totalPages] }), _jsx("button", { type: "button", disabled: pageNum >= totalPages, onClick: () => onPageChange(pageNum + 1), className: "rounded-md px-2.5 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-40", children: "Next" })] }));
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// EmptyLedger (internal)
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
function EmptyLedger() {
|
|
70
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-lg border border-border bg-card py-10 text-center", children: [_jsx(ReceiptIcon, { className: "text-muted-foreground mb-3 size-8" }), _jsx("p", { className: "text-sm font-medium text-foreground", children: "No transactions yet" }), _jsx("p", { className: "mt-1 max-w-xs text-xs text-muted-foreground", children: "Credit purchases and usage charges will appear here as your organization runs agent executions." })] }));
|
|
71
|
+
}
|
|
72
|
+
function ReceiptIcon({ className }) {
|
|
73
|
+
return (_jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: className, "aria-hidden": "true", children: [_jsx("path", { d: "M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z" }), _jsx("path", { d: "M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8" }), _jsx("path", { d: "M12 17.5v.5M12 6v.5" })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=CreditLedgerTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditLedgerTable.js","sourceRoot":"","sources":["../../src/billing/CreditLedgerTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BillingAccountStatus } from "@stigmer/protos/ai/stigmer/billing/v1/enum_pb";
|
|
2
|
+
/** Props for {@link CreditPackGrid}. */
|
|
3
|
+
export interface CreditPackGridProps {
|
|
4
|
+
/** Account status — purchases disabled when suspended or closed. */
|
|
5
|
+
readonly accountStatus: BillingAccountStatus;
|
|
6
|
+
/** ID of the pack currently being purchased (shows loading state). */
|
|
7
|
+
readonly purchasingPackId?: string | null;
|
|
8
|
+
/** Called when the user clicks a pack's buy button. */
|
|
9
|
+
readonly onPurchase: (packId: string) => void;
|
|
10
|
+
/** Additional CSS class names. */
|
|
11
|
+
readonly className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Grid of credit pack cards with purchase buttons.
|
|
15
|
+
*
|
|
16
|
+
* Displays the 3 self-serve credit packs (Starter, Growth, Team)
|
|
17
|
+
* in a responsive grid. Each card shows the pack name, price,
|
|
18
|
+
* credit count, and a buy button. Buttons are disabled when the
|
|
19
|
+
* account is suspended/closed or a purchase is in progress.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <CreditPackGrid
|
|
24
|
+
* accountStatus={account.status}
|
|
25
|
+
* purchasingPackId={isSubmitting ? activePackId : null}
|
|
26
|
+
* onPurchase={(packId) => createSession({ orgId, packId, ... })}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function CreditPackGrid({ accountStatus, purchasingPackId, onPurchase, className, }: CreditPackGridProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=CreditPackGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditPackGrid.d.ts","sourceRoot":"","sources":["../../src/billing/CreditPackGrid.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAQrF,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,sEAAsE;IACtE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,SAAS,GACV,EAAE,mBAAmB,2CAmCrB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
import { BillingAccountStatus } from "@stigmer/protos/ai/stigmer/billing/v1/enum_pb";
|
|
5
|
+
import { CREDIT_PACKS, formatPackPrice, formatCreditCount, } from "./credit-packs";
|
|
6
|
+
/**
|
|
7
|
+
* Grid of credit pack cards with purchase buttons.
|
|
8
|
+
*
|
|
9
|
+
* Displays the 3 self-serve credit packs (Starter, Growth, Team)
|
|
10
|
+
* in a responsive grid. Each card shows the pack name, price,
|
|
11
|
+
* credit count, and a buy button. Buttons are disabled when the
|
|
12
|
+
* account is suspended/closed or a purchase is in progress.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <CreditPackGrid
|
|
17
|
+
* accountStatus={account.status}
|
|
18
|
+
* purchasingPackId={isSubmitting ? activePackId : null}
|
|
19
|
+
* onPurchase={(packId) => createSession({ orgId, packId, ... })}
|
|
20
|
+
* />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function CreditPackGrid({ accountStatus, purchasingPackId, onPurchase, className, }) {
|
|
24
|
+
const isAccountActive = accountStatus === BillingAccountStatus.billing_account_active;
|
|
25
|
+
return (_jsxs("div", { children: [_jsx("h3", { className: "mb-2 text-xs font-semibold text-foreground", children: "Purchase Credits" }), _jsx("div", { className: cn("grid gap-3 sm:grid-cols-3", className), role: "group", "aria-label": "Credit packs", children: CREDIT_PACKS.map((pack) => (_jsx(PackCard, { pack: pack, isPurchasing: purchasingPackId === pack.packId, isDisabled: !isAccountActive || purchasingPackId != null, onPurchase: onPurchase }, pack.packId))) }), !isAccountActive && (_jsxs("p", { className: "mt-2 text-xs text-muted-foreground", children: ["Credit purchases are unavailable while your billing account is", " ", accountStatus === BillingAccountStatus.billing_account_suspended
|
|
26
|
+
? "suspended"
|
|
27
|
+
: "closed", "."] }))] }));
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// PackCard (internal)
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
function PackCard({ pack, isPurchasing, isDisabled, onPurchase, }) {
|
|
33
|
+
return (_jsxs("div", { className: "flex flex-col rounded-lg border border-border bg-card px-4 py-4", children: [_jsx("div", { className: "text-sm font-semibold text-foreground", children: pack.displayName }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: pack.description }), _jsx("div", { className: "mt-3 flex items-baseline gap-1", children: _jsx("span", { className: "text-xl font-bold tabular-nums text-foreground", children: formatPackPrice(pack.priceCents) }) }), _jsxs("div", { className: "mt-0.5 text-xs tabular-nums text-muted-foreground", children: [formatCreditCount(pack.credits), " credits"] }), _jsx("button", { type: "button", disabled: isDisabled, onClick: () => onPurchase(pack.packId), className: cn("mt-4 w-full rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-primary text-primary-foreground", "hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-50"), "aria-busy": isPurchasing, children: isPurchasing ? "Redirecting\u2026" : "Buy" })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=CreditPackGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreditPackGrid.js","sourceRoot":"","sources":["../../src/billing/CreditPackGrid.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AAcxB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,SAAS,GACW;IACpB,MAAM,eAAe,GACnB,aAAa,KAAK,oBAAoB,CAAC,sBAAsB,CAAC;IAEhE,OAAO,CACL,0BACE,aAAI,SAAS,EAAC,4CAA4C,iCAErD,EACL,cACE,SAAS,EAAE,EAAE,CAAC,2BAA2B,EAAE,SAAS,CAAC,EACrD,IAAI,EAAC,OAAO,gBACD,cAAc,YAExB,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,KAAC,QAAQ,IAEP,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC,MAAM,EAC9C,UAAU,EAAE,CAAC,eAAe,IAAI,gBAAgB,IAAI,IAAI,EACxD,UAAU,EAAE,UAAU,IAJjB,IAAI,CAAC,MAAM,CAKhB,CACH,CAAC,GACE,EACL,CAAC,eAAe,IAAI,CACnB,aAAG,SAAS,EAAC,oCAAoC,+EACgB,GAAG,EACjE,aAAa,KAAK,oBAAoB,CAAC,yBAAyB;wBAC/D,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,QAAQ,SAEV,CACL,IACG,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,UAAU,GAMX;IACC,OAAO,CACL,eAAK,SAAS,EAAC,iEAAiE,aAC9E,cAAK,SAAS,EAAC,uCAAuC,YACnD,IAAI,CAAC,WAAW,GACb,EACN,cAAK,SAAS,EAAC,sCAAsC,YAClD,IAAI,CAAC,WAAW,GACb,EAEN,cAAK,SAAS,EAAC,gCAAgC,YAC7C,eAAM,SAAS,EAAC,gDAAgD,YAC7D,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,GAC5B,GACH,EACN,eAAK,SAAS,EAAC,mDAAmD,aAC/D,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAC5B,EAEN,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EACtC,SAAS,EAAE,EAAE,CACX,0EAA0E,EAC1E,oCAAoC,EACpC,qBAAqB,EACrB,kDAAkD,CACnD,eACU,YAAY,YAEtB,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,GACpC,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Props for {@link LowBalanceBanner}. */
|
|
2
|
+
export interface LowBalanceBannerProps {
|
|
3
|
+
/** Available balance in micro-USD. */
|
|
4
|
+
readonly availableMicros: bigint;
|
|
5
|
+
/** Threshold in micro-USD below which the warning is shown. */
|
|
6
|
+
readonly thresholdMicros: bigint;
|
|
7
|
+
/** Additional CSS class names. */
|
|
8
|
+
readonly className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Conditional banner that warns when the available credit balance
|
|
12
|
+
* is below the configured threshold.
|
|
13
|
+
*
|
|
14
|
+
* Renders nothing when the balance is healthy. Not dismissible —
|
|
15
|
+
* it reflects a real account state that the user should address.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <LowBalanceBanner
|
|
20
|
+
* availableMicros={account.balance.availableMicros}
|
|
21
|
+
* thresholdMicros={account.lowBalanceThresholdMicros}
|
|
22
|
+
* />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function LowBalanceBanner({ availableMicros, thresholdMicros, className, }: LowBalanceBannerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
|
+
//# sourceMappingURL=LowBalanceBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LowBalanceBanner.d.ts","sourceRoot":"","sources":["../../src/billing/LowBalanceBanner.tsx"],"names":[],"mappings":"AAMA,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,eAAe,EACf,SAAS,GACV,EAAE,qBAAqB,kDA+BvB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
import { AlertTriangle } from "lucide-react";
|
|
5
|
+
import { formatCreditBalance } from "./format";
|
|
6
|
+
/**
|
|
7
|
+
* Conditional banner that warns when the available credit balance
|
|
8
|
+
* is below the configured threshold.
|
|
9
|
+
*
|
|
10
|
+
* Renders nothing when the balance is healthy. Not dismissible —
|
|
11
|
+
* it reflects a real account state that the user should address.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <LowBalanceBanner
|
|
16
|
+
* availableMicros={account.balance.availableMicros}
|
|
17
|
+
* thresholdMicros={account.lowBalanceThresholdMicros}
|
|
18
|
+
* />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function LowBalanceBanner({ availableMicros, thresholdMicros, className, }) {
|
|
22
|
+
if (availableMicros >= thresholdMicros)
|
|
23
|
+
return null;
|
|
24
|
+
const isZeroOrNegative = availableMicros <= BigInt(0);
|
|
25
|
+
return (_jsxs("div", { role: "alert", className: cn("flex items-start gap-2.5 rounded-lg border px-3.5 py-3 text-xs", isZeroOrNegative
|
|
26
|
+
? "border-destructive/30 bg-destructive/5 text-destructive"
|
|
27
|
+
: "border-warning/30 bg-warning/5 text-warning-foreground", className), children: [_jsx(AlertTriangle, { className: "mt-0.5 size-3.5 shrink-0", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: isZeroOrNegative
|
|
28
|
+
? "Credit balance exhausted"
|
|
29
|
+
: "Low credit balance" }), _jsx("p", { className: "mt-0.5 opacity-80", children: isZeroOrNegative
|
|
30
|
+
? "Your credit balance is zero. Purchase credits to continue running agent executions."
|
|
31
|
+
: `Your balance (${formatCreditBalance(availableMicros)}) is below the warning threshold. Consider purchasing additional credits.` })] })] }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=LowBalanceBanner.js.map
|