@flanksource/clicky-ui 0.3.44 → 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/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/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 +26 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +1 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +24 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +28 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +24 -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
|
@@ -78,7 +78,7 @@ const TEXT_TURN = [
|
|
|
78
78
|
type: "finish",
|
|
79
79
|
messageMetadata: {
|
|
80
80
|
usage: { inputTokens: 920, outputTokens: 280, totalTokens: 1200 },
|
|
81
|
-
|
|
81
|
+
context: { usedTokens: 1200, windowTokens: 128e3, freePercent: 99 },
|
|
82
82
|
cost: 4e-3
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -107,7 +107,7 @@ const TOOL_TURN = [
|
|
|
107
107
|
type: "finish",
|
|
108
108
|
messageMetadata: {
|
|
109
109
|
usage: { inputTokens: 2600, outputTokens: 800, totalTokens: 3400 },
|
|
110
|
-
|
|
110
|
+
context: { usedTokens: 3400, windowTokens: 128e3, freePercent: 97 },
|
|
111
111
|
cost: 0.011
|
|
112
112
|
}
|
|
113
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.fixtures.js","sources":["../../../src/data/chat/Chat.fixtures.ts"],"sourcesContent":["import type { ChatTransport, UIMessage, UIMessageChunk } from \"ai\";\nimport type { ChatModel } from \"./types\";\n\n/** A sample model menu for stories driving the runtime selector. */\nexport const MOCK_MODELS: ChatModel[] = [\n {\n id: \"anthropic/claude-sonnet-4-5\",\n provider: \"anthropic\",\n label: \"Claude Sonnet 4.5\",\n reasoning: true,\n capabilitiesKnown: true,\n supportedEfforts: [\"low\", \"medium\", \"high\"],\n defaultEffort: \"medium\",\n configured: true,\n contextWindow: 200_000,\n runtime: {\n id: \"anthropic/claude-sonnet-4-5\",\n model: \"claude-sonnet-4-5\",\n mode: \"api\",\n effort: \"medium\",\n },\n },\n {\n id: \"openai/gpt-4o\",\n provider: \"openai\",\n label: \"GPT-4o\",\n reasoning: false,\n capabilitiesKnown: true,\n configured: true,\n contextWindow: 128_000,\n runtime: {\n id: \"openai/gpt-4o\",\n model: \"gpt-4o\",\n mode: \"api\",\n },\n },\n {\n id: \"googleai/gemini-2.5-pro\",\n provider: \"googleai\",\n label: \"Gemini 2.5 Pro\",\n reasoning: true,\n capabilitiesKnown: true,\n supportedEfforts: [\"low\", \"high\"],\n defaultEffort: \"high\",\n configured: false,\n contextWindow: 1_048_576,\n runtime: {\n id: \"googleai/gemini-2.5-pro\",\n model: \"gemini-2.5-pro\",\n mode: \"api\",\n effort: \"high\",\n },\n },\n];\n\n/** A seeded conversation that already contains a completed tool call, so a\n * story shows the collapsible tool-call panel (args → result) on load, without\n * the user sending a message. clicky operations surface as dynamic tools. */\nexport const SAMPLE_TOOL_MESSAGES: UIMessage[] = [\n { id: \"u1\", role: \"user\", parts: [{ type: \"text\", text: \"List the pods in default\" }] },\n {\n id: \"a1\",\n role: \"assistant\",\n parts: [\n {\n type: \"dynamic-tool\",\n toolCallId: \"call_listPods\",\n toolName: \"listPods\",\n state: \"output-available\",\n input: { namespace: \"default\", limit: 5 },\n output: { count: 2, pods: [\"api-7c9\", \"worker-1f2\"] },\n },\n { type: \"text\", text: \"Found **2 pods** in `default`: `api-7c9` and `worker-1f2`.\" },\n ],\n },\n];\n\n/** Emits the given chunks as a ReadableStream, with a small delay between each\n * so the UI visibly streams in Storybook. */\nfunction streamChunks(chunks: UIMessageChunk[], delayMs: number): ReadableStream<UIMessageChunk> {\n let i = 0;\n return new ReadableStream<UIMessageChunk>({\n pull(controller) {\n if (i >= chunks.length) {\n controller.close();\n return;\n }\n const chunk = chunks[i++];\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n controller.enqueue(chunk);\n resolve();\n }, delayMs);\n });\n },\n });\n}\n\nconst TEXT_TURN: UIMessageChunk[] = [\n { type: \"start\" },\n { type: \"start-step\" },\n { type: \"text-start\", id: \"t0\" },\n { type: \"text-delta\", id: \"t0\", delta: \"Here is **markdown** with a list:\\n\\n\" },\n { type: \"text-delta\", id: \"t0\", delta: \"- one\\n- two\\n- three\" },\n { type: \"text-end\", id: \"t0\" },\n { type: \"finish-step\" },\n {\n type: \"finish\",\n messageMetadata: {\n usage: { inputTokens: 920, outputTokens: 280, totalTokens: 1200 },\n
|
|
1
|
+
{"version":3,"file":"Chat.fixtures.js","sources":["../../../src/data/chat/Chat.fixtures.ts"],"sourcesContent":["import type { ChatTransport, UIMessage, UIMessageChunk } from \"ai\";\nimport type { ChatModel } from \"./types\";\n\n/** A sample model menu for stories driving the runtime selector. */\nexport const MOCK_MODELS: ChatModel[] = [\n {\n id: \"anthropic/claude-sonnet-4-5\",\n provider: \"anthropic\",\n label: \"Claude Sonnet 4.5\",\n reasoning: true,\n capabilitiesKnown: true,\n supportedEfforts: [\"low\", \"medium\", \"high\"],\n defaultEffort: \"medium\",\n configured: true,\n contextWindow: 200_000,\n runtime: {\n id: \"anthropic/claude-sonnet-4-5\",\n model: \"claude-sonnet-4-5\",\n mode: \"api\",\n effort: \"medium\",\n },\n },\n {\n id: \"openai/gpt-4o\",\n provider: \"openai\",\n label: \"GPT-4o\",\n reasoning: false,\n capabilitiesKnown: true,\n configured: true,\n contextWindow: 128_000,\n runtime: {\n id: \"openai/gpt-4o\",\n model: \"gpt-4o\",\n mode: \"api\",\n },\n },\n {\n id: \"googleai/gemini-2.5-pro\",\n provider: \"googleai\",\n label: \"Gemini 2.5 Pro\",\n reasoning: true,\n capabilitiesKnown: true,\n supportedEfforts: [\"low\", \"high\"],\n defaultEffort: \"high\",\n configured: false,\n contextWindow: 1_048_576,\n runtime: {\n id: \"googleai/gemini-2.5-pro\",\n model: \"gemini-2.5-pro\",\n mode: \"api\",\n effort: \"high\",\n },\n },\n];\n\n/** A seeded conversation that already contains a completed tool call, so a\n * story shows the collapsible tool-call panel (args → result) on load, without\n * the user sending a message. clicky operations surface as dynamic tools. */\nexport const SAMPLE_TOOL_MESSAGES: UIMessage[] = [\n { id: \"u1\", role: \"user\", parts: [{ type: \"text\", text: \"List the pods in default\" }] },\n {\n id: \"a1\",\n role: \"assistant\",\n parts: [\n {\n type: \"dynamic-tool\",\n toolCallId: \"call_listPods\",\n toolName: \"listPods\",\n state: \"output-available\",\n input: { namespace: \"default\", limit: 5 },\n output: { count: 2, pods: [\"api-7c9\", \"worker-1f2\"] },\n },\n { type: \"text\", text: \"Found **2 pods** in `default`: `api-7c9` and `worker-1f2`.\" },\n ],\n },\n];\n\n/** Emits the given chunks as a ReadableStream, with a small delay between each\n * so the UI visibly streams in Storybook. */\nfunction streamChunks(chunks: UIMessageChunk[], delayMs: number): ReadableStream<UIMessageChunk> {\n let i = 0;\n return new ReadableStream<UIMessageChunk>({\n pull(controller) {\n if (i >= chunks.length) {\n controller.close();\n return;\n }\n const chunk = chunks[i++];\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n controller.enqueue(chunk);\n resolve();\n }, delayMs);\n });\n },\n });\n}\n\nconst TEXT_TURN: UIMessageChunk[] = [\n { type: \"start\" },\n { type: \"start-step\" },\n { type: \"text-start\", id: \"t0\" },\n { type: \"text-delta\", id: \"t0\", delta: \"Here is **markdown** with a list:\\n\\n\" },\n { type: \"text-delta\", id: \"t0\", delta: \"- one\\n- two\\n- three\" },\n { type: \"text-end\", id: \"t0\" },\n { type: \"finish-step\" },\n {\n type: \"finish\",\n messageMetadata: {\n usage: { inputTokens: 920, outputTokens: 280, totalTokens: 1200 },\n context: { usedTokens: 1200, windowTokens: 128_000, freePercent: 99 },\n cost: 0.004,\n },\n },\n];\n\nconst TOOL_TURN: UIMessageChunk[] = [\n { type: \"start\" },\n { type: \"start-step\" },\n {\n type: \"tool-input-available\",\n toolCallId: \"call_1\",\n toolName: \"listPods\",\n input: { namespace: \"default\", limit: 5 },\n dynamic: true,\n },\n {\n type: \"tool-output-available\",\n toolCallId: \"call_1\",\n output: { count: 2, pods: [\"api-7c9\", \"worker-1f2\"] },\n dynamic: true,\n },\n { type: \"text-start\", id: \"t1\" },\n { type: \"text-delta\", id: \"t1\", delta: \"Found **2 pods** in `default`.\" },\n { type: \"text-end\", id: \"t1\" },\n { type: \"finish-step\" },\n {\n type: \"finish\",\n messageMetadata: {\n usage: { inputTokens: 2600, outputTokens: 800, totalTokens: 3400 },\n context: { usedTokens: 3400, windowTokens: 128_000, freePercent: 97 },\n cost: 0.011,\n },\n },\n];\n\nconst REASONING_TURN: UIMessageChunk[] = [\n { type: \"start\" },\n { type: \"start-step\" },\n { type: \"reasoning-start\", id: \"r0\" },\n { type: \"reasoning-delta\", id: \"r0\", delta: \"The user wants pods. I'll call listPods, then summarize.\" },\n { type: \"reasoning-end\", id: \"r0\" },\n { type: \"text-start\", id: \"t2\" },\n { type: \"text-delta\", id: \"t2\", delta: \"Let me check the pods.\" },\n { type: \"text-end\", id: \"t2\" },\n { type: \"finish-step\" },\n { type: \"finish\" },\n];\n\nconst APPROVAL_TURN: UIMessageChunk[] = [\n { type: \"start\" },\n { type: \"start-step\" },\n { type: \"text-start\", id: \"t3\" },\n { type: \"text-delta\", id: \"t3\", delta: \"This will restart the service.\" },\n { type: \"text-end\", id: \"t3\" },\n {\n type: \"tool-input-available\",\n toolCallId: \"call_restart\",\n toolName: \"restartService\",\n input: { service: \"api\", confirm: true },\n dynamic: true,\n },\n { type: \"tool-approval-request\", approvalId: \"call_restart\", toolCallId: \"call_restart\" },\n { type: \"finish-step\" },\n { type: \"finish\" },\n];\n\n/** A mock ChatTransport that replies with a markdown text turn, then a tool\n * round-trip turn on the next submission. Use in stories/tests to drive the\n * Chat UI without a backend. */\nexport function mockChatTransport(delayMs = 120): ChatTransport<UIMessage> {\n let calls = 0;\n return {\n sendMessages() {\n const chunks = calls++ === 0 ? TEXT_TURN : TOOL_TURN;\n return Promise.resolve(streamChunks(chunks, delayMs));\n },\n reconnectToStream() {\n return Promise.resolve(null);\n },\n };\n}\n\n/** A mock transport whose first turn requests tool approval, and whose resume\n * (after the user approves/denies) completes the tool and replies. */\nexport function mockApprovalTransport(delayMs = 120): ChatTransport<UIMessage> {\n let calls = 0;\n return {\n sendMessages() {\n const chunks = calls++ === 0 ? APPROVAL_TURN : TOOL_TURN;\n return Promise.resolve(streamChunks(chunks, delayMs));\n },\n reconnectToStream() {\n return Promise.resolve(null);\n },\n };\n}\n\n/** A mock transport that streams a reasoning (\"thinking\") block before its\n * answer. */\nexport function mockReasoningTransport(delayMs = 120): ChatTransport<UIMessage> {\n return {\n sendMessages() {\n return Promise.resolve(streamChunks(REASONING_TURN, delayMs));\n },\n reconnectToStream() {\n return Promise.resolve(null);\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/data/chat/Chat.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useRef, useMemo, useEffect } from "react";
|
|
2
|
+
import { useState, useRef, useMemo, useEffect, useCallback } from "react";
|
|
3
3
|
import { useChat } from "@ai-sdk/react";
|
|
4
4
|
import { DefaultChatTransport } from "ai";
|
|
5
5
|
import { cn } from "../../lib/utils.js";
|
|
@@ -74,6 +74,9 @@ function Chat({
|
|
|
74
74
|
);
|
|
75
75
|
const [usage, setUsage] = useState(null);
|
|
76
76
|
const [approvalError, setApprovalError] = useState();
|
|
77
|
+
const [approvalsInFlight, setApprovalsInFlight] = useState(
|
|
78
|
+
() => /* @__PURE__ */ new Map()
|
|
79
|
+
);
|
|
77
80
|
const lastDefaultModel = useRef(defaultModel);
|
|
78
81
|
const [draft, setDraft] = useState(null);
|
|
79
82
|
const seededInitialPromptId = useRef(null);
|
|
@@ -174,11 +177,20 @@ function Chat({
|
|
|
174
177
|
const setMessagesRef = useRef(setMessages);
|
|
175
178
|
setMessagesRef.current = setMessages;
|
|
176
179
|
const hydratedUsageRef = useRef(null);
|
|
180
|
+
const hydratedAssistantRef = useRef(void 0);
|
|
181
|
+
const applySession = useCallback((session) => {
|
|
182
|
+
const snapshot = usageSnapshotFromSession(session);
|
|
183
|
+
hydratedUsageRef.current = snapshot;
|
|
184
|
+
hydratedAssistantRef.current = [...session.messages].reverse().find((message) => message.role === "assistant");
|
|
185
|
+
setUsage(snapshot);
|
|
186
|
+
setMessagesRef.current(session.messages);
|
|
187
|
+
}, []);
|
|
177
188
|
useEffect(() => {
|
|
178
189
|
if (!sessionsApi || !threadId) return;
|
|
179
190
|
let cancelled = false;
|
|
180
191
|
setApprovalError(void 0);
|
|
181
192
|
hydratedUsageRef.current = null;
|
|
193
|
+
hydratedAssistantRef.current = void 0;
|
|
182
194
|
setUsage(null);
|
|
183
195
|
setMessagesRef.current([]);
|
|
184
196
|
void getChatSession(sessionsApi, threadId).then((session) => {
|
|
@@ -189,10 +201,7 @@ function Chat({
|
|
|
189
201
|
`Captain chat session response ID "${session.id}" does not match requested session "${threadId}".`
|
|
190
202
|
);
|
|
191
203
|
}
|
|
192
|
-
|
|
193
|
-
hydratedUsageRef.current = snapshot;
|
|
194
|
-
setUsage(snapshot);
|
|
195
|
-
setMessagesRef.current(session.messages);
|
|
204
|
+
applySession(session);
|
|
196
205
|
(_a = onSessionHydratedRef.current) == null ? void 0 : _a.call(onSessionHydratedRef, session);
|
|
197
206
|
}).catch((cause) => {
|
|
198
207
|
if (cancelled) return;
|
|
@@ -203,7 +212,7 @@ function Chat({
|
|
|
203
212
|
return () => {
|
|
204
213
|
cancelled = true;
|
|
205
214
|
};
|
|
206
|
-
}, [sessionsApi, threadId]);
|
|
215
|
+
}, [applySession, sessionsApi, threadId]);
|
|
207
216
|
useEffect(() => {
|
|
208
217
|
var _a;
|
|
209
218
|
(_a = onMessageCountChangeRef.current) == null ? void 0 : _a.call(
|
|
@@ -223,26 +232,26 @@ function Chat({
|
|
|
223
232
|
const onUsageRef = useRef(onUsage);
|
|
224
233
|
onUsageRef.current = onUsage;
|
|
225
234
|
useEffect(() => {
|
|
226
|
-
var _a, _b;
|
|
235
|
+
var _a, _b, _c, _d;
|
|
227
236
|
if (status !== "ready") return;
|
|
228
237
|
const last = [...messages].reverse().find((m) => m.role === "assistant");
|
|
238
|
+
if (hydratedUsageRef.current && (last == null ? void 0 : last.id) === ((_a = hydratedAssistantRef.current) == null ? void 0 : _a.id) && (last == null ? void 0 : last.metadata) === ((_b = hydratedAssistantRef.current) == null ? void 0 : _b.metadata)) {
|
|
239
|
+
setUsage(hydratedUsageRef.current);
|
|
240
|
+
(_c = onUsageRef.current) == null ? void 0 : _c.call(onUsageRef, hydratedUsageRef.current);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
229
243
|
const meta = last == null ? void 0 : last.metadata;
|
|
230
244
|
if (!meta) {
|
|
231
|
-
setUsage(
|
|
232
|
-
if (hydratedUsageRef.current) {
|
|
233
|
-
(_a = onUsageRef.current) == null ? void 0 : _a.call(onUsageRef, hydratedUsageRef.current);
|
|
234
|
-
}
|
|
245
|
+
setUsage(null);
|
|
235
246
|
return;
|
|
236
247
|
}
|
|
237
248
|
const settledModel = meta.model ? selectedChatModel(models, { id: meta.model, model: meta.model }) : void 0;
|
|
238
249
|
const snapshot = usageSnapshotFromMetadata(meta, {
|
|
239
|
-
contextWindow: settledModel == null ? void 0 : settledModel.contextWindow,
|
|
240
250
|
modelLabel: settledModel == null ? void 0 : settledModel.label,
|
|
241
251
|
messageCount: messages.length
|
|
242
252
|
});
|
|
243
|
-
hydratedUsageRef.current = snapshot;
|
|
244
253
|
setUsage(snapshot);
|
|
245
|
-
(
|
|
254
|
+
(_d = onUsageRef.current) == null ? void 0 : _d.call(onUsageRef, snapshot);
|
|
246
255
|
}, [messages, models, status]);
|
|
247
256
|
const handleRuntimeChange = (next) => {
|
|
248
257
|
if (controlledRuntime === void 0) setInternalRuntime(next);
|
|
@@ -260,6 +269,9 @@ function Chat({
|
|
|
260
269
|
const resolveToolApproval = async (id, approved, reason) => {
|
|
261
270
|
const approvalThreadId = threadId;
|
|
262
271
|
setApprovalError(void 0);
|
|
272
|
+
setApprovalsInFlight(
|
|
273
|
+
(counts) => new Map(counts).set(approvalThreadId, (counts.get(approvalThreadId) ?? 0) + 1)
|
|
274
|
+
);
|
|
263
275
|
try {
|
|
264
276
|
if (!sessionsApi) {
|
|
265
277
|
throw new Error(
|
|
@@ -279,12 +291,23 @@ function Chat({
|
|
|
279
291
|
`Captain chat session response ID "${session.id}" does not match active session "${approvalThreadId ?? ""}".`
|
|
280
292
|
);
|
|
281
293
|
}
|
|
282
|
-
|
|
294
|
+
applySession(session);
|
|
283
295
|
} catch (cause) {
|
|
284
296
|
if (activeThreadRef.current !== approvalThreadId) return;
|
|
285
297
|
setApprovalError(
|
|
286
298
|
cause instanceof Error ? cause : new Error(String(cause))
|
|
287
299
|
);
|
|
300
|
+
} finally {
|
|
301
|
+
setApprovalsInFlight((counts) => {
|
|
302
|
+
const count = counts.get(approvalThreadId);
|
|
303
|
+
if (count === void 0 || count < 1) {
|
|
304
|
+
throw new Error("Tool approval completed without a pending request.");
|
|
305
|
+
}
|
|
306
|
+
const next = new Map(counts);
|
|
307
|
+
if (count === 1) next.delete(approvalThreadId);
|
|
308
|
+
else next.set(approvalThreadId, count - 1);
|
|
309
|
+
return next;
|
|
310
|
+
});
|
|
288
311
|
}
|
|
289
312
|
};
|
|
290
313
|
const toolbar = /* @__PURE__ */ jsx(
|
|
@@ -320,9 +343,10 @@ function Chat({
|
|
|
320
343
|
},
|
|
321
344
|
...threadId ? { sessionId: threadId } : {},
|
|
322
345
|
...(selectedModel == null ? void 0 : selectedModel.id) ? { model: selectedModel.id } : runtime.model ? { model: runtime.model } : {},
|
|
346
|
+
suppressWaiting: (approvalsInFlight.get(threadId) ?? 0) > 0,
|
|
323
347
|
emptyState: empty,
|
|
324
348
|
onRegenerate: (messageId) => void regenerate({ messageId }),
|
|
325
|
-
onApprove:
|
|
349
|
+
onApprove: resolveToolApproval,
|
|
326
350
|
...renderToolResult ? { renderToolResult } : {}
|
|
327
351
|
}
|
|
328
352
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.js","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n getChatSession,\n postToolApproval,\n type CaptainChatSession,\n} from \"./approval\";\nimport { isForkSeedMessage } from \"./fork-seed\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport {\n usageSnapshotFromMetadata,\n usageSnapshotFromSession,\n} from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\n// Composer seeds are keyed by a monotonic id so re-seeding the same text works.\n// Minted here rather than reusing a caller's `initialPrompt.id` so a host's id\n// space can never collide with one a suggestion pick produced.\nlet _draftId = 0;\nconst nextDraftId = () => ++_draftId;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts offered while the conversation is still empty. */\n suggestions?: Suggestion[];\n /** Prompts proposed for this particular open — e.g. the opener a host's \"Ask\n * AI\" button rendered for the thing being asked about. Shown in place of\n * `suggestions`, and unlike them they stay offered once the conversation has\n * started, because a host may propose them into a chat that is already\n * running. Cleared through `onProposedPromptsConsumed`. */\n proposedPrompts?: Suggestion[] | null;\n /** Called once the proposed prompts have been acted on — one was picked, or\n * the user sent a message of their own. */\n onProposedPromptsConsumed?: () => void;\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Prevents changing model/backend for an existing Captain session. Effort\n * and other per-turn generation settings remain editable. */\n runtimeLocked?: boolean;\n /** Reports the number of real (non-fork-seed) persisted/UI messages. */\n onMessageCountChange?: (count: number) => void;\n /** Reports the authoritative Captain session after detail hydration. */\n onSessionHydrated?: (session: CaptainChatSession) => void;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to prefill the composer with once. It is never submitted on the\n * user's behalf — they read it, edit it if they want, and press send. A new\n * `id` re-seeds even when the text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been placed in the composer. */\n onInitialPromptConsumed?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n proposedPrompts,\n onProposedPromptsConsumed,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n runtimeLocked = false,\n onMessageCountChange,\n onSessionHydrated,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptConsumed,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const lastDefaultModel = useRef(defaultModel);\n const [draft, setDraft] = useState<{ id: number; text: string } | null>(null);\n const seededInitialPromptId = useRef<number | null>(null);\n const hadProposals = useRef(false);\n if (proposedPrompts?.length) hadProposals.current = true;\n const activeThreadRef = useRef(threadId);\n const onMessageCountChangeRef = useRef(onMessageCountChange);\n const onSessionHydratedRef = useRef(onSessionHydrated);\n activeThreadRef.current = threadId;\n onMessageCountChangeRef.current = onMessageCountChange;\n onSessionHydratedRef.current = onSessionHydrated;\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n const hydratedUsageRef = useRef<ChatUsageSummary | null>(null);\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setApprovalError(undefined);\n hydratedUsageRef.current = null;\n setUsage(null);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n const snapshot = usageSnapshotFromSession(session);\n hydratedUsageRef.current = snapshot;\n setUsage(snapshot);\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n onSessionHydratedRef.current?.(session);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [sessionsApi, threadId]);\n\n useEffect(() => {\n onMessageCountChangeRef.current?.(\n messages.filter((message) => !isForkSeedMessage(message)).length,\n );\n }, [messages]);\n\n // An initial prompt is a draft, not a turn: it lands in the composer and\n // waits for the user to send it. Unlike a send it needs no live transport and\n // no hydrated session, so it seeds immediately.\n useEffect(() => {\n if (!initialPrompt) return;\n if (seededInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n seededInitialPromptId.current = initialPrompt.id;\n setDraft({ id: nextDraftId(), text });\n onInitialPromptConsumed?.();\n }, [initialPrompt, onInitialPromptConsumed]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message and resolve maxTokens from the selected model.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n const meta = last?.metadata;\n if (!meta) {\n setUsage(hydratedUsageRef.current);\n if (hydratedUsageRef.current) {\n onUsageRef.current?.(hydratedUsageRef.current);\n }\n return;\n }\n const settledModel = meta.model\n ? selectedChatModel(models, { id: meta.model, model: meta.model })\n : undefined;\n const snapshot = usageSnapshotFromMetadata(meta, {\n contextWindow: settledModel?.contextWindow,\n modelLabel: settledModel?.label,\n messageCount: messages.length,\n });\n hydratedUsageRef.current = snapshot;\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, models, status]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n const currentModelId = selectedModel?.id ?? runtime.id ?? runtime.model ?? \"\";\n const nextModelId = nextModel?.id ?? next.id ?? next.model ?? \"\";\n if (nextModelId !== currentModelId) {\n onModelChange?.(nextModelId);\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n const approvalThreadId = threadId;\n setApprovalError(undefined);\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: approvalThreadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (activeThreadRef.current !== approvalThreadId) return;\n if (session.id !== approvalThreadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${approvalThreadId ?? \"\"}\".`,\n );\n }\n setMessages(session.messages as ChatUIMessage[]);\n } catch (cause) {\n if (activeThreadRef.current !== approvalThreadId) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n locked={runtimeLocked}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && emptyState ? (\n <div className=\"flex flex-col items-center gap-4\">{emptyState}</div>\n ) : undefined;\n\n // Prompts proposed for this open outrank the static suggestions and survive a\n // running conversation — a host can propose into a chat that already has one.\n // The static list is an empty-state affordance and retires once a turn exists;\n // it also never comes back after proposals were consumed, because falling back\n // to the application's generic prompts under a chat opened about one cell\n // reads as an unrelated non-sequitur.\n const chips = proposedPrompts?.length\n ? proposedPrompts\n : messages.length === 0 && !hadProposals.current\n ? suggestions\n : undefined;\n\n const pickSuggestion = (text: string) => {\n setDraft({ id: nextDraftId(), text });\n onProposedPromptsConsumed?.();\n };\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={(id, approved, reason) =>\n void resolveToolApproval(id, approved, reason)\n }\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"flex flex-col gap-2 p-4 pt-0\">\n {chips && chips.length > 0 && (\n <Suggestions suggestions={chips} onSelect={pickSuggestion} />\n )}\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n draft={draft}\n toolbar={toolbar}\n onSubmit={(text, files) => {\n onProposedPromptsConsumed?.();\n void sendMessage({ text, files });\n }}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.js","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n getChatSession,\n postToolApproval,\n type CaptainChatSession,\n} from \"./approval\";\nimport { isForkSeedMessage } from \"./fork-seed\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport {\n usageSnapshotFromMetadata,\n usageSnapshotFromSession,\n} from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\n// Composer seeds are keyed by a monotonic id so re-seeding the same text works.\n// Minted here rather than reusing a caller's `initialPrompt.id` so a host's id\n// space can never collide with one a suggestion pick produced.\nlet _draftId = 0;\nconst nextDraftId = () => ++_draftId;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts offered while the conversation is still empty. */\n suggestions?: Suggestion[];\n /** Prompts proposed for this particular open — e.g. the opener a host's \"Ask\n * AI\" button rendered for the thing being asked about. Shown in place of\n * `suggestions`, and unlike them they stay offered once the conversation has\n * started, because a host may propose them into a chat that is already\n * running. Cleared through `onProposedPromptsConsumed`. */\n proposedPrompts?: Suggestion[] | null;\n /** Called once the proposed prompts have been acted on — one was picked, or\n * the user sent a message of their own. */\n onProposedPromptsConsumed?: () => void;\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Prevents changing model/backend for an existing Captain session. Effort\n * and other per-turn generation settings remain editable. */\n runtimeLocked?: boolean;\n /** Reports the number of real (non-fork-seed) persisted/UI messages. */\n onMessageCountChange?: (count: number) => void;\n /** Reports the authoritative Captain session after detail hydration. */\n onSessionHydrated?: (session: CaptainChatSession) => void;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to prefill the composer with once. It is never submitted on the\n * user's behalf — they read it, edit it if they want, and press send. A new\n * `id` re-seeds even when the text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been placed in the composer. */\n onInitialPromptConsumed?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n proposedPrompts,\n onProposedPromptsConsumed,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n runtimeLocked = false,\n onMessageCountChange,\n onSessionHydrated,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptConsumed,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const [approvalsInFlight, setApprovalsInFlight] = useState(\n () => new Map<string | undefined, number>(),\n );\n const lastDefaultModel = useRef(defaultModel);\n const [draft, setDraft] = useState<{ id: number; text: string } | null>(null);\n const seededInitialPromptId = useRef<number | null>(null);\n const hadProposals = useRef(false);\n if (proposedPrompts?.length) hadProposals.current = true;\n const activeThreadRef = useRef(threadId);\n const onMessageCountChangeRef = useRef(onMessageCountChange);\n const onSessionHydratedRef = useRef(onSessionHydrated);\n activeThreadRef.current = threadId;\n onMessageCountChangeRef.current = onMessageCountChange;\n onSessionHydratedRef.current = onSessionHydrated;\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n const hydratedUsageRef = useRef<ChatUsageSummary | null>(null);\n const hydratedAssistantRef = useRef<ChatUIMessage | undefined>(undefined);\n\n const applySession = useCallback((session: CaptainChatSession) => {\n const snapshot = usageSnapshotFromSession(session);\n hydratedUsageRef.current = snapshot;\n hydratedAssistantRef.current = [...session.messages].reverse().find((message) => message.role === \"assistant\") as ChatUIMessage | undefined;\n setUsage(snapshot);\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n }, []);\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setApprovalError(undefined);\n hydratedUsageRef.current = null;\n hydratedAssistantRef.current = undefined;\n setUsage(null);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n applySession(session);\n onSessionHydratedRef.current?.(session);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [applySession, sessionsApi, threadId]);\n\n useEffect(() => {\n onMessageCountChangeRef.current?.(\n messages.filter((message) => !isForkSeedMessage(message)).length,\n );\n }, [messages]);\n\n // An initial prompt is a draft, not a turn: it lands in the composer and\n // waits for the user to send it. Unlike a send it needs no live transport and\n // no hydrated session, so it seeds immediately.\n useEffect(() => {\n if (!initialPrompt) return;\n if (seededInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n seededInitialPromptId.current = initialPrompt.id;\n setDraft({ id: nextDraftId(), text });\n onInitialPromptConsumed?.();\n }, [initialPrompt, onInitialPromptConsumed]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message, preserving provider context independently of billing.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n if (hydratedUsageRef.current && last?.id === hydratedAssistantRef.current?.id && last?.metadata === hydratedAssistantRef.current?.metadata) {\n setUsage(hydratedUsageRef.current);\n onUsageRef.current?.(hydratedUsageRef.current);\n return;\n }\n const meta = last?.metadata;\n if (!meta) {\n setUsage(null);\n return;\n }\n const settledModel = meta.model\n ? selectedChatModel(models, { id: meta.model, model: meta.model })\n : undefined;\n const snapshot = usageSnapshotFromMetadata(meta, {\n modelLabel: settledModel?.label,\n messageCount: messages.length,\n });\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, models, status]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n const currentModelId = selectedModel?.id ?? runtime.id ?? runtime.model ?? \"\";\n const nextModelId = nextModel?.id ?? next.id ?? next.model ?? \"\";\n if (nextModelId !== currentModelId) {\n onModelChange?.(nextModelId);\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n const approvalThreadId = threadId;\n setApprovalError(undefined);\n setApprovalsInFlight((counts) =>\n new Map(counts).set(approvalThreadId, (counts.get(approvalThreadId) ?? 0) + 1),\n );\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: approvalThreadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (activeThreadRef.current !== approvalThreadId) return;\n if (session.id !== approvalThreadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${approvalThreadId ?? \"\"}\".`,\n );\n }\n applySession(session);\n } catch (cause) {\n if (activeThreadRef.current !== approvalThreadId) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n } finally {\n setApprovalsInFlight((counts) => {\n const count = counts.get(approvalThreadId);\n if (count === undefined || count < 1) {\n throw new Error(\"Tool approval completed without a pending request.\");\n }\n const next = new Map(counts);\n if (count === 1) next.delete(approvalThreadId);\n else next.set(approvalThreadId, count - 1);\n return next;\n });\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n locked={runtimeLocked}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && emptyState ? (\n <div className=\"flex flex-col items-center gap-4\">{emptyState}</div>\n ) : undefined;\n\n // Prompts proposed for this open outrank the static suggestions and survive a\n // running conversation — a host can propose into a chat that already has one.\n // The static list is an empty-state affordance and retires once a turn exists;\n // it also never comes back after proposals were consumed, because falling back\n // to the application's generic prompts under a chat opened about one cell\n // reads as an unrelated non-sequitur.\n const chips = proposedPrompts?.length\n ? proposedPrompts\n : messages.length === 0 && !hadProposals.current\n ? suggestions\n : undefined;\n\n const pickSuggestion = (text: string) => {\n setDraft({ id: nextDraftId(), text });\n onProposedPromptsConsumed?.();\n };\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n suppressWaiting={(approvalsInFlight.get(threadId) ?? 0) > 0}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={resolveToolApproval}\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"flex flex-col gap-2 p-4 pt-0\">\n {chips && chips.length > 0 && (\n <Suggestions suggestions={chips} onSelect={pickSuggestion} />\n )}\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n draft={draft}\n toolbar={toolbar}\n onSubmit={(text, files) => {\n onProposedPromptsConsumed?.();\n void sendMessage({ text, files });\n }}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAwDA,IAAI,WAAW;AACf,MAAM,cAAc,MAAM,EAAE;AAyGrB,SAAS,KAAK;AAAA,EACnB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAc;AACZ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAsB,cAAc,CAAA,CAAE;AAClE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI;AAAA,IAC5C,MACE,qBACA,mBAAmB;AAAA,MACjB,QAAQ,cAAc,CAAA;AAAA,MACtB,SAAS;AAAA,MACT,gBACE,oBACC,iBACG,SACC,gBAAgB,mBAAmB,cAAc,CAAA,CAAE;AAAA,MAC1D,QAAQ,oBAAoB;AAAA,MAC5B;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA;AAEL,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkC,IAAI;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAA;AAC1C,QAAM,CAAC,mBAAmB,oBAAoB,IAAI;AAAA,IAChD,0BAAU,IAAA;AAAA,EAAgC;AAE5C,QAAM,mBAAmB,OAAO,YAAY;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8C,IAAI;AAC5E,QAAM,wBAAwB,OAAsB,IAAI;AACxD,QAAM,eAAe,OAAO,KAAK;AACjC,MAAI,mDAAiB,OAAQ,cAAa,UAAU;AACpD,QAAM,kBAAkB,OAAO,QAAQ;AACvC,QAAM,0BAA0B,OAAO,oBAAoB;AAC3D,QAAM,uBAAuB,OAAO,iBAAiB;AACrD,kBAAgB,UAAU;AAC1B,0BAAwB,UAAU;AAClC,uBAAqB,UAAU;AAC/B,QAAM,UAAU,qBAAqB;AAIrC,QAAM,eAAe;AAAA,IACnB,MAAM,qBAAqB,eAAe,QAAQ,EAAE,MAAA,IAAU,CAAA,CAAE;AAAA,IAChE,CAAC,eAAe,KAAK;AAAA,EAAA;AAGvB,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,UAAU,CAAC;AAGf,YAAU,MAAM;AACd,QAAI,cAAc,CAAC,UAAW;AAC9B,QAAI,YAAY;AAChB,UAAM,SAAS,EACZ;AAAA,MAAK,CAAC,MACL,EAAE,KAAK,EAAE,KAAA,IAAS,QAAQ,OAAO,IAAI,MAAM,UAAU,EAAE,MAAM,EAAE,CAAC;AAAA,IAAA,EAEjE,KAAK,CAAC,SAAsB;AAC3B,UAAI,UAAW;AACf,gBAAU,IAAI;AAAA,IAChB,CAAC,EACA;AAAA,MAAM,CAAC,QACN,QAAQ,KAAK,yCAAyC,GAAG;AAAA,IAAA;AAE7D,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,YAAU,MAAM;AACd,QAAI,sBAAsB,OAAW;AACrC,UAAM,iBACJ,QAAQ,YAAY,KAAK,iBAAiB,iBAAiB;AAC7D,qBAAiB,UAAU;AAC3B;AAAA,MAAmB,CAAC;;AAClB,kCAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,gBACE,oBACC,iBACG,iBACC,uBAAkB,QAAQ,OAAO,MAAjC,mBAAoC,OACrC,gBACA,mBAAmB,MAAM;AAAA,UAC/B,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,QAAA,CACD;AAAA;AAAA,IAAA;AAAA,EAEL,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,gBAAgB,kBAAkB,QAAQ,OAAO;AACvD,QAAM,oBAAoB,qBAAqB,SAAS,aAAa;AACrE,QAAM,2BAA2B;AAAA,IAC/B,MACE,oBACA,8BAA8B,EAAE,UAAU,gBAAgB;AAAA,IAC5D,CAAC,kBAAkB,cAAc;AAAA,EAAA;AAKnC,QAAM,UAAU,OAAgC,EAAE;AAClD,UAAQ,UAAU;AAAA,IAChB,GAAG;AAAA,IACH,GAAI,oBACA,EAAE,YACF;AAAA,MACE,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC/C,GAAI,QAAQ,SAAS,EAAE,iBAAiB,QAAQ,OAAA,IAAW,CAAA;AAAA,MAC3D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,gBACvB,CAAA;AAAA,IAAC;AAAA,IAEX,GAAI,WAAW,OAAO,SAAS,UAAa,OAAO,cAAc,UAC7D,EAAE,OAAA,IACF,CAAA;AAAA,IACJ,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,IAC1C,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAGjC,QAAM,oBAAoB;AAAA,IACxB,MACE,aACA,IAAI,qBAAqB,EAAE,KAAK,MAAM,MAAM,QAAQ,SAAS;AAAA,IAC/D,CAAC,WAAW,GAAG;AAAA,EAAA;AAGjB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,QAAuB;AAAA,IACzB,WAAW;AAAA,IACX,GAAI,WAAW,EAAE,IAAI,SAAA,IAAa,CAAA;AAAA,IAClC,GAAI,kBACA,EAAE,UAAU,oBACZ,CAAA;AAAA,EAAC,CACN;AACD,QAAM,iBAAiB,OAAO,WAAW;AACzC,iBAAe,UAAU;AACzB,QAAM,mBAAmB,OAAgC,IAAI;AAC7D,QAAM,uBAAuB,OAAkC,MAAS;AAExE,QAAM,eAAe,YAAY,CAAC,YAAgC;AAChE,UAAM,WAAW,yBAAyB,OAAO;AACjD,qBAAiB,UAAU;AAC3B,yBAAqB,UAAU,CAAC,GAAG,QAAQ,QAAQ,EAAE,UAAU,KAAK,CAAC,YAAY,QAAQ,SAAS,WAAW;AAC7G,aAAS,QAAQ;AACjB,mBAAe,QAAQ,QAAQ,QAA2B;AAAA,EAC5D,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,CAAC,SAAU;AAC/B,QAAI,YAAY;AAChB,qBAAiB,MAAS;AAC1B,qBAAiB,UAAU;AAC3B,yBAAqB,UAAU;AAC/B,aAAS,IAAI;AACb,mBAAe,QAAQ,EAAE;AACzB,SAAK,eAAe,aAAa,QAAQ,EACtC,KAAK,CAAC,YAAY;;AACjB,UAAI,UAAW;AACf,UAAI,QAAQ,OAAO,UAAU;AAC3B,cAAM,IAAI;AAAA,UACR,qCAAqC,QAAQ,EAAE,uCAAuC,QAAQ;AAAA,QAAA;AAAA,MAElG;AACA,mBAAa,OAAO;AACpB,iCAAqB,YAArB,8CAA+B;AAAA,IACjC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,UAAW;AACf;AAAA,QACE,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAAA;AAAA,IAE5D,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,cAAc,aAAa,QAAQ,CAAC;AAExC,YAAU,MAAM;;AACd,kCAAwB,YAAxB;AAAA;AAAA,MACE,SAAS,OAAO,CAAC,YAAY,CAAC,kBAAkB,OAAO,CAAC,EAAE;AAAA;AAAA,EAE9D,GAAG,CAAC,QAAQ,CAAC;AAKb,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,QAAI,sBAAsB,YAAY,cAAc,GAAI;AACxD,UAAM,OAAO,cAAc,KAAK,KAAA;AAChC,QAAI,CAAC,KAAM;AACX,0BAAsB,UAAU,cAAc;AAC9C,aAAS,EAAE,IAAI,YAAA,GAAe,MAAM;AACpC;AAAA,EACF,GAAG,CAAC,eAAe,uBAAuB,CAAC;AAK3C,QAAM,aAAa,OAAO,OAAO;AACjC,aAAW,UAAU;AACrB,YAAU,MAAM;;AACd,QAAI,WAAW,QAAS;AACxB,UAAM,OAAO,CAAC,GAAG,QAAQ,EAAE,QAAA,EAAU,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACvE,QAAI,iBAAiB,YAAW,6BAAM,UAAO,0BAAqB,YAArB,mBAA8B,QAAM,6BAAM,gBAAa,0BAAqB,YAArB,mBAA8B,WAAU;AAC1I,eAAS,iBAAiB,OAAO;AACjC,uBAAW,YAAX,oCAAqB,iBAAiB;AACtC;AAAA,IACF;AACA,UAAM,OAAO,6BAAM;AACnB,QAAI,CAAC,MAAM;AACT,eAAS,IAAI;AACb;AAAA,IACF;AACA,UAAM,eAAe,KAAK,QACtB,kBAAkB,QAAQ,EAAE,IAAI,KAAK,OAAO,OAAO,KAAK,MAAA,CAAO,IAC/D;AACJ,UAAM,WAAW,0BAA0B,MAAM;AAAA,MAC/C,YAAY,6CAAc;AAAA,MAC1B,cAAc,SAAS;AAAA,IAAA,CACxB;AACD,aAAS,QAAQ;AACjB,qBAAW,YAAX,oCAAqB;AAAA,EACvB,GAAG,CAAC,UAAU,QAAQ,MAAM,CAAC;AAE7B,QAAM,sBAAsB,CAAC,SAA2B;AACtD,QAAI,sBAAsB,OAAW,oBAAmB,IAAI;AAC5D,uDAAkB;AAClB,UAAM,YAAY,kBAAkB,QAAQ,IAAI;AAChD,UAAM,kBAAiB,+CAAe,OAAM,QAAQ,MAAM,QAAQ,SAAS;AAC3E,UAAM,eAAc,uCAAW,OAAM,KAAK,MAAM,KAAK,SAAS;AAC9D,QAAI,gBAAgB,gBAAgB;AAClC,qDAAgB;AAAA,IAClB;AACA,SAAK,KAAK,UAAU,SAAS,QAAQ,UAAU,KAAK;AAClD,yEAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,sBAAsB,OAC1B,IACA,UACA,WACG;AACH,UAAM,mBAAmB;AACzB,qBAAiB,MAAS;AAC1B;AAAA,MAAqB,CAAC,WACpB,IAAI,IAAI,MAAM,EAAE,IAAI,mBAAmB,OAAO,IAAI,gBAAgB,KAAK,KAAK,CAAC;AAAA,IAAA;AAE/E,QAAI;AACF,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,YAAM,UAAU,MAAM,iBAAiB;AAAA,QACrC;AAAA,QACA,WAAW,oBAAoB;AAAA,QAC/B,YAAY;AAAA,QACZ;AAAA,QACA,GAAI,SAAS,EAAE,WAAW,CAAA;AAAA,MAAC,CAC5B;AACD,UAAI,gBAAgB,YAAY,iBAAkB;AAClD,UAAI,QAAQ,OAAO,kBAAkB;AACnC,cAAM,IAAI;AAAA,UACR,qCAAqC,QAAQ,EAAE,oCAAoC,oBAAoB,EAAE;AAAA,QAAA;AAAA,MAE7G;AACA,mBAAa,OAAO;AAAA,IACtB,SAAS,OAAO;AACd,UAAI,gBAAgB,YAAY,iBAAkB;AAClD;AAAA,QACE,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAAA;AAAA,IAE5D,UAAA;AACE,2BAAqB,CAAC,WAAW;AAC/B,cAAM,QAAQ,OAAO,IAAI,gBAAgB;AACzC,YAAI,UAAU,UAAa,QAAQ,GAAG;AACpC,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AACA,cAAM,OAAO,IAAI,IAAI,MAAM;AAC3B,YAAI,UAAU,EAAG,MAAK,OAAO,gBAAgB;AAAA,YACxC,MAAK,IAAI,kBAAkB,QAAQ,CAAC;AACzC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,iBAAiB;AAAA,IAAA;AAAA,EAAA;AAIrB,QAAM,QACJ,SAAS,WAAW,KAAK,iCACtB,OAAA,EAAI,WAAU,oCAAoC,UAAA,WAAA,CAAW,IAC5D;AAQN,QAAM,SAAQ,mDAAiB,UAC3B,kBACA,SAAS,WAAW,KAAK,CAAC,aAAa,UACrC,cACA;AAEN,QAAM,iBAAiB,CAAC,SAAiB;AACvC,aAAS,EAAE,IAAI,YAAA,GAAe,MAAM;AACpC;AAAA,EACF;AAEA,SACE,oBAAC,4BAAA,EAA2B,OAAO,cACjC,UAAA,qBAAC,SAAI,WAAW,GAAG,wBAAwB,SAAS,GAClD,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO,iBAAiB;AAAA,QACxB,cAAc,MAAM;AAClB,2BAAiB,MAAS;AAC1B,qBAAA;AAAA,QACF;AAAA,QACC,GAAI,WAAW,EAAE,WAAW,SAAA,IAAa,CAAA;AAAA,QACzC,IAAI,+CAAe,MAChB,EAAE,OAAO,cAAc,GAAA,IACvB,QAAQ,QACN,EAAE,OAAO,QAAQ,MAAA,IACjB,CAAA;AAAA,QACN,kBAAkB,kBAAkB,IAAI,QAAQ,KAAK,KAAK;AAAA,QAC1D,YAAY;AAAA,QACZ,cAAc,CAAC,cAAc,KAAK,WAAW,EAAE,WAAW;AAAA,QAC1D,WAAW;AAAA,QACV,GAAI,mBAAmB,EAAE,qBAAqB,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAElD,qBAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,MAAA,SAAS,MAAM,SAAS,KACvB,oBAAC,eAAY,aAAa,OAAO,UAAU,eAAA,CAAgB;AAAA,MAE7D;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,QAAQ,MAAM,KAAK,KAAA;AAAA,UACnB;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UACjB,IAAI,+CAAe,mBAChB,EAAE,oBAAoB,cAAc,gBAAA,IACpC,CAAA;AAAA,UACH,GAAI,mBAAmB,EAAE,iBAAA,IAAqB,CAAA;AAAA,UAC/C;AAAA,UACA;AAAA,UACA,UAAU,CAAC,MAAM,UAAU;AACzB;AACA,iBAAK,YAAY,EAAE,MAAM,OAAO;AAAA,UAClC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -20,14 +20,11 @@ function ChatRuntimeToolbar({
|
|
|
20
20
|
);
|
|
21
21
|
const showContextMeter = Boolean(threadId || selectedModel || usage);
|
|
22
22
|
if (!showRuntimeBar && !showContextMeter) return null;
|
|
23
|
-
const contextWindow = (usage == null ? void 0 : usage.maxTokens) ?? 0;
|
|
24
|
-
const usedTokens = (usage == null ? void 0 : usage.usedTokens) ?? 0;
|
|
25
23
|
const ModelGlyph = providerIcons.providerIcon(usage == null ? void 0 : usage.provider);
|
|
26
24
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 items-center gap-2", children: [
|
|
27
25
|
showRuntimeBar && /* @__PURE__ */ jsxRuntime.jsx(
|
|
28
26
|
RuntimeBar.RuntimeBar,
|
|
29
27
|
{
|
|
30
|
-
variant: "combo",
|
|
31
28
|
value: runtime,
|
|
32
29
|
onChange: onRuntimeChange,
|
|
33
30
|
models,
|
|
@@ -42,9 +39,9 @@ function ChatRuntimeToolbar({
|
|
|
42
39
|
ContextMeter.ContextMeter,
|
|
43
40
|
{
|
|
44
41
|
mode: "gauge",
|
|
45
|
-
usedPercent:
|
|
46
|
-
usedTokens,
|
|
47
|
-
|
|
42
|
+
usedPercent: (usage == null ? void 0 : usage.freePercent) !== void 0 ? 100 - usage.freePercent : void 0,
|
|
43
|
+
usedTokens: usage == null ? void 0 : usage.usedTokens,
|
|
44
|
+
windowTokens: usage == null ? void 0 : usage.maxTokens,
|
|
48
45
|
...(usage == null ? void 0 : usage.messageCount) != null ? { messageCount: usage.messageCount } : {},
|
|
49
46
|
...(usage == null ? void 0 : usage.cost) != null ? { cost: { total: usage.cost } } : {},
|
|
50
47
|
...(usage == null ? void 0 : usage.provider) ? { provider: usage.provider } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatRuntimeToolbar.cjs","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"sourcesContent":["import { ContextMeter } from \"./ContextMeter\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\nimport type { ChatModel, ChatModelRuntime, ChatUsageSummary } from \"./types\";\nimport { RuntimeBar } from \"../runtime/RuntimeBar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\n\nexport type ChatRuntimeToolbarProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n selectedModel?: ChatModel | undefined;\n usage?: ChatUsageSummary | null | undefined;\n threadId?: string | undefined;\n locked?: boolean | undefined;\n onRuntimeChange: (runtime: ChatModelRuntime) => void;\n};\n\nexport function ChatRuntimeToolbar({\n models,\n runtime,\n runtimeFamilies,\n reasoningEfforts,\n selectedModel,\n usage,\n threadId,\n locked = false,\n onRuntimeChange,\n}: ChatRuntimeToolbarProps) {\n const showRuntimeBar = Boolean(\n runtimeFamilies?.length ||\n models.length ||\n runtime.mode ||\n runtime.id ||\n runtime.model,\n );\n const showContextMeter = Boolean(threadId || selectedModel || usage);\n if (!showRuntimeBar && !showContextMeter) return null;\n\n const
|
|
1
|
+
{"version":3,"file":"ChatRuntimeToolbar.cjs","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"sourcesContent":["import { ContextMeter } from \"./ContextMeter\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\nimport type { ChatModel, ChatModelRuntime, ChatUsageSummary } from \"./types\";\nimport { RuntimeBar } from \"../runtime/RuntimeBar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\n\nexport type ChatRuntimeToolbarProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n selectedModel?: ChatModel | undefined;\n usage?: ChatUsageSummary | null | undefined;\n threadId?: string | undefined;\n locked?: boolean | undefined;\n onRuntimeChange: (runtime: ChatModelRuntime) => void;\n};\n\nexport function ChatRuntimeToolbar({\n models,\n runtime,\n runtimeFamilies,\n reasoningEfforts,\n selectedModel,\n usage,\n threadId,\n locked = false,\n onRuntimeChange,\n}: ChatRuntimeToolbarProps) {\n const showRuntimeBar = Boolean(\n runtimeFamilies?.length ||\n models.length ||\n runtime.mode ||\n runtime.id ||\n runtime.model,\n );\n const showContextMeter = Boolean(threadId || selectedModel || usage);\n if (!showRuntimeBar && !showContextMeter) return null;\n\n const ModelGlyph = providerIcon(usage?.provider);\n\n return (\n <div className=\"flex flex-1 items-center gap-2\">\n {showRuntimeBar && (\n <RuntimeBar\n value={runtime}\n onChange={onRuntimeChange}\n models={models}\n reasoningEfforts={reasoningEfforts}\n locked={locked}\n {...(runtimeFamilies ? { families: runtimeFamilies } : {})}\n />\n )}\n {showContextMeter && (\n <>\n <div className=\"flex-1\" />\n <ContextMeter\n mode=\"gauge\"\n usedPercent={\n usage?.freePercent !== undefined ? 100 - usage.freePercent : undefined\n }\n usedTokens={usage?.usedTokens}\n windowTokens={usage?.maxTokens}\n {...(usage?.messageCount != null\n ? { messageCount: usage.messageCount }\n : {})}\n {...(usage?.cost != null ? { cost: { total: usage.cost } } : {})}\n {...(usage?.provider ? { provider: usage.provider } : {})}\n {...(usage?.executionMode\n ? { executionMode: usage.executionMode }\n : {})}\n {...(usage?.model\n ? { model: usage.model }\n : usage?.modelLabel\n ? { model: usage.modelLabel }\n : {})}\n {...(usage?.captainSessionId\n ? { captainSessionId: usage.captainSessionId }\n : {})}\n {...(usage?.providerSessionId\n ? { providerSessionId: usage.providerSessionId }\n : {})}\n {...(usage?.threadId ? { threadId: usage.threadId } : {})}\n {...(usage?.turnId ? { turnId: usage.turnId } : {})}\n {...(runtime.effort ? { effort: runtime.effort } : {})}\n {...(ModelGlyph ? { modelIcon: ModelGlyph } : {})}\n {...(usage?.provider\n ? {\n modelIconClassName: providerIconColor(usage.provider),\n }\n : {})}\n />\n </>\n )}\n </div>\n );\n}\n"],"names":["providerIcon","jsxs","jsx","RuntimeBar","Fragment","ContextMeter","providerIconColor"],"mappings":";;;;;;AAkBO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAA4B;AAC1B,QAAM,iBAAiB;AAAA,KACrB,mDAAiB,WACjB,OAAO,UACP,QAAQ,QACR,QAAQ,MACR,QAAQ;AAAA,EAAA;AAEV,QAAM,mBAAmB,QAAQ,YAAY,iBAAiB,KAAK;AACnE,MAAI,CAAC,kBAAkB,CAAC,iBAAkB,QAAO;AAEjD,QAAM,aAAaA,cAAAA,aAAa,+BAAO,QAAQ;AAE/C,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,IAAA,kBACCC,2BAAAA;AAAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAI,kBAAkB,EAAE,UAAU,oBAAoB,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAG3D,oBACCF,2BAAAA,KAAAG,qBAAA,EACE,UAAA;AAAA,MAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,MACxBA,2BAAAA;AAAAA,QAACG,aAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cACE,+BAAO,iBAAgB,SAAY,MAAM,MAAM,cAAc;AAAA,UAE/D,YAAY,+BAAO;AAAA,UACnB,cAAc,+BAAO;AAAA,UACpB,IAAI,+BAAO,iBAAgB,OACxB,EAAE,cAAc,MAAM,aAAA,IACtB,CAAA;AAAA,UACH,IAAI,+BAAO,SAAQ,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,KAAA,EAAK,IAAM,CAAA;AAAA,UAC5D,IAAI,+BAAO,YAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,UACrD,IAAI,+BAAO,iBACR,EAAE,eAAe,MAAM,cAAA,IACvB,CAAA;AAAA,UACH,IAAI,+BAAO,SACR,EAAE,OAAO,MAAM,MAAA,KACf,+BAAO,cACL,EAAE,OAAO,MAAM,WAAA,IACf,CAAA;AAAA,UACL,IAAI,+BAAO,oBACR,EAAE,kBAAkB,MAAM,iBAAA,IAC1B,CAAA;AAAA,UACH,IAAI,+BAAO,qBACR,EAAE,mBAAmB,MAAM,kBAAA,IAC3B,CAAA;AAAA,UACH,IAAI,+BAAO,YAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,UACrD,IAAI,+BAAO,UAAS,EAAE,QAAQ,MAAM,OAAA,IAAW,CAAA;AAAA,UAC/C,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAA,IAAW,CAAA;AAAA,UAClD,GAAI,aAAa,EAAE,WAAW,WAAA,IAAe,CAAA;AAAA,UAC7C,IAAI,+BAAO,YACR;AAAA,YACE,oBAAoBC,cAAAA,kBAAkB,MAAM,QAAQ;AAAA,UAAA,IAEtD,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IACP,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatRuntimeToolbar.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAClD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,QAAQ,EACR,MAAc,EACd,eAAe,GAChB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"ChatRuntimeToolbar.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAClD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,QAAQ,EACR,MAAc,EACd,eAAe,GAChB,EAAE,uBAAuB,sCAoEzB"}
|
|
@@ -18,14 +18,11 @@ function ChatRuntimeToolbar({
|
|
|
18
18
|
);
|
|
19
19
|
const showContextMeter = Boolean(threadId || selectedModel || usage);
|
|
20
20
|
if (!showRuntimeBar && !showContextMeter) return null;
|
|
21
|
-
const contextWindow = (usage == null ? void 0 : usage.maxTokens) ?? 0;
|
|
22
|
-
const usedTokens = (usage == null ? void 0 : usage.usedTokens) ?? 0;
|
|
23
21
|
const ModelGlyph = providerIcon(usage == null ? void 0 : usage.provider);
|
|
24
22
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center gap-2", children: [
|
|
25
23
|
showRuntimeBar && /* @__PURE__ */ jsx(
|
|
26
24
|
RuntimeBar,
|
|
27
25
|
{
|
|
28
|
-
variant: "combo",
|
|
29
26
|
value: runtime,
|
|
30
27
|
onChange: onRuntimeChange,
|
|
31
28
|
models,
|
|
@@ -40,9 +37,9 @@ function ChatRuntimeToolbar({
|
|
|
40
37
|
ContextMeter,
|
|
41
38
|
{
|
|
42
39
|
mode: "gauge",
|
|
43
|
-
usedPercent:
|
|
44
|
-
usedTokens,
|
|
45
|
-
|
|
40
|
+
usedPercent: (usage == null ? void 0 : usage.freePercent) !== void 0 ? 100 - usage.freePercent : void 0,
|
|
41
|
+
usedTokens: usage == null ? void 0 : usage.usedTokens,
|
|
42
|
+
windowTokens: usage == null ? void 0 : usage.maxTokens,
|
|
46
43
|
...(usage == null ? void 0 : usage.messageCount) != null ? { messageCount: usage.messageCount } : {},
|
|
47
44
|
...(usage == null ? void 0 : usage.cost) != null ? { cost: { total: usage.cost } } : {},
|
|
48
45
|
...(usage == null ? void 0 : usage.provider) ? { provider: usage.provider } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatRuntimeToolbar.js","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"sourcesContent":["import { ContextMeter } from \"./ContextMeter\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\nimport type { ChatModel, ChatModelRuntime, ChatUsageSummary } from \"./types\";\nimport { RuntimeBar } from \"../runtime/RuntimeBar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\n\nexport type ChatRuntimeToolbarProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n selectedModel?: ChatModel | undefined;\n usage?: ChatUsageSummary | null | undefined;\n threadId?: string | undefined;\n locked?: boolean | undefined;\n onRuntimeChange: (runtime: ChatModelRuntime) => void;\n};\n\nexport function ChatRuntimeToolbar({\n models,\n runtime,\n runtimeFamilies,\n reasoningEfforts,\n selectedModel,\n usage,\n threadId,\n locked = false,\n onRuntimeChange,\n}: ChatRuntimeToolbarProps) {\n const showRuntimeBar = Boolean(\n runtimeFamilies?.length ||\n models.length ||\n runtime.mode ||\n runtime.id ||\n runtime.model,\n );\n const showContextMeter = Boolean(threadId || selectedModel || usage);\n if (!showRuntimeBar && !showContextMeter) return null;\n\n const
|
|
1
|
+
{"version":3,"file":"ChatRuntimeToolbar.js","sources":["../../../src/data/chat/ChatRuntimeToolbar.tsx"],"sourcesContent":["import { ContextMeter } from \"./ContextMeter\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\nimport type { ChatModel, ChatModelRuntime, ChatUsageSummary } from \"./types\";\nimport { RuntimeBar } from \"../runtime/RuntimeBar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\n\nexport type ChatRuntimeToolbarProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n selectedModel?: ChatModel | undefined;\n usage?: ChatUsageSummary | null | undefined;\n threadId?: string | undefined;\n locked?: boolean | undefined;\n onRuntimeChange: (runtime: ChatModelRuntime) => void;\n};\n\nexport function ChatRuntimeToolbar({\n models,\n runtime,\n runtimeFamilies,\n reasoningEfforts,\n selectedModel,\n usage,\n threadId,\n locked = false,\n onRuntimeChange,\n}: ChatRuntimeToolbarProps) {\n const showRuntimeBar = Boolean(\n runtimeFamilies?.length ||\n models.length ||\n runtime.mode ||\n runtime.id ||\n runtime.model,\n );\n const showContextMeter = Boolean(threadId || selectedModel || usage);\n if (!showRuntimeBar && !showContextMeter) return null;\n\n const ModelGlyph = providerIcon(usage?.provider);\n\n return (\n <div className=\"flex flex-1 items-center gap-2\">\n {showRuntimeBar && (\n <RuntimeBar\n value={runtime}\n onChange={onRuntimeChange}\n models={models}\n reasoningEfforts={reasoningEfforts}\n locked={locked}\n {...(runtimeFamilies ? { families: runtimeFamilies } : {})}\n />\n )}\n {showContextMeter && (\n <>\n <div className=\"flex-1\" />\n <ContextMeter\n mode=\"gauge\"\n usedPercent={\n usage?.freePercent !== undefined ? 100 - usage.freePercent : undefined\n }\n usedTokens={usage?.usedTokens}\n windowTokens={usage?.maxTokens}\n {...(usage?.messageCount != null\n ? { messageCount: usage.messageCount }\n : {})}\n {...(usage?.cost != null ? { cost: { total: usage.cost } } : {})}\n {...(usage?.provider ? { provider: usage.provider } : {})}\n {...(usage?.executionMode\n ? { executionMode: usage.executionMode }\n : {})}\n {...(usage?.model\n ? { model: usage.model }\n : usage?.modelLabel\n ? { model: usage.modelLabel }\n : {})}\n {...(usage?.captainSessionId\n ? { captainSessionId: usage.captainSessionId }\n : {})}\n {...(usage?.providerSessionId\n ? { providerSessionId: usage.providerSessionId }\n : {})}\n {...(usage?.threadId ? { threadId: usage.threadId } : {})}\n {...(usage?.turnId ? { turnId: usage.turnId } : {})}\n {...(runtime.effort ? { effort: runtime.effort } : {})}\n {...(ModelGlyph ? { modelIcon: ModelGlyph } : {})}\n {...(usage?.provider\n ? {\n modelIconClassName: providerIconColor(usage.provider),\n }\n : {})}\n />\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAkBO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAA4B;AAC1B,QAAM,iBAAiB;AAAA,KACrB,mDAAiB,WACjB,OAAO,UACP,QAAQ,QACR,QAAQ,MACR,QAAQ;AAAA,EAAA;AAEV,QAAM,mBAAmB,QAAQ,YAAY,iBAAiB,KAAK;AACnE,MAAI,CAAC,kBAAkB,CAAC,iBAAkB,QAAO;AAEjD,QAAM,aAAa,aAAa,+BAAO,QAAQ;AAE/C,SACE,qBAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,IAAA,kBACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAI,kBAAkB,EAAE,UAAU,oBAAoB,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAG3D,oBACC,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,MACxB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cACE,+BAAO,iBAAgB,SAAY,MAAM,MAAM,cAAc;AAAA,UAE/D,YAAY,+BAAO;AAAA,UACnB,cAAc,+BAAO;AAAA,UACpB,IAAI,+BAAO,iBAAgB,OACxB,EAAE,cAAc,MAAM,aAAA,IACtB,CAAA;AAAA,UACH,IAAI,+BAAO,SAAQ,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,KAAA,EAAK,IAAM,CAAA;AAAA,UAC5D,IAAI,+BAAO,YAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,UACrD,IAAI,+BAAO,iBACR,EAAE,eAAe,MAAM,cAAA,IACvB,CAAA;AAAA,UACH,IAAI,+BAAO,SACR,EAAE,OAAO,MAAM,MAAA,KACf,+BAAO,cACL,EAAE,OAAO,MAAM,WAAA,IACf,CAAA;AAAA,UACL,IAAI,+BAAO,oBACR,EAAE,kBAAkB,MAAM,iBAAA,IAC1B,CAAA;AAAA,UACH,IAAI,+BAAO,qBACR,EAAE,mBAAmB,MAAM,kBAAA,IAC3B,CAAA;AAAA,UACH,IAAI,+BAAO,YAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,UACrD,IAAI,+BAAO,UAAS,EAAE,QAAQ,MAAM,OAAA,IAAW,CAAA;AAAA,UAC/C,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAA,IAAW,CAAA;AAAA,UAClD,GAAI,aAAa,EAAE,WAAW,WAAA,IAAe,CAAA;AAAA,UAC7C,IAAI,+BAAO,YACR;AAAA,YACE,oBAAoB,kBAAkB,MAAM,QAAQ;AAAA,UAAA,IAEtD,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IACP,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -30,7 +30,7 @@ function ContextMeterBar({
|
|
|
30
30
|
"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground",
|
|
31
31
|
className
|
|
32
32
|
),
|
|
33
|
-
"aria-label": `Context ${pct}% used`,
|
|
33
|
+
"aria-label": pct === void 0 ? "Context unavailable" : `Context ${pct}% used`,
|
|
34
34
|
children: [
|
|
35
35
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
36
36
|
"span",
|
|
@@ -105,7 +105,7 @@ function ContextMeterBar({
|
|
|
105
105
|
"block h-full rounded-full transition-all",
|
|
106
106
|
barClassName
|
|
107
107
|
),
|
|
108
|
-
style: { width: `${pct}%` }
|
|
108
|
+
style: { width: `${pct ?? 0}%` }
|
|
109
109
|
}
|
|
110
110
|
)
|
|
111
111
|
}
|
|
@@ -123,7 +123,7 @@ function ContextMeterBar({
|
|
|
123
123
|
"absolute inset-x-0 bottom-0 block w-full rounded-full transition-all",
|
|
124
124
|
barClassName
|
|
125
125
|
),
|
|
126
|
-
style: { height: `${pct}%` }
|
|
126
|
+
style: { height: `${pct ?? 0}%` }
|
|
127
127
|
}
|
|
128
128
|
)
|
|
129
129
|
}
|
|
@@ -131,15 +131,12 @@ function ContextMeterBar({
|
|
|
131
131
|
]
|
|
132
132
|
}
|
|
133
133
|
),
|
|
134
|
-
/* @__PURE__ */ jsxRuntime.
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
135
135
|
"span",
|
|
136
136
|
{
|
|
137
137
|
"data-context-identity": "percentage",
|
|
138
138
|
className: utils.cn("shrink-0 font-medium tabular-nums", textClassName),
|
|
139
|
-
children:
|
|
140
|
-
pct,
|
|
141
|
-
"%"
|
|
142
|
-
]
|
|
139
|
+
children: pct === void 0 ? "—" : `${pct}%`
|
|
143
140
|
}
|
|
144
141
|
)
|
|
145
142
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.bar.cjs","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.cjs","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":["providerIcon","UiRobotAi","runtimeModeIcon","effortLevelIcon","jsxs","cn","jsx","Icon","providerIconColor","effortLevelLabel","effortLevelColor"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.bar.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.bar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAUzD,KAAK,oBAAoB,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextMeter.bar.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.bar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAUzD,KAAK,oBAAoB,GAAG;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,GAAG,EACH,QAAQ,EACR,aAAa,EACb,KAAK,EACL,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,oBAAoB,+BAkGtB"}
|