@stigmer/react 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +3 -3
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +37 -9
- package/mcp-server/useMcpServerOAuthConnect.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/mcp-server/McpServerDetailView.tsx +15 -0
- package/src/mcp-server/useMcpServerOAuthConnect.ts +37 -9
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"use-render-tracer.js","sourceRoot":"","sources":["../../../src/internal/dev/use-render-tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAElD;;;GAGG;AACH,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,aAAqB,EACrB,KAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAiC,IAAI,CAAC,CAAC;IAE7D,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAE7B,IAAI,KAAK,GAAG,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,sBAAsB,aAAa,EAAE;YACrC,WAAW,KAAK,EAAE;SACnB,CAAC;QAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACnE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBAClC,CAAC,CAAC,YAAY,CACjB,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Imperative tracker returned by {@link useStreamRate}.
|
|
3
|
+
*
|
|
4
|
+
* Call `tick()` on each stream snapshot inside the `for await` loop.
|
|
5
|
+
* Call `summary()` when the stream ends to log aggregate stats.
|
|
6
|
+
*/
|
|
7
|
+
export interface StreamRateTracker {
|
|
8
|
+
/** Record a stream snapshot arrival. */
|
|
9
|
+
tick(messageCount: number): void;
|
|
10
|
+
/** Log aggregate statistics for the completed stream. */
|
|
11
|
+
summary(): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Dev-only hook that returns an imperative {@link StreamRateTracker}.
|
|
15
|
+
*
|
|
16
|
+
* The tracker is designed to be called inside a `useEffect` async
|
|
17
|
+
* loop (not during render), so it uses a ref-backed mutable object
|
|
18
|
+
* rather than React state.
|
|
19
|
+
*
|
|
20
|
+
* In production the hook returns a no-op tracker.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useStreamRate(): StreamRateTracker;
|
|
23
|
+
//# sourceMappingURL=use-stream-rate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-stream-rate.d.ts","sourceRoot":"","sources":["../../../src/internal/dev/use-stream-rate.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,OAAO,IAAI,IAAI,CAAC;CACjB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,CAsEjD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useRef } from "react";
|
|
2
|
+
const DEV = process.env.NODE_ENV !== "production";
|
|
3
|
+
/** Rolling window size for interval statistics. */
|
|
4
|
+
const WINDOW_SIZE = 30;
|
|
5
|
+
/** Log a sampled line every Nth tick. */
|
|
6
|
+
const LOG_EVERY = 10;
|
|
7
|
+
const NOOP_TRACKER = {
|
|
8
|
+
tick() { },
|
|
9
|
+
summary() { },
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Dev-only hook that returns an imperative {@link StreamRateTracker}.
|
|
13
|
+
*
|
|
14
|
+
* The tracker is designed to be called inside a `useEffect` async
|
|
15
|
+
* loop (not during render), so it uses a ref-backed mutable object
|
|
16
|
+
* rather than React state.
|
|
17
|
+
*
|
|
18
|
+
* In production the hook returns a no-op tracker.
|
|
19
|
+
*/
|
|
20
|
+
export function useStreamRate() {
|
|
21
|
+
const stateRef = useRef(null);
|
|
22
|
+
if (!DEV)
|
|
23
|
+
return NOOP_TRACKER;
|
|
24
|
+
if (!stateRef.current) {
|
|
25
|
+
stateRef.current = {
|
|
26
|
+
tickCount: 0,
|
|
27
|
+
timestamps: [],
|
|
28
|
+
prevMessageCount: 0,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const state = stateRef.current;
|
|
32
|
+
const tracker = {
|
|
33
|
+
tick(messageCount) {
|
|
34
|
+
const now = performance.now();
|
|
35
|
+
state.tickCount += 1;
|
|
36
|
+
state.timestamps.push(now);
|
|
37
|
+
if (state.timestamps.length > WINDOW_SIZE) {
|
|
38
|
+
state.timestamps.shift();
|
|
39
|
+
}
|
|
40
|
+
const delta = messageCount - state.prevMessageCount;
|
|
41
|
+
state.prevMessageCount = messageCount;
|
|
42
|
+
if (state.tickCount % LOG_EVERY === 0 || state.tickCount === 1) {
|
|
43
|
+
const intervals = computeIntervals(state.timestamps);
|
|
44
|
+
const parts = [
|
|
45
|
+
`[stgm:perf:stream] tick #${state.tickCount}`,
|
|
46
|
+
`messages=${messageCount}`,
|
|
47
|
+
`delta=+${delta}`,
|
|
48
|
+
];
|
|
49
|
+
if (intervals) {
|
|
50
|
+
parts.push(`interval=${intervals.avg.toFixed(0)}ms`, `rate=${intervals.rate.toFixed(1)}/s`);
|
|
51
|
+
}
|
|
52
|
+
console.debug(parts.join(" "));
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
summary() {
|
|
56
|
+
if (state.tickCount === 0)
|
|
57
|
+
return;
|
|
58
|
+
const intervals = computeIntervals(state.timestamps);
|
|
59
|
+
const parts = [
|
|
60
|
+
`[stgm:perf:stream] ✓ stream complete`,
|
|
61
|
+
`totalTicks=${state.tickCount}`,
|
|
62
|
+
`finalMessages=${state.prevMessageCount}`,
|
|
63
|
+
];
|
|
64
|
+
if (intervals) {
|
|
65
|
+
parts.push(`avgInterval=${intervals.avg.toFixed(0)}ms`, `minInterval=${intervals.min.toFixed(0)}ms`, `maxInterval=${intervals.max.toFixed(0)}ms`, `avgRate=${intervals.rate.toFixed(1)}/s`);
|
|
66
|
+
}
|
|
67
|
+
console.debug(parts.join(" "));
|
|
68
|
+
state.tickCount = 0;
|
|
69
|
+
state.timestamps.length = 0;
|
|
70
|
+
state.prevMessageCount = 0;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
return tracker;
|
|
74
|
+
}
|
|
75
|
+
function computeIntervals(timestamps) {
|
|
76
|
+
if (timestamps.length < 2)
|
|
77
|
+
return null;
|
|
78
|
+
let min = Infinity;
|
|
79
|
+
let max = 0;
|
|
80
|
+
let sum = 0;
|
|
81
|
+
const count = timestamps.length - 1;
|
|
82
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
83
|
+
const dt = timestamps[i] - timestamps[i - 1];
|
|
84
|
+
sum += dt;
|
|
85
|
+
if (dt < min)
|
|
86
|
+
min = dt;
|
|
87
|
+
if (dt > max)
|
|
88
|
+
max = dt;
|
|
89
|
+
}
|
|
90
|
+
const avg = sum / count;
|
|
91
|
+
const rate = avg > 0 ? 1000 / avg : 0;
|
|
92
|
+
return { min, max, avg, rate };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=use-stream-rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-stream-rate.js","sourceRoot":"","sources":["../../../src/internal/dev/use-stream-rate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAElD,mDAAmD;AACnD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,yCAAyC;AACzC,MAAM,SAAS,GAAG,EAAE,CAAC;AAwBrB,MAAM,YAAY,GAAsB;IACtC,IAAI,KAAI,CAAC;IACT,OAAO,KAAI,CAAC;CACb,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAE9B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,GAAG;YACjB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,EAAE;YACd,gBAAgB,EAAE,CAAC;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE/B,MAAM,OAAO,GAAsB;QACjC,IAAI,CAAC,YAAoB;YACvB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;YACrB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBAC1C,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC;YACpD,KAAK,CAAC,gBAAgB,GAAG,YAAY,CAAC;YAEtC,IAAI,KAAK,CAAC,SAAS,GAAG,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG;oBACZ,4BAA4B,KAAK,CAAC,SAAS,EAAE;oBAC7C,YAAY,YAAY,EAAE;oBAC1B,UAAU,KAAK,EAAE;iBAClB,CAAC;gBACF,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CACR,YAAY,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EACxC,QAAQ,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACtC,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC;gBAAE,OAAO;YAElC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG;gBACZ,sCAAsC;gBACtC,cAAc,KAAK,CAAC,SAAS,EAAE;gBAC/B,iBAAiB,KAAK,CAAC,gBAAgB,EAAE;aAC1C,CAAC;YACF,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CACR,eAAe,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAC3C,eAAe,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAC3C,eAAe,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAC3C,WAAW,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACzC,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAoB;IAC5C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,GAAG,IAAI,EAAE,CAAC;QACV,IAAI,EAAE,GAAG,GAAG;YAAE,GAAG,GAAG,EAAE,CAAC;QACvB,IAAI,EAAE,GAAG,GAAG;YAAE,GAAG,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
/** Configuration for `FetchCache`. */
|
|
18
|
+
export interface FetchCacheOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Maximum number of entries before the oldest are evicted.
|
|
21
|
+
* @default 100
|
|
22
|
+
*/
|
|
23
|
+
readonly maxEntries?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Time-to-live in milliseconds. Entries older than this are
|
|
26
|
+
* treated as missing on read and lazily purged.
|
|
27
|
+
* @default 300_000 (5 minutes)
|
|
28
|
+
*/
|
|
29
|
+
readonly ttl?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class FetchCache {
|
|
32
|
+
private readonly _entries;
|
|
33
|
+
private readonly _maxEntries;
|
|
34
|
+
private readonly _ttl;
|
|
35
|
+
constructor(options?: FetchCacheOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Retrieve a cached value. Returns `undefined` when the key is
|
|
38
|
+
* missing or the entry has expired.
|
|
39
|
+
*/
|
|
40
|
+
get<T>(key: string): T | undefined;
|
|
41
|
+
/** `true` when a non-expired entry exists for `key`. */
|
|
42
|
+
has(key: string): boolean;
|
|
43
|
+
/** Write (or overwrite) a cache entry and evict if over capacity. */
|
|
44
|
+
set(key: string, data: unknown): void;
|
|
45
|
+
/** Remove a single entry. */
|
|
46
|
+
invalidate(key: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Remove all entries whose key starts with `prefix`.
|
|
49
|
+
*
|
|
50
|
+
* Useful for bulk invalidation scoped to a resource type
|
|
51
|
+
* (e.g. `invalidatePrefix("session:")` on logout).
|
|
52
|
+
*/
|
|
53
|
+
invalidatePrefix(prefix: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Fire-and-forget fetch that writes the result to the cache.
|
|
56
|
+
* Errors are silently swallowed — the worst case is a cache miss.
|
|
57
|
+
*/
|
|
58
|
+
prefetch<T>(key: string, fetchFn: () => Promise<T>): void;
|
|
59
|
+
/** Drop all entries. */
|
|
60
|
+
clear(): void;
|
|
61
|
+
/** Number of live (non-expired) entries. Mainly useful in tests. */
|
|
62
|
+
get size(): number;
|
|
63
|
+
private _isExpired;
|
|
64
|
+
/**
|
|
65
|
+
* Evict the oldest entries (by insertion order) when the cache
|
|
66
|
+
* exceeds `maxEntries`. Because `Map` preserves insertion order
|
|
67
|
+
* and `set` always re-inserts at the tail, the iterator yields
|
|
68
|
+
* entries from oldest to newest — giving us LRU eviction.
|
|
69
|
+
*/
|
|
70
|
+
private _evict;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=fetch-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cache.d.ts","sourceRoot":"","sources":["../../src/internal/fetch-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,OAAO,CAAC,EAAE,iBAAiB;IAKvC;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC,wDAAwD;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,qEAAqE;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAQrC,6BAA6B;IAC7B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQtC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IASzD,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAIb,oEAAoE;IACpE,IAAI,IAAI,IAAI,MAAM,CAMjB;IAMD,OAAO,CAAC,UAAU;IAIlB;;;;;OAKG;IACH,OAAO,CAAC,MAAM;CAUf"}
|
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
// FetchCache
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export class FetchCache {
|
|
21
|
+
_entries = new Map();
|
|
22
|
+
_maxEntries;
|
|
23
|
+
_ttl;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this._maxEntries = options?.maxEntries ?? 100;
|
|
26
|
+
this._ttl = options?.ttl ?? 5 * 60 * 1_000;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Retrieve a cached value. Returns `undefined` when the key is
|
|
30
|
+
* missing or the entry has expired.
|
|
31
|
+
*/
|
|
32
|
+
get(key) {
|
|
33
|
+
const entry = this._entries.get(key);
|
|
34
|
+
if (!entry)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (this._isExpired(entry)) {
|
|
37
|
+
this._entries.delete(key);
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return entry.data;
|
|
41
|
+
}
|
|
42
|
+
/** `true` when a non-expired entry exists for `key`. */
|
|
43
|
+
has(key) {
|
|
44
|
+
return this.get(key) !== undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Write (or overwrite) a cache entry and evict if over capacity. */
|
|
47
|
+
set(key, data) {
|
|
48
|
+
// Delete first so the re-insertion moves `key` to the end of
|
|
49
|
+
// the Map's insertion order — gives us LRU semantics for free.
|
|
50
|
+
this._entries.delete(key);
|
|
51
|
+
this._entries.set(key, { data, timestamp: Date.now() });
|
|
52
|
+
this._evict();
|
|
53
|
+
}
|
|
54
|
+
/** Remove a single entry. */
|
|
55
|
+
invalidate(key) {
|
|
56
|
+
this._entries.delete(key);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Remove all entries whose key starts with `prefix`.
|
|
60
|
+
*
|
|
61
|
+
* Useful for bulk invalidation scoped to a resource type
|
|
62
|
+
* (e.g. `invalidatePrefix("session:")` on logout).
|
|
63
|
+
*/
|
|
64
|
+
invalidatePrefix(prefix) {
|
|
65
|
+
for (const key of this._entries.keys()) {
|
|
66
|
+
if (key.startsWith(prefix)) {
|
|
67
|
+
this._entries.delete(key);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Fire-and-forget fetch that writes the result to the cache.
|
|
73
|
+
* Errors are silently swallowed — the worst case is a cache miss.
|
|
74
|
+
*/
|
|
75
|
+
prefetch(key, fetchFn) {
|
|
76
|
+
fetchFn().then((data) => this.set(key, data), () => {
|
|
77
|
+
/* intentional no-op */
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Drop all entries. */
|
|
81
|
+
clear() {
|
|
82
|
+
this._entries.clear();
|
|
83
|
+
}
|
|
84
|
+
/** Number of live (non-expired) entries. Mainly useful in tests. */
|
|
85
|
+
get size() {
|
|
86
|
+
// Lazy purge expired entries on size read so the count is accurate.
|
|
87
|
+
for (const [key, entry] of this._entries) {
|
|
88
|
+
if (this._isExpired(entry))
|
|
89
|
+
this._entries.delete(key);
|
|
90
|
+
}
|
|
91
|
+
return this._entries.size;
|
|
92
|
+
}
|
|
93
|
+
// -----------------------------------------------------------------------
|
|
94
|
+
// Private
|
|
95
|
+
// -----------------------------------------------------------------------
|
|
96
|
+
_isExpired(entry) {
|
|
97
|
+
return Date.now() - entry.timestamp > this._ttl;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Evict the oldest entries (by insertion order) when the cache
|
|
101
|
+
* exceeds `maxEntries`. Because `Map` preserves insertion order
|
|
102
|
+
* and `set` always re-inserts at the tail, the iterator yields
|
|
103
|
+
* entries from oldest to newest — giving us LRU eviction.
|
|
104
|
+
*/
|
|
105
|
+
_evict() {
|
|
106
|
+
if (this._entries.size <= this._maxEntries)
|
|
107
|
+
return;
|
|
108
|
+
const excess = this._entries.size - this._maxEntries;
|
|
109
|
+
const iter = this._entries.keys();
|
|
110
|
+
for (let i = 0; i < excess; i++) {
|
|
111
|
+
const { value: key, done } = iter.next();
|
|
112
|
+
if (done)
|
|
113
|
+
break;
|
|
114
|
+
this._entries.delete(key);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=fetch-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cache.js","sourceRoot":"","sources":["../../src/internal/fetch-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.test.d.ts","sourceRoot":"","sources":["../../../../src/internal/store/__tests__/conversation-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { create } from "@bufbuild/protobuf";
|
|
3
|
+
import { AgentExecutionSchema, AgentExecutionStatusSchema, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
4
|
+
import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
5
|
+
import { ExecutionPhase, MessageType, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
6
|
+
import { ConversationStore } from "../conversation-store";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
function makeExec(phase, messages) {
|
|
11
|
+
const exec = create(AgentExecutionSchema);
|
|
12
|
+
const status = create(AgentExecutionStatusSchema);
|
|
13
|
+
status.phase = phase;
|
|
14
|
+
if (messages) {
|
|
15
|
+
status.messages = messages.map((m) => {
|
|
16
|
+
const msg = create(AgentMessageSchema);
|
|
17
|
+
msg.type = m.type;
|
|
18
|
+
msg.content = m.content;
|
|
19
|
+
return msg;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
exec.status = status;
|
|
23
|
+
return exec;
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Tests
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
describe("ConversationStore", () => {
|
|
29
|
+
describe("initial state", () => {
|
|
30
|
+
it("starts with null execution and idle stream state", () => {
|
|
31
|
+
const store = new ConversationStore();
|
|
32
|
+
expect(store.getExecution()).toBeNull();
|
|
33
|
+
expect(store.getStreamState()).toEqual({ stage: "idle" });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("subscribe / unsubscribe", () => {
|
|
37
|
+
it("notifies listeners on state changes", () => {
|
|
38
|
+
const store = new ConversationStore();
|
|
39
|
+
const listener = vi.fn();
|
|
40
|
+
store.subscribe(listener);
|
|
41
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
42
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
43
|
+
});
|
|
44
|
+
it("stops notifying after unsubscribe", () => {
|
|
45
|
+
const store = new ConversationStore();
|
|
46
|
+
const listener = vi.fn();
|
|
47
|
+
const unsub = store.subscribe(listener);
|
|
48
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
49
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
50
|
+
unsub();
|
|
51
|
+
store.setStreamState({ stage: "streaming", executionId: "e1" });
|
|
52
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
53
|
+
});
|
|
54
|
+
it("supports multiple listeners", () => {
|
|
55
|
+
const store = new ConversationStore();
|
|
56
|
+
const l1 = vi.fn();
|
|
57
|
+
const l2 = vi.fn();
|
|
58
|
+
store.subscribe(l1);
|
|
59
|
+
store.subscribe(l2);
|
|
60
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
61
|
+
expect(l1).toHaveBeenCalledTimes(1);
|
|
62
|
+
expect(l2).toHaveBeenCalledTimes(1);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("ingestSnapshot", () => {
|
|
66
|
+
it("stores execution and notifies listeners", () => {
|
|
67
|
+
const store = new ConversationStore();
|
|
68
|
+
const listener = vi.fn();
|
|
69
|
+
store.subscribe(listener);
|
|
70
|
+
const snapshot = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
71
|
+
{ type: MessageType.MESSAGE_AI, content: "hello" },
|
|
72
|
+
]);
|
|
73
|
+
store.ingestSnapshot(snapshot);
|
|
74
|
+
expect(store.getExecution()).toBe(snapshot);
|
|
75
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
76
|
+
});
|
|
77
|
+
it("does not notify when structural sharing produces the same reference", () => {
|
|
78
|
+
const store = new ConversationStore();
|
|
79
|
+
const snapshot = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
80
|
+
{ type: MessageType.MESSAGE_AI, content: "hello" },
|
|
81
|
+
]);
|
|
82
|
+
store.ingestSnapshot(snapshot);
|
|
83
|
+
const listener = vi.fn();
|
|
84
|
+
store.subscribe(listener);
|
|
85
|
+
const identical = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
86
|
+
{ type: MessageType.MESSAGE_AI, content: "hello" },
|
|
87
|
+
]);
|
|
88
|
+
store.ingestSnapshot(identical);
|
|
89
|
+
expect(listener).not.toHaveBeenCalled();
|
|
90
|
+
expect(store.getExecution()).toBe(snapshot);
|
|
91
|
+
});
|
|
92
|
+
it("applies structural sharing: preserves unchanged message refs", () => {
|
|
93
|
+
const store = new ConversationStore();
|
|
94
|
+
const snap1 = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
95
|
+
{ type: MessageType.MESSAGE_HUMAN, content: "question" },
|
|
96
|
+
{ type: MessageType.MESSAGE_AI, content: "partial" },
|
|
97
|
+
]);
|
|
98
|
+
store.ingestSnapshot(snap1);
|
|
99
|
+
const prevMsgs = store.getExecution().status.messages;
|
|
100
|
+
const humanMsg = prevMsgs[0];
|
|
101
|
+
const snap2 = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
102
|
+
{ type: MessageType.MESSAGE_HUMAN, content: "question" },
|
|
103
|
+
{ type: MessageType.MESSAGE_AI, content: "partial answer growing" },
|
|
104
|
+
]);
|
|
105
|
+
store.ingestSnapshot(snap2);
|
|
106
|
+
const result = store.getExecution();
|
|
107
|
+
expect(result.status.messages[0]).toBe(humanMsg);
|
|
108
|
+
expect(result.status.messages[1].content).toBe("partial answer growing");
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe("setStreamState", () => {
|
|
112
|
+
it("transitions between stages and notifies", () => {
|
|
113
|
+
const store = new ConversationStore();
|
|
114
|
+
const listener = vi.fn();
|
|
115
|
+
store.subscribe(listener);
|
|
116
|
+
const states = [
|
|
117
|
+
{ stage: "connecting", executionId: "e1" },
|
|
118
|
+
{ stage: "streaming", executionId: "e1" },
|
|
119
|
+
{ stage: "complete", executionId: "e1" },
|
|
120
|
+
];
|
|
121
|
+
for (const state of states) {
|
|
122
|
+
store.setStreamState(state);
|
|
123
|
+
}
|
|
124
|
+
expect(listener).toHaveBeenCalledTimes(3);
|
|
125
|
+
expect(store.getStreamState()).toEqual({
|
|
126
|
+
stage: "complete",
|
|
127
|
+
executionId: "e1",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it("does not notify when set to the same state", () => {
|
|
131
|
+
const store = new ConversationStore();
|
|
132
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
133
|
+
const listener = vi.fn();
|
|
134
|
+
store.subscribe(listener);
|
|
135
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
136
|
+
expect(listener).not.toHaveBeenCalled();
|
|
137
|
+
});
|
|
138
|
+
it("handles error state", () => {
|
|
139
|
+
const store = new ConversationStore();
|
|
140
|
+
const err = new Error("network failure");
|
|
141
|
+
store.setStreamState({ stage: "error", executionId: "e1", error: err });
|
|
142
|
+
const state = store.getStreamState();
|
|
143
|
+
expect(state.stage).toBe("error");
|
|
144
|
+
if (state.stage === "error") {
|
|
145
|
+
expect(state.error).toBe(err);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("reset", () => {
|
|
150
|
+
it("clears execution and stream state", () => {
|
|
151
|
+
const store = new ConversationStore();
|
|
152
|
+
store.ingestSnapshot(makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS, [
|
|
153
|
+
{ type: MessageType.MESSAGE_AI, content: "hi" },
|
|
154
|
+
]));
|
|
155
|
+
store.setStreamState({ stage: "streaming", executionId: "e1" });
|
|
156
|
+
const listener = vi.fn();
|
|
157
|
+
store.subscribe(listener);
|
|
158
|
+
store.reset();
|
|
159
|
+
expect(store.getExecution()).toBeNull();
|
|
160
|
+
expect(store.getStreamState()).toEqual({ stage: "idle" });
|
|
161
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
162
|
+
});
|
|
163
|
+
it("does not notify when already in initial state", () => {
|
|
164
|
+
const store = new ConversationStore();
|
|
165
|
+
const listener = vi.fn();
|
|
166
|
+
store.subscribe(listener);
|
|
167
|
+
store.reset();
|
|
168
|
+
expect(listener).not.toHaveBeenCalled();
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("getExecution / getStreamState referential stability", () => {
|
|
172
|
+
it("getExecution returns the same reference across calls when unchanged", () => {
|
|
173
|
+
const store = new ConversationStore();
|
|
174
|
+
const snap = makeExec(ExecutionPhase.EXECUTION_IN_PROGRESS);
|
|
175
|
+
store.ingestSnapshot(snap);
|
|
176
|
+
const ref1 = store.getExecution();
|
|
177
|
+
const ref2 = store.getExecution();
|
|
178
|
+
expect(ref1).toBe(ref2);
|
|
179
|
+
});
|
|
180
|
+
it("getStreamState returns the same reference across calls when unchanged", () => {
|
|
181
|
+
const store = new ConversationStore();
|
|
182
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
183
|
+
const ref1 = store.getStreamState();
|
|
184
|
+
const ref2 = store.getStreamState();
|
|
185
|
+
expect(ref1).toBe(ref2);
|
|
186
|
+
});
|
|
187
|
+
it("subscribe and getters are bound methods (safe to destructure)", () => {
|
|
188
|
+
const store = new ConversationStore();
|
|
189
|
+
const { subscribe, getExecution, getStreamState } = store;
|
|
190
|
+
expect(getExecution()).toBeNull();
|
|
191
|
+
expect(getStreamState()).toEqual({ stage: "idle" });
|
|
192
|
+
const listener = vi.fn();
|
|
193
|
+
const unsub = subscribe(listener);
|
|
194
|
+
store.setStreamState({ stage: "connecting", executionId: "e1" });
|
|
195
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
196
|
+
unsub();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=conversation-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.test.js","sourceRoot":"","sources":["../../../../src/internal/store/__tests__/conversation-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-share.test.d.ts","sourceRoot":"","sources":["../../../../src/internal/store/__tests__/structural-share.test.ts"],"names":[],"mappings":""}
|