@stigmer/react 3.1.1 → 3.1.2
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 +24 -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/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/MessageEntry.d.ts +29 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +29 -5
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +76 -13
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +178 -24
- package/execution/MessageThread.js.map +1 -1
- package/execution/PlanArtifactCard.d.ts +27 -18
- package/execution/PlanArtifactCard.d.ts.map +1 -1
- package/execution/PlanArtifactCard.js +13 -23
- package/execution/PlanArtifactCard.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 +45 -0
- package/execution/PlanStreamingCard.d.ts.map +1 -0
- package/execution/PlanStreamingCard.js +35 -0
- package/execution/PlanStreamingCard.js.map +1 -0
- package/execution/index.d.ts +5 -1
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +2 -0
- package/execution/index.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +10 -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 +21 -0
- package/library/detect-plan-artifact.d.ts.map +1 -1
- package/library/detect-plan-artifact.js +20 -0
- 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 +315 -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 +9 -0
- package/session/plan-document.d.ts.map +1 -0
- package/session/plan-document.js +17 -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 +6 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +1 -0
- 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 +52 -10
- package/src/composer/__tests__/SessionComposer-contract.test.tsx +58 -4
- package/src/execution/ArtifactContentRenderer.tsx +101 -24
- package/src/execution/FilePathContext.tsx +8 -1
- package/src/execution/FilePathLink.tsx +22 -6
- package/src/execution/MessageEntry.tsx +111 -1
- package/src/execution/MessageThread.tsx +291 -36
- package/src/execution/PlanArtifactCard.tsx +63 -31
- package/src/execution/PlanDocumentMessage.tsx +96 -0
- package/src/execution/PlanStreamingCard.tsx +137 -0
- package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +80 -1
- package/src/execution/__tests__/FilePathLink.test.tsx +87 -0
- package/src/execution/__tests__/MessageThread.test.tsx +101 -0
- package/src/execution/__tests__/PlanArtifactCard.test.tsx +66 -12
- package/src/execution/__tests__/PlanDocumentMessage.test.tsx +55 -0
- package/src/execution/__tests__/PlanStreamingCard.test.tsx +49 -0
- package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +504 -22
- package/src/execution/__tests__/message-entry.test.tsx +48 -0
- package/src/execution/__tests__/useCreateAgentExecution.test.tsx +85 -0
- package/src/execution/index.ts +7 -1
- package/src/execution/useCreateAgentExecution.ts +16 -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 +63 -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 +43 -3
- 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 +48 -0
- package/src/library/__tests__/detect-streaming-plan.test.ts +234 -0
- package/src/library/detect-plan-artifact.ts +35 -0
- package/src/library/detect-streaming-plan.ts +108 -0
- package/src/library/index.ts +5 -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 +617 -90
- 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 +9 -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__/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 +35 -1
- 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 +19 -0
- package/src/session/useOpenFileChange.ts +53 -0
- package/src/session/usePlanDraft.ts +109 -0
- package/src/session/useSessionConversation.ts +7 -0
- 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 +145 -0
- package/src/workspace/ExplorerTree.tsx +247 -0
- package/src/workspace/FileViewer.tsx +516 -0
- package/src/workspace/WorkspaceContentSearch.tsx +478 -0
- package/src/workspace/WorkspaceContentSearcher.ts +70 -0
- package/src/workspace/WorkspaceFileLister.ts +11 -0
- package/src/workspace/WorkspaceFileReader.ts +57 -0
- package/src/workspace/WorkspaceFileSearch.tsx +429 -0
- package/src/workspace/WorkspaceSurface.tsx +781 -0
- package/src/workspace/__tests__/EditorTabs.test.tsx +100 -0
- package/src/workspace/__tests__/ExplorerTree.test.tsx +152 -0
- package/src/workspace/__tests__/FileViewer.test.tsx +421 -0
- package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +196 -0
- package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +206 -0
- package/src/workspace/__tests__/WorkspaceSurface.test.tsx +348 -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 +29 -0
- package/workspace/EditorTabs.d.ts.map +1 -0
- package/workspace/EditorTabs.js +66 -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 +45 -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 +182 -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 +195 -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/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 +155 -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 +184 -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
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { renderHook, act } from "@testing-library/react";
|
|
3
|
-
import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
4
|
-
import {
|
|
5
|
-
useSessionInspector,
|
|
6
|
-
buildVisibleTabs,
|
|
7
|
-
type UseSessionInspectorOptions,
|
|
8
|
-
} from "../useSessionInspector";
|
|
9
|
-
|
|
10
|
-
function defaultOpts(overrides?: Partial<UseSessionInspectorOptions>): UseSessionInspectorOptions {
|
|
11
|
-
return {
|
|
12
|
-
phase: null,
|
|
13
|
-
hasWriteBacks: false,
|
|
14
|
-
writeBackCount: 0,
|
|
15
|
-
hasArtifacts: false,
|
|
16
|
-
artifactCount: 0,
|
|
17
|
-
hasUsage: false,
|
|
18
|
-
selectedItem: null,
|
|
19
|
-
...overrides,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function tabOpts(
|
|
24
|
-
overrides?: Partial<Parameters<typeof buildVisibleTabs>[0]>,
|
|
25
|
-
): Parameters<typeof buildVisibleTabs>[0] {
|
|
26
|
-
return {
|
|
27
|
-
hasWriteBacks: false,
|
|
28
|
-
writeBackCount: 0,
|
|
29
|
-
hasArtifacts: false,
|
|
30
|
-
artifactCount: 0,
|
|
31
|
-
hasUsage: false,
|
|
32
|
-
selectedItem: null,
|
|
33
|
-
...overrides,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// buildVisibleTabs
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
|
|
41
|
-
describe("buildVisibleTabs", () => {
|
|
42
|
-
it("always includes Workspace, Config, and Usage (Plan is gone — todos render inline)", () => {
|
|
43
|
-
const tabs = buildVisibleTabs(tabOpts());
|
|
44
|
-
const ids = tabs.map((t) => t.id);
|
|
45
|
-
expect(ids).toContain("workspace");
|
|
46
|
-
expect(ids).toContain("configure");
|
|
47
|
-
expect(ids).toContain("usage");
|
|
48
|
-
expect(ids).not.toContain("plan");
|
|
49
|
-
expect(ids).not.toContain("changes");
|
|
50
|
-
expect(ids).not.toContain("artifacts");
|
|
51
|
-
expect(ids).not.toContain("inspect");
|
|
52
|
-
|
|
53
|
-
const configTab = tabs.find((t) => t.id === "configure");
|
|
54
|
-
expect(configTab?.label).toBe("Config");
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// The Changes tab is exclusively the write-back (PR) surface: local file
|
|
58
|
-
// changes render in the transcript (edit rows + decision bar) and no longer
|
|
59
|
-
// surface — or badge — a tab.
|
|
60
|
-
it("includes Changes with badge only when write-backs exist", () => {
|
|
61
|
-
const tabs = buildVisibleTabs(tabOpts({ hasWriteBacks: true, writeBackCount: 3 }));
|
|
62
|
-
const changesTab = tabs.find((t) => t.id === "changes");
|
|
63
|
-
expect(changesTab).toBeDefined();
|
|
64
|
-
expect(changesTab?.badge).toBe(3);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("includes Artifacts with badge when artifacts exist", () => {
|
|
68
|
-
const tabs = buildVisibleTabs(tabOpts({ hasArtifacts: true, artifactCount: 7 }));
|
|
69
|
-
const artifactsTab = tabs.find((t) => t.id === "artifacts");
|
|
70
|
-
expect(artifactsTab).toBeDefined();
|
|
71
|
-
expect(artifactsTab?.badge).toBe(7);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("includes Inspect when a thread item is selected", () => {
|
|
75
|
-
const tabs = buildVisibleTabs(
|
|
76
|
-
tabOpts({ selectedItem: { kind: "tool-call", toolCallId: "tc-1" } }),
|
|
77
|
-
);
|
|
78
|
-
const inspectTab = tabs.find((t) => t.id === "inspect");
|
|
79
|
-
expect(inspectTab).toBeDefined();
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it("orders tabs as Workspace, Config, then Usage with Inspect last", () => {
|
|
83
|
-
const tabs = buildVisibleTabs(
|
|
84
|
-
tabOpts({
|
|
85
|
-
hasWriteBacks: true,
|
|
86
|
-
writeBackCount: 2,
|
|
87
|
-
hasArtifacts: true,
|
|
88
|
-
artifactCount: 1,
|
|
89
|
-
hasUsage: true,
|
|
90
|
-
selectedItem: { kind: "tool-call", toolCallId: "tc-1" },
|
|
91
|
-
}),
|
|
92
|
-
);
|
|
93
|
-
const ids = tabs.map((t) => t.id);
|
|
94
|
-
expect(ids.indexOf("workspace")).toBeLessThan(ids.indexOf("configure"));
|
|
95
|
-
expect(ids.indexOf("configure")).toBeLessThan(ids.indexOf("usage"));
|
|
96
|
-
expect(ids.indexOf("usage")).toBeLessThan(ids.indexOf("inspect"));
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it("base tabs are present even when no optional tabs exist", () => {
|
|
100
|
-
const tabs = buildVisibleTabs(tabOpts());
|
|
101
|
-
const ids = tabs.map((t) => t.id);
|
|
102
|
-
expect(ids).toEqual(["workspace", "configure", "usage"]);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// ---------------------------------------------------------------------------
|
|
107
|
-
// useSessionInspector FSM
|
|
108
|
-
// ---------------------------------------------------------------------------
|
|
109
|
-
|
|
110
|
-
describe("useSessionInspector", () => {
|
|
111
|
-
it("defaults to workspace when no execution is active (phase=null)", () => {
|
|
112
|
-
const { result } = renderHook(() => useSessionInspector(defaultOpts()));
|
|
113
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it("defaults to workspace when execution is terminal", () => {
|
|
117
|
-
const { result } = renderHook(() =>
|
|
118
|
-
useSessionInspector(
|
|
119
|
-
defaultOpts({ phase: ExecutionPhase.EXECUTION_COMPLETED }),
|
|
120
|
-
),
|
|
121
|
-
);
|
|
122
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("defaults to workspace while execution is running (todos render inline, not in a tab)", () => {
|
|
126
|
-
const { result } = renderHook(() =>
|
|
127
|
-
useSessionInspector(
|
|
128
|
-
defaultOpts({ phase: ExecutionPhase.EXECUTION_IN_PROGRESS }),
|
|
129
|
-
),
|
|
130
|
-
);
|
|
131
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it("auto-switches to inspect when a thread item is selected", () => {
|
|
135
|
-
const { result, rerender } = renderHook(
|
|
136
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
137
|
-
{ initialProps: defaultOpts() },
|
|
138
|
-
);
|
|
139
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
140
|
-
|
|
141
|
-
rerender(
|
|
142
|
-
defaultOpts({ selectedItem: { kind: "tool-call", toolCallId: "tc-1" } }),
|
|
143
|
-
);
|
|
144
|
-
expect(result.current.activeTab).toBe("inspect");
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it("reverts to workspace when selection is cleared (phase=null) and user did not pick a tab", () => {
|
|
148
|
-
const { result, rerender } = renderHook(
|
|
149
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
150
|
-
{
|
|
151
|
-
initialProps: defaultOpts({
|
|
152
|
-
selectedItem: { kind: "tool-call", toolCallId: "tc-1" },
|
|
153
|
-
}),
|
|
154
|
-
},
|
|
155
|
-
);
|
|
156
|
-
expect(result.current.activeTab).toBe("inspect");
|
|
157
|
-
|
|
158
|
-
rerender(defaultOpts({ selectedItem: null }));
|
|
159
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("reverts to workspace when selection is cleared while execution is running", () => {
|
|
163
|
-
const { result, rerender } = renderHook(
|
|
164
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
165
|
-
{
|
|
166
|
-
initialProps: defaultOpts({
|
|
167
|
-
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
168
|
-
selectedItem: { kind: "tool-call", toolCallId: "tc-1" },
|
|
169
|
-
}),
|
|
170
|
-
},
|
|
171
|
-
);
|
|
172
|
-
expect(result.current.activeTab).toBe("inspect");
|
|
173
|
-
|
|
174
|
-
rerender(
|
|
175
|
-
defaultOpts({
|
|
176
|
-
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
177
|
-
selectedItem: null,
|
|
178
|
-
}),
|
|
179
|
-
);
|
|
180
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it("keeps user-picked tab sticky", () => {
|
|
184
|
-
const { result, rerender } = renderHook(
|
|
185
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
186
|
-
{ initialProps: defaultOpts({ hasUsage: true }) },
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
act(() => {
|
|
190
|
-
result.current.onTabChange("usage");
|
|
191
|
-
});
|
|
192
|
-
expect(result.current.activeTab).toBe("usage");
|
|
193
|
-
|
|
194
|
-
rerender(
|
|
195
|
-
defaultOpts({
|
|
196
|
-
hasUsage: true,
|
|
197
|
-
selectedItem: { kind: "tool-call", toolCallId: "tc-1" },
|
|
198
|
-
}),
|
|
199
|
-
);
|
|
200
|
-
expect(result.current.activeTab).toBe("usage");
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it("auto-switches to changes when first write-back arrives", () => {
|
|
204
|
-
const { result, rerender } = renderHook(
|
|
205
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
206
|
-
{ initialProps: defaultOpts() },
|
|
207
|
-
);
|
|
208
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
209
|
-
|
|
210
|
-
rerender(
|
|
211
|
-
defaultOpts({ hasWriteBacks: true, writeBackCount: 1 }),
|
|
212
|
-
);
|
|
213
|
-
expect(result.current.activeTab).toBe("changes");
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it("falls back to workspace when active tab is removed from visible tabs (phase=null)", () => {
|
|
217
|
-
const { result, rerender } = renderHook(
|
|
218
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
219
|
-
{
|
|
220
|
-
initialProps: defaultOpts({
|
|
221
|
-
selectedItem: { kind: "tool-call", toolCallId: "tc-1" },
|
|
222
|
-
}),
|
|
223
|
-
},
|
|
224
|
-
);
|
|
225
|
-
expect(result.current.activeTab).toBe("inspect");
|
|
226
|
-
|
|
227
|
-
act(() => {
|
|
228
|
-
result.current.onTabChange("inspect");
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
rerender(defaultOpts({ selectedItem: null }));
|
|
232
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("stays on workspace across the running → terminal transition", () => {
|
|
236
|
-
const { result, rerender } = renderHook(
|
|
237
|
-
(props: UseSessionInspectorOptions) => useSessionInspector(props),
|
|
238
|
-
{
|
|
239
|
-
initialProps: defaultOpts({
|
|
240
|
-
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
241
|
-
}),
|
|
242
|
-
},
|
|
243
|
-
);
|
|
244
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
245
|
-
|
|
246
|
-
rerender(
|
|
247
|
-
defaultOpts({ phase: ExecutionPhase.EXECUTION_COMPLETED }),
|
|
248
|
-
);
|
|
249
|
-
expect(result.current.activeTab).toBe("workspace");
|
|
250
|
-
});
|
|
251
|
-
});
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useCallback, useRef, useState } from "react";
|
|
4
|
-
import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
|
-
import type { TabItem } from "../../tabs/Tabs.js";
|
|
6
|
-
import { isTerminalPhase } from "../../execution/execution-phases.js";
|
|
7
|
-
import type { SelectedThreadItem } from "../../internal/store/selection-store.js";
|
|
8
|
-
|
|
9
|
-
export type SessionInspectorTabId =
|
|
10
|
-
| "workspace"
|
|
11
|
-
| "configure"
|
|
12
|
-
| "changes"
|
|
13
|
-
| "artifacts"
|
|
14
|
-
| "usage"
|
|
15
|
-
| "inspect";
|
|
16
|
-
|
|
17
|
-
export interface UseSessionInspectorOptions {
|
|
18
|
-
readonly phase: ExecutionPhase | null;
|
|
19
|
-
readonly hasWriteBacks: boolean;
|
|
20
|
-
readonly writeBackCount: number;
|
|
21
|
-
readonly hasArtifacts: boolean;
|
|
22
|
-
readonly artifactCount: number;
|
|
23
|
-
readonly hasUsage: boolean;
|
|
24
|
-
readonly selectedItem: SelectedThreadItem | null;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface UseSessionInspectorReturn {
|
|
28
|
-
readonly tabs: readonly TabItem[];
|
|
29
|
-
readonly activeTab: SessionInspectorTabId;
|
|
30
|
-
readonly onTabChange: (tabId: string) => void;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Compute the system-suggested tab from selection.
|
|
35
|
-
*
|
|
36
|
-
* Priority:
|
|
37
|
-
* 1. Thread item selected -> "inspect"
|
|
38
|
-
* 2. Otherwise -> "workspace"
|
|
39
|
-
*
|
|
40
|
-
* Live execution progress (the agent's plan and todos) now renders inline in
|
|
41
|
-
* the message thread as a {@link TodoCard}, not in a sidebar tab — so a running
|
|
42
|
-
* execution no longer steers the inspector to a dedicated facet.
|
|
43
|
-
*/
|
|
44
|
-
function deriveAutoTab(
|
|
45
|
-
selectedItem: SelectedThreadItem | null,
|
|
46
|
-
): SessionInspectorTabId {
|
|
47
|
-
if (selectedItem) return "inspect";
|
|
48
|
-
return "workspace";
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Build the contextual tab list with badges.
|
|
53
|
-
*
|
|
54
|
-
* Tab order follows the user's mental model — context before output:
|
|
55
|
-
* Workspace → Config → Usage. Changes and Artifacts appear after Config
|
|
56
|
-
* when data exists; Inspect appears last when a thread item is selected.
|
|
57
|
-
*
|
|
58
|
-
* The Changes tab surfaces only when git write-backs (PRs) exist, badged
|
|
59
|
-
* with their count. Local-workspace file edits never surface a tab: they
|
|
60
|
-
* render in the transcript (stamped edit rows + the per-turn decision bar),
|
|
61
|
-
* which is their single review surface.
|
|
62
|
-
*/
|
|
63
|
-
export function buildVisibleTabs(opts: {
|
|
64
|
-
hasWriteBacks: boolean;
|
|
65
|
-
writeBackCount: number;
|
|
66
|
-
hasArtifacts: boolean;
|
|
67
|
-
artifactCount: number;
|
|
68
|
-
hasUsage: boolean;
|
|
69
|
-
selectedItem: SelectedThreadItem | null;
|
|
70
|
-
}): TabItem[] {
|
|
71
|
-
const tabs: TabItem[] = [
|
|
72
|
-
{ id: "workspace", label: "Workspace" },
|
|
73
|
-
{ id: "configure", label: "Config" },
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
if (opts.hasWriteBacks) {
|
|
77
|
-
tabs.push({
|
|
78
|
-
id: "changes",
|
|
79
|
-
label: "Changes",
|
|
80
|
-
badge: opts.writeBackCount,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (opts.hasArtifacts) {
|
|
85
|
-
tabs.push({
|
|
86
|
-
id: "artifacts",
|
|
87
|
-
label: "Artifacts",
|
|
88
|
-
badge: opts.artifactCount,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
tabs.push({ id: "usage", label: "Usage" });
|
|
93
|
-
|
|
94
|
-
if (opts.selectedItem) {
|
|
95
|
-
tabs.push({ id: "inspect", label: "Inspect" });
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return tabs;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Behavior hook for SessionInspector tab state management.
|
|
103
|
-
*
|
|
104
|
-
* Uses the "adjust state during render" pattern from the workflow
|
|
105
|
-
* `ExecutionInspector`: shadow `prevPhase`/`prevSelected` state,
|
|
106
|
-
* `userPickedTabRef` for sticky manual picks, and `deriveAutoTab`
|
|
107
|
-
* for system suggestions. Keeps the user's tab pick sticky until
|
|
108
|
-
* a meaningful state change resets it.
|
|
109
|
-
*/
|
|
110
|
-
export function useSessionInspector(
|
|
111
|
-
opts: UseSessionInspectorOptions,
|
|
112
|
-
): UseSessionInspectorReturn {
|
|
113
|
-
const { phase, hasWriteBacks, writeBackCount, hasArtifacts, artifactCount, hasUsage, selectedItem } = opts;
|
|
114
|
-
|
|
115
|
-
const tabs = buildVisibleTabs({ hasWriteBacks, writeBackCount, hasArtifacts, artifactCount, hasUsage, selectedItem });
|
|
116
|
-
|
|
117
|
-
// A write-back (the session's only tab-worthy change source) surfaces and
|
|
118
|
-
// auto-selects the Changes tab on first arrival.
|
|
119
|
-
const hasChanges = hasWriteBacks;
|
|
120
|
-
|
|
121
|
-
const [activeTab, setActiveTab] = useState<SessionInspectorTabId>(
|
|
122
|
-
() => deriveAutoTab(selectedItem),
|
|
123
|
-
);
|
|
124
|
-
const [prevPhase, setPrevPhase] = useState(phase);
|
|
125
|
-
const [prevSelected, setPrevSelected] = useState(selectedItem);
|
|
126
|
-
const [prevHasChanges, setPrevHasChanges] = useState(hasChanges);
|
|
127
|
-
const userPickedTabRef = useRef(false);
|
|
128
|
-
|
|
129
|
-
// Selection changed → auto-switch to inspect (unless user picked)
|
|
130
|
-
if (selectedItem !== prevSelected) {
|
|
131
|
-
setPrevSelected(selectedItem);
|
|
132
|
-
if (selectedItem && !userPickedTabRef.current) {
|
|
133
|
-
setActiveTab("inspect");
|
|
134
|
-
}
|
|
135
|
-
if (!selectedItem && activeTab === "inspect") {
|
|
136
|
-
setActiveTab(deriveAutoTab(null));
|
|
137
|
-
userPickedTabRef.current = false;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Phase changed → reset user pick if transitioning from non-terminal to terminal or vice versa
|
|
142
|
-
if (phase !== prevPhase) {
|
|
143
|
-
const wasTerminal = prevPhase !== null && isTerminalPhase(prevPhase);
|
|
144
|
-
const isNowTerminal = phase !== null && isTerminalPhase(phase);
|
|
145
|
-
setPrevPhase(phase);
|
|
146
|
-
if (wasTerminal !== isNowTerminal) {
|
|
147
|
-
userPickedTabRef.current = false;
|
|
148
|
-
setActiveTab(deriveAutoTab(selectedItem));
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// First write-back arrived → auto-switch to changes
|
|
153
|
-
if (hasChanges && !prevHasChanges) {
|
|
154
|
-
setPrevHasChanges(hasChanges);
|
|
155
|
-
if (!userPickedTabRef.current) {
|
|
156
|
-
setActiveTab("changes");
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
if (hasChanges !== prevHasChanges) {
|
|
160
|
-
setPrevHasChanges(hasChanges);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Ensure active tab is valid (the selected tab may have been removed)
|
|
164
|
-
const effectiveTab = tabs.some((t) => t.id === activeTab)
|
|
165
|
-
? activeTab
|
|
166
|
-
: deriveAutoTab(selectedItem);
|
|
167
|
-
|
|
168
|
-
const onTabChange = useCallback((tabId: string) => {
|
|
169
|
-
userPickedTabRef.current = true;
|
|
170
|
-
setActiveTab(tabId as SessionInspectorTabId);
|
|
171
|
-
}, []);
|
|
172
|
-
|
|
173
|
-
return {
|
|
174
|
-
tabs,
|
|
175
|
-
activeTab: effectiveTab,
|
|
176
|
-
onTabChange,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useCallback, useMemo, useState } from "react";
|
|
4
|
-
import { cn } from "@stigmer/theme";
|
|
5
|
-
import { FileTreeNode, filterFileTree } from "../internal/file-tree/index.js";
|
|
6
|
-
import { useWorkspaceFiles } from "./useWorkspaceFiles.js";
|
|
7
|
-
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
8
|
-
import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
|
|
9
|
-
|
|
10
|
-
export interface WorkspaceEntryFilesProps {
|
|
11
|
-
/** The workspace entry whose files to browse. */
|
|
12
|
-
readonly entry: WorkspaceEntry;
|
|
13
|
-
/** Platform-injected file lister. */
|
|
14
|
-
readonly lister: WorkspaceFileLister;
|
|
15
|
-
/** Whether the file tree panel is currently expanded. */
|
|
16
|
-
readonly isExpanded: boolean;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Inline expandable file tree for a single workspace entry.
|
|
21
|
-
*
|
|
22
|
-
* When `isExpanded` is `true`, calls the platform-injected lister and
|
|
23
|
-
* renders a scrollable tree using the shared `FileTreeNode` primitive.
|
|
24
|
-
* Renders loading skeletons, error states, empty states, and a
|
|
25
|
-
* search toolbar for filtering the file tree by name.
|
|
26
|
-
*
|
|
27
|
-
* All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
28
|
-
*/
|
|
29
|
-
export function WorkspaceEntryFiles({
|
|
30
|
-
entry,
|
|
31
|
-
lister,
|
|
32
|
-
isExpanded,
|
|
33
|
-
}: WorkspaceEntryFilesProps) {
|
|
34
|
-
const { tree, isLoading, error, refresh } = useWorkspaceFiles({
|
|
35
|
-
entry: isExpanded ? entry : null,
|
|
36
|
-
lister,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const [selectedPath, setSelectedPath] = useState<string>("");
|
|
40
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
41
|
-
|
|
42
|
-
const filteredTree = useMemo(
|
|
43
|
-
() => filterFileTree(tree, searchQuery),
|
|
44
|
-
[tree, searchQuery],
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
const isFiltering = searchQuery.trim().length > 0;
|
|
48
|
-
|
|
49
|
-
const handleRefresh = useCallback(
|
|
50
|
-
(e: React.MouseEvent) => {
|
|
51
|
-
e.stopPropagation();
|
|
52
|
-
refresh();
|
|
53
|
-
},
|
|
54
|
-
[refresh],
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const handleClearSearch = useCallback(() => {
|
|
58
|
-
setSearchQuery("");
|
|
59
|
-
}, []);
|
|
60
|
-
|
|
61
|
-
if (!isExpanded) return null;
|
|
62
|
-
|
|
63
|
-
if (isLoading) {
|
|
64
|
-
return (
|
|
65
|
-
<div
|
|
66
|
-
className="mt-1 space-y-1.5 rounded-md border border-border bg-muted-faint px-2 py-2"
|
|
67
|
-
aria-busy="true"
|
|
68
|
-
aria-label={`Loading files for ${entry.name}`}
|
|
69
|
-
>
|
|
70
|
-
{[1, 2, 3, 4].map((i) => (
|
|
71
|
-
<div key={i} className="h-3.5 animate-pulse rounded bg-muted" style={{ width: `${50 + i * 10}%` }} />
|
|
72
|
-
))}
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (error) {
|
|
78
|
-
return (
|
|
79
|
-
<div className="mt-1 rounded-md border border-border bg-muted-faint px-2.5 py-2 text-xs text-destructive">
|
|
80
|
-
Failed to list files: {error.message}
|
|
81
|
-
<button
|
|
82
|
-
type="button"
|
|
83
|
-
onClick={handleRefresh}
|
|
84
|
-
className="ml-2 underline hover:text-destructive transition-colors"
|
|
85
|
-
>
|
|
86
|
-
Retry
|
|
87
|
-
</button>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (tree.length === 0) {
|
|
93
|
-
return (
|
|
94
|
-
<div className="mt-1 rounded-md border border-border bg-muted-faint px-2.5 py-2">
|
|
95
|
-
<p className="text-xs text-muted-foreground">
|
|
96
|
-
No files found.
|
|
97
|
-
</p>
|
|
98
|
-
</div>
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return (
|
|
103
|
-
<div className="mt-1 rounded-md border border-border bg-muted-faint overflow-hidden">
|
|
104
|
-
<div className="flex items-center gap-1.5 border-b border-border px-2 py-1">
|
|
105
|
-
<SearchIcon />
|
|
106
|
-
<input
|
|
107
|
-
type="text"
|
|
108
|
-
value={searchQuery}
|
|
109
|
-
onChange={(e) => setSearchQuery(e.target.value)}
|
|
110
|
-
placeholder="Search files..."
|
|
111
|
-
className={cn(
|
|
112
|
-
"min-w-0 flex-1 bg-transparent text-xs text-foreground",
|
|
113
|
-
"placeholder:text-muted-foreground",
|
|
114
|
-
"focus-visible:outline-none",
|
|
115
|
-
)}
|
|
116
|
-
aria-label={`Filter files in ${entry.name}`}
|
|
117
|
-
/>
|
|
118
|
-
{isFiltering && (
|
|
119
|
-
<button
|
|
120
|
-
type="button"
|
|
121
|
-
onClick={handleClearSearch}
|
|
122
|
-
className="shrink-0 text-muted-foreground hover:text-foreground transition-colors"
|
|
123
|
-
aria-label="Clear search"
|
|
124
|
-
>
|
|
125
|
-
<ClearIcon />
|
|
126
|
-
</button>
|
|
127
|
-
)}
|
|
128
|
-
<button
|
|
129
|
-
type="button"
|
|
130
|
-
onClick={handleRefresh}
|
|
131
|
-
className={cn(
|
|
132
|
-
"shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground transition-colors",
|
|
133
|
-
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
134
|
-
)}
|
|
135
|
-
aria-label={`Refresh file listing for ${entry.name}`}
|
|
136
|
-
>
|
|
137
|
-
<RefreshIcon />
|
|
138
|
-
</button>
|
|
139
|
-
</div>
|
|
140
|
-
{filteredTree.length === 0 ? (
|
|
141
|
-
<div className="px-2.5 py-3 text-center text-xs text-muted-foreground">
|
|
142
|
-
No files matching “{searchQuery.trim()}”
|
|
143
|
-
</div>
|
|
144
|
-
) : (
|
|
145
|
-
<nav
|
|
146
|
-
className="overflow-y-auto"
|
|
147
|
-
aria-label={`File tree for ${entry.name}`}
|
|
148
|
-
>
|
|
149
|
-
<ul className="py-0.5" role="tree">
|
|
150
|
-
{filteredTree.map((node) => (
|
|
151
|
-
<FileTreeNode
|
|
152
|
-
key={node.path}
|
|
153
|
-
node={node}
|
|
154
|
-
selectedPath={selectedPath}
|
|
155
|
-
onSelect={setSelectedPath}
|
|
156
|
-
depth={0}
|
|
157
|
-
enableDrag
|
|
158
|
-
maxInitialDepth={isFiltering ? Infinity : 0}
|
|
159
|
-
/>
|
|
160
|
-
))}
|
|
161
|
-
</ul>
|
|
162
|
-
</nav>
|
|
163
|
-
)}
|
|
164
|
-
</div>
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Icons (SDK independence — no lucide dependency)
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
|
|
172
|
-
function SearchIcon() {
|
|
173
|
-
return (
|
|
174
|
-
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" className="shrink-0 text-muted-foreground">
|
|
175
|
-
<circle cx="5.25" cy="5.25" r="3.5" />
|
|
176
|
-
<path d="M7.75 7.75L10.5 10.5" />
|
|
177
|
-
</svg>
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function ClearIcon() {
|
|
182
|
-
return (
|
|
183
|
-
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
184
|
-
<path d="M3 3L9 9M9 3L3 9" />
|
|
185
|
-
</svg>
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function RefreshIcon() {
|
|
190
|
-
return (
|
|
191
|
-
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
192
|
-
<path d="M1.5 6a4.5 4.5 0 017.794-3.073M10.5 6a4.5 4.5 0 01-7.794 3.073" />
|
|
193
|
-
<path d="M9.5 1v2.5H7M2.5 11V8.5H5" />
|
|
194
|
-
</svg>
|
|
195
|
-
);
|
|
196
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"motion-preference.d.ts","sourceRoot":"","sources":["../../src/workflow/motion-preference.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAY9C;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"motion-preference.js","sourceRoot":"","sources":["../../src/workflow/motion-preference.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,IAAI,gBAAgB,GAAmB,IAAI,CAAC;AAC5C,IAAI,UAAU,GAA0B,IAAI,CAAC;AAE7C,SAAS,aAAa;IACpB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAEtB,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC;QAC9B,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YAClC,gBAAgB,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
2
|
-
import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
|
|
3
|
-
export interface WorkspaceEntryFilesProps {
|
|
4
|
-
/** The workspace entry whose files to browse. */
|
|
5
|
-
readonly entry: WorkspaceEntry;
|
|
6
|
-
/** Platform-injected file lister. */
|
|
7
|
-
readonly lister: WorkspaceFileLister;
|
|
8
|
-
/** Whether the file tree panel is currently expanded. */
|
|
9
|
-
readonly isExpanded: boolean;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Inline expandable file tree for a single workspace entry.
|
|
13
|
-
*
|
|
14
|
-
* When `isExpanded` is `true`, calls the platform-injected lister and
|
|
15
|
-
* renders a scrollable tree using the shared `FileTreeNode` primitive.
|
|
16
|
-
* Renders loading skeletons, error states, empty states, and a
|
|
17
|
-
* search toolbar for filtering the file tree by name.
|
|
18
|
-
*
|
|
19
|
-
* All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
20
|
-
*/
|
|
21
|
-
export declare function WorkspaceEntryFiles({ entry, lister, isExpanded, }: WorkspaceEntryFilesProps): import("react/jsx-runtime").JSX.Element | null;
|
|
22
|
-
//# sourceMappingURL=WorkspaceEntryFiles.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceEntryFiles.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceEntryFiles.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,MAAM,EACN,UAAU,GACX,EAAE,wBAAwB,kDAqI1B"}
|