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