@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-session-token-sizing.d.ts","sourceRoot":"","sources":["../../../src/data/ai/use-session-token-sizing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,WAAW,aAAc,SAAQ,qBAAqB;IAAG,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;AAClF,UAAU,kBAAkB;IAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,aAAa,GAAG,SAAS,CAAC;IAC1D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC;CACxE;AACD,eAAO,MAAM,mBAAmB,yDAA2D,CAAC;AAE5F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,EAAE,iBAAiB;;uBAuD3E,YAAY;4BAlCX,MAAM,EAAE,UAAU,UAAU,GAAG,UAAU;;;;;EAuCjF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { useMemo, useState, useRef, useEffect, useCallback, createContext } from "react";
|
|
2
|
+
const SessionTokenContext = createContext(void 0);
|
|
3
|
+
function useSessionTokenSizing(session, events, sizeTokens) {
|
|
4
|
+
const identity = typeof session === "object" && !Array.isArray(session) && session !== null && "id" in session ? session : void 0;
|
|
5
|
+
const sessionId = identity == null ? void 0 : identity.id;
|
|
6
|
+
const revision = identity == null ? void 0 : identity.revision;
|
|
7
|
+
const scope = JSON.stringify([sessionId, revision, identity == null ? void 0 : identity.model, identity == null ? void 0 : identity.modelMode]);
|
|
8
|
+
const keys = useMemo(() => new Map(events.map((event) => [event.id, JSON.stringify([scope, event.id, event.model, event.text, event.toolInput, event.toolResponse, event.file, event.raw])])), [events, scope]);
|
|
9
|
+
const [values, setValues] = useState({});
|
|
10
|
+
const current = useRef({ scope, keys });
|
|
11
|
+
current.current = { scope, keys };
|
|
12
|
+
const inFlight = useRef(/* @__PURE__ */ new Map());
|
|
13
|
+
const controllers = useRef(/* @__PURE__ */ new Set());
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const valid = new Set(keys.values());
|
|
16
|
+
for (const [key, controller] of inFlight.current) {
|
|
17
|
+
if (!valid.has(key)) {
|
|
18
|
+
controller.abort();
|
|
19
|
+
inFlight.current.delete(key);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
setValues((old) => Object.keys(old).every((key) => valid.has(key)) ? old : Object.fromEntries(Object.entries(old).filter(([key]) => valid.has(key))));
|
|
23
|
+
}, [keys]);
|
|
24
|
+
useEffect(() => () => {
|
|
25
|
+
for (const controller of controllers.current) controller.abort();
|
|
26
|
+
}, []);
|
|
27
|
+
const calculate = useCallback((rowIds, method) => {
|
|
28
|
+
if (!sizeTokens || !sessionId) return;
|
|
29
|
+
const requested = rowIds.flatMap((rowId) => {
|
|
30
|
+
const key = keys.get(rowId);
|
|
31
|
+
if (!key || inFlight.current.has(key)) return [];
|
|
32
|
+
const value = values[key];
|
|
33
|
+
if ((value == null ? void 0 : value.size) && (method === "estimate" || value.size.source !== "local-estimate")) return [];
|
|
34
|
+
return [{ rowId, key }];
|
|
35
|
+
});
|
|
36
|
+
if (requested.length === 0) return;
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
controllers.current.add(controller);
|
|
39
|
+
for (const { key } of requested) inFlight.current.set(key, controller);
|
|
40
|
+
setValues((old) => ({ ...old, ...Object.fromEntries(requested.map(({ rowId, key }) => [key, { ...old[key], rowId, attributed: false, pending: true }])) }));
|
|
41
|
+
void (async () => {
|
|
42
|
+
try {
|
|
43
|
+
const result = await sizeTokens({ sessionId, ...revision !== void 0 ? { revision } : {}, rowIds: requested.map(({ rowId }) => rowId), method }, controller.signal);
|
|
44
|
+
if (controller.signal.aborted || current.current.scope !== scope) return;
|
|
45
|
+
if (result.sessionId !== sessionId || revision !== void 0 && result.revision !== revision) throw new Error("Session changed while calculating tokens; retry on the current transcript.");
|
|
46
|
+
const returned = new Map(result.rows.map((row) => [row.rowId, row]));
|
|
47
|
+
setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, returned.get(rowId) ?? { rowId, attributed: false, error: "No token sizing result returned for this row." }])) }));
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (controller.signal.aborted || current.current.scope !== scope) return;
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, { rowId, attributed: false, error: message }])) }));
|
|
52
|
+
} finally {
|
|
53
|
+
controllers.current.delete(controller);
|
|
54
|
+
for (const { key } of requested) if (inFlight.current.get(key) === controller) inFlight.current.delete(key);
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
}, [keys, revision, scope, sessionId, sizeTokens, values]);
|
|
58
|
+
const enabled = Boolean(sizeTokens && sessionId);
|
|
59
|
+
return {
|
|
60
|
+
context: enabled ? { state: (event) => {
|
|
61
|
+
const key = keys.get(event.id);
|
|
62
|
+
return key ? values[key] : void 0;
|
|
63
|
+
}, calculate } : void 0,
|
|
64
|
+
estimateAll: enabled ? () => calculate(events.filter((event) => !event.pending).map((event) => event.id), "estimate") : void 0,
|
|
65
|
+
calculateMissing: enabled ? () => calculate(events.filter((event) => !event.estimatedCost && !event.pending).map((event) => event.id), "provider") : void 0,
|
|
66
|
+
pending: Object.values(values).some((value) => value.pending)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
SessionTokenContext,
|
|
71
|
+
useSessionTokenSizing
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=use-session-token-sizing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-session-token-sizing.js","sources":["../../../src/data/ai/use-session-token-sizing.ts"],"sourcesContent":["import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SessionEvent, SessionInput } from \"./SessionViewer.model\";\nimport type { SessionTokenRowResult, SessionTokenSizer } from \"./session-token-sizing\";\n\nexport interface RowTokenState extends SessionTokenRowResult { pending?: boolean }\ninterface TokenSizingContext {\n state: (event: SessionEvent) => RowTokenState | undefined;\n calculate: (rowIds: string[], method: \"estimate\" | \"provider\") => void;\n}\nexport const SessionTokenContext = createContext<TokenSizingContext | undefined>(undefined);\n\nexport function useSessionTokenSizing(session: SessionInput, events: SessionEvent[], sizeTokens?: SessionTokenSizer) {\n const identity = typeof session === \"object\" && !Array.isArray(session) && session !== null && \"id\" in session ? session : undefined;\n const sessionId = identity?.id;\n const revision = identity?.revision;\n const scope = JSON.stringify([sessionId, revision, identity?.model, identity?.modelMode]);\n const keys = useMemo(() => new Map(events.map((event) => [event.id, JSON.stringify([scope, event.id, event.model, event.text, event.toolInput, event.toolResponse, event.file, event.raw])])), [events, scope]);\n const [values, setValues] = useState<Record<string, RowTokenState>>({});\n const current = useRef({ scope, keys });\n current.current = { scope, keys };\n const inFlight = useRef(new Map<string, AbortController>());\n const controllers = useRef(new Set<AbortController>());\n\n useEffect(() => {\n const valid = new Set(keys.values());\n for (const [key, controller] of inFlight.current) {\n if (!valid.has(key)) { controller.abort(); inFlight.current.delete(key); }\n }\n setValues((old) => Object.keys(old).every((key) => valid.has(key)) ? old : Object.fromEntries(Object.entries(old).filter(([key]) => valid.has(key))));\n }, [keys]);\n useEffect(() => () => { for (const controller of controllers.current) controller.abort(); }, []);\n\n const calculate = useCallback((rowIds: string[], method: \"estimate\" | \"provider\") => {\n if (!sizeTokens || !sessionId) return;\n const requested = rowIds.flatMap((rowId) => {\n const key = keys.get(rowId);\n if (!key || inFlight.current.has(key)) return [];\n const value = values[key];\n if (value?.size && (method === \"estimate\" || value.size.source !== \"local-estimate\")) return [];\n return [{ rowId, key }];\n });\n if (requested.length === 0) return;\n const controller = new AbortController();\n controllers.current.add(controller);\n for (const { key } of requested) inFlight.current.set(key, controller);\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.map(({ rowId, key }) => [key, { ...old[key], rowId, attributed: false, pending: true }])) }));\n void (async () => {\n try {\n const result = await sizeTokens({ sessionId, ...(revision !== undefined ? { revision } : {}), rowIds: requested.map(({ rowId }) => rowId), method }, controller.signal);\n if (controller.signal.aborted || current.current.scope !== scope) return;\n if (result.sessionId !== sessionId || (revision !== undefined && result.revision !== revision)) throw new Error(\"Session changed while calculating tokens; retry on the current transcript.\");\n const returned = new Map(result.rows.map((row) => [row.rowId, row]));\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, returned.get(rowId) ?? { rowId, attributed: false, error: \"No token sizing result returned for this row.\" }])) }));\n } catch (error) {\n if (controller.signal.aborted || current.current.scope !== scope) return;\n const message = error instanceof Error ? error.message : String(error);\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, { rowId, attributed: false, error: message }])) }));\n } finally {\n controllers.current.delete(controller);\n for (const { key } of requested) if (inFlight.current.get(key) === controller) inFlight.current.delete(key);\n }\n })();\n }, [keys, revision, scope, sessionId, sizeTokens, values]);\n\n const enabled = Boolean(sizeTokens && sessionId);\n return {\n context: enabled ? { state: (event: SessionEvent) => { const key = keys.get(event.id); return key ? values[key] : undefined; }, calculate } : undefined,\n estimateAll: enabled ? () => calculate(events.filter((event) => !event.pending).map((event) => event.id), \"estimate\") : undefined,\n calculateMissing: enabled ? () => calculate(events.filter((event) => !event.estimatedCost && !event.pending).map((event) => event.id), \"provider\") : undefined,\n pending: Object.values(values).some((value) => value.pending),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const button = require("../../components/button.cjs");
|
|
6
|
+
const utils = require("../../lib/utils.cjs");
|
|
7
|
+
const GraphDiagram = require("../GraphDiagram.cjs");
|
|
8
|
+
const callGraphExclude = require("./call-graph-exclude.cjs");
|
|
9
|
+
const callGraphModel = require("./call-graph-model.cjs");
|
|
10
|
+
const callGraphVocabulary = require("./call-graph-vocabulary.cjs");
|
|
11
|
+
const CallGraphGlyphs = require("./CallGraphGlyphs.cjs");
|
|
12
|
+
const CallGraphParts = require("./CallGraphParts.cjs");
|
|
13
|
+
const CallGraphToolbar = require("./CallGraphToolbar.cjs");
|
|
14
|
+
const types = require("./types.cjs");
|
|
15
|
+
const useCallGraph = require("./use-call-graph.cjs");
|
|
16
|
+
const NODE_WIDTH = 188;
|
|
17
|
+
const NODE_HEIGHT = 32;
|
|
18
|
+
const COMPACT_NODE_HEIGHT = 22;
|
|
19
|
+
const ROW_GAP = 14;
|
|
20
|
+
const READABLE_SCALE = 0.6;
|
|
21
|
+
const OPTIONS = { truncateAt: 32, grouped: true };
|
|
22
|
+
function Notice({ children }) {
|
|
23
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center p-6 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children }) });
|
|
24
|
+
}
|
|
25
|
+
function Alert({ message }) {
|
|
26
|
+
if (!message) return null;
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive", children: message });
|
|
28
|
+
}
|
|
29
|
+
const ACCESS_WORDS = { call: "Calls", read: "Reads", write: "Writes" };
|
|
30
|
+
function accessWords(access) {
|
|
31
|
+
return access.map((type) => ACCESS_WORDS[type]).join(" and ");
|
|
32
|
+
}
|
|
33
|
+
function action(href, onSelect) {
|
|
34
|
+
if (href === void 0 && onSelect === void 0) return void 0;
|
|
35
|
+
return { ...href !== void 0 ? { href } : {}, ...onSelect ? { onSelect } : {} };
|
|
36
|
+
}
|
|
37
|
+
function CallGraph(props) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
const { root, fetchGraph, vocabulary = callGraphVocabulary.UIR_CALL_GRAPH_VOCABULARY, maxDepth = callGraphModel.CALL_GRAPH_MAX_DEPTH } = props;
|
|
40
|
+
const labels = { ...callGraphModel.DEFAULT_EDGE_LABELS, ...props.edgeLabels };
|
|
41
|
+
const [direction, setDirection] = useCallGraph.useHeld(props.direction ?? "both", props.onDirectionChange);
|
|
42
|
+
const [depth, setDepth] = useCallGraph.useHeld(props.depth ?? callGraphModel.CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);
|
|
43
|
+
const [exclude, setExclude] = useCallGraph.useHeld(props.exclude, props.onExcludeChange);
|
|
44
|
+
const [access, setAccess] = useCallGraph.useHeld(props.access ?? [...types.CALL_GRAPH_ACCESS], props.onAccessChange);
|
|
45
|
+
const [columns, setColumns] = useCallGraph.useHeld(props.columns ?? false, props.onColumnsChange);
|
|
46
|
+
if (access.length === 0) throw new Error("call graph: access must name at least one of call, read and write");
|
|
47
|
+
const [ownSelection, setOwnSelection] = react.useState();
|
|
48
|
+
const request = root === void 0 ? void 0 : { root, direction, depth, exclude, access, columns, purpose: "load" };
|
|
49
|
+
const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;
|
|
50
|
+
const load = useCallGraph.useGraphLoad(fetchGraph, request, key);
|
|
51
|
+
const [expanded, setExpanded] = react.useState();
|
|
52
|
+
const [expanding, setExpanding] = react.useState();
|
|
53
|
+
const pendingExpansion = react.useRef(void 0);
|
|
54
|
+
const activeKey = react.useRef(key);
|
|
55
|
+
activeKey.current = key;
|
|
56
|
+
react.useEffect(() => {
|
|
57
|
+
setExpanding((current) => (current == null ? void 0 : current.request.key) === key && !current.request.controller.signal.aborted ? current : void 0);
|
|
58
|
+
return () => {
|
|
59
|
+
var _a2;
|
|
60
|
+
if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === key) {
|
|
61
|
+
pendingExpansion.current.controller.abort();
|
|
62
|
+
pendingExpansion.current = void 0;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}, [key]);
|
|
66
|
+
const [opening, setOpening] = react.useState({ nonce: 0, fit: false });
|
|
67
|
+
const fresh = react.useMemo(
|
|
68
|
+
() => load.fresh && ((expanded == null ? void 0 : expanded.key) === key ? expanded : { key, graph: load.fresh, revealed: [] }),
|
|
69
|
+
[load.fresh, expanded, key]
|
|
70
|
+
);
|
|
71
|
+
const [last, setLast] = react.useState();
|
|
72
|
+
if (fresh && fresh !== last) setLast(fresh);
|
|
73
|
+
const shown = root === void 0 ? void 0 : fresh ?? last;
|
|
74
|
+
const graph = shown == null ? void 0 : shown.graph;
|
|
75
|
+
const visible = react.useMemo(() => shown && callGraphModel.visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);
|
|
76
|
+
const glyphs = react.useMemo(() => ({
|
|
77
|
+
node: (glyph, words) => /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.NodeGlyphIcon, { vocabulary, glyph, title: words }),
|
|
78
|
+
edge: (type) => type === "call" ? void 0 : /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.EdgeTypeGlyph, { type, title: labels[type] }),
|
|
79
|
+
group: (caption) => /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.GroupCaption, { icon: vocabulary.group.icon, caption })
|
|
80
|
+
}), [vocabulary, labels.dispatch, labels.read, labels.write]);
|
|
81
|
+
const guardLabel = props.guardLabel ?? "innermost";
|
|
82
|
+
const diagram = react.useMemo(
|
|
83
|
+
() => graph && visible && callGraphModel.toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels }),
|
|
84
|
+
[graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write]
|
|
85
|
+
);
|
|
86
|
+
const rootId = graph == null ? void 0 : graph.roots[0];
|
|
87
|
+
const selection = props.onSelectedChange ? props.selected : (ownSelection == null ? void 0 : ownSelection.key) === (shown == null ? void 0 : shown.key) ? ownSelection == null ? void 0 : ownSelection.selected : void 0;
|
|
88
|
+
const select = (next) => {
|
|
89
|
+
if (props.onSelectedChange) props.onSelectedChange(next);
|
|
90
|
+
else setOwnSelection(next && shown ? { key: shown.key, selected: next } : void 0);
|
|
91
|
+
};
|
|
92
|
+
const openAction = (node, drawn) => {
|
|
93
|
+
var _a2;
|
|
94
|
+
const { onOpenNode, canOpenNode } = props;
|
|
95
|
+
const accepted = onOpenNode && ((canOpenNode == null ? void 0 : canOpenNode(node, drawn)) ?? true) ? () => onOpenNode(node, drawn) : void 0;
|
|
96
|
+
return action((_a2 = props.nodeHref) == null ? void 0 : _a2.call(props, node, drawn), accepted);
|
|
97
|
+
};
|
|
98
|
+
const selectedNode = (selection == null ? void 0 : selection.kind) === "node" ? visible == null ? void 0 : visible.nodes.find((node) => node.id === selection.id) : void 0;
|
|
99
|
+
const selectedEdge = (selection == null ? void 0 : selection.kind) === "edge" ? visible == null ? void 0 : visible.edges.find((edge) => edge.id === selection.id) : void 0;
|
|
100
|
+
const guards = useCallGraph.useSiteGuards(props.loadSiteGuards, shown == null ? void 0 : shown.key, selectedEdge, graph);
|
|
101
|
+
const expansion = (expanding == null ? void 0 : expanding.request.key) === key ? expanding : void 0;
|
|
102
|
+
const expand = async (drawn, id) => {
|
|
103
|
+
var _a2, _b2;
|
|
104
|
+
if (drawn.key !== activeKey.current) return;
|
|
105
|
+
if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === drawn.key && pendingExpansion.current.nodeId === id) return;
|
|
106
|
+
(_b2 = pendingExpansion.current) == null ? void 0 : _b2.controller.abort();
|
|
107
|
+
const node = callGraphModel.requireNode(drawn.graph, id);
|
|
108
|
+
const request2 = { key: drawn.key, nodeId: id, label: node.label, controller: new AbortController() };
|
|
109
|
+
pendingExpansion.current = request2;
|
|
110
|
+
setExpanding({ request: request2 });
|
|
111
|
+
try {
|
|
112
|
+
const data = await fetchGraph({
|
|
113
|
+
root: id,
|
|
114
|
+
direction: callGraphModel.expansionDirection(node),
|
|
115
|
+
depth: 1,
|
|
116
|
+
exclude,
|
|
117
|
+
access,
|
|
118
|
+
columns,
|
|
119
|
+
purpose: "expand",
|
|
120
|
+
signal: request2.controller.signal
|
|
121
|
+
});
|
|
122
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request2) return;
|
|
123
|
+
setExpanded((held) => {
|
|
124
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key) return held;
|
|
125
|
+
const base = (held == null ? void 0 : held.key) === drawn.key ? held : drawn;
|
|
126
|
+
return { key: drawn.key, graph: callGraphModel.mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };
|
|
127
|
+
});
|
|
128
|
+
setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? void 0 : current);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request2) return;
|
|
131
|
+
setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? { request: request2, error: `Cannot expand ${node.label}: ${useCallGraph.errorMessage(error)}` } : current);
|
|
132
|
+
} finally {
|
|
133
|
+
if (pendingExpansion.current === request2) pendingExpansion.current = void 0;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const groups = graph && ((_a = props.groupFacts) == null ? void 0 : _a.call(props, graph));
|
|
137
|
+
const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);
|
|
138
|
+
const { onPinnedChange } = props;
|
|
139
|
+
const toolbar = /* @__PURE__ */ jsxRuntime.jsx(
|
|
140
|
+
CallGraphToolbar.CallGraphToolbar,
|
|
141
|
+
{
|
|
142
|
+
direction,
|
|
143
|
+
depth,
|
|
144
|
+
maxDepth,
|
|
145
|
+
omitted: graph == null ? void 0 : graph.omitted,
|
|
146
|
+
end: props.toolbarEnd,
|
|
147
|
+
vocabulary,
|
|
148
|
+
...onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== void 0, onPin: (pinned) => onPinnedChange(pinned, rootId) } } : {},
|
|
149
|
+
...groups ? { exclusions: {
|
|
150
|
+
exclude: effectiveExclude,
|
|
151
|
+
groups,
|
|
152
|
+
matches: props.excludeMatcher ?? callGraphExclude.matchesExclude,
|
|
153
|
+
busy: load.loading,
|
|
154
|
+
vocabulary,
|
|
155
|
+
onExclude: (patterns) => setExclude(patterns),
|
|
156
|
+
onDefaults: () => setExclude(void 0)
|
|
157
|
+
} } : {},
|
|
158
|
+
...props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns } } : {},
|
|
159
|
+
onDirection: setDirection,
|
|
160
|
+
onDepth: setDepth,
|
|
161
|
+
onFit: () => setOpening({ nonce: opening.nonce + 1, fit: true }),
|
|
162
|
+
onReset: () => setOpening({ nonce: opening.nonce + 1, fit: false })
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
const frame = utils.cn("flex h-full min-h-0 flex-col gap-2 p-2", props.className);
|
|
166
|
+
if (root === void 0) {
|
|
167
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: frame, children: [
|
|
168
|
+
toolbar,
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsx(Notice, { children: props.emptyMessage ?? "Select a node to draw its call graph." })
|
|
170
|
+
] });
|
|
171
|
+
}
|
|
172
|
+
const loadError = load.error && `Cannot draw the call graph: ${load.error}`;
|
|
173
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: frame, "aria-busy": load.loading, children: [
|
|
174
|
+
toolbar,
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx(Alert, { message: loadError }),
|
|
176
|
+
graph && ((_b = props.renderHeader) == null ? void 0 : _b.call(props, graph)),
|
|
177
|
+
!shown && load.loading && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: "Loading call graph…" }),
|
|
178
|
+
graph && !rootId && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: "The root resolved to no node in this scope." }),
|
|
179
|
+
graph && rootId && graph.edges.length === 0 && access.length < types.CALL_GRAPH_ACCESS.length && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: `Nothing is reachable with ${accessWords(access)} only.` }),
|
|
180
|
+
graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Select an edge to list its sites, or a node to see its details." }),
|
|
181
|
+
shown && graph && rootId && diagram && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 gap-3", children: [
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background", load.loading && "opacity-60"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
183
|
+
GraphDiagram.GraphDiagram,
|
|
184
|
+
{
|
|
185
|
+
nodes: diagram.nodes,
|
|
186
|
+
edges: diagram.edges,
|
|
187
|
+
groups: diagram.groups,
|
|
188
|
+
layout: "columns",
|
|
189
|
+
zoomable: true,
|
|
190
|
+
wheelZoom: "zoom",
|
|
191
|
+
edgeFocus: "auto",
|
|
192
|
+
focusId: rootId,
|
|
193
|
+
...opening.fit ? {} : { fitMinScale: READABLE_SCALE },
|
|
194
|
+
nodeWidth: NODE_WIDTH,
|
|
195
|
+
nodeHeight: NODE_HEIGHT,
|
|
196
|
+
compactNodeHeight: COMPACT_NODE_HEIGHT,
|
|
197
|
+
columnGap: callGraphModel.columnGap(diagram),
|
|
198
|
+
rowGap: ROW_GAP,
|
|
199
|
+
className: "h-full",
|
|
200
|
+
ariaLabel: `Call graph of ${callGraphModel.requireNode(graph, rootId).label}`,
|
|
201
|
+
onNodeSelect: (id) => select({ kind: "node", id }),
|
|
202
|
+
onEdgeSelect: (id) => select({ kind: "edge", id }),
|
|
203
|
+
...fresh ? { onNodeExpand: (id) => void expand(fresh, id) } : {},
|
|
204
|
+
...selectedNode ? { selectedId: selectedNode.id } : {},
|
|
205
|
+
...selectedEdge ? { selectedEdgeId: selectedEdge.id } : {}
|
|
206
|
+
},
|
|
207
|
+
`${shown.key}:${opening.nonce}`
|
|
208
|
+
) }),
|
|
209
|
+
(selectedEdge || selectedNode || expansion) && /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3", "aria-label": "Selection", children: [
|
|
210
|
+
expansion && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "mb-2 text-xs text-muted-foreground", children: expansion.error ?? `Loading more around ${expansion.request.label}…` }),
|
|
211
|
+
(selectedEdge || selectedNode) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", "aria-label": "Close selection", onClick: () => select(void 0), children: "×" }) }),
|
|
212
|
+
selectedEdge ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
213
|
+
CallGraphParts.EdgeSites,
|
|
214
|
+
{
|
|
215
|
+
edge: selectedEdge,
|
|
216
|
+
graph,
|
|
217
|
+
labels,
|
|
218
|
+
guards,
|
|
219
|
+
lazyGuards: props.loadSiteGuards !== void 0,
|
|
220
|
+
siteAction: (props.siteHref || props.onRevealSite) && vocabulary.hasSource(callGraphModel.requireNode(graph, selectedEdge.from)) ? (site) => {
|
|
221
|
+
var _a2;
|
|
222
|
+
return action((_a2 = props.siteHref) == null ? void 0 : _a2.call(props, site, selectedEdge, graph), props.onRevealSite && (() => {
|
|
223
|
+
var _a3;
|
|
224
|
+
return (_a3 = props.onRevealSite) == null ? void 0 : _a3.call(props, site, selectedEdge, graph);
|
|
225
|
+
})) ?? {};
|
|
226
|
+
} : void 0
|
|
227
|
+
}
|
|
228
|
+
) : selectedNode && /* @__PURE__ */ jsxRuntime.jsx(
|
|
229
|
+
CallGraphParts.NodeDetails,
|
|
230
|
+
{
|
|
231
|
+
node: selectedNode,
|
|
232
|
+
graph,
|
|
233
|
+
vocabulary,
|
|
234
|
+
isRoot: selectedNode.id === rootId,
|
|
235
|
+
openLabel: props.openLabel ?? "Open",
|
|
236
|
+
opens: props.nodeHref !== void 0 || props.onOpenNode !== void 0,
|
|
237
|
+
open: openAction(selectedNode, graph),
|
|
238
|
+
onFocus: props.onFocusNode && ((id) => {
|
|
239
|
+
var _a2;
|
|
240
|
+
return (_a2 = props.onFocusNode) == null ? void 0 : _a2.call(props, id, graph);
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
)
|
|
244
|
+
] })
|
|
245
|
+
] }),
|
|
246
|
+
graph && rootId && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(CallGraphParts.Legend, { graph, vocabulary, labels }) })
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
exports.CallGraph = CallGraph;
|
|
250
|
+
//# sourceMappingURL=CallGraph.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraph.cjs","sources":["../../../src/data/call-graph/CallGraph.tsx"],"sourcesContent":["// A call graph around one root: fetched through the host, with `+N` expansions merged in, the call\n// sites of a selected edge (guards fetched on selection when the host's graph leaves them out) and the\n// details of a selected node. It knows no language: the host's vocabulary names and draws node kinds,\n// and the host's callbacks open nodes and sites.\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { cn } from \"../../lib/utils\";\nimport { GraphDiagram } from \"../GraphDiagram\";\nimport { matchesExclude, type ExcludeMatcher } from \"./call-graph-exclude\";\nimport type { GuardLabel } from \"./call-graph-labels\";\nimport {\n CALL_GRAPH_DEFAULT_DEPTH,\n CALL_GRAPH_MAX_DEPTH,\n columnGap,\n DEFAULT_EDGE_LABELS,\n expansionDirection,\n mergeGraph,\n requireNode,\n toDiagram,\n visibleGraph,\n type DiagramGlyphs,\n type DiagramOptions,\n} from \"./call-graph-model\";\nimport { UIR_CALL_GRAPH_VOCABULARY, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { EdgeTypeGlyph, GroupCaption, NodeGlyphIcon } from \"./CallGraphGlyphs\";\nimport { EdgeSites, Legend, NodeDetails, type CallGraphAction } from \"./CallGraphParts\";\nimport { CallGraphToolbar } from \"./CallGraphToolbar\";\nimport {\n CALL_GRAPH_ACCESS,\n type CallGraph as Graph,\n type CallGraphAccess,\n type CallGraphDirection,\n type CallGraphEdge,\n type CallGraphEdgeLabels,\n type CallGraphFetchParams,\n type CallGraphGroupFact,\n type CallGraphNode,\n type CallGraphSelection,\n type CallGraphSite,\n} from \"./types\";\nimport { errorMessage, useGraphLoad, useHeld, useSiteGuards, type GraphRequest } from \"./use-call-graph\";\n\nexport interface CallGraphProps<G extends Graph = Graph> {\n /** What the graph is drawn around, in the host's terms. Undefined shows `emptyMessage`. */\n root: string | undefined;\n /** Loads the graph around `params.root`, and one hop around a node for its `+N`. */\n fetchGraph: (params: CallGraphFetchParams) => Promise<G>;\n /** What else `fetchGraph` reads, such as the host's scope: part of the request's key, so a change refetches. */\n fetchKey?: string;\n /** Pass `onDirectionChange` to control it; without one the component holds it, starting here. */\n direction?: CallGraphDirection;\n onDirectionChange?: (direction: CallGraphDirection) => void;\n depth?: number;\n onDepthChange?: (depth: number) => void;\n /** The exclusion patterns; undefined takes the host's defaults. Controlled with `onExcludeChange`. */\n exclude?: string[] | undefined;\n onExcludeChange?: (exclude: string[] | undefined) => void;\n selected?: CallGraphSelection | undefined;\n onSelectedChange?: (selected: CallGraphSelection | undefined) => void;\n /** The source reports reads and writes of data: shows the Access toggles and the Columns switch. */\n dataAccess?: boolean;\n /** The edge types the host follows, never empty; all three by default. Controlled with `onAccessChange`. */\n access?: CallGraphAccess[];\n onAccessChange?: (access: CallGraphAccess[]) => void;\n /** Columns and fields as nodes of their own; collapsed into tables and entities by default. */\n columns?: boolean;\n onColumnsChange?: (columns: boolean) => void;\n /** The groups the graph reached, drawn or excluded. Without it the graph offers no exclusions. */\n groupFacts?: (graph: G) => CallGraphGroupFact[];\n /** The patterns in force when `exclude` is undefined: the host's defaults, as its response reports them. */\n defaultExclude?: (graph: G) => string[];\n /** How a pattern matches a group, for a host with keywords of its own. */\n excludeMatcher?: ExcludeMatcher;\n /**\n * Where a node opens. A node the vocabulary gives no source is never opened, and Open is disabled on\n * a node with no href that `onOpenNode` does not accept.\n */\n nodeHref?: (node: CallGraphNode, graph: G) => string | undefined;\n /** Opens a node; with `nodeHref` it handles a plain click on the link. */\n onOpenNode?: (node: CallGraphNode, graph: G) => void;\n /** Whether `onOpenNode` opens a node; every node by default. */\n canOpenNode?: (node: CallGraphNode, graph: G) => boolean;\n openLabel?: string;\n /** Re-roots the graph on a node, by id: a drawn node the vocabulary can root, or the column behind a field. */\n onFocusNode?: (nodeId: string, graph: G) => void;\n /** Where a call site opens; a site opens only when its caller has a source. */\n siteHref?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => string | undefined;\n onRevealSite?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => void;\n /** Fetches the guards of a selected edge's sites, for a host whose graph leaves them out. */\n loadSiteGuards?: (edge: CallGraphEdge, graph: G, signal: AbortSignal) => Promise<CallGraphSite[]>;\n edgeLabels?: Partial<CallGraphEdgeLabels>;\n /** What a conditional edge's pill says of its guards; \"innermost\" by default. The edge's tooltip always lists them. */\n guardLabel?: GuardLabel;\n vocabulary?: CallGraphVocabulary;\n /** Shows a Pin root toggle; the host keeps `root` while pinned. */\n pinned?: boolean;\n onPinnedChange?: (pinned: boolean, rootId: string | undefined) => void;\n /** Host facts above the diagram, such as how the root was resolved. */\n renderHeader?: (graph: G) => ReactNode;\n toolbarEnd?: ReactNode;\n emptyMessage?: ReactNode;\n maxDepth?: number;\n className?: string;\n}\n\ntype Held<G> = { key: string; graph: G; revealed: string[] };\ntype PendingExpansion = { key: string; nodeId: string; label: string; controller: AbortController };\n\nconst NODE_WIDTH = 188;\nconst NODE_HEIGHT = 32;\nconst COMPACT_NODE_HEIGHT = 22;\nconst ROW_GAP = 14;\n/** Node labels are 12px: at this scale they are 7.2px, the smallest that still reads. */\nconst READABLE_SCALE = 0.6;\nconst OPTIONS: Omit<DiagramOptions, \"guardLabel\"> = { truncateAt: 32, grouped: true };\n\nfunction Notice({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-full items-center justify-center p-6 text-center\">\n <span className=\"text-sm text-muted-foreground\">{children}</span>\n </div>\n );\n}\n\nfunction Alert({ message }: { message: string | undefined }) {\n if (!message) return null;\n return <div role=\"alert\" className=\"whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive\">{message}</div>;\n}\n\nconst ACCESS_WORDS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\" };\n\nfunction accessWords(access: readonly CallGraphAccess[]): string {\n return access.map((type) => ACCESS_WORDS[type]).join(\" and \");\n}\n\nfunction action(href: string | undefined, onSelect: (() => void) | undefined): CallGraphAction | undefined {\n if (href === undefined && onSelect === undefined) return undefined;\n return { ...(href !== undefined ? { href } : {}), ...(onSelect ? { onSelect } : {}) };\n}\n\nexport function CallGraph<G extends Graph = Graph>(props: CallGraphProps<G>) {\n const { root, fetchGraph, vocabulary = UIR_CALL_GRAPH_VOCABULARY, maxDepth = CALL_GRAPH_MAX_DEPTH } = props;\n const labels: CallGraphEdgeLabels = { ...DEFAULT_EDGE_LABELS, ...props.edgeLabels };\n const [direction, setDirection] = useHeld(props.direction ?? \"both\", props.onDirectionChange);\n const [depth, setDepth] = useHeld(props.depth ?? CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);\n const [exclude, setExclude] = useHeld(props.exclude, props.onExcludeChange);\n const [access, setAccess] = useHeld(props.access ?? [...CALL_GRAPH_ACCESS], props.onAccessChange);\n const [columns, setColumns] = useHeld(props.columns ?? false, props.onColumnsChange);\n if (access.length === 0) throw new Error(\"call graph: access must name at least one of call, read and write\");\n const [ownSelection, setOwnSelection] = useState<{ key: string; selected: CallGraphSelection }>();\n\n const request: GraphRequest | undefined = root === undefined ? undefined : { root, direction, depth, exclude, access, columns, purpose: \"load\" };\n const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;\n const load = useGraphLoad(fetchGraph, request, key);\n\n const [expanded, setExpanded] = useState<Held<G>>();\n const [expanding, setExpanding] = useState<{ request: PendingExpansion; error?: string }>();\n const pendingExpansion = useRef<PendingExpansion | undefined>(undefined);\n const activeKey = useRef(key);\n activeKey.current = key;\n useEffect(() => {\n setExpanding((current) => current?.request.key === key && !current.request.controller.signal.aborted ? current : undefined);\n return () => {\n if (pendingExpansion.current?.key === key) {\n pendingExpansion.current.controller.abort();\n pendingExpansion.current = undefined;\n }\n };\n }, [key]);\n const [opening, setOpening] = useState({ nonce: 0, fit: false });\n const fresh = useMemo<Held<G> | undefined>(\n () => load.fresh && (expanded?.key === key ? expanded : { key, graph: load.fresh, revealed: [] }),\n [load.fresh, expanded, key],\n );\n const [last, setLast] = useState<Held<G>>();\n if (fresh && fresh !== last) setLast(fresh);\n const shown = root === undefined ? undefined : (fresh ?? last);\n const graph = shown?.graph;\n\n const visible = useMemo(() => shown && visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);\n const glyphs = useMemo<DiagramGlyphs>(() => ({\n node: (glyph, words) => <NodeGlyphIcon vocabulary={vocabulary} glyph={glyph} title={words} />,\n edge: (type) => (type === \"call\" ? undefined : <EdgeTypeGlyph type={type} title={labels[type]} />),\n group: (caption) => <GroupCaption icon={vocabulary.group.icon} caption={caption} />,\n }), [vocabulary, labels.dispatch, labels.read, labels.write]);\n const guardLabel = props.guardLabel ?? \"innermost\";\n const diagram = useMemo(\n () => graph && visible && toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels }),\n [graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write],\n );\n\n const rootId = graph?.roots[0];\n const selection = props.onSelectedChange ? props.selected : ownSelection?.key === shown?.key ? ownSelection?.selected : undefined;\n const select = (next: CallGraphSelection | undefined) => {\n if (props.onSelectedChange) props.onSelectedChange(next);\n else setOwnSelection(next && shown ? { key: shown.key, selected: next } : undefined);\n };\n const openAction = (node: CallGraphNode, drawn: G) => {\n const { onOpenNode, canOpenNode } = props;\n const accepted = onOpenNode && (canOpenNode?.(node, drawn) ?? true) ? () => onOpenNode(node, drawn) : undefined;\n return action(props.nodeHref?.(node, drawn), accepted);\n };\n const selectedNode = selection?.kind === \"node\" ? visible?.nodes.find((node) => node.id === selection.id) : undefined;\n const selectedEdge = selection?.kind === \"edge\" ? visible?.edges.find((edge) => edge.id === selection.id) : undefined;\n const guards = useSiteGuards(props.loadSiteGuards, shown?.key, selectedEdge, graph);\n const expansion = expanding?.request.key === key ? expanding : undefined;\n\n // A `+N` loads one more hop on the node's outer side and merges it into the graph this request drew.\n const expand = async (drawn: Held<G>, id: string) => {\n if (drawn.key !== activeKey.current) return;\n if (pendingExpansion.current?.key === drawn.key && pendingExpansion.current.nodeId === id) return;\n pendingExpansion.current?.controller.abort();\n const node = requireNode(drawn.graph, id);\n const request: PendingExpansion = { key: drawn.key, nodeId: id, label: node.label, controller: new AbortController() };\n pendingExpansion.current = request;\n setExpanding({ request });\n try {\n const data = await fetchGraph({\n root: id, direction: expansionDirection(node), depth: 1, exclude, access, columns, purpose: \"expand\", signal: request.controller.signal,\n });\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanded((held) => {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key) return held;\n const base = held?.key === drawn.key ? held : drawn;\n return { key: drawn.key, graph: mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };\n });\n setExpanding((current) => current?.request === request ? undefined : current);\n } catch (error) {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanding((current) => current?.request === request\n ? { request, error: `Cannot expand ${node.label}: ${errorMessage(error)}` } : current);\n } finally {\n if (pendingExpansion.current === request) pendingExpansion.current = undefined;\n }\n };\n\n const groups = graph && props.groupFacts?.(graph);\n const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);\n const { onPinnedChange } = props;\n const toolbar = (\n <CallGraphToolbar direction={direction} depth={depth} maxDepth={maxDepth} omitted={graph?.omitted} end={props.toolbarEnd} vocabulary={vocabulary}\n {...(onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== undefined, onPin: (pinned: boolean) => onPinnedChange(pinned, rootId) } } : {})}\n {...(groups ? { exclusions: { exclude: effectiveExclude, groups, matches: props.excludeMatcher ?? matchesExclude, busy: load.loading, vocabulary,\n onExclude: (patterns: string[]) => setExclude(patterns), onDefaults: () => setExclude(undefined) } } : {})}\n {...(props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns } } : {})}\n onDirection={setDirection} onDepth={setDepth}\n onFit={() => setOpening({ nonce: opening.nonce + 1, fit: true })} onReset={() => setOpening({ nonce: opening.nonce + 1, fit: false })} />\n );\n\n const frame = cn(\"flex h-full min-h-0 flex-col gap-2 p-2\", props.className);\n if (root === undefined) {\n return <div className={frame}>{toolbar}<Notice>{props.emptyMessage ?? \"Select a node to draw its call graph.\"}</Notice></div>;\n }\n const loadError = load.error && `Cannot draw the call graph: ${load.error}`;\n return (\n <div className={frame} aria-busy={load.loading}>\n {toolbar}\n <Alert message={loadError} />\n {graph && props.renderHeader?.(graph)}\n {!shown && load.loading && <Notice>Loading call graph…</Notice>}\n {graph && !rootId && <Notice>The root resolved to no node in this scope.</Notice>}\n {graph && rootId && graph.edges.length === 0 && access.length < CALL_GRAPH_ACCESS.length && (\n <Notice>{`Nothing is reachable with ${accessWords(access)} only.`}</Notice>\n )}\n {graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && (\n <p className=\"text-xs text-muted-foreground\">Select an edge to list its sites, or a node to see its details.</p>\n )}\n {shown && graph && rootId && diagram && (\n <div className=\"flex min-h-0 flex-1 gap-3\">\n <div className={cn(\"relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background\", load.loading && \"opacity-60\")}>\n <GraphDiagram key={`${shown.key}:${opening.nonce}`} nodes={diagram.nodes} edges={diagram.edges} groups={diagram.groups} layout=\"columns\" zoomable wheelZoom=\"zoom\" edgeFocus=\"auto\"\n focusId={rootId} {...(opening.fit ? {} : { fitMinScale: READABLE_SCALE })} nodeWidth={NODE_WIDTH} nodeHeight={NODE_HEIGHT} compactNodeHeight={COMPACT_NODE_HEIGHT} columnGap={columnGap(diagram)} rowGap={ROW_GAP}\n className=\"h-full\" ariaLabel={`Call graph of ${requireNode(graph, rootId).label}`}\n onNodeSelect={(id: string) => select({ kind: \"node\", id })} onEdgeSelect={(id: string) => select({ kind: \"edge\", id })}\n {...(fresh ? { onNodeExpand: (id: string) => void expand(fresh, id) } : {})}\n {...(selectedNode ? { selectedId: selectedNode.id } : {})} {...(selectedEdge ? { selectedEdgeId: selectedEdge.id } : {})} />\n </div>\n {(selectedEdge || selectedNode || expansion) && (\n <aside className=\"w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3\" aria-label=\"Selection\">\n {expansion && <p role=\"status\" className=\"mb-2 text-xs text-muted-foreground\">{expansion.error ?? `Loading more around ${expansion.request.label}…`}</p>}\n {(selectedEdge || selectedNode) && (\n <div className=\"mb-1 flex justify-end\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" aria-label=\"Close selection\" onClick={() => select(undefined)}>×</Button>\n </div>\n )}\n {selectedEdge ? (\n <EdgeSites edge={selectedEdge} graph={graph} labels={labels} guards={guards} lazyGuards={props.loadSiteGuards !== undefined}\n siteAction={(props.siteHref || props.onRevealSite) && vocabulary.hasSource(requireNode(graph, selectedEdge.from))\n ? (site) => action(props.siteHref?.(site, selectedEdge, graph), props.onRevealSite && (() => props.onRevealSite?.(site, selectedEdge, graph))) ?? {}\n : undefined} />\n ) : selectedNode && (\n <NodeDetails node={selectedNode} graph={graph} vocabulary={vocabulary} isRoot={selectedNode.id === rootId} openLabel={props.openLabel ?? \"Open\"}\n opens={props.nodeHref !== undefined || props.onOpenNode !== undefined} open={openAction(selectedNode, graph)}\n onFocus={props.onFocusNode && ((id: string) => props.onFocusNode?.(id, graph))} />\n )}\n </aside>\n )}\n </div>\n )}\n {graph && rootId && <div className=\"shrink-0\"><Legend graph={graph} vocabulary={vocabulary} labels={labels} /></div>}\n </div>\n );\n}\n"],"names":["jsx","UIR_CALL_GRAPH_VOCABULARY","CALL_GRAPH_MAX_DEPTH","DEFAULT_EDGE_LABELS","useHeld","CALL_GRAPH_DEFAULT_DEPTH","CALL_GRAPH_ACCESS","useState","useGraphLoad","useRef","useEffect","_a","useMemo","visibleGraph","NodeGlyphIcon","EdgeTypeGlyph","GroupCaption","toDiagram","useSiteGuards","_b","requireNode","request","expansionDirection","mergeGraph","errorMessage","CallGraphToolbar","matchesExclude","cn","jsxs","GraphDiagram","columnGap","Button","EdgeSites","NodeDetails","Legend"],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ExcludeMatcher } from './call-graph-exclude.js';
|
|
3
|
+
import { GuardLabel } from './call-graph-labels.js';
|
|
4
|
+
import { CallGraphVocabulary } from './call-graph-vocabulary.js';
|
|
5
|
+
import { CallGraph as Graph, CallGraphAccess, CallGraphDirection, CallGraphEdge, CallGraphEdgeLabels, CallGraphFetchParams, CallGraphGroupFact, CallGraphNode, CallGraphSelection, CallGraphSite } from './types.js';
|
|
6
|
+
export interface CallGraphProps<G extends Graph = Graph> {
|
|
7
|
+
/** What the graph is drawn around, in the host's terms. Undefined shows `emptyMessage`. */
|
|
8
|
+
root: string | undefined;
|
|
9
|
+
/** Loads the graph around `params.root`, and one hop around a node for its `+N`. */
|
|
10
|
+
fetchGraph: (params: CallGraphFetchParams) => Promise<G>;
|
|
11
|
+
/** What else `fetchGraph` reads, such as the host's scope: part of the request's key, so a change refetches. */
|
|
12
|
+
fetchKey?: string;
|
|
13
|
+
/** Pass `onDirectionChange` to control it; without one the component holds it, starting here. */
|
|
14
|
+
direction?: CallGraphDirection;
|
|
15
|
+
onDirectionChange?: (direction: CallGraphDirection) => void;
|
|
16
|
+
depth?: number;
|
|
17
|
+
onDepthChange?: (depth: number) => void;
|
|
18
|
+
/** The exclusion patterns; undefined takes the host's defaults. Controlled with `onExcludeChange`. */
|
|
19
|
+
exclude?: string[] | undefined;
|
|
20
|
+
onExcludeChange?: (exclude: string[] | undefined) => void;
|
|
21
|
+
selected?: CallGraphSelection | undefined;
|
|
22
|
+
onSelectedChange?: (selected: CallGraphSelection | undefined) => void;
|
|
23
|
+
/** The source reports reads and writes of data: shows the Access toggles and the Columns switch. */
|
|
24
|
+
dataAccess?: boolean;
|
|
25
|
+
/** The edge types the host follows, never empty; all three by default. Controlled with `onAccessChange`. */
|
|
26
|
+
access?: CallGraphAccess[];
|
|
27
|
+
onAccessChange?: (access: CallGraphAccess[]) => void;
|
|
28
|
+
/** Columns and fields as nodes of their own; collapsed into tables and entities by default. */
|
|
29
|
+
columns?: boolean;
|
|
30
|
+
onColumnsChange?: (columns: boolean) => void;
|
|
31
|
+
/** The groups the graph reached, drawn or excluded. Without it the graph offers no exclusions. */
|
|
32
|
+
groupFacts?: (graph: G) => CallGraphGroupFact[];
|
|
33
|
+
/** The patterns in force when `exclude` is undefined: the host's defaults, as its response reports them. */
|
|
34
|
+
defaultExclude?: (graph: G) => string[];
|
|
35
|
+
/** How a pattern matches a group, for a host with keywords of its own. */
|
|
36
|
+
excludeMatcher?: ExcludeMatcher;
|
|
37
|
+
/**
|
|
38
|
+
* Where a node opens. A node the vocabulary gives no source is never opened, and Open is disabled on
|
|
39
|
+
* a node with no href that `onOpenNode` does not accept.
|
|
40
|
+
*/
|
|
41
|
+
nodeHref?: (node: CallGraphNode, graph: G) => string | undefined;
|
|
42
|
+
/** Opens a node; with `nodeHref` it handles a plain click on the link. */
|
|
43
|
+
onOpenNode?: (node: CallGraphNode, graph: G) => void;
|
|
44
|
+
/** Whether `onOpenNode` opens a node; every node by default. */
|
|
45
|
+
canOpenNode?: (node: CallGraphNode, graph: G) => boolean;
|
|
46
|
+
openLabel?: string;
|
|
47
|
+
/** Re-roots the graph on a node, by id: a drawn node the vocabulary can root, or the column behind a field. */
|
|
48
|
+
onFocusNode?: (nodeId: string, graph: G) => void;
|
|
49
|
+
/** Where a call site opens; a site opens only when its caller has a source. */
|
|
50
|
+
siteHref?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => string | undefined;
|
|
51
|
+
onRevealSite?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => void;
|
|
52
|
+
/** Fetches the guards of a selected edge's sites, for a host whose graph leaves them out. */
|
|
53
|
+
loadSiteGuards?: (edge: CallGraphEdge, graph: G, signal: AbortSignal) => Promise<CallGraphSite[]>;
|
|
54
|
+
edgeLabels?: Partial<CallGraphEdgeLabels>;
|
|
55
|
+
/** What a conditional edge's pill says of its guards; "innermost" by default. The edge's tooltip always lists them. */
|
|
56
|
+
guardLabel?: GuardLabel;
|
|
57
|
+
vocabulary?: CallGraphVocabulary;
|
|
58
|
+
/** Shows a Pin root toggle; the host keeps `root` while pinned. */
|
|
59
|
+
pinned?: boolean;
|
|
60
|
+
onPinnedChange?: (pinned: boolean, rootId: string | undefined) => void;
|
|
61
|
+
/** Host facts above the diagram, such as how the root was resolved. */
|
|
62
|
+
renderHeader?: (graph: G) => ReactNode;
|
|
63
|
+
toolbarEnd?: ReactNode;
|
|
64
|
+
emptyMessage?: ReactNode;
|
|
65
|
+
maxDepth?: number;
|
|
66
|
+
className?: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function CallGraph<G extends Graph = Graph>(props: CallGraphProps<G>): import("react").JSX.Element;
|
|
69
|
+
//# sourceMappingURL=CallGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraph.tsx"],"names":[],"mappings":"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"}
|