@flanksource/clicky-ui 0.3.46 → 0.3.48
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/NOTICE.md +11 -0
- package/README.md +49 -0
- package/dist/ai.cjs +13 -8
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +7 -2
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +10 -4
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +2 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +10 -4
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +2 -0
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +2 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +2 -0
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +3 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +3 -1
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +3 -0
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +2 -3
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +3 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/Clicky.cjs +3 -0
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +3 -0
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeLine.cjs +4 -2
- package/dist/data/CodeLine.cjs.map +1 -1
- package/dist/data/CodeLine.d.ts.map +1 -1
- package/dist/data/CodeLine.js +4 -2
- package/dist/data/CodeLine.js.map +1 -1
- package/dist/data/FilterPill.cjs +15 -2
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +15 -2
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/LogViewer.cjs +27 -8
- package/dist/data/LogViewer.cjs.map +1 -1
- package/dist/data/LogViewer.d.ts +11 -3
- package/dist/data/LogViewer.d.ts.map +1 -1
- package/dist/data/LogViewer.js +27 -8
- package/dist/data/LogViewer.js.map +1 -1
- package/dist/data/Properties.cjs +2 -15
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +4 -0
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +2 -15
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/PropertyValue.cjs +37 -0
- package/dist/data/PropertyValue.cjs.map +1 -0
- package/dist/data/PropertyValue.d.ts +6 -0
- package/dist/data/PropertyValue.d.ts.map +1 -0
- package/dist/data/PropertyValue.js +37 -0
- package/dist/data/PropertyValue.js.map +1 -0
- package/dist/data/SymbolBadge.cjs +61 -0
- package/dist/data/SymbolBadge.cjs.map +1 -0
- package/dist/data/SymbolBadge.d.ts +21 -0
- package/dist/data/SymbolBadge.d.ts.map +1 -0
- package/dist/data/SymbolBadge.js +61 -0
- package/dist/data/SymbolBadge.js.map +1 -0
- package/dist/data/Tree.cjs +4 -3
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +4 -3
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +1 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.js +1 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +106 -171
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +6 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.header.cjs +104 -0
- package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.header.d.ts +29 -0
- package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.header.js +104 -0
- package/dist/data/ai/ChatWindow.header.js.map +1 -0
- package/dist/data/ai/ChatWindow.js +107 -172
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +95 -0
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.placement.js +95 -0
- package/dist/data/ai/ChatWindow.placement.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +3 -1
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +4 -1
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
- package/dist/data/ai/SessionChatComposer.js +3 -1
- package/dist/data/ai/SessionChatComposer.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +68 -72
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +6 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +69 -73
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.js +41 -42
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.js +14 -9
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote.cjs +84 -16
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote.js +86 -18
- package/dist/data/ai/SessionInspector.remote.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +5 -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 +5 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionTail.cjs +63 -0
- package/dist/data/ai/SessionTail.cjs.map +1 -0
- package/dist/data/ai/SessionTail.d.ts +14 -0
- package/dist/data/ai/SessionTail.d.ts.map +1 -0
- package/dist/data/ai/SessionTail.js +63 -0
- package/dist/data/ai/SessionTail.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +10 -3
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +7 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.js +10 -3
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +4 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +30 -6
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +7 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +30 -6
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.cjs +1 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.js +1 -1
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
- 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 +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +4 -2
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +5 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +4 -2
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +14 -3
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
- package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.js +6 -1
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +3 -1
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +4 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +3 -1
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/test-runner/Expectation.cjs +57 -0
- package/dist/data/test-runner/Expectation.cjs.map +1 -0
- package/dist/data/test-runner/Expectation.d.ts +19 -0
- package/dist/data/test-runner/Expectation.d.ts.map +1 -0
- package/dist/data/test-runner/Expectation.js +57 -0
- package/dist/data/test-runner/Expectation.js.map +1 -0
- package/dist/data/test-runner/MarkIcons.cjs +38 -0
- package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
- package/dist/data/test-runner/MarkIcons.d.ts +15 -0
- package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
- package/dist/data/test-runner/MarkIcons.js +38 -0
- package/dist/data/test-runner/MarkIcons.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +101 -55
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +23 -27
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +87 -93
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +89 -95
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +35 -21
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +35 -21
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +58 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +6 -3
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +58 -30
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +5 -2
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.d.ts +5 -2
- package/dist/data/test-runner/TestTree.d.ts.map +1 -1
- package/dist/data/test-runner/TestTree.js +5 -2
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +28 -19
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +29 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +15 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +27 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +15 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +2 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/copy.cjs +114 -0
- package/dist/data/test-runner/copy.cjs.map +1 -0
- package/dist/data/test-runner/copy.d.ts +47 -0
- package/dist/data/test-runner/copy.d.ts.map +1 -0
- package/dist/data/test-runner/copy.js +114 -0
- package/dist/data/test-runner/copy.js.map +1 -0
- package/dist/data/test-runner/index.d.ts +6 -3
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +184 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +40 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +184 -0
- package/dist/data/test-runner/marks.js.map +1 -0
- package/dist/data/test-runner/status.cjs +27 -44
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +12 -3
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +27 -44
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
- package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
- package/dist/data/traces/TraceHarView.d.ts +13 -0
- package/dist/data/traces/TraceHarView.d.ts.map +1 -0
- package/dist/data/traces/cast.d.ts +9 -0
- package/dist/data/traces/cast.d.ts.map +1 -0
- package/dist/data/traces/fixtures.d.ts +8 -0
- package/dist/data/traces/fixtures.d.ts.map +1 -0
- package/dist/data/traces/har-adapter.d.ts +13 -0
- package/dist/data/traces/har-adapter.d.ts.map +1 -0
- package/dist/data/traces/terminal-screen.d.ts +45 -0
- package/dist/data/traces/terminal-screen.d.ts.map +1 -0
- package/dist/data/traces/terminal-timeline.d.ts +26 -0
- package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
- package/dist/data/traces/types.d.ts +141 -0
- package/dist/data/traces/types.d.ts.map +1 -0
- package/dist/data/verification/VerificationResults.cjs +4 -0
- package/dist/data/verification/VerificationResults.cjs.map +1 -1
- package/dist/data/verification/VerificationResults.d.ts +3 -1
- package/dist/data/verification/VerificationResults.d.ts.map +1 -1
- package/dist/data/verification/VerificationResults.js +4 -0
- package/dist/data/verification/VerificationResults.js.map +1 -1
- package/dist/data/verification/adapterViews.cjs +28 -44
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +4 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +28 -44
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +163 -8
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +163 -8
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/index.d.ts +4 -2
- package/dist/data/verification/index.d.ts.map +1 -1
- package/dist/data/verification/stepKind.cjs +217 -0
- package/dist/data/verification/stepKind.cjs.map +1 -0
- package/dist/data/verification/stepKind.d.ts +87 -0
- package/dist/data/verification/stepKind.d.ts.map +1 -0
- package/dist/data/verification/stepKind.js +217 -0
- package/dist/data/verification/stepKind.js.map +1 -0
- package/dist/data/verification/stepKindViews.cjs +111 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -0
- package/dist/data/verification/stepKindViews.d.ts +18 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -0
- package/dist/data/verification/stepKindViews.js +111 -0
- package/dist/data/verification/stepKindViews.js.map +1 -0
- package/dist/data/verification/verifyReportTests.cjs +1 -0
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- package/dist/data/verification/verifyReportTests.d.ts +2 -1
- package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
- package/dist/data/verification/verifyReportTests.js +1 -0
- package/dist/data/verification/verifyReportTests.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +58 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +60 -5
- package/dist/data.js.map +1 -1
- package/dist/icons/components/UiLogoEslint.cjs +10 -0
- package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
- package/dist/icons/components/UiLogoEslint.d.ts +9 -0
- package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
- package/dist/icons/components/UiLogoEslint.js +10 -0
- package/dist/icons/components/UiLogoEslint.js.map +1 -0
- package/dist/icons/components/UiLogoGo.cjs +10 -0
- package/dist/icons/components/UiLogoGo.cjs.map +1 -0
- package/dist/icons/components/UiLogoGo.d.ts +9 -0
- package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
- package/dist/icons/components/UiLogoGo.js +10 -0
- package/dist/icons/components/UiLogoGo.js.map +1 -0
- package/dist/icons/components/UiLogoJest.cjs +10 -0
- package/dist/icons/components/UiLogoJest.cjs.map +1 -0
- package/dist/icons/components/UiLogoJest.d.ts +9 -0
- package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoJest.js +10 -0
- package/dist/icons/components/UiLogoJest.js.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
- package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.js +10 -0
- package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
- package/dist/icons/components/UiLogoOxc.cjs +10 -0
- package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
- package/dist/icons/components/UiLogoOxc.d.ts +9 -0
- package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
- package/dist/icons/components/UiLogoOxc.js +10 -0
- package/dist/icons/components/UiLogoOxc.js.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
- package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.js +10 -0
- package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
- package/dist/icons/components/UiLogoPython.cjs +10 -0
- package/dist/icons/components/UiLogoPython.cjs.map +1 -0
- package/dist/icons/components/UiLogoPython.d.ts +9 -0
- package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPython.js +10 -0
- package/dist/icons/components/UiLogoPython.js.map +1 -0
- package/dist/icons/components/UiLogoReact.cjs +10 -0
- package/dist/icons/components/UiLogoReact.cjs.map +1 -0
- package/dist/icons/components/UiLogoReact.d.ts +9 -0
- package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
- package/dist/icons/components/UiLogoReact.js +10 -0
- package/dist/icons/components/UiLogoReact.js.map +1 -0
- package/dist/icons/components/UiLogoRuff.cjs +10 -0
- package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
- package/dist/icons/components/UiLogoRuff.d.ts +9 -0
- package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
- package/dist/icons/components/UiLogoRuff.js +10 -0
- package/dist/icons/components/UiLogoRuff.js.map +1 -0
- package/dist/icons/components/UiLogoTypescript.cjs +10 -0
- package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
- package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
- package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
- package/dist/icons/components/UiLogoTypescript.js +10 -0
- package/dist/icons/components/UiLogoTypescript.js.map +1 -0
- package/dist/icons/components/UiLogoVitest.cjs +10 -0
- package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
- package/dist/icons/components/UiLogoVitest.d.ts +9 -0
- package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoVitest.js +10 -0
- package/dist/icons/components/UiLogoVitest.js.map +1 -0
- package/dist/icons/index.d.ts +11 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +22 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +22 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +22 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +22 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +60 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +62 -5
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +4 -4
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +9 -0
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +5 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +9 -0
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/InlineError.cjs +12 -43
- package/dist/rpc/InlineError.cjs.map +1 -1
- package/dist/rpc/InlineError.d.ts.map +1 -1
- package/dist/rpc/InlineError.js +13 -44
- package/dist/rpc/InlineError.js.map +1 -1
- package/dist/rpc/OperationArgsForm.cjs +153 -0
- package/dist/rpc/OperationArgsForm.cjs.map +1 -0
- package/dist/rpc/OperationArgsForm.d.ts +16 -0
- package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
- package/dist/rpc/OperationArgsForm.js +153 -0
- package/dist/rpc/OperationArgsForm.js.map +1 -0
- package/dist/rpc/OperationScheduleDialog.cjs +119 -22
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +120 -23
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +17 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +17 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -7
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts +0 -2
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -7
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +12 -1
- package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/test-runner/frameworkIcon.cjs +0 -27
- package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
- package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
- package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
- package/dist/data/test-runner/frameworkIcon.js +0 -27
- package/dist/data/test-runner/frameworkIcon.js.map +0 -1
|
@@ -1,24 +1,179 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { ChecklistDetail, FixtureDetail } from "./adapterViews.js";
|
|
3
|
+
import { StepOutputs } from "./stepKindViews.js";
|
|
4
|
+
import { verifyNodeTest } from "./verifyReportTests.js";
|
|
5
|
+
import { readStepDetail, hasStepDetail, stepKindCopy } from "./stepKind.js";
|
|
3
6
|
import { createTestRunnerRegistry } from "../test-runner/adapter.js";
|
|
7
|
+
import { UiTerminal } from "../../icons/components/UiTerminal.js";
|
|
8
|
+
import { outcomeFor } from "../test-runner/status.js";
|
|
4
9
|
function isChecklistNode(node) {
|
|
5
10
|
return node.framework === "checklist";
|
|
6
11
|
}
|
|
12
|
+
function checklistMark(item) {
|
|
13
|
+
if (item.failed) return "[ ]";
|
|
14
|
+
if (item.passed) return "[x]";
|
|
15
|
+
return "[?]";
|
|
16
|
+
}
|
|
17
|
+
function checklistCopy(node) {
|
|
18
|
+
const items = node.children && node.children.length > 0 ? node.children : [node];
|
|
19
|
+
const lines = items.map(
|
|
20
|
+
(item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : ""}`
|
|
21
|
+
);
|
|
22
|
+
return { brief: [{ title: "Criteria", body: lines.join("\n") }] };
|
|
23
|
+
}
|
|
7
24
|
const checklistAdapter = {
|
|
8
25
|
id: "verification-checklist",
|
|
9
26
|
match: isChecklistNode,
|
|
10
|
-
renderDetail: ({ node }) => /* @__PURE__ */ jsx(ChecklistDetail, { node })
|
|
27
|
+
renderDetail: ({ node }) => /* @__PURE__ */ jsx(ChecklistDetail, { node }),
|
|
28
|
+
copy: ({ node }) => checklistCopy(node)
|
|
11
29
|
};
|
|
12
30
|
function isFixtureNode(node) {
|
|
13
|
-
return node.context !== void 0;
|
|
31
|
+
return node.context !== void 0 || hasStepDetail(node.detail);
|
|
32
|
+
}
|
|
33
|
+
function readCelTrace(detail) {
|
|
34
|
+
if (detail && typeof detail === "object" && !Array.isArray(detail)) {
|
|
35
|
+
const value = detail.cel_trace;
|
|
36
|
+
if (typeof value === "string" && value.length > 0) return value;
|
|
37
|
+
}
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
function comparisonValue(hasCelGate, value) {
|
|
41
|
+
if (value === void 0) return void 0;
|
|
42
|
+
if (hasCelGate) return value;
|
|
43
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) return void 0;
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function formatValue(value) {
|
|
47
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
48
|
+
}
|
|
49
|
+
function commandSection(node, context) {
|
|
50
|
+
const command = (context == null ? void 0 : context.command) ?? node.command;
|
|
51
|
+
if (!command) return [];
|
|
52
|
+
const cwd = (context == null ? void 0 : context.cwd) ?? node.work_dir;
|
|
53
|
+
const exit = context == null ? void 0 : context.exit_code;
|
|
54
|
+
const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== void 0 && `exit: ${exit}`];
|
|
55
|
+
return [{ title: "Command", lang: "sh", body: lines.filter(Boolean).join("\n") }];
|
|
56
|
+
}
|
|
57
|
+
function assertionSection(node, context) {
|
|
58
|
+
const expression = context == null ? void 0 : context.cel_expression;
|
|
59
|
+
const trace = readCelTrace(node.detail);
|
|
60
|
+
const hasCelGate = !!(expression || trace);
|
|
61
|
+
const vars = (context == null ? void 0 : context.cel_vars) ?? {};
|
|
62
|
+
const expected = comparisonValue(hasCelGate, context == null ? void 0 : context.expected);
|
|
63
|
+
const actual = comparisonValue(hasCelGate, context == null ? void 0 : context.actual);
|
|
64
|
+
const lines = [
|
|
65
|
+
expression && `expression: ${expression}`,
|
|
66
|
+
trace && `trace:
|
|
67
|
+
${trace}`,
|
|
68
|
+
Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,
|
|
69
|
+
expected !== void 0 && `expected: ${formatValue(expected)}`,
|
|
70
|
+
actual !== void 0 && `actual: ${formatValue(actual)}`
|
|
71
|
+
].filter(Boolean);
|
|
72
|
+
return lines.length > 0 ? [{ title: "Assertion", body: lines.join("\n") }] : [];
|
|
73
|
+
}
|
|
74
|
+
const OUTCOME_GLYPH = {
|
|
75
|
+
passed: "✓",
|
|
76
|
+
failed: "✗",
|
|
77
|
+
errored: "✗",
|
|
78
|
+
timedout: "⏱",
|
|
79
|
+
warned: "!",
|
|
80
|
+
skipped: "-",
|
|
81
|
+
pending: "○",
|
|
82
|
+
running: "…"
|
|
83
|
+
};
|
|
84
|
+
function childLine(child) {
|
|
85
|
+
var _a;
|
|
86
|
+
const outcome = outcomeFor(child);
|
|
87
|
+
const exit = (_a = child.context) == null ? void 0 : _a.exit_code;
|
|
88
|
+
const reason = child.message ?? (exit ? `exit ${exit}` : void 0);
|
|
89
|
+
return `${outcome ? OUTCOME_GLYPH[outcome] : "·"} ${child.name}${reason ? ` — ${reason}` : ""}`;
|
|
90
|
+
}
|
|
91
|
+
function summaryLine(summary) {
|
|
92
|
+
const counts = [
|
|
93
|
+
[summary.Passed, "passed"],
|
|
94
|
+
[summary.Failed, "failed"],
|
|
95
|
+
[summary.Warned, "warned"],
|
|
96
|
+
[summary.Timedout, "timed out"],
|
|
97
|
+
[summary.Skipped, "skipped"],
|
|
98
|
+
[summary.Pending, "pending"],
|
|
99
|
+
[summary.Running, "running"]
|
|
100
|
+
];
|
|
101
|
+
const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);
|
|
102
|
+
return [`${summary.Total} total`, ...parts].join(" · ");
|
|
103
|
+
}
|
|
104
|
+
function resultsSection(node) {
|
|
105
|
+
const lines = [
|
|
106
|
+
...node.summary ? [summaryLine(node.summary)] : [],
|
|
107
|
+
...(node.children ?? []).map(childLine)
|
|
108
|
+
];
|
|
109
|
+
return lines.length > 0 ? [{ title: "Results", body: lines.join("\n") }] : [];
|
|
110
|
+
}
|
|
111
|
+
function fixtureCopy(node) {
|
|
112
|
+
const context = node.context;
|
|
113
|
+
const command = (context == null ? void 0 : context.command) ?? node.command;
|
|
114
|
+
const stepDetail = readStepDetail(node.detail);
|
|
115
|
+
return {
|
|
116
|
+
brief: [
|
|
117
|
+
...commandSection(node, context),
|
|
118
|
+
...assertionSection(node, context),
|
|
119
|
+
...stepDetail.kind === "step" ? stepKindCopy(stepDetail.step) : [],
|
|
120
|
+
...resultsSection(node)
|
|
121
|
+
],
|
|
122
|
+
items: command ? [{ label: "Copy command", icon: UiTerminal, value: command }] : []
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const FIXTURE_STEP_FRAMEWORKS = /* @__PURE__ */ new Set([
|
|
126
|
+
"exec",
|
|
127
|
+
"query",
|
|
128
|
+
"fixture",
|
|
129
|
+
"test",
|
|
130
|
+
"lint",
|
|
131
|
+
"verify",
|
|
132
|
+
"services",
|
|
133
|
+
"todo",
|
|
134
|
+
"todo_prompt",
|
|
135
|
+
"ai",
|
|
136
|
+
"browser",
|
|
137
|
+
"playwright",
|
|
138
|
+
"agent-browser"
|
|
139
|
+
]);
|
|
140
|
+
function isFixtureStepNode(node) {
|
|
141
|
+
const framework = node.framework ?? "";
|
|
142
|
+
if (framework === "playwright") return hasStepDetail(node.detail);
|
|
143
|
+
return FIXTURE_STEP_FRAMEWORKS.has(framework);
|
|
14
144
|
}
|
|
15
|
-
const
|
|
16
|
-
id: "verification-
|
|
17
|
-
match:
|
|
18
|
-
|
|
145
|
+
const fixtureStepCopyAdapter = {
|
|
146
|
+
id: "verification-step-copy",
|
|
147
|
+
match: isFixtureStepNode,
|
|
148
|
+
copy: ({ node }) => fixtureCopy(node)
|
|
19
149
|
};
|
|
20
|
-
function verificationAdapters() {
|
|
21
|
-
|
|
150
|
+
function verificationAdapters(options = {}) {
|
|
151
|
+
const fixtureAdapter = {
|
|
152
|
+
id: "verification-fixture",
|
|
153
|
+
match: isFixtureNode,
|
|
154
|
+
renderDetail: ({ node }) => /* @__PURE__ */ jsx(FixtureDetail, { node, ...options }),
|
|
155
|
+
detailAttempts: ({ node }) => {
|
|
156
|
+
const detail = readStepDetail(node.detail);
|
|
157
|
+
if (detail.kind !== "step") return [];
|
|
158
|
+
return detail.step.attempts.map((attempt) => ({
|
|
159
|
+
id: attempt.attempt,
|
|
160
|
+
status: attempt.status,
|
|
161
|
+
...attempt.durationMs !== void 0 ? { durationMs: attempt.durationMs } : {},
|
|
162
|
+
node: attempt.result ? verifyNodeTest(attempt.result) : {
|
|
163
|
+
name: node.name,
|
|
164
|
+
message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,
|
|
165
|
+
detail: { step: detail.step.step }
|
|
166
|
+
}
|
|
167
|
+
}));
|
|
168
|
+
},
|
|
169
|
+
detailTabs: ({ node }) => {
|
|
170
|
+
const detail = readStepDetail(node.detail);
|
|
171
|
+
if (detail.kind !== "step" || detail.step.outputs === void 0) return [];
|
|
172
|
+
return [{ id: "outputs", label: "Outputs", render: () => /* @__PURE__ */ jsx(StepOutputs, { outputs: detail.step.outputs }) }];
|
|
173
|
+
},
|
|
174
|
+
copy: ({ node }) => fixtureCopy(node)
|
|
175
|
+
};
|
|
176
|
+
return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);
|
|
22
177
|
}
|
|
23
178
|
export {
|
|
24
179
|
verificationAdapters
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport {\n createTestRunnerRegistry,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n};\n\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined;\n}\n\nconst fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} />,\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport function verificationAdapters(): TestNodeAdapterRegistry {\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter]);\n}\n"],"names":[],"mappings":";;;AAcA,SAAS,gBAAgB,MAAqB;AAC5C,SAAO,KAAK,cAAc;AAC5B;AAEA,MAAM,mBAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,cAAc,CAAC,EAAE,WAAW,oBAAC,mBAAgB,KAAA,CAAY;AAC3D;AAEA,SAAS,cAAc,MAAqB;AAC1C,SAAO,KAAK,YAAY;AAC1B;AAEA,MAAM,iBAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,cAAc,CAAC,EAAE,WAAW,oBAAC,iBAAc,KAAA,CAAY;AACzD;AAKO,SAAS,uBAAgD;AAC9D,SAAO,yBAAyB,CAAC,kBAAkB,cAAc,CAAC;AACpE;"}
|
|
1
|
+
{"version":3,"file":"adapters.js","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well.\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined || hasStepDetail(node.detail);\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { emptyVerifySummary, summarizeVerifyNodes, type VerifyChecklistItem, type VerifyNode, type VerifyNodeContext, type VerifyNodeProgress, type VerifyReport, type VerifyState, type VerifySummary, } from './verify-report.js';
|
|
2
|
-
export { verifyReportCounts, verifyReportTests } from './verifyReportTests.js';
|
|
3
|
-
export {
|
|
2
|
+
export { verifyNodeTest, verifyReportCounts, verifyReportTests } from './verifyReportTests.js';
|
|
3
|
+
export { StepKindSections, StepOutputs, StepWait } from './stepKindViews.js';
|
|
4
|
+
export { clockTime, formatDelay, formatExportValue, policySummary, readStepDetail, type StepAttempt, type StepDetail, type StepDetailResult, type StepExport, type WaitDetail, type WaitOutcome, type WaitPolicy, type WatcherEvent, } from './stepKind.js';
|
|
5
|
+
export { verificationAdapters, type VerificationAdapterOptions } from './adapters.js';
|
|
4
6
|
export { VerificationResults, type VerificationResultsProps } from './VerificationResults.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/verification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/verification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EACL,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const status = require("../test-runner/status.cjs");
|
|
4
|
+
const WAIT_OUTCOMES = ["satisfied", "failed", "timeout"];
|
|
5
|
+
const WATCHER_EVENT_TYPES = ["alert", "console", "pageerror", "response"];
|
|
6
|
+
const STEP_KEYS = /* @__PURE__ */ new Set(["step", "outputs", "exports", "wait", "attempts", "events", "background"]);
|
|
7
|
+
class StepDetailError extends Error {
|
|
8
|
+
}
|
|
9
|
+
function fail(path, expectation) {
|
|
10
|
+
throw new StepDetailError(`${path} must be ${expectation}`);
|
|
11
|
+
}
|
|
12
|
+
const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
13
|
+
function record(value, path) {
|
|
14
|
+
return isRecord(value) ? value : fail(path, "an object");
|
|
15
|
+
}
|
|
16
|
+
function list(value, path) {
|
|
17
|
+
return Array.isArray(value) ? value : fail(path, "an array");
|
|
18
|
+
}
|
|
19
|
+
function str(value, path) {
|
|
20
|
+
return typeof value === "string" ? value : fail(path, "a string");
|
|
21
|
+
}
|
|
22
|
+
function num(value, path) {
|
|
23
|
+
return typeof value === "number" && Number.isFinite(value) ? value : fail(path, "a number");
|
|
24
|
+
}
|
|
25
|
+
function bool(value, path) {
|
|
26
|
+
return typeof value === "boolean" ? value : fail(path, "a boolean");
|
|
27
|
+
}
|
|
28
|
+
function oneOf(value, allowed, path) {
|
|
29
|
+
return allowed.includes(value) ? value : fail(path, `one of ${allowed.join(", ")} (got ${JSON.stringify(value)})`);
|
|
30
|
+
}
|
|
31
|
+
function optional(source, key, read) {
|
|
32
|
+
return source[key] === void 0 || source[key] === null ? {} : { [key]: read(source[key]) };
|
|
33
|
+
}
|
|
34
|
+
function durationText(value, path) {
|
|
35
|
+
if (typeof value === "string") return value;
|
|
36
|
+
if (typeof value === "number") return status.formatTestDuration(value);
|
|
37
|
+
return fail(path, "a duration string or nanosecond number");
|
|
38
|
+
}
|
|
39
|
+
function scalarText(value, path) {
|
|
40
|
+
if (typeof value === "string") return value;
|
|
41
|
+
if (typeof value === "number") return String(value);
|
|
42
|
+
return fail(path, "a string or number");
|
|
43
|
+
}
|
|
44
|
+
function readPolicy(value) {
|
|
45
|
+
const path = "detail.wait.policy";
|
|
46
|
+
const policy = record(value, path);
|
|
47
|
+
const backoff = (raw) => {
|
|
48
|
+
const b = record(raw, `${path}.backoff`);
|
|
49
|
+
return {
|
|
50
|
+
...optional(b, "factor", (v) => num(v, `${path}.backoff.factor`)),
|
|
51
|
+
...optional(b, "max", (v) => durationText(v, `${path}.backoff.max`))
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
...optional(policy, "until", (v) => str(v, `${path}.until`)),
|
|
56
|
+
...optional(policy, "failWhen", (v) => str(v, `${path}.failWhen`)),
|
|
57
|
+
...optional(policy, "interval", (v) => durationText(v, `${path}.interval`)),
|
|
58
|
+
...optional(policy, "backoff", backoff),
|
|
59
|
+
...optional(policy, "jitter", (v) => scalarText(v, `${path}.jitter`)),
|
|
60
|
+
...optional(policy, "timeout", (v) => durationText(v, `${path}.timeout`))
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function readWait(value) {
|
|
64
|
+
const wait = record(value, "detail.wait");
|
|
65
|
+
return {
|
|
66
|
+
policy: readPolicy(wait.policy ?? {}),
|
|
67
|
+
outcome: oneOf(wait.outcome, WAIT_OUTCOMES, "detail.wait.outcome"),
|
|
68
|
+
durationMs: nonnegative(wait.durationMs, "detail.wait.durationMs"),
|
|
69
|
+
...wait.outputs === void 0 ? {} : { outputs: wait.outputs },
|
|
70
|
+
...optional(wait, "error", (v) => str(v, "detail.wait.error")),
|
|
71
|
+
...optional(wait, "trace", (v) => str(v, "detail.wait.trace"))
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function nonnegative(value, path) {
|
|
75
|
+
const result = num(value, path);
|
|
76
|
+
return result >= 0 ? result : fail(path, "non-negative");
|
|
77
|
+
}
|
|
78
|
+
function readAttemptResult(value, path) {
|
|
79
|
+
const node = record(value, path);
|
|
80
|
+
str(node.name, `${path}.name`);
|
|
81
|
+
for (const key of ["framework", "message", "command", "work_dir", "stdout", "stderr"]) {
|
|
82
|
+
if (node[key] !== void 0) str(node[key], `${path}.${key}`);
|
|
83
|
+
}
|
|
84
|
+
for (const key of ["passed", "failed", "timed_out", "warned", "skipped", "pending", "running"]) {
|
|
85
|
+
if (node[key] !== void 0) bool(node[key], `${path}.${key}`);
|
|
86
|
+
}
|
|
87
|
+
if (node.duration !== void 0) nonnegative(node.duration, `${path}.duration`);
|
|
88
|
+
if (node.children !== void 0) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));
|
|
89
|
+
return { ...node, name: str(node.name, `${path}.name`) };
|
|
90
|
+
}
|
|
91
|
+
function readAttempt(value, index) {
|
|
92
|
+
const path = `detail.attempts[${index}]`;
|
|
93
|
+
const a = record(value, path);
|
|
94
|
+
return {
|
|
95
|
+
attempt: num(a.attempt, `${path}.attempt`),
|
|
96
|
+
status: str(a.status, `${path}.status`),
|
|
97
|
+
...optional(a, "error", (v) => str(v, `${path}.error`)),
|
|
98
|
+
...optional(a, "durationMs", (v) => nonnegative(v, `${path}.durationMs`)),
|
|
99
|
+
...optional(a, "result", (v) => readAttemptResult(v, `${path}.result`))
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function readAttempts(value) {
|
|
103
|
+
const attempts = list(value, "detail.attempts").map(readAttempt);
|
|
104
|
+
attempts.forEach((attempt, index) => {
|
|
105
|
+
if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);
|
|
106
|
+
});
|
|
107
|
+
return attempts;
|
|
108
|
+
}
|
|
109
|
+
function readExports(value) {
|
|
110
|
+
return Object.entries(record(value, "detail.exports")).map(([name, raw]) => {
|
|
111
|
+
const path = `detail.exports.${name}`;
|
|
112
|
+
const entry = record(raw, path);
|
|
113
|
+
return { name, value: entry.value, step: str(entry.step, `${path}.step`) };
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function readEvent(value, index) {
|
|
117
|
+
const path = `detail.events[${index}]`;
|
|
118
|
+
const e = record(value, path);
|
|
119
|
+
return {
|
|
120
|
+
type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),
|
|
121
|
+
...optional(e, "text", (v) => str(v, `${path}.text`)),
|
|
122
|
+
...optional(e, "url", (v) => str(v, `${path}.url`)),
|
|
123
|
+
...optional(e, "status", (v) => num(v, `${path}.status`)),
|
|
124
|
+
...optional(e, "detail", (v) => str(v, `${path}.detail`))
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function readStep(detail) {
|
|
128
|
+
const ref = record(detail.step, "detail.step");
|
|
129
|
+
const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));
|
|
130
|
+
return {
|
|
131
|
+
step: { id: str(ref.id, "detail.step.id"), kind: str(ref.kind, "detail.step.kind") },
|
|
132
|
+
...detail.outputs === void 0 ? {} : { outputs: detail.outputs },
|
|
133
|
+
exports: detail.exports == null ? [] : readExports(detail.exports),
|
|
134
|
+
...optional(detail, "wait", readWait),
|
|
135
|
+
attempts: readAttempts(detail.attempts ?? []),
|
|
136
|
+
events: list(detail.events ?? [], "detail.events").map(readEvent),
|
|
137
|
+
background: bool(detail.background ?? false, "detail.background"),
|
|
138
|
+
rest
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function readStepDetail(detail) {
|
|
142
|
+
if (!isRecord(detail) || detail.step === void 0) return { kind: "none" };
|
|
143
|
+
try {
|
|
144
|
+
return { kind: "step", step: readStep(detail) };
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error instanceof StepDetailError) return { kind: "invalid", error: error.message };
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function hasStepDetail(detail) {
|
|
151
|
+
return readStepDetail(detail).kind !== "none";
|
|
152
|
+
}
|
|
153
|
+
function clockTime(at) {
|
|
154
|
+
var _a;
|
|
155
|
+
return ((_a = /T(\d{2}:\d{2}:\d{2})/.exec(at)) == null ? void 0 : _a[1]) ?? at;
|
|
156
|
+
}
|
|
157
|
+
function formatDelay(ms) {
|
|
158
|
+
return ms <= 0 ? "0ms" : status.formatTestDuration(ms * 1e6);
|
|
159
|
+
}
|
|
160
|
+
function policySummary(policy) {
|
|
161
|
+
var _a, _b;
|
|
162
|
+
const backoff = [
|
|
163
|
+
((_a = policy.backoff) == null ? void 0 : _a.factor) !== void 0 && `×${policy.backoff.factor}`,
|
|
164
|
+
((_b = policy.backoff) == null ? void 0 : _b.max) && `up to ${policy.backoff.max}`
|
|
165
|
+
].filter(Boolean);
|
|
166
|
+
return [
|
|
167
|
+
policy.interval && `every ${policy.interval}`,
|
|
168
|
+
backoff.length > 0 && `backoff ${backoff.join(" ")}`,
|
|
169
|
+
policy.jitter && `jitter ±${policy.jitter}`,
|
|
170
|
+
policy.timeout && `timeout ${policy.timeout}`
|
|
171
|
+
].filter(Boolean).join(" · ");
|
|
172
|
+
}
|
|
173
|
+
function formatExportValue(value) {
|
|
174
|
+
if (value === void 0) return "";
|
|
175
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
176
|
+
}
|
|
177
|
+
function waitCopy(wait) {
|
|
178
|
+
const { policy } = wait;
|
|
179
|
+
const lines = [
|
|
180
|
+
`outcome: ${wait.outcome}`,
|
|
181
|
+
`elapsed: ${formatDelay(wait.durationMs)}`,
|
|
182
|
+
`policy: ${policySummary(policy)}`,
|
|
183
|
+
policy.until && `until: ${policy.until}`,
|
|
184
|
+
policy.failWhen && `failWhen: ${policy.failWhen}`,
|
|
185
|
+
wait.error && `error: ${wait.error}`,
|
|
186
|
+
wait.trace && `trace: ${wait.trace}`,
|
|
187
|
+
wait.outputs !== void 0 && `outputs: ${JSON.stringify(wait.outputs)}`
|
|
188
|
+
];
|
|
189
|
+
return { title: "Wait", body: lines.filter(Boolean).join("\n") };
|
|
190
|
+
}
|
|
191
|
+
function attemptLine(a) {
|
|
192
|
+
const head = [`#${a.attempt}`, a.status, a.durationMs !== void 0 && formatDelay(a.durationMs)];
|
|
193
|
+
return `${head.filter(Boolean).join(" ")}${a.error ? ` — ${a.error}` : ""}`;
|
|
194
|
+
}
|
|
195
|
+
function eventLine(e) {
|
|
196
|
+
const body = [e.status, e.text, e.url].filter((part) => part !== void 0).join(" ");
|
|
197
|
+
return `[${e.type}]${body ? ` ${body}` : ""}${e.detail ? ` — ${e.detail}` : ""}`;
|
|
198
|
+
}
|
|
199
|
+
function stepKindCopy(step) {
|
|
200
|
+
return [
|
|
201
|
+
...step.outputs !== void 0 ? [{ title: "Outputs", body: JSON.stringify(step.outputs, null, 2), lang: "json" }] : [],
|
|
202
|
+
...step.wait ? [waitCopy(step.wait)] : [],
|
|
203
|
+
...step.attempts.length > 0 ? [{ title: "Attempts", body: step.attempts.map(attemptLine).join("\n") }] : [],
|
|
204
|
+
...step.exports.length > 0 ? [{ title: "Exports", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join("\n") }] : [],
|
|
205
|
+
...step.events.length > 0 ? [{ title: "Events", body: step.events.map(eventLine).join("\n") }] : []
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
exports.WAIT_OUTCOMES = WAIT_OUTCOMES;
|
|
209
|
+
exports.WATCHER_EVENT_TYPES = WATCHER_EVENT_TYPES;
|
|
210
|
+
exports.clockTime = clockTime;
|
|
211
|
+
exports.formatDelay = formatDelay;
|
|
212
|
+
exports.formatExportValue = formatExportValue;
|
|
213
|
+
exports.hasStepDetail = hasStepDetail;
|
|
214
|
+
exports.policySummary = policySummary;
|
|
215
|
+
exports.readStepDetail = readStepDetail;
|
|
216
|
+
exports.stepKindCopy = stepKindCopy;
|
|
217
|
+
//# sourceMappingURL=stepKind.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepKind.cjs","sources":["../../../src/data/verification/stepKind.ts"],"sourcesContent":["// The typed step-kind detail gavel's fixture verifier attaches to a node\n// (fixtures/verifier/report.go): `detail.step` names the kind and id, beside\n// the structured `wait`, `attempts`, `exports`, `outputs` and (for a\n// background Playwright watcher) `events`. Parsed here, once, so the detail\n// view and the copy brief read the same typed shape. A present-but-malformed\n// field is reported by path instead of being guessed at.\n\nimport type { BriefSection } from \"../test-runner\";\nimport { formatTestDuration } from \"../test-runner\";\nimport type { VerifyNode } from \"./verify-report\";\n\nexport type StepRef = { id: string; kind: string };\n\nexport type WaitPolicy = {\n until?: string;\n failWhen?: string;\n interval?: string;\n backoff?: { factor?: number; max?: string };\n jitter?: string;\n timeout?: string;\n};\n\nexport const WAIT_OUTCOMES = [\"satisfied\", \"failed\", \"timeout\"] as const;\nexport type WaitOutcome = (typeof WAIT_OUTCOMES)[number];\n\nexport type WaitDetail = { policy: WaitPolicy; outcome: WaitOutcome; durationMs: number; outputs?: unknown; error?: string; trace?: string };\n\nexport type StepAttempt = { attempt: number; status: string; error?: string; durationMs?: number; result?: VerifyNode };\n\nexport type StepExport = { name: string; value: unknown; step: string };\n\nexport const WATCHER_EVENT_TYPES = [\"alert\", \"console\", \"pageerror\", \"response\"] as const;\nexport type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];\n\nexport type WatcherEvent = {\n type: WatcherEventType;\n text?: string;\n url?: string;\n status?: number;\n detail?: string;\n};\n\nexport type StepDetail = {\n step: StepRef;\n outputs?: unknown;\n exports: StepExport[];\n wait?: WaitDetail;\n attempts: StepAttempt[];\n events: WatcherEvent[];\n /** Whether the step runs in the background until teardown (a watcher). */\n background: boolean;\n /** Everything else in `node.detail` (cel_trace, run, recordings, …). */\n rest: Record<string, unknown>;\n};\n\nexport type StepDetailResult =\n | { kind: \"none\" }\n | { kind: \"step\"; step: StepDetail }\n | { kind: \"invalid\"; error: string };\n\nconst STEP_KEYS = new Set([\"step\", \"outputs\", \"exports\", \"wait\", \"attempts\", \"events\", \"background\"]);\n\nclass StepDetailError extends Error {}\n\nfunction fail(path: string, expectation: string): never {\n throw new StepDetailError(`${path} must be ${expectation}`);\n}\n\ntype Rec = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Rec =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nfunction record(value: unknown, path: string): Rec {\n return isRecord(value) ? value : fail(path, \"an object\");\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n return Array.isArray(value) ? value : fail(path, \"an array\");\n}\n\nfunction str(value: unknown, path: string): string {\n return typeof value === \"string\" ? value : fail(path, \"a string\");\n}\n\nfunction num(value: unknown, path: string): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fail(path, \"a number\");\n}\n\nfunction bool(value: unknown, path: string): boolean {\n return typeof value === \"boolean\" ? value : fail(path, \"a boolean\");\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n return allowed.includes(value as T)\n ? (value as T)\n : fail(path, `one of ${allowed.join(\", \")} (got ${JSON.stringify(value)})`);\n}\n\n/** `{ [key]: read(value) }` when the optional field is present, else `{}` — absent stays an absent key. */\nfunction optional<K extends string, T>(source: Rec, key: K, read: (value: unknown) => T): { [P in K]?: T } {\n return source[key] === undefined || source[key] === null ? {} : ({ [key]: read(source[key]) } as { [P in K]?: T });\n}\n\n/** Durations arrive as Go-style strings (\"15s\"); a bare number is nanoseconds like every other duration on the wire. */\nfunction durationText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return formatTestDuration(value);\n return fail(path, \"a duration string or nanosecond number\");\n}\n\nfunction scalarText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n return fail(path, \"a string or number\");\n}\n\nfunction readPolicy(value: unknown): WaitPolicy {\n const path = \"detail.wait.policy\";\n const policy = record(value, path);\n const backoff = (raw: unknown) => {\n const b = record(raw, `${path}.backoff`);\n return {\n ...optional(b, \"factor\", (v) => num(v, `${path}.backoff.factor`)),\n ...optional(b, \"max\", (v) => durationText(v, `${path}.backoff.max`)),\n };\n };\n return {\n ...optional(policy, \"until\", (v) => str(v, `${path}.until`)),\n ...optional(policy, \"failWhen\", (v) => str(v, `${path}.failWhen`)),\n ...optional(policy, \"interval\", (v) => durationText(v, `${path}.interval`)),\n ...optional(policy, \"backoff\", backoff),\n ...optional(policy, \"jitter\", (v) => scalarText(v, `${path}.jitter`)),\n ...optional(policy, \"timeout\", (v) => durationText(v, `${path}.timeout`)),\n };\n}\n\nfunction readWait(value: unknown): WaitDetail {\n const wait = record(value, \"detail.wait\");\n return {\n policy: readPolicy(wait.policy ?? {}),\n outcome: oneOf(wait.outcome, WAIT_OUTCOMES, \"detail.wait.outcome\"),\n durationMs: nonnegative(wait.durationMs, \"detail.wait.durationMs\"),\n ...(wait.outputs === undefined ? {} : { outputs: wait.outputs }),\n ...optional(wait, \"error\", (v) => str(v, \"detail.wait.error\")),\n ...optional(wait, \"trace\", (v) => str(v, \"detail.wait.trace\")),\n };\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n const result = num(value, path);\n return result >= 0 ? result : fail(path, \"non-negative\");\n}\n\nfunction readAttemptResult(value: unknown, path: string): VerifyNode {\n const node = record(value, path);\n str(node.name, `${path}.name`);\n for (const key of [\"framework\", \"message\", \"command\", \"work_dir\", \"stdout\", \"stderr\"]) {\n if (node[key] !== undefined) str(node[key], `${path}.${key}`);\n }\n for (const key of [\"passed\", \"failed\", \"timed_out\", \"warned\", \"skipped\", \"pending\", \"running\"]) {\n if (node[key] !== undefined) bool(node[key], `${path}.${key}`);\n }\n if (node.duration !== undefined) nonnegative(node.duration, `${path}.duration`);\n if (node.children !== undefined) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));\n return { ...node, name: str(node.name, `${path}.name`) } as VerifyNode;\n}\n\nfunction readAttempt(value: unknown, index: number): StepAttempt {\n const path = `detail.attempts[${index}]`;\n const a = record(value, path);\n return {\n attempt: num(a.attempt, `${path}.attempt`),\n status: str(a.status, `${path}.status`),\n ...optional(a, \"error\", (v) => str(v, `${path}.error`)),\n ...optional(a, \"durationMs\", (v) => nonnegative(v, `${path}.durationMs`)),\n ...optional(a, \"result\", (v) => readAttemptResult(v, `${path}.result`)),\n };\n}\n\nfunction readAttempts(value: unknown): StepAttempt[] {\n const attempts = list(value, \"detail.attempts\").map(readAttempt);\n attempts.forEach((attempt, index) => {\n if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);\n });\n return attempts;\n}\n\nfunction readExports(value: unknown): StepExport[] {\n return Object.entries(record(value, \"detail.exports\")).map(([name, raw]) => {\n const path = `detail.exports.${name}`;\n const entry = record(raw, path);\n return { name, value: entry.value, step: str(entry.step, `${path}.step`) };\n });\n}\n\nfunction readEvent(value: unknown, index: number): WatcherEvent {\n const path = `detail.events[${index}]`;\n const e = record(value, path);\n return {\n type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),\n ...optional(e, \"text\", (v) => str(v, `${path}.text`)),\n ...optional(e, \"url\", (v) => str(v, `${path}.url`)),\n ...optional(e, \"status\", (v) => num(v, `${path}.status`)),\n ...optional(e, \"detail\", (v) => str(v, `${path}.detail`)),\n };\n}\n\nfunction readStep(detail: Rec): StepDetail {\n const ref = record(detail.step, \"detail.step\");\n const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));\n return {\n step: { id: str(ref.id, \"detail.step.id\"), kind: str(ref.kind, \"detail.step.kind\") },\n ...(detail.outputs === undefined ? {} : { outputs: detail.outputs }),\n exports: detail.exports == null ? [] : readExports(detail.exports),\n ...optional(detail, \"wait\", readWait),\n attempts: readAttempts(detail.attempts ?? []),\n events: list(detail.events ?? [], \"detail.events\").map(readEvent),\n background: bool(detail.background ?? false, \"detail.background\"),\n rest,\n };\n}\n\n/**\n * Whether `node.detail` carries a typed step (`detail.step`), and if so its\n * parsed contents. A node without `detail.step` is \"none\" whatever else its\n * detail holds; a `step` whose fields violate the contract is \"invalid\" with\n * the offending path, so the view can say so rather than render a guess.\n */\nexport function readStepDetail(detail: unknown): StepDetailResult {\n if (!isRecord(detail) || detail.step === undefined) return { kind: \"none\" };\n try {\n return { kind: \"step\", step: readStep(detail) };\n } catch (error) {\n if (error instanceof StepDetailError) return { kind: \"invalid\", error: error.message };\n throw error;\n }\n}\n\n/** The step detail when there is one, for matchers that only need to know. */\nexport function hasStepDetail(detail: unknown): boolean {\n return readStepDetail(detail).kind !== \"none\";\n}\n\n/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */\nexport function clockTime(at: string): string {\n return /T(\\d{2}:\\d{2}:\\d{2})/.exec(at)?.[1] ?? at;\n}\n\nexport function formatDelay(ms: number): string {\n return ms <= 0 ? \"0ms\" : formatTestDuration(ms * 1e6);\n}\n\n/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */\nexport function policySummary(policy: WaitPolicy): string {\n const backoff = [\n policy.backoff?.factor !== undefined && `×${policy.backoff.factor}`,\n policy.backoff?.max && `up to ${policy.backoff.max}`,\n ].filter(Boolean);\n return [\n policy.interval && `every ${policy.interval}`,\n backoff.length > 0 && `backoff ${backoff.join(\" \")}`,\n policy.jitter && `jitter ±${policy.jitter}`,\n policy.timeout && `timeout ${policy.timeout}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function formatExportValue(value: unknown): string {\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction waitCopy(wait: WaitDetail): BriefSection {\n const { policy } = wait;\n const lines = [\n `outcome: ${wait.outcome}`,\n `elapsed: ${formatDelay(wait.durationMs)}`,\n `policy: ${policySummary(policy)}`,\n policy.until && `until: ${policy.until}`,\n policy.failWhen && `failWhen: ${policy.failWhen}`,\n wait.error && `error: ${wait.error}`,\n wait.trace && `trace: ${wait.trace}`,\n wait.outputs !== undefined && `outputs: ${JSON.stringify(wait.outputs)}`,\n ];\n return { title: \"Wait\", body: lines.filter(Boolean).join(\"\\n\") };\n}\n\nfunction attemptLine(a: StepAttempt): string {\n const head = [`#${a.attempt}`, a.status, a.durationMs !== undefined && formatDelay(a.durationMs)];\n return `${head.filter(Boolean).join(\" \")}${a.error ? ` — ${a.error}` : \"\"}`;\n}\n\nfunction eventLine(e: WatcherEvent): string {\n const body = [e.status, e.text, e.url].filter((part) => part !== undefined).join(\" \");\n return `[${e.type}]${body ? ` ${body}` : \"\"}${e.detail ? ` — ${e.detail}` : \"\"}`;\n}\n\n/** Brief sections for the \"Copy details\" button: wait trace, retry attempts, exports and watcher events. */\nexport function stepKindCopy(step: StepDetail): BriefSection[] {\n return [\n ...(step.outputs !== undefined ? [{ title: \"Outputs\", body: JSON.stringify(step.outputs, null, 2), lang: \"json\" }] : []),\n ...(step.wait ? [waitCopy(step.wait)] : []),\n ...(step.attempts.length > 0 ? [{ title: \"Attempts\", body: step.attempts.map(attemptLine).join(\"\\n\") }] : []),\n ...(step.exports.length > 0\n ? [{ title: \"Exports\", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join(\"\\n\") }]\n : []),\n ...(step.events.length > 0 ? [{ title: \"Events\", body: step.events.map(eventLine).join(\"\\n\") }] : []),\n ];\n}\n"],"names":["formatTestDuration"],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { BriefSection } from '../test-runner/index.js';
|
|
2
|
+
import { VerifyNode } from './verify-report.js';
|
|
3
|
+
export type StepRef = {
|
|
4
|
+
id: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
};
|
|
7
|
+
export type WaitPolicy = {
|
|
8
|
+
until?: string;
|
|
9
|
+
failWhen?: string;
|
|
10
|
+
interval?: string;
|
|
11
|
+
backoff?: {
|
|
12
|
+
factor?: number;
|
|
13
|
+
max?: string;
|
|
14
|
+
};
|
|
15
|
+
jitter?: string;
|
|
16
|
+
timeout?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const WAIT_OUTCOMES: readonly ["satisfied", "failed", "timeout"];
|
|
19
|
+
export type WaitOutcome = (typeof WAIT_OUTCOMES)[number];
|
|
20
|
+
export type WaitDetail = {
|
|
21
|
+
policy: WaitPolicy;
|
|
22
|
+
outcome: WaitOutcome;
|
|
23
|
+
durationMs: number;
|
|
24
|
+
outputs?: unknown;
|
|
25
|
+
error?: string;
|
|
26
|
+
trace?: string;
|
|
27
|
+
};
|
|
28
|
+
export type StepAttempt = {
|
|
29
|
+
attempt: number;
|
|
30
|
+
status: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
durationMs?: number;
|
|
33
|
+
result?: VerifyNode;
|
|
34
|
+
};
|
|
35
|
+
export type StepExport = {
|
|
36
|
+
name: string;
|
|
37
|
+
value: unknown;
|
|
38
|
+
step: string;
|
|
39
|
+
};
|
|
40
|
+
export declare const WATCHER_EVENT_TYPES: readonly ["alert", "console", "pageerror", "response"];
|
|
41
|
+
export type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];
|
|
42
|
+
export type WatcherEvent = {
|
|
43
|
+
type: WatcherEventType;
|
|
44
|
+
text?: string;
|
|
45
|
+
url?: string;
|
|
46
|
+
status?: number;
|
|
47
|
+
detail?: string;
|
|
48
|
+
};
|
|
49
|
+
export type StepDetail = {
|
|
50
|
+
step: StepRef;
|
|
51
|
+
outputs?: unknown;
|
|
52
|
+
exports: StepExport[];
|
|
53
|
+
wait?: WaitDetail;
|
|
54
|
+
attempts: StepAttempt[];
|
|
55
|
+
events: WatcherEvent[];
|
|
56
|
+
/** Whether the step runs in the background until teardown (a watcher). */
|
|
57
|
+
background: boolean;
|
|
58
|
+
/** Everything else in `node.detail` (cel_trace, run, recordings, …). */
|
|
59
|
+
rest: Record<string, unknown>;
|
|
60
|
+
};
|
|
61
|
+
export type StepDetailResult = {
|
|
62
|
+
kind: "none";
|
|
63
|
+
} | {
|
|
64
|
+
kind: "step";
|
|
65
|
+
step: StepDetail;
|
|
66
|
+
} | {
|
|
67
|
+
kind: "invalid";
|
|
68
|
+
error: string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Whether `node.detail` carries a typed step (`detail.step`), and if so its
|
|
72
|
+
* parsed contents. A node without `detail.step` is "none" whatever else its
|
|
73
|
+
* detail holds; a `step` whose fields violate the contract is "invalid" with
|
|
74
|
+
* the offending path, so the view can say so rather than render a guess.
|
|
75
|
+
*/
|
|
76
|
+
export declare function readStepDetail(detail: unknown): StepDetailResult;
|
|
77
|
+
/** The step detail when there is one, for matchers that only need to know. */
|
|
78
|
+
export declare function hasStepDetail(detail: unknown): boolean;
|
|
79
|
+
/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */
|
|
80
|
+
export declare function clockTime(at: string): string;
|
|
81
|
+
export declare function formatDelay(ms: number): string;
|
|
82
|
+
/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */
|
|
83
|
+
export declare function policySummary(policy: WaitPolicy): string;
|
|
84
|
+
export declare function formatExportValue(value: unknown): string;
|
|
85
|
+
/** Brief sections for the "Copy details" button: wait trace, retry attempts, exports and watcher events. */
|
|
86
|
+
export declare function stepKindCopy(step: StepDetail): BriefSection[];
|
|
87
|
+
//# sourceMappingURL=stepKind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepKind.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKind.ts"],"names":[],"mappings":"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"}
|