@flanksource/clicky-ui 0.3.41 → 0.3.42
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/dist/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +4 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +3 -1
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +4 -2
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +16 -0
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts +4 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +16 -0
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +4 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/Combobox.cjs +54 -8
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +56 -10
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxMenu.cjs +139 -113
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts +3 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +139 -113
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxMenuTrigger.cjs +87 -0
- package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
- package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
- package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
- package/dist/components/ComboboxMenuTrigger.js +87 -0
- package/dist/components/ComboboxMenuTrigger.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +30 -7
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +30 -7
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +20 -3
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +11 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +21 -4
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/combobox-types.d.ts +8 -0
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-badge.cjs +108 -0
- package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
- package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-badge.js +108 -0
- package/dist/components/json-schema-form-debug-badge.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
- package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.js +13 -0
- package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
- package/dist/components/json-schema-form-debug-groups.cjs +56 -0
- package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
- package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-groups.js +56 -0
- package/dist/components/json-schema-form-debug-groups.js.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
- package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.js +159 -0
- package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
- package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.js +102 -0
- package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
- package/dist/components/json-schema-form-debug.cjs +31 -0
- package/dist/components/json-schema-form-debug.cjs.map +1 -0
- package/dist/components/json-schema-form-debug.d.ts +11 -0
- package/dist/components/json-schema-form-debug.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug.js +31 -0
- package/dist/components/json-schema-form-debug.js.map +1 -0
- package/dist/components/json-schema-form-enum-choice.cjs +114 -0
- package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
- package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
- package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
- package/dist/components/json-schema-form-enum-choice.js +114 -0
- package/dist/components/json-schema-form-enum-choice.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +3 -93
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +1 -91
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-listeners.cjs +7 -1
- package/dist/components/json-schema-form-listeners.cjs.map +1 -1
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
- package/dist/components/json-schema-form-listeners.js +7 -1
- package/dist/components/json-schema-form-listeners.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +21 -5
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +21 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-tone.cjs +12 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -1
- package/dist/components/json-schema-form-tone.js +12 -0
- package/dist/components/json-schema-form-tone.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/data/GraphDiagram.cjs +125 -138
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +30 -23
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +128 -141
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramEdges.cjs +208 -0
- package/dist/data/GraphDiagramEdges.cjs.map +1 -0
- package/dist/data/GraphDiagramEdges.d.ts +40 -0
- package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
- package/dist/data/GraphDiagramEdges.js +208 -0
- package/dist/data/GraphDiagramEdges.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +142 -0
- package/dist/data/GraphDiagramNodes.cjs.map +1 -0
- package/dist/data/GraphDiagramNodes.d.ts +22 -0
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
- package/dist/data/GraphDiagramNodes.js +142 -0
- package/dist/data/GraphDiagramNodes.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +38 -44
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +26 -2
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.summary.cjs +9 -3
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +9 -3
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +4 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.js +146 -0
- package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +57 -20
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +13 -3
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
- package/dist/data/ai/SessionViewer.decision.cjs +21 -0
- package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
- package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision.js +21 -0
- package/dist/data/ai/SessionViewer.decision.js.map +1 -0
- package/dist/data/ai/SessionViewer.input.cjs +14 -0
- package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.input.d.ts +5 -0
- package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.input.js +14 -0
- package/dist/data/ai/SessionViewer.input.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +58 -21
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +6 -3
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +6 -3
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +27 -235
- 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 +8 -2
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +8 -2
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/approval-request.cjs +75 -0
- package/dist/data/ai/approval-request.cjs.map +1 -0
- package/dist/data/ai/approval-request.d.ts +155 -0
- package/dist/data/ai/approval-request.d.ts.map +1 -0
- package/dist/data/ai/approval-request.js +75 -0
- package/dist/data/ai/approval-request.js.map +1 -0
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.js +73 -0
- package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
- package/dist/data/ai/runtime-spec-fields.cjs +166 -0
- package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
- package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
- package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
- package/dist/data/ai/runtime-spec-fields.js +166 -0
- package/dist/data/ai/runtime-spec-fields.js.map +1 -0
- package/dist/data/ai/session-categories.cjs +4 -0
- package/dist/data/ai/session-categories.cjs.map +1 -1
- package/dist/data/ai/session-categories.d.ts +1 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -1
- package/dist/data/ai/session-categories.js +4 -0
- package/dist/data/ai/session-categories.js.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +49 -21
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +49 -21
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +1 -1
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +1 -1
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +216 -0
- package/dist/data/graph-columns-layout.cjs.map +1 -0
- package/dist/data/graph-columns-layout.d.ts +56 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -0
- package/dist/data/graph-columns-layout.js +216 -0
- package/dist/data/graph-columns-layout.js.map +1 -0
- package/dist/data/graph-diagram-model.cjs +73 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -0
- package/dist/data/graph-diagram-model.d.ts +90 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -0
- package/dist/data/graph-diagram-model.js +73 -0
- package/dist/data/graph-diagram-model.js.map +1 -0
- package/dist/data/graph-edge-routing.cjs +235 -0
- package/dist/data/graph-edge-routing.cjs.map +1 -0
- package/dist/data/graph-edge-routing.d.ts +73 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -0
- package/dist/data/graph-edge-routing.js +235 -0
- package/dist/data/graph-edge-routing.js.map +1 -0
- package/dist/data/graph-layout.cjs +0 -82
- package/dist/data/graph-layout.cjs.map +1 -1
- package/dist/data/graph-layout.d.ts +1 -28
- package/dist/data/graph-layout.d.ts.map +1 -1
- package/dist/data/graph-layout.js +1 -83
- package/dist/data/graph-layout.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +129 -33
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +13 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +130 -34
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/fixtures.d.ts +12 -0
- package/dist/data/har/fixtures.d.ts.map +1 -1
- package/dist/data/har/types.d.ts +12 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +67 -84
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +4 -5
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.js +170 -0
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +70 -87
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.js +56 -0
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
- package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +10 -6
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.js +95 -0
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
- package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +25 -14
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
- package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.js +41 -0
- package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
- package/dist/data/use-edge-focus.cjs +20 -0
- package/dist/data/use-edge-focus.cjs.map +1 -0
- package/dist/data/use-edge-focus.d.ts +23 -0
- package/dist/data/use-edge-focus.d.ts.map +1 -0
- package/dist/data/use-edge-focus.js +20 -0
- package/dist/data/use-edge-focus.js.map +1 -0
- package/dist/data/use-pan-zoom.cjs +159 -0
- package/dist/data/use-pan-zoom.cjs.map +1 -0
- package/dist/data/use-pan-zoom.d.ts +79 -0
- package/dist/data/use-pan-zoom.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.js +159 -0
- package/dist/data/use-pan-zoom.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +5 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +4 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +31 -15
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +3 -1
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +3 -1
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/useOperationPages.cjs +6 -1
- package/dist/rpc/useOperationPages.cjs.map +1 -1
- package/dist/rpc/useOperationPages.d.ts +3 -1
- package/dist/rpc/useOperationPages.d.ts.map +1 -1
- package/dist/rpc/useOperationPages.js +6 -1
- package/dist/rpc/useOperationPages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/schemas/json-schema-form.schema.json +5 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.js +0 -423
- package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
- package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
- package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.js +0 -262
- package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.js +0 -346
- package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
|
@@ -5,6 +5,7 @@ const react = require("react");
|
|
|
5
5
|
const reactDom = require("react-dom");
|
|
6
6
|
const utils = require("../../lib/utils.cjs");
|
|
7
7
|
const Icon = require("../Icon.cjs");
|
|
8
|
+
const button = require("../../components/button.cjs");
|
|
8
9
|
const useDensity = require("../../hooks/use-density.cjs");
|
|
9
10
|
const densityProvider = require("../../hooks/density-provider.cjs");
|
|
10
11
|
const SessionViewer_model = require("./SessionViewer.model.cjs");
|
|
@@ -15,6 +16,7 @@ const sessionCategories = require("./session-categories.cjs");
|
|
|
15
16
|
const SessionViewerMenu = require("./SessionViewerMenu.cjs");
|
|
16
17
|
const useSessionScroll = require("./use-session-scroll.cjs");
|
|
17
18
|
const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
|
|
19
|
+
const UiArrowDown = require("../../icons/components/UiArrowDown.cjs");
|
|
18
20
|
function toggleInSet(set, value) {
|
|
19
21
|
const next = new Set(set);
|
|
20
22
|
if (next.has(value)) next.delete(value);
|
|
@@ -37,13 +39,14 @@ function SessionViewer({
|
|
|
37
39
|
scrollable = false,
|
|
38
40
|
windowSize = 60,
|
|
39
41
|
batchSize = 40,
|
|
42
|
+
scrollResetKey,
|
|
40
43
|
showRowMetadata = false,
|
|
41
44
|
showRaw = false,
|
|
42
45
|
renderMessageBadge,
|
|
43
46
|
pendingTools = [],
|
|
44
47
|
onPendingToolDecision
|
|
45
48
|
}) {
|
|
46
|
-
var _a;
|
|
49
|
+
var _a, _b;
|
|
47
50
|
const allEvents = react.useMemo(
|
|
48
51
|
() => mergePendingTools(SessionViewer_model.normalizeSession(session), pendingTools),
|
|
49
52
|
[session, pendingTools]
|
|
@@ -64,25 +67,29 @@ function SessionViewer({
|
|
|
64
67
|
);
|
|
65
68
|
const [showThinkingOverride, setShowThinkingOverride] = react.useState(void 0);
|
|
66
69
|
const effectiveShowThinking = showThinkingOverride ?? showThinking;
|
|
70
|
+
const [showEncryptedReasoning, setShowEncryptedReasoning] = react.useState(false);
|
|
67
71
|
const filters = react.useMemo(() => sessionCategories.collectSessionFilters(allEvents), [allEvents]);
|
|
68
72
|
const hasThinking = react.useMemo(
|
|
69
73
|
() => allEvents.some((e) => e.kind === "thinking"),
|
|
70
74
|
[allEvents]
|
|
71
75
|
);
|
|
76
|
+
const hasEncryptedReasoning = react.useMemo(
|
|
77
|
+
() => allEvents.some(sessionCategories.isEncryptedReasoning),
|
|
78
|
+
[allEvents]
|
|
79
|
+
);
|
|
72
80
|
const visibility = {
|
|
73
81
|
hiddenCategories,
|
|
74
82
|
hiddenTools,
|
|
75
83
|
hiddenSources,
|
|
76
84
|
showThinking: effectiveShowThinking
|
|
77
85
|
};
|
|
78
|
-
const items = displayItems.filter(
|
|
79
|
-
(item)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
);
|
|
84
|
-
const
|
|
85
|
-
const { scrollRef, contentRef, startIndex } = useSessionScroll.useSessionScroll({
|
|
86
|
+
const items = displayItems.filter((item) => {
|
|
87
|
+
const event = SessionViewer_grouping.isSessionEventGroup(item) ? item.representative : item;
|
|
88
|
+
return (showEncryptedReasoning || !sessionCategories.isEncryptedReasoning(event)) && sessionCategories.isEventVisible(event, visibility);
|
|
89
|
+
});
|
|
90
|
+
const firstUserEventId = (_a = allEvents.find((event) => event.kind === "user")) == null ? void 0 : _a.id;
|
|
91
|
+
const resetKey = scrollResetKey ?? ((_b = allEvents[0]) == null ? void 0 : _b.id) ?? "";
|
|
92
|
+
const { scrollRef, contentRef, startIndex, following, resumeFollowing } = useSessionScroll.useSessionScroll({
|
|
86
93
|
total: items.length,
|
|
87
94
|
enabled: scrollable,
|
|
88
95
|
windowSize,
|
|
@@ -124,7 +131,10 @@ function SessionViewer({
|
|
|
124
131
|
onToggleSource: (source) => setHiddenSources((set) => toggleInSet(set, source)),
|
|
125
132
|
showThinking: effectiveShowThinking,
|
|
126
133
|
onToggleThinking: () => setShowThinkingOverride(!effectiveShowThinking),
|
|
127
|
-
hasThinking
|
|
134
|
+
hasThinking,
|
|
135
|
+
hasEncryptedReasoning,
|
|
136
|
+
showEncryptedReasoning,
|
|
137
|
+
onToggleEncryptedReasoning: () => setShowEncryptedReasoning((shown) => !shown)
|
|
128
138
|
}
|
|
129
139
|
) : null;
|
|
130
140
|
const inlineMenu = menu && !menuContainer;
|
|
@@ -149,6 +159,7 @@ function SessionViewer({
|
|
|
149
159
|
SessionViewer_rows.SessionRow,
|
|
150
160
|
{
|
|
151
161
|
event: item,
|
|
162
|
+
initialPrompt: item.id === firstUserEventId,
|
|
152
163
|
last,
|
|
153
164
|
defaultExpanded,
|
|
154
165
|
showRowMetadata,
|
|
@@ -216,15 +227,31 @@ function SessionViewer({
|
|
|
216
227
|
]
|
|
217
228
|
}
|
|
218
229
|
),
|
|
219
|
-
scrollable ? /* @__PURE__ */ jsxRuntime.
|
|
220
|
-
"div",
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
230
|
+
scrollable ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-h-0 flex-1", children: [
|
|
231
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "h-full overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
232
|
+
"div",
|
|
233
|
+
{
|
|
234
|
+
ref: contentRef,
|
|
235
|
+
"data-session-viewer-content": true,
|
|
236
|
+
className: "p-density-3 @min-[48rem]/session-viewer:p-density-4",
|
|
237
|
+
children: list
|
|
238
|
+
}
|
|
239
|
+
) }),
|
|
240
|
+
!following && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
241
|
+
button.Button,
|
|
242
|
+
{
|
|
243
|
+
type: "button",
|
|
244
|
+
variant: "secondary",
|
|
245
|
+
size: "sm",
|
|
246
|
+
onClick: resumeFollowing,
|
|
247
|
+
className: "absolute bottom-density-3 left-1/2 -translate-x-1/2 shadow-md",
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiArrowDown.UiArrowDown, className: "size-4" }),
|
|
250
|
+
"Scroll to bottom"
|
|
251
|
+
]
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
] }) : list
|
|
228
255
|
] })
|
|
229
256
|
}
|
|
230
257
|
);
|
|
@@ -242,7 +269,8 @@ function mergePendingTools(events, pendingTools) {
|
|
|
242
269
|
toolInput: pending.input ?? match.toolInput,
|
|
243
270
|
toolCallId: pending.toolCallId ?? match.toolCallId,
|
|
244
271
|
approvalId: pending.approvalId ?? match.approvalId,
|
|
245
|
-
sessionId: pending.sessionId ?? match.sessionId
|
|
272
|
+
sessionId: pending.sessionId ?? match.sessionId,
|
|
273
|
+
...approvalFields(pending)
|
|
246
274
|
});
|
|
247
275
|
} else {
|
|
248
276
|
merged.push({
|
|
@@ -253,11 +281,20 @@ function mergePendingTools(events, pendingTools) {
|
|
|
253
281
|
...pending.toolCallId ? { toolCallId: pending.toolCallId } : {},
|
|
254
282
|
...pending.approvalId ? { approvalId: pending.approvalId } : {},
|
|
255
283
|
...pending.sessionId ? { sessionId: pending.sessionId } : {},
|
|
284
|
+
...approvalFields(pending),
|
|
256
285
|
pending: true
|
|
257
286
|
});
|
|
258
287
|
}
|
|
259
288
|
}
|
|
260
289
|
return merged;
|
|
261
290
|
}
|
|
291
|
+
function approvalFields(pending) {
|
|
292
|
+
var _a;
|
|
293
|
+
const kind = pending.kind ?? ((_a = pending.request) == null ? void 0 : _a.kind);
|
|
294
|
+
return {
|
|
295
|
+
...kind ? { approvalKind: kind } : {},
|
|
296
|
+
...pending.request ? { approvalRequest: pending.request } : {}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
262
299
|
exports.SessionViewer = SessionViewer;
|
|
263
300
|
//# sourceMappingURL=SessionViewer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionViewer.cjs","sources":["../../../src/data/ai/SessionViewer.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { useDensityValue, type Density } from \"../../hooks/use-density\";\nimport { DensityValueProvider } from \"../../hooks/density-provider\";\nimport { UiRobotAi } from \"../../icons\";\nimport {\n getSessionMetadata,\n normalizeSession,\n summarizeSession,\n type SessionEvent,\n type SessionInput,\n} from \"./SessionViewer.model\";\nimport {\n collapseWaitRuns,\n isSessionEventGroup,\n} from \"./SessionViewer.grouping\";\nimport { SessionRow, WaitGroupRow } from \"./SessionViewer.rows\";\nimport { SessionMetadataBadges } from \"./SessionViewer.header\";\nimport {\n collectSessionFilters,\n isEventVisible,\n type SessionCategory,\n} from \"./session-categories\";\nimport {\n SessionViewerMenu,\n type SessionThemeOverride,\n} from \"./SessionViewerMenu\";\nimport { useSessionScroll } from \"./use-session-scroll\";\n\nexport type {\n SessionEntry,\n SessionEvent,\n SessionInput,\n SessionActionMeta,\n} from \"./SessionViewer.model\";\nexport type { SessionThemeOverride } from \"./SessionViewerMenu\";\n\nexport interface SessionPendingTool {\n tool: string;\n input?: Record<string, unknown>;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n}\n\nexport interface SessionToolDecision {\n event: SessionEvent;\n allow: boolean;\n message?: string;\n answers?: Record<string, string | string[]>;\n}\n\nexport interface SessionViewerProps {\n /** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */\n session: SessionInput;\n className?: string;\n /** Expand each tool call's input/output by default. Defaults to false. */\n defaultExpanded?: boolean;\n /** Render assistant reasoning (\"thinking\") blocks. Defaults to true. */\n showThinking?: boolean;\n /** Show the summary header (model + action counts). Defaults to true. */\n showHeader?: boolean;\n /** Show context usage in the summary header. Defaults to true. */\n showContextMeter?: boolean;\n /** Show the 3-dot menu (density + category/tool/source filters). Defaults to true. */\n showMenu?: boolean;\n /** Controls rendered beside the 3-dot menu in the summary header. */\n headerActions?: ReactNode;\n /** Host controls rendered at the top of the 3-dot menu. */\n menuHeader?: ReactNode;\n /** Portal the 3-dot menu into this element instead of rendering it inline in\n * the summary header — lets a host place the menu in its own toolbar while the\n * filter/density state stays owned by the viewer. Ignored when `showMenu` is\n * false; falls back to inline rendering when null/undefined. */\n menuContainer?: Element | null;\n /** Initial density override; undefined inherits the page/document density. */\n defaultDensity?: Density;\n /** Initial theme override; undefined inherits the page/document `data-theme`. */\n defaultTheme?: SessionThemeOverride;\n /** Own an internal scroll container that fills its parent's height: render only\n * the newest screenful, stay pinned to the bottom (most recent activity), and\n * backfill older rows as the reader scrolls up. Off by default, so inline\n * consumers keep rendering the whole log in normal page flow. Requires a\n * height-bounded parent. */\n scrollable?: boolean;\n /** Rows rendered on first paint in `scrollable` mode. Defaults to 60. */\n windowSize?: number;\n /** Rows added each time older content loads in `scrollable` mode. Defaults to 40. */\n batchSize?: number;\n /** Show per-row timestamp/source/model/turn/agent metadata. Defaults to false. */\n showRowMetadata?: boolean;\n /** Show a per-row raw JSON payload expander when available. Defaults to false. */\n showRaw?: boolean;\n /** Render content before each assistant message body. */\n renderMessageBadge?: (event: SessionEvent) => ReactNode;\n pendingTools?: readonly SessionPendingTool[];\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}\n\nfunction toggleInSet<T>(set: ReadonlySet<T>, value: T): Set<T> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\n/**\n * SessionViewer renders a recorded AI coding-agent session (the captain\n * `pkg/ai/history` JSON schema — Claude Code / Codex transcripts) as a vertical\n * action log. Each entry sits on a tone-colored icon disc from the Flanksource\n * \"Agent Action Icons\" set; user prompts/selections are right-aligned like a\n * chat. Shell commands render inline as bash blocks and file ops as their\n * cwd-relative path — the icon carries the verb. Tool responses expand behind\n * a chevron, rendered bare (no panel chrome). The \"3-dot\" menu mirrors\n * `captain history` filtering — toggle density and hide categories, tools or\n * sources.\n */\nexport function SessionViewer({\n session,\n className,\n defaultExpanded = false,\n showThinking = true,\n showHeader = true,\n showContextMeter = true,\n showMenu = true,\n headerActions,\n menuHeader,\n menuContainer,\n defaultDensity,\n defaultTheme,\n scrollable = false,\n windowSize = 60,\n batchSize = 40,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n pendingTools = [],\n onPendingToolDecision,\n}: SessionViewerProps) {\n const allEvents = useMemo(\n () => mergePendingTools(normalizeSession(session), pendingTools),\n [session, pendingTools],\n );\n const displayItems = useMemo(() => collapseWaitRuns(allEvents), [allEvents]);\n const metadata = useMemo(() => getSessionMetadata(session), [session]);\n\n const pageDensity = useDensityValue();\n const [densityOverride, setDensityOverride] = useState<Density | undefined>(\n defaultDensity,\n );\n const [themeOverride, setThemeOverride] = useState<\n SessionThemeOverride | undefined\n >(defaultTheme);\n const [hiddenCategories, setHiddenCategories] = useState<\n ReadonlySet<SessionCategory>\n >(() => new Set());\n const [hiddenTools, setHiddenTools] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const [hiddenSources, setHiddenSources] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n // Undefined = follow the `showThinking` prop; the menu toggle sets an override.\n const [showThinkingOverride, setShowThinkingOverride] = useState<\n boolean | undefined\n >(undefined);\n const effectiveShowThinking = showThinkingOverride ?? showThinking;\n\n const filters = useMemo(() => collectSessionFilters(allEvents), [allEvents]);\n const hasThinking = useMemo(\n () => allEvents.some((e) => e.kind === \"thinking\"),\n [allEvents],\n );\n\n const visibility = {\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n showThinking: effectiveShowThinking,\n };\n const items = displayItems.filter((item) =>\n isEventVisible(\n isSessionEventGroup(item) ? item.representative : item,\n visibility,\n ),\n );\n\n // Reset the window when the underlying session changes, not on filter toggles —\n // so hiding a category doesn't yank the reader back to the bottom.\n const resetKey = `${allEvents.length}:${allEvents[0]?.id ?? \"\"}`;\n const { scrollRef, contentRef, startIndex } = useSessionScroll({\n total: items.length,\n enabled: scrollable,\n windowSize,\n batchSize,\n resetKey,\n });\n\n if (allEvents.length === 0) {\n return (\n <div\n className={cn(\n \"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No session activity.\n </div>\n );\n }\n\n const summary = summarizeSession(allEvents);\n const effectiveDensity = densityOverride ?? pageDensity;\n const dataAttrs: Record<string, string> = {\n ...(densityOverride ? { \"data-density\": densityOverride } : {}),\n ...(themeOverride ? { \"data-theme\": themeOverride } : {}),\n };\n\n const menu = showMenu ? (\n <SessionViewerMenu\n menuHeader={menuHeader}\n density={densityOverride}\n onDensityChange={setDensityOverride}\n theme={themeOverride}\n onThemeChange={setThemeOverride}\n filters={filters}\n hiddenCategories={hiddenCategories}\n hiddenTools={hiddenTools}\n hiddenSources={hiddenSources}\n onToggleCategory={(category) =>\n setHiddenCategories((set) => toggleInSet(set, category))\n }\n onToggleTool={(tool) => setHiddenTools((set) => toggleInSet(set, tool))}\n onToggleSource={(source) =>\n setHiddenSources((set) => toggleInSet(set, source))\n }\n showThinking={effectiveShowThinking}\n onToggleThinking={() => setShowThinkingOverride(!effectiveShowThinking)}\n hasThinking={hasThinking}\n />\n ) : null;\n // When a host supplies `menuContainer`, the menu is portaled into it (e.g. the\n // host's own toolbar) and the inline header collapses to just its summary.\n const inlineMenu = menu && !menuContainer;\n\n const list =\n items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\">\n All actions are hidden by the active filters.\n </div>\n ) : (\n // In scrollable mode only the newest `startIndex..` slice is mounted; `last`\n // is measured against the full length so the timeline connector stays right.\n <ol className=\"relative\">\n {items.slice(startIndex).map((item, index) => {\n const last = startIndex + index === items.length - 1;\n return isSessionEventGroup(item) ? (\n <WaitGroupRow\n key={item.id}\n group={item}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ) : (\n <SessionRow\n key={item.id}\n event={item}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n })}\n </ol>\n );\n\n return (\n <div\n className={cn(\n \"@container/session-viewer min-w-0 bg-background text-sm text-foreground data-[theme=dark]:bg-[var(--fs-bg-subtle)] [[data-theme=dark]_&]:bg-[var(--fs-bg-subtle)]\",\n scrollable && \"flex h-full min-h-0 flex-col\",\n className,\n )}\n {...dataAttrs}\n >\n <DensityValueProvider density={effectiveDensity}>\n {menu && menuContainer && createPortal(menu, menuContainer)}\n {(showHeader || headerActions || inlineMenu) && (\n <div\n data-session-viewer-header\n className={cn(\n \"flex min-w-0 flex-wrap items-center justify-between gap-x-density-3 gap-y-density-2\",\n scrollable\n ? \"shrink-0 border-b border-border px-density-3 py-density-2 @min-[48rem]/session-viewer:px-density-4\"\n : \"mb-density-3\",\n )}\n >\n {showHeader && (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {summary.model && (\n <span className=\"inline-flex items-center gap-1 font-medium text-foreground\">\n <Icon icon={UiRobotAi} className=\"size-3.5\" />\n {summary.model}\n </span>\n )}\n <span>{summary.toolCount} actions</span>\n <span>{summary.messageCount} messages</span>\n {metadata && (\n <SessionMetadataBadges\n metadata={metadata}\n showContextMeter={showContextMeter}\n />\n )}\n </div>\n )}\n {(headerActions || inlineMenu) && (\n <div\n role=\"group\"\n aria-label=\"Session viewer actions\"\n className=\"ml-auto flex min-w-0 shrink-0 items-center gap-density-2\"\n >\n {headerActions}\n {inlineMenu && menu}\n </div>\n )}\n </div>\n )}\n\n {scrollable ? (\n <div ref={scrollRef} className=\"min-h-0 flex-1 overflow-y-auto\">\n <div\n ref={contentRef}\n data-session-viewer-content\n className=\"p-density-3 @min-[48rem]/session-viewer:p-density-4\"\n >\n {list}\n </div>\n </div>\n ) : (\n list\n )}\n </DensityValueProvider>\n </div>\n );\n}\n\nfunction mergePendingTools(\n events: SessionEvent[],\n pendingTools: readonly SessionPendingTool[],\n): SessionEvent[] {\n const merged = [...events];\n for (const [index, pending] of pendingTools.entries()) {\n const matches = merged.filter(\n (event) =>\n event.kind === \"tool\" &&\n ((pending.toolCallId && event.toolCallId === pending.toolCallId) ||\n (pending.approvalId && event.approvalId === pending.approvalId) ||\n (pending.sessionId &&\n event.sessionId === pending.sessionId &&\n event.tool === pending.tool)),\n );\n const match = matches.length === 1 ? matches[0] : undefined;\n if (match) {\n Object.assign(match, {\n pending: true,\n toolInput: pending.input ?? match.toolInput,\n toolCallId: pending.toolCallId ?? match.toolCallId,\n approvalId: pending.approvalId ?? match.approvalId,\n sessionId: pending.sessionId ?? match.sessionId,\n });\n } else {\n merged.push({\n id: `pending-${\n pending.approvalId ?? pending.toolCallId ?? `${pending.tool}-${index}`\n }`,\n kind: \"tool\",\n tool: pending.tool,\n ...(pending.input ? { toolInput: pending.input } : {}),\n ...(pending.toolCallId ? { toolCallId: pending.toolCallId } : {}),\n ...(pending.approvalId ? { approvalId: pending.approvalId } : {}),\n ...(pending.sessionId ? { sessionId: pending.sessionId } : {}),\n pending: true,\n });\n }\n }\n return merged;\n}\n"],"names":["useMemo","normalizeSession","collapseWaitRuns","getSessionMetadata","useDensityValue","useState","collectSessionFilters","isEventVisible","isSessionEventGroup","useSessionScroll","jsx","cn","summarizeSession","SessionViewerMenu","WaitGroupRow","SessionRow","jsxs","DensityValueProvider","createPortal","Icon","UiRobotAi","SessionMetadataBadges"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionViewer.cjs","sources":["../../../src/data/ai/SessionViewer.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { useDensityValue, type Density } from \"../../hooks/use-density\";\nimport { DensityValueProvider } from \"../../hooks/density-provider\";\nimport { UiArrowDown, UiRobotAi } from \"../../icons\";\nimport {\n getSessionMetadata,\n normalizeSession,\n summarizeSession,\n type SessionEvent,\n type SessionInput,\n} from \"./SessionViewer.model\";\nimport {\n collapseWaitRuns,\n isSessionEventGroup,\n} from \"./SessionViewer.grouping\";\nimport { SessionRow, WaitGroupRow } from \"./SessionViewer.rows\";\nimport { SessionMetadataBadges } from \"./SessionViewer.header\";\nimport {\n collectSessionFilters,\n isEncryptedReasoning,\n isEventVisible,\n type SessionCategory,\n} from \"./session-categories\";\nimport {\n SessionViewerMenu,\n type SessionThemeOverride,\n} from \"./SessionViewerMenu\";\nimport { useSessionScroll } from \"./use-session-scroll\";\nimport type {\n ApprovalDecisionFields,\n ApprovalKind,\n ApprovalRequest,\n} from \"./approval-request\";\n\nexport type {\n SessionEntry,\n SessionEvent,\n SessionInput,\n SessionActionMeta,\n} from \"./SessionViewer.model\";\nexport type { SessionThemeOverride } from \"./SessionViewerMenu\";\n\nexport interface SessionPendingTool {\n tool: string;\n input?: Record<string, unknown>;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n /** What kind of approval this is. Absent means an untyped tool approval, which\n * renders as Allow / Reject. */\n kind?: ApprovalKind;\n /** The typed approval request; drives the per-kind controls. */\n request?: ApprovalRequest;\n}\n\n/** A decision on one pending tool. `allow`/`message`/`answers` are the original\n * fields; `interrupt`, `scope`, `grants` and `content` are set only for a typed\n * request that offers them. */\nexport interface SessionToolDecision extends ApprovalDecisionFields {\n event: SessionEvent;\n allow: boolean;\n message?: string;\n}\n\nexport interface SessionViewerProps {\n /** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */\n session: SessionInput;\n className?: string;\n /** Expand each tool call's input/output by default. Defaults to false. */\n defaultExpanded?: boolean;\n /** Render assistant reasoning (\"thinking\") blocks. Defaults to true. */\n showThinking?: boolean;\n /** Show the summary header (model + action counts). Defaults to true. */\n showHeader?: boolean;\n /** Show context usage in the summary header. Defaults to true. */\n showContextMeter?: boolean;\n /** Show the 3-dot menu (density + category/tool/source filters). Defaults to true. */\n showMenu?: boolean;\n /** Controls rendered beside the 3-dot menu in the summary header. */\n headerActions?: ReactNode;\n /** Host controls rendered at the top of the 3-dot menu. */\n menuHeader?: ReactNode;\n /** Portal the 3-dot menu into this element instead of rendering it inline in\n * the summary header — lets a host place the menu in its own toolbar while the\n * filter/density state stays owned by the viewer. Ignored when `showMenu` is\n * false; falls back to inline rendering when null/undefined. */\n menuContainer?: Element | null;\n /** Initial density override; undefined inherits the page/document density. */\n defaultDensity?: Density;\n /** Initial theme override; undefined inherits the page/document `data-theme`. */\n defaultTheme?: SessionThemeOverride;\n /** Own an internal scroll container that fills its parent's height: render only\n * the newest screenful, stay pinned to the bottom (most recent activity), and\n * backfill older rows as the reader scrolls up. Off by default, so inline\n * consumers keep rendering the whole log in normal page flow. Requires a\n * height-bounded parent. */\n scrollable?: boolean;\n /** Rows rendered on first paint in `scrollable` mode. Defaults to 60. */\n windowSize?: number;\n /** Rows added each time older content loads in `scrollable` mode. Defaults to 40. */\n batchSize?: number;\n /** Stable identity used to reset the transcript window when switching sessions. */\n scrollResetKey?: string;\n /** Show per-row timestamp/source/model/turn/agent metadata. Defaults to false. */\n showRowMetadata?: boolean;\n /** Show a per-row raw JSON payload expander when available. Defaults to false. */\n showRaw?: boolean;\n /** Render content before each assistant message body. */\n renderMessageBadge?: (event: SessionEvent) => ReactNode;\n pendingTools?: readonly SessionPendingTool[];\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}\n\nfunction toggleInSet<T>(set: ReadonlySet<T>, value: T): Set<T> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\n/**\n * SessionViewer renders a recorded AI coding-agent session (the captain\n * `pkg/ai/history` JSON schema — Claude Code / Codex transcripts) as a vertical\n * action log. Each entry sits on a tone-colored icon disc from the Flanksource\n * \"Agent Action Icons\" set; user prompts/selections are right-aligned like a\n * chat. Shell commands render inline as bash blocks and file ops as their\n * cwd-relative path — the icon carries the verb. Tool responses expand behind\n * a chevron, rendered bare (no panel chrome). The \"3-dot\" menu mirrors\n * `captain history` filtering — toggle density and hide categories, tools or\n * sources.\n */\nexport function SessionViewer({\n session,\n className,\n defaultExpanded = false,\n showThinking = true,\n showHeader = true,\n showContextMeter = true,\n showMenu = true,\n headerActions,\n menuHeader,\n menuContainer,\n defaultDensity,\n defaultTheme,\n scrollable = false,\n windowSize = 60,\n batchSize = 40,\n scrollResetKey,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n pendingTools = [],\n onPendingToolDecision,\n}: SessionViewerProps) {\n const allEvents = useMemo(\n () => mergePendingTools(normalizeSession(session), pendingTools),\n [session, pendingTools],\n );\n const displayItems = useMemo(() => collapseWaitRuns(allEvents), [allEvents]);\n const metadata = useMemo(() => getSessionMetadata(session), [session]);\n\n const pageDensity = useDensityValue();\n const [densityOverride, setDensityOverride] = useState<Density | undefined>(\n defaultDensity,\n );\n const [themeOverride, setThemeOverride] = useState<\n SessionThemeOverride | undefined\n >(defaultTheme);\n const [hiddenCategories, setHiddenCategories] = useState<\n ReadonlySet<SessionCategory>\n >(() => new Set());\n const [hiddenTools, setHiddenTools] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const [hiddenSources, setHiddenSources] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n // Undefined = follow the `showThinking` prop; the menu toggle sets an override.\n const [showThinkingOverride, setShowThinkingOverride] = useState<\n boolean | undefined\n >(undefined);\n const effectiveShowThinking = showThinkingOverride ?? showThinking;\n const [showEncryptedReasoning, setShowEncryptedReasoning] = useState(false);\n\n const filters = useMemo(() => collectSessionFilters(allEvents), [allEvents]);\n const hasThinking = useMemo(\n () => allEvents.some((e) => e.kind === \"thinking\"),\n [allEvents],\n );\n const hasEncryptedReasoning = useMemo(\n () => allEvents.some(isEncryptedReasoning),\n [allEvents],\n );\n\n const visibility = {\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n showThinking: effectiveShowThinking,\n };\n const items = displayItems.filter((item) => {\n const event = isSessionEventGroup(item) ? item.representative : item;\n return (showEncryptedReasoning || !isEncryptedReasoning(event)) && isEventVisible(event, visibility);\n });\n const firstUserEventId = allEvents.find((event) => event.kind === \"user\")?.id;\n\n // Reset the window when the underlying session changes, not on filter toggles —\n // so hiding a category doesn't yank the reader back to the bottom.\n const resetKey = scrollResetKey ?? allEvents[0]?.id ?? \"\";\n const { scrollRef, contentRef, startIndex, following, resumeFollowing } = useSessionScroll({\n total: items.length,\n enabled: scrollable,\n windowSize,\n batchSize,\n resetKey,\n });\n\n if (allEvents.length === 0) {\n return (\n <div\n className={cn(\n \"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No session activity.\n </div>\n );\n }\n\n const summary = summarizeSession(allEvents);\n const effectiveDensity = densityOverride ?? pageDensity;\n const dataAttrs: Record<string, string> = {\n ...(densityOverride ? { \"data-density\": densityOverride } : {}),\n ...(themeOverride ? { \"data-theme\": themeOverride } : {}),\n };\n\n const menu = showMenu ? (\n <SessionViewerMenu\n menuHeader={menuHeader}\n density={densityOverride}\n onDensityChange={setDensityOverride}\n theme={themeOverride}\n onThemeChange={setThemeOverride}\n filters={filters}\n hiddenCategories={hiddenCategories}\n hiddenTools={hiddenTools}\n hiddenSources={hiddenSources}\n onToggleCategory={(category) =>\n setHiddenCategories((set) => toggleInSet(set, category))\n }\n onToggleTool={(tool) => setHiddenTools((set) => toggleInSet(set, tool))}\n onToggleSource={(source) =>\n setHiddenSources((set) => toggleInSet(set, source))\n }\n showThinking={effectiveShowThinking}\n onToggleThinking={() => setShowThinkingOverride(!effectiveShowThinking)}\n hasThinking={hasThinking}\n hasEncryptedReasoning={hasEncryptedReasoning}\n showEncryptedReasoning={showEncryptedReasoning}\n onToggleEncryptedReasoning={() => setShowEncryptedReasoning((shown) => !shown)}\n />\n ) : null;\n // When a host supplies `menuContainer`, the menu is portaled into it (e.g. the\n // host's own toolbar) and the inline header collapses to just its summary.\n const inlineMenu = menu && !menuContainer;\n\n const list =\n items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\">\n All actions are hidden by the active filters.\n </div>\n ) : (\n // In scrollable mode only the newest `startIndex..` slice is mounted; `last`\n // is measured against the full length so the timeline connector stays right.\n <ol className=\"relative\">\n {items.slice(startIndex).map((item, index) => {\n const last = startIndex + index === items.length - 1;\n return isSessionEventGroup(item) ? (\n <WaitGroupRow\n key={item.id}\n group={item}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ) : (\n <SessionRow\n key={item.id}\n event={item}\n initialPrompt={item.id === firstUserEventId}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n })}\n </ol>\n );\n\n return (\n <div\n className={cn(\n \"@container/session-viewer min-w-0 bg-background text-sm text-foreground data-[theme=dark]:bg-[var(--fs-bg-subtle)] [[data-theme=dark]_&]:bg-[var(--fs-bg-subtle)]\",\n scrollable && \"flex h-full min-h-0 flex-col\",\n className,\n )}\n {...dataAttrs}\n >\n <DensityValueProvider density={effectiveDensity}>\n {menu && menuContainer && createPortal(menu, menuContainer)}\n {(showHeader || headerActions || inlineMenu) && (\n <div\n data-session-viewer-header\n className={cn(\n \"flex min-w-0 flex-wrap items-center justify-between gap-x-density-3 gap-y-density-2\",\n scrollable\n ? \"shrink-0 border-b border-border px-density-3 py-density-2 @min-[48rem]/session-viewer:px-density-4\"\n : \"mb-density-3\",\n )}\n >\n {showHeader && (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {summary.model && (\n <span className=\"inline-flex items-center gap-1 font-medium text-foreground\">\n <Icon icon={UiRobotAi} className=\"size-3.5\" />\n {summary.model}\n </span>\n )}\n <span>{summary.toolCount} actions</span>\n <span>{summary.messageCount} messages</span>\n {metadata && (\n <SessionMetadataBadges\n metadata={metadata}\n showContextMeter={showContextMeter}\n />\n )}\n </div>\n )}\n {(headerActions || inlineMenu) && (\n <div\n role=\"group\"\n aria-label=\"Session viewer actions\"\n className=\"ml-auto flex min-w-0 shrink-0 items-center gap-density-2\"\n >\n {headerActions}\n {inlineMenu && menu}\n </div>\n )}\n </div>\n )}\n\n {scrollable ? (\n <div className=\"relative min-h-0 flex-1\">\n <div ref={scrollRef} className=\"h-full overflow-y-auto\">\n <div\n ref={contentRef}\n data-session-viewer-content\n className=\"p-density-3 @min-[48rem]/session-viewer:p-density-4\"\n >\n {list}\n </div>\n </div>\n {!following && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={resumeFollowing}\n className=\"absolute bottom-density-3 left-1/2 -translate-x-1/2 shadow-md\"\n >\n <Icon icon={UiArrowDown} className=\"size-4\" />\n Scroll to bottom\n </Button>\n )}\n </div>\n ) : (\n list\n )}\n </DensityValueProvider>\n </div>\n );\n}\n\nfunction mergePendingTools(\n events: SessionEvent[],\n pendingTools: readonly SessionPendingTool[],\n): SessionEvent[] {\n const merged = [...events];\n for (const [index, pending] of pendingTools.entries()) {\n const matches = merged.filter(\n (event) =>\n event.kind === \"tool\" &&\n ((pending.toolCallId && event.toolCallId === pending.toolCallId) ||\n (pending.approvalId && event.approvalId === pending.approvalId) ||\n (pending.sessionId &&\n event.sessionId === pending.sessionId &&\n event.tool === pending.tool)),\n );\n const match = matches.length === 1 ? matches[0] : undefined;\n if (match) {\n Object.assign(match, {\n pending: true,\n toolInput: pending.input ?? match.toolInput,\n toolCallId: pending.toolCallId ?? match.toolCallId,\n approvalId: pending.approvalId ?? match.approvalId,\n sessionId: pending.sessionId ?? match.sessionId,\n ...approvalFields(pending),\n });\n } else {\n merged.push({\n id: `pending-${\n pending.approvalId ?? pending.toolCallId ?? `${pending.tool}-${index}`\n }`,\n kind: \"tool\",\n tool: pending.tool,\n ...(pending.input ? { toolInput: pending.input } : {}),\n ...(pending.toolCallId ? { toolCallId: pending.toolCallId } : {}),\n ...(pending.approvalId ? { approvalId: pending.approvalId } : {}),\n ...(pending.sessionId ? { sessionId: pending.sessionId } : {}),\n ...approvalFields(pending),\n pending: true,\n });\n }\n }\n return merged;\n}\n\nfunction approvalFields(\n pending: SessionPendingTool,\n): Pick<SessionEvent, \"approvalKind\" | \"approvalRequest\"> {\n const kind = pending.kind ?? pending.request?.kind;\n return {\n ...(kind ? { approvalKind: kind } : {}),\n ...(pending.request ? { approvalRequest: pending.request } : {}),\n };\n}\n"],"names":["useMemo","normalizeSession","collapseWaitRuns","getSessionMetadata","useDensityValue","useState","collectSessionFilters","isEncryptedReasoning","isSessionEventGroup","isEventVisible","useSessionScroll","jsx","cn","summarizeSession","SessionViewerMenu","WaitGroupRow","SessionRow","jsxs","DensityValueProvider","createPortal","Icon","UiRobotAi","SessionMetadataBadges","Button","UiArrowDown"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { Density } from '../../hooks/use-density.js';
|
|
3
3
|
import { SessionEvent, SessionInput } from './SessionViewer.model.js';
|
|
4
4
|
import { SessionThemeOverride } from './SessionViewerMenu.js';
|
|
5
|
+
import { ApprovalDecisionFields, ApprovalKind, ApprovalRequest } from './approval-request.js';
|
|
5
6
|
export type { SessionEntry, SessionEvent, SessionInput, SessionActionMeta, } from './SessionViewer.model.js';
|
|
6
7
|
export type { SessionThemeOverride } from './SessionViewerMenu.js';
|
|
7
8
|
export interface SessionPendingTool {
|
|
@@ -10,12 +11,19 @@ export interface SessionPendingTool {
|
|
|
10
11
|
toolCallId?: string;
|
|
11
12
|
approvalId?: string;
|
|
12
13
|
sessionId?: string;
|
|
14
|
+
/** What kind of approval this is. Absent means an untyped tool approval, which
|
|
15
|
+
* renders as Allow / Reject. */
|
|
16
|
+
kind?: ApprovalKind;
|
|
17
|
+
/** The typed approval request; drives the per-kind controls. */
|
|
18
|
+
request?: ApprovalRequest;
|
|
13
19
|
}
|
|
14
|
-
|
|
20
|
+
/** A decision on one pending tool. `allow`/`message`/`answers` are the original
|
|
21
|
+
* fields; `interrupt`, `scope`, `grants` and `content` are set only for a typed
|
|
22
|
+
* request that offers them. */
|
|
23
|
+
export interface SessionToolDecision extends ApprovalDecisionFields {
|
|
15
24
|
event: SessionEvent;
|
|
16
25
|
allow: boolean;
|
|
17
26
|
message?: string;
|
|
18
|
-
answers?: Record<string, string | string[]>;
|
|
19
27
|
}
|
|
20
28
|
export interface SessionViewerProps {
|
|
21
29
|
/** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */
|
|
@@ -54,6 +62,8 @@ export interface SessionViewerProps {
|
|
|
54
62
|
windowSize?: number;
|
|
55
63
|
/** Rows added each time older content loads in `scrollable` mode. Defaults to 40. */
|
|
56
64
|
batchSize?: number;
|
|
65
|
+
/** Stable identity used to reset the transcript window when switching sessions. */
|
|
66
|
+
scrollResetKey?: string;
|
|
57
67
|
/** Show per-row timestamp/source/model/turn/agent metadata. Defaults to false. */
|
|
58
68
|
showRowMetadata?: boolean;
|
|
59
69
|
/** Show a per-row raw JSON payload expander when available. Defaults to false. */
|
|
@@ -74,5 +84,5 @@ export interface SessionViewerProps {
|
|
|
74
84
|
* `captain history` filtering — toggle density and hide categories, tools or
|
|
75
85
|
* sources.
|
|
76
86
|
*/
|
|
77
|
-
export declare function SessionViewer({ session, className, defaultExpanded, showThinking, showHeader, showContextMeter, showMenu, headerActions, menuHeader, menuContainer, defaultDensity, defaultTheme, scrollable, windowSize, batchSize, showRowMetadata, showRaw, renderMessageBadge, pendingTools, onPendingToolDecision, }: SessionViewerProps): import("react").JSX.Element;
|
|
87
|
+
export declare function SessionViewer({ session, className, defaultExpanded, showThinking, showHeader, showContextMeter, showMenu, headerActions, menuHeader, menuContainer, defaultDensity, defaultTheme, scrollable, windowSize, batchSize, scrollResetKey, showRowMetadata, showRaw, renderMessageBadge, pendingTools, onPendingToolDecision, }: SessionViewerProps): import("react").JSX.Element;
|
|
78
88
|
//# sourceMappingURL=SessionViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionViewer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionViewer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,313 @@
|
|
|
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 Icon = require("../Icon.cjs");
|
|
7
|
+
const approvalRequest = require("./approval-request.cjs");
|
|
8
|
+
const SessionViewer_decision = require("./SessionViewer.decision.cjs");
|
|
9
|
+
const UiCheck = require("../../icons/components/UiCheck.cjs");
|
|
10
|
+
const UiCancel = require("../../icons/components/UiCancel.cjs");
|
|
11
|
+
const UiComment = require("../../icons/components/UiComment.cjs");
|
|
12
|
+
const UiStop = require("../../icons/components/UiStop.cjs");
|
|
13
|
+
function DecisionError({ message }) {
|
|
14
|
+
if (!message) return null;
|
|
15
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "text-xs text-rose-600", children: message });
|
|
16
|
+
}
|
|
17
|
+
const SCOPE_LABELS = {
|
|
18
|
+
request: "This request",
|
|
19
|
+
turn: "This turn",
|
|
20
|
+
session: "This session"
|
|
21
|
+
};
|
|
22
|
+
function DecisionActions({
|
|
23
|
+
request,
|
|
24
|
+
busy,
|
|
25
|
+
comment,
|
|
26
|
+
allowLabel = "Allow",
|
|
27
|
+
allowDisabled = false,
|
|
28
|
+
allowFields,
|
|
29
|
+
denyLabel = "Reject",
|
|
30
|
+
commentLabel = "Reject with comment",
|
|
31
|
+
decide
|
|
32
|
+
}) {
|
|
33
|
+
const scopes = approvalRequest.offeredScopes(request);
|
|
34
|
+
const [scope, setScope] = react.useState("request");
|
|
35
|
+
const message = comment == null ? void 0 : comment.trim();
|
|
36
|
+
const withMessage = (fields) => ({
|
|
37
|
+
...fields,
|
|
38
|
+
...message ? { message } : {}
|
|
39
|
+
});
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
42
|
+
button.Button,
|
|
43
|
+
{
|
|
44
|
+
size: "sm",
|
|
45
|
+
loading: busy,
|
|
46
|
+
disabled: allowDisabled,
|
|
47
|
+
onClick: () => decide({
|
|
48
|
+
allow: true,
|
|
49
|
+
...scope !== "request" ? { scope } : {},
|
|
50
|
+
...allowFields == null ? void 0 : allowFields()
|
|
51
|
+
}),
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck }),
|
|
54
|
+
allowLabel
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
59
|
+
button.Button,
|
|
60
|
+
{
|
|
61
|
+
size: "sm",
|
|
62
|
+
variant: "outline",
|
|
63
|
+
disabled: busy,
|
|
64
|
+
onClick: () => decide({ allow: false }),
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCancel.UiCancel }),
|
|
67
|
+
denyLabel
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
comment !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
72
|
+
button.Button,
|
|
73
|
+
{
|
|
74
|
+
size: "sm",
|
|
75
|
+
variant: "outline",
|
|
76
|
+
disabled: busy || !message,
|
|
77
|
+
onClick: () => decide(withMessage({ allow: false })),
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiComment.UiComment }),
|
|
80
|
+
commentLabel
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
(request == null ? void 0 : request.interruptible) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
85
|
+
button.Button,
|
|
86
|
+
{
|
|
87
|
+
size: "sm",
|
|
88
|
+
variant: "outline",
|
|
89
|
+
disabled: busy,
|
|
90
|
+
onClick: () => decide(withMessage({ allow: false, interrupt: true })),
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiStop.UiStop }),
|
|
93
|
+
"Cancel"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
scopes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
98
|
+
"select",
|
|
99
|
+
{
|
|
100
|
+
"aria-label": "Approval scope",
|
|
101
|
+
value: scope,
|
|
102
|
+
disabled: busy,
|
|
103
|
+
onChange: (event) => setScope(event.target.value),
|
|
104
|
+
className: "h-8 rounded-md border border-input bg-background px-2 text-xs",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "request", children: SCOPE_LABELS.request }),
|
|
107
|
+
scopes.map((value) => /* @__PURE__ */ jsxRuntime.jsx("option", { value, children: SCOPE_LABELS[value] }, value))
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
function PendingDecisionControls({
|
|
114
|
+
event,
|
|
115
|
+
request,
|
|
116
|
+
onDecision
|
|
117
|
+
}) {
|
|
118
|
+
const [comment, setComment] = react.useState("");
|
|
119
|
+
const { busy, error, decide } = SessionViewer_decision.useDecision(event, onDecision);
|
|
120
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-density-3", children: [
|
|
121
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
122
|
+
"textarea",
|
|
123
|
+
{
|
|
124
|
+
"aria-label": "Decision comment",
|
|
125
|
+
value: comment,
|
|
126
|
+
onChange: (event2) => setComment(event2.target.value),
|
|
127
|
+
placeholder: "Optional rejection feedback",
|
|
128
|
+
className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
132
|
+
DecisionActions,
|
|
133
|
+
{
|
|
134
|
+
request,
|
|
135
|
+
busy,
|
|
136
|
+
comment,
|
|
137
|
+
decide
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
/* @__PURE__ */ jsxRuntime.jsx(DecisionError, { message: error })
|
|
141
|
+
] });
|
|
142
|
+
}
|
|
143
|
+
function PlanDecisionControls({
|
|
144
|
+
event,
|
|
145
|
+
request,
|
|
146
|
+
onDecision
|
|
147
|
+
}) {
|
|
148
|
+
const [feedback, setFeedback] = react.useState("");
|
|
149
|
+
const { busy, error, decide } = SessionViewer_decision.useDecision(event, onDecision);
|
|
150
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-2 rounded-md border border-sky-500/25 bg-sky-500/5 p-density-3", children: [
|
|
151
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
152
|
+
"textarea",
|
|
153
|
+
{
|
|
154
|
+
"aria-label": "Plan feedback",
|
|
155
|
+
value: feedback,
|
|
156
|
+
onChange: (event2) => setFeedback(event2.target.value),
|
|
157
|
+
placeholder: "What should change before this plan is implemented?",
|
|
158
|
+
className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
|
|
159
|
+
}
|
|
160
|
+
),
|
|
161
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
162
|
+
DecisionActions,
|
|
163
|
+
{
|
|
164
|
+
request,
|
|
165
|
+
busy,
|
|
166
|
+
comment: feedback,
|
|
167
|
+
allowLabel: "Approve plan",
|
|
168
|
+
denyLabel: "Keep planning",
|
|
169
|
+
commentLabel: "Send feedback",
|
|
170
|
+
decide
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsx(DecisionError, { message: error })
|
|
174
|
+
] });
|
|
175
|
+
}
|
|
176
|
+
function QuestionDecisionControls({
|
|
177
|
+
event,
|
|
178
|
+
request,
|
|
179
|
+
questions,
|
|
180
|
+
onDecision
|
|
181
|
+
}) {
|
|
182
|
+
const [answers, setAnswers] = react.useState({});
|
|
183
|
+
const [details, setDetails] = react.useState({});
|
|
184
|
+
const [comment, setComment] = react.useState("");
|
|
185
|
+
const { busy, error, decide } = SessionViewer_decision.useDecision(event, onDecision);
|
|
186
|
+
const answerFor = (question) => {
|
|
187
|
+
var _a;
|
|
188
|
+
const selected = answers[question.id];
|
|
189
|
+
const other = (_a = details[question.id]) == null ? void 0 : _a.trim();
|
|
190
|
+
if (question.options.length && question.isOther && other) {
|
|
191
|
+
return question.multiSelect ? [...Array.isArray(selected) ? selected : [], other] : other;
|
|
192
|
+
}
|
|
193
|
+
return selected ?? "";
|
|
194
|
+
};
|
|
195
|
+
const canSend = questions.length > 0 && questions.every((question) => {
|
|
196
|
+
const answer = answerFor(question);
|
|
197
|
+
return Array.isArray(answer) ? answer.length > 0 && answer.every((value) => value.trim() !== "") : answer.trim() !== "";
|
|
198
|
+
});
|
|
199
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 rounded-md border border-sky-500/25 bg-sky-500/5 p-density-3", children: [
|
|
200
|
+
questions.map((question) => /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "space-y-1.5", children: [
|
|
201
|
+
/* @__PURE__ */ jsxRuntime.jsx("legend", { className: "text-sm font-medium text-foreground", children: question.text }),
|
|
202
|
+
question.options.map(
|
|
203
|
+
(option) => {
|
|
204
|
+
var _a;
|
|
205
|
+
return question.multiSelect ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
206
|
+
"label",
|
|
207
|
+
{
|
|
208
|
+
className: "flex items-start gap-2 text-sm",
|
|
209
|
+
children: [
|
|
210
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
211
|
+
"input",
|
|
212
|
+
{
|
|
213
|
+
type: "checkbox",
|
|
214
|
+
checked: Array.isArray(answers[question.id]) && answers[question.id].includes(option.value),
|
|
215
|
+
onChange: (event2) => setAnswers((current) => {
|
|
216
|
+
const selected = Array.isArray(current[question.id]) ? current[question.id] : [];
|
|
217
|
+
return {
|
|
218
|
+
...current,
|
|
219
|
+
[question.id]: event2.target.checked ? [...selected, option.value] : selected.filter((value) => value !== option.value)
|
|
220
|
+
};
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
225
|
+
option.label,
|
|
226
|
+
option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-muted-foreground", children: option.description })
|
|
227
|
+
] })
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
option.value
|
|
231
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
232
|
+
"label",
|
|
233
|
+
{
|
|
234
|
+
className: "flex items-start gap-2 text-sm",
|
|
235
|
+
children: [
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
237
|
+
"input",
|
|
238
|
+
{
|
|
239
|
+
type: "radio",
|
|
240
|
+
name: `question-${event.id}-${question.id}`,
|
|
241
|
+
value: option.value,
|
|
242
|
+
checked: answers[question.id] === option.value && !((_a = details[question.id]) == null ? void 0 : _a.trim()),
|
|
243
|
+
onChange: () => {
|
|
244
|
+
setDetails((current) => ({ ...current, [question.id]: "" }));
|
|
245
|
+
setAnswers((current) => ({
|
|
246
|
+
...current,
|
|
247
|
+
[question.id]: option.value
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
253
|
+
option.label,
|
|
254
|
+
option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-muted-foreground", children: option.description })
|
|
255
|
+
] })
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
option.value
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
),
|
|
262
|
+
(!question.options.length || question.isOther) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
"textarea",
|
|
264
|
+
{
|
|
265
|
+
"aria-label": `${question.text} ${question.options.length ? "other answer" : "answer"}`,
|
|
266
|
+
value: question.options.length ? details[question.id] ?? "" : typeof answers[question.id] === "string" ? answers[question.id] : "",
|
|
267
|
+
onChange: (event2) => question.options.length ? setDetails((current) => ({
|
|
268
|
+
...current,
|
|
269
|
+
[question.id]: event2.target.value
|
|
270
|
+
})) : setAnswers((current) => ({
|
|
271
|
+
...current,
|
|
272
|
+
[question.id]: event2.target.value
|
|
273
|
+
})),
|
|
274
|
+
placeholder: question.options.length ? "Other answer" : "Your answer",
|
|
275
|
+
className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
] }, question.id)),
|
|
279
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
280
|
+
"textarea",
|
|
281
|
+
{
|
|
282
|
+
"aria-label": "Rejection comment",
|
|
283
|
+
value: comment,
|
|
284
|
+
onChange: (event2) => setComment(event2.target.value),
|
|
285
|
+
placeholder: "Optional rejection feedback",
|
|
286
|
+
className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
|
|
287
|
+
}
|
|
288
|
+
),
|
|
289
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
290
|
+
DecisionActions,
|
|
291
|
+
{
|
|
292
|
+
request,
|
|
293
|
+
busy,
|
|
294
|
+
comment,
|
|
295
|
+
allowLabel: "Send answer",
|
|
296
|
+
allowDisabled: !canSend,
|
|
297
|
+
allowFields: () => ({
|
|
298
|
+
answers: Object.fromEntries(
|
|
299
|
+
questions.map((question) => [question.id, answerFor(question)])
|
|
300
|
+
)
|
|
301
|
+
}),
|
|
302
|
+
decide
|
|
303
|
+
}
|
|
304
|
+
),
|
|
305
|
+
/* @__PURE__ */ jsxRuntime.jsx(DecisionError, { message: error })
|
|
306
|
+
] });
|
|
307
|
+
}
|
|
308
|
+
exports.DecisionActions = DecisionActions;
|
|
309
|
+
exports.DecisionError = DecisionError;
|
|
310
|
+
exports.PendingDecisionControls = PendingDecisionControls;
|
|
311
|
+
exports.PlanDecisionControls = PlanDecisionControls;
|
|
312
|
+
exports.QuestionDecisionControls = QuestionDecisionControls;
|
|
313
|
+
//# sourceMappingURL=SessionViewer.decision-controls.cjs.map
|