@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceSurface.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceSurface.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useId, useRef, useState, } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { ResizableSplit } from "../internal/ResizableSplit.js";
|
|
6
|
+
import { editorKey, } from "../internal/store/index.js";
|
|
7
|
+
import { WorkspaceFileSearch } from "./WorkspaceFileSearch.js";
|
|
8
|
+
import { WorkspaceContentSearch } from "./WorkspaceContentSearch.js";
|
|
9
|
+
import { FileViewer } from "./FileViewer.js";
|
|
10
|
+
import { EditorTabs, editorTabDomId } from "./EditorTabs.js";
|
|
11
|
+
import { ExplorerTree } from "./ExplorerTree.js";
|
|
12
|
+
/** The built-in rail views every surface has. */
|
|
13
|
+
const BUILT_IN_VIEWS = ["files", "search"];
|
|
14
|
+
/**
|
|
15
|
+
* A VS Code / Cursor-inspired read-only workspace surface: a slim activity rail
|
|
16
|
+
* (Explorer / Search), a resizable sidebar, and a large editor area.
|
|
17
|
+
*
|
|
18
|
+
* This is the workspace-dominant counterpart to the inspector's cramped Viewer
|
|
19
|
+
* tab. The session viewer flips its layout to give this surface the majority of
|
|
20
|
+
* the screen while chat becomes a narrow column (see `SessionViewer`). It is a
|
|
21
|
+
* self-contained organism: given `entries`, a `lister`, a `reader`, and the
|
|
22
|
+
* open-file selection, it renders identically inside the Console or embedded in
|
|
23
|
+
* a third-party host (DD-004). Explicitly read-only — no editing, no commit UI.
|
|
24
|
+
*
|
|
25
|
+
* All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
26
|
+
*/
|
|
27
|
+
export function WorkspaceSurface({ entries, lister, reader, searcher, view, onViewChange, extraViews, virtualDocuments, onRemoveEntry, onAddLocalFolder, editors, selectedFile, onOpenFile, onActivateEditor, onPinEditor, onCloseEditor, onCollapse, change, reveal, className, }) {
|
|
28
|
+
// Optionally controlled (standard React pattern): a host that owns view
|
|
29
|
+
// routing (e.g. the session panel's auto-view logic) passes `view` +
|
|
30
|
+
// `onViewChange`; standalone embedders get internal state for free.
|
|
31
|
+
const [uncontrolledView, setUncontrolledView] = useState("files");
|
|
32
|
+
const requestedView = view ?? uncontrolledView;
|
|
33
|
+
const handleViewChange = useCallback((next) => {
|
|
34
|
+
setUncontrolledView(next);
|
|
35
|
+
onViewChange?.(next);
|
|
36
|
+
}, [onViewChange]);
|
|
37
|
+
// A stale id (e.g. a contextual extra view that disappeared) degrades to the
|
|
38
|
+
// explorer rather than an empty sidebar.
|
|
39
|
+
const isKnownView = BUILT_IN_VIEWS.includes(requestedView) ||
|
|
40
|
+
(extraViews?.some((v) => v.id === requestedView) ?? false);
|
|
41
|
+
const activeView = isKnownView ? requestedView : "files";
|
|
42
|
+
const activeExtraView = extraViews?.find((v) => v.id === activeView);
|
|
43
|
+
return (_jsxs("div", { className: cn("flex h-full min-h-0", className), children: [_jsx(ActivityRail, { view: activeView, onViewChange: handleViewChange, extraViews: extraViews }), _jsx(ResizableSplit, { resizablePane: "primary", defaultSize: 288, minSize: 200, maxSize: 560, storageKey: "stgm-workspace-sidebar-width", ariaLabel: "Resize sidebar",
|
|
44
|
+
// min-w-0: the split is a flex-row child of the surface; without it,
|
|
45
|
+
// the fixed-width sidebar sub-pane gives the whole surface a hard
|
|
46
|
+
// minimum width and content overflow escapes to the session panel.
|
|
47
|
+
className: "min-h-0 min-w-0 flex-1", primary: activeExtraView ? (_jsx(ExtraViewSidebar, { view: activeExtraView })) : activeView === "search" ? (_jsx(SearchSidebar, { entries: entries, lister: lister, searcher: searcher, selectedFile: selectedFile, onOpenFile: onOpenFile })) : (_jsx(ExplorerSidebar, { entries: entries, lister: lister, selectedFile: selectedFile, onOpenFile: onOpenFile, onActivateFile: onPinEditor, onRemoveEntry: onRemoveEntry, onAddLocalFolder: onAddLocalFolder })), secondary: _jsx(EditorArea, { entries: entries, reader: reader, editors: editors, selectedFile: selectedFile, virtualDocuments: virtualDocuments, change: change, reveal: reveal, onActivateEditor: onActivateEditor, onPinEditor: onPinEditor, onCloseEditor: onCloseEditor, onCollapse: onCollapse }) })] }));
|
|
48
|
+
}
|
|
49
|
+
function ActivityRail({ view, onViewChange, extraViews, }) {
|
|
50
|
+
const items = [
|
|
51
|
+
{ id: "files", label: "Explorer", icon: _jsx(FilesIcon, {}) },
|
|
52
|
+
{ id: "search", label: "Search", icon: _jsx(SearchIcon, {}) },
|
|
53
|
+
...(extraViews ?? []),
|
|
54
|
+
];
|
|
55
|
+
// One ref per rail button so selection can move DOM focus with it (below).
|
|
56
|
+
const buttonRefs = useRef([]);
|
|
57
|
+
// Roving radiogroup: selection follows focus. `keydown` fires on the focused
|
|
58
|
+
// button, so its `index` is the current position; we select the neighbour AND
|
|
59
|
+
// move focus to it. Moving focus is essential — without it focus stays pinned
|
|
60
|
+
// on the entered button (whose index never changes) and every later view
|
|
61
|
+
// (Config/Changes/…) is unreachable by keyboard.
|
|
62
|
+
const handleKeyDown = useCallback((e, index) => {
|
|
63
|
+
let nextIndex = null;
|
|
64
|
+
if (e.key === "ArrowDown" || e.key === "ArrowRight") {
|
|
65
|
+
nextIndex = Math.min(index + 1, items.length - 1);
|
|
66
|
+
}
|
|
67
|
+
else if (e.key === "ArrowUp" || e.key === "ArrowLeft") {
|
|
68
|
+
nextIndex = Math.max(index - 1, 0);
|
|
69
|
+
}
|
|
70
|
+
else if (e.key === "Home") {
|
|
71
|
+
nextIndex = 0;
|
|
72
|
+
}
|
|
73
|
+
else if (e.key === "End") {
|
|
74
|
+
nextIndex = items.length - 1;
|
|
75
|
+
}
|
|
76
|
+
if (nextIndex === null || nextIndex === index)
|
|
77
|
+
return;
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
onViewChange(items[nextIndex].id);
|
|
80
|
+
buttonRefs.current[nextIndex]?.focus();
|
|
81
|
+
}, [items, onViewChange]);
|
|
82
|
+
return (_jsx("div", { role: "radiogroup", "aria-label": "Workspace view", "aria-orientation": "vertical", className: "flex w-11 shrink-0 flex-col items-center gap-1 border-r border-border bg-muted-faint py-2", children: items.map((item, index) => {
|
|
83
|
+
const isSelected = view === item.id;
|
|
84
|
+
const showBadge = item.badge != null && item.badge > 0;
|
|
85
|
+
return (_jsxs("button", { ref: (el) => {
|
|
86
|
+
buttonRefs.current[index] = el;
|
|
87
|
+
}, type: "button", role: "radio", "aria-checked": isSelected, "aria-label": showBadge ? `${item.label} (${item.badge})` : item.label, title: item.label, tabIndex: isSelected ? 0 : -1, onClick: () => onViewChange(item.id), onKeyDown: (e) => handleKeyDown(e, index), className: cn("relative flex h-9 w-9 items-center justify-center rounded-md transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", isSelected
|
|
88
|
+
? "bg-accent text-foreground"
|
|
89
|
+
: "text-muted-foreground hover:bg-accent-hover hover:text-foreground"), children: [item.icon, showBadge && (_jsx("span", { "aria-hidden": "true", className: "absolute -right-0.5 -top-0.5 inline-flex min-w-[0.875rem] items-center justify-center rounded-full bg-primary px-1 py-px text-[9px] font-medium leading-none text-primary-foreground", children: item.badge }))] }, item.id));
|
|
90
|
+
}) }));
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Explorer sidebar — multi-root file tree
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
function ExplorerSidebar({ entries, lister, selectedFile, onOpenFile, onActivateFile, onRemoveEntry, onAddLocalFolder, }) {
|
|
96
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col border-r border-border", children: [_jsx(SidebarHeader, { title: "Explorer" }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto py-1.5", children: !lister || entries.length === 0 ? (_jsx(SidebarEmpty, { children: "No workspace attached." })) : (_jsx(ExplorerTree, { entries: entries, lister: lister, selectedFile: selectedFile, onOpenFile: onOpenFile, onActivateFile: onActivateFile, onRemoveEntry: onRemoveEntry })) }), onAddLocalFolder && (_jsx("div", { className: "shrink-0 border-t border-border-muted p-1.5", children: _jsxs("button", { type: "button", onClick: onAddLocalFolder, className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs text-foreground transition-colors hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(FolderPlusIcon, {}), _jsx("span", { className: "flex-1 text-left", children: "Add Folder" })] }) }))] }));
|
|
97
|
+
}
|
|
98
|
+
function SearchSidebar({ entries, lister, searcher, selectedFile, onOpenFile, }) {
|
|
99
|
+
// Filename search is the default: cached, instant, and always available.
|
|
100
|
+
// Content (text) search is opt-in and only offered when a searcher exists.
|
|
101
|
+
const [mode, setMode] = useState("name");
|
|
102
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col border-r border-border", children: [_jsx(SidebarHeader, { title: "Search" }), searcher && _jsx(SearchModeToggle, { value: mode, onChange: setMode }), searcher && mode === "text" ? (_jsx(WorkspaceContentSearch, { entries: entries, searcher: searcher, onOpenFile: onOpenFile, selectedFile: selectedFile, className: "min-h-0 flex-1" })) : (_jsx(WorkspaceFileSearch, { entries: entries, lister: lister, onOpenFile: onOpenFile, selectedFile: selectedFile, className: "min-h-0 flex-1" }))] }));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* `Name | Text` search-mode selector, mirroring `FileViewer`'s `Diff | File`
|
|
106
|
+
* radiogroup (roving `tabindex`, arrow-key roving, `role="radio"`). Shown only
|
|
107
|
+
* when a content searcher is injected.
|
|
108
|
+
*/
|
|
109
|
+
function SearchModeToggle({ value, onChange, }) {
|
|
110
|
+
const options = [
|
|
111
|
+
{ value: "name", label: "Name" },
|
|
112
|
+
{ value: "text", label: "Text" },
|
|
113
|
+
];
|
|
114
|
+
// Selection follows focus, matching ActivityRail / ViewerModeToggle.
|
|
115
|
+
const buttonRefs = useRef([]);
|
|
116
|
+
const selectMode = useCallback((next) => {
|
|
117
|
+
onChange(next);
|
|
118
|
+
buttonRefs.current[next === "name" ? 0 : 1]?.focus();
|
|
119
|
+
}, [onChange]);
|
|
120
|
+
const handleKeyDown = useCallback((e) => {
|
|
121
|
+
if (e.key === "ArrowRight" || e.key === "ArrowDown") {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
selectMode("text");
|
|
124
|
+
}
|
|
125
|
+
else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
selectMode("name");
|
|
128
|
+
}
|
|
129
|
+
}, [selectMode]);
|
|
130
|
+
return (_jsx("div", { className: "shrink-0 border-b border-border px-2 py-1.5", children: _jsx("div", { role: "radiogroup", "aria-label": "Search mode", className: "inline-flex rounded-md bg-muted p-0.5", children: options.map((option, index) => {
|
|
131
|
+
const isSelected = value === option.value;
|
|
132
|
+
return (_jsx("button", { ref: (el) => {
|
|
133
|
+
buttonRefs.current[index] = el;
|
|
134
|
+
}, type: "button", role: "radio", "aria-checked": isSelected, tabIndex: isSelected ? 0 : -1, onClick: () => onChange(option.value), onKeyDown: handleKeyDown, className: cn("rounded px-2.5 py-0.5 text-[0.7rem] font-medium transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", isSelected
|
|
135
|
+
? "bg-background text-foreground shadow-sm"
|
|
136
|
+
: "text-muted-foreground hover:text-foreground"), children: option.label }, option.value));
|
|
137
|
+
}) }) }));
|
|
138
|
+
}
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Extra-view sidebar — host-injected facet content (Config, Changes, …)
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
function ExtraViewSidebar({ view }) {
|
|
143
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col border-r border-border", children: [_jsx(SidebarHeader, { title: view.label }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 py-3", children: view.content })] }));
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Editor area — collapse control + tab strip + read-only FileViewer
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
function EditorArea({ entries, reader, editors, selectedFile, virtualDocuments, change, reveal, onActivateEditor, onPinEditor, onCloseEditor, onCollapse, }) {
|
|
149
|
+
const viewerRef = useRef(null);
|
|
150
|
+
// Instance-scoped ids tie each tab to the single editor body (tabpanel).
|
|
151
|
+
const idBase = useId();
|
|
152
|
+
const panelId = `${idBase}editor-panel`;
|
|
153
|
+
const tabIdPrefix = `${idBase}editor-tab-`;
|
|
154
|
+
const activeKey = selectedFile
|
|
155
|
+
? editorKey(selectedFile.entryId, selectedFile.path)
|
|
156
|
+
: null;
|
|
157
|
+
// The active tab is a virtual document when its identity matches an injected
|
|
158
|
+
// one — the body renders the document's content instead of the file viewer.
|
|
159
|
+
const activeVirtualDocument = activeKey !== null
|
|
160
|
+
? virtualDocuments?.find((d) => editorKey(d.entryId, d.path) === activeKey)
|
|
161
|
+
: undefined;
|
|
162
|
+
const activeEntryName = selectedFile
|
|
163
|
+
? entries.find((e) => e.id === selectedFile.entryId)?.name
|
|
164
|
+
: undefined;
|
|
165
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs("div", { className: "flex shrink-0 items-stretch border-b border-border pr-24", children: [_jsx("button", { type: "button", onClick: onCollapse, "aria-label": "Back to chat", title: "Back to chat", className: "flex shrink-0 items-center border-r border-border px-2 text-muted-foreground transition-colors hover:bg-accent-hover hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", children: _jsx(ChevronLeftIcon, {}) }), editors.length > 0 && (_jsx(EditorTabs, { editors: editors, activeKey: activeKey, onActivate: onActivateEditor, onPin: onPinEditor, onClose: onCloseEditor, panelId: panelId, tabIdPrefix: tabIdPrefix, className: "min-w-0 flex-1 border-b-0" }))] }), _jsx("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col", ...(activeKey
|
|
166
|
+
? {
|
|
167
|
+
role: "tabpanel",
|
|
168
|
+
id: panelId,
|
|
169
|
+
"aria-labelledby": editorTabDomId(tabIdPrefix, activeKey),
|
|
170
|
+
}
|
|
171
|
+
: {}), children: activeVirtualDocument ? (
|
|
172
|
+
// A virtual document owns its body wholesale: no breadcrumbs (there is
|
|
173
|
+
// no filesystem location) and no FileViewer (there is no reader-backed
|
|
174
|
+
// file). Keyed like files so switching documents resets cleanly.
|
|
175
|
+
// Vertical-only scrolling: a lone overflow-y-auto would compute
|
|
176
|
+
// overflow-x to auto too, giving the pane a horizontal scrollbar the
|
|
177
|
+
// moment any child refuses to shrink — documents must reflow instead.
|
|
178
|
+
_jsx("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden", children: activeVirtualDocument.content }, activeKey ?? undefined)) : selectedFile ? (_jsxs(_Fragment, { children: [_jsx(Breadcrumbs, { entryName: activeEntryName, path: selectedFile.path, onRefresh: reader ? () => viewerRef.current?.refresh() : undefined }), _jsx(FileViewer, { ref: viewerRef, selectedFile: selectedFile, entries: entries, reader: reader, change: change, reveal: reveal, onClose: onCollapse, showHeader: false, className: "min-h-0 flex-1" }, activeKey ?? undefined)] })) : (_jsx("div", { className: "flex flex-1 items-center justify-center p-8 text-center text-xs text-muted-foreground", children: "Select a file to view its contents." })) })] }));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Location breadcrumb for the active file: entry › folder › … › file, with an
|
|
182
|
+
* optional refresh. Display-only orientation (clickable navigation is a future
|
|
183
|
+
* enhancement); the refresh re-fetches the live file content.
|
|
184
|
+
*/
|
|
185
|
+
function Breadcrumbs({ entryName, path, onRefresh, }) {
|
|
186
|
+
const segments = path.split("/").filter(Boolean);
|
|
187
|
+
const crumbs = entryName ? [entryName, ...segments] : segments;
|
|
188
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-1 border-b border-border-muted px-3 py-1 text-[0.65rem] text-muted-foreground", children: [_jsx("nav", { "aria-label": "File location", className: "flex min-w-0 flex-1 items-center gap-1", children: crumbs.map((crumb, i) => {
|
|
189
|
+
const isLast = i === crumbs.length - 1;
|
|
190
|
+
return (_jsxs("span", { className: "flex min-w-0 items-center gap-1", children: [i > 0 && _jsx("span", { className: "text-muted-foreground-subtle", "aria-hidden": "true", children: "\u203A" }), _jsx("span", { className: cn("truncate", isLast && "text-foreground"), children: crumb })] }, i));
|
|
191
|
+
}) }), onRefresh && (_jsx("button", { type: "button", onClick: onRefresh, "aria-label": "Reload file", title: "Reload file", className: "shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: _jsx(RefreshIcon, {}) }))] }));
|
|
192
|
+
}
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Shared sidebar chrome
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
function SidebarHeader({ title }) {
|
|
197
|
+
return (_jsx("div", { className: "shrink-0 border-b border-border px-3 py-2 text-[0.65rem] font-semibold uppercase tracking-wide text-muted-foreground", children: title }));
|
|
198
|
+
}
|
|
199
|
+
function SidebarEmpty({ children }) {
|
|
200
|
+
return (_jsx("div", { className: "px-2 py-6 text-center text-xs text-muted-foreground", children: children }));
|
|
201
|
+
}
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// Inline SVG icons (SDK independence — no lucide dependency)
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
function FilesIcon() {
|
|
206
|
+
return (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M13 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), _jsx("path", { d: "M13 3v5h5" })] }));
|
|
207
|
+
}
|
|
208
|
+
function SearchIcon() {
|
|
209
|
+
return (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("circle", { cx: "11", cy: "11", r: "7" }), _jsx("path", { d: "M21 21l-4.3-4.3" })] }));
|
|
210
|
+
}
|
|
211
|
+
function FolderPlusIcon() {
|
|
212
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: [_jsx("path", { d: "M1.5 3.5V11a1 1 0 001 1h9a1 1 0 001-1V5.5a1 1 0 00-1-1H7L5.5 3H2.5a1 1 0 00-1 .5z" }), _jsx("path", { d: "M7 7v3M5.5 8.5h3" })] }));
|
|
213
|
+
}
|
|
214
|
+
function ChevronLeftIcon() {
|
|
215
|
+
return (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M10 3L5 8L10 13" }) }));
|
|
216
|
+
}
|
|
217
|
+
function RefreshIcon() {
|
|
218
|
+
return (_jsxs("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M1.5 6a4.5 4.5 0 017.794-3.073M10.5 6a4.5 4.5 0 01-7.794 3.073" }), _jsx("path", { d: "M9.5 1v2.5H7M2.5 11V8.5H5" })] }));
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=WorkspaceSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceSurface.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceSurface.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
2
|
+
import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
|
|
3
|
+
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
4
|
+
/**
|
|
5
|
+
* The session {@link FileChange} that touched the currently-open file, or
|
|
6
|
+
* `null` when the open file was not changed this session (or cannot be
|
|
7
|
+
* correlated with certainty).
|
|
8
|
+
*
|
|
9
|
+
* @param selection - The open file, keyed by `entryId` + repo/root-relative `path`.
|
|
10
|
+
* @param fileChanges - Net-per-file session changes (from `useSessionFileChanges`).
|
|
11
|
+
* @param entries - The client workspace entries — the SAME list the tree and
|
|
12
|
+
* transcript resolve against (`flow.workspace.entries`), so the returned
|
|
13
|
+
* `entryId` is directly comparable. Do not pass the proto `workspaceEntries`.
|
|
14
|
+
* @param sandboxWorkspaceRoot - The sandbox root for git sessions (strips
|
|
15
|
+
* cloud-absolute change paths), identical to the transcript resolver's input.
|
|
16
|
+
* @returns The matching change, or `null`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findChangeForSelection(selection: SelectedWorkspaceFile, fileChanges: readonly FileChange[], entries: readonly WorkspaceEntry[], sandboxWorkspaceRoot?: string): FileChange | null;
|
|
19
|
+
//# sourceMappingURL=findChangeForSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findChangeForSelection.d.ts","sourceRoot":"","sources":["../../src/workspace/findChangeForSelection.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iEAAiE,CAAC;AAClG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAEjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,qBAAqB,EAChC,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,UAAU,GAAG,IAAI,CAgBnB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Correlate an open workspace-file selection with the session file change that
|
|
2
|
+
// touched it, so the read-only Viewer can default a changed file to its diff
|
|
3
|
+
// (Slice 4). This is the change-side peer of `resolveWorkspaceFileSelection`.
|
|
4
|
+
//
|
|
5
|
+
// The hard part is again PATH FORM, and — critically — ENTRY IDENTITY. A
|
|
6
|
+
// `FileChange` carries a capture-side path (`path` is workspace-root-relative,
|
|
7
|
+
// falling back to `absolutePath`), while the selection is the reader's
|
|
8
|
+
// `{ entryId, path }`. Matching by a bare `/`-boundary suffix (as the
|
|
9
|
+
// presentation-only `changeForRowPath` does) is deliberately NOT used here: in
|
|
10
|
+
// a multi-repo session it would happily match `repoA/src/a.ts` to a change in
|
|
11
|
+
// `repoB/src/a.ts` and render the wrong file's diff.
|
|
12
|
+
//
|
|
13
|
+
// Instead we route each change's path through the SAME correlation-grade
|
|
14
|
+
// resolver (`resolveWorkspaceFileSelection`) the tree and transcript use to
|
|
15
|
+
// open files, with the SAME `entries` and `sandboxWorkspaceRoot`. A change is
|
|
16
|
+
// the open file's change iff it resolves to the exact `{ entryId, path }`
|
|
17
|
+
// currently selected. Single-entry sessions match exactly; ambiguous
|
|
18
|
+
// multi-entry / absolute paths degrade to "no match" (never a wrong match),
|
|
19
|
+
// inheriting DD-08's honesty. One resolver, one truth.
|
|
20
|
+
import { resolveWorkspaceFileSelection } from "./resolveWorkspaceFileSelection.js";
|
|
21
|
+
/**
|
|
22
|
+
* The session {@link FileChange} that touched the currently-open file, or
|
|
23
|
+
* `null` when the open file was not changed this session (or cannot be
|
|
24
|
+
* correlated with certainty).
|
|
25
|
+
*
|
|
26
|
+
* @param selection - The open file, keyed by `entryId` + repo/root-relative `path`.
|
|
27
|
+
* @param fileChanges - Net-per-file session changes (from `useSessionFileChanges`).
|
|
28
|
+
* @param entries - The client workspace entries — the SAME list the tree and
|
|
29
|
+
* transcript resolve against (`flow.workspace.entries`), so the returned
|
|
30
|
+
* `entryId` is directly comparable. Do not pass the proto `workspaceEntries`.
|
|
31
|
+
* @param sandboxWorkspaceRoot - The sandbox root for git sessions (strips
|
|
32
|
+
* cloud-absolute change paths), identical to the transcript resolver's input.
|
|
33
|
+
* @returns The matching change, or `null`.
|
|
34
|
+
*/
|
|
35
|
+
export function findChangeForSelection(selection, fileChanges, entries, sandboxWorkspaceRoot) {
|
|
36
|
+
for (const change of fileChanges) {
|
|
37
|
+
const resolved = resolveWorkspaceFileSelection(change.path || change.absolutePath, entries, sandboxWorkspaceRoot);
|
|
38
|
+
if (resolved !== null &&
|
|
39
|
+
resolved.entryId === selection.entryId &&
|
|
40
|
+
resolved.path === selection.path) {
|
|
41
|
+
return change;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=findChangeForSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findChangeForSelection.js","sourceRoot":"","sources":["../../src/workspace/findChangeForSelection.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAC9E,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,uEAAuE;AACvE,sEAAsE;AACtE,+EAA+E;AAC/E,8EAA8E;AAC9E,qDAAqD;AACrD,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,qEAAqE;AACrE,4EAA4E;AAC5E,uDAAuD;AAIvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAgC,EAChC,WAAkC,EAClC,OAAkC,EAClC,oBAA6B;IAE7B,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,6BAA6B,CAC5C,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,EAClC,OAAO,EACP,oBAAoB,CACrB,CAAC;QACF,IACE,QAAQ,KAAK,IAAI;YACjB,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO;YACtC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAChC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/workspace/index.d.ts
CHANGED
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
export { useWorkspaceEntries } from "./useWorkspaceEntries.js";
|
|
2
2
|
export type { WorkspaceEntry, UseWorkspaceEntriesReturn, } from "./useWorkspaceEntries.js";
|
|
3
3
|
export type { WorkspaceFileEntry, WorkspaceFileLister, } from "./WorkspaceFileLister.js";
|
|
4
|
+
export { MAX_WORKSPACE_FILE_READ_BYTES } from "./WorkspaceFileReader.js";
|
|
5
|
+
export type { WorkspaceFileContent, WorkspaceFileReader, } from "./WorkspaceFileReader.js";
|
|
4
6
|
export { useWorkspaceFiles } from "./useWorkspaceFiles.js";
|
|
5
7
|
export type { UseWorkspaceFilesOptions, UseWorkspaceFilesReturn, } from "./useWorkspaceFiles.js";
|
|
6
|
-
export {
|
|
7
|
-
export type {
|
|
8
|
+
export { useWorkspaceFileContent } from "./useWorkspaceFileContent.js";
|
|
9
|
+
export type { UseWorkspaceFileContentOptions, UseWorkspaceFileContentReturn, } from "./useWorkspaceFileContent.js";
|
|
10
|
+
export { useWorkspaceFileSearch } from "./useWorkspaceFileSearch.js";
|
|
11
|
+
export type { UseWorkspaceFileSearchOptions, UseWorkspaceFileSearchReturn, WorkspaceFileSearchGroup, } from "./useWorkspaceFileSearch.js";
|
|
12
|
+
export type { WorkspaceFileMatch } from "./matchWorkspaceFiles.js";
|
|
13
|
+
export { WorkspaceFileSearch } from "./WorkspaceFileSearch.js";
|
|
14
|
+
export type { WorkspaceFileSearchProps } from "./WorkspaceFileSearch.js";
|
|
15
|
+
export type { WorkspaceContentMatch, WorkspaceContentSearchResult, WorkspaceContentSearcher, } from "./WorkspaceContentSearcher.js";
|
|
16
|
+
export { useWorkspaceContentSearch } from "./useWorkspaceContentSearch.js";
|
|
17
|
+
export type { UseWorkspaceContentSearchOptions, UseWorkspaceContentSearchReturn, WorkspaceContentSearchGroup, } from "./useWorkspaceContentSearch.js";
|
|
18
|
+
export { WorkspaceContentSearch } from "./WorkspaceContentSearch.js";
|
|
19
|
+
export type { WorkspaceContentSearchProps } from "./WorkspaceContentSearch.js";
|
|
20
|
+
export { FileViewer } from "./FileViewer.js";
|
|
21
|
+
export type { FileViewerProps, FileViewerHandle } from "./FileViewer.js";
|
|
22
|
+
export { WorkspaceSurface } from "./WorkspaceSurface.js";
|
|
23
|
+
export type { WorkspaceSurfaceProps, SurfaceRailView, SurfaceVirtualDocument, } from "./WorkspaceSurface.js";
|
|
24
|
+
export { virtualEntryId, isVirtualEntryId } from "../internal/store/index.js";
|
|
25
|
+
export { ExplorerTree } from "./ExplorerTree.js";
|
|
26
|
+
export type { ExplorerTreeProps } from "./ExplorerTree.js";
|
|
27
|
+
export type { OpenEditor, OpenFileOptions } from "../internal/store/index.js";
|
|
28
|
+
export type { RevealTarget } from "../internal/useRevealLine.js";
|
|
29
|
+
export type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
|
|
8
30
|
export { WorkspaceEditor } from "./WorkspaceEditor.js";
|
|
9
31
|
export type { WorkspaceEditorProps } from "./WorkspaceEditor.js";
|
|
10
32
|
export { WorkspaceSummary } from "./WorkspaceSummary.js";
|
package/workspace/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,cAAc,EACd,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,eAAe,EACf,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,cAAc,EACd,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EACV,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACV,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,YAAY,EACV,gCAAgC,EAChC,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG9E,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,eAAe,EACf,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC"}
|
package/workspace/index.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
export { useWorkspaceEntries } from "./useWorkspaceEntries.js";
|
|
2
|
+
export { MAX_WORKSPACE_FILE_READ_BYTES } from "./WorkspaceFileReader.js";
|
|
2
3
|
export { useWorkspaceFiles } from "./useWorkspaceFiles.js";
|
|
3
|
-
export {
|
|
4
|
+
export { useWorkspaceFileContent } from "./useWorkspaceFileContent.js";
|
|
5
|
+
export { useWorkspaceFileSearch } from "./useWorkspaceFileSearch.js";
|
|
6
|
+
export { WorkspaceFileSearch } from "./WorkspaceFileSearch.js";
|
|
7
|
+
export { useWorkspaceContentSearch } from "./useWorkspaceContentSearch.js";
|
|
8
|
+
export { WorkspaceContentSearch } from "./WorkspaceContentSearch.js";
|
|
9
|
+
// The highlight helper (findHighlightRanges) stays @internal, like matchWorkspaceFiles.
|
|
10
|
+
export { FileViewer } from "./FileViewer.js";
|
|
11
|
+
export { WorkspaceSurface } from "./WorkspaceSurface.js";
|
|
12
|
+
// Virtual-document identity helpers: hosts mint collision-proof entry ids for
|
|
13
|
+
// SurfaceVirtualDocument tabs and detect them in file-only code paths.
|
|
14
|
+
export { virtualEntryId, isVirtualEntryId } from "../internal/store/index.js";
|
|
15
|
+
export { ExplorerTree } from "./ExplorerTree.js";
|
|
4
16
|
export { WorkspaceEditor } from "./WorkspaceEditor.js";
|
|
5
17
|
export { WorkspaceSummary } from "./WorkspaceSummary.js";
|
|
6
18
|
export { useRecentWorkspaces } from "./useRecentWorkspaces.js";
|
package/workspace/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAS/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAS/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAKzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAQrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAO/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAM3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,wFAAwF;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzD,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAK/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A half-open `[start, end)` range of code-unit offsets into a preview string,
|
|
3
|
+
* marking one occurrence of the query to emphasize.
|
|
4
|
+
*/
|
|
5
|
+
export interface HighlightRange {
|
|
6
|
+
/** Inclusive start offset within the preview. */
|
|
7
|
+
readonly start: number;
|
|
8
|
+
/** Exclusive end offset within the preview. */
|
|
9
|
+
readonly end: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Finds every case-insensitive occurrence of `query` within `preview`,
|
|
13
|
+
* best-effort for rendering emphasis.
|
|
14
|
+
*
|
|
15
|
+
* - Empty/whitespace query → `[]` (nothing to highlight).
|
|
16
|
+
* - Overlapping matches cannot occur (search advances past each match end).
|
|
17
|
+
* - Offsets are JS string code units, so a consumer highlights with
|
|
18
|
+
* `preview.slice(start, end)`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function findHighlightRanges(preview: string, query: string): HighlightRange[];
|
|
21
|
+
//# sourceMappingURL=matchContentPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchContentPreview.d.ts","sourceRoot":"","sources":["../../src/workspace/matchContentPreview.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE,CAiBlB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Pure highlight helper behind content search. Kept separate from the hook and
|
|
2
|
+
// component so the offset math is exhaustively unit-testable in isolation (no
|
|
3
|
+
// React, no async).
|
|
4
|
+
//
|
|
5
|
+
// The backend returns each hit's `preview` line but no column offset (a
|
|
6
|
+
// cross-language byte/UTF-16 offset would be brittle — see WorkspaceContentMatch).
|
|
7
|
+
// Since matching is case-insensitive substring, the client re-derives the
|
|
8
|
+
// highlight span(s) from the preview text itself, identically to how
|
|
9
|
+
// `matchWorkspaceFiles` derives the filename highlight range. `@internal`.
|
|
10
|
+
/**
|
|
11
|
+
* Finds every case-insensitive occurrence of `query` within `preview`,
|
|
12
|
+
* best-effort for rendering emphasis.
|
|
13
|
+
*
|
|
14
|
+
* - Empty/whitespace query → `[]` (nothing to highlight).
|
|
15
|
+
* - Overlapping matches cannot occur (search advances past each match end).
|
|
16
|
+
* - Offsets are JS string code units, so a consumer highlights with
|
|
17
|
+
* `preview.slice(start, end)`.
|
|
18
|
+
*/
|
|
19
|
+
export function findHighlightRanges(preview, query) {
|
|
20
|
+
const needle = query.trim().toLowerCase();
|
|
21
|
+
if (needle.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const haystack = preview.toLowerCase();
|
|
24
|
+
const ranges = [];
|
|
25
|
+
let from = 0;
|
|
26
|
+
for (;;) {
|
|
27
|
+
const start = haystack.indexOf(needle, from);
|
|
28
|
+
if (start === -1)
|
|
29
|
+
break;
|
|
30
|
+
const end = start + needle.length;
|
|
31
|
+
ranges.push({ start, end });
|
|
32
|
+
from = end;
|
|
33
|
+
}
|
|
34
|
+
return ranges;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=matchContentPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchContentPreview.js","sourceRoot":"","sources":["../../src/workspace/matchContentPreview.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,oBAAoB;AACpB,EAAE;AACF,wEAAwE;AACxE,mFAAmF;AACnF,0EAA0E;AAC1E,qEAAqE;AACrE,2EAA2E;AAa3E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,KAAa;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM;QACxB,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { WorkspaceFileEntry } from "./WorkspaceFileLister.js";
|
|
2
|
+
/**
|
|
3
|
+
* A workspace file that matched a search query.
|
|
4
|
+
*
|
|
5
|
+
* `matchStart`/`matchEnd` are code-unit offsets into `path` (a half-open
|
|
6
|
+
* `[start, end)` range) for the single contiguous substring hit, so a consumer
|
|
7
|
+
* can highlight exactly the matched span with `path.slice(...)`.
|
|
8
|
+
*/
|
|
9
|
+
export interface WorkspaceFileMatch {
|
|
10
|
+
/** Repo-relative (git) or root-relative (local) path of the matched file. */
|
|
11
|
+
readonly path: string;
|
|
12
|
+
/** Inclusive start offset of the matched substring within `path`. */
|
|
13
|
+
readonly matchStart: number;
|
|
14
|
+
/** Exclusive end offset of the matched substring within `path`. */
|
|
15
|
+
readonly matchEnd: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Ranks a flat listing against a query, returning matched files best-first.
|
|
19
|
+
*
|
|
20
|
+
* - Case-insensitive substring on the full relative path.
|
|
21
|
+
* - Directories and advisory `notice` entries are never matched (a defensive
|
|
22
|
+
* guard even though the shared cache already strips notices — DD-11).
|
|
23
|
+
* - Empty/whitespace query returns `[]` (search shows a hint, not everything).
|
|
24
|
+
*
|
|
25
|
+
* Ranking, in order: a basename hit outranks a path-only hit; then an earlier
|
|
26
|
+
* match offset; then a shorter path; then lexicographic path for a stable,
|
|
27
|
+
* deterministic order.
|
|
28
|
+
*/
|
|
29
|
+
export declare function matchWorkspaceFiles(files: readonly WorkspaceFileEntry[], query: string): WorkspaceFileMatch[];
|
|
30
|
+
//# sourceMappingURL=matchWorkspaceFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchWorkspaceFiles.d.ts","sourceRoot":"","sources":["../../src/workspace/matchWorkspaceFiles.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAQD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,KAAK,EAAE,MAAM,GACZ,kBAAkB,EAAE,CA6BtB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Pure ranking function behind workspace search. Kept separate from the hook and
|
|
2
|
+
// component so the matching/ranking rules are exhaustively unit-testable in
|
|
3
|
+
// isolation (no React, no async).
|
|
4
|
+
//
|
|
5
|
+
// Match semantics intentionally mirror `internal/file-tree/filterFileTree` —
|
|
6
|
+
// case-insensitive substring — but widened from a node's basename to the full
|
|
7
|
+
// relative path, so `foo/bar` is findable and directory context is searchable
|
|
8
|
+
// (DD-10). The trivial predicate is not extracted into a shared micro-module; a
|
|
9
|
+
// cross-reference comment is the lower-coupling, honest choice.
|
|
10
|
+
/**
|
|
11
|
+
* Ranks a flat listing against a query, returning matched files best-first.
|
|
12
|
+
*
|
|
13
|
+
* - Case-insensitive substring on the full relative path.
|
|
14
|
+
* - Directories and advisory `notice` entries are never matched (a defensive
|
|
15
|
+
* guard even though the shared cache already strips notices — DD-11).
|
|
16
|
+
* - Empty/whitespace query returns `[]` (search shows a hint, not everything).
|
|
17
|
+
*
|
|
18
|
+
* Ranking, in order: a basename hit outranks a path-only hit; then an earlier
|
|
19
|
+
* match offset; then a shorter path; then lexicographic path for a stable,
|
|
20
|
+
* deterministic order.
|
|
21
|
+
*/
|
|
22
|
+
export function matchWorkspaceFiles(files, query) {
|
|
23
|
+
const trimmed = query.trim();
|
|
24
|
+
if (trimmed.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const needle = trimmed.toLowerCase();
|
|
27
|
+
const ranked = [];
|
|
28
|
+
for (const file of files) {
|
|
29
|
+
if (file.isDirectory || file.notice)
|
|
30
|
+
continue;
|
|
31
|
+
const matchStart = file.path.toLowerCase().indexOf(needle);
|
|
32
|
+
if (matchStart === -1)
|
|
33
|
+
continue;
|
|
34
|
+
const lastSlash = file.path.lastIndexOf("/");
|
|
35
|
+
ranked.push({
|
|
36
|
+
path: file.path,
|
|
37
|
+
matchStart,
|
|
38
|
+
matchEnd: matchStart + needle.length,
|
|
39
|
+
isBasenameHit: matchStart >= lastSlash + 1,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
ranked.sort(compareMatches);
|
|
43
|
+
return ranked.map(({ path, matchStart, matchEnd }) => ({
|
|
44
|
+
path,
|
|
45
|
+
matchStart,
|
|
46
|
+
matchEnd,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function compareMatches(a, b) {
|
|
50
|
+
if (a.isBasenameHit !== b.isBasenameHit)
|
|
51
|
+
return a.isBasenameHit ? -1 : 1;
|
|
52
|
+
if (a.matchStart !== b.matchStart)
|
|
53
|
+
return a.matchStart - b.matchStart;
|
|
54
|
+
if (a.path.length !== b.path.length)
|
|
55
|
+
return a.path.length - b.path.length;
|
|
56
|
+
return a.path.localeCompare(b.path);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=matchWorkspaceFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchWorkspaceFiles.js","sourceRoot":"","sources":["../../src/workspace/matchWorkspaceFiles.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,4EAA4E;AAC5E,kCAAkC;AAClC,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,gEAAgE;AA0BhE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAoC,EACpC,KAAa;IAEb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM;YAAE,SAAS;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,SAAS;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU;YACV,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM;YACpC,aAAa,EAAE,UAAU,IAAI,SAAS,GAAG,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI;QACJ,UAAU;QACV,QAAQ;KACT,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,CAAc,EAAE,CAAc;IACpD,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa;QAAE,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACtE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1E,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
|
|
2
|
+
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a transcript tool-call file path to the {@link SelectedWorkspaceFile}
|
|
5
|
+
* that opens it in the read-only Viewer, or `null` when it cannot be resolved to
|
|
6
|
+
* a definite repo/root-relative file (caller keeps copy/GitHub-link fallback).
|
|
7
|
+
*
|
|
8
|
+
* `entries` are the client-side workspace entries (`useWorkspaceEntries`), the
|
|
9
|
+
* same list the Viewer resolves against, so the returned `entryId` is directly
|
|
10
|
+
* usable. `sandboxWorkspaceRoot` (when the session has git-repo entries, e.g.
|
|
11
|
+
* `/home/daytona/workspace`) is stripped first so cloud-absolute paths reduce to
|
|
12
|
+
* workspace-relative before per-entry anchoring.
|
|
13
|
+
*
|
|
14
|
+
* The result `path` is guaranteed to match what the file tree / lister emits for
|
|
15
|
+
* the same file, so opening from the transcript and from the tree produce an
|
|
16
|
+
* identical selection (and hit the same content fetch/cache).
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveWorkspaceFileSelection(path: string, entries: readonly WorkspaceEntry[], sandboxWorkspaceRoot?: string): SelectedWorkspaceFile | null;
|
|
19
|
+
//# sourceMappingURL=resolveWorkspaceFileSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveWorkspaceFileSelection.d.ts","sourceRoot":"","sources":["../../src/workspace/resolveWorkspaceFileSelection.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmB/D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,qBAAqB,GAAG,IAAI,CAiD9B"}
|