@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,73 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
|
|
5
|
+
/** Props for {@link ThreadSkeleton}. */
|
|
6
|
+
export interface ThreadSkeletonProps {
|
|
7
|
+
/** Additional CSS class names for the root container. */
|
|
8
|
+
readonly className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const AI_LINE_WIDTHS = [
|
|
12
|
+
[85, 72, 90],
|
|
13
|
+
[78, 65, 88, 70],
|
|
14
|
+
] as const;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Pulse-animated skeleton that mimics the shape of a conversation
|
|
18
|
+
* thread. Renders alternating human-bubble and AI-response
|
|
19
|
+
* silhouettes so the loading state feels purposeful.
|
|
20
|
+
*
|
|
21
|
+
* Intended as an opt-in building block for consumers to show while
|
|
22
|
+
* session data loads. Not auto-rendered by {@link MessageThread}.
|
|
23
|
+
*
|
|
24
|
+
* All visual properties flow through `--stgm-*` tokens.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* if (isLoading) return <ThreadSkeleton className="flex-1" />;
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function ThreadSkeleton({ className }: ThreadSkeletonProps) {
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
className={cn("flex flex-col gap-4 pt-6 pb-4", className)}
|
|
35
|
+
aria-busy="true"
|
|
36
|
+
aria-label="Loading conversation"
|
|
37
|
+
>
|
|
38
|
+
<div className="animate-pulse space-y-4">
|
|
39
|
+
{/* Turn 1: Human bubble */}
|
|
40
|
+
<div className="ms-[20%] rounded-lg bg-muted-subtle px-4 py-3">
|
|
41
|
+
<div className="h-4 w-3/5 rounded bg-muted" />
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
{/* Turn 1: AI response */}
|
|
45
|
+
<div className="space-y-2 px-4">
|
|
46
|
+
{AI_LINE_WIDTHS[0].map((w, i) => (
|
|
47
|
+
<div
|
|
48
|
+
key={i}
|
|
49
|
+
className="h-4 rounded bg-muted"
|
|
50
|
+
style={{ width: `${w}%` }}
|
|
51
|
+
/>
|
|
52
|
+
))}
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
{/* Turn 2: Human bubble */}
|
|
56
|
+
<div className="ms-[20%] rounded-lg bg-muted-subtle px-4 py-3">
|
|
57
|
+
<div className="h-4 w-2/5 rounded bg-muted" />
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
{/* Turn 2: AI response */}
|
|
61
|
+
<div className="space-y-2 px-4">
|
|
62
|
+
{AI_LINE_WIDTHS[1].map((w, i) => (
|
|
63
|
+
<div
|
|
64
|
+
key={i}
|
|
65
|
+
className="h-4 rounded bg-muted"
|
|
66
|
+
style={{ width: `${w}%` }}
|
|
67
|
+
/>
|
|
68
|
+
))}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { memo, useEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
5
5
|
import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
|
|
6
6
|
import {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
ToolCallStatus,
|
|
9
9
|
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
10
10
|
import { cn } from "@stigmer/theme";
|
|
11
|
+
import { useRenderTracer } from "../internal/dev";
|
|
11
12
|
import { ToolCallItem } from "./ToolCallItem";
|
|
12
13
|
import { resolveToolCategory, extractPrimaryArg } from "./tool-categories";
|
|
13
14
|
|
|
@@ -131,6 +132,32 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
|
|
|
131
132
|
pending: "text-muted-foreground",
|
|
132
133
|
};
|
|
133
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Shallow comparison for `ToolCallGroupProps`.
|
|
137
|
+
*
|
|
138
|
+
* The `toolCalls` array may be a newly allocated subset (e.g.
|
|
139
|
+
* `buildThreadItems` filters out `task` calls). Structural sharing
|
|
140
|
+
* (T04) keeps individual `ToolCall` objects stable, so we compare
|
|
141
|
+
* array elements by reference rather than the array itself.
|
|
142
|
+
*
|
|
143
|
+
* @internal Exported for testing — not part of the public API.
|
|
144
|
+
*/
|
|
145
|
+
export function toolCallGroupPropsEqual(
|
|
146
|
+
prev: Readonly<ToolCallGroupProps>,
|
|
147
|
+
next: Readonly<ToolCallGroupProps>,
|
|
148
|
+
): boolean {
|
|
149
|
+
if (prev.toolCalls.length !== next.toolCalls.length) return false;
|
|
150
|
+
for (let i = 0; i < prev.toolCalls.length; i++) {
|
|
151
|
+
if (prev.toolCalls[i] !== next.toolCalls[i]) return false;
|
|
152
|
+
}
|
|
153
|
+
return (
|
|
154
|
+
prev.subAgentExecutions === next.subAgentExecutions &&
|
|
155
|
+
prev.formatSummary === next.formatSummary &&
|
|
156
|
+
prev.defaultExpanded === next.defaultExpanded &&
|
|
157
|
+
prev.className === next.className
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
134
161
|
/**
|
|
135
162
|
* Renders a summary line for a group of tool calls from a single
|
|
136
163
|
* AI turn. Click to expand and see individual tool calls.
|
|
@@ -146,18 +173,24 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
|
|
|
146
173
|
* (e.g., "Shell: ls -la /tmp"). Platform builders can override
|
|
147
174
|
* via the `formatSummary` prop.
|
|
148
175
|
*
|
|
176
|
+
* Wrapped in `React.memo` with a custom comparator that checks
|
|
177
|
+
* `toolCalls` elements by reference (structural sharing keeps
|
|
178
|
+
* individual `ToolCall` objects stable for unchanged calls).
|
|
179
|
+
*
|
|
149
180
|
* @example
|
|
150
181
|
* ```tsx
|
|
151
182
|
* <ToolCallGroup toolCalls={message.toolCalls} />
|
|
152
183
|
* ```
|
|
153
184
|
*/
|
|
154
|
-
export function ToolCallGroup({
|
|
185
|
+
export const ToolCallGroup = memo(function ToolCallGroup({
|
|
155
186
|
toolCalls,
|
|
156
187
|
subAgentExecutions,
|
|
157
188
|
formatSummary,
|
|
158
189
|
defaultExpanded = false,
|
|
159
190
|
className,
|
|
160
191
|
}: ToolCallGroupProps) {
|
|
192
|
+
useRenderTracer("ToolCallGroup", { toolCallCount: toolCalls.length });
|
|
193
|
+
|
|
161
194
|
const status = deriveAggregateStatus(toolCalls);
|
|
162
195
|
const isActive = status === "running" || status === "pending" || status === "waiting";
|
|
163
196
|
|
|
@@ -245,7 +278,7 @@ export function ToolCallGroup({
|
|
|
245
278
|
</div>
|
|
246
279
|
</div>
|
|
247
280
|
);
|
|
248
|
-
}
|
|
281
|
+
}, toolCallGroupPropsEqual);
|
|
249
282
|
|
|
250
283
|
// ---------------------------------------------------------------------------
|
|
251
284
|
// Inline SVG icons — same as SP1, kept inline for SDK independence
|
|
@@ -12,7 +12,7 @@ export interface UsageWidgetProps {
|
|
|
12
12
|
/**
|
|
13
13
|
* All executions for the current session — both completed and
|
|
14
14
|
* actively streaming. The widget aggregates cost data across
|
|
15
|
-
* every execution's
|
|
15
|
+
* every execution's `usageSummary` (proxy-maintained), presenting a
|
|
16
16
|
* session-level total that never resets.
|
|
17
17
|
*
|
|
18
18
|
* Renders nothing when the list is empty or no execution has
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import { render, cleanup } from "@testing-library/react";
|
|
3
|
+
import { create } from "@bufbuild/protobuf";
|
|
4
|
+
import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
5
|
+
import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
6
|
+
import { MessageEntry } from "../MessageEntry";
|
|
7
|
+
|
|
8
|
+
afterEach(cleanup);
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Helpers
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
function makeMessage(
|
|
15
|
+
type: MessageType,
|
|
16
|
+
content: string,
|
|
17
|
+
opts?: { isStreaming?: boolean },
|
|
18
|
+
) {
|
|
19
|
+
const msg = create(AgentMessageSchema);
|
|
20
|
+
msg.type = type;
|
|
21
|
+
msg.content = content;
|
|
22
|
+
if (opts?.isStreaming) msg.isStreaming = true;
|
|
23
|
+
return msg;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function queryArticle(container: HTMLElement, name: string) {
|
|
27
|
+
return container.querySelector(`[role="article"][aria-label="${name}"]`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// AI Messages — Streamdown integration
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
describe("MessageEntry — AI messages (Streamdown)", () => {
|
|
35
|
+
it("renders AI message content as markdown", () => {
|
|
36
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, "Hello **world**");
|
|
37
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
38
|
+
|
|
39
|
+
const article = queryArticle(container, "AI response");
|
|
40
|
+
expect(article).not.toBeNull();
|
|
41
|
+
expect(article!.textContent).toContain("Hello");
|
|
42
|
+
expect(article!.textContent).toContain("world");
|
|
43
|
+
|
|
44
|
+
const strong = article!.querySelector("strong");
|
|
45
|
+
expect(strong).not.toBeNull();
|
|
46
|
+
expect(strong!.textContent).toBe("world");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("sets aria-busy=true when streaming", () => {
|
|
50
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, "Streaming...", {
|
|
51
|
+
isStreaming: true,
|
|
52
|
+
});
|
|
53
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
54
|
+
|
|
55
|
+
const article = queryArticle(container, "AI response");
|
|
56
|
+
expect(article!.getAttribute("aria-busy")).toBe("true");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("sets aria-busy=false when not streaming", () => {
|
|
60
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, "Done.");
|
|
61
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
62
|
+
|
|
63
|
+
const article = queryArticle(container, "AI response");
|
|
64
|
+
expect(article!.getAttribute("aria-busy")).toBe("false");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("renders GFM tables without explicit remark-gfm plugin", () => {
|
|
68
|
+
const tableMarkdown = [
|
|
69
|
+
"| A | B |",
|
|
70
|
+
"|---|---|",
|
|
71
|
+
"| 1 | 2 |",
|
|
72
|
+
].join("\n");
|
|
73
|
+
|
|
74
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, tableMarkdown);
|
|
75
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
76
|
+
|
|
77
|
+
const article = queryArticle(container, "AI response");
|
|
78
|
+
const table = article!.querySelector("table");
|
|
79
|
+
expect(table).not.toBeNull();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("applies MARKDOWN_COMPONENTS overrides (paragraph styling)", () => {
|
|
83
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, "A paragraph");
|
|
84
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
85
|
+
|
|
86
|
+
const article = queryArticle(container, "AI response");
|
|
87
|
+
const p = article!.querySelector("p");
|
|
88
|
+
expect(p).not.toBeNull();
|
|
89
|
+
expect(p!.className).toContain("text-sm");
|
|
90
|
+
expect(p!.className).toContain("text-foreground");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("applies MARKDOWN_COMPONENTS overrides (link styling)", () => {
|
|
94
|
+
const msg = makeMessage(
|
|
95
|
+
MessageType.MESSAGE_AI,
|
|
96
|
+
"[click here](https://example.com)",
|
|
97
|
+
);
|
|
98
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
99
|
+
|
|
100
|
+
const article = queryArticle(container, "AI response");
|
|
101
|
+
const a = article!.querySelector("a");
|
|
102
|
+
expect(a).not.toBeNull();
|
|
103
|
+
expect(a!.className).toContain("text-primary");
|
|
104
|
+
expect(a!.getAttribute("target")).toBe("_blank");
|
|
105
|
+
expect(a!.getAttribute("rel")).toContain("noopener");
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("applies MARKDOWN_COMPONENTS overrides (code block styling)", () => {
|
|
109
|
+
const msg = makeMessage(
|
|
110
|
+
MessageType.MESSAGE_AI,
|
|
111
|
+
"```js\nconsole.log('hi');\n```",
|
|
112
|
+
);
|
|
113
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
114
|
+
|
|
115
|
+
const article = queryArticle(container, "AI response");
|
|
116
|
+
const pre = article!.querySelector("pre");
|
|
117
|
+
expect(pre).not.toBeNull();
|
|
118
|
+
expect(pre!.className).toContain("rounded-md");
|
|
119
|
+
expect(pre!.className).toContain("bg-muted");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("wraps content in stgm-prose container", () => {
|
|
123
|
+
const msg = makeMessage(MessageType.MESSAGE_AI, "Hello");
|
|
124
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
125
|
+
|
|
126
|
+
const prose = container.querySelector(".stgm-prose");
|
|
127
|
+
expect(prose).not.toBeNull();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Human messages — unchanged
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
describe("MessageEntry — Human messages", () => {
|
|
136
|
+
it("renders human message as plain text", () => {
|
|
137
|
+
const msg = makeMessage(MessageType.MESSAGE_HUMAN, "User question");
|
|
138
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
139
|
+
|
|
140
|
+
const article = queryArticle(container, "User message");
|
|
141
|
+
expect(article).not.toBeNull();
|
|
142
|
+
expect(article!.textContent).toContain("User question");
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("applies muted background styling", () => {
|
|
146
|
+
const msg = makeMessage(MessageType.MESSAGE_HUMAN, "Hello");
|
|
147
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
148
|
+
|
|
149
|
+
const article = queryArticle(container, "User message");
|
|
150
|
+
expect(article!.className).toContain("bg-muted-subtle");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// System messages — unchanged
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
describe("MessageEntry — System messages", () => {
|
|
159
|
+
it("renders system message", () => {
|
|
160
|
+
const msg = makeMessage(MessageType.MESSAGE_SYSTEM, "System notice");
|
|
161
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
162
|
+
|
|
163
|
+
const article = queryArticle(container, "System message");
|
|
164
|
+
expect(article).not.toBeNull();
|
|
165
|
+
expect(article!.textContent).toContain("System notice");
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("renders with italic muted styling", () => {
|
|
169
|
+
const msg = makeMessage(MessageType.MESSAGE_SYSTEM, "Notice");
|
|
170
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
171
|
+
|
|
172
|
+
const article = queryArticle(container, "System message");
|
|
173
|
+
const p = article!.querySelector("p");
|
|
174
|
+
expect(p).not.toBeNull();
|
|
175
|
+
expect(p!.className).toContain("italic");
|
|
176
|
+
expect(p!.className).toContain("text-muted-foreground");
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Thinking messages — unchanged
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
|
|
184
|
+
describe("MessageEntry — Thinking messages", () => {
|
|
185
|
+
it("renders thinking message with preview", () => {
|
|
186
|
+
const msg = makeMessage(
|
|
187
|
+
MessageType.MESSAGE_THINKING,
|
|
188
|
+
"Let me consider this problem carefully and think through all the options.",
|
|
189
|
+
);
|
|
190
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
191
|
+
|
|
192
|
+
const article = queryArticle(container, "Model thinking");
|
|
193
|
+
expect(article).not.toBeNull();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("shows spinner icon when streaming", () => {
|
|
197
|
+
const msg = makeMessage(MessageType.MESSAGE_THINKING, "", {
|
|
198
|
+
isStreaming: true,
|
|
199
|
+
});
|
|
200
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
201
|
+
|
|
202
|
+
const article = queryArticle(container, "Model thinking");
|
|
203
|
+
const svg = article!.querySelector("svg.animate-spin");
|
|
204
|
+
expect(svg).not.toBeNull();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("returns null for empty non-streaming thinking", () => {
|
|
208
|
+
const msg = makeMessage(MessageType.MESSAGE_THINKING, "");
|
|
209
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
210
|
+
|
|
211
|
+
expect(container.innerHTML).toBe("");
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Tool / unspecified — renders nothing
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
|
|
219
|
+
describe("MessageEntry — Tool and unspecified messages", () => {
|
|
220
|
+
it("renders nothing for TOOL messages", () => {
|
|
221
|
+
const msg = makeMessage(MessageType.MESSAGE_TOOL, "tool result");
|
|
222
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
223
|
+
|
|
224
|
+
expect(container.innerHTML).toBe("");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("renders nothing for UNSPECIFIED messages", () => {
|
|
228
|
+
const msg = makeMessage(
|
|
229
|
+
MessageType.MESSAGE_TYPE_UNSPECIFIED,
|
|
230
|
+
"unknown",
|
|
231
|
+
);
|
|
232
|
+
const { container } = render(<MessageEntry message={msg} />);
|
|
233
|
+
|
|
234
|
+
expect(container.innerHTML).toBe("");
|
|
235
|
+
});
|
|
236
|
+
});
|