@flanksource/clicky-ui 0.3.43 → 0.3.45
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/README.md +2 -0
- package/dist/ai.cjs +4 -2
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -1
- package/dist/components/MdxEditorField.cjs +40 -22
- package/dist/components/MdxEditorField.cjs.map +1 -1
- package/dist/components/MdxEditorField.d.ts.map +1 -1
- package/dist/components/MdxEditorField.js +41 -23
- package/dist/components/MdxEditorField.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -1
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -1
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/data/CodeBlock.cjs +3 -2
- package/dist/data/CodeBlock.cjs.map +1 -1
- package/dist/data/CodeBlock.d.ts +3 -1
- package/dist/data/CodeBlock.d.ts.map +1 -1
- package/dist/data/CodeBlock.js +3 -2
- package/dist/data/CodeBlock.js.map +1 -1
- package/dist/data/CodeLine.cjs +22 -0
- package/dist/data/CodeLine.cjs.map +1 -0
- package/dist/data/CodeLine.d.ts +8 -0
- package/dist/data/CodeLine.d.ts.map +1 -0
- package/dist/data/CodeLine.js +22 -0
- package/dist/data/CodeLine.js.map +1 -0
- package/dist/data/GraphDiagram.cjs +18 -6
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -1
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +18 -6
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramNodes.cjs +38 -29
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +8 -2
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +38 -29
- package/dist/data/GraphDiagramNodes.js.map +1 -1
- package/dist/data/JsonView.cjs +118 -49
- package/dist/data/JsonView.cjs.map +1 -1
- package/dist/data/JsonView.d.ts +13 -10
- package/dist/data/JsonView.d.ts.map +1 -1
- package/dist/data/JsonView.js +118 -49
- package/dist/data/JsonView.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +2 -2
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.js +2 -2
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +91 -250
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatButton.cjs +2 -0
- package/dist/data/ai/ChatButton.cjs.map +1 -1
- package/dist/data/ai/ChatButton.d.ts +1 -1
- package/dist/data/ai/ChatButton.d.ts.map +1 -1
- package/dist/data/ai/ChatButton.js +2 -0
- package/dist/data/ai/ChatButton.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +5 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts +5 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +5 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +2 -8
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +2 -8
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +0 -5
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +3 -6
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +13 -4
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +5 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +1 -1
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +1 -1
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +13 -4
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +41 -27
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +41 -27
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
- package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.js +35 -0
- package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.js +3 -1
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +55 -35
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +18 -1
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +18 -1
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +149 -143
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +20 -6
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +151 -146
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +14 -10
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +15 -11
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +2 -1
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
- package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
- package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.js +53 -54
- package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
- package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
- package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
- package/dist/data/ai/index.d.ts +2 -2
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
- package/dist/data/ai/session-token-sizing.d.ts +32 -0
- package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.cjs +73 -0
- package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
- package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
- package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.js +73 -0
- package/dist/data/ai/use-session-token-sizing.js.map +1 -0
- package/dist/data/call-graph/CallGraph.cjs +250 -0
- package/dist/data/call-graph/CallGraph.cjs.map +1 -0
- package/dist/data/call-graph/CallGraph.d.ts +69 -0
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraph.js +250 -0
- package/dist/data/call-graph/CallGraph.js.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.js +50 -0
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
- package/dist/data/call-graph/CallGraphParts.cjs +204 -0
- package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
- package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphParts.js +204 -0
- package/dist/data/call-graph/CallGraphParts.js.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.js +186 -0
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
- package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.js +75 -0
- package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
- package/dist/data/call-graph/call-graph-labels.cjs +96 -0
- package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
- package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-labels.js +96 -0
- package/dist/data/call-graph/call-graph-labels.js.map +1 -0
- package/dist/data/call-graph/call-graph-model.cjs +161 -0
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-model.d.ts +102 -0
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-model.js +161 -0
- package/dist/data/call-graph/call-graph-model.js.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
- package/dist/data/call-graph/index.d.ts +7 -0
- package/dist/data/call-graph/index.d.ts.map +1 -0
- package/dist/data/call-graph/types.cjs +5 -0
- package/dist/data/call-graph/types.cjs.map +1 -0
- package/dist/data/call-graph/types.d.ts +135 -0
- package/dist/data/call-graph/types.d.ts.map +1 -0
- package/dist/data/call-graph/types.js +5 -0
- package/dist/data/call-graph/types.js.map +1 -0
- package/dist/data/call-graph/use-call-graph.cjs +93 -0
- package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
- package/dist/data/call-graph/use-call-graph.d.ts +24 -0
- package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
- package/dist/data/call-graph/use-call-graph.js +93 -0
- package/dist/data/call-graph/use-call-graph.js.map +1 -0
- package/dist/data/chat/Chat.cjs +39 -15
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +2 -2
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +2 -2
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +40 -16
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.bar.cjs +5 -8
- package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.bar.js +5 -8
- package/dist/data/chat/ContextMeter.bar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +18 -19
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +1 -1
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +18 -19
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +2 -1
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +4 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +2 -1
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/Message.cjs +39 -12
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +40 -13
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +60 -5
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +7 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +60 -5
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +2 -2
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/tool-policy.cjs +59 -2
- package/dist/data/chat/tool-policy.cjs.map +1 -1
- package/dist/data/chat/tool-policy.d.ts +9 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.js +59 -2
- package/dist/data/chat/tool-policy.js.map +1 -1
- package/dist/data/chat/types.cjs +6 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +13 -4
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +7 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +11 -6
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts +0 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +11 -6
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +2 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +3 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +2 -1
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +3 -3
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +26 -10
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +8 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +26 -10
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +5 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-edge-routing.cjs +9 -3
- package/dist/data/graph-edge-routing.cjs.map +1 -1
- package/dist/data/graph-edge-routing.d.ts +2 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -1
- package/dist/data/graph-edge-routing.js +9 -3
- package/dist/data/graph-edge-routing.js.map +1 -1
- package/dist/data/json-view/JsonSource.cjs +84 -0
- package/dist/data/json-view/JsonSource.cjs.map +1 -0
- package/dist/data/json-view/JsonSource.d.ts +7 -0
- package/dist/data/json-view/JsonSource.d.ts.map +1 -0
- package/dist/data/json-view/JsonSource.js +84 -0
- package/dist/data/json-view/JsonSource.js.map +1 -0
- package/dist/data/json-view/parse-prefix.cjs +132 -0
- package/dist/data/json-view/parse-prefix.cjs.map +1 -0
- package/dist/data/json-view/parse-prefix.d.ts +11 -0
- package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
- package/dist/data/json-view/parse-prefix.js +132 -0
- package/dist/data/json-view/parse-prefix.js.map +1 -0
- package/dist/data/json-view/parse-source.cjs +62 -0
- package/dist/data/json-view/parse-source.cjs.map +1 -0
- package/dist/data/json-view/parse-source.d.ts +16 -0
- package/dist/data/json-view/parse-source.d.ts.map +1 -0
- package/dist/data/json-view/parse-source.js +62 -0
- package/dist/data/json-view/parse-source.js.map +1 -0
- package/dist/data/json-view/story-fixtures.d.ts +6 -0
- package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
- package/dist/data/json-view/types.d.ts +14 -0
- package/dist/data/json-view/types.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +2 -5
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +2 -4
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.js +2 -2
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +2 -5
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.js +5 -2
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +1 -5
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.js +8 -27
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +1 -5
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
- package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.cjs +23 -10
- package/dist/data/use-pan-zoom.cjs.map +1 -1
- package/dist/data/use-pan-zoom.d.ts +16 -2
- package/dist/data/use-pan-zoom.d.ts.map +1 -1
- package/dist/data/use-pan-zoom.js +23 -10
- package/dist/data/use-pan-zoom.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +28 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +2 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +26 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +30 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Workspace.cjs +13 -4
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts +7 -2
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +13 -4
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/lib/permission-strategies.cjs +71 -11
- package/dist/lib/permission-strategies.cjs.map +1 -1
- package/dist/lib/permission-strategies.d.ts +3 -0
- package/dist/lib/permission-strategies.d.ts.map +1 -1
- package/dist/lib/permission-strategies.js +71 -11
- package/dist/lib/permission-strategies.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -3
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
- package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
- package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.js +0 -8
- package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
|
@@ -28,7 +28,7 @@ function ContextMeterBar({
|
|
|
28
28
|
"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground",
|
|
29
29
|
className
|
|
30
30
|
),
|
|
31
|
-
"aria-label": `Context ${pct}% used`,
|
|
31
|
+
"aria-label": pct === void 0 ? "Context unavailable" : `Context ${pct}% used`,
|
|
32
32
|
children: [
|
|
33
33
|
/* @__PURE__ */ jsx(
|
|
34
34
|
"span",
|
|
@@ -103,7 +103,7 @@ function ContextMeterBar({
|
|
|
103
103
|
"block h-full rounded-full transition-all",
|
|
104
104
|
barClassName
|
|
105
105
|
),
|
|
106
|
-
style: { width: `${pct}%` }
|
|
106
|
+
style: { width: `${pct ?? 0}%` }
|
|
107
107
|
}
|
|
108
108
|
)
|
|
109
109
|
}
|
|
@@ -121,7 +121,7 @@ function ContextMeterBar({
|
|
|
121
121
|
"absolute inset-x-0 bottom-0 block w-full rounded-full transition-all",
|
|
122
122
|
barClassName
|
|
123
123
|
),
|
|
124
|
-
style: { height: `${pct}%` }
|
|
124
|
+
style: { height: `${pct ?? 0}%` }
|
|
125
125
|
}
|
|
126
126
|
)
|
|
127
127
|
}
|
|
@@ -129,15 +129,12 @@ function ContextMeterBar({
|
|
|
129
129
|
]
|
|
130
130
|
}
|
|
131
131
|
),
|
|
132
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ jsx(
|
|
133
133
|
"span",
|
|
134
134
|
{
|
|
135
135
|
"data-context-identity": "percentage",
|
|
136
136
|
className: cn("shrink-0 font-medium tabular-nums", textClassName),
|
|
137
|
-
children:
|
|
138
|
-
pct,
|
|
139
|
-
"%"
|
|
140
|
-
]
|
|
137
|
+
children: pct === void 0 ? "—" : `${pct}%`
|
|
141
138
|
}
|
|
142
139
|
)
|
|
143
140
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.bar.js","sources":["../../../src/data/chat/ContextMeter.bar.tsx"],"sourcesContent":["import { UiRobotAi } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { runtimeModeIcon } from \"../runtime/runtime-mode\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { shortContextModelName } from \"./ContextMeter.model\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\n\ntype ContextMeterBarProps = {\n pct: number;\n provider?: string | undefined;\n executionMode?: string | undefined;\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n effort?: string | undefined;\n barClassName: string;\n textClassName: string;\n className?: string | undefined;\n};\n\nexport function ContextMeterBar({\n pct,\n provider,\n executionMode,\n model,\n modelIcon,\n modelIconClassName,\n effort,\n barClassName,\n textClassName,\n className,\n}: ContextMeterBarProps) {\n const ProviderGlyph = modelIcon ?? providerIcon(provider) ?? UiRobotAi;\n const ModeGlyph = runtimeModeIcon(executionMode);\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span\n data-context-identity=\"provider\"\n data-context-provider={provider ?? \"unknown\"}\n title={provider ? `Provider: ${provider}` : \"Provider\"}\n className=\"inline-flex shrink-0\"\n >\n <Icon\n icon={ProviderGlyph}\n className={cn(\n \"size-3.5\",\n modelIconClassName ?? providerIconColor(provider),\n )}\n />\n </span>\n {model ? (\n <span\n data-context-identity=\"model\"\n className=\"min-w-0 max-w-32 truncate font-medium text-foreground\"\n title={model}\n >\n {shortContextModelName(model)}\n </span>\n ) : null}\n {ModeGlyph ? (\n <span\n data-context-identity=\"mode\"\n data-context-mode={executionMode}\n title={`Mode: ${executionMode}`}\n className=\"inline-flex shrink-0\"\n >\n <Icon icon={ModeGlyph} className=\"size-3.5\" />\n </span>\n ) : null}\n {EffortGlyph && effort ? (\n <span\n data-context-identity=\"effort\"\n data-context-effort={effort}\n title={`${effortLevelLabel(effort)} effort`}\n className=\"inline-flex shrink-0\"\n >\n <Icon\n icon={EffortGlyph}\n className={cn(\"size-3.5\", effortLevelColor(effort))}\n />\n </span>\n ) : null}\n <span\n data-context-identity=\"progress\"\n className=\"inline-flex shrink-0 items-center\"\n >\n <span\n data-context-progress=\"horizontal\"\n aria-hidden=\"true\"\n className=\"h-1.5 w-16 overflow-hidden rounded-full bg-muted max-md:hidden @max-[48rem]:hidden\"\n >\n <span\n className={cn(\n \"block h-full rounded-full transition-all\",\n barClassName,\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n <span\n data-context-progress=\"vertical\"\n aria-hidden=\"true\"\n className=\"relative hidden h-4 w-1.5 overflow-hidden rounded-full bg-muted max-md:inline-flex @max-[48rem]:inline-flex\"\n >\n <span\n className={cn(\n \"absolute inset-x-0 bottom-0 block w-full rounded-full transition-all\",\n barClassName,\n )}\n style={{ height: `${pct}%` }}\n />\n </span>\n </span>\n <span\n data-context-identity=\"percentage\"\n className={cn(\"shrink-0 font-medium tabular-nums\", textClassName)}\n >\n {pct}
|
|
1
|
+
{"version":3,"file":"ContextMeter.bar.js","sources":["../../../src/data/chat/ContextMeter.bar.tsx"],"sourcesContent":["import { UiRobotAi } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { runtimeModeIcon } from \"../runtime/runtime-mode\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { shortContextModelName } from \"./ContextMeter.model\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\n\ntype ContextMeterBarProps = {\n pct: number | undefined;\n provider?: string | undefined;\n executionMode?: string | undefined;\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n effort?: string | undefined;\n barClassName: string;\n textClassName: string;\n className?: string | undefined;\n};\n\nexport function ContextMeterBar({\n pct,\n provider,\n executionMode,\n model,\n modelIcon,\n modelIconClassName,\n effort,\n barClassName,\n textClassName,\n className,\n}: ContextMeterBarProps) {\n const ProviderGlyph = modelIcon ?? providerIcon(provider) ?? UiRobotAi;\n const ModeGlyph = runtimeModeIcon(executionMode);\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground\",\n className,\n )}\n aria-label={pct === undefined ? \"Context unavailable\" : `Context ${pct}% used`}\n >\n <span\n data-context-identity=\"provider\"\n data-context-provider={provider ?? \"unknown\"}\n title={provider ? `Provider: ${provider}` : \"Provider\"}\n className=\"inline-flex shrink-0\"\n >\n <Icon\n icon={ProviderGlyph}\n className={cn(\n \"size-3.5\",\n modelIconClassName ?? providerIconColor(provider),\n )}\n />\n </span>\n {model ? (\n <span\n data-context-identity=\"model\"\n className=\"min-w-0 max-w-32 truncate font-medium text-foreground\"\n title={model}\n >\n {shortContextModelName(model)}\n </span>\n ) : null}\n {ModeGlyph ? (\n <span\n data-context-identity=\"mode\"\n data-context-mode={executionMode}\n title={`Mode: ${executionMode}`}\n className=\"inline-flex shrink-0\"\n >\n <Icon icon={ModeGlyph} className=\"size-3.5\" />\n </span>\n ) : null}\n {EffortGlyph && effort ? (\n <span\n data-context-identity=\"effort\"\n data-context-effort={effort}\n title={`${effortLevelLabel(effort)} effort`}\n className=\"inline-flex shrink-0\"\n >\n <Icon\n icon={EffortGlyph}\n className={cn(\"size-3.5\", effortLevelColor(effort))}\n />\n </span>\n ) : null}\n <span\n data-context-identity=\"progress\"\n className=\"inline-flex shrink-0 items-center\"\n >\n <span\n data-context-progress=\"horizontal\"\n aria-hidden=\"true\"\n className=\"h-1.5 w-16 overflow-hidden rounded-full bg-muted max-md:hidden @max-[48rem]:hidden\"\n >\n <span\n className={cn(\n \"block h-full rounded-full transition-all\",\n barClassName,\n )}\n style={{ width: `${pct ?? 0}%` }}\n />\n </span>\n <span\n data-context-progress=\"vertical\"\n aria-hidden=\"true\"\n className=\"relative hidden h-4 w-1.5 overflow-hidden rounded-full bg-muted max-md:inline-flex @max-[48rem]:inline-flex\"\n >\n <span\n className={cn(\n \"absolute inset-x-0 bottom-0 block w-full rounded-full transition-all\",\n barClassName,\n )}\n style={{ height: `${pct ?? 0}%` }}\n />\n </span>\n </span>\n <span\n data-context-identity=\"percentage\"\n className={cn(\"shrink-0 font-medium tabular-nums\", textClassName)}\n >\n {pct === undefined ? \"—\" : `${pct}%`}\n </span>\n </span>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -91,7 +91,9 @@ function ContextMeter({
|
|
|
91
91
|
},
|
|
92
92
|
[]
|
|
93
93
|
);
|
|
94
|
-
const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));
|
|
94
|
+
const pct = usedPercent === void 0 ? void 0 : Math.min(100, Math.max(0, Math.round(usedPercent)));
|
|
95
|
+
const textTone = pct === void 0 ? "text-muted-foreground" : ContextMeter_styles.contextTextTone(pct);
|
|
96
|
+
const barTone = pct === void 0 ? "bg-muted" : ContextMeter_styles.contextBarTone(pct);
|
|
95
97
|
const totalTokens = (tokens$1 == null ? void 0 : tokens$1.total) ?? 0;
|
|
96
98
|
const totalCost = (cost == null ? void 0 : cost.total) ?? 0;
|
|
97
99
|
const EffortGlyph = effort ? effortIcons.effortLevelIcon(effort) : void 0;
|
|
@@ -141,7 +143,7 @@ function ContextMeter({
|
|
|
141
143
|
"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
|
|
142
144
|
className
|
|
143
145
|
),
|
|
144
|
-
"aria-label": `Context ${pct}% used`,
|
|
146
|
+
"aria-label": pct === void 0 ? "Context unavailable" : `Context ${pct}% used`,
|
|
145
147
|
children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative inline-flex size-9 shrink-0 items-center justify-center", children: [
|
|
146
148
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
147
149
|
"svg",
|
|
@@ -151,7 +153,7 @@ function ContextMeter({
|
|
|
151
153
|
width: "36",
|
|
152
154
|
height: "36",
|
|
153
155
|
viewBox: "0 0 36 36",
|
|
154
|
-
className: utils.cn("absolute inset-0", ContextMeter_styles.contextRingTone(pct)),
|
|
156
|
+
className: utils.cn("absolute inset-0", pct === void 0 ? "text-muted-foreground" : ContextMeter_styles.contextRingTone(pct)),
|
|
155
157
|
children: [
|
|
156
158
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
157
159
|
"circle",
|
|
@@ -175,7 +177,7 @@ function ContextMeter({
|
|
|
175
177
|
stroke: "currentColor",
|
|
176
178
|
strokeWidth: "3",
|
|
177
179
|
strokeDasharray: ContextMeter_styles.GAUGE_CIRCUMFERENCE,
|
|
178
|
-
strokeDashoffset: (1 - pct / 100) * ContextMeter_styles.GAUGE_CIRCUMFERENCE,
|
|
180
|
+
strokeDashoffset: (1 - (pct ?? 0) / 100) * ContextMeter_styles.GAUGE_CIRCUMFERENCE,
|
|
179
181
|
strokeLinecap: "round",
|
|
180
182
|
transform: "rotate(-90 18 18)"
|
|
181
183
|
}
|
|
@@ -194,9 +196,9 @@ function ContextMeter({
|
|
|
194
196
|
{
|
|
195
197
|
className: utils.cn(
|
|
196
198
|
"relative text-[9px] font-semibold tabular-nums",
|
|
197
|
-
|
|
199
|
+
textTone
|
|
198
200
|
),
|
|
199
|
-
children: pct
|
|
201
|
+
children: pct ?? "—"
|
|
200
202
|
}
|
|
201
203
|
)
|
|
202
204
|
] })
|
|
@@ -205,8 +207,8 @@ function ContextMeter({
|
|
|
205
207
|
ContextMeter_bar.ContextMeterBar,
|
|
206
208
|
{
|
|
207
209
|
pct,
|
|
208
|
-
barClassName:
|
|
209
|
-
textClassName:
|
|
210
|
+
barClassName: barTone,
|
|
211
|
+
textClassName: textTone,
|
|
210
212
|
...provider ? { provider } : {},
|
|
211
213
|
...executionMode ? { executionMode } : {},
|
|
212
214
|
...model ? { model } : {},
|
|
@@ -226,14 +228,11 @@ function ContextMeter({
|
|
|
226
228
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2.5 text-xs", children: [
|
|
227
229
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
228
230
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Context usage" }),
|
|
229
|
-
/* @__PURE__ */ jsxRuntime.
|
|
231
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
230
232
|
"span",
|
|
231
233
|
{
|
|
232
|
-
className: utils.cn("font-semibold tabular-nums",
|
|
233
|
-
children:
|
|
234
|
-
pct,
|
|
235
|
-
"%"
|
|
236
|
-
]
|
|
234
|
+
className: utils.cn("font-semibold tabular-nums", textTone),
|
|
235
|
+
children: pct === void 0 ? "Unavailable" : `${pct}%`
|
|
237
236
|
}
|
|
238
237
|
)
|
|
239
238
|
] }),
|
|
@@ -307,20 +306,20 @@ function ContextMeter({
|
|
|
307
306
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
308
307
|
"div",
|
|
309
308
|
{
|
|
310
|
-
className: utils.cn("h-full rounded-full",
|
|
311
|
-
style: { width: `${pct}%` }
|
|
309
|
+
className: utils.cn("h-full rounded-full", barTone),
|
|
310
|
+
style: { width: `${pct ?? 0}%` }
|
|
312
311
|
}
|
|
313
312
|
) }),
|
|
314
|
-
windowTokens ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
313
|
+
windowTokens !== void 0 && usedTokens !== void 0 && pct !== void 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
315
314
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
316
315
|
Row,
|
|
317
316
|
{
|
|
318
317
|
label: "Window",
|
|
319
|
-
value: `${tokens.compactTokens(usedTokens
|
|
318
|
+
value: `${tokens.compactTokens(usedTokens)} / ${tokens.compactTokens(windowTokens)}`
|
|
320
319
|
}
|
|
321
320
|
),
|
|
322
321
|
/* @__PURE__ */ jsxRuntime.jsx(Row, { label: "Free", value: `${100 - pct}%` })
|
|
323
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx(Row, { label: "Used", value: `${pct}%` }),
|
|
322
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(Row, { label: "Used", value: pct === void 0 ? "Unavailable" : `${pct}%` }),
|
|
324
323
|
messageCount != null ? /* @__PURE__ */ jsxRuntime.jsx(Row, { label: "Messages", value: String(messageCount) }) : null
|
|
325
324
|
] }),
|
|
326
325
|
(totalTokens > 0 || totalCost > 0 || budget) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 border-t border-border pt-2", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.cjs","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { ContextMeterBar } from \"./ContextMeter.bar\";\nimport {\n contextBarTone,\n contextRingTone,\n contextTextTone,\n COPY_STATUS_RESET_MS,\n GAUGE_CIRCUMFERENCE,\n GAUGE_RADIUS,\n} from \"./ContextMeter.styles\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent: number;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Provider family that produced the terminal chat turn: anthropic, openai, … */\n provider?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n provider,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", contextRingTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - pct / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n contextTextTone(pct),\n )}\n >\n {pct}\n </span>\n )}\n </span>\n </span>\n ) : (\n <ContextMeterBar\n pct={pct}\n barClassName={contextBarTone(pct)}\n textClassName={contextTextTone(pct)}\n {...(provider ? { provider } : {})}\n {...(executionMode ? { executionMode } : {})}\n {...(model ? { model } : {})}\n {...(Glyph ? { modelIcon: Glyph } : {})}\n {...(modelIconClassName ? { modelIconClassName } : {})}\n {...(effort ? { effort } : {})}\n {...(className ? { className } : {})}\n />\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span\n className={cn(\"font-semibold tabular-nums\", contextTextTone(pct))}\n >\n {pct}%\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || provider || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {provider ? <Row label=\"Provider\" value={provider} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", contextBarTone(pct))}\n style={{ width: `${pct}%` }}\n />\n </div>\n {windowTokens ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens ?? 0)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={`${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : budget?.used != null && budget.used > 0 ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":["jsxs","jsx","tokens","compactTokens","formatCost","useState","useRef","useEffect","effortLevelIcon","effortLevelColor","COPY_STATUS_RESET_MS","cn","contextRingTone","GAUGE_RADIUS","GAUGE_CIRCUMFERENCE","Icon","contextTextTone","ContextMeterBar","contextBarTone","HoverCard","effortLevelLabel","UiCheck","UiCopy","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextMeter.cjs","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { ContextMeterBar } from \"./ContextMeter.bar\";\nimport {\n contextBarTone,\n contextRingTone,\n contextTextTone,\n COPY_STATUS_RESET_MS,\n GAUGE_CIRCUMFERENCE,\n GAUGE_RADIUS,\n} from \"./ContextMeter.styles\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent?: number | undefined;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Provider family that produced the terminal chat turn: anthropic, openai, … */\n provider?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n provider,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = usedPercent === undefined ? undefined : Math.min(100, Math.max(0, Math.round(usedPercent)));\n const textTone = pct === undefined ? \"text-muted-foreground\" : contextTextTone(pct);\n const barTone = pct === undefined ? \"bg-muted\" : contextBarTone(pct);\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={pct === undefined ? \"Context unavailable\" : `Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", pct === undefined ? \"text-muted-foreground\" : contextRingTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - (pct ?? 0) / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n textTone,\n )}\n >\n {pct ?? \"—\"}\n </span>\n )}\n </span>\n </span>\n ) : (\n <ContextMeterBar\n pct={pct}\n barClassName={barTone}\n textClassName={textTone}\n {...(provider ? { provider } : {})}\n {...(executionMode ? { executionMode } : {})}\n {...(model ? { model } : {})}\n {...(Glyph ? { modelIcon: Glyph } : {})}\n {...(modelIconClassName ? { modelIconClassName } : {})}\n {...(effort ? { effort } : {})}\n {...(className ? { className } : {})}\n />\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span\n className={cn(\"font-semibold tabular-nums\", textTone)}\n >\n {pct === undefined ? \"Unavailable\" : `${pct}%`}\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || provider || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {provider ? <Row label=\"Provider\" value={provider} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", barTone)}\n style={{ width: `${pct ?? 0}%` }}\n />\n </div>\n {windowTokens !== undefined && usedTokens !== undefined && pct !== undefined ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={pct === undefined ? \"Unavailable\" : `${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : budget?.used != null && budget.used > 0 ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":["jsxs","jsx","tokens","compactTokens","formatCost","useState","useRef","useEffect","contextTextTone","contextBarTone","effortLevelIcon","effortLevelColor","COPY_STATUS_RESET_MS","cn","contextRingTone","GAUGE_RADIUS","GAUGE_CIRCUMFERENCE","Icon","ContextMeterBar","HoverCard","effortLevelLabel","UiCheck","UiCopy","Fragment"],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export type ContextMeterProps = {
|
|
|
26
26
|
* (chat toolbar). Both open the same hover popover. */
|
|
27
27
|
mode?: ContextMeterMode;
|
|
28
28
|
/** Share of the context window used, 0–100 — drives the fill and tone. */
|
|
29
|
-
usedPercent
|
|
29
|
+
usedPercent?: number | undefined;
|
|
30
30
|
/** Context-window tokens shown in the popover. */
|
|
31
31
|
usedTokens?: number | undefined;
|
|
32
32
|
windowTokens?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAiBzD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;4DACwD;IACxD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextMeter.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -89,7 +89,9 @@ function ContextMeter({
|
|
|
89
89
|
},
|
|
90
90
|
[]
|
|
91
91
|
);
|
|
92
|
-
const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));
|
|
92
|
+
const pct = usedPercent === void 0 ? void 0 : Math.min(100, Math.max(0, Math.round(usedPercent)));
|
|
93
|
+
const textTone = pct === void 0 ? "text-muted-foreground" : contextTextTone(pct);
|
|
94
|
+
const barTone = pct === void 0 ? "bg-muted" : contextBarTone(pct);
|
|
93
95
|
const totalTokens = (tokens == null ? void 0 : tokens.total) ?? 0;
|
|
94
96
|
const totalCost = (cost == null ? void 0 : cost.total) ?? 0;
|
|
95
97
|
const EffortGlyph = effort ? effortLevelIcon(effort) : void 0;
|
|
@@ -139,7 +141,7 @@ function ContextMeter({
|
|
|
139
141
|
"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
|
|
140
142
|
className
|
|
141
143
|
),
|
|
142
|
-
"aria-label": `Context ${pct}% used`,
|
|
144
|
+
"aria-label": pct === void 0 ? "Context unavailable" : `Context ${pct}% used`,
|
|
143
145
|
children: /* @__PURE__ */ jsxs("span", { className: "relative inline-flex size-9 shrink-0 items-center justify-center", children: [
|
|
144
146
|
/* @__PURE__ */ jsxs(
|
|
145
147
|
"svg",
|
|
@@ -149,7 +151,7 @@ function ContextMeter({
|
|
|
149
151
|
width: "36",
|
|
150
152
|
height: "36",
|
|
151
153
|
viewBox: "0 0 36 36",
|
|
152
|
-
className: cn("absolute inset-0", contextRingTone(pct)),
|
|
154
|
+
className: cn("absolute inset-0", pct === void 0 ? "text-muted-foreground" : contextRingTone(pct)),
|
|
153
155
|
children: [
|
|
154
156
|
/* @__PURE__ */ jsx(
|
|
155
157
|
"circle",
|
|
@@ -173,7 +175,7 @@ function ContextMeter({
|
|
|
173
175
|
stroke: "currentColor",
|
|
174
176
|
strokeWidth: "3",
|
|
175
177
|
strokeDasharray: GAUGE_CIRCUMFERENCE,
|
|
176
|
-
strokeDashoffset: (1 - pct / 100) * GAUGE_CIRCUMFERENCE,
|
|
178
|
+
strokeDashoffset: (1 - (pct ?? 0) / 100) * GAUGE_CIRCUMFERENCE,
|
|
177
179
|
strokeLinecap: "round",
|
|
178
180
|
transform: "rotate(-90 18 18)"
|
|
179
181
|
}
|
|
@@ -192,9 +194,9 @@ function ContextMeter({
|
|
|
192
194
|
{
|
|
193
195
|
className: cn(
|
|
194
196
|
"relative text-[9px] font-semibold tabular-nums",
|
|
195
|
-
|
|
197
|
+
textTone
|
|
196
198
|
),
|
|
197
|
-
children: pct
|
|
199
|
+
children: pct ?? "—"
|
|
198
200
|
}
|
|
199
201
|
)
|
|
200
202
|
] })
|
|
@@ -203,8 +205,8 @@ function ContextMeter({
|
|
|
203
205
|
ContextMeterBar,
|
|
204
206
|
{
|
|
205
207
|
pct,
|
|
206
|
-
barClassName:
|
|
207
|
-
textClassName:
|
|
208
|
+
barClassName: barTone,
|
|
209
|
+
textClassName: textTone,
|
|
208
210
|
...provider ? { provider } : {},
|
|
209
211
|
...executionMode ? { executionMode } : {},
|
|
210
212
|
...model ? { model } : {},
|
|
@@ -224,14 +226,11 @@ function ContextMeter({
|
|
|
224
226
|
children: /* @__PURE__ */ jsxs("div", { className: "space-y-2.5 text-xs", children: [
|
|
225
227
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
226
228
|
/* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Context usage" }),
|
|
227
|
-
/* @__PURE__ */
|
|
229
|
+
/* @__PURE__ */ jsx(
|
|
228
230
|
"span",
|
|
229
231
|
{
|
|
230
|
-
className: cn("font-semibold tabular-nums",
|
|
231
|
-
children:
|
|
232
|
-
pct,
|
|
233
|
-
"%"
|
|
234
|
-
]
|
|
232
|
+
className: cn("font-semibold tabular-nums", textTone),
|
|
233
|
+
children: pct === void 0 ? "Unavailable" : `${pct}%`
|
|
235
234
|
}
|
|
236
235
|
)
|
|
237
236
|
] }),
|
|
@@ -305,20 +304,20 @@ function ContextMeter({
|
|
|
305
304
|
/* @__PURE__ */ jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx(
|
|
306
305
|
"div",
|
|
307
306
|
{
|
|
308
|
-
className: cn("h-full rounded-full",
|
|
309
|
-
style: { width: `${pct}%` }
|
|
307
|
+
className: cn("h-full rounded-full", barTone),
|
|
308
|
+
style: { width: `${pct ?? 0}%` }
|
|
310
309
|
}
|
|
311
310
|
) }),
|
|
312
|
-
windowTokens ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
311
|
+
windowTokens !== void 0 && usedTokens !== void 0 && pct !== void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
313
312
|
/* @__PURE__ */ jsx(
|
|
314
313
|
Row,
|
|
315
314
|
{
|
|
316
315
|
label: "Window",
|
|
317
|
-
value: `${compactTokens(usedTokens
|
|
316
|
+
value: `${compactTokens(usedTokens)} / ${compactTokens(windowTokens)}`
|
|
318
317
|
}
|
|
319
318
|
),
|
|
320
319
|
/* @__PURE__ */ jsx(Row, { label: "Free", value: `${100 - pct}%` })
|
|
321
|
-
] }) : /* @__PURE__ */ jsx(Row, { label: "Used", value: `${pct}%` }),
|
|
320
|
+
] }) : /* @__PURE__ */ jsx(Row, { label: "Used", value: pct === void 0 ? "Unavailable" : `${pct}%` }),
|
|
322
321
|
messageCount != null ? /* @__PURE__ */ jsx(Row, { label: "Messages", value: String(messageCount) }) : null
|
|
323
322
|
] }),
|
|
324
323
|
(totalTokens > 0 || totalCost > 0 || budget) && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 border-t border-border pt-2", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.js","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { ContextMeterBar } from \"./ContextMeter.bar\";\nimport {\n contextBarTone,\n contextRingTone,\n contextTextTone,\n COPY_STATUS_RESET_MS,\n GAUGE_CIRCUMFERENCE,\n GAUGE_RADIUS,\n} from \"./ContextMeter.styles\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent: number;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Provider family that produced the terminal chat turn: anthropic, openai, … */\n provider?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n provider,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", contextRingTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - pct / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n contextTextTone(pct),\n )}\n >\n {pct}\n </span>\n )}\n </span>\n </span>\n ) : (\n <ContextMeterBar\n pct={pct}\n barClassName={contextBarTone(pct)}\n textClassName={contextTextTone(pct)}\n {...(provider ? { provider } : {})}\n {...(executionMode ? { executionMode } : {})}\n {...(model ? { model } : {})}\n {...(Glyph ? { modelIcon: Glyph } : {})}\n {...(modelIconClassName ? { modelIconClassName } : {})}\n {...(effort ? { effort } : {})}\n {...(className ? { className } : {})}\n />\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span\n className={cn(\"font-semibold tabular-nums\", contextTextTone(pct))}\n >\n {pct}%\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || provider || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {provider ? <Row label=\"Provider\" value={provider} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", contextBarTone(pct))}\n style={{ width: `${pct}%` }}\n />\n </div>\n {windowTokens ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens ?? 0)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={`${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : budget?.used != null && budget.used > 0 ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextMeter.js","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { ContextMeterBar } from \"./ContextMeter.bar\";\nimport {\n contextBarTone,\n contextRingTone,\n contextTextTone,\n COPY_STATUS_RESET_MS,\n GAUGE_CIRCUMFERENCE,\n GAUGE_RADIUS,\n} from \"./ContextMeter.styles\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent?: number | undefined;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Provider family that produced the terminal chat turn: anthropic, openai, … */\n provider?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n provider,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = usedPercent === undefined ? undefined : Math.min(100, Math.max(0, Math.round(usedPercent)));\n const textTone = pct === undefined ? \"text-muted-foreground\" : contextTextTone(pct);\n const barTone = pct === undefined ? \"bg-muted\" : contextBarTone(pct);\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={pct === undefined ? \"Context unavailable\" : `Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", pct === undefined ? \"text-muted-foreground\" : contextRingTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - (pct ?? 0) / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n textTone,\n )}\n >\n {pct ?? \"—\"}\n </span>\n )}\n </span>\n </span>\n ) : (\n <ContextMeterBar\n pct={pct}\n barClassName={barTone}\n textClassName={textTone}\n {...(provider ? { provider } : {})}\n {...(executionMode ? { executionMode } : {})}\n {...(model ? { model } : {})}\n {...(Glyph ? { modelIcon: Glyph } : {})}\n {...(modelIconClassName ? { modelIconClassName } : {})}\n {...(effort ? { effort } : {})}\n {...(className ? { className } : {})}\n />\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span\n className={cn(\"font-semibold tabular-nums\", textTone)}\n >\n {pct === undefined ? \"Unavailable\" : `${pct}%`}\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || provider || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {provider ? <Row label=\"Provider\" value={provider} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", barTone)}\n style={{ width: `${pct ?? 0}%` }}\n />\n </div>\n {windowTokens !== undefined && usedTokens !== undefined && pct !== undefined ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={pct === undefined ? \"Unavailable\" : `${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : budget?.used != null && budget.used > 0 ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -17,13 +17,14 @@ function Conversation({
|
|
|
17
17
|
onClearError,
|
|
18
18
|
sessionId,
|
|
19
19
|
model,
|
|
20
|
+
suppressWaiting,
|
|
20
21
|
emptyState,
|
|
21
22
|
className,
|
|
22
23
|
...actions
|
|
23
24
|
}) {
|
|
24
25
|
const scrollRef = react.useRef(null);
|
|
25
26
|
const [pinned, setPinned] = react.useState(true);
|
|
26
|
-
const isWaiting = status === "submitted" || status === "streaming" && !hasVisibleAssistantResponse(messages);
|
|
27
|
+
const isWaiting = !suppressWaiting && (status === "submitted" || status === "streaming" && !hasVisibleAssistantResponse(messages));
|
|
27
28
|
const errorText = (error == null ? void 0 : error.message) || (status === "error" ? "The assistant request failed." : void 0);
|
|
28
29
|
const onScroll = () => {
|
|
29
30
|
const el = scrollRef.current;
|