@flanksource/clicky-ui 0.3.44 → 0.3.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/ai.cjs +4 -2
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -1
- package/dist/components/MdxEditorField.cjs +40 -22
- package/dist/components/MdxEditorField.cjs.map +1 -1
- package/dist/components/MdxEditorField.d.ts.map +1 -1
- package/dist/components/MdxEditorField.js +41 -23
- package/dist/components/MdxEditorField.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -1
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -1
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/data/CodeBlock.cjs +3 -2
- package/dist/data/CodeBlock.cjs.map +1 -1
- package/dist/data/CodeBlock.d.ts +3 -1
- package/dist/data/CodeBlock.d.ts.map +1 -1
- package/dist/data/CodeBlock.js +3 -2
- package/dist/data/CodeBlock.js.map +1 -1
- package/dist/data/GraphDiagram.cjs +18 -6
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -1
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +18 -6
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramNodes.cjs +38 -29
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +8 -2
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +38 -29
- package/dist/data/GraphDiagramNodes.js.map +1 -1
- package/dist/data/JsonView.cjs +118 -49
- package/dist/data/JsonView.cjs.map +1 -1
- package/dist/data/JsonView.d.ts +13 -10
- package/dist/data/JsonView.d.ts.map +1 -1
- package/dist/data/JsonView.js +118 -49
- package/dist/data/JsonView.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +2 -2
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.js +2 -2
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +91 -250
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatButton.cjs +2 -0
- package/dist/data/ai/ChatButton.cjs.map +1 -1
- package/dist/data/ai/ChatButton.d.ts +1 -1
- package/dist/data/ai/ChatButton.d.ts.map +1 -1
- package/dist/data/ai/ChatButton.js +2 -0
- package/dist/data/ai/ChatButton.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +5 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts +5 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +5 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +2 -8
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +2 -8
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +0 -5
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +3 -6
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +13 -4
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +5 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +1 -1
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +1 -1
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +13 -4
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +41 -27
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +41 -27
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
- package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.js +35 -0
- package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.js +3 -1
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +55 -35
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +18 -1
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +18 -1
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +149 -143
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +20 -6
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +151 -146
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +14 -10
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +15 -11
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +2 -1
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
- package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
- package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.js +53 -54
- package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
- package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
- package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
- package/dist/data/ai/index.d.ts +2 -2
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
- package/dist/data/ai/session-token-sizing.d.ts +32 -0
- package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.cjs +73 -0
- package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
- package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
- package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.js +73 -0
- package/dist/data/ai/use-session-token-sizing.js.map +1 -0
- package/dist/data/call-graph/CallGraph.cjs +250 -0
- package/dist/data/call-graph/CallGraph.cjs.map +1 -0
- package/dist/data/call-graph/CallGraph.d.ts +69 -0
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraph.js +250 -0
- package/dist/data/call-graph/CallGraph.js.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.js +50 -0
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
- package/dist/data/call-graph/CallGraphParts.cjs +204 -0
- package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
- package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphParts.js +204 -0
- package/dist/data/call-graph/CallGraphParts.js.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.js +186 -0
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
- package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.js +75 -0
- package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
- package/dist/data/call-graph/call-graph-labels.cjs +96 -0
- package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
- package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-labels.js +96 -0
- package/dist/data/call-graph/call-graph-labels.js.map +1 -0
- package/dist/data/call-graph/call-graph-model.cjs +161 -0
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-model.d.ts +102 -0
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-model.js +161 -0
- package/dist/data/call-graph/call-graph-model.js.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
- package/dist/data/call-graph/index.d.ts +7 -0
- package/dist/data/call-graph/index.d.ts.map +1 -0
- package/dist/data/call-graph/types.cjs +5 -0
- package/dist/data/call-graph/types.cjs.map +1 -0
- package/dist/data/call-graph/types.d.ts +135 -0
- package/dist/data/call-graph/types.d.ts.map +1 -0
- package/dist/data/call-graph/types.js +5 -0
- package/dist/data/call-graph/types.js.map +1 -0
- package/dist/data/call-graph/use-call-graph.cjs +93 -0
- package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
- package/dist/data/call-graph/use-call-graph.d.ts +24 -0
- package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
- package/dist/data/call-graph/use-call-graph.js +93 -0
- package/dist/data/call-graph/use-call-graph.js.map +1 -0
- package/dist/data/chat/Chat.cjs +39 -15
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +2 -2
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +2 -2
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +40 -16
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.bar.cjs +5 -8
- package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.bar.js +5 -8
- package/dist/data/chat/ContextMeter.bar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +18 -19
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +1 -1
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +18 -19
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +2 -1
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +4 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +2 -1
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/Message.cjs +39 -12
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +40 -13
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +60 -5
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +7 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +60 -5
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +2 -2
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/tool-policy.cjs +59 -2
- package/dist/data/chat/tool-policy.cjs.map +1 -1
- package/dist/data/chat/tool-policy.d.ts +9 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.js +59 -2
- package/dist/data/chat/tool-policy.js.map +1 -1
- package/dist/data/chat/types.cjs +6 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +13 -4
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +7 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +11 -6
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts +0 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +11 -6
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +3 -3
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +26 -10
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +8 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +26 -10
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +5 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-edge-routing.cjs +9 -3
- package/dist/data/graph-edge-routing.cjs.map +1 -1
- package/dist/data/graph-edge-routing.d.ts +2 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -1
- package/dist/data/graph-edge-routing.js +9 -3
- package/dist/data/graph-edge-routing.js.map +1 -1
- package/dist/data/json-view/JsonSource.cjs +84 -0
- package/dist/data/json-view/JsonSource.cjs.map +1 -0
- package/dist/data/json-view/JsonSource.d.ts +7 -0
- package/dist/data/json-view/JsonSource.d.ts.map +1 -0
- package/dist/data/json-view/JsonSource.js +84 -0
- package/dist/data/json-view/JsonSource.js.map +1 -0
- package/dist/data/json-view/parse-prefix.cjs +132 -0
- package/dist/data/json-view/parse-prefix.cjs.map +1 -0
- package/dist/data/json-view/parse-prefix.d.ts +11 -0
- package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
- package/dist/data/json-view/parse-prefix.js +132 -0
- package/dist/data/json-view/parse-prefix.js.map +1 -0
- package/dist/data/json-view/parse-source.cjs +62 -0
- package/dist/data/json-view/parse-source.cjs.map +1 -0
- package/dist/data/json-view/parse-source.d.ts +16 -0
- package/dist/data/json-view/parse-source.d.ts.map +1 -0
- package/dist/data/json-view/parse-source.js +62 -0
- package/dist/data/json-view/parse-source.js.map +1 -0
- package/dist/data/json-view/story-fixtures.d.ts +6 -0
- package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
- package/dist/data/json-view/types.d.ts +14 -0
- package/dist/data/json-view/types.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +2 -5
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +2 -4
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.js +2 -2
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +2 -5
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.js +5 -2
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +1 -5
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.js +8 -27
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +1 -5
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
- package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.cjs +23 -10
- package/dist/data/use-pan-zoom.cjs.map +1 -1
- package/dist/data/use-pan-zoom.d.ts +16 -2
- package/dist/data/use-pan-zoom.d.ts.map +1 -1
- package/dist/data/use-pan-zoom.js +23 -10
- package/dist/data/use-pan-zoom.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +26 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +1 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +24 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +28 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Workspace.cjs +13 -4
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts +7 -2
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +13 -4
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/lib/permission-strategies.cjs +71 -11
- package/dist/lib/permission-strategies.cjs.map +1 -1
- package/dist/lib/permission-strategies.d.ts +3 -0
- package/dist/lib/permission-strategies.d.ts.map +1 -1
- package/dist/lib/permission-strategies.js +71 -11
- package/dist/lib/permission-strategies.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -3
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
- package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
- package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.js +0 -8
- package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
|
@@ -97,9 +97,6 @@ function useChatWindowRuntime({
|
|
|
97
97
|
},
|
|
98
98
|
[chat]
|
|
99
99
|
);
|
|
100
|
-
const handleTemperatureChange = useCallback((next) => {
|
|
101
|
-
setRuntime((current) => withRuntimeField(current, "temperature", next));
|
|
102
|
-
}, []);
|
|
103
100
|
const replaceRuntimeIdentity = useCallback((identity) => {
|
|
104
101
|
setRuntime((current) => {
|
|
105
102
|
const next = { ...current };
|
|
@@ -118,12 +115,10 @@ function useChatWindowRuntime({
|
|
|
118
115
|
runtime,
|
|
119
116
|
model,
|
|
120
117
|
reasoningEffort,
|
|
121
|
-
temperature: runtime.temperature,
|
|
122
118
|
reasoningEfforts,
|
|
123
119
|
handleRuntimeChange,
|
|
124
120
|
handleModelChange,
|
|
125
121
|
handleReasoningEffortChange,
|
|
126
|
-
handleTemperatureChange,
|
|
127
122
|
replaceRuntimeIdentity,
|
|
128
123
|
replaceRuntime
|
|
129
124
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const
|
|
1
|
+
{"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n if (identity.model) next.model = identity.model;\n if (identity.mode) next.mode = identity.mode;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -58,8 +58,8 @@ function permissionField({
|
|
|
58
58
|
id: "permissions.mode",
|
|
59
59
|
isSet: current !== void 0,
|
|
60
60
|
label: PERMISSION_GROUP,
|
|
61
|
-
icon: UiShield.UiShield,
|
|
62
|
-
iconClassName: "text-muted-foreground",
|
|
61
|
+
icon: (currentVisual == null ? void 0 : currentVisual.icon) ?? UiShield.UiShield,
|
|
62
|
+
iconClassName: unpublished ? "text-destructive" : currentVisual ? sessionTones.sessionTone(currentVisual.tone).text : "text-muted-foreground",
|
|
63
63
|
title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? unspecified.UNSPECIFIED_NAME}`,
|
|
64
64
|
caption: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
65
65
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn(RuntimeBarSegment.SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["familyForModel","familyForMode","modeOptionFor","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UiShield","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","sessionTone","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: currentVisual?.icon ?? UiShield,\n iconClassName: unpublished\n ? \"text-destructive\"\n : currentVisual\n ? sessionTone(currentVisual.tone).text\n : \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["familyForModel","familyForMode","modeOptionFor","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UiShield","sessionTone","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAWpC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAW,GACZ,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,GAAG,gBAAgB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAWpC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAW,GACZ,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,GAAG,gBAAgB,GAAG,SAAS,CAgI/B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,gBAAgB,CA8DnB"}
|
|
@@ -56,8 +56,8 @@ function permissionField({
|
|
|
56
56
|
id: "permissions.mode",
|
|
57
57
|
isSet: current !== void 0,
|
|
58
58
|
label: PERMISSION_GROUP,
|
|
59
|
-
icon: UiShield,
|
|
60
|
-
iconClassName: "text-muted-foreground",
|
|
59
|
+
icon: (currentVisual == null ? void 0 : currentVisual.icon) ?? UiShield,
|
|
60
|
+
iconClassName: unpublished ? "text-destructive" : currentVisual ? sessionTone(currentVisual.tone).text : "text-muted-foreground",
|
|
61
61
|
title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? UNSPECIFIED_NAME}`,
|
|
62
62
|
caption: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
63
63
|
/* @__PURE__ */ jsx("span", { className: cn(SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: currentVisual?.icon ?? UiShield,\n iconClassName: unpublished\n ? \"text-destructive\"\n : currentVisual\n ? sessionTone(currentVisual.tone).text\n : \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -89,7 +89,6 @@ function PendingApprovalRow({
|
|
|
89
89
|
onResolve
|
|
90
90
|
}) {
|
|
91
91
|
const [error, setError] = react.useState(void 0);
|
|
92
|
-
const [busy, setBusy] = react.useState(false);
|
|
93
92
|
const part = {
|
|
94
93
|
type: "dynamic-tool",
|
|
95
94
|
toolName: request.tool,
|
|
@@ -106,10 +105,9 @@ function PendingApprovalRow({
|
|
|
106
105
|
const handleApprove = (approvalId, approved, reason) => {
|
|
107
106
|
if (!onResolve) return;
|
|
108
107
|
setError(void 0);
|
|
109
|
-
|
|
110
|
-
void Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
|
|
108
|
+
return Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
|
|
111
109
|
setError(err instanceof Error ? err.message : String(err));
|
|
112
|
-
})
|
|
110
|
+
});
|
|
113
111
|
};
|
|
114
112
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20", children: [
|
|
115
113
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
|
|
@@ -145,10 +143,9 @@ function PendingApprovalRow({
|
|
|
145
143
|
{
|
|
146
144
|
part,
|
|
147
145
|
defaultOpen: true,
|
|
148
|
-
onApprove:
|
|
146
|
+
onApprove: handleApprove
|
|
149
147
|
}
|
|
150
148
|
),
|
|
151
|
-
busy ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 pl-4 text-xs text-muted-foreground", children: "Submitting…" }) : null,
|
|
152
149
|
error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "mt-1.5 pl-4 text-xs text-destructive", children: error }) : null
|
|
153
150
|
] });
|
|
154
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n )}\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","decisionFields","formatDate","TypedApprovalBody","ToolCall","durationLabel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n return Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={handleApprove}\n />\n )}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","decisionFields","formatDate","TypedApprovalBody","ToolCall","durationLabel"],"mappings":";;;;;;;;;;;;;AA8BO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIG;;AACD,QAAM,UAAUA,gCAAAA,wBAAwB,QAAQ;AAChD,QAAM,qBAAqB;AAAA,IACzB,cACG,UAAU,YACT,UAAU,UACV,UAAU,aACV,UAAU,aACV,eAAU,YAAV,mBAAmB;AAAA,EAAA;AAGzB,MAAI,CAAC,QAAQ,UAAU,CAAC,oBAAoB;AAC1C,WAAOC,2BAAAA,IAACC,4BAAAA,cAAW,UAAA,wBAAA,CAAqB;AAAA,EAC1C;AAEA,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,IAAA,QAAQ,SACPF,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACT,GAAI,YAAY,EAAE,cAAc,CAAA;AAAA,MAAC;AAAA,IAAA,IAElC;AAAA,IACH,qBACCA,2BAAAA,IAAC,0BAAA,EAAyB,UAAA,CAAuB,IAC/C;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AACF,GAEG;;AACD,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAAF,2BAAAA;AAAAA,MAACG,aAAAA;AAAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACLC,6BAAAA,GAAG,YAAY,UAAU,YAAY,CAAC;AAAA,UACtCA,6BAAAA,GAAG,UAAU,UAAU,UAAU,CAAC;AAAA,UAClCA,6BAAAA,GAAG,aAAa,UAAU,aAAa,CAAC;AAAA,UACxCA,6BAAAA,GAAG,WAAW,UAAU,WAAW,CAAC;AAAA,QAAA;AAAA,MACtC;AAAA,IAAA;AAAA,MAED,eAAU,YAAV,mBAAmB,UAClBJ,2BAAAA;AAAAA,MAACK,4BAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM,UAAU,QAAQ,IAAI,CAAC,QAAQ,WAAW;AAAA,UAC9C,KAAK,OAAO,aAAa,GAAG,OAAO,IAAI,IAAI,KAAK;AAAA,UAChD,OAAO,CAAC,OAAO,MAAM,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAC/D,QAAQ,OAAO;AAAA,QAAA,EACf;AAAA,MAAA;AAAA,IAAA,IAEF;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,yCACG,WAAA,EACC,UAAA;AAAA,IAAAH,2BAAAA,KAAC,MAAA,EAAG,WAAU,6GACZ,UAAA;AAAA,MAAAF,2BAAAA,IAACM,KAAAA,MAAA,EAAK,MAAMC,QAAAA,SAAS,WAAU,YAAW;AAAA,MAAE;AAAA,MACxB,SAAS;AAAA,MAAO;AAAA,IAAA,GACtC;AAAA,IACAP,2BAAAA,IAAC,QAAG,WAAU,qBACX,mBAAS,IAAI,CAAC,YACbA,2BAAAA,IAAC,MAAA,EACC,UAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACC,GAAI,YAAY,EAAE,cAAc,CAAA;AAAA,MAAC;AAAA,IAAA,KAH7B,QAAQ,EAKjB,CACD,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAIQ,MAAAA,SAA6B,MAAS;AAEhE,QAAM,OAAoB;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ,cAAc,QAAQ;AAAA,IAC1C,OAAO;AAAA,IACP,OAAO,QAAQ;AAAA,IACf,UAAU,EAAE,IAAI,QAAQ,GAAA;AAAA,EAAG;AAG7B,QAAM,QAAQ,QAAQ;AACtB,QAAM,cAA2C,YAC7C,OAAO,aAAa;AAClB,UAAM,SAASC,gCAAAA,eAAe,QAAQ;AACtC,WAAO,SACH,UAAU,QAAQ,IAAI,SAAS,QAAQ,YAAY,QAAQ,SAAS,SAAS,MAAM,IACnF,UAAU,QAAQ,IAAI,SAAS,QAAQ,YAAY,QAAQ,SAAS,OAAO;AAAA,EACjF,IACA;AAEJ,QAAM,gBAAgB,CACpB,YACA,UACA,WACG;AACH,QAAI,CAAC,UAAW;AAChB,aAAS,MAAS;AAClB,WAAO,QAAQ,QAAQ,UAAU,YAAY,WAAW,YAAY,QAAQ,MAAM,CAAC,EAChF,MAAM,CAAC,QAAiB;AACvB,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D,CAAC;AAAA,EACL;AAEA,SACEP,2BAAAA,KAAC,OAAA,EAAI,WAAU,kHACb,UAAA;AAAA,IAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,4FACb,UAAA;AAAA,MAAAF,2BAAAA,IAAC,UACE,UAAA,QAAQ,cACL,gBAAgB,QAAQ,WAAW,KACnC,YAAA,CACN;AAAA,MACAE,2BAAAA,KAAC,QAAA,EAAK,WAAU,sBACb,UAAA;AAAA,QAAA,QAAQ,YACPA,2BAAAA,KAAC,QAAA,EAAK,OAAOQ,uBAAAA,WAAW,QAAQ,SAAS,GACtC,UAAA;AAAA,UAAA,SAAS,QAAQ,SAAS;AAAA,UAAE;AAAA,QAAA,EAAA,CAC/B,IACE;AAAA,QACH,QAAQ,YACPV,2BAAAA,IAAC,QAAA,EAAK,OAAOU,uBAAAA,WAAW,QAAQ,SAAS,GACtC,UAAA,eAAe,QAAQ,SAAS,GACnC,IACE;AAAA,MAAA,EAAA,CACN;AAAA,IAAA,GACF;AAAA,IACC,QACCR,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,+BAA+B,UAAA,QAAQ,MAAK;AAAA,MAC3DA,2BAAAA;AAAAA,QAACW,2BAAAA;AAAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,IAAI,QAAQ;AAAA,YACZ,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,YACd,SAAS;AAAA,YACT,YAAY,QAAQ;AAAA,YACpB,cAAc,MAAM;AAAA,YACpB,iBAAiB;AAAA,UAAA;AAAA,UAEnB,SAAS;AAAA,UACT,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACd,EAAA,CACF,IAEAX,2BAAAA;AAAAA,MAACY,SAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA,aAAW;AAAA,QACX,WAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGd,uCACE,KAAA,EAAE,MAAK,SAAQ,WAAU,wCACvB,iBACH,IACE;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,SAAS,WAA2B;AAC3C,SAAOC,uBAAAA,cAAc,SAAS,KAAK;AACrC;AAEA,SAAS,eAAe,WAA2B;AACjD,QAAM,SAAS,IAAI,KAAK,SAAS,EAAE,QAAA;AACnC,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,QAAM,MAAM,KAAK,IAAA;AACjB,MAAI,UAAU,IAAK,QAAO;AAC1B,QAAM,QAAQA,uBAAAA,cAAc,IAAI,KAAK,GAAG,EAAE,YAAA,GAAe,SAAS;AAClE,SAAO,QAAQ,GAAG,KAAK,UAAU;AACnC;;"}
|
|
@@ -87,7 +87,6 @@ function PendingApprovalRow({
|
|
|
87
87
|
onResolve
|
|
88
88
|
}) {
|
|
89
89
|
const [error, setError] = useState(void 0);
|
|
90
|
-
const [busy, setBusy] = useState(false);
|
|
91
90
|
const part = {
|
|
92
91
|
type: "dynamic-tool",
|
|
93
92
|
toolName: request.tool,
|
|
@@ -104,10 +103,9 @@ function PendingApprovalRow({
|
|
|
104
103
|
const handleApprove = (approvalId, approved, reason) => {
|
|
105
104
|
if (!onResolve) return;
|
|
106
105
|
setError(void 0);
|
|
107
|
-
|
|
108
|
-
void Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
|
|
106
|
+
return Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
|
|
109
107
|
setError(err instanceof Error ? err.message : String(err));
|
|
110
|
-
})
|
|
108
|
+
});
|
|
111
109
|
};
|
|
112
110
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20", children: [
|
|
113
111
|
/* @__PURE__ */ jsxs("div", { className: "mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
|
|
@@ -143,10 +141,9 @@ function PendingApprovalRow({
|
|
|
143
141
|
{
|
|
144
142
|
part,
|
|
145
143
|
defaultOpen: true,
|
|
146
|
-
onApprove:
|
|
144
|
+
onApprove: handleApprove
|
|
147
145
|
}
|
|
148
146
|
),
|
|
149
|
-
busy ? /* @__PURE__ */ jsx("p", { className: "mt-1.5 pl-4 text-xs text-muted-foreground", children: "Submitting…" }) : null,
|
|
150
147
|
error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "mt-1.5 pl-4 text-xs text-destructive", children: error }) : null
|
|
151
148
|
] });
|
|
152
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInspector.approvals.js","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n )}\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionInspector.approvals.js","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n return Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={handleApprove}\n />\n )}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ const SessionViewer_header = require("./SessionViewer.header.cjs");
|
|
|
15
15
|
const sessionCategories = require("./session-categories.cjs");
|
|
16
16
|
const SessionViewerMenu = require("./SessionViewerMenu.cjs");
|
|
17
17
|
const useSessionScroll = require("./use-session-scroll.cjs");
|
|
18
|
+
const useSessionTokenSizing = require("./use-session-token-sizing.cjs");
|
|
18
19
|
const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
|
|
19
20
|
const UiArrowDown = require("../../icons/components/UiArrowDown.cjs");
|
|
20
21
|
function toggleInSet(set, value) {
|
|
@@ -44,7 +45,8 @@ function SessionViewer({
|
|
|
44
45
|
showRaw = false,
|
|
45
46
|
renderMessageBadge,
|
|
46
47
|
pendingTools = [],
|
|
47
|
-
onPendingToolDecision
|
|
48
|
+
onPendingToolDecision,
|
|
49
|
+
sizeTokens
|
|
48
50
|
}) {
|
|
49
51
|
var _a, _b;
|
|
50
52
|
const allEvents = react.useMemo(
|
|
@@ -53,6 +55,7 @@ function SessionViewer({
|
|
|
53
55
|
);
|
|
54
56
|
const displayItems = react.useMemo(() => SessionViewer_grouping.collapseWaitRuns(allEvents), [allEvents]);
|
|
55
57
|
const metadata = react.useMemo(() => SessionViewer_model.getSessionMetadata(session), [session]);
|
|
58
|
+
const tokenSizing = useSessionTokenSizing.useSessionTokenSizing(session, allEvents, sizeTokens);
|
|
56
59
|
const pageDensity = useDensity.useDensityValue();
|
|
57
60
|
const [densityOverride, setDensityOverride] = react.useState(
|
|
58
61
|
defaultDensity
|
|
@@ -68,6 +71,7 @@ function SessionViewer({
|
|
|
68
71
|
const [showThinkingOverride, setShowThinkingOverride] = react.useState(void 0);
|
|
69
72
|
const effectiveShowThinking = showThinkingOverride ?? showThinking;
|
|
70
73
|
const [showEncryptedReasoning, setShowEncryptedReasoning] = react.useState(false);
|
|
74
|
+
const [showEstimatedToolCost, setShowEstimatedToolCost] = react.useState(false);
|
|
71
75
|
const filters = react.useMemo(() => sessionCategories.collectSessionFilters(allEvents), [allEvents]);
|
|
72
76
|
const hasThinking = react.useMemo(
|
|
73
77
|
() => allEvents.some((e) => e.kind === "thinking"),
|
|
@@ -134,7 +138,10 @@ function SessionViewer({
|
|
|
134
138
|
hasThinking,
|
|
135
139
|
hasEncryptedReasoning,
|
|
136
140
|
showEncryptedReasoning,
|
|
137
|
-
onToggleEncryptedReasoning: () => setShowEncryptedReasoning((shown) => !shown)
|
|
141
|
+
onToggleEncryptedReasoning: () => setShowEncryptedReasoning((shown) => !shown),
|
|
142
|
+
showEstimatedToolCost,
|
|
143
|
+
onToggleEstimatedToolCost: () => setShowEstimatedToolCost((shown) => !shown),
|
|
144
|
+
...tokenSizing.estimateAll ? { onEstimateTokens: tokenSizing.estimateAll, onCalculateMissingTokens: tokenSizing.calculateMissing, estimatingTokens: tokenSizing.pending } : {}
|
|
138
145
|
}
|
|
139
146
|
) : null;
|
|
140
147
|
const inlineMenu = menu && !menuContainer;
|
|
@@ -148,6 +155,7 @@ function SessionViewer({
|
|
|
148
155
|
{
|
|
149
156
|
group: item,
|
|
150
157
|
last,
|
|
158
|
+
showEstimatedToolCost,
|
|
151
159
|
defaultExpanded,
|
|
152
160
|
showRowMetadata,
|
|
153
161
|
showRaw,
|
|
@@ -160,6 +168,7 @@ function SessionViewer({
|
|
|
160
168
|
{
|
|
161
169
|
event: item,
|
|
162
170
|
initialPrompt: item.id === firstUserEventId,
|
|
171
|
+
showEstimatedToolCost,
|
|
163
172
|
last,
|
|
164
173
|
defaultExpanded,
|
|
165
174
|
showRowMetadata,
|
|
@@ -180,7 +189,7 @@ function SessionViewer({
|
|
|
180
189
|
className
|
|
181
190
|
),
|
|
182
191
|
...dataAttrs,
|
|
183
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(densityProvider.DensityValueProvider, { density: effectiveDensity, children: [
|
|
192
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(useSessionTokenSizing.SessionTokenContext.Provider, { value: tokenSizing.context, children: /* @__PURE__ */ jsxRuntime.jsxs(densityProvider.DensityValueProvider, { density: effectiveDensity, children: [
|
|
184
193
|
menu && menuContainer && reactDom.createPortal(menu, menuContainer),
|
|
185
194
|
(showHeader || headerActions || inlineMenu) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
186
195
|
"div",
|
|
@@ -252,7 +261,7 @@ function SessionViewer({
|
|
|
252
261
|
}
|
|
253
262
|
)
|
|
254
263
|
] }) : list
|
|
255
|
-
] })
|
|
264
|
+
] }) })
|
|
256
265
|
}
|
|
257
266
|
);
|
|
258
267
|
}
|