@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useCallback, useEffect } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
4
5
|
import { GitHubRepoPicker } from "../github/GitHubRepoPicker.js";
|
|
5
6
|
import { useScrollShadows } from "../internal/useScrollShadows.js";
|
|
6
7
|
import { ScrollFade } from "../internal/ScrollFade.js";
|
|
@@ -74,7 +75,7 @@ export function WorkspaceEditor({ workspace, className, disabled, gitHubConnecti
|
|
|
74
75
|
// Drill-in: Connect GitHub
|
|
75
76
|
// ---------------------------------------------------------------------------
|
|
76
77
|
if (activePanel === "github" && enableGitHub) {
|
|
77
|
-
return (_jsxs("div", { className:
|
|
78
|
+
return (_jsxs("div", { className: cn("space-y-2", className), children: [_jsxs("button", { type: "button", onClick: goBack, className: "inline-flex items-center gap-1 rounded-sm text-[0.65rem] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(ChevronLeftIcon, {}), "Back"] }), gitHubConnection ? (_jsx(GitHubPanel, { connection: gitHubConnection, onSelect: (url, branch) => {
|
|
78
79
|
handleGitHubSelect(url, branch);
|
|
79
80
|
setActivePanel(null);
|
|
80
81
|
}, onClose: goBack })) : (_jsx(ManualGitPanel, { url: manualUrl, branch: manualBranch, onUrlChange: setManualUrl, onBranchChange: setManualBranch, onAdd: () => {
|
|
@@ -88,14 +89,11 @@ export function WorkspaceEditor({ workspace, className, disabled, gitHubConnecti
|
|
|
88
89
|
// ---------------------------------------------------------------------------
|
|
89
90
|
// Default view: flat list (entries + actions)
|
|
90
91
|
// ---------------------------------------------------------------------------
|
|
91
|
-
return (_jsxs("div", { className:
|
|
92
|
-
"min-w-0 flex-1 truncate text-foreground",
|
|
93
|
-
entry.type === "local" ? "[direction:rtl] text-left" : "",
|
|
94
|
-
].join(" "), title: entry.name, children: _jsx("bdi", { children: entry.name }) }), _jsx("button", { type: "button", onClick: () => workspace.remove(entry.id), disabled: disabled, className: "shrink-0 text-muted-foreground hover:text-destructive disabled:pointer-events-none", "aria-label": `Remove ${entry.name}`, children: _jsx(XIcon, {}) })] }, entry.id))) }), entryList.canScrollDown && _jsx(ScrollFade, { position: "bottom" })] })), _jsxs("div", { className: "space-y-0.5", children: [canBrowse && onBrowseLocalFolder && (_jsxs("button", { type: "button", onClick: async () => {
|
|
92
|
+
return (_jsxs("div", { className: cn("space-y-2", className), children: [workspace.entries.length > 0 && (_jsxs("div", { className: "relative", children: [entryList.canScrollUp && _jsx(ScrollFade, { position: "top" }), _jsx("div", { ref: entryList.scrollRef, className: "max-h-28 space-y-1 overflow-y-auto", children: workspace.entries.map((entry) => (_jsxs("div", { className: "flex items-center gap-2 rounded-md border border-border bg-muted-faint px-2.5 py-1.5 text-xs", children: [TYPE_LABELS[entry.type] ? (_jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[0.65rem] text-muted-foreground", children: TYPE_LABELS[entry.type] })) : (_jsx("span", { className: "shrink-0 text-muted-foreground", children: _jsx(FolderIcon, {}) })), _jsx("span", { className: cn("min-w-0 flex-1 truncate text-foreground", entry.type === "local" && "[direction:rtl] text-left"), title: entry.name, children: _jsx("bdi", { children: entry.name }) }), _jsx("button", { type: "button", onClick: () => workspace.remove(entry.id), disabled: disabled, className: "shrink-0 rounded-sm text-muted-foreground transition-colors hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none", "aria-label": `Remove ${entry.name}`, children: _jsx(XIcon, {}) })] }, entry.id))) }), entryList.canScrollDown && _jsx(ScrollFade, { position: "bottom" })] })), _jsxs("div", { className: "space-y-0.5", children: [canBrowse && onBrowseLocalFolder && (_jsxs("button", { type: "button", onClick: async () => {
|
|
95
93
|
const path = await onBrowseLocalFolder();
|
|
96
94
|
if (path)
|
|
97
95
|
workspace.addLocalPath(path);
|
|
98
|
-
}, disabled: disabled, className: "flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-xs text-foreground transition-colors hover:bg-accent-hover disabled:pointer-events-none disabled:opacity-40", children: [_jsx(FolderIcon, {}), _jsx("span", { className: "flex-1 text-left", children: "Browse Folder" })] })), enableGitHub && (_jsxs("button", { type: "button", onClick: () => setActivePanel("github"), disabled: disabled, className: "flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-xs text-foreground transition-colors hover:bg-accent-hover disabled:pointer-events-none disabled:opacity-40", children: [_jsx(GitHubIcon, {}), _jsx("span", { className: "flex-1 text-left", children: "Connect GitHub" }), _jsx(ChevronRightIcon, {})] }))] })] }));
|
|
96
|
+
}, disabled: disabled, className: "flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-xs text-foreground transition-colors hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40", children: [_jsx(FolderIcon, {}), _jsx("span", { className: "flex-1 text-left", children: "Browse Folder" })] })), enableGitHub && (_jsxs("button", { type: "button", onClick: () => setActivePanel("github"), disabled: disabled, className: "flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-xs text-foreground transition-colors hover:bg-accent-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40", children: [_jsx(GitHubIcon, {}), _jsx("span", { className: "flex-1 text-left", children: "Connect GitHub" }), _jsx(ChevronRightIcon, {})] }))] })] }));
|
|
99
97
|
}
|
|
100
98
|
// ---------------------------------------------------------------------------
|
|
101
99
|
// GitHub panel (progressive disclosure: connect prompt or repo picker)
|
|
@@ -109,15 +107,15 @@ function GitHubPanel({ connection, onSelect, onClose, }) {
|
|
|
109
107
|
return _jsx(GitHubConnectingState, { onCancel: connection.disconnect });
|
|
110
108
|
}
|
|
111
109
|
const redirectUri = `${window.location.origin}/auth/github/callback`;
|
|
112
|
-
return (_jsxs("div", { className: "space-y-3 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-xs font-medium text-foreground", children: "Choose a GitHub repo to add to workspace" }), _jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: "Connect your GitHub account so the agent can access your repos" })] }), connection.popupBlocked ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-[0.65rem] text-destructive", children: "Popup was blocked by your browser." }), _jsxs("div", { className: "flex items-center justify-center gap-2", children: [_jsx("button", { type: "button", onClick: () => connection.connect(redirectUri, { popup: true }), className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground hover:text-foreground
|
|
110
|
+
return (_jsxs("div", { className: "space-y-3 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-xs font-medium text-foreground", children: "Choose a GitHub repo to add to workspace" }), _jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: "Connect your GitHub account so the agent can access your repos" })] }), connection.popupBlocked ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-[0.65rem] text-destructive", children: "Popup was blocked by your browser." }), _jsxs("div", { className: "flex items-center justify-center gap-2", children: [_jsx("button", { type: "button", onClick: () => connection.connect(redirectUri, { popup: true }), className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: "Try again" }), _jsxs("button", { type: "button", onClick: () => connection.connect(redirectUri), className: "inline-flex items-center gap-2 rounded-md bg-foreground px-3 py-1.5 text-xs text-background transition-colors hover:bg-foreground-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(GitHubIcon, {}), _jsx("span", { children: "Continue with redirect" })] })] })] })) : (_jsxs("button", { type: "button", onClick: () => connection.connect(redirectUri, { popup: true }), className: "inline-flex items-center gap-2 rounded-md bg-foreground px-3 py-1.5 text-xs text-background transition-colors hover:bg-foreground-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(GitHubIcon, {}), _jsx("span", { children: "Connect GitHub" })] }))] }));
|
|
113
111
|
}
|
|
114
|
-
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs", children: [connection.user?.avatarUrl && (_jsx("img", { src: connection.user.avatarUrl, alt: "", className: "h-4 w-4 rounded-full" })), _jsx("span", { className: "text-muted-foreground", children: connection.user?.login ?? "Connected" })] }), _jsx("button", { type: "button", onClick: connection.disconnect, className: "text-[0.6rem] text-muted-foreground hover:text-destructive
|
|
112
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs", children: [connection.user?.avatarUrl && (_jsx("img", { src: connection.user.avatarUrl, alt: "", className: "h-4 w-4 rounded-full" })), _jsx("span", { className: "text-muted-foreground", children: connection.user?.login ?? "Connected" })] }), _jsx("button", { type: "button", onClick: connection.disconnect, className: "rounded-sm text-[0.6rem] text-muted-foreground transition-colors hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: "Disconnect" })] }), _jsx(GitHubRepoPicker, { token: connection.token, onSelect: onSelect, onCancel: onClose })] }));
|
|
115
113
|
}
|
|
116
114
|
// ---------------------------------------------------------------------------
|
|
117
115
|
// Manual git URL input (fallback for platform builders without GitHub OAuth)
|
|
118
116
|
// ---------------------------------------------------------------------------
|
|
119
117
|
function ManualGitPanel({ url, branch, onUrlChange, onBranchChange, onAdd, onCancel, onKeyDown, }) {
|
|
120
|
-
return (_jsxs("div", { className: "space-y-2", children: [_jsx("input", { type: "url", placeholder: "https://github.com/org/repo.git", value: url, onChange: (e) => onUrlChange(e.target.value), onKeyDown: onKeyDown, className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", autoFocus: true }), _jsx("input", { type: "text", placeholder: "Branch (optional)", value: branch, onChange: (e) => onBranchChange(e.target.value), onKeyDown: onKeyDown, className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground hover:text-foreground
|
|
118
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx("input", { type: "url", "aria-label": "Git repository URL", placeholder: "https://github.com/org/repo.git", value: url, onChange: (e) => onUrlChange(e.target.value), onKeyDown: onKeyDown, className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", autoFocus: true }), _jsx("input", { type: "text", "aria-label": "Branch (optional)", placeholder: "Branch (optional)", value: branch, onChange: (e) => onBranchChange(e.target.value), onKeyDown: onKeyDown, className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: "Cancel" }), _jsx("button", { type: "button", onClick: onAdd, disabled: !url.trim(), className: "rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground transition-colors hover:bg-primary-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40", children: "Add" })] })] }));
|
|
121
119
|
}
|
|
122
120
|
// ---------------------------------------------------------------------------
|
|
123
121
|
// Connecting state with cancel + timeout
|
|
@@ -131,7 +129,7 @@ function GitHubConnectingState({ onCancel }) {
|
|
|
131
129
|
}, []);
|
|
132
130
|
return (_jsxs("div", { className: "space-y-3 py-4 text-center", children: [_jsx("div", { className: "mx-auto h-5 w-5 animate-spin rounded-full border-2 border-muted-foreground border-t-foreground" }), _jsx("p", { className: "text-xs text-muted-foreground", children: timedOut
|
|
133
131
|
? "Taking longer than expected..."
|
|
134
|
-
: "Connecting to GitHub..." }), _jsx("button", { type: "button", onClick: onCancel, className: "text-[0.65rem] text-muted-foreground hover:text-foreground
|
|
132
|
+
: "Connecting to GitHub..." }), _jsx("button", { type: "button", onClick: onCancel, className: "rounded-sm text-[0.65rem] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: "Cancel" })] }));
|
|
135
133
|
}
|
|
136
134
|
// ---------------------------------------------------------------------------
|
|
137
135
|
// Icons
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceEditor.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceEditor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAsB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkspaceEditor.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,17 @@ export interface WorkspaceFileEntry {
|
|
|
11
11
|
readonly path: string;
|
|
12
12
|
/** Whether this entry is a directory. */
|
|
13
13
|
readonly isDirectory: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Marks this entry as an advisory notice rather than an openable file — for
|
|
16
|
+
* example a "listing truncated" message when a repository exceeds the
|
|
17
|
+
* backend's entry limit. When `true`, `path` carries the human-readable
|
|
18
|
+
* message. Consumers must not treat a notice as a real file: it is stripped
|
|
19
|
+
* from the openable listing (never a tree leaf, never a search hit) and is
|
|
20
|
+
* surfaced instead as a single `truncated` banner (see `workspaceListingCache`).
|
|
21
|
+
*
|
|
22
|
+
* Optional and additive: listers that never truncate simply omit it.
|
|
23
|
+
*/
|
|
24
|
+
readonly notice?: true;
|
|
14
25
|
}
|
|
15
26
|
/**
|
|
16
27
|
* Platform-injected callback that lists files in a workspace entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceFileLister.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileLister.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkspaceFileLister.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileLister.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,cAAc,KAClB,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
2
|
+
/**
|
|
3
|
+
* Shared soft cap for a single file read, enforced identically on web and
|
|
4
|
+
* desktop so both substrates truncate at the same boundary. Files larger than
|
|
5
|
+
* this return their first {@link MAX_WORKSPACE_FILE_READ_BYTES} bytes in `text`
|
|
6
|
+
* with `truncated: true`; `size` still reports the full file size.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MAX_WORKSPACE_FILE_READ_BYTES = 1048576;
|
|
9
|
+
/**
|
|
10
|
+
* Decoded content (plus metadata) for a single workspace file.
|
|
11
|
+
*
|
|
12
|
+
* `text` is `null` whenever the bytes are not displayable as UTF-8 — either
|
|
13
|
+
* binary (`isBinary`) or an undecodable byte sequence (`encoding: "unknown"`).
|
|
14
|
+
* The renderer uses `isBinary`/`text === null` for its fallback state.
|
|
15
|
+
*/
|
|
16
|
+
export interface WorkspaceFileContent {
|
|
17
|
+
/** Decoded UTF-8 text, or `null` when binary or undecodable. */
|
|
18
|
+
readonly text: string | null;
|
|
19
|
+
/** Whether the bytes were detected as binary (NUL-byte heuristic). */
|
|
20
|
+
readonly isBinary: boolean;
|
|
21
|
+
/** Full file size in bytes — independent of truncation. */
|
|
22
|
+
readonly size: number;
|
|
23
|
+
/** How the backend delivered the bytes. `"none"` is GitHub's >1 MB signal. */
|
|
24
|
+
readonly encoding: "utf-8" | "base64" | "none" | "unknown";
|
|
25
|
+
/** `true` when `text` holds only the first {@link MAX_WORKSPACE_FILE_READ_BYTES} bytes. */
|
|
26
|
+
readonly truncated?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Platform-injected callback that reads the content of a single workspace file.
|
|
30
|
+
*
|
|
31
|
+
* The byte-reading sibling of {@link WorkspaceFileLister}:
|
|
32
|
+
* the SDK calls it when a user opens a file; the platform decides *how* the
|
|
33
|
+
* bytes are fetched (GitHub on web, Tauri on desktop).
|
|
34
|
+
*
|
|
35
|
+
* Two distinct failure axes — do not conflate them:
|
|
36
|
+
* - Returns `null` **only** when the substrate is unsupported for this entry
|
|
37
|
+
* (git-on-desktop, local-on-web, missing token, non-GitHub URL). This is the
|
|
38
|
+
* honest "unavailable here" state, mirroring the lister's null contract.
|
|
39
|
+
* - **Throws** on a genuine failure (404, network error, 5xx, unreadable file,
|
|
40
|
+
* a directory path). Consumers catch this into a distinct error state — a
|
|
41
|
+
* clicked file that 404s is "failed to load," not "unsupported here."
|
|
42
|
+
*
|
|
43
|
+
* `path` is repo-relative for git entries and root-relative for local entries —
|
|
44
|
+
* exactly the strings the matching `WorkspaceFileLister` emits, so a file-tree
|
|
45
|
+
* node path can be handed straight to the reader with no transformation.
|
|
46
|
+
*/
|
|
47
|
+
export type WorkspaceFileReader = (entry: WorkspaceEntry, path: string) => Promise<WorkspaceFileContent | null>;
|
|
48
|
+
//# sourceMappingURL=WorkspaceFileReader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceFileReader.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileReader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,UAAY,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3D,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Content-fetch capability — the byte-reading sibling of WorkspaceFileLister.
|
|
2
|
+
// Domain: workspace. Injected by the host (DD-004) so the SDK never learns how
|
|
3
|
+
// bytes are fetched: GitHub Contents/blob on web, Tauri fs on desktop.
|
|
4
|
+
/**
|
|
5
|
+
* Shared soft cap for a single file read, enforced identically on web and
|
|
6
|
+
* desktop so both substrates truncate at the same boundary. Files larger than
|
|
7
|
+
* this return their first {@link MAX_WORKSPACE_FILE_READ_BYTES} bytes in `text`
|
|
8
|
+
* with `truncated: true`; `size` still reports the full file size.
|
|
9
|
+
*/
|
|
10
|
+
export const MAX_WORKSPACE_FILE_READ_BYTES = 1_048_576; // 1 MiB
|
|
11
|
+
//# sourceMappingURL=WorkspaceFileReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceFileReader.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileReader.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AAIvE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,SAAS,CAAC,CAAC,QAAQ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
2
|
+
import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
|
|
3
|
+
import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
|
|
4
|
+
/** Props for {@link WorkspaceFileSearch}. */
|
|
5
|
+
export interface WorkspaceFileSearchProps {
|
|
6
|
+
/** All workspace entries to search across. */
|
|
7
|
+
readonly entries: readonly WorkspaceEntry[];
|
|
8
|
+
/** Platform-injected file lister. `undefined` → search is unavailable. */
|
|
9
|
+
readonly lister: WorkspaceFileLister | undefined;
|
|
10
|
+
/** Opens a result in the viewer. */
|
|
11
|
+
readonly onOpenFile: (entryId: string, path: string) => void;
|
|
12
|
+
/** The file currently open in the viewer, highlighted in the results. */
|
|
13
|
+
readonly selectedFile?: SelectedWorkspaceFile | null;
|
|
14
|
+
/** Additional CSS classes for the root element. */
|
|
15
|
+
readonly className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Workspace-wide filename/path search surface.
|
|
19
|
+
*
|
|
20
|
+
* Searches the already-loaded listings across every workspace entry (via
|
|
21
|
+
* {@link useWorkspaceFileSearch}) and opens a hit in the viewer through
|
|
22
|
+
* `onOpenFile` — the same seam a file-tree click uses. Filename-first by design;
|
|
23
|
+
* content search is a separate substrate-specific capability (DD-09).
|
|
24
|
+
*
|
|
25
|
+
* Keyboard/a11y follows the platform's combobox+listbox pattern (see
|
|
26
|
+
* `mcp-server/McpServerPicker`): the input is a `role="combobox"` driving
|
|
27
|
+
* `aria-activedescendant`, results are a `role="listbox"` of `role="option"`
|
|
28
|
+
* rows, and ArrowUp/Down move a virtual focus with Enter to open — focus stays
|
|
29
|
+
* in the input. All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
30
|
+
*/
|
|
31
|
+
export declare function WorkspaceFileSearch({ entries, lister, onOpenFile, selectedFile, className, }: WorkspaceFileSearchProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=WorkspaceFileSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceFileSearch.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileSearch.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAUjG,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACjD,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrD,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,MAAM,EACN,UAAU,EACV,YAAY,EACZ,SAAS,GACV,EAAE,wBAAwB,2CAyK1B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useId, useMemo, useRef, useState, } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { useWorkspaceFileSearch, } from "./useWorkspaceFileSearch.js";
|
|
6
|
+
/** Cap on rendered rows — keeps the DOM bounded on huge repositories. */
|
|
7
|
+
const MAX_RESULTS = 200;
|
|
8
|
+
/**
|
|
9
|
+
* Workspace-wide filename/path search surface.
|
|
10
|
+
*
|
|
11
|
+
* Searches the already-loaded listings across every workspace entry (via
|
|
12
|
+
* {@link useWorkspaceFileSearch}) and opens a hit in the viewer through
|
|
13
|
+
* `onOpenFile` — the same seam a file-tree click uses. Filename-first by design;
|
|
14
|
+
* content search is a separate substrate-specific capability (DD-09).
|
|
15
|
+
*
|
|
16
|
+
* Keyboard/a11y follows the platform's combobox+listbox pattern (see
|
|
17
|
+
* `mcp-server/McpServerPicker`): the input is a `role="combobox"` driving
|
|
18
|
+
* `aria-activedescendant`, results are a `role="listbox"` of `role="option"`
|
|
19
|
+
* rows, and ArrowUp/Down move a virtual focus with Enter to open — focus stays
|
|
20
|
+
* in the input. All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
21
|
+
*/
|
|
22
|
+
export function WorkspaceFileSearch({ entries, lister, onOpenFile, selectedFile, className, }) {
|
|
23
|
+
const [query, setQuery] = useState("");
|
|
24
|
+
const [focusIndex, setFocusIndex] = useState(-1);
|
|
25
|
+
const inputRef = useRef(null);
|
|
26
|
+
const listboxId = useId();
|
|
27
|
+
const optionId = useCallback((index) => `${listboxId}-opt-${index}`, [listboxId]);
|
|
28
|
+
const { groups, totalMatches, isLoading, isUnsupported } = useWorkspaceFileSearch({ entries, lister, query });
|
|
29
|
+
// Flat, capped view of every rendered match — the index space the keyboard
|
|
30
|
+
// and `aria-activedescendant` share with the grouped render below.
|
|
31
|
+
const flatResults = useMemo(() => {
|
|
32
|
+
const flat = [];
|
|
33
|
+
for (const group of groups) {
|
|
34
|
+
for (const match of group.matches) {
|
|
35
|
+
if (flat.length >= MAX_RESULTS)
|
|
36
|
+
return flat;
|
|
37
|
+
flat.push({ entryId: group.entry.id, entry: group.entry, match });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return flat;
|
|
41
|
+
}, [groups]);
|
|
42
|
+
// A new query invalidates the previous virtual focus.
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
setFocusIndex(-1);
|
|
45
|
+
}, [query]);
|
|
46
|
+
// Autofocus on mount — the user switched into Search intending to type.
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
inputRef.current?.focus();
|
|
49
|
+
}, []);
|
|
50
|
+
// Keep the virtually-focused option in view (no-op where unsupported, e.g. tests).
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (focusIndex < 0)
|
|
53
|
+
return;
|
|
54
|
+
const el = typeof document !== "undefined"
|
|
55
|
+
? document.getElementById(optionId(focusIndex))
|
|
56
|
+
: null;
|
|
57
|
+
el?.scrollIntoView?.({ block: "nearest" });
|
|
58
|
+
}, [focusIndex, optionId]);
|
|
59
|
+
const handleKeyDown = useCallback((e) => {
|
|
60
|
+
if (e.key === "ArrowDown") {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
setFocusIndex((prev) => prev < flatResults.length - 1 ? prev + 1 : prev);
|
|
63
|
+
}
|
|
64
|
+
else if (e.key === "ArrowUp") {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
setFocusIndex((prev) => (prev > 0 ? prev - 1 : -1));
|
|
67
|
+
}
|
|
68
|
+
else if (e.key === "Enter") {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
const target = flatResults[focusIndex];
|
|
71
|
+
if (target)
|
|
72
|
+
onOpenFile(target.entryId, target.match.path);
|
|
73
|
+
}
|
|
74
|
+
}, [flatResults, focusIndex, onOpenFile]);
|
|
75
|
+
const trimmed = query.trim();
|
|
76
|
+
const showGroupHeaders = groups.length > 1;
|
|
77
|
+
// A concise, screen-reader-only summary of the current result state. It lives
|
|
78
|
+
// in a persistent polite live region (below) so status changes are announced
|
|
79
|
+
// even as the visible states — which live in separate, unmounting branches —
|
|
80
|
+
// swap. Deliberately terse: never the result list itself, only its shape.
|
|
81
|
+
const statusMessage = isUnsupported
|
|
82
|
+
? ""
|
|
83
|
+
: trimmed.length === 0
|
|
84
|
+
? ""
|
|
85
|
+
: isLoading && totalMatches === 0 && groups.length === 0
|
|
86
|
+
? "Searching files…"
|
|
87
|
+
: groups.length === 0
|
|
88
|
+
? `No files matching ${trimmed}.`
|
|
89
|
+
: totalMatches > flatResults.length
|
|
90
|
+
? `Showing the first ${flatResults.length} of ${totalMatches} matching files.`
|
|
91
|
+
: `${flatResults.length} matching ${flatResults.length === 1 ? "file" : "files"}.`;
|
|
92
|
+
return (_jsxs("div", { className: cn("flex h-full flex-col", className), children: [_jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: statusMessage }), _jsxs("div", { className: "flex items-center gap-1.5 border-b border-border px-2 py-1.5", children: [_jsx(SearchIcon, {}), _jsx("input", { ref: inputRef, type: "text", role: "combobox", "aria-expanded": true, "aria-controls": listboxId, "aria-activedescendant": focusIndex >= 0 ? optionId(focusIndex) : undefined, value: query, onChange: (e) => setQuery(e.target.value), onKeyDown: handleKeyDown, placeholder: "Search files by name\u2026", disabled: isUnsupported, className: cn("min-w-0 flex-1 bg-transparent text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none disabled:cursor-not-allowed"), "aria-label": "Search workspace files by name" }), trimmed.length > 0 && (_jsx("button", { type: "button", onClick: () => {
|
|
93
|
+
setQuery("");
|
|
94
|
+
inputRef.current?.focus();
|
|
95
|
+
}, className: "shrink-0 text-muted-foreground transition-colors hover:text-foreground", "aria-label": "Clear search", children: _jsx(ClearIcon, {}) }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: isUnsupported ? (_jsx(MessageState, { children: "File search isn\u2019t available here." })) : trimmed.length === 0 ? (_jsx(MessageState, { children: "Search files by name across the whole workspace." })) : isLoading && totalMatches === 0 && groups.length === 0 ? (_jsx(MessageState, { children: "Searching\u2026" })) : groups.length === 0 ? (_jsxs(MessageState, { children: ["No files matching \u201C", trimmed, "\u201D."] })) : (_jsxs(_Fragment, { children: [_jsx("ul", { id: listboxId, role: "listbox", "aria-label": "Search results", className: "py-0.5", children: renderRows({
|
|
96
|
+
groups,
|
|
97
|
+
showGroupHeaders,
|
|
98
|
+
selectedFile: selectedFile ?? null,
|
|
99
|
+
focusIndex,
|
|
100
|
+
optionId,
|
|
101
|
+
onOpenFile,
|
|
102
|
+
}) }), totalMatches > flatResults.length && (_jsxs("p", { className: "border-t border-border px-3 py-1.5 text-[0.65rem] text-muted-foreground", children: ["Showing the first ", flatResults.length, " of ", totalMatches, " matches \u2014 refine your search to narrow the list."] }))] })) })] }));
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Result rows — a single pass over groups that keeps the flat match index
|
|
106
|
+
// aligned with `flatResults` (and thus keyboard focus / aria-activedescendant).
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
function renderRows({ groups, showGroupHeaders, selectedFile, focusIndex, optionId, onOpenFile, }) {
|
|
109
|
+
const rows = [];
|
|
110
|
+
let matchIndex = 0;
|
|
111
|
+
for (const group of groups) {
|
|
112
|
+
if (showGroupHeaders) {
|
|
113
|
+
rows.push(_jsx(GroupHeader, { name: group.entry.name }, `h:${group.entry.id}`));
|
|
114
|
+
}
|
|
115
|
+
for (const match of group.matches) {
|
|
116
|
+
if (matchIndex >= MAX_RESULTS)
|
|
117
|
+
break;
|
|
118
|
+
const index = matchIndex++;
|
|
119
|
+
const isOpen = selectedFile?.entryId === group.entry.id &&
|
|
120
|
+
selectedFile.path === match.path;
|
|
121
|
+
rows.push(_jsx(ResultRow, { id: optionId(index), match: match, isFocused: index === focusIndex, isOpen: isOpen, onOpen: () => onOpenFile(group.entry.id, match.path) }, `${group.entry.id}:${match.path}`));
|
|
122
|
+
}
|
|
123
|
+
if (group.truncated) {
|
|
124
|
+
rows.push(_jsx(GroupNotice, { children: "Partial listing \u2014 too many files to search in full." }, `t:${group.entry.id}`));
|
|
125
|
+
}
|
|
126
|
+
if (group.error) {
|
|
127
|
+
rows.push(_jsxs(GroupNotice, { isError: true, children: ["Couldn\u2019t list files: ", group.error.message] }, `e:${group.entry.id}`));
|
|
128
|
+
}
|
|
129
|
+
if (matchIndex >= MAX_RESULTS)
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
return rows;
|
|
133
|
+
}
|
|
134
|
+
function ResultRow({ id, match, isFocused, isOpen, onOpen, }) {
|
|
135
|
+
const lastSlash = match.path.lastIndexOf("/");
|
|
136
|
+
const basename = match.path.slice(lastSlash + 1);
|
|
137
|
+
const dir = lastSlash >= 0 ? match.path.slice(0, lastSlash) : "";
|
|
138
|
+
// The `role="option"` IS the interactive leaf of the listbox (keyboard
|
|
139
|
+
// activation flows through the combobox input's Enter handler +
|
|
140
|
+
// aria-activedescendant). It must not nest another interactive control — a
|
|
141
|
+
// button inside would violate WCAG 4.1.2 (axe `nested-interactive`). So the
|
|
142
|
+
// click handler and row styling live on the option itself.
|
|
143
|
+
return (_jsxs("li", { id: id, role: "option", "aria-selected": isFocused, "aria-current": isOpen ? "true" : undefined, onClick: onOpen, className: cn("flex cursor-pointer items-baseline gap-1.5 px-3 py-1 text-xs transition-colors", isFocused && "bg-muted", isOpen && "bg-muted font-medium text-foreground", !isFocused && !isOpen && "hover:bg-muted"), children: [_jsx("span", { className: "truncate text-foreground", children: _jsx(HighlightedPath, { text: basename, offset: lastSlash + 1, matchStart: match.matchStart, matchEnd: match.matchEnd }) }), dir && (_jsx("span", { className: "truncate text-[0.65rem] text-muted-foreground", children: _jsx(HighlightedPath, { text: dir, offset: 0, matchStart: match.matchStart, matchEnd: match.matchEnd }) }))] }));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Renders a slice of the path (`text`, starting at `offset` within the full
|
|
147
|
+
* path), emphasizing the intersection with the match range `[matchStart,
|
|
148
|
+
* matchEnd)`. Non-overlapping slices render plain.
|
|
149
|
+
*/
|
|
150
|
+
function HighlightedPath({ text, offset, matchStart, matchEnd, }) {
|
|
151
|
+
const localStart = Math.max(0, matchStart - offset);
|
|
152
|
+
const localEnd = Math.min(text.length, matchEnd - offset);
|
|
153
|
+
if (localStart >= localEnd)
|
|
154
|
+
return _jsx(_Fragment, { children: text });
|
|
155
|
+
return (_jsxs(_Fragment, { children: [text.slice(0, localStart), _jsx("span", { className: "font-semibold text-foreground", children: text.slice(localStart, localEnd) }), text.slice(localEnd)] }));
|
|
156
|
+
}
|
|
157
|
+
function GroupHeader({ name }) {
|
|
158
|
+
return (_jsx("li", { role: "presentation", className: "truncate px-3 pb-0.5 pt-2 text-[0.6rem] font-medium uppercase tracking-wide text-muted-foreground", children: name }));
|
|
159
|
+
}
|
|
160
|
+
function GroupNotice({ children, isError, }) {
|
|
161
|
+
return (_jsx("li", { role: "presentation", className: cn("px-3 py-1 text-[0.65rem]", isError ? "text-destructive" : "text-muted-foreground"), children: children }));
|
|
162
|
+
}
|
|
163
|
+
function MessageState({ children }) {
|
|
164
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center p-8 text-center text-xs text-muted-foreground", children: children }));
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Inline SVG icons (SDK independence — no lucide dependency)
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
function SearchIcon() {
|
|
170
|
+
return (_jsxs("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", "aria-hidden": "true", children: [_jsx("circle", { cx: "5.25", cy: "5.25", r: "3.5" }), _jsx("path", { d: "M7.75 7.75L10.5 10.5" })] }));
|
|
171
|
+
}
|
|
172
|
+
function ClearIcon() {
|
|
173
|
+
return (_jsx("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: "M3 3L9 9M9 3L3 9" }) }));
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=WorkspaceFileSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceFileSearch.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceFileSearch.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
3
|
+
import { type OpenEditor, type OpenFileOptions, type SelectedWorkspaceFile } from "../internal/store/index.js";
|
|
4
|
+
import type { RevealTarget } from "../internal/useRevealLine.js";
|
|
5
|
+
import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
|
|
6
|
+
import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
|
|
7
|
+
import type { WorkspaceFileReader } from "./WorkspaceFileReader.js";
|
|
8
|
+
import type { WorkspaceContentSearcher } from "./WorkspaceContentSearcher.js";
|
|
9
|
+
/**
|
|
10
|
+
* A host-injected rail view: an icon in the activity rail whose content
|
|
11
|
+
* renders in the sidebar pane when active.
|
|
12
|
+
*
|
|
13
|
+
* This is how session facets (Config, Changes, Artifacts, …) join the built-in
|
|
14
|
+
* Explorer/Search views without the surface knowing any session domain — the
|
|
15
|
+
* same composition philosophy as the injected lister/reader capabilities
|
|
16
|
+
* (DD-004). The surface stays an embeddable, domain-pure workspace organism;
|
|
17
|
+
* hosts extend its rail.
|
|
18
|
+
*/
|
|
19
|
+
export interface SurfaceRailView {
|
|
20
|
+
/** Unique view id. Must not collide with the built-in `"files"`/`"search"`. */
|
|
21
|
+
readonly id: string;
|
|
22
|
+
/** Accessible label; also rendered as the sidebar heading. */
|
|
23
|
+
readonly label: string;
|
|
24
|
+
/** Monochrome rail icon (tinted via `currentColor`, DD-005). */
|
|
25
|
+
readonly icon: ReactNode;
|
|
26
|
+
/** Optional count badge rendered over the rail icon (hidden when 0). */
|
|
27
|
+
readonly badge?: number;
|
|
28
|
+
/** Sidebar content rendered while this view is active. */
|
|
29
|
+
readonly content: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A host-injected virtual document: an editor tab whose content is not a
|
|
33
|
+
* workspace file — the session's `plan.md` today; execution artifacts are the
|
|
34
|
+
* anticipated next family.
|
|
35
|
+
*
|
|
36
|
+
* The editor-area counterpart of {@link SurfaceRailView}'s rail injection
|
|
37
|
+
* (DD-004): virtual documents share the tab group with file tabs (identical
|
|
38
|
+
* open / pin / close / activate semantics through the same editors store),
|
|
39
|
+
* and only the *body* rendering diverges — the surface renders `content`
|
|
40
|
+
* instead of breadcrumbs + `FileViewer`. The surface stays domain-pure: it
|
|
41
|
+
* matches tabs to virtual documents by identity and knows nothing about what
|
|
42
|
+
* the document is.
|
|
43
|
+
*
|
|
44
|
+
* `entryId` must come from `virtualEntryId(kind)` so it can never alias a
|
|
45
|
+
* real workspace entry; `path` doubles as the tab label's source (its
|
|
46
|
+
* basename), matching file-tab behavior.
|
|
47
|
+
*/
|
|
48
|
+
export interface SurfaceVirtualDocument {
|
|
49
|
+
/** Virtual entry id (from `virtualEntryId`) — the tab's owning "entry". */
|
|
50
|
+
readonly entryId: string;
|
|
51
|
+
/** Tab identity within the entry; its basename is the tab label. */
|
|
52
|
+
readonly path: string;
|
|
53
|
+
/** Editor-area content rendered while this document's tab is active. */
|
|
54
|
+
readonly content: ReactNode;
|
|
55
|
+
}
|
|
56
|
+
/** Props for {@link WorkspaceSurface}. */
|
|
57
|
+
export interface WorkspaceSurfaceProps {
|
|
58
|
+
/** The workspace entries whose files are browsable (multi-root). */
|
|
59
|
+
readonly entries: readonly WorkspaceEntry[];
|
|
60
|
+
/** Platform-injected file lister. `undefined` disables explorer + search. */
|
|
61
|
+
readonly lister: WorkspaceFileLister | undefined;
|
|
62
|
+
/** Platform-injected content reader for the editor. */
|
|
63
|
+
readonly reader: WorkspaceFileReader | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Platform-injected content (text) searcher. When provided, the Search pane
|
|
66
|
+
* gains a `Name | Text` toggle offering full-text search; `undefined` (web/git
|
|
67
|
+
* today) keeps the Search pane filename-only (DD-09). Mirrors the lister's
|
|
68
|
+
* null contract — the honest "unavailable here" state.
|
|
69
|
+
*/
|
|
70
|
+
readonly searcher?: WorkspaceContentSearcher;
|
|
71
|
+
/**
|
|
72
|
+
* The active rail view id (`"files"`, `"search"`, or an {@link SurfaceRailView.id}).
|
|
73
|
+
* Provide together with `onViewChange` to control the rail from the host;
|
|
74
|
+
* omit for internal (uncontrolled) view state. An id that matches no view
|
|
75
|
+
* (e.g. a contextual extra view that disappeared) falls back to `"files"`.
|
|
76
|
+
*/
|
|
77
|
+
readonly view?: string;
|
|
78
|
+
/** Called when the user picks a rail view. */
|
|
79
|
+
readonly onViewChange?: (viewId: string) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Host-injected rail views, rendered after the built-in Explorer/Search.
|
|
82
|
+
* Their `content` renders in the sidebar pane; the editor area stays for
|
|
83
|
+
* files (the VS Code model).
|
|
84
|
+
*/
|
|
85
|
+
readonly extraViews?: readonly SurfaceRailView[];
|
|
86
|
+
/**
|
|
87
|
+
* Host-injected virtual documents (see {@link SurfaceVirtualDocument}).
|
|
88
|
+
* A tab whose identity matches one of these renders its `content` in the
|
|
89
|
+
* editor area instead of the file viewer. The host opens/activates the tab
|
|
90
|
+
* through the same editors-store seams as files.
|
|
91
|
+
*/
|
|
92
|
+
readonly virtualDocuments?: readonly SurfaceVirtualDocument[];
|
|
93
|
+
/**
|
|
94
|
+
* Detach a workspace entry. When provided, explorer root headers carry a
|
|
95
|
+
* remove control (VS Code's "Remove Folder from Workspace").
|
|
96
|
+
*/
|
|
97
|
+
readonly onRemoveEntry?: (entryId: string) => void;
|
|
98
|
+
/**
|
|
99
|
+
* Attach a local folder (host opens its native picker and adds the entry).
|
|
100
|
+
* When provided, the explorer renders an "Add Folder" footer action —
|
|
101
|
+
* desktop hosts wire this; web hosts omit it (no native picker).
|
|
102
|
+
*/
|
|
103
|
+
readonly onAddLocalFolder?: () => void;
|
|
104
|
+
/** Open editor tabs in order (VS Code open-editors model). */
|
|
105
|
+
readonly editors: readonly OpenEditor[];
|
|
106
|
+
/** The active editor's file, or `null`. Highlighted in the tree and shown. */
|
|
107
|
+
readonly selectedFile: SelectedWorkspaceFile | null;
|
|
108
|
+
/**
|
|
109
|
+
* Opens a file as a preview (single click) from the explorer or search. The
|
|
110
|
+
* same seam the tree/search uses; the owner routes it to the editors store.
|
|
111
|
+
* `options.line` (content-search hits) requests a jump-to-line reveal.
|
|
112
|
+
*/
|
|
113
|
+
readonly onOpenFile: (entryId: string, path: string, options?: OpenFileOptions) => void;
|
|
114
|
+
/** Focuses an already-open editor (tab single click). */
|
|
115
|
+
readonly onActivateEditor: (entryId: string, path: string) => void;
|
|
116
|
+
/** Pins an editor (tab double-click) so it stops being the preview tab. */
|
|
117
|
+
readonly onPinEditor: (entryId: string, path: string) => void;
|
|
118
|
+
/** Closes an editor (tab close control or middle click). */
|
|
119
|
+
readonly onCloseEditor: (entryId: string, path: string) => void;
|
|
120
|
+
/** Collapses the surface back to the chat-dominant layout. */
|
|
121
|
+
readonly onCollapse: () => void;
|
|
122
|
+
/**
|
|
123
|
+
* The session {@link FileChange} that touched the open file, when it was
|
|
124
|
+
* changed this session. When present the editor defaults to the authoritative
|
|
125
|
+
* `baseline→candidate` diff (DD-06), matching the inspector's Viewer tab.
|
|
126
|
+
*/
|
|
127
|
+
readonly change?: FileChange;
|
|
128
|
+
/**
|
|
129
|
+
* Jump-to-line reveal for the **active** editor (already scoped by the owner
|
|
130
|
+
* to `reveal.key === activeKey`), or `undefined`. Forwarded to the editor's
|
|
131
|
+
* viewer, which opens in File view and scrolls to / highlights the line.
|
|
132
|
+
*/
|
|
133
|
+
readonly reveal?: RevealTarget;
|
|
134
|
+
/** Additional CSS classes for the root element. */
|
|
135
|
+
readonly className?: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A VS Code / Cursor-inspired read-only workspace surface: a slim activity rail
|
|
139
|
+
* (Explorer / Search), a resizable sidebar, and a large editor area.
|
|
140
|
+
*
|
|
141
|
+
* This is the workspace-dominant counterpart to the inspector's cramped Viewer
|
|
142
|
+
* tab. The session viewer flips its layout to give this surface the majority of
|
|
143
|
+
* the screen while chat becomes a narrow column (see `SessionViewer`). It is a
|
|
144
|
+
* self-contained organism: given `entries`, a `lister`, a `reader`, and the
|
|
145
|
+
* open-file selection, it renders identically inside the Console or embedded in
|
|
146
|
+
* a third-party host (DD-004). Explicitly read-only — no editing, no commit UI.
|
|
147
|
+
*
|
|
148
|
+
* All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
149
|
+
*/
|
|
150
|
+
export declare function WorkspaceSurface({ entries, lister, reader, searcher, view, onViewChange, extraViews, virtualDocuments, onRemoveEntry, onAddLocalFolder, editors, selectedFile, onOpenFile, onActivateEditor, onPinEditor, onCloseEditor, onCollapse, change, reveal, className, }: WorkspaceSurfaceProps): import("react/jsx-runtime").JSX.Element;
|
|
151
|
+
//# sourceMappingURL=WorkspaceSurface.d.ts.map
|