@flanksource/clicky-ui 0.3.44 → 0.3.46
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 +24 -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/AccessMark.cjs +23 -0
- package/dist/data/AccessMark.cjs.map +1 -0
- package/dist/data/AccessMark.d.ts +11 -0
- package/dist/data/AccessMark.d.ts.map +1 -0
- package/dist/data/AccessMark.js +23 -0
- package/dist/data/AccessMark.js.map +1 -0
- 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/CodeDiff.cjs +116 -23
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts +26 -0
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +116 -23
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/GraphDiagram.cjs +75 -11
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +17 -2
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +76 -12
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramGroups.cjs +100 -0
- package/dist/data/GraphDiagramGroups.cjs.map +1 -0
- package/dist/data/GraphDiagramGroups.d.ts +24 -0
- package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
- package/dist/data/GraphDiagramGroups.js +100 -0
- package/dist/data/GraphDiagramGroups.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +46 -51
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +8 -9
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +46 -51
- 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/TreeNode.cjs +1 -1
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +1 -1
- package/dist/data/TreeNode.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 +269 -0
- package/dist/data/call-graph/CallGraph.cjs.map +1 -0
- package/dist/data/call-graph/CallGraph.d.ts +78 -0
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraph.js +269 -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 +51 -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 +51 -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 +198 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.js +198 -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 +312 -0
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-model.d.ts +138 -0
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-model.js +312 -0
- package/dist/data/call-graph/call-graph-model.js.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.js +195 -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 +140 -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/data-access.cjs +8 -0
- package/dist/data/data-access.cjs.map +1 -0
- package/dist/data/data-access.d.ts +5 -0
- package/dist/data/data-access.d.ts.map +1 -0
- package/dist/data/data-access.js +8 -0
- package/dist/data/data-access.js.map +1 -0
- 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/git/GitChangeList.cjs +6 -2
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -1
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +6 -2
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +61 -14
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +42 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +61 -14
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs +5 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +24 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js +5 -0
- 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/graph-group-window.cjs +60 -0
- package/dist/data/graph-group-window.cjs.map +1 -0
- package/dist/data/graph-group-window.d.ts +33 -0
- package/dist/data/graph-group-window.d.ts.map +1 -0
- package/dist/data/graph-group-window.js +60 -0
- package/dist/data/graph-group-window.js.map +1 -0
- 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-group-windows.cjs +50 -0
- package/dist/data/use-group-windows.cjs.map +1 -0
- package/dist/data/use-group-windows.d.ts +27 -0
- package/dist/data/use-group-windows.d.ts.map +1 -0
- package/dist/data/use-group-windows.js +50 -0
- package/dist/data/use-group-windows.js.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 +36 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +5 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +35 -1
- package/dist/data.js.map +1 -1
- package/dist/hooks/event-hub.cjs +229 -0
- package/dist/hooks/event-hub.cjs.map +1 -0
- package/dist/hooks/event-hub.d.ts +26 -0
- package/dist/hooks/event-hub.d.ts.map +1 -0
- package/dist/hooks/event-hub.js +229 -0
- package/dist/hooks/event-hub.js.map +1 -0
- package/dist/hooks.cjs +2 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +2 -0
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +40 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +37 -1
- 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/overlay/modalStack.cjs +13 -6
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +13 -6
- package/dist/overlay/modalStack.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
|
@@ -71,6 +71,7 @@ function toolEvent(id, tool, input, response, timestamp, meta = {}) {
|
|
|
71
71
|
...meta.turnId ? { turnId: meta.turnId } : {},
|
|
72
72
|
...meta.agentId ? { agentId: meta.agentId } : {},
|
|
73
73
|
...meta.toolState ? { toolState: meta.toolState } : {},
|
|
74
|
+
...meta.estimatedCost ? { estimatedCost: meta.estimatedCost } : {},
|
|
74
75
|
...meta.approval ? { approval: meta.approval } : {},
|
|
75
76
|
pending: meta.pending ?? false,
|
|
76
77
|
...meta.toolCallId ? { toolCallId: meta.toolCallId } : {},
|
|
@@ -231,6 +232,7 @@ function partEvent(part, role, id, meta) {
|
|
|
231
232
|
...part.approval ? { approval: part.approval } : {},
|
|
232
233
|
pending,
|
|
233
234
|
...part.toolCallId ? { toolCallId: part.toolCallId } : {},
|
|
235
|
+
...part.estimatedCost ? { estimatedCost: part.estimatedCost } : {},
|
|
234
236
|
...((_a = part.approval) == null ? void 0 : _a.id) ? { approvalId: part.approval.id } : {},
|
|
235
237
|
...meta.raw !== void 0 ? { raw: meta.raw } : {}
|
|
236
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionViewer.model.js","sources":["../../../src/data/ai/SessionViewer.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { WORKFLOW_PHASES } from \"./agent-action-icons\";\nimport type { ApprovalKind, ApprovalRequest } from \"./approval-request\";\nimport type {\n SessionBudget,\n SessionCapabilities,\n SessionContext,\n SessionCost,\n SessionMetadataEvent,\n SessionTurn,\n SessionUIMessage,\n SessionUIPart,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport {\n UiAsterisk,\n UiCamera,\n UiClose,\n UiCloudDownload,\n UiCode2,\n UiCommand,\n UiCompass,\n UiCursorClick,\n UiCursorText,\n UiDiff,\n UiEye,\n UiGlobe,\n UiHourglass,\n UiKanban,\n UiKeyboard,\n UiListChecks,\n UiMagicWand,\n UiPalette,\n UiPencilSimpleLine,\n UiProhibit,\n UiPuzzle,\n UiQuestion,\n UiRobotAi,\n UiScan,\n UiScroll,\n UiSearch,\n UiShare,\n UiSparkles,\n UiStack,\n UiStrategy,\n UiTerminal,\n UiWrench,\n} from \"../../icons\";\n\n// ── Captain session schema ──────────────────────────────────────────────────\n// Mirrors github.com/flanksource/captain pkg/ai/history types. A session is a\n// list of SessionEntry records (the rows of a Claude Code / Codex JSONL log).\n\nexport interface SessionToolUse {\n tool?: string;\n input?: Record<string, unknown>;\n timestamp?: string;\n cwd?: string;\n session_id?: string;\n tool_use_id?: string;\n /** \"claude\" or \"codex\". */\n source?: string;\n model?: string;\n reasoning_effort?: string;\n response?: string;\n}\n\nexport interface SessionContent {\n /** Block kind: \"text\", \"thinking\", \"tool_use\", \"tool_result\", … */\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n input?: Record<string, unknown>;\n id?: string;\n}\n\nexport interface SessionMessage {\n role?: string;\n stop_reason?: string;\n content?: SessionContent[];\n}\n\nexport interface SessionEntry {\n /** Top-level entry kind: assistant, user, system, … */\n type?: string;\n tool_use?: SessionToolUse;\n message?: SessionMessage;\n timestamp?: string;\n cwd?: string;\n sessionId?: string;\n uuid?: string;\n /** Synthetic assistant entry Claude Code writes when an API request fails. */\n isApiErrorMessage?: boolean;\n apiErrorStatus?: number;\n /** Claude Code's error classification (e.g. \"rate_limit\"). */\n error?: string;\n}\n\n/**\n * A session to render: a `UnifiedSessionInput` (preferred — what\n * `GET /api/captain/sessions/{id}` serves), bare `SessionUIMessage[]`, a legacy\n * `SessionEntry[]` log, or raw log text (JSON array or JSONL).\n *\n * `SessionInspector` (and `SessionCollectionItem`) also accept a session URL\n * as `src` instead, with this contract:\n * - `GET {src}` with `Accept: application/json` returns one\n * `UnifiedSessionInput`. A non-2xx body is `{ error, … }` JSON or plain text\n * and is shown verbatim.\n * - `GET {src}?follow=1` (appended to any existing query) is an SSE stream of\n * `entry` frames (one `SessionUIMessage`, upserted by `id`), `state` frames\n * (`{ revision, lifecycleStatus, activityState, facets }` — a higher\n * revision, or a `facets` that differs from the last one seen, refetches\n * the aggregate; `facets` is an opaque fingerprint of the non-message\n * session facets — plan, todos, files, approval requests — and its first\n * reported value is the baseline, not itself a refetch trigger), `error`\n * frames (`{ error }`) and `: ping` comments; the server closes it once the\n * session is terminal.\n * - The stream is opened only while `lifecycleStatus` is non-terminal (not\n * succeeded/partial/failed/cancelled/interrupted/completed) unless the host\n * passes `follow`. See `useRemoteSession`.\n */\nexport type SessionInput =\n | string\n | SessionEntry[]\n | SessionUIMessage[]\n | UnifiedSessionInput;\n\nexport interface SessionMetadataSummary {\n /** Session identifier exposed by the context meter's copy action. */\n sessionId?: string;\n /** Runtime mechanism used to execute the session. */\n executionMode?: string;\n turns?: SessionTurn[];\n capabilities?: SessionCapabilities;\n budget?: SessionBudget;\n context?: SessionContext;\n events?: SessionMetadataEvent[];\n /** Dominant model id, for the context meter's hover popover. */\n model?: string;\n /** Provider id, used to resolve the model's brand glyph. */\n provider?: string;\n /** Session reasoning effort, for the context meter's hover popover. */\n reasoningEffort?: string;\n /** Last permission mode recorded in the transcript, for the header badge. */\n permissionMode?: string;\n /** Aggregate token usage, for the context meter's hover popover. */\n usage?: SessionUsage;\n /** Aggregate cost breakdown, for the context meter's hover popover. */\n cost?: SessionCost;\n}\n\n// ── Normalized events ───────────────────────────────────────────────────────\n// The raw schema interleaves consolidated `tool_use` rows with `message`\n// content blocks. normalizeSession flattens both shapes into a single ordered\n// list the viewer can render row-by-row.\n\nexport type SessionEventKind =\n | \"system\"\n | \"user\"\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"error\";\n\nexport interface SessionEvent {\n id: string;\n kind: SessionEventKind;\n /** Tool name (kind === \"tool\"). */\n tool?: string;\n toolInput?: Record<string, unknown>;\n toolResponse?: string;\n /** Prose for user/assistant/thinking, or the error message for errors. */\n text?: string;\n /** Canonical file part rendered as an attachment thumbnail or chip. */\n file?: SessionUIPart;\n /** Working directory the tool ran in — used to relativize file paths. */\n cwd?: string;\n timestamp?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n /** Typed approval for a pending tool row (see `SessionPendingTool.kind`). */\n approvalKind?: ApprovalKind;\n approvalRequest?: ApprovalRequest;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n errorType?: string;\n errorStatus?: number;\n /** Set for a `verified`/`verify_failed` role — the workflow verify verdict. */\n verifyPassed?: boolean;\n /** Row icon override (e.g. the verify glyph). Renderers fall back to the\n * kind's default icon when absent. */\n icon?: StaticIconComponent;\n /** Row tone override (e.g. pass/fail for a verify row). Renderers fall back\n * to the kind's default tone when absent. */\n tone?: SessionTone;\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max)}…`;\n}\n\n// parseEntries accepts a parsed array as-is, or parses a string as a whole-\n// document JSON (array or single object, possibly pretty-printed) first, then\n// falls back to JSONL (one object per line). The whole-document parse error is\n// caught only to attempt the JSONL fallback — a genuinely malformed JSONL line\n// throws loudly rather than being silently dropped.\nfunction parseEntries(input: string | SessionEntry[]): SessionEntry[] {\n if (Array.isArray(input)) return input;\n const text = input.trim();\n if (!text) return [];\n try {\n const parsed: unknown = JSON.parse(text);\n return Array.isArray(parsed)\n ? (parsed as SessionEntry[])\n : [parsed as SessionEntry];\n } catch {\n // not a single JSON document — treat as JSONL below\n }\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as SessionEntry;\n } catch {\n throw new Error(\n `SessionViewer: invalid session JSON line: ${truncate(line, 80)}`,\n );\n }\n });\n}\n\n// \"verified\"/\"verify_failed\" pass through unchanged — the legacy SessionEntry\n// path needs the raw role to route to the same verify row `normalizeMessages`\n// builds for the unified path (see the call site below), not just a\n// system/user/assistant kind.\nfunction roleFromType(type: string | undefined): string {\n return type === \"system\" ||\n type === \"user\" ||\n type === \"assistant\" ||\n type === \"verified\" ||\n type === \"verify_failed\"\n ? type\n : \"assistant\";\n}\n\nfunction toolEvent(\n id: string,\n tool: string,\n input: Record<string, unknown> | undefined,\n response: string | undefined,\n timestamp: string | undefined,\n meta: {\n model?: string;\n reasoningEffort?: string;\n source?: string;\n cwd?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n } = {},\n): SessionEvent {\n return {\n id,\n kind: \"tool\",\n tool,\n ...(input ? { toolInput: input } : {}),\n ...(response ? { toolResponse: response } : {}),\n ...(timestamp ? { timestamp } : {}),\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort ? { reasoningEffort: meta.reasoningEffort } : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.toolState ? { toolState: meta.toolState } : {}),\n ...(meta.approval ? { approval: meta.approval } : {}),\n pending: meta.pending ?? false,\n ...(meta.toolCallId ? { toolCallId: meta.toolCallId } : {}),\n ...(meta.approvalId ? { approvalId: meta.approvalId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n}\n\nfunction blockEvent(\n block: SessionContent,\n role: string,\n id: string,\n timestamp: string | undefined,\n cwd: string | undefined,\n verifyPassed: boolean | undefined,\n): SessionEvent | null {\n if (block.type === \"tool_use\" || (block.name && block.input)) {\n if (!block.name) return null;\n return toolEvent(id, block.name, block.input, undefined, timestamp, {\n ...(cwd ? { cwd } : {}),\n ...(block.id ? { toolCallId: block.id } : {}),\n });\n }\n if (block.type === \"thinking\" || block.thinking) {\n const text = block.thinking ?? block.text;\n return text\n ? { id, kind: \"thinking\", text, ...(timestamp ? { timestamp } : {}) }\n : null;\n }\n if (block.text) {\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row carrying the pass/fail tone and the\n // workflow verify glyph, mirroring `normalizeMessages`'s unified-path rows.\n return {\n id,\n kind:\n role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : role === \"user\"\n ? \"user\"\n : \"assistant\",\n text: block.text,\n ...(timestamp ? { timestamp } : {}),\n ...(verifyPassed !== undefined\n ? {\n verifyPassed,\n tone: verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n };\n }\n return null;\n}\n\n/** Flatten a captain session (unified messages, entries, or raw log text) into\n * ordered events. Unified `SessionUIMessage[]` is detected by its `parts`. */\nexport function normalizeSession(input: SessionInput): SessionEvent[] {\n if (looksLikeUnifiedSession(input)) {\n return normalizeMessages(input.messages ?? []);\n }\n if (Array.isArray(input) && looksLikeUnifiedMessages(input)) {\n return normalizeMessages(input);\n }\n const entries = parseEntries(input as string | SessionEntry[]);\n const events: SessionEvent[] = [];\n entries.forEach((entry, seq) => {\n const baseId = entry.uuid ?? `e${seq}`;\n\n if (entry.isApiErrorMessage) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: errorMessage(entry),\n ...(entry.error ? { errorType: entry.error } : {}),\n ...(entry.apiErrorStatus ? { errorStatus: entry.apiErrorStatus } : {}),\n ...(entry.timestamp ? { timestamp: entry.timestamp } : {}),\n raw: entry,\n });\n return;\n }\n\n const tu = entry.tool_use;\n if (tu?.tool) {\n const cwd = tu.cwd ?? entry.cwd;\n events.push(\n toolEvent(\n `${baseId}-tool`,\n tu.tool,\n tu.input,\n tu.response,\n tu.timestamp ?? entry.timestamp,\n {\n ...(tu.model ? { model: tu.model } : {}),\n ...(tu.reasoning_effort\n ? { reasoningEffort: tu.reasoning_effort }\n : {}),\n ...(tu.source ? { source: tu.source } : {}),\n ...(cwd ? { cwd } : {}),\n ...(tu.tool_use_id ? { toolCallId: tu.tool_use_id } : {}),\n ...(tu.session_id ? { sessionId: tu.session_id } : {}),\n raw: entry,\n },\n ),\n );\n return;\n }\n\n const role = roleFromType(entry.message?.role ?? entry.type);\n const verifyPassed =\n role === \"verified\" ? true : role === \"verify_failed\" ? false : undefined;\n for (const [i, block] of (entry.message?.content ?? []).entries()) {\n const ev = blockEvent(\n block,\n role,\n `${baseId}-${i}`,\n entry.timestamp,\n entry.cwd,\n verifyPassed,\n );\n if (ev) events.push(ev);\n }\n });\n return events;\n}\n\nexport function getSessionMetadata(\n input: SessionInput,\n): SessionMetadataSummary | undefined {\n if (!looksLikeUnifiedSession(input)) return undefined;\n const metadata: SessionMetadataSummary = {\n ...(input.id ? { sessionId: input.id } : {}),\n ...(input.executionMode ? { executionMode: input.executionMode } : {}),\n ...(input.turns ? { turns: input.turns } : {}),\n ...(input.capabilities ? { capabilities: input.capabilities } : {}),\n ...(input.budget ? { budget: input.budget } : {}),\n ...(input.context ? { context: input.context } : {}),\n ...(input.events ? { events: input.events } : {}),\n ...(input.model ? { model: input.model } : {}),\n ...(input.provider ? { provider: input.provider } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.permissionMode ? { permissionMode: input.permissionMode } : {}),\n ...(input.usage ? { usage: input.usage } : {}),\n ...(input.cost ? { cost: input.cost } : {}),\n };\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction errorMessage(entry: SessionEntry): string {\n const status = entry.apiErrorStatus ? ` (HTTP ${entry.apiErrorStatus})` : \"\";\n return `${entry.error ?? \"API error\"}${status}`;\n}\n\n// ── Unified message normalization ───────────────────────────────────────────\n// Projects the canonical SessionUIMessage[] (captain pkg/session) into the same\n// SessionEvent rows, so the viewer renders the unified model and the legacy\n// SessionEntry log identically.\n\n/** A unified message array is told apart from a SessionEntry log by its\n * per-message `parts` array (a SessionEntry carries `message`/`tool_use`). */\nfunction looksLikeUnifiedMessages(\n arr: SessionEntry[] | SessionUIMessage[],\n): arr is SessionUIMessage[] {\n const first: unknown = arr[0];\n return (\n typeof first === \"object\" &&\n first !== null &&\n Array.isArray((first as SessionUIMessage).parts)\n );\n}\n\nfunction looksLikeUnifiedSession(\n input: SessionInput,\n): input is UnifiedSessionInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n !Array.isArray(input) &&\n (\"messages\" in input ||\n \"turns\" in input ||\n \"capabilities\" in input ||\n \"budget\" in input ||\n \"context\" in input)\n );\n}\n\nfunction isUnifiedToolPart(part: SessionUIPart): boolean {\n return (\n Boolean(part.toolName) &&\n (part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\"))\n );\n}\n\n/** Render a tool part's already-parsed JSON output as text. */\nfunction outputToText(output: unknown): string | undefined {\n if (output == null) return undefined;\n return typeof output === \"string\" ? output : JSON.stringify(output);\n}\n\nfunction asRecord(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n}\n\nfunction partEvent(\n part: SessionUIPart,\n role: \"system\" | \"user\" | \"assistant\",\n id: string,\n meta: {\n timestamp?: string;\n cwd?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n sessionId?: string;\n raw?: unknown;\n verifyPassed?: boolean;\n },\n): SessionEvent | null {\n if (isUnifiedToolPart(part)) {\n const pending = pendingFromPart(part);\n return toolEvent(\n id,\n part.toolName as string,\n asRecord(part.input),\n outputToText(part.output),\n meta.timestamp,\n {\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort\n ? { reasoningEffort: meta.reasoningEffort }\n : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(part.state ? { toolState: part.state } : {}),\n ...(part.approval ? { approval: part.approval } : {}),\n pending,\n ...(part.toolCallId ? { toolCallId: part.toolCallId } : {}),\n ...(part.approval?.id ? { approvalId: part.approval.id } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n },\n );\n }\n if (part.type === \"reasoning\") {\n return part.text\n ? {\n id,\n kind: \"thinking\",\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n }\n : null;\n }\n if (part.type === \"file\") {\n return {\n id,\n kind: role,\n file: part,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n }\n if (part.type === \"text\") {\n return part.text\n ? {\n id,\n kind: role,\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n ...(meta.verifyPassed !== undefined\n ? {\n verifyPassed: meta.verifyPassed,\n tone: meta.verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n }\n : null;\n }\n return null;\n}\n\nfunction pendingFromPart(part: SessionUIPart): boolean {\n if (part.approval?.approved !== undefined) return false;\n if (\n [\"approval-responded\", \"output-available\", \"output-denied\"].includes(\n part.state ?? \"\",\n )\n )\n return false;\n return (\n part.pending === true ||\n part.approval?.pending === true ||\n part.state === \"approval-requested\"\n );\n}\n\n/** Flatten unified session messages into ordered SessionEvent rows. */\nexport function normalizeMessages(\n messages: SessionUIMessage[],\n): SessionEvent[] {\n const events: SessionEvent[] = [];\n messages.forEach((msg, seq) => {\n const prov = msg.provenance;\n const baseId = msg.id ?? prov?.uuid ?? `m${seq}`;\n if (prov?.apiErrorStatus) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: `API error (HTTP ${prov.apiErrorStatus})`,\n errorStatus: prov.apiErrorStatus,\n ...(prov.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov.agentId ? { agentId: prov.agentId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n });\n return;\n }\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row (not a fourth top-level kind) carrying the\n // pass/fail tone and the workflow verify glyph as data.\n const verifyPassed =\n msg.role === \"verified\"\n ? true\n : msg.role === \"verify_failed\"\n ? false\n : undefined;\n const role: \"system\" | \"user\" | \"assistant\" =\n msg.role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : msg.role === \"user\"\n ? \"user\"\n : \"assistant\";\n const meta = {\n ...(prov?.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(prov?.cwd ? { cwd: prov.cwd } : {}),\n ...(prov?.model ? { model: prov.model } : {}),\n ...(prov?.reasoningEffort\n ? { reasoningEffort: prov.reasoningEffort }\n : {}),\n ...(prov?.source ? { source: prov.source } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov?.agentId ? { agentId: prov.agentId } : {}),\n ...(prov?.sessionId ? { sessionId: prov.sessionId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n ...(verifyPassed !== undefined ? { verifyPassed } : {}),\n };\n const verifyKind = asRecord(\n msg.parts.find((part) => part.type === \"data-verify\")?.data,\n )?.kind;\n msg.parts.forEach((part, i) => {\n const shownPart =\n verifyPassed !== undefined &&\n part.type === \"text\" &&\n typeof verifyKind === \"string\" &&\n !part.text?.startsWith(`${verifyKind} ·`)\n ? { ...part, text: `${verifyKind} · ${part.text ?? \"\"}` }\n : part;\n const ev = partEvent(shownPart, role, `${baseId}-${i}`, meta);\n if (ev) events.push(ev);\n });\n });\n return events;\n}\n\n// ── Action icon registry ────────────────────────────────────────────────────\n// Implements the Flanksource \"Coding agent action icons\" design: every agent\n// tool maps to a Phosphor-derived generated icon (Ui*) and a semantic tone so a\n// scan of the log reads at a glance. Tones group by surface — file reads (sky),\n// writes (amber), edits (violet), execution (emerald), agents (indigo),\n// destructive (rose), assets (pink/fuchsia).\n\nexport type SessionTone =\n | \"sky\"\n | \"amber\"\n | \"violet\"\n | \"emerald\"\n | \"teal\"\n | \"orange\"\n | \"rose\"\n | \"indigo\"\n | \"fuchsia\"\n | \"pink\"\n | \"slate\";\n\nexport interface SessionActionMeta {\n icon: StaticIconComponent;\n tone: SessionTone;\n /** Human-readable verb shown as the row heading (and in the filter menu). */\n label: string;\n /** The row heading is the input summary alone (file path, command) — the\n * icon and tone carry the verb, so the label only appears in the menu. */\n summaryOnly?: boolean;\n}\n\nconst ACTIONS: Record<string, SessionActionMeta> = {\n // File operations. Read (eye) and Write (diff) are deliberately kept off the\n // design's file-text / file-plus glyphs — they read better in a scrolling log\n // and write-type rows also carry a +/- diff stat.\n Read: { icon: UiEye, tone: \"sky\", label: \"Read file\", summaryOnly: true },\n Write: {\n icon: UiDiff,\n tone: \"amber\",\n label: \"Write file\",\n summaryOnly: true,\n },\n Edit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit file\",\n summaryOnly: true,\n },\n MultiEdit: {\n icon: UiStack,\n tone: \"violet\",\n label: \"Multi-edit\",\n summaryOnly: true,\n },\n NotebookEdit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit notebook\",\n summaryOnly: true,\n },\n // Search & navigation\n Grep: { icon: UiSearch, tone: \"amber\", label: \"Grep\" },\n Glob: { icon: UiAsterisk, tone: \"sky\", label: \"Glob\" },\n // Execution & shell\n Bash: { icon: UiTerminal, tone: \"emerald\", label: \"Run command\" },\n BashOutput: { icon: UiCode2, tone: \"emerald\", label: \"Shell output\" },\n KillShell: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n KillBash: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n // Agents & planning\n Task: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Agent: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Skill: { icon: UiMagicWand, tone: \"fuchsia\", label: \"Invoke skill\" },\n TodoWrite: { icon: UiListChecks, tone: \"sky\", label: \"Update todos\" },\n Plan: { icon: UiStrategy, tone: \"sky\", label: \"Plan\" },\n TaskCreate: { icon: UiKanban, tone: \"sky\", label: \"Create task\" },\n TaskUpdate: { icon: UiKanban, tone: \"sky\", label: \"Update task\" },\n TaskList: { icon: UiKanban, tone: \"sky\", label: \"List tasks\" },\n TaskGet: { icon: UiKanban, tone: \"sky\", label: \"Get task\" },\n TaskOutput: { icon: UiKanban, tone: \"sky\", label: \"Task output\" },\n TaskStop: { icon: UiProhibit, tone: \"rose\", label: \"Stop task\" },\n ToolSearch: { icon: UiSearch, tone: \"amber\", label: \"Search tools\" },\n AskUserQuestion: { icon: UiQuestion, tone: \"sky\", label: \"Ask user\" },\n EnterPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Enter plan mode\" },\n ExitPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Exit plan mode\" },\n // Web & browser automation\n WebFetch: { icon: UiCloudDownload, tone: \"sky\", label: \"Fetch URL\" },\n WebSearch: { icon: UiGlobe, tone: \"sky\", label: \"Web search\" },\n browser_navigate: { icon: UiCompass, tone: \"sky\", label: \"Navigate\" },\n browser_navigate_back: {\n icon: UiCompass,\n tone: \"sky\",\n label: \"Navigate back\",\n },\n browser_click: { icon: UiCursorClick, tone: \"sky\", label: \"Click\" },\n browser_triple_click: {\n icon: UiCursorText,\n tone: \"sky\",\n label: \"Triple click\",\n },\n browser_type: { icon: UiKeyboard, tone: \"emerald\", label: \"Type text\" },\n browser_press_key: { icon: UiCommand, tone: \"amber\", label: \"Press key\" },\n browser_snapshot: { icon: UiScan, tone: \"violet\", label: \"Snapshot\" },\n browser_take_screenshot: {\n icon: UiCamera,\n tone: \"indigo\",\n label: \"Screenshot\",\n },\n browser_evaluate: { icon: UiCode2, tone: \"violet\", label: \"Evaluate JS\" },\n browser_console_messages: { icon: UiScroll, tone: \"slate\", label: \"Console\" },\n browser_network_requests: {\n icon: UiShare,\n tone: \"emerald\",\n label: \"Network\",\n },\n browser_wait_for: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n Wait: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n browser_close: { icon: UiClose, tone: \"rose\", label: \"Close browser\" },\n};\n\n// MCP tools surface as `mcp__<server>__<name>` or `<server>__<name>`. Icon\n// servers get a distinct accent (palette); generative servers reuse the sparkle;\n// the rest fall back to the puzzle piece.\nconst MCP_ICON_SERVERS = new Set([\n \"iconify\",\n \"icons8\",\n \"lucide\",\n \"react-icons\",\n]);\nconst MCP_GEN_SERVERS = new Set([\"gemini\", \"openai\", \"anthropic\"]);\n\ninterface McpTool {\n server: string;\n name: string;\n}\n\nexport function splitMcpTool(tool: string): McpTool | null {\n const rest = tool.startsWith(\"mcp__\") ? tool.slice(\"mcp__\".length) : tool;\n const idx = rest.indexOf(\"__\");\n if (idx < 0) return null;\n return { server: rest.slice(0, idx), name: rest.slice(idx + 2) };\n}\n\n/** Resolve the icon, tone, and label for a tool name. */\nexport function getSessionAction(tool: string): SessionActionMeta {\n const exact = ACTIONS[tool];\n if (exact) return exact;\n\n const mcp = splitMcpTool(tool);\n if (mcp) {\n const label = `${mcp.server}: ${mcp.name.replace(/_/g, \" \")}`;\n if (MCP_ICON_SERVERS.has(mcp.server))\n return { icon: UiPalette, tone: \"pink\", label };\n if (MCP_GEN_SERVERS.has(mcp.server))\n return { icon: UiSparkles, tone: \"violet\", label };\n return { icon: UiPuzzle, tone: \"violet\", label };\n }\n\n return { icon: UiWrench, tone: \"slate\", label: tool };\n}\n\n/** Count tool-call events, the dominant model, and totals for the header. */\nexport function summarizeSession(events: SessionEvent[]): {\n toolCount: number;\n messageCount: number;\n model?: string;\n} {\n let toolCount = 0;\n let messageCount = 0;\n const modelCounts = new Map<string, number>();\n for (const event of events) {\n if (event.kind === \"tool\") toolCount += 1;\n if (\n event.kind === \"system\" ||\n event.kind === \"user\" ||\n event.kind === \"assistant\"\n ) {\n messageCount += 1;\n }\n if (event.model)\n modelCounts.set(event.model, (modelCounts.get(event.model) ?? 0) + 1);\n }\n let model: string | undefined;\n let best = 0;\n for (const [name, count] of modelCounts) {\n if (count > best) {\n best = count;\n model = name;\n }\n }\n return { toolCount, messageCount, ...(model ? { model } : {}) };\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+MO,SAAS,SAAS,MAAc,KAAqB;AAC1D,SAAO,KAAK,UAAU,MAAM,OAAO,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC;AAC1D;AAOA,SAAS,aAAa,OAAgD;AACpE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,QAAM,OAAO,MAAM,KAAA;AACnB,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,WAAO,MAAM,QAAQ,MAAM,IACtB,SACD,CAAC,MAAsB;AAAA,EAC7B,QAAQ;AAAA,EAER;AACA,SAAO,KACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAA,CAAM,EACzB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,6CAA6C,SAAS,MAAM,EAAE,CAAC;AAAA,MAAA;AAAA,IAEnE;AAAA,EACF,CAAC;AACL;AAMA,SAAS,aAAa,MAAkC;AACtD,SAAO,SAAS,YACd,SAAS,UACT,SAAS,eACT,SAAS,cACT,SAAS,kBACP,OACA;AACN;AAEA,SAAS,UACP,IACA,MACA,OACA,UACA,WACA,OAcI,IACU;AACd,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,GAAI,QAAQ,EAAE,WAAW,MAAA,IAAU,CAAA;AAAA,IACnC,GAAI,WAAW,EAAE,cAAc,SAAA,IAAa,CAAA;AAAA,IAC5C,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,IAChC,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAA,IAAU,CAAA;AAAA,IACzC,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,KAAK,gBAAA,IAAoB,CAAA;AAAA,IACvE,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAI,KAAK,MAAM,EAAE,KAAK,KAAK,IAAA,IAAQ,CAAA;AAAA,IACnC,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,IAC/C,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,IACrD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAA,IAAa,CAAA;AAAA,IAClD,SAAS,KAAK,WAAW;AAAA,IACzB,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAA,IAAe,CAAA;AAAA,IACxD,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAA,IAAe,CAAA;AAAA,IACxD,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,IACrD,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,QAAQ,CAAA;AAAA,EAAC;AAEtD;AAEA,SAAS,WACP,OACA,MACA,IACA,WACA,KACA,cACqB;AACrB,MAAI,MAAM,SAAS,cAAe,MAAM,QAAQ,MAAM,OAAQ;AAC5D,QAAI,CAAC,MAAM,KAAM,QAAO;AACxB,WAAO,UAAU,IAAI,MAAM,MAAM,MAAM,OAAO,QAAW,WAAW;AAAA,MAClE,GAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,MACpB,GAAI,MAAM,KAAK,EAAE,YAAY,MAAM,GAAA,IAAO,CAAA;AAAA,IAAC,CAC5C;AAAA,EACH;AACA,MAAI,MAAM,SAAS,cAAc,MAAM,UAAU;AAC/C,UAAM,OAAO,MAAM,YAAY,MAAM;AACrC,WAAO,OACH,EAAE,IAAI,MAAM,YAAY,MAAM,GAAI,YAAY,EAAE,cAAc,CAAA,MAC9D;AAAA,EACN;AACA,MAAI,MAAM,MAAM;AAId,WAAO;AAAA,MACL;AAAA,MACA,MACE,SAAS,YAAY,iBAAiB,SAClC,WACA,SAAS,SACP,SACA;AAAA,MACR,MAAM,MAAM;AAAA,MACZ,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,SACjB;AAAA,QACE;AAAA,QACA,MAAM,eAAe,YAAY;AAAA,QACjC,MAAM,gBAAgB,OAAO;AAAA,MAAA,IAE/B,CAAA;AAAA,IAAC;AAAA,EAET;AACA,SAAO;AACT;AAIO,SAAS,iBAAiB,OAAqC;AACpE,MAAI,wBAAwB,KAAK,GAAG;AAClC,WAAO,kBAAkB,MAAM,YAAY,EAAE;AAAA,EAC/C;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,yBAAyB,KAAK,GAAG;AAC3D,WAAO,kBAAkB,KAAK;AAAA,EAChC;AACA,QAAM,UAAU,aAAa,KAAgC;AAC7D,QAAM,SAAyB,CAAA;AAC/B,UAAQ,QAAQ,CAAC,OAAO,QAAQ;;AAC9B,UAAM,SAAS,MAAM,QAAQ,IAAI,GAAG;AAEpC,QAAI,MAAM,mBAAmB;AAC3B,aAAO,KAAK;AAAA,QACV,IAAI,GAAG,MAAM;AAAA,QACb,MAAM;AAAA,QACN,MAAM,aAAa,KAAK;AAAA,QACxB,GAAI,MAAM,QAAQ,EAAE,WAAW,MAAM,MAAA,IAAU,CAAA;AAAA,QAC/C,GAAI,MAAM,iBAAiB,EAAE,aAAa,MAAM,eAAA,IAAmB,CAAA;AAAA,QACnE,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAA,IAAc,CAAA;AAAA,QACvD,KAAK;AAAA,MAAA,CACN;AACD;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AACjB,QAAI,yBAAI,MAAM;AACZ,YAAM,MAAM,GAAG,OAAO,MAAM;AAC5B,aAAO;AAAA,QACL;AAAA,UACE,GAAG,MAAM;AAAA,UACT,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG,aAAa,MAAM;AAAA,UACtB;AAAA,YACE,GAAI,GAAG,QAAQ,EAAE,OAAO,GAAG,MAAA,IAAU,CAAA;AAAA,YACrC,GAAI,GAAG,mBACH,EAAE,iBAAiB,GAAG,iBAAA,IACtB,CAAA;AAAA,YACJ,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAA,IAAW,CAAA;AAAA,YACxC,GAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,YACpB,GAAI,GAAG,cAAc,EAAE,YAAY,GAAG,YAAA,IAAgB,CAAA;AAAA,YACtD,GAAI,GAAG,aAAa,EAAE,WAAW,GAAG,WAAA,IAAe,CAAA;AAAA,YACnD,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAEF;AAAA,IACF;AAEA,UAAM,OAAO,eAAa,WAAM,YAAN,mBAAe,SAAQ,MAAM,IAAI;AAC3D,UAAM,eACJ,SAAS,aAAa,OAAO,SAAS,kBAAkB,QAAQ;AAClE,eAAW,CAAC,GAAG,KAAK,QAAM,WAAM,YAAN,mBAAe,YAAW,IAAI,WAAW;AACjE,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,GAAG,MAAM,IAAI,CAAC;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MAAA;AAEF,UAAI,GAAI,QAAO,KAAK,EAAE;AAAA,IACxB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEO,SAAS,mBACd,OACoC;AACpC,MAAI,CAAC,wBAAwB,KAAK,EAAG,QAAO;AAC5C,QAAM,WAAmC;AAAA,IACvC,GAAI,MAAM,KAAK,EAAE,WAAW,MAAM,GAAA,IAAO,CAAA;AAAA,IACzC,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAA,IAAkB,CAAA;AAAA,IACnE,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3C,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,aAAA,IAAiB,CAAA;AAAA,IAChE,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAA,IAAW,CAAA;AAAA,IAC9C,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAA,IAAY,CAAA;AAAA,IACjD,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAA,IAAW,CAAA;AAAA,IAC9C,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3C,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,IACpD,GAAI,MAAM,kBACN,EAAE,iBAAiB,MAAM,gBAAA,IACzB,CAAA;AAAA,IACJ,GAAI,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,eAAA,IAAmB,CAAA;AAAA,IACtE,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3C,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAA,IAAS,CAAA;AAAA,EAAC;AAE3C,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACvD;AAEA,SAAS,aAAa,OAA6B;AACjD,QAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM,cAAc,MAAM;AAC1E,SAAO,GAAG,MAAM,SAAS,WAAW,GAAG,MAAM;AAC/C;AASA,SAAS,yBACP,KAC2B;AAC3B,QAAM,QAAiB,IAAI,CAAC;AAC5B,SACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAS,MAA2B,KAAK;AAEnD;AAEA,SAAS,wBACP,OAC8B;AAC9B,SACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,MACnB,cAAc,SACb,WAAW,SACX,kBAAkB,SAClB,YAAY,SACZ,aAAa;AAEnB;AAEA,SAAS,kBAAkB,MAA8B;AACvD,SACE,QAAQ,KAAK,QAAQ,MACpB,KAAK,SAAS,kBAAkB,KAAK,KAAK,WAAW,OAAO;AAEjE;AAGA,SAAS,aAAa,QAAqC;AACzD,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AACpE;AAEA,SAAS,SAAS,OAAqD;AACrE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAAS,UACP,MACA,MACA,IACA,MAYqB;;AACrB,MAAI,kBAAkB,IAAI,GAAG;AAC3B,UAAM,UAAU,gBAAgB,IAAI;AACpC,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,SAAS,KAAK,KAAK;AAAA,MACnB,aAAa,KAAK,MAAM;AAAA,MACxB,KAAK;AAAA,MACL;AAAA,QACE,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAA,IAAU,CAAA;AAAA,QACzC,GAAI,KAAK,kBACL,EAAE,iBAAiB,KAAK,gBAAA,IACxB,CAAA;AAAA,QACJ,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,QAC5C,GAAI,KAAK,MAAM,EAAE,KAAK,KAAK,IAAA,IAAQ,CAAA;AAAA,QACnC,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,QAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,QAC/C,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,QACrD,GAAI,KAAK,QAAQ,EAAE,WAAW,KAAK,MAAA,IAAU,CAAA;AAAA,QAC7C,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAA,IAAa,CAAA;AAAA,QAClD;AAAA,QACA,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAA,IAAe,CAAA;AAAA,QACxD,KAAI,UAAK,aAAL,mBAAe,MAAK,EAAE,YAAY,KAAK,SAAS,GAAA,IAAO,CAAA;AAAA,QAC3D,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,QAAQ,CAAA;AAAA,MAAC;AAAA,IACpD;AAAA,EAEJ;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,KAAK,OACR;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,MACrD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,MAC/C,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,QAAQ,CAAA;AAAA,IAAC,IAEpD;AAAA,EACN;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,MACrD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,MAC/C,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,QAAQ,CAAA;AAAA,IAAC;AAAA,EAEtD;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK,OACR;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,MACrD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,MAC/C,GAAI,KAAK,QAAQ,SAAY,EAAE,KAAK,KAAK,IAAA,IAAQ,CAAA;AAAA,MACjD,GAAI,KAAK,iBAAiB,SACtB;AAAA,QACE,cAAc,KAAK;AAAA,QACnB,MAAM,KAAK,eAAe,YAAY;AAAA,QACtC,MAAM,gBAAgB,OAAO;AAAA,MAAA,IAE/B,CAAA;AAAA,IAAC,IAEP;AAAA,EACN;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA8B;;AACrD,QAAI,UAAK,aAAL,mBAAe,cAAa,OAAW,QAAO;AAClD,MACE,CAAC,sBAAsB,oBAAoB,eAAe,EAAE;AAAA,IAC1D,KAAK,SAAS;AAAA,EAAA;AAGhB,WAAO;AACT,SACE,KAAK,YAAY,UACjB,UAAK,aAAL,mBAAe,aAAY,QAC3B,KAAK,UAAU;AAEnB;AAGO,SAAS,kBACd,UACgB;AAChB,QAAM,SAAyB,CAAA;AAC/B,WAAS,QAAQ,CAAC,KAAK,QAAQ;;AAC7B,UAAM,OAAO,IAAI;AACjB,UAAM,SAAS,IAAI,OAAM,6BAAM,SAAQ,IAAI,GAAG;AAC9C,QAAI,6BAAM,gBAAgB;AACxB,aAAO,KAAK;AAAA,QACV,IAAI,GAAG,MAAM;AAAA,QACb,MAAM;AAAA,QACN,MAAM,mBAAmB,KAAK,cAAc;AAAA,QAC5C,aAAa,KAAK;AAAA,QAClB,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,QACrD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAA,IAAW,CAAA;AAAA,QAC1C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,QAC/C,GAAI,IAAI,QAAQ,SAAY,EAAE,KAAK,IAAI,QAAQ,CAAA;AAAA,MAAC,CACjD;AACD;AAAA,IACF;AAIA,UAAM,eACJ,IAAI,SAAS,aACT,OACA,IAAI,SAAS,kBACX,QACA;AACR,UAAM,OACJ,IAAI,SAAS,YAAY,iBAAiB,SACtC,WACA,IAAI,SAAS,SACX,SACA;AACR,UAAM,OAAO;AAAA,MACX,IAAI,6BAAM,aAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,MACtD,IAAI,6BAAM,OAAM,EAAE,KAAK,KAAK,IAAA,IAAQ,CAAA;AAAA,MACpC,IAAI,6BAAM,SAAQ,EAAE,OAAO,KAAK,MAAA,IAAU,CAAA;AAAA,MAC1C,IAAI,6BAAM,mBACN,EAAE,iBAAiB,KAAK,gBAAA,IACxB,CAAA;AAAA,MACJ,IAAI,6BAAM,UAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC7C,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAA,IAAW,CAAA;AAAA,MAC1C,IAAI,6BAAM,WAAU,EAAE,SAAS,KAAK,QAAA,IAAY,CAAA;AAAA,MAChD,IAAI,6BAAM,aAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,MACtD,GAAI,IAAI,QAAQ,SAAY,EAAE,KAAK,IAAI,IAAA,IAAQ,CAAA;AAAA,MAC/C,GAAI,iBAAiB,SAAY,EAAE,iBAAiB,CAAA;AAAA,IAAC;AAEvD,UAAM,cAAa;AAAA,OACjB,SAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,aAAa,MAApD,mBAAuD;AAAA,IAAA,MADtC,mBAEhB;AACH,QAAI,MAAM,QAAQ,CAAC,MAAM,MAAM;;AAC7B,YAAM,YACJ,iBAAiB,UACjB,KAAK,SAAS,UACd,OAAO,eAAe,YACtB,GAACA,MAAA,KAAK,SAAL,gBAAAA,IAAW,WAAW,GAAG,UAAU,SAChC,EAAE,GAAG,MAAM,MAAM,GAAG,UAAU,MAAM,KAAK,QAAQ,EAAE,GAAA,IACnD;AACN,YAAM,KAAK,UAAU,WAAW,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,IAAI;AAC5D,UAAI,GAAI,QAAO,KAAK,EAAE;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;AAgCA,MAAM,UAA6C;AAAA;AAAA;AAAA;AAAA,EAIjD,MAAM,EAAE,MAAM,OAAO,MAAM,OAAO,OAAO,aAAa,aAAa,KAAA;AAAA,EACnE,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf,WAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA;AAAA,EAGf,MAAM,EAAE,MAAM,UAAU,MAAM,SAAS,OAAO,OAAA;AAAA,EAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,OAAA;AAAA;AAAA,EAE9C,MAAM,EAAE,MAAM,YAAY,MAAM,WAAW,OAAO,cAAA;AAAA,EAClD,YAAY,EAAE,MAAM,SAAS,MAAM,WAAW,OAAO,eAAA;AAAA,EACrD,WAAW,EAAE,MAAM,YAAY,MAAM,QAAQ,OAAO,aAAA;AAAA,EACpD,UAAU,EAAE,MAAM,YAAY,MAAM,QAAQ,OAAO,aAAA;AAAA;AAAA,EAEnD,MAAM,EAAE,MAAM,WAAW,MAAM,UAAU,OAAO,iBAAA;AAAA,EAChD,OAAO,EAAE,MAAM,WAAW,MAAM,UAAU,OAAO,iBAAA;AAAA,EACjD,OAAO,EAAE,MAAM,aAAa,MAAM,WAAW,OAAO,eAAA;AAAA,EACpD,WAAW,EAAE,MAAM,cAAc,MAAM,OAAO,OAAO,eAAA;AAAA,EACrD,MAAM,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,OAAA;AAAA,EAC9C,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,cAAA;AAAA,EAClD,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,cAAA;AAAA,EAClD,UAAU,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,aAAA;AAAA,EAChD,SAAS,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,WAAA;AAAA,EAC/C,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,cAAA;AAAA,EAClD,UAAU,EAAE,MAAM,YAAY,MAAM,QAAQ,OAAO,YAAA;AAAA,EACnD,YAAY,EAAE,MAAM,UAAU,MAAM,SAAS,OAAO,eAAA;AAAA,EACpD,iBAAiB,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,WAAA;AAAA,EACzD,eAAe,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,kBAAA;AAAA,EACvD,cAAc,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,iBAAA;AAAA;AAAA,EAEtD,UAAU,EAAE,MAAM,iBAAiB,MAAM,OAAO,OAAO,YAAA;AAAA,EACvD,WAAW,EAAE,MAAM,SAAS,MAAM,OAAO,OAAO,aAAA;AAAA,EAChD,kBAAkB,EAAE,MAAM,WAAW,MAAM,OAAO,OAAO,WAAA;AAAA,EACzD,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,eAAe,EAAE,MAAM,eAAe,MAAM,OAAO,OAAO,QAAA;AAAA,EAC1D,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,cAAc,EAAE,MAAM,YAAY,MAAM,WAAW,OAAO,YAAA;AAAA,EAC1D,mBAAmB,EAAE,MAAM,WAAW,MAAM,SAAS,OAAO,YAAA;AAAA,EAC5D,kBAAkB,EAAE,MAAM,QAAQ,MAAM,UAAU,OAAO,WAAA;AAAA,EACzD,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,kBAAkB,EAAE,MAAM,SAAS,MAAM,UAAU,OAAO,cAAA;AAAA,EAC1D,0BAA0B,EAAE,MAAM,UAAU,MAAM,SAAS,OAAO,UAAA;AAAA,EAClE,0BAA0B;AAAA,IACxB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,kBAAkB,EAAE,MAAM,aAAa,MAAM,SAAS,OAAO,OAAA;AAAA,EAC7D,MAAM,EAAE,MAAM,aAAa,MAAM,SAAS,OAAO,OAAA;AAAA,EACjD,eAAe,EAAE,MAAM,SAAS,MAAM,QAAQ,OAAO,gBAAA;AACvD;AAKA,MAAM,uCAAuB,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,MAAM,kBAAkB,oBAAI,IAAI,CAAC,UAAU,UAAU,WAAW,CAAC;AAO1D,SAAS,aAAa,MAA8B;AACzD,QAAM,OAAO,KAAK,WAAW,OAAO,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI;AACrE,QAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,MAAM,MAAM,CAAC,EAAA;AAC/D;AAGO,SAAS,iBAAiB,MAAiC;AAChE,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,MAAO,QAAO;AAElB,QAAM,MAAM,aAAa,IAAI;AAC7B,MAAI,KAAK;AACP,UAAM,QAAQ,GAAG,IAAI,MAAM,KAAK,IAAI,KAAK,QAAQ,MAAM,GAAG,CAAC;AAC3D,QAAI,iBAAiB,IAAI,IAAI,MAAM;AACjC,aAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,MAAA;AAC1C,QAAI,gBAAgB,IAAI,IAAI,MAAM;AAChC,aAAO,EAAE,MAAM,YAAY,MAAM,UAAU,MAAA;AAC7C,WAAO,EAAE,MAAM,UAAU,MAAM,UAAU,MAAA;AAAA,EAC3C;AAEA,SAAO,EAAE,MAAM,UAAU,MAAM,SAAS,OAAO,KAAA;AACjD;AAGO,SAAS,iBAAiB,QAI/B;AACA,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,QAAM,kCAAkB,IAAA;AACxB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,OAAQ,cAAa;AACxC,QACE,MAAM,SAAS,YACf,MAAM,SAAS,UACf,MAAM,SAAS,aACf;AACA,sBAAgB;AAAA,IAClB;AACA,QAAI,MAAM;AACR,kBAAY,IAAI,MAAM,QAAQ,YAAY,IAAI,MAAM,KAAK,KAAK,KAAK,CAAC;AAAA,EACxE;AACA,MAAI;AACJ,MAAI,OAAO;AACX,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,QAAI,QAAQ,MAAM;AAChB,aAAO;AACP,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO,EAAE,WAAW,cAAc,GAAI,QAAQ,EAAE,MAAA,IAAU,GAAC;AAC7D;"}
|
|
1
|
+
{"version":3,"file":"SessionViewer.model.js","sources":["../../../src/data/ai/SessionViewer.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { WORKFLOW_PHASES } from \"./agent-action-icons\";\nimport type { ApprovalKind, ApprovalRequest } from \"./approval-request\";\nimport type {\n SessionBudget,\n SessionCapabilities,\n SessionContext,\n SessionCost,\n SessionMetadataEvent,\n SessionTurn,\n SessionUIMessage,\n SessionUIPart,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport {\n UiAsterisk,\n UiCamera,\n UiClose,\n UiCloudDownload,\n UiCode2,\n UiCommand,\n UiCompass,\n UiCursorClick,\n UiCursorText,\n UiDiff,\n UiEye,\n UiGlobe,\n UiHourglass,\n UiKanban,\n UiKeyboard,\n UiListChecks,\n UiMagicWand,\n UiPalette,\n UiPencilSimpleLine,\n UiProhibit,\n UiPuzzle,\n UiQuestion,\n UiRobotAi,\n UiScan,\n UiScroll,\n UiSearch,\n UiShare,\n UiSparkles,\n UiStack,\n UiStrategy,\n UiTerminal,\n UiWrench,\n} from \"../../icons\";\n\n// ── Captain session schema ──────────────────────────────────────────────────\n// Mirrors github.com/flanksource/captain pkg/ai/history types. A session is a\n// list of SessionEntry records (the rows of a Claude Code / Codex JSONL log).\n\nexport interface SessionToolUse {\n tool?: string;\n input?: Record<string, unknown>;\n timestamp?: string;\n cwd?: string;\n session_id?: string;\n tool_use_id?: string;\n /** \"claude\" or \"codex\". */\n source?: string;\n model?: string;\n reasoning_effort?: string;\n response?: string;\n}\n\nexport interface SessionContent {\n /** Block kind: \"text\", \"thinking\", \"tool_use\", \"tool_result\", … */\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n input?: Record<string, unknown>;\n id?: string;\n}\n\nexport interface SessionMessage {\n role?: string;\n stop_reason?: string;\n content?: SessionContent[];\n}\n\nexport interface SessionEntry {\n /** Top-level entry kind: assistant, user, system, … */\n type?: string;\n tool_use?: SessionToolUse;\n message?: SessionMessage;\n timestamp?: string;\n cwd?: string;\n sessionId?: string;\n uuid?: string;\n /** Synthetic assistant entry Claude Code writes when an API request fails. */\n isApiErrorMessage?: boolean;\n apiErrorStatus?: number;\n /** Claude Code's error classification (e.g. \"rate_limit\"). */\n error?: string;\n}\n\n/**\n * A session to render: a `UnifiedSessionInput` (preferred — what\n * `GET /api/captain/sessions/{id}` serves), bare `SessionUIMessage[]`, a legacy\n * `SessionEntry[]` log, or raw log text (JSON array or JSONL).\n *\n * `SessionInspector` (and `SessionCollectionItem`) also accept a session URL\n * as `src` instead, with this contract:\n * - `GET {src}` with `Accept: application/json` returns one\n * `UnifiedSessionInput`. A non-2xx body is `{ error, … }` JSON or plain text\n * and is shown verbatim.\n * - `GET {src}?follow=1` (appended to any existing query) is an SSE stream of\n * `entry` frames (one `SessionUIMessage`, upserted by `id`), `state` frames\n * (`{ revision, lifecycleStatus, activityState, facets }` — a higher\n * revision, or a `facets` that differs from the last one seen, refetches\n * the aggregate; `facets` is an opaque fingerprint of the non-message\n * session facets — plan, todos, files, approval requests — and its first\n * reported value is the baseline, not itself a refetch trigger), `error`\n * frames (`{ error }`) and `: ping` comments; the server closes it once the\n * session is terminal.\n * - The stream is opened only while `lifecycleStatus` is non-terminal (not\n * succeeded/partial/failed/cancelled/interrupted/completed) unless the host\n * passes `follow`. See `useRemoteSession`.\n */\nexport type SessionInput =\n | string\n | SessionEntry[]\n | SessionUIMessage[]\n | UnifiedSessionInput;\n\nexport interface SessionMetadataSummary {\n /** Session identifier exposed by the context meter's copy action. */\n sessionId?: string;\n /** Runtime mechanism used to execute the session. */\n executionMode?: string;\n turns?: SessionTurn[];\n capabilities?: SessionCapabilities;\n budget?: SessionBudget;\n context?: SessionContext;\n events?: SessionMetadataEvent[];\n /** Dominant model id, for the context meter's hover popover. */\n model?: string;\n /** Provider id, used to resolve the model's brand glyph. */\n provider?: string;\n /** Session reasoning effort, for the context meter's hover popover. */\n reasoningEffort?: string;\n /** Last permission mode recorded in the transcript, for the header badge. */\n permissionMode?: string;\n /** Aggregate token usage, for the context meter's hover popover. */\n usage?: SessionUsage;\n /** Aggregate cost breakdown, for the context meter's hover popover. */\n cost?: SessionCost;\n}\n\n// ── Normalized events ───────────────────────────────────────────────────────\n// The raw schema interleaves consolidated `tool_use` rows with `message`\n// content blocks. normalizeSession flattens both shapes into a single ordered\n// list the viewer can render row-by-row.\n\nexport type SessionEventKind =\n | \"system\"\n | \"user\"\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"error\";\n\nexport interface SessionEvent {\n id: string;\n kind: SessionEventKind;\n /** Tool name (kind === \"tool\"). */\n tool?: string;\n toolInput?: Record<string, unknown>;\n toolResponse?: string;\n estimatedCost?: SessionUIPart[\"estimatedCost\"];\n /** Prose for user/assistant/thinking, or the error message for errors. */\n text?: string;\n /** Canonical file part rendered as an attachment thumbnail or chip. */\n file?: SessionUIPart;\n /** Working directory the tool ran in — used to relativize file paths. */\n cwd?: string;\n timestamp?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n /** Typed approval for a pending tool row (see `SessionPendingTool.kind`). */\n approvalKind?: ApprovalKind;\n approvalRequest?: ApprovalRequest;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n errorType?: string;\n errorStatus?: number;\n /** Set for a `verified`/`verify_failed` role — the workflow verify verdict. */\n verifyPassed?: boolean;\n /** Row icon override (e.g. the verify glyph). Renderers fall back to the\n * kind's default icon when absent. */\n icon?: StaticIconComponent;\n /** Row tone override (e.g. pass/fail for a verify row). Renderers fall back\n * to the kind's default tone when absent. */\n tone?: SessionTone;\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max)}…`;\n}\n\n// parseEntries accepts a parsed array as-is, or parses a string as a whole-\n// document JSON (array or single object, possibly pretty-printed) first, then\n// falls back to JSONL (one object per line). The whole-document parse error is\n// caught only to attempt the JSONL fallback — a genuinely malformed JSONL line\n// throws loudly rather than being silently dropped.\nfunction parseEntries(input: string | SessionEntry[]): SessionEntry[] {\n if (Array.isArray(input)) return input;\n const text = input.trim();\n if (!text) return [];\n try {\n const parsed: unknown = JSON.parse(text);\n return Array.isArray(parsed)\n ? (parsed as SessionEntry[])\n : [parsed as SessionEntry];\n } catch {\n // not a single JSON document — treat as JSONL below\n }\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as SessionEntry;\n } catch {\n throw new Error(\n `SessionViewer: invalid session JSON line: ${truncate(line, 80)}`,\n );\n }\n });\n}\n\n// \"verified\"/\"verify_failed\" pass through unchanged — the legacy SessionEntry\n// path needs the raw role to route to the same verify row `normalizeMessages`\n// builds for the unified path (see the call site below), not just a\n// system/user/assistant kind.\nfunction roleFromType(type: string | undefined): string {\n return type === \"system\" ||\n type === \"user\" ||\n type === \"assistant\" ||\n type === \"verified\" ||\n type === \"verify_failed\"\n ? type\n : \"assistant\";\n}\n\nfunction toolEvent(\n id: string,\n tool: string,\n input: Record<string, unknown> | undefined,\n response: string | undefined,\n timestamp: string | undefined,\n meta: {\n model?: string;\n reasoningEffort?: string;\n source?: string;\n cwd?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n estimatedCost?: SessionUIPart[\"estimatedCost\"];\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n } = {},\n): SessionEvent {\n return {\n id,\n kind: \"tool\",\n tool,\n ...(input ? { toolInput: input } : {}),\n ...(response ? { toolResponse: response } : {}),\n ...(timestamp ? { timestamp } : {}),\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort ? { reasoningEffort: meta.reasoningEffort } : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.toolState ? { toolState: meta.toolState } : {}),\n ...(meta.estimatedCost ? { estimatedCost: meta.estimatedCost } : {}),\n ...(meta.approval ? { approval: meta.approval } : {}),\n pending: meta.pending ?? false,\n ...(meta.toolCallId ? { toolCallId: meta.toolCallId } : {}),\n ...(meta.approvalId ? { approvalId: meta.approvalId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n}\n\nfunction blockEvent(\n block: SessionContent,\n role: string,\n id: string,\n timestamp: string | undefined,\n cwd: string | undefined,\n verifyPassed: boolean | undefined,\n): SessionEvent | null {\n if (block.type === \"tool_use\" || (block.name && block.input)) {\n if (!block.name) return null;\n return toolEvent(id, block.name, block.input, undefined, timestamp, {\n ...(cwd ? { cwd } : {}),\n ...(block.id ? { toolCallId: block.id } : {}),\n });\n }\n if (block.type === \"thinking\" || block.thinking) {\n const text = block.thinking ?? block.text;\n return text\n ? { id, kind: \"thinking\", text, ...(timestamp ? { timestamp } : {}) }\n : null;\n }\n if (block.text) {\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row carrying the pass/fail tone and the\n // workflow verify glyph, mirroring `normalizeMessages`'s unified-path rows.\n return {\n id,\n kind:\n role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : role === \"user\"\n ? \"user\"\n : \"assistant\",\n text: block.text,\n ...(timestamp ? { timestamp } : {}),\n ...(verifyPassed !== undefined\n ? {\n verifyPassed,\n tone: verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n };\n }\n return null;\n}\n\n/** Flatten a captain session (unified messages, entries, or raw log text) into\n * ordered events. Unified `SessionUIMessage[]` is detected by its `parts`. */\nexport function normalizeSession(input: SessionInput): SessionEvent[] {\n if (looksLikeUnifiedSession(input)) {\n return normalizeMessages(input.messages ?? []);\n }\n if (Array.isArray(input) && looksLikeUnifiedMessages(input)) {\n return normalizeMessages(input);\n }\n const entries = parseEntries(input as string | SessionEntry[]);\n const events: SessionEvent[] = [];\n entries.forEach((entry, seq) => {\n const baseId = entry.uuid ?? `e${seq}`;\n\n if (entry.isApiErrorMessage) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: errorMessage(entry),\n ...(entry.error ? { errorType: entry.error } : {}),\n ...(entry.apiErrorStatus ? { errorStatus: entry.apiErrorStatus } : {}),\n ...(entry.timestamp ? { timestamp: entry.timestamp } : {}),\n raw: entry,\n });\n return;\n }\n\n const tu = entry.tool_use;\n if (tu?.tool) {\n const cwd = tu.cwd ?? entry.cwd;\n events.push(\n toolEvent(\n `${baseId}-tool`,\n tu.tool,\n tu.input,\n tu.response,\n tu.timestamp ?? entry.timestamp,\n {\n ...(tu.model ? { model: tu.model } : {}),\n ...(tu.reasoning_effort\n ? { reasoningEffort: tu.reasoning_effort }\n : {}),\n ...(tu.source ? { source: tu.source } : {}),\n ...(cwd ? { cwd } : {}),\n ...(tu.tool_use_id ? { toolCallId: tu.tool_use_id } : {}),\n ...(tu.session_id ? { sessionId: tu.session_id } : {}),\n raw: entry,\n },\n ),\n );\n return;\n }\n\n const role = roleFromType(entry.message?.role ?? entry.type);\n const verifyPassed =\n role === \"verified\" ? true : role === \"verify_failed\" ? false : undefined;\n for (const [i, block] of (entry.message?.content ?? []).entries()) {\n const ev = blockEvent(\n block,\n role,\n `${baseId}-${i}`,\n entry.timestamp,\n entry.cwd,\n verifyPassed,\n );\n if (ev) events.push(ev);\n }\n });\n return events;\n}\n\nexport function getSessionMetadata(\n input: SessionInput,\n): SessionMetadataSummary | undefined {\n if (!looksLikeUnifiedSession(input)) return undefined;\n const metadata: SessionMetadataSummary = {\n ...(input.id ? { sessionId: input.id } : {}),\n ...(input.executionMode ? { executionMode: input.executionMode } : {}),\n ...(input.turns ? { turns: input.turns } : {}),\n ...(input.capabilities ? { capabilities: input.capabilities } : {}),\n ...(input.budget ? { budget: input.budget } : {}),\n ...(input.context ? { context: input.context } : {}),\n ...(input.events ? { events: input.events } : {}),\n ...(input.model ? { model: input.model } : {}),\n ...(input.provider ? { provider: input.provider } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.permissionMode ? { permissionMode: input.permissionMode } : {}),\n ...(input.usage ? { usage: input.usage } : {}),\n ...(input.cost ? { cost: input.cost } : {}),\n };\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction errorMessage(entry: SessionEntry): string {\n const status = entry.apiErrorStatus ? ` (HTTP ${entry.apiErrorStatus})` : \"\";\n return `${entry.error ?? \"API error\"}${status}`;\n}\n\n// ── Unified message normalization ───────────────────────────────────────────\n// Projects the canonical SessionUIMessage[] (captain pkg/session) into the same\n// SessionEvent rows, so the viewer renders the unified model and the legacy\n// SessionEntry log identically.\n\n/** A unified message array is told apart from a SessionEntry log by its\n * per-message `parts` array (a SessionEntry carries `message`/`tool_use`). */\nfunction looksLikeUnifiedMessages(\n arr: SessionEntry[] | SessionUIMessage[],\n): arr is SessionUIMessage[] {\n const first: unknown = arr[0];\n return (\n typeof first === \"object\" &&\n first !== null &&\n Array.isArray((first as SessionUIMessage).parts)\n );\n}\n\nfunction looksLikeUnifiedSession(\n input: SessionInput,\n): input is UnifiedSessionInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n !Array.isArray(input) &&\n (\"messages\" in input ||\n \"turns\" in input ||\n \"capabilities\" in input ||\n \"budget\" in input ||\n \"context\" in input)\n );\n}\n\nfunction isUnifiedToolPart(part: SessionUIPart): boolean {\n return (\n Boolean(part.toolName) &&\n (part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\"))\n );\n}\n\n/** Render a tool part's already-parsed JSON output as text. */\nfunction outputToText(output: unknown): string | undefined {\n if (output == null) return undefined;\n return typeof output === \"string\" ? output : JSON.stringify(output);\n}\n\nfunction asRecord(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n}\n\nfunction partEvent(\n part: SessionUIPart,\n role: \"system\" | \"user\" | \"assistant\",\n id: string,\n meta: {\n timestamp?: string;\n cwd?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n sessionId?: string;\n raw?: unknown;\n verifyPassed?: boolean;\n },\n): SessionEvent | null {\n if (isUnifiedToolPart(part)) {\n const pending = pendingFromPart(part);\n return toolEvent(\n id,\n part.toolName as string,\n asRecord(part.input),\n outputToText(part.output),\n meta.timestamp,\n {\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort\n ? { reasoningEffort: meta.reasoningEffort }\n : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(part.state ? { toolState: part.state } : {}),\n ...(part.approval ? { approval: part.approval } : {}),\n pending,\n ...(part.toolCallId ? { toolCallId: part.toolCallId } : {}),\n ...(part.estimatedCost ? { estimatedCost: part.estimatedCost } : {}),\n ...(part.approval?.id ? { approvalId: part.approval.id } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n },\n );\n }\n if (part.type === \"reasoning\") {\n return part.text\n ? {\n id,\n kind: \"thinking\",\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n }\n : null;\n }\n if (part.type === \"file\") {\n return {\n id,\n kind: role,\n file: part,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n }\n if (part.type === \"text\") {\n return part.text\n ? {\n id,\n kind: role,\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n ...(meta.verifyPassed !== undefined\n ? {\n verifyPassed: meta.verifyPassed,\n tone: meta.verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n }\n : null;\n }\n return null;\n}\n\nfunction pendingFromPart(part: SessionUIPart): boolean {\n if (part.approval?.approved !== undefined) return false;\n if (\n [\"approval-responded\", \"output-available\", \"output-denied\"].includes(\n part.state ?? \"\",\n )\n )\n return false;\n return (\n part.pending === true ||\n part.approval?.pending === true ||\n part.state === \"approval-requested\"\n );\n}\n\n/** Flatten unified session messages into ordered SessionEvent rows. */\nexport function normalizeMessages(\n messages: SessionUIMessage[],\n): SessionEvent[] {\n const events: SessionEvent[] = [];\n messages.forEach((msg, seq) => {\n const prov = msg.provenance;\n const baseId = msg.id ?? prov?.uuid ?? `m${seq}`;\n if (prov?.apiErrorStatus) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: `API error (HTTP ${prov.apiErrorStatus})`,\n errorStatus: prov.apiErrorStatus,\n ...(prov.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov.agentId ? { agentId: prov.agentId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n });\n return;\n }\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row (not a fourth top-level kind) carrying the\n // pass/fail tone and the workflow verify glyph as data.\n const verifyPassed =\n msg.role === \"verified\"\n ? true\n : msg.role === \"verify_failed\"\n ? false\n : undefined;\n const role: \"system\" | \"user\" | \"assistant\" =\n msg.role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : msg.role === \"user\"\n ? \"user\"\n : \"assistant\";\n const meta = {\n ...(prov?.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(prov?.cwd ? { cwd: prov.cwd } : {}),\n ...(prov?.model ? { model: prov.model } : {}),\n ...(prov?.reasoningEffort\n ? { reasoningEffort: prov.reasoningEffort }\n : {}),\n ...(prov?.source ? { source: prov.source } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov?.agentId ? { agentId: prov.agentId } : {}),\n ...(prov?.sessionId ? { sessionId: prov.sessionId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n ...(verifyPassed !== undefined ? { verifyPassed } : {}),\n };\n const verifyKind = asRecord(\n msg.parts.find((part) => part.type === \"data-verify\")?.data,\n )?.kind;\n msg.parts.forEach((part, i) => {\n const shownPart =\n verifyPassed !== undefined &&\n part.type === \"text\" &&\n typeof verifyKind === \"string\" &&\n !part.text?.startsWith(`${verifyKind} ·`)\n ? { ...part, text: `${verifyKind} · ${part.text ?? \"\"}` }\n : part;\n const ev = partEvent(shownPart, role, `${baseId}-${i}`, meta);\n if (ev) events.push(ev);\n });\n });\n return events;\n}\n\n// ── Action icon registry ────────────────────────────────────────────────────\n// Implements the Flanksource \"Coding agent action icons\" design: every agent\n// tool maps to a Phosphor-derived generated icon (Ui*) and a semantic tone so a\n// scan of the log reads at a glance. Tones group by surface — file reads (sky),\n// writes (amber), edits (violet), execution (emerald), agents (indigo),\n// destructive (rose), assets (pink/fuchsia).\n\nexport type SessionTone =\n | \"sky\"\n | \"amber\"\n | \"violet\"\n | \"emerald\"\n | \"teal\"\n | \"orange\"\n | \"rose\"\n | \"indigo\"\n | \"fuchsia\"\n | \"pink\"\n | \"slate\";\n\nexport interface SessionActionMeta {\n icon: StaticIconComponent;\n tone: SessionTone;\n /** Human-readable verb shown as the row heading (and in the filter menu). */\n label: string;\n /** The row heading is the input summary alone (file path, command) — the\n * icon and tone carry the verb, so the label only appears in the menu. */\n summaryOnly?: boolean;\n}\n\nconst ACTIONS: Record<string, SessionActionMeta> = {\n // File operations. Read (eye) and Write (diff) are deliberately kept off the\n // design's file-text / file-plus glyphs — they read better in a scrolling log\n // and write-type rows also carry a +/- diff stat.\n Read: { icon: UiEye, tone: \"sky\", label: \"Read file\", summaryOnly: true },\n Write: {\n icon: UiDiff,\n tone: \"amber\",\n label: \"Write file\",\n summaryOnly: true,\n },\n Edit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit file\",\n summaryOnly: true,\n },\n MultiEdit: {\n icon: UiStack,\n tone: \"violet\",\n label: \"Multi-edit\",\n summaryOnly: true,\n },\n NotebookEdit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit notebook\",\n summaryOnly: true,\n },\n // Search & navigation\n Grep: { icon: UiSearch, tone: \"amber\", label: \"Grep\" },\n Glob: { icon: UiAsterisk, tone: \"sky\", label: \"Glob\" },\n // Execution & shell\n Bash: { icon: UiTerminal, tone: \"emerald\", label: \"Run command\" },\n BashOutput: { icon: UiCode2, tone: \"emerald\", label: \"Shell output\" },\n KillShell: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n KillBash: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n // Agents & planning\n Task: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Agent: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Skill: { icon: UiMagicWand, tone: \"fuchsia\", label: \"Invoke skill\" },\n TodoWrite: { icon: UiListChecks, tone: \"sky\", label: \"Update todos\" },\n Plan: { icon: UiStrategy, tone: \"sky\", label: \"Plan\" },\n TaskCreate: { icon: UiKanban, tone: \"sky\", label: \"Create task\" },\n TaskUpdate: { icon: UiKanban, tone: \"sky\", label: \"Update task\" },\n TaskList: { icon: UiKanban, tone: \"sky\", label: \"List tasks\" },\n TaskGet: { icon: UiKanban, tone: \"sky\", label: \"Get task\" },\n TaskOutput: { icon: UiKanban, tone: \"sky\", label: \"Task output\" },\n TaskStop: { icon: UiProhibit, tone: \"rose\", label: \"Stop task\" },\n ToolSearch: { icon: UiSearch, tone: \"amber\", label: \"Search tools\" },\n AskUserQuestion: { icon: UiQuestion, tone: \"sky\", label: \"Ask user\" },\n EnterPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Enter plan mode\" },\n ExitPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Exit plan mode\" },\n // Web & browser automation\n WebFetch: { icon: UiCloudDownload, tone: \"sky\", label: \"Fetch URL\" },\n WebSearch: { icon: UiGlobe, tone: \"sky\", label: \"Web search\" },\n browser_navigate: { icon: UiCompass, tone: \"sky\", label: \"Navigate\" },\n browser_navigate_back: {\n icon: UiCompass,\n tone: \"sky\",\n label: \"Navigate back\",\n },\n browser_click: { icon: UiCursorClick, tone: \"sky\", label: \"Click\" },\n browser_triple_click: {\n icon: UiCursorText,\n tone: \"sky\",\n label: \"Triple click\",\n },\n browser_type: { icon: UiKeyboard, tone: \"emerald\", label: \"Type text\" },\n browser_press_key: { icon: UiCommand, tone: \"amber\", label: \"Press key\" },\n browser_snapshot: { icon: UiScan, tone: \"violet\", label: \"Snapshot\" },\n browser_take_screenshot: {\n icon: UiCamera,\n tone: \"indigo\",\n label: \"Screenshot\",\n },\n browser_evaluate: { icon: UiCode2, tone: \"violet\", label: \"Evaluate JS\" },\n browser_console_messages: { icon: UiScroll, tone: \"slate\", label: \"Console\" },\n browser_network_requests: {\n icon: UiShare,\n tone: \"emerald\",\n label: \"Network\",\n },\n browser_wait_for: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n Wait: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n browser_close: { icon: UiClose, tone: \"rose\", label: \"Close browser\" },\n};\n\n// MCP tools surface as `mcp__<server>__<name>` or `<server>__<name>`. Icon\n// servers get a distinct accent (palette); generative servers reuse the sparkle;\n// the rest fall back to the puzzle piece.\nconst MCP_ICON_SERVERS = new Set([\n \"iconify\",\n \"icons8\",\n \"lucide\",\n \"react-icons\",\n]);\nconst MCP_GEN_SERVERS = new Set([\"gemini\", \"openai\", \"anthropic\"]);\n\ninterface McpTool {\n server: string;\n name: string;\n}\n\nexport function splitMcpTool(tool: string): McpTool | null {\n const rest = tool.startsWith(\"mcp__\") ? tool.slice(\"mcp__\".length) : tool;\n const idx = rest.indexOf(\"__\");\n if (idx < 0) return null;\n return { server: rest.slice(0, idx), name: rest.slice(idx + 2) };\n}\n\n/** Resolve the icon, tone, and label for a tool name. */\nexport function getSessionAction(tool: string): SessionActionMeta {\n const exact = ACTIONS[tool];\n if (exact) return exact;\n\n const mcp = splitMcpTool(tool);\n if (mcp) {\n const label = `${mcp.server}: ${mcp.name.replace(/_/g, \" \")}`;\n if (MCP_ICON_SERVERS.has(mcp.server))\n return { icon: UiPalette, tone: \"pink\", label };\n if (MCP_GEN_SERVERS.has(mcp.server))\n return { icon: UiSparkles, tone: \"violet\", label };\n return { icon: UiPuzzle, tone: \"violet\", label };\n }\n\n return { icon: UiWrench, tone: \"slate\", label: tool };\n}\n\n/** Count tool-call events, the dominant model, and totals for the header. */\nexport function summarizeSession(events: SessionEvent[]): {\n toolCount: number;\n messageCount: number;\n model?: string;\n} {\n let toolCount = 0;\n let messageCount = 0;\n const modelCounts = new Map<string, number>();\n for (const event of events) {\n if (event.kind === \"tool\") toolCount += 1;\n if (\n event.kind === \"system\" ||\n event.kind === \"user\" ||\n event.kind === \"assistant\"\n ) {\n messageCount += 1;\n }\n if (event.model)\n modelCounts.set(event.model, (modelCounts.get(event.model) ?? 0) + 1);\n }\n let model: string | undefined;\n let best = 0;\n for (const [name, count] of modelCounts) {\n if (count > best) {\n best = count;\n model = name;\n }\n }\n return { toolCount, messageCount, ...(model ? { model } : {}) };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ const SessionViewer_rowTime = require("./SessionViewer.row-time.cjs");
|
|
|
11
11
|
const SessionViewer_toolRow = require("./SessionViewer.tool-row.cjs");
|
|
12
12
|
const Markdown = require("../Markdown.cjs");
|
|
13
13
|
const MessageFilePart = require("../chat/MessageFilePart.cjs");
|
|
14
|
+
const SessionViewer_toolCost = require("./SessionViewer.tool-cost.cjs");
|
|
15
|
+
const SessionViewer_tokens = require("./SessionViewer.tokens.cjs");
|
|
14
16
|
const UiChevronDown = require("../../icons/components/UiChevronDown.cjs");
|
|
15
17
|
const UiUserCircle = require("../../icons/components/UiUserCircle.cjs");
|
|
16
18
|
const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
|
|
@@ -22,6 +24,7 @@ function SessionRow({
|
|
|
22
24
|
last,
|
|
23
25
|
defaultExpanded,
|
|
24
26
|
showRowMetadata = false,
|
|
27
|
+
showEstimatedToolCost = false,
|
|
25
28
|
showRaw = false,
|
|
26
29
|
renderMessageBadge,
|
|
27
30
|
onPendingToolDecision
|
|
@@ -69,10 +72,12 @@ function SessionRow({
|
|
|
69
72
|
visual,
|
|
70
73
|
defaultExpanded,
|
|
71
74
|
messageBadge: event.kind === "assistant" ? renderMessageBadge == null ? void 0 : renderMessageBadge(event) : void 0,
|
|
72
|
-
onPendingToolDecision
|
|
75
|
+
onPendingToolDecision,
|
|
76
|
+
showEstimatedToolCost
|
|
73
77
|
}
|
|
74
78
|
),
|
|
75
79
|
showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.EventMetadata, { event }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(SessionViewer_tokens.SessionRowTokens, { event }),
|
|
76
81
|
showRaw && event.raw !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.RawEventBlock, { raw: event.raw })
|
|
77
82
|
] })
|
|
78
83
|
]
|
|
@@ -84,6 +89,7 @@ function WaitGroupRow({
|
|
|
84
89
|
last,
|
|
85
90
|
defaultExpanded,
|
|
86
91
|
showRowMetadata = false,
|
|
92
|
+
showEstimatedToolCost = false,
|
|
87
93
|
showRaw = false,
|
|
88
94
|
renderMessageBadge,
|
|
89
95
|
onPendingToolDecision
|
|
@@ -124,29 +130,32 @@ function WaitGroupRow({
|
|
|
124
130
|
}
|
|
125
131
|
),
|
|
126
132
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 pt-px", children: [
|
|
127
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { "data-tool-header": true, className: "flex items-center gap-1.5", children: [
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
135
|
+
"button",
|
|
136
|
+
{
|
|
137
|
+
type: "button",
|
|
138
|
+
"aria-expanded": open,
|
|
139
|
+
"aria-label": `${open ? "Collapse" : "Expand"} ${label}`,
|
|
140
|
+
onClick: () => setOpen((value) => !value),
|
|
141
|
+
className: "flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground",
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-foreground", children: label }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
145
|
+
Icon.Icon,
|
|
146
|
+
{
|
|
147
|
+
icon: UiChevronDown.UiChevronDown,
|
|
148
|
+
className: utils.cn(
|
|
149
|
+
"ml-auto size-3 shrink-0 text-muted-foreground transition-transform",
|
|
150
|
+
open && "rotate-180"
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
showEstimatedToolCost && !open && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolCost.EstimatedToolCost, { events: group.events })
|
|
158
|
+
] }),
|
|
150
159
|
showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(
|
|
151
160
|
SessionViewer_rowMetadata.EventMetadata,
|
|
152
161
|
{
|
|
@@ -161,12 +170,14 @@ function WaitGroupRow({
|
|
|
161
170
|
last: index === group.events.length - 1,
|
|
162
171
|
defaultExpanded,
|
|
163
172
|
showRowMetadata,
|
|
173
|
+
showEstimatedToolCost,
|
|
164
174
|
showRaw,
|
|
165
175
|
renderMessageBadge,
|
|
166
176
|
onPendingToolDecision
|
|
167
177
|
},
|
|
168
178
|
event.id
|
|
169
|
-
)) })
|
|
179
|
+
)) }),
|
|
180
|
+
open && showEstimatedToolCost && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolCost.EstimatedToolCost, { events: group.events, detailed: true })
|
|
170
181
|
] })
|
|
171
182
|
]
|
|
172
183
|
}
|
|
@@ -188,6 +199,7 @@ function UserRow({
|
|
|
188
199
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-0.5 text-right text-xs font-medium text-muted-foreground", children: initialPrompt ? "Initial prompt" : "You" }),
|
|
189
200
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground", children: event.file ? /* @__PURE__ */ jsxRuntime.jsx(MessageFilePart.MessageFilePart, { part: event.file }) : event.text && /* @__PURE__ */ jsxRuntime.jsx(Markdown.Markdown, { text: event.text }) }),
|
|
190
201
|
showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.EventMetadata, { event, align: "right" }),
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx(SessionViewer_tokens.SessionRowTokens, { event }),
|
|
191
203
|
showRaw && event.raw !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.RawEventBlock, { raw: event.raw, align: "right" })
|
|
192
204
|
] }),
|
|
193
205
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -265,7 +277,8 @@ function EventBody({
|
|
|
265
277
|
visual,
|
|
266
278
|
defaultExpanded,
|
|
267
279
|
messageBadge,
|
|
268
|
-
onPendingToolDecision
|
|
280
|
+
onPendingToolDecision,
|
|
281
|
+
showEstimatedToolCost
|
|
269
282
|
}) {
|
|
270
283
|
if (event.kind === "tool")
|
|
271
284
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -274,7 +287,8 @@ function EventBody({
|
|
|
274
287
|
event,
|
|
275
288
|
visual,
|
|
276
289
|
defaultExpanded,
|
|
277
|
-
onPendingToolDecision
|
|
290
|
+
onPendingToolDecision,
|
|
291
|
+
showEstimatedToolCost
|
|
278
292
|
}
|
|
279
293
|
);
|
|
280
294
|
if (event.kind === "thinking") return /* @__PURE__ */ jsxRuntime.jsx(ThinkingBody, { event });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionViewer.rows.cjs","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":["jsx","jsxs","cn","SESSION_TONES","Icon","EventMetadata","RawEventBlock","useState","getSessionAction","formatEventRange","UiChevronDown","MessageFilePart","Markdown","UiUserCircle","UiSparkles","UiBrain","UiWarningTriangle","ToolBody"],"mappings":";;;;;;;;;;;;;;;;;;AAwBO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAWG;AACD,MAAI,MAAM,SAAS,QAAQ;AACzB,WACEA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AAEA,QAAM,SAAS,YAAY,KAAK;AAChC,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAiB,MAAM;AAAA,MACvB,WAAU;AAAA,MAET,UAAA;AAAA,QAAA,CAAC,QACAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGdA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,2BAAc,OAAO,IAAI,EAAE;AAAA,YAAA;AAAA,YAG7B,yCAACC,KAAAA,MAAA,EAAK,MAAM,OAAO,MAAM,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/CH,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAD,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,cACE,MAAM,SAAS,cAAc,yDAAqB,SAAS;AAAA,cAE7D;AAAA,YAAA;AAAA,UAAA;AAAA,UAED,mBAAmBA,2BAAAA,IAACK,yCAAA,EAAc,MAAA,CAAc;AAAA,UAChD,WAAW,MAAM,QAAQ,yCACvBC,0BAAAA,eAAA,EAAc,KAAK,MAAM,IAAA,CAAK;AAAA,QAAA,EAAA,CAEnC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAUG;AACD,QAAM,CAAC,MAAM,OAAO,IAAIC,MAAAA,SAAS,KAAK;AACtC,QAAM,SAASC,oBAAAA,iBAAiB,MAAM;AACtC,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,SAAS,CAAC,KAAK;AACvD,QAAM,QAAQ,UAAU,MAAM,KAAK;AACnC,QAAM,gBAAgB,EAAE,GAAG,MAAA;AAC3B,SAAO,cAAc;AACrB,SAAO,cAAc;AACrB,SAAO,cAAc;AACrB,gBAAc,UAAU;AACxB,QAAM,iBAAiBC,sBAAAA,iBAAiB,MAAM,WAAW,MAAM,SAAS;AAExE,SACER,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,oBAAiB;AAAA,MACjB,WAAU;AAAA,MAET,UAAA;AAAA,QAAA,CAAC,QACAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGdA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,2BAAc,OAAO,IAAI,EAAE;AAAA,YAAA;AAAA,YAG7B,yCAACC,KAAAA,MAAA,EAAK,MAAM,OAAO,MAAM,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/CH,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,cACpD,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,cACxC,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAAA,gBACrDA,2BAAAA;AAAAA,kBAACI,KAAAA;AAAAA,kBAAA;AAAA,oBACC,MAAMM,cAAAA;AAAAA,oBACN,WAAWR,MAAAA;AAAAA,sBACT;AAAA,sBACA,QAAQ;AAAA,oBAAA;AAAA,kBACV;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAED,mBACCF,2BAAAA;AAAAA,YAACK,0BAAAA;AAAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACN,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAG/C,QACCL,2BAAAA,IAAC,MAAA,EAAG,WAAU,6DACX,gBAAM,OAAO,IAAI,CAAC,OAAO,UACxBA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC;AAAA,cACA,MAAM,UAAU,MAAM,OAAO,SAAS;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAPK,MAAM;AAAA,UAAA,CASd,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,WAAU;AAAA,MAEV,UAAAC,2BAAAA,KAAC,SAAI,WAAWC,MAAAA,GAAG,uFAAuF,CAAC,iBAAiB,yCAAyC,GACnK,UAAA;AAAA,QAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,UAAAD,+BAAC,OAAA,EAAI,WAAU,+DACZ,UAAA,gBAAgB,mBAAmB,OACtC;AAAA,yCACC,OAAA,EAAI,WAAU,+HACZ,UAAA,MAAM,sCAAQW,gBAAAA,iBAAA,EAAgB,MAAM,MAAM,MAAM,IAAK,MAAM,QAAQX,2BAAAA,IAACY,qBAAS,MAAM,MAAM,MAAM,EAAA,CAClG;AAAA,UACC,mBAAmBZ,2BAAAA,IAACK,0BAAAA,eAAA,EAAc,OAAc,OAAM,SAAQ;AAAA,UAC9D,WAAW,MAAM,QAAQ,UACxBL,2BAAAA,IAACM,0BAAAA,iBAAc,KAAK,MAAM,KAAK,OAAM,QAAA,CAAQ;AAAA,QAAA,GAEjD;AAAA,QACAN,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,aAAAA,cAAc,MAAM;AAAA,YAAA;AAAA,YAGtB,UAAAH,2BAAAA,IAACI,WAAA,EAAK,MAAMS,aAAAA,cAAc,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAaA,SAAS,gBAAgB,OAAkC;AACzD,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK,QAAQ;AACX,YAAM,SAASL,oBAAAA,iBAAiB,MAAM,QAAQ,EAAE;AAChD,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,aAAa,OAAO,eAAe;AAAA,MAAA;AAAA,IAEvC;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAMK,aAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,WAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMA,WAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,QAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,kBAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,EACf;AAEN;AAEA,SAAS,YAAY,OAAkC;AACrD,QAAM,OAAO,gBAAgB,KAAK;AAClC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,MAAM,QAAQ,KAAK;AAAA,IACzB,MAAM,MAAM,QAAQ,KAAK;AAAA,EAAA;AAE7B;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,MAAI,MAAM,SAAS;AACjB,WACEhB,2BAAAA;AAAAA,MAACiB,sBAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAGN,MAAI,MAAM,SAAS,WAAY,QAAOjB,2BAAAA,IAAC,gBAAa,OAAc;AAClE,MAAI,MAAM,SAAS,QAAS,QAAOA,2BAAAA,IAAC,aAAU,OAAc;AAC5D,MAAI,MAAM,SAAS,SAAU,QAAOA,2BAAAA,IAAC,cAAW,OAAc;AAC9D,SAAOA,2BAAAA,IAAC,aAAA,EAAY,OAAc,OAAO,aAAA,CAAc;AACzD;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,4BACZ,UAAA;AAAA,IAAA;AAAA,IACDA,2BAAAA,KAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,MAAA,MAAM,QAAQD,+BAACW,gBAAAA,iBAAA,EAAgB,MAAM,MAAM,MAAM;AAAA,MACjD,MAAM,QAAQX,+BAACY,SAAAA,UAAA,EAAS,MAAM,MAAM,KAAA,CAAM;AAAA,IAAA,EAAA,CAC7C;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,WAAW,EAAE,SAAkC;;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIL,MAAAA,SAAS,KAAK;AACtC,QAAM,YAAU,WAAM,SAAN,mBAAY,MAAM,MAAM,GAAG,OAAM;AACjD,SACEN,2BAAAA,KAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,IAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,QACxC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,wCAAuC,UAAA,UAAM;AAAA,UAC7DA,2BAAAA,IAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,SAAQ;AAAA,UACnDA,2BAAAA;AAAAA,YAACI,KAAAA;AAAAA,YAAA;AAAA,cACC,MAAMM,cAAAA;AAAAA,cACN,WAAWR,MAAAA;AAAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAED,QACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,iGACZ,UAAA,MAAM,QAAQA,2BAAAA,IAACY,SAAAA,UAAA,EAAS,MAAM,MAAM,KAAA,CAAM,EAAA,CAC7C;AAAA,EAAA,GAEJ;AAEJ;AAGA,SAAS,aAAa,EAAE,SAAkC;AACxD,QAAM,CAAC,MAAM,OAAO,IAAIL,MAAAA,SAAS,KAAK;AACtC,SACEP,2BAAAA,IAAC,OAAA,EAAI,WAAU,aACb,UAAAC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,MACxC,WAAU;AAAA,MAEV,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACA,OAAO,oCAAoC;AAAA,YAAA;AAAA,YAG5C,UAAA,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAETF,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAMM,cAAAA;AAAAA,YACN,WAAWR,MAAAA;AAAAA,cACT;AAAA,cACA,QAAQ;AAAA,YAAA;AAAA,UACV;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS,UAAU,EAAE,SAAkC;AACrD,SACEF,2BAAAA,IAAC,OAAA,EAAI,WAAU,4MACZ,gBAAM,MACT;AAEJ;;;"}
|
|
1
|
+
{"version":3,"file":"SessionViewer.rows.cjs","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\nimport { EstimatedToolCost } from \"./SessionViewer.tool-cost\";\nimport { SessionRowTokens } from \"./SessionViewer.tokens\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <div data-tool-header className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showEstimatedToolCost && !open && <EstimatedToolCost events={group.events} />}\n </div>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showEstimatedToolCost={showEstimatedToolCost}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n {open && showEstimatedToolCost && <EstimatedToolCost events={group.events} detailed />}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n showEstimatedToolCost,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n showEstimatedToolCost: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":["jsx","jsxs","cn","SESSION_TONES","Icon","EventMetadata","SessionRowTokens","RawEventBlock","useState","getSessionAction","formatEventRange","UiChevronDown","EstimatedToolCost","MessageFilePart","Markdown","UiUserCircle","UiSparkles","UiBrain","UiWarningTriangle","ToolBody"],"mappings":"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"}
|
|
@@ -2,21 +2,23 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { SessionEvent } from './SessionViewer.model.js';
|
|
3
3
|
import { SessionEventGroup } from './SessionViewer.grouping.js';
|
|
4
4
|
import { SessionToolDecision } from './SessionViewer.js';
|
|
5
|
-
export declare function SessionRow({ event, initialPrompt, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
|
|
5
|
+
export declare function SessionRow({ event, initialPrompt, last, defaultExpanded, showRowMetadata, showEstimatedToolCost, showRaw, renderMessageBadge, onPendingToolDecision, }: {
|
|
6
6
|
event: SessionEvent;
|
|
7
7
|
initialPrompt?: boolean;
|
|
8
8
|
last: boolean;
|
|
9
9
|
defaultExpanded: boolean;
|
|
10
10
|
showRowMetadata?: boolean;
|
|
11
|
+
showEstimatedToolCost?: boolean;
|
|
11
12
|
showRaw?: boolean;
|
|
12
13
|
renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;
|
|
13
14
|
onPendingToolDecision?: ((decision: SessionToolDecision) => Promise<void> | void) | undefined;
|
|
14
15
|
}): import("react").JSX.Element;
|
|
15
|
-
export declare function WaitGroupRow({ group, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
|
|
16
|
+
export declare function WaitGroupRow({ group, last, defaultExpanded, showRowMetadata, showEstimatedToolCost, showRaw, renderMessageBadge, onPendingToolDecision, }: {
|
|
16
17
|
group: SessionEventGroup;
|
|
17
18
|
last: boolean;
|
|
18
19
|
defaultExpanded: boolean;
|
|
19
20
|
showRowMetadata?: boolean;
|
|
21
|
+
showEstimatedToolCost?: boolean;
|
|
20
22
|
showRaw?: boolean;
|
|
21
23
|
renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;
|
|
22
24
|
onPendingToolDecision?: ((decision: SessionToolDecision) => Promise<void> | void) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionViewer.rows.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAUjD,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionViewer.rows.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAUjD,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,aAAqB,EACrB,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,qBAA6B,EAC7B,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BAmDA;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,qBAA6B,EAC7B,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BAgFA"}
|