@stigmer/react 3.1.1 → 3.1.3
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/composer/SessionComposer.d.ts +25 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +19 -8
- package/composer/SessionComposer.js.map +1 -1
- package/execution/ArtifactContentRenderer.d.ts +11 -1
- package/execution/ArtifactContentRenderer.d.ts.map +1 -1
- package/execution/ArtifactContentRenderer.js +39 -15
- package/execution/ArtifactContentRenderer.js.map +1 -1
- package/execution/ArtifactPreviewModal.d.ts +5 -5
- package/execution/ArtifactPreviewModal.js +4 -4
- package/execution/ArtifactPreviewModal.js.map +1 -1
- package/execution/FileChangeProgressBar.d.ts +47 -0
- package/execution/FileChangeProgressBar.d.ts.map +1 -0
- package/execution/FileChangeProgressBar.js +49 -0
- package/execution/FileChangeProgressBar.js.map +1 -0
- package/execution/FileChangesView.d.ts.map +1 -1
- package/execution/FileChangesView.js +19 -4
- package/execution/FileChangesView.js.map +1 -1
- package/execution/FilePathContext.d.ts +8 -1
- package/execution/FilePathContext.d.ts.map +1 -1
- package/execution/FilePathContext.js.map +1 -1
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +21 -6
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewAtoms.d.ts +27 -0
- package/execution/FileReviewAtoms.d.ts.map +1 -0
- package/execution/FileReviewAtoms.js +64 -0
- package/execution/FileReviewAtoms.js.map +1 -0
- package/execution/FileReviewCard.d.ts +2 -2
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +32 -62
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/MessageEntry.d.ts +20 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +19 -5
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +75 -13
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +195 -27
- package/execution/MessageThread.js.map +1 -1
- package/execution/PlanArtifactCard.d.ts +36 -21
- package/execution/PlanArtifactCard.d.ts.map +1 -1
- package/execution/PlanArtifactCard.js +39 -25
- package/execution/PlanArtifactCard.js.map +1 -1
- package/execution/PlanCompletionCard.d.ts +4 -4
- package/execution/PlanCompletionCard.d.ts.map +1 -1
- package/execution/PlanCompletionCard.js +4 -4
- package/execution/PlanCompletionCard.js.map +1 -1
- package/execution/PlanDocumentMessage.d.ts +32 -0
- package/execution/PlanDocumentMessage.d.ts.map +1 -0
- package/execution/PlanDocumentMessage.js +37 -0
- package/execution/PlanDocumentMessage.js.map +1 -0
- package/execution/PlanStreamingCard.d.ts +50 -0
- package/execution/PlanStreamingCard.d.ts.map +1 -0
- package/execution/PlanStreamingCard.js +40 -0
- package/execution/PlanStreamingCard.js.map +1 -0
- package/execution/index.d.ts +9 -1
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +4 -0
- package/execution/index.js.map +1 -1
- package/execution/use-build-from-plan-hotkey.d.ts +1 -1
- package/execution/use-build-from-plan-hotkey.js +1 -1
- package/execution/useArtifactCopy.d.ts +51 -0
- package/execution/useArtifactCopy.d.ts.map +1 -0
- package/execution/useArtifactCopy.js +75 -0
- package/execution/useArtifactCopy.js.map +1 -0
- package/execution/useArtifactDownload.d.ts.map +1 -1
- package/execution/useArtifactDownload.js +17 -5
- package/execution/useArtifactDownload.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +12 -0
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js +5 -1
- package/execution/useCreateAgentExecution.js.map +1 -1
- package/github/decodeGitHubContent.d.ts +29 -0
- package/github/decodeGitHubContent.d.ts.map +1 -0
- package/github/decodeGitHubContent.js +72 -0
- package/github/decodeGitHubContent.js.map +1 -0
- package/github/index.d.ts +1 -0
- package/github/index.d.ts.map +1 -1
- package/github/index.js +1 -0
- package/github/index.js.map +1 -1
- package/github/useGitHubFileReader.d.ts +26 -0
- package/github/useGitHubFileReader.d.ts.map +1 -0
- package/github/useGitHubFileReader.js +106 -0
- package/github/useGitHubFileReader.js.map +1 -0
- package/github/useGitHubTreeLister.d.ts.map +1 -1
- package/github/useGitHubTreeLister.js +6 -2
- package/github/useGitHubTreeLister.js.map +1 -1
- package/index.d.ts +9 -9
- package/index.d.ts.map +1 -1
- package/index.js +5 -5
- package/index.js.map +1 -1
- package/internal/ResizableSplit.d.ts +72 -22
- package/internal/ResizableSplit.d.ts.map +1 -1
- package/internal/ResizableSplit.js +96 -38
- package/internal/ResizableSplit.js.map +1 -1
- package/internal/VirtualizedThread.d.ts +5 -3
- package/internal/VirtualizedThread.d.ts.map +1 -1
- package/internal/VirtualizedThread.js +6 -4
- package/internal/VirtualizedThread.js.map +1 -1
- package/internal/file-icons/index.d.ts +17 -0
- package/internal/file-icons/index.d.ts.map +1 -0
- package/internal/file-icons/index.js +60 -0
- package/internal/file-icons/index.js.map +1 -0
- package/internal/file-tree/FileTreeNode.d.ts +18 -1
- package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
- package/internal/file-tree/FileTreeNode.js +11 -2
- package/internal/file-tree/FileTreeNode.js.map +1 -1
- package/internal/markdown-components.d.ts +38 -1
- package/internal/markdown-components.d.ts.map +1 -1
- package/internal/markdown-components.js +86 -11
- package/internal/markdown-components.js.map +1 -1
- package/{workflow → internal}/motion-preference.d.ts +7 -4
- package/internal/motion-preference.d.ts.map +1 -0
- package/{workflow → internal}/motion-preference.js +7 -4
- package/internal/motion-preference.js.map +1 -0
- package/internal/store/index.d.ts +33 -0
- package/internal/store/index.d.ts.map +1 -1
- package/internal/store/index.js +59 -0
- package/internal/store/index.js.map +1 -1
- package/internal/store/workspace-editors-store.d.ts +145 -0
- package/internal/store/workspace-editors-store.d.ts.map +1 -0
- package/internal/store/workspace-editors-store.js +208 -0
- package/internal/store/workspace-editors-store.js.map +1 -0
- package/internal/store/workspace-file-selection-store.d.ts +38 -0
- package/internal/store/workspace-file-selection-store.d.ts.map +1 -0
- package/internal/store/workspace-file-selection-store.js +62 -0
- package/internal/store/workspace-file-selection-store.js.map +1 -0
- package/internal/useRevealLine.d.ts +49 -0
- package/internal/useRevealLine.d.ts.map +1 -0
- package/internal/useRevealLine.js +43 -0
- package/internal/useRevealLine.js.map +1 -0
- package/library/detect-plan-artifact.d.ts +43 -4
- package/library/detect-plan-artifact.d.ts.map +1 -1
- package/library/detect-plan-artifact.js +45 -5
- package/library/detect-plan-artifact.js.map +1 -1
- package/library/detect-streaming-plan.d.ts +45 -0
- package/library/detect-streaming-plan.d.ts.map +1 -0
- package/library/detect-streaming-plan.js +83 -0
- package/library/detect-streaming-plan.js.map +1 -0
- package/library/index.d.ts +4 -1
- package/library/index.d.ts.map +1 -1
- package/library/index.js +2 -1
- package/library/index.js.map +1 -1
- package/package.json +4 -4
- package/session/NewSessionViewer.d.ts +19 -4
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +52 -25
- package/session/NewSessionViewer.js.map +1 -1
- package/session/PlanEditor.d.ts +55 -0
- package/session/PlanEditor.d.ts.map +1 -0
- package/session/PlanEditor.js +88 -0
- package/session/PlanEditor.js.map +1 -0
- package/session/PlanStreamingDocument.d.ts +30 -0
- package/session/PlanStreamingDocument.d.ts.map +1 -0
- package/session/PlanStreamingDocument.js +37 -0
- package/session/PlanStreamingDocument.js.map +1 -0
- package/session/SessionPanelChip.d.ts +26 -0
- package/session/SessionPanelChip.d.ts.map +1 -0
- package/session/SessionPanelChip.js +40 -0
- package/session/SessionPanelChip.js.map +1 -0
- package/session/SessionViewer.d.ts +34 -7
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +334 -33
- package/session/SessionViewer.js.map +1 -1
- package/session/{inspector → facets}/ArtifactsTab.d.ts +10 -2
- package/session/facets/ArtifactsTab.d.ts.map +1 -0
- package/session/{inspector → facets}/ArtifactsTab.js +8 -3
- package/session/facets/ArtifactsTab.js.map +1 -0
- package/session/{inspector → facets}/ChangesTab.d.ts +3 -3
- package/session/facets/ChangesTab.d.ts.map +1 -0
- package/session/{inspector → facets}/ChangesTab.js +3 -3
- package/session/facets/ChangesTab.js.map +1 -0
- package/session/facets/InspectTab.d.ts.map +1 -0
- package/session/facets/InspectTab.js.map +1 -0
- package/session/{inspector → facets}/SetupTab.d.ts +11 -2
- package/session/facets/SetupTab.d.ts.map +1 -0
- package/session/{inspector → facets}/SetupTab.js +4 -3
- package/session/facets/SetupTab.js.map +1 -0
- package/session/{inspector → facets}/UsageTab.d.ts +1 -1
- package/session/facets/UsageTab.d.ts.map +1 -0
- package/session/{inspector → facets}/UsageTab.js +1 -1
- package/session/facets/UsageTab.js.map +1 -0
- package/session/{inspector → facets}/index.d.ts +0 -6
- package/session/facets/index.d.ts.map +1 -0
- package/session/{inspector → facets}/index.js +0 -3
- package/session/facets/index.js.map +1 -0
- package/session/index.d.ts +11 -2
- package/session/index.d.ts.map +1 -1
- package/session/index.js +15 -2
- package/session/index.js.map +1 -1
- package/session/plan-document.d.ts +21 -0
- package/session/plan-document.d.ts.map +1 -0
- package/session/plan-document.js +28 -0
- package/session/plan-document.js.map +1 -0
- package/session/useOpenFileChange.d.ts +20 -0
- package/session/useOpenFileChange.d.ts.map +1 -0
- package/session/useOpenFileChange.js +31 -0
- package/session/useOpenFileChange.js.map +1 -0
- package/session/usePlanDraft.d.ts +52 -0
- package/session/usePlanDraft.d.ts.map +1 -0
- package/session/usePlanDraft.js +63 -0
- package/session/usePlanDraft.js.map +1 -0
- package/session/useSessionConversation.d.ts +14 -1
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +20 -2
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +1 -0
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +120 -0
- package/session/useSessionPanel.d.ts.map +1 -0
- package/session/useSessionPanel.js +130 -0
- package/session/useSessionPanel.js.map +1 -0
- package/session/useSessionRailViews.d.ts +45 -0
- package/session/useSessionRailViews.d.ts.map +1 -0
- package/session/useSessionRailViews.js +105 -0
- package/session/useSessionRailViews.js.map +1 -0
- package/src/composer/SessionComposer.tsx +53 -10
- package/src/composer/__tests__/SessionComposer-contract.test.tsx +58 -4
- package/src/execution/ArtifactContentRenderer.tsx +101 -24
- package/src/execution/ArtifactPreviewModal.tsx +9 -9
- package/src/execution/FileChangeProgressBar.tsx +121 -0
- package/src/execution/FileChangesView.tsx +18 -4
- package/src/execution/FilePathContext.tsx +8 -1
- package/src/execution/FilePathLink.tsx +22 -6
- package/src/execution/FileReviewAtoms.tsx +89 -0
- package/src/execution/FileReviewCard.tsx +57 -90
- package/src/execution/MessageEntry.tsx +49 -1
- package/src/execution/MessageThread.tsx +308 -39
- package/src/execution/PlanArtifactCard.tsx +174 -64
- package/src/execution/PlanCompletionCard.tsx +5 -5
- package/src/execution/PlanDocumentMessage.tsx +96 -0
- package/src/execution/PlanStreamingCard.tsx +141 -0
- package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +80 -1
- package/src/execution/__tests__/ArtifactPreviewModal.test.tsx +6 -6
- package/src/execution/__tests__/FileChangeProgressBar.test.tsx +125 -0
- package/src/execution/__tests__/FilePathLink.test.tsx +87 -0
- package/src/execution/__tests__/FileReviewCard.test.tsx +66 -7
- package/src/execution/__tests__/MessageThread.test.tsx +102 -1
- package/src/execution/__tests__/PlanArtifactCard.test.tsx +114 -26
- package/src/execution/__tests__/PlanCompletionCard.test.tsx +2 -2
- package/src/execution/__tests__/PlanDocumentMessage.test.tsx +55 -0
- package/src/execution/__tests__/PlanStreamingCard.test.tsx +56 -0
- package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +600 -22
- package/src/execution/__tests__/message-entry.test.tsx +17 -0
- package/src/execution/__tests__/useArtifactCopy.test.tsx +90 -0
- package/src/execution/__tests__/useArtifactDownload.test.tsx +2 -0
- package/src/execution/__tests__/useCreateAgentExecution.test.tsx +85 -0
- package/src/execution/index.ts +13 -1
- package/src/execution/use-build-from-plan-hotkey.ts +1 -1
- package/src/execution/useArtifactCopy.ts +109 -0
- package/src/execution/useArtifactDownload.ts +17 -5
- package/src/execution/useCreateAgentExecution.ts +18 -1
- package/src/github/__tests__/decodeGitHubContent.test.ts +102 -0
- package/src/github/__tests__/useGitHubFileReader.test.ts +183 -0
- package/src/github/decodeGitHubContent.ts +83 -0
- package/src/github/index.ts +1 -0
- package/src/github/useGitHubFileReader.ts +152 -0
- package/src/github/useGitHubTreeLister.ts +6 -2
- package/src/index.ts +69 -9
- package/src/internal/ResizableSplit.tsx +184 -51
- package/src/internal/VirtualizedThread.tsx +12 -4
- package/src/internal/__tests__/ResizableSplit.test.tsx +125 -3
- package/src/internal/__tests__/markdown-components.test.tsx +68 -0
- package/src/internal/__tests__/useRevealLine.test.tsx +97 -0
- package/src/internal/file-icons/__tests__/file-icons.test.tsx +35 -0
- package/src/internal/file-icons/index.tsx +137 -0
- package/src/internal/file-tree/FileTreeNode.tsx +56 -5
- package/src/internal/file-tree/__tests__/FileTreeNode-explorer.test.tsx +86 -0
- package/src/internal/markdown-components.tsx +116 -11
- package/src/{workflow → internal}/motion-preference.ts +7 -4
- package/src/internal/store/__tests__/workspace-editors-store.test.ts +216 -0
- package/src/internal/store/__tests__/workspace-file-selection-store.test.ts +118 -0
- package/src/internal/store/index.ts +94 -0
- package/src/internal/store/workspace-editors-store.ts +315 -0
- package/src/internal/store/workspace-file-selection-store.ts +88 -0
- package/src/internal/useRevealLine.ts +81 -0
- package/src/library/__tests__/detect-plan-artifact.test.ts +69 -0
- package/src/library/__tests__/detect-streaming-plan.test.ts +234 -0
- package/src/library/detect-plan-artifact.ts +62 -5
- package/src/library/detect-streaming-plan.ts +108 -0
- package/src/library/index.ts +7 -0
- package/src/session/NewSessionViewer.tsx +123 -55
- package/src/session/PlanEditor.tsx +361 -0
- package/src/session/PlanStreamingDocument.tsx +97 -0
- package/src/session/SessionPanelChip.tsx +103 -0
- package/src/session/SessionViewer.tsx +655 -96
- package/src/session/__tests__/NewSessionViewer.test.tsx +148 -0
- package/src/session/__tests__/PlanEditor.test.tsx +217 -0
- package/src/session/__tests__/PlanStreamingDocument.test.tsx +50 -0
- package/src/session/__tests__/SessionPanelChip.test.tsx +42 -0
- package/src/session/__tests__/SessionViewer-fileReviewDock.test.tsx +66 -4
- package/src/session/__tests__/SessionViewer-transcriptFileOpen.test.tsx +205 -0
- package/src/session/__tests__/audienceWiring.test.tsx +55 -19
- package/src/session/__tests__/useOpenFileChange.test.tsx +82 -0
- package/src/session/__tests__/usePlanDraft.test.ts +102 -0
- package/src/session/__tests__/useSessionConversation.test.tsx +44 -0
- package/src/session/__tests__/useSessionPanel.test.ts +298 -0
- package/src/session/__tests__/useSessionRailViews.test.tsx +124 -0
- package/src/session/{inspector → facets}/ArtifactsTab.tsx +27 -5
- package/src/session/{inspector → facets}/ChangesTab.tsx +3 -3
- package/src/session/{inspector → facets}/SetupTab.tsx +13 -1
- package/src/session/{inspector → facets}/UsageTab.tsx +1 -1
- package/src/session/{inspector → facets}/__tests__/ArtifactsTab.test.tsx +42 -8
- package/src/session/facets/__tests__/SetupTab.test.tsx +44 -0
- package/src/session/{inspector → facets}/index.ts +0 -16
- package/src/session/index.ts +30 -13
- package/src/session/plan-document.ts +30 -0
- package/src/session/useOpenFileChange.ts +53 -0
- package/src/session/usePlanDraft.ts +109 -0
- package/src/session/useSessionConversation.ts +38 -3
- package/src/session/useSessionPageFlow.ts +1 -0
- package/src/session/useSessionPanel.ts +288 -0
- package/src/session/useSessionRailViews.tsx +200 -0
- package/src/workflow/WorkflowExecutionGraph.tsx +1 -1
- package/src/workflow/index.ts +1 -1
- package/src/workflow/useFollowExecution.ts +1 -1
- package/src/workspace/EditorTabs.tsx +174 -0
- package/src/workspace/ExplorerTree.tsx +253 -0
- package/src/workspace/FileViewer.tsx +537 -0
- package/src/workspace/WorkspaceContentSearch.tsx +502 -0
- package/src/workspace/WorkspaceContentSearcher.ts +70 -0
- package/src/workspace/WorkspaceEditor.tsx +19 -16
- package/src/workspace/WorkspaceFileLister.ts +11 -0
- package/src/workspace/WorkspaceFileReader.ts +57 -0
- package/src/workspace/WorkspaceFileSearch.tsx +452 -0
- package/src/workspace/WorkspaceSurface.tsx +839 -0
- package/src/workspace/__tests__/EditorTabs.test.tsx +102 -0
- package/src/workspace/__tests__/ExplorerTree.test.tsx +204 -0
- package/src/workspace/__tests__/FileViewer.test.tsx +439 -0
- package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +229 -0
- package/src/workspace/__tests__/WorkspaceEditor-initialPanel.test.tsx +19 -0
- package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +227 -0
- package/src/workspace/__tests__/WorkspaceSurface.test.tsx +418 -0
- package/src/workspace/__tests__/a11y/harness.tsx +140 -0
- package/src/workspace/__tests__/a11y/mock-capabilities.ts +138 -0
- package/src/workspace/__tests__/a11y/workspace-editor.a11y.test.tsx +65 -0
- package/src/workspace/__tests__/a11y/workspace-explorer-search.a11y.test.tsx +112 -0
- package/src/workspace/__tests__/a11y/workspace-viewer-tabs.a11y.test.tsx +69 -0
- package/src/workspace/__tests__/findChangeForSelection.test.ts +132 -0
- package/src/workspace/__tests__/matchContentPreview.test.ts +55 -0
- package/src/workspace/__tests__/matchWorkspaceFiles.test.ts +104 -0
- package/src/workspace/__tests__/resolveWorkspaceFileSelection.test.ts +135 -0
- package/src/workspace/__tests__/useWorkspaceContentSearch.test.tsx +196 -0
- package/src/workspace/__tests__/useWorkspaceFileContent.test.tsx +190 -0
- package/src/workspace/__tests__/useWorkspaceFileSearch.test.tsx +162 -0
- package/src/workspace/findChangeForSelection.ts +61 -0
- package/src/workspace/index.ts +56 -2
- package/src/workspace/matchContentPreview.ts +51 -0
- package/src/workspace/matchWorkspaceFiles.ts +86 -0
- package/src/workspace/resolveWorkspaceFileSelection.ts +119 -0
- package/src/workspace/useWorkspaceContentSearch.ts +228 -0
- package/src/workspace/useWorkspaceFileContent.ts +129 -0
- package/src/workspace/useWorkspaceFileSearch.ts +184 -0
- package/src/workspace/useWorkspaceFiles.ts +27 -27
- package/src/workspace/workspaceListingCache.ts +93 -0
- package/styles.css +1 -1
- package/workflow/WorkflowExecutionGraph.js +1 -1
- package/workflow/WorkflowExecutionGraph.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/useFollowExecution.js +1 -1
- package/workflow/useFollowExecution.js.map +1 -1
- package/workspace/EditorTabs.d.ts +47 -0
- package/workspace/EditorTabs.d.ts.map +1 -0
- package/workspace/EditorTabs.js +78 -0
- package/workspace/EditorTabs.js.map +1 -0
- package/workspace/ExplorerTree.d.ts +32 -0
- package/workspace/ExplorerTree.d.ts.map +1 -0
- package/workspace/ExplorerTree.js +49 -0
- package/workspace/ExplorerTree.js.map +1 -0
- package/workspace/FileViewer.d.ts +93 -0
- package/workspace/FileViewer.d.ts.map +1 -0
- package/workspace/FileViewer.js +193 -0
- package/workspace/FileViewer.js.map +1 -0
- package/workspace/WorkspaceContentSearch.d.ts +41 -0
- package/workspace/WorkspaceContentSearch.d.ts.map +1 -0
- package/workspace/WorkspaceContentSearch.js +216 -0
- package/workspace/WorkspaceContentSearch.js.map +1 -0
- package/workspace/WorkspaceContentSearcher.d.ts +59 -0
- package/workspace/WorkspaceContentSearcher.d.ts.map +1 -0
- package/workspace/WorkspaceContentSearcher.js +7 -0
- package/workspace/WorkspaceContentSearcher.js.map +1 -0
- package/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/workspace/WorkspaceEditor.js +8 -10
- package/workspace/WorkspaceEditor.js.map +1 -1
- package/workspace/WorkspaceFileLister.d.ts +11 -0
- package/workspace/WorkspaceFileLister.d.ts.map +1 -1
- package/workspace/WorkspaceFileReader.d.ts +48 -0
- package/workspace/WorkspaceFileReader.d.ts.map +1 -0
- package/workspace/WorkspaceFileReader.js +11 -0
- package/workspace/WorkspaceFileReader.js.map +1 -0
- package/workspace/WorkspaceFileSearch.d.ts +32 -0
- package/workspace/WorkspaceFileSearch.d.ts.map +1 -0
- package/workspace/WorkspaceFileSearch.js +175 -0
- package/workspace/WorkspaceFileSearch.js.map +1 -0
- package/workspace/WorkspaceSurface.d.ts +151 -0
- package/workspace/WorkspaceSurface.d.ts.map +1 -0
- package/workspace/WorkspaceSurface.js +220 -0
- package/workspace/WorkspaceSurface.js.map +1 -0
- package/workspace/findChangeForSelection.d.ts +19 -0
- package/workspace/findChangeForSelection.d.ts.map +1 -0
- package/workspace/findChangeForSelection.js +46 -0
- package/workspace/findChangeForSelection.js.map +1 -0
- package/workspace/index.d.ts +24 -2
- package/workspace/index.d.ts.map +1 -1
- package/workspace/index.js +13 -1
- package/workspace/index.js.map +1 -1
- package/workspace/matchContentPreview.d.ts +21 -0
- package/workspace/matchContentPreview.d.ts.map +1 -0
- package/workspace/matchContentPreview.js +36 -0
- package/workspace/matchContentPreview.js.map +1 -0
- package/workspace/matchWorkspaceFiles.d.ts +30 -0
- package/workspace/matchWorkspaceFiles.d.ts.map +1 -0
- package/workspace/matchWorkspaceFiles.js +58 -0
- package/workspace/matchWorkspaceFiles.js.map +1 -0
- package/workspace/resolveWorkspaceFileSelection.d.ts +19 -0
- package/workspace/resolveWorkspaceFileSelection.d.ts.map +1 -0
- package/workspace/resolveWorkspaceFileSelection.js +115 -0
- package/workspace/resolveWorkspaceFileSelection.js.map +1 -0
- package/workspace/useWorkspaceContentSearch.d.ts +69 -0
- package/workspace/useWorkspaceContentSearch.d.ts.map +1 -0
- package/workspace/useWorkspaceContentSearch.js +154 -0
- package/workspace/useWorkspaceContentSearch.js.map +1 -0
- package/workspace/useWorkspaceFileContent.d.ts +73 -0
- package/workspace/useWorkspaceFileContent.d.ts.map +1 -0
- package/workspace/useWorkspaceFileContent.js +57 -0
- package/workspace/useWorkspaceFileContent.js.map +1 -0
- package/workspace/useWorkspaceFileSearch.d.ts +61 -0
- package/workspace/useWorkspaceFileSearch.d.ts.map +1 -0
- package/workspace/useWorkspaceFileSearch.js +119 -0
- package/workspace/useWorkspaceFileSearch.js.map +1 -0
- package/workspace/useWorkspaceFiles.d.ts +13 -5
- package/workspace/useWorkspaceFiles.d.ts.map +1 -1
- package/workspace/useWorkspaceFiles.js +18 -19
- package/workspace/useWorkspaceFiles.js.map +1 -1
- package/workspace/workspaceListingCache.d.ts +47 -0
- package/workspace/workspaceListingCache.d.ts.map +1 -0
- package/workspace/workspaceListingCache.js +55 -0
- package/workspace/workspaceListingCache.js.map +1 -0
- package/session/inspector/ArtifactsTab.d.ts.map +0 -1
- package/session/inspector/ArtifactsTab.js.map +0 -1
- package/session/inspector/ChangesTab.d.ts.map +0 -1
- package/session/inspector/ChangesTab.js.map +0 -1
- package/session/inspector/InspectTab.d.ts.map +0 -1
- package/session/inspector/InspectTab.js.map +0 -1
- package/session/inspector/SessionInspector.d.ts +0 -64
- package/session/inspector/SessionInspector.d.ts.map +0 -1
- package/session/inspector/SessionInspector.js +0 -53
- package/session/inspector/SessionInspector.js.map +0 -1
- package/session/inspector/SetupTab.d.ts.map +0 -1
- package/session/inspector/SetupTab.js.map +0 -1
- package/session/inspector/UsageTab.d.ts.map +0 -1
- package/session/inspector/UsageTab.js.map +0 -1
- package/session/inspector/WorkspaceTab.d.ts +0 -35
- package/session/inspector/WorkspaceTab.d.ts.map +0 -1
- package/session/inspector/WorkspaceTab.js +0 -75
- package/session/inspector/WorkspaceTab.js.map +0 -1
- package/session/inspector/index.d.ts.map +0 -1
- package/session/inspector/index.js.map +0 -1
- package/session/inspector/useSessionInspector.d.ts +0 -49
- package/session/inspector/useSessionInspector.d.ts.map +0 -1
- package/session/inspector/useSessionInspector.js +0 -122
- package/session/inspector/useSessionInspector.js.map +0 -1
- package/src/session/inspector/SessionInspector.tsx +0 -162
- package/src/session/inspector/WorkspaceTab.tsx +0 -245
- package/src/session/inspector/__tests__/useSessionInspector.test.ts +0 -251
- package/src/session/inspector/useSessionInspector.ts +0 -178
- package/src/workspace/WorkspaceEntryFiles.tsx +0 -196
- package/workflow/motion-preference.d.ts.map +0 -1
- package/workflow/motion-preference.js.map +0 -1
- package/workspace/WorkspaceEntryFiles.d.ts +0 -22
- package/workspace/WorkspaceEntryFiles.d.ts.map +0 -1
- package/workspace/WorkspaceEntryFiles.js +0 -58
- package/workspace/WorkspaceEntryFiles.js.map +0 -1
- /package/session/{inspector → facets}/InspectTab.d.ts +0 -0
- /package/session/{inspector → facets}/InspectTab.js +0 -0
- /package/src/{workflow → internal}/__tests__/motion-preference.test.ts +0 -0
- /package/src/session/{inspector → facets}/InspectTab.tsx +0 -0
- /package/src/session/{inspector → facets}/__tests__/ChangesTab.test.tsx +0 -0
|
@@ -47,18 +47,32 @@ function renderCard(ui: ReactNode) {
|
|
|
47
47
|
|
|
48
48
|
afterEach(cleanup);
|
|
49
49
|
|
|
50
|
-
describe("PlanArtifactCard —
|
|
51
|
-
it("is an accessible region
|
|
50
|
+
describe("PlanArtifactCard — compact document card", () => {
|
|
51
|
+
it("is an accessible region with the plan's title, filename, and size", () => {
|
|
52
52
|
renderCard(
|
|
53
|
-
<PlanArtifactCard
|
|
53
|
+
<PlanArtifactCard
|
|
54
|
+
executionId="aex_1"
|
|
55
|
+
artifact={planArtifact}
|
|
56
|
+
title="Refactor the auth flow"
|
|
57
|
+
org="acme"
|
|
58
|
+
/>,
|
|
54
59
|
);
|
|
55
60
|
|
|
56
|
-
const region = screen.getByRole("region", { name: "Plan
|
|
57
|
-
expect(region.textContent).toContain("
|
|
61
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
62
|
+
expect(region.textContent).toContain("Refactor the auth flow");
|
|
63
|
+
expect(region.textContent).toContain("plan.md");
|
|
58
64
|
expect(region.textContent).toContain("KB");
|
|
59
65
|
});
|
|
60
66
|
|
|
61
|
-
it("
|
|
67
|
+
it("falls back to 'Plan' when the plan has no title", () => {
|
|
68
|
+
renderCard(
|
|
69
|
+
<PlanArtifactCard executionId="aex_1" artifact={planArtifact} org="acme" />,
|
|
70
|
+
);
|
|
71
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
72
|
+
expect(region.textContent).toContain("Plan");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("does NOT render the plan content (the document lives in the plan tab)", () => {
|
|
62
76
|
const { stigmer, getArtifactContent } = createStigmerMock();
|
|
63
77
|
render(
|
|
64
78
|
withStigmer(
|
|
@@ -66,12 +80,12 @@ describe("PlanArtifactCard — action surface", () => {
|
|
|
66
80
|
stigmer,
|
|
67
81
|
),
|
|
68
82
|
);
|
|
69
|
-
// The card is
|
|
70
|
-
// the
|
|
83
|
+
// The card is the plan's compact stand-in — it must not fetch the plan
|
|
84
|
+
// body; that belongs to the plan tab (or the explicit preview modal).
|
|
71
85
|
expect(getArtifactContent).not.toHaveBeenCalled();
|
|
72
86
|
});
|
|
73
87
|
|
|
74
|
-
it("offers exactly one primary 'Build
|
|
88
|
+
it("offers exactly one primary 'Build' action that calls onImplement", () => {
|
|
75
89
|
const onImplement = vi.fn();
|
|
76
90
|
renderCard(
|
|
77
91
|
<PlanArtifactCard
|
|
@@ -82,18 +96,37 @@ describe("PlanArtifactCard — action surface", () => {
|
|
|
82
96
|
/>,
|
|
83
97
|
);
|
|
84
98
|
|
|
85
|
-
fireEvent.click(screen.
|
|
99
|
+
fireEvent.click(screen.getByRole("button", { name: "Build" }));
|
|
86
100
|
expect(onImplement).toHaveBeenCalledTimes(1);
|
|
87
101
|
});
|
|
88
102
|
|
|
89
|
-
it("hides 'Build
|
|
103
|
+
it("hides 'Build' when onImplement is not provided", () => {
|
|
90
104
|
renderCard(
|
|
91
105
|
<PlanArtifactCard executionId="aex_1" artifact={planArtifact} org="acme" />,
|
|
92
106
|
);
|
|
93
|
-
expect(screen.
|
|
107
|
+
expect(screen.queryByRole("button", { name: "Build" })).toBeNull();
|
|
94
108
|
});
|
|
95
109
|
|
|
96
|
-
it("
|
|
110
|
+
it("shows the pending label while the approved plan uploads (buildPending)", () => {
|
|
111
|
+
renderCard(
|
|
112
|
+
<PlanArtifactCard
|
|
113
|
+
executionId="aex_1"
|
|
114
|
+
artifact={planArtifact}
|
|
115
|
+
org="acme"
|
|
116
|
+
onImplement={vi.fn()}
|
|
117
|
+
disabled
|
|
118
|
+
buildPending
|
|
119
|
+
/>,
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// The primary reads as in-progress and stays disabled — no double-submits
|
|
123
|
+
// while the upload precedes the implement turn.
|
|
124
|
+
expect(screen.queryByRole("button", { name: "Build" })).toBeNull();
|
|
125
|
+
const button = screen.getByText("Starting build…").closest("button")!;
|
|
126
|
+
expect(button.disabled).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("disables 'Build' when disabled", () => {
|
|
97
130
|
const onImplement = vi.fn();
|
|
98
131
|
renderCard(
|
|
99
132
|
<PlanArtifactCard
|
|
@@ -105,12 +138,44 @@ describe("PlanArtifactCard — action surface", () => {
|
|
|
105
138
|
/>,
|
|
106
139
|
);
|
|
107
140
|
|
|
108
|
-
const button = screen.
|
|
141
|
+
const button = screen.getByRole("button", { name: "Build" }) as HTMLButtonElement;
|
|
109
142
|
expect(button.disabled).toBe(true);
|
|
110
143
|
fireEvent.click(button);
|
|
111
144
|
expect(onImplement).not.toHaveBeenCalled();
|
|
112
145
|
});
|
|
113
146
|
|
|
147
|
+
it("copies the plan text to the clipboard on demand", async () => {
|
|
148
|
+
const writeText = vi.fn().mockResolvedValue(undefined);
|
|
149
|
+
vi.stubGlobal("navigator", { clipboard: { writeText } });
|
|
150
|
+
const getArtifactContent = vi
|
|
151
|
+
.fn()
|
|
152
|
+
.mockResolvedValue({ content: new TextEncoder().encode("# Plan\n\nsteps") });
|
|
153
|
+
const getArtifactDownloadUrl = vi.fn();
|
|
154
|
+
const stigmer = {
|
|
155
|
+
agentExecution: { getArtifactContent, getArtifactDownloadUrl },
|
|
156
|
+
} as unknown as Stigmer;
|
|
157
|
+
|
|
158
|
+
render(
|
|
159
|
+
withStigmer(
|
|
160
|
+
<PlanArtifactCard executionId="aex_1" artifact={planArtifact} org="acme" />,
|
|
161
|
+
stigmer,
|
|
162
|
+
),
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
fireEvent.click(screen.getByRole("button", { name: "Copy plan" }));
|
|
166
|
+
|
|
167
|
+
// Content is fetched at click time from the stable storage key, then
|
|
168
|
+
// written to the clipboard — the card never pre-fetches on mount.
|
|
169
|
+
expect(getArtifactContent).toHaveBeenCalledTimes(1);
|
|
170
|
+
const req = getArtifactContent.mock.calls[0][0];
|
|
171
|
+
expect(req.executionId).toBe("aex_1");
|
|
172
|
+
expect(req.storageKey).toBe("artifacts/aex_1/plan.md");
|
|
173
|
+
await screen.findByRole("button", { name: "Copied" });
|
|
174
|
+
expect(writeText).toHaveBeenCalledWith("# Plan\n\nsteps");
|
|
175
|
+
|
|
176
|
+
vi.unstubAllGlobals();
|
|
177
|
+
});
|
|
178
|
+
|
|
114
179
|
it("downloads the artifact on demand via a freshly minted URL", async () => {
|
|
115
180
|
const { stigmer, getArtifactDownloadUrl } = createStigmerMock();
|
|
116
181
|
render(
|
|
@@ -119,7 +184,7 @@ describe("PlanArtifactCard — action surface", () => {
|
|
|
119
184
|
stigmer,
|
|
120
185
|
),
|
|
121
186
|
);
|
|
122
|
-
fireEvent.click(screen.
|
|
187
|
+
fireEvent.click(screen.getByRole("button", { name: "Download plan.md" }));
|
|
123
188
|
// The URL is resolved at click time from the stable storage key — never a
|
|
124
189
|
// baked, expirable URL.
|
|
125
190
|
expect(getArtifactDownloadUrl).toHaveBeenCalledTimes(1);
|
|
@@ -141,7 +206,7 @@ describe("PlanArtifactCard — Cmd/Ctrl+Enter accelerator (card-scoped)", () =>
|
|
|
141
206
|
/>,
|
|
142
207
|
);
|
|
143
208
|
|
|
144
|
-
const region = screen.getByRole("region", { name: "Plan
|
|
209
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
145
210
|
fireEvent.keyDown(region, { key: "Enter", metaKey: true });
|
|
146
211
|
expect(onImplement).toHaveBeenCalledTimes(1);
|
|
147
212
|
});
|
|
@@ -157,7 +222,7 @@ describe("PlanArtifactCard — Cmd/Ctrl+Enter accelerator (card-scoped)", () =>
|
|
|
157
222
|
/>,
|
|
158
223
|
);
|
|
159
224
|
|
|
160
|
-
const region = screen.getByRole("region", { name: "Plan
|
|
225
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
161
226
|
fireEvent.keyDown(region, { key: "Enter", ctrlKey: true });
|
|
162
227
|
expect(onImplement).toHaveBeenCalledTimes(1);
|
|
163
228
|
});
|
|
@@ -173,7 +238,7 @@ describe("PlanArtifactCard — Cmd/Ctrl+Enter accelerator (card-scoped)", () =>
|
|
|
173
238
|
/>,
|
|
174
239
|
);
|
|
175
240
|
|
|
176
|
-
const region = screen.getByRole("region", { name: "Plan
|
|
241
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
177
242
|
fireEvent.keyDown(region, { key: "Enter" });
|
|
178
243
|
expect(onImplement).not.toHaveBeenCalled();
|
|
179
244
|
});
|
|
@@ -190,14 +255,14 @@ describe("PlanArtifactCard — Cmd/Ctrl+Enter accelerator (card-scoped)", () =>
|
|
|
190
255
|
/>,
|
|
191
256
|
);
|
|
192
257
|
|
|
193
|
-
const region = screen.getByRole("region", { name: "Plan
|
|
258
|
+
const region = screen.getByRole("region", { name: "Plan" });
|
|
194
259
|
fireEvent.keyDown(region, { key: "Enter", metaKey: true });
|
|
195
260
|
expect(onImplement).not.toHaveBeenCalled();
|
|
196
261
|
});
|
|
197
262
|
});
|
|
198
263
|
|
|
199
|
-
describe("PlanArtifactCard — Open
|
|
200
|
-
it("opens the shared preview modal when
|
|
264
|
+
describe("PlanArtifactCard — Open plan modal fallback (org-gated preview)", () => {
|
|
265
|
+
it("opens the shared preview modal when the open icon is clicked (no onOpenPlan)", () => {
|
|
201
266
|
const { stigmer } = createStigmerMock();
|
|
202
267
|
render(
|
|
203
268
|
withStigmer(
|
|
@@ -209,14 +274,14 @@ describe("PlanArtifactCard — Open full (org-gated preview)", () => {
|
|
|
209
274
|
// No dialog before the user opens it.
|
|
210
275
|
expect(document.querySelector("dialog")).toBeNull();
|
|
211
276
|
|
|
212
|
-
fireEvent.click(screen.
|
|
277
|
+
fireEvent.click(screen.getByRole("button", { name: "Open plan" }));
|
|
213
278
|
|
|
214
279
|
const dialog = document.querySelector("dialog");
|
|
215
280
|
expect(dialog).toBeTruthy();
|
|
216
281
|
expect(dialog!.getAttribute("aria-label")).toBe("Preview plan.md");
|
|
217
282
|
});
|
|
218
283
|
|
|
219
|
-
it("hides
|
|
284
|
+
it("hides the open action when org is absent (modal needs org), keeping Build + Download", () => {
|
|
220
285
|
const onImplement = vi.fn();
|
|
221
286
|
renderCard(
|
|
222
287
|
<PlanArtifactCard
|
|
@@ -225,8 +290,31 @@ describe("PlanArtifactCard — Open full (org-gated preview)", () => {
|
|
|
225
290
|
onImplement={onImplement}
|
|
226
291
|
/>,
|
|
227
292
|
);
|
|
228
|
-
expect(screen.
|
|
229
|
-
expect(screen.
|
|
230
|
-
expect(
|
|
293
|
+
expect(screen.queryByRole("button", { name: "Open plan" })).toBeNull();
|
|
294
|
+
expect(screen.queryByRole("button", { name: "Build" })).not.toBeNull();
|
|
295
|
+
expect(
|
|
296
|
+
screen.queryByRole("button", { name: "Download plan.md" }),
|
|
297
|
+
).not.toBeNull();
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe("PlanArtifactCard — Open plan (panel-first review)", () => {
|
|
302
|
+
it("routes the open action to the panel when onOpenPlan is provided (no modal)", () => {
|
|
303
|
+
const onOpenPlan = vi.fn();
|
|
304
|
+
renderCard(
|
|
305
|
+
<PlanArtifactCard
|
|
306
|
+
executionId="aex_1"
|
|
307
|
+
artifact={planArtifact}
|
|
308
|
+
org="acme"
|
|
309
|
+
onOpenPlan={onOpenPlan}
|
|
310
|
+
/>,
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
// One review affordance, not two: the facet supersedes the modal.
|
|
314
|
+
expect(screen.getAllByRole("button", { name: "Open plan" })).toHaveLength(1);
|
|
315
|
+
|
|
316
|
+
fireEvent.click(screen.getByRole("button", { name: "Open plan" }));
|
|
317
|
+
expect(onOpenPlan).toHaveBeenCalledTimes(1);
|
|
318
|
+
expect(document.querySelector("dialog")).toBeNull();
|
|
231
319
|
});
|
|
232
320
|
});
|
|
@@ -3,7 +3,7 @@ import { render, fireEvent, cleanup } from "@testing-library/react";
|
|
|
3
3
|
import { PlanCompletionCard } from "../PlanCompletionCard";
|
|
4
4
|
|
|
5
5
|
describe("PlanCompletionCard", () => {
|
|
6
|
-
it("renders the card with status text and a 'Build
|
|
6
|
+
it("renders the card with status text and a 'Build' button", () => {
|
|
7
7
|
const { container } = render(<PlanCompletionCard onImplement={() => {}} />);
|
|
8
8
|
|
|
9
9
|
const root = container.firstElementChild as HTMLElement;
|
|
@@ -13,7 +13,7 @@ describe("PlanCompletionCard", () => {
|
|
|
13
13
|
|
|
14
14
|
const button = root.querySelector("button");
|
|
15
15
|
expect(button).toBeTruthy();
|
|
16
|
-
expect(button!.textContent).toContain("Build
|
|
16
|
+
expect(button!.textContent).toContain("Build");
|
|
17
17
|
|
|
18
18
|
expect(root.textContent).toContain("Plan complete");
|
|
19
19
|
cleanup();
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import { render, screen, cleanup } from "@testing-library/react";
|
|
3
|
+
import { PlanDocumentMessage } from "../PlanDocumentMessage";
|
|
4
|
+
|
|
5
|
+
afterEach(cleanup);
|
|
6
|
+
|
|
7
|
+
describe("PlanDocumentMessage", () => {
|
|
8
|
+
it("lifts the leading H1 into the header and renders the body as markdown", () => {
|
|
9
|
+
render(
|
|
10
|
+
<PlanDocumentMessage
|
|
11
|
+
content={"# Migration Plan\n\n## Phase 1\n\n- step one"}
|
|
12
|
+
/>,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const doc = screen.getByRole("article", { name: "Plan document" });
|
|
16
|
+
expect(doc).toBeTruthy();
|
|
17
|
+
expect(doc.querySelector("header")!.textContent).toContain(
|
|
18
|
+
"Migration Plan",
|
|
19
|
+
);
|
|
20
|
+
// The lifted title does not repeat inside the prose body.
|
|
21
|
+
expect(doc.querySelectorAll("h1")).toHaveLength(0);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("falls back to a 'Plan' header when the document has no leading H1", () => {
|
|
25
|
+
render(<PlanDocumentMessage content="Just prose, no heading." />);
|
|
26
|
+
|
|
27
|
+
const doc = screen.getByRole("article", { name: "Plan document" });
|
|
28
|
+
expect(doc.querySelector("header")!.textContent).toContain("Plan");
|
|
29
|
+
expect(doc.textContent).toContain("Just prose, no heading.");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("unwraps a whole-body BARE fence (plan-scoped fence handling)", () => {
|
|
33
|
+
render(
|
|
34
|
+
<PlanDocumentMessage content={"```\n# Fenced Plan\n\nBody text\n```"} />,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const doc = screen.getByRole("article", { name: "Plan document" });
|
|
38
|
+
// Unwrapped: the H1 became the header title, the body is prose (not a
|
|
39
|
+
// flat code block).
|
|
40
|
+
expect(doc.querySelector("header")!.textContent).toContain("Fenced Plan");
|
|
41
|
+
expect(doc.querySelector("pre")).toBeNull();
|
|
42
|
+
expect(doc.textContent).toContain("Body text");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("keeps an inner code fence as a code block", () => {
|
|
46
|
+
render(
|
|
47
|
+
<PlanDocumentMessage
|
|
48
|
+
content={"# Plan\n\n```ts\nconst x = 1;\n```"}
|
|
49
|
+
/>,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const doc = screen.getByRole("article", { name: "Plan document" });
|
|
53
|
+
expect(doc.querySelector("pre")).not.toBeNull();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { render, screen, fireEvent, cleanup } from "@testing-library/react";
|
|
3
|
+
import { PlanStreamingCard } from "../PlanStreamingCard";
|
|
4
|
+
|
|
5
|
+
afterEach(cleanup);
|
|
6
|
+
|
|
7
|
+
describe("PlanStreamingCard — live plan stand-in", () => {
|
|
8
|
+
it("is a busy region with the streaming title, status, and live size", () => {
|
|
9
|
+
render(
|
|
10
|
+
<PlanStreamingCard
|
|
11
|
+
title="Refactor the auth flow"
|
|
12
|
+
sizeBytes={2048}
|
|
13
|
+
onOpenPlan={vi.fn()}
|
|
14
|
+
/>,
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const region = screen.getByRole("region", { name: "Plan being written" });
|
|
18
|
+
expect(region.getAttribute("aria-busy")).toBe("true");
|
|
19
|
+
expect(region.textContent).toContain("Refactor the auth flow");
|
|
20
|
+
expect(region.textContent).toContain("Writing…");
|
|
21
|
+
expect(region.textContent).toContain("2.0 KB");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("shows no filename mid-stream (the final name is not known yet)", () => {
|
|
25
|
+
render(
|
|
26
|
+
<PlanStreamingCard title="Refactor the auth flow" sizeBytes={2048} onOpenPlan={vi.fn()} />,
|
|
27
|
+
);
|
|
28
|
+
const region = screen.getByRole("region", { name: "Plan being written" });
|
|
29
|
+
expect(region.textContent).not.toContain("plan.md");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("falls back to 'Writing plan…' until the title has streamed in", () => {
|
|
33
|
+
render(<PlanStreamingCard sizeBytes={12} onOpenPlan={vi.fn()} />);
|
|
34
|
+
expect(screen.getByText("Writing plan…")).toBeTruthy();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("routes 'Open plan' to onOpenPlan", () => {
|
|
38
|
+
const onOpenPlan = vi.fn();
|
|
39
|
+
render(<PlanStreamingCard sizeBytes={64} onOpenPlan={onOpenPlan} />);
|
|
40
|
+
|
|
41
|
+
fireEvent.click(screen.getByText("Open plan"));
|
|
42
|
+
expect(onOpenPlan).toHaveBeenCalledTimes(1);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("offers no Download or Build actions — nothing final exists yet", () => {
|
|
46
|
+
render(<PlanStreamingCard sizeBytes={64} onOpenPlan={vi.fn()} />);
|
|
47
|
+
expect(screen.queryByRole("button", { name: /download/i })).toBeNull();
|
|
48
|
+
expect(screen.queryByText("Build")).toBeNull();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("renders without an action when onOpenPlan is absent", () => {
|
|
52
|
+
render(<PlanStreamingCard sizeBytes={64} />);
|
|
53
|
+
expect(screen.queryByText("Open plan")).toBeNull();
|
|
54
|
+
expect(screen.queryByRole("button")).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
});
|