@stigmer/react 3.1.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/composer/SessionComposer.d.ts +24 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +19 -8
- package/composer/SessionComposer.js.map +1 -1
- package/execution/ArtifactContentRenderer.d.ts +11 -1
- package/execution/ArtifactContentRenderer.d.ts.map +1 -1
- package/execution/ArtifactContentRenderer.js +39 -15
- package/execution/ArtifactContentRenderer.js.map +1 -1
- package/execution/FilePathContext.d.ts +8 -1
- package/execution/FilePathContext.d.ts.map +1 -1
- package/execution/FilePathContext.js.map +1 -1
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +21 -6
- package/execution/FilePathLink.js.map +1 -1
- package/execution/MessageEntry.d.ts +29 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +29 -5
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +76 -13
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +178 -24
- package/execution/MessageThread.js.map +1 -1
- package/execution/PlanArtifactCard.d.ts +27 -18
- package/execution/PlanArtifactCard.d.ts.map +1 -1
- package/execution/PlanArtifactCard.js +13 -23
- package/execution/PlanArtifactCard.js.map +1 -1
- package/execution/PlanDocumentMessage.d.ts +32 -0
- package/execution/PlanDocumentMessage.d.ts.map +1 -0
- package/execution/PlanDocumentMessage.js +37 -0
- package/execution/PlanDocumentMessage.js.map +1 -0
- package/execution/PlanStreamingCard.d.ts +45 -0
- package/execution/PlanStreamingCard.d.ts.map +1 -0
- package/execution/PlanStreamingCard.js +35 -0
- package/execution/PlanStreamingCard.js.map +1 -0
- package/execution/index.d.ts +5 -1
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +2 -0
- package/execution/index.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +10 -0
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js +5 -1
- package/execution/useCreateAgentExecution.js.map +1 -1
- package/github/decodeGitHubContent.d.ts +29 -0
- package/github/decodeGitHubContent.d.ts.map +1 -0
- package/github/decodeGitHubContent.js +72 -0
- package/github/decodeGitHubContent.js.map +1 -0
- package/github/index.d.ts +1 -0
- package/github/index.d.ts.map +1 -1
- package/github/index.js +1 -0
- package/github/index.js.map +1 -1
- package/github/useGitHubFileReader.d.ts +26 -0
- package/github/useGitHubFileReader.d.ts.map +1 -0
- package/github/useGitHubFileReader.js +106 -0
- package/github/useGitHubFileReader.js.map +1 -0
- package/github/useGitHubTreeLister.d.ts.map +1 -1
- package/github/useGitHubTreeLister.js +6 -2
- package/github/useGitHubTreeLister.js.map +1 -1
- package/index.d.ts +9 -9
- package/index.d.ts.map +1 -1
- package/index.js +5 -5
- package/index.js.map +1 -1
- package/internal/ResizableSplit.d.ts +72 -22
- package/internal/ResizableSplit.d.ts.map +1 -1
- package/internal/ResizableSplit.js +96 -38
- package/internal/ResizableSplit.js.map +1 -1
- package/internal/VirtualizedThread.d.ts +5 -3
- package/internal/VirtualizedThread.d.ts.map +1 -1
- package/internal/VirtualizedThread.js +6 -4
- package/internal/VirtualizedThread.js.map +1 -1
- package/internal/file-icons/index.d.ts +17 -0
- package/internal/file-icons/index.d.ts.map +1 -0
- package/internal/file-icons/index.js +60 -0
- package/internal/file-icons/index.js.map +1 -0
- package/internal/file-tree/FileTreeNode.d.ts +18 -1
- package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
- package/internal/file-tree/FileTreeNode.js +11 -2
- package/internal/file-tree/FileTreeNode.js.map +1 -1
- package/internal/markdown-components.d.ts +38 -1
- package/internal/markdown-components.d.ts.map +1 -1
- package/internal/markdown-components.js +86 -11
- package/internal/markdown-components.js.map +1 -1
- package/{workflow → internal}/motion-preference.d.ts +7 -4
- package/internal/motion-preference.d.ts.map +1 -0
- package/{workflow → internal}/motion-preference.js +7 -4
- package/internal/motion-preference.js.map +1 -0
- package/internal/store/index.d.ts +33 -0
- package/internal/store/index.d.ts.map +1 -1
- package/internal/store/index.js +59 -0
- package/internal/store/index.js.map +1 -1
- package/internal/store/workspace-editors-store.d.ts +145 -0
- package/internal/store/workspace-editors-store.d.ts.map +1 -0
- package/internal/store/workspace-editors-store.js +208 -0
- package/internal/store/workspace-editors-store.js.map +1 -0
- package/internal/store/workspace-file-selection-store.d.ts +38 -0
- package/internal/store/workspace-file-selection-store.d.ts.map +1 -0
- package/internal/store/workspace-file-selection-store.js +62 -0
- package/internal/store/workspace-file-selection-store.js.map +1 -0
- package/internal/useRevealLine.d.ts +49 -0
- package/internal/useRevealLine.d.ts.map +1 -0
- package/internal/useRevealLine.js +43 -0
- package/internal/useRevealLine.js.map +1 -0
- package/library/detect-plan-artifact.d.ts +21 -0
- package/library/detect-plan-artifact.d.ts.map +1 -1
- package/library/detect-plan-artifact.js +20 -0
- package/library/detect-plan-artifact.js.map +1 -1
- package/library/detect-streaming-plan.d.ts +45 -0
- package/library/detect-streaming-plan.d.ts.map +1 -0
- package/library/detect-streaming-plan.js +83 -0
- package/library/detect-streaming-plan.js.map +1 -0
- package/library/index.d.ts +4 -1
- package/library/index.d.ts.map +1 -1
- package/library/index.js +2 -1
- package/library/index.js.map +1 -1
- package/package.json +4 -4
- package/session/NewSessionViewer.d.ts +19 -4
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +52 -25
- package/session/NewSessionViewer.js.map +1 -1
- package/session/PlanEditor.d.ts +55 -0
- package/session/PlanEditor.d.ts.map +1 -0
- package/session/PlanEditor.js +88 -0
- package/session/PlanEditor.js.map +1 -0
- package/session/PlanStreamingDocument.d.ts +30 -0
- package/session/PlanStreamingDocument.d.ts.map +1 -0
- package/session/PlanStreamingDocument.js +37 -0
- package/session/PlanStreamingDocument.js.map +1 -0
- package/session/SessionPanelChip.d.ts +26 -0
- package/session/SessionPanelChip.d.ts.map +1 -0
- package/session/SessionPanelChip.js +40 -0
- package/session/SessionPanelChip.js.map +1 -0
- package/session/SessionViewer.d.ts +34 -7
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +315 -33
- package/session/SessionViewer.js.map +1 -1
- package/session/{inspector → facets}/ArtifactsTab.d.ts +10 -2
- package/session/facets/ArtifactsTab.d.ts.map +1 -0
- package/session/{inspector → facets}/ArtifactsTab.js +8 -3
- package/session/facets/ArtifactsTab.js.map +1 -0
- package/session/{inspector → facets}/ChangesTab.d.ts +3 -3
- package/session/facets/ChangesTab.d.ts.map +1 -0
- package/session/{inspector → facets}/ChangesTab.js +3 -3
- package/session/facets/ChangesTab.js.map +1 -0
- package/session/facets/InspectTab.d.ts.map +1 -0
- package/session/facets/InspectTab.js.map +1 -0
- package/session/{inspector → facets}/SetupTab.d.ts +11 -2
- package/session/facets/SetupTab.d.ts.map +1 -0
- package/session/{inspector → facets}/SetupTab.js +4 -3
- package/session/facets/SetupTab.js.map +1 -0
- package/session/{inspector → facets}/UsageTab.d.ts +1 -1
- package/session/facets/UsageTab.d.ts.map +1 -0
- package/session/{inspector → facets}/UsageTab.js +1 -1
- package/session/facets/UsageTab.js.map +1 -0
- package/session/{inspector → facets}/index.d.ts +0 -6
- package/session/facets/index.d.ts.map +1 -0
- package/session/{inspector → facets}/index.js +0 -3
- package/session/facets/index.js.map +1 -0
- package/session/index.d.ts +11 -2
- package/session/index.d.ts.map +1 -1
- package/session/index.js +15 -2
- package/session/index.js.map +1 -1
- package/session/plan-document.d.ts +9 -0
- package/session/plan-document.d.ts.map +1 -0
- package/session/plan-document.js +17 -0
- package/session/plan-document.js.map +1 -0
- package/session/useOpenFileChange.d.ts +20 -0
- package/session/useOpenFileChange.d.ts.map +1 -0
- package/session/useOpenFileChange.js +31 -0
- package/session/useOpenFileChange.js.map +1 -0
- package/session/usePlanDraft.d.ts +52 -0
- package/session/usePlanDraft.d.ts.map +1 -0
- package/session/usePlanDraft.js +63 -0
- package/session/usePlanDraft.js.map +1 -0
- package/session/useSessionConversation.d.ts +6 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +1 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +1 -0
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +120 -0
- package/session/useSessionPanel.d.ts.map +1 -0
- package/session/useSessionPanel.js +130 -0
- package/session/useSessionPanel.js.map +1 -0
- package/session/useSessionRailViews.d.ts +45 -0
- package/session/useSessionRailViews.d.ts.map +1 -0
- package/session/useSessionRailViews.js +105 -0
- package/session/useSessionRailViews.js.map +1 -0
- package/src/composer/SessionComposer.tsx +52 -10
- package/src/composer/__tests__/SessionComposer-contract.test.tsx +58 -4
- package/src/execution/ArtifactContentRenderer.tsx +101 -24
- package/src/execution/FilePathContext.tsx +8 -1
- package/src/execution/FilePathLink.tsx +22 -6
- package/src/execution/MessageEntry.tsx +111 -1
- package/src/execution/MessageThread.tsx +291 -36
- package/src/execution/PlanArtifactCard.tsx +63 -31
- package/src/execution/PlanDocumentMessage.tsx +96 -0
- package/src/execution/PlanStreamingCard.tsx +137 -0
- package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +80 -1
- package/src/execution/__tests__/FilePathLink.test.tsx +87 -0
- package/src/execution/__tests__/MessageThread.test.tsx +101 -0
- package/src/execution/__tests__/PlanArtifactCard.test.tsx +66 -12
- package/src/execution/__tests__/PlanDocumentMessage.test.tsx +55 -0
- package/src/execution/__tests__/PlanStreamingCard.test.tsx +49 -0
- package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +504 -22
- package/src/execution/__tests__/message-entry.test.tsx +48 -0
- package/src/execution/__tests__/useCreateAgentExecution.test.tsx +85 -0
- package/src/execution/index.ts +7 -1
- package/src/execution/useCreateAgentExecution.ts +16 -1
- package/src/github/__tests__/decodeGitHubContent.test.ts +102 -0
- package/src/github/__tests__/useGitHubFileReader.test.ts +183 -0
- package/src/github/decodeGitHubContent.ts +83 -0
- package/src/github/index.ts +1 -0
- package/src/github/useGitHubFileReader.ts +152 -0
- package/src/github/useGitHubTreeLister.ts +6 -2
- package/src/index.ts +63 -9
- package/src/internal/ResizableSplit.tsx +184 -51
- package/src/internal/VirtualizedThread.tsx +12 -4
- package/src/internal/__tests__/ResizableSplit.test.tsx +125 -3
- package/src/internal/__tests__/markdown-components.test.tsx +68 -0
- package/src/internal/__tests__/useRevealLine.test.tsx +97 -0
- package/src/internal/file-icons/__tests__/file-icons.test.tsx +35 -0
- package/src/internal/file-icons/index.tsx +137 -0
- package/src/internal/file-tree/FileTreeNode.tsx +43 -3
- package/src/internal/file-tree/__tests__/FileTreeNode-explorer.test.tsx +86 -0
- package/src/internal/markdown-components.tsx +116 -11
- package/src/{workflow → internal}/motion-preference.ts +7 -4
- package/src/internal/store/__tests__/workspace-editors-store.test.ts +216 -0
- package/src/internal/store/__tests__/workspace-file-selection-store.test.ts +118 -0
- package/src/internal/store/index.ts +94 -0
- package/src/internal/store/workspace-editors-store.ts +315 -0
- package/src/internal/store/workspace-file-selection-store.ts +88 -0
- package/src/internal/useRevealLine.ts +81 -0
- package/src/library/__tests__/detect-plan-artifact.test.ts +48 -0
- package/src/library/__tests__/detect-streaming-plan.test.ts +234 -0
- package/src/library/detect-plan-artifact.ts +35 -0
- package/src/library/detect-streaming-plan.ts +108 -0
- package/src/library/index.ts +5 -0
- package/src/session/NewSessionViewer.tsx +123 -55
- package/src/session/PlanEditor.tsx +361 -0
- package/src/session/PlanStreamingDocument.tsx +97 -0
- package/src/session/SessionPanelChip.tsx +103 -0
- package/src/session/SessionViewer.tsx +617 -90
- package/src/session/__tests__/NewSessionViewer.test.tsx +148 -0
- package/src/session/__tests__/PlanEditor.test.tsx +217 -0
- package/src/session/__tests__/PlanStreamingDocument.test.tsx +50 -0
- package/src/session/__tests__/SessionPanelChip.test.tsx +42 -0
- package/src/session/__tests__/SessionViewer-fileReviewDock.test.tsx +9 -4
- package/src/session/__tests__/SessionViewer-transcriptFileOpen.test.tsx +205 -0
- package/src/session/__tests__/audienceWiring.test.tsx +55 -19
- package/src/session/__tests__/useOpenFileChange.test.tsx +82 -0
- package/src/session/__tests__/usePlanDraft.test.ts +102 -0
- package/src/session/__tests__/useSessionPanel.test.ts +298 -0
- package/src/session/__tests__/useSessionRailViews.test.tsx +124 -0
- package/src/session/{inspector → facets}/ArtifactsTab.tsx +27 -5
- package/src/session/{inspector → facets}/ChangesTab.tsx +3 -3
- package/src/session/{inspector → facets}/SetupTab.tsx +13 -1
- package/src/session/{inspector → facets}/UsageTab.tsx +1 -1
- package/src/session/{inspector → facets}/__tests__/ArtifactsTab.test.tsx +35 -1
- package/src/session/facets/__tests__/SetupTab.test.tsx +44 -0
- package/src/session/{inspector → facets}/index.ts +0 -16
- package/src/session/index.ts +30 -13
- package/src/session/plan-document.ts +19 -0
- package/src/session/useOpenFileChange.ts +53 -0
- package/src/session/usePlanDraft.ts +109 -0
- package/src/session/useSessionConversation.ts +7 -0
- package/src/session/useSessionPageFlow.ts +1 -0
- package/src/session/useSessionPanel.ts +288 -0
- package/src/session/useSessionRailViews.tsx +200 -0
- package/src/workflow/WorkflowExecutionGraph.tsx +1 -1
- package/src/workflow/index.ts +1 -1
- package/src/workflow/useFollowExecution.ts +1 -1
- package/src/workspace/EditorTabs.tsx +145 -0
- package/src/workspace/ExplorerTree.tsx +247 -0
- package/src/workspace/FileViewer.tsx +516 -0
- package/src/workspace/WorkspaceContentSearch.tsx +478 -0
- package/src/workspace/WorkspaceContentSearcher.ts +70 -0
- package/src/workspace/WorkspaceFileLister.ts +11 -0
- package/src/workspace/WorkspaceFileReader.ts +57 -0
- package/src/workspace/WorkspaceFileSearch.tsx +429 -0
- package/src/workspace/WorkspaceSurface.tsx +781 -0
- package/src/workspace/__tests__/EditorTabs.test.tsx +100 -0
- package/src/workspace/__tests__/ExplorerTree.test.tsx +152 -0
- package/src/workspace/__tests__/FileViewer.test.tsx +421 -0
- package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +196 -0
- package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +206 -0
- package/src/workspace/__tests__/WorkspaceSurface.test.tsx +348 -0
- package/src/workspace/__tests__/findChangeForSelection.test.ts +132 -0
- package/src/workspace/__tests__/matchContentPreview.test.ts +55 -0
- package/src/workspace/__tests__/matchWorkspaceFiles.test.ts +104 -0
- package/src/workspace/__tests__/resolveWorkspaceFileSelection.test.ts +135 -0
- package/src/workspace/__tests__/useWorkspaceContentSearch.test.tsx +196 -0
- package/src/workspace/__tests__/useWorkspaceFileContent.test.tsx +190 -0
- package/src/workspace/__tests__/useWorkspaceFileSearch.test.tsx +162 -0
- package/src/workspace/findChangeForSelection.ts +61 -0
- package/src/workspace/index.ts +56 -2
- package/src/workspace/matchContentPreview.ts +51 -0
- package/src/workspace/matchWorkspaceFiles.ts +86 -0
- package/src/workspace/resolveWorkspaceFileSelection.ts +119 -0
- package/src/workspace/useWorkspaceContentSearch.ts +228 -0
- package/src/workspace/useWorkspaceFileContent.ts +129 -0
- package/src/workspace/useWorkspaceFileSearch.ts +184 -0
- package/src/workspace/useWorkspaceFiles.ts +27 -27
- package/src/workspace/workspaceListingCache.ts +93 -0
- package/styles.css +1 -1
- package/workflow/WorkflowExecutionGraph.js +1 -1
- package/workflow/WorkflowExecutionGraph.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/useFollowExecution.js +1 -1
- package/workflow/useFollowExecution.js.map +1 -1
- package/workspace/EditorTabs.d.ts +29 -0
- package/workspace/EditorTabs.d.ts.map +1 -0
- package/workspace/EditorTabs.js +66 -0
- package/workspace/EditorTabs.js.map +1 -0
- package/workspace/ExplorerTree.d.ts +32 -0
- package/workspace/ExplorerTree.d.ts.map +1 -0
- package/workspace/ExplorerTree.js +45 -0
- package/workspace/ExplorerTree.js.map +1 -0
- package/workspace/FileViewer.d.ts +93 -0
- package/workspace/FileViewer.d.ts.map +1 -0
- package/workspace/FileViewer.js +182 -0
- package/workspace/FileViewer.js.map +1 -0
- package/workspace/WorkspaceContentSearch.d.ts +41 -0
- package/workspace/WorkspaceContentSearch.d.ts.map +1 -0
- package/workspace/WorkspaceContentSearch.js +195 -0
- package/workspace/WorkspaceContentSearch.js.map +1 -0
- package/workspace/WorkspaceContentSearcher.d.ts +59 -0
- package/workspace/WorkspaceContentSearcher.d.ts.map +1 -0
- package/workspace/WorkspaceContentSearcher.js +7 -0
- package/workspace/WorkspaceContentSearcher.js.map +1 -0
- package/workspace/WorkspaceFileLister.d.ts +11 -0
- package/workspace/WorkspaceFileLister.d.ts.map +1 -1
- package/workspace/WorkspaceFileReader.d.ts +48 -0
- package/workspace/WorkspaceFileReader.d.ts.map +1 -0
- package/workspace/WorkspaceFileReader.js +11 -0
- package/workspace/WorkspaceFileReader.js.map +1 -0
- package/workspace/WorkspaceFileSearch.d.ts +32 -0
- package/workspace/WorkspaceFileSearch.d.ts.map +1 -0
- package/workspace/WorkspaceFileSearch.js +155 -0
- package/workspace/WorkspaceFileSearch.js.map +1 -0
- package/workspace/WorkspaceSurface.d.ts +151 -0
- package/workspace/WorkspaceSurface.d.ts.map +1 -0
- package/workspace/WorkspaceSurface.js +184 -0
- package/workspace/WorkspaceSurface.js.map +1 -0
- package/workspace/findChangeForSelection.d.ts +19 -0
- package/workspace/findChangeForSelection.d.ts.map +1 -0
- package/workspace/findChangeForSelection.js +46 -0
- package/workspace/findChangeForSelection.js.map +1 -0
- package/workspace/index.d.ts +24 -2
- package/workspace/index.d.ts.map +1 -1
- package/workspace/index.js +13 -1
- package/workspace/index.js.map +1 -1
- package/workspace/matchContentPreview.d.ts +21 -0
- package/workspace/matchContentPreview.d.ts.map +1 -0
- package/workspace/matchContentPreview.js +36 -0
- package/workspace/matchContentPreview.js.map +1 -0
- package/workspace/matchWorkspaceFiles.d.ts +30 -0
- package/workspace/matchWorkspaceFiles.d.ts.map +1 -0
- package/workspace/matchWorkspaceFiles.js +58 -0
- package/workspace/matchWorkspaceFiles.js.map +1 -0
- package/workspace/resolveWorkspaceFileSelection.d.ts +19 -0
- package/workspace/resolveWorkspaceFileSelection.d.ts.map +1 -0
- package/workspace/resolveWorkspaceFileSelection.js +115 -0
- package/workspace/resolveWorkspaceFileSelection.js.map +1 -0
- package/workspace/useWorkspaceContentSearch.d.ts +69 -0
- package/workspace/useWorkspaceContentSearch.d.ts.map +1 -0
- package/workspace/useWorkspaceContentSearch.js +154 -0
- package/workspace/useWorkspaceContentSearch.js.map +1 -0
- package/workspace/useWorkspaceFileContent.d.ts +73 -0
- package/workspace/useWorkspaceFileContent.d.ts.map +1 -0
- package/workspace/useWorkspaceFileContent.js +57 -0
- package/workspace/useWorkspaceFileContent.js.map +1 -0
- package/workspace/useWorkspaceFileSearch.d.ts +61 -0
- package/workspace/useWorkspaceFileSearch.d.ts.map +1 -0
- package/workspace/useWorkspaceFileSearch.js +119 -0
- package/workspace/useWorkspaceFileSearch.js.map +1 -0
- package/workspace/useWorkspaceFiles.d.ts +13 -5
- package/workspace/useWorkspaceFiles.d.ts.map +1 -1
- package/workspace/useWorkspaceFiles.js +18 -19
- package/workspace/useWorkspaceFiles.js.map +1 -1
- package/workspace/workspaceListingCache.d.ts +47 -0
- package/workspace/workspaceListingCache.d.ts.map +1 -0
- package/workspace/workspaceListingCache.js +55 -0
- package/workspace/workspaceListingCache.js.map +1 -0
- package/session/inspector/ArtifactsTab.d.ts.map +0 -1
- package/session/inspector/ArtifactsTab.js.map +0 -1
- package/session/inspector/ChangesTab.d.ts.map +0 -1
- package/session/inspector/ChangesTab.js.map +0 -1
- package/session/inspector/InspectTab.d.ts.map +0 -1
- package/session/inspector/InspectTab.js.map +0 -1
- package/session/inspector/SessionInspector.d.ts +0 -64
- package/session/inspector/SessionInspector.d.ts.map +0 -1
- package/session/inspector/SessionInspector.js +0 -53
- package/session/inspector/SessionInspector.js.map +0 -1
- package/session/inspector/SetupTab.d.ts.map +0 -1
- package/session/inspector/SetupTab.js.map +0 -1
- package/session/inspector/UsageTab.d.ts.map +0 -1
- package/session/inspector/UsageTab.js.map +0 -1
- package/session/inspector/WorkspaceTab.d.ts +0 -35
- package/session/inspector/WorkspaceTab.d.ts.map +0 -1
- package/session/inspector/WorkspaceTab.js +0 -75
- package/session/inspector/WorkspaceTab.js.map +0 -1
- package/session/inspector/index.d.ts.map +0 -1
- package/session/inspector/index.js.map +0 -1
- package/session/inspector/useSessionInspector.d.ts +0 -49
- package/session/inspector/useSessionInspector.d.ts.map +0 -1
- package/session/inspector/useSessionInspector.js +0 -122
- package/session/inspector/useSessionInspector.js.map +0 -1
- package/src/session/inspector/SessionInspector.tsx +0 -162
- package/src/session/inspector/WorkspaceTab.tsx +0 -245
- package/src/session/inspector/__tests__/useSessionInspector.test.ts +0 -251
- package/src/session/inspector/useSessionInspector.ts +0 -178
- package/src/workspace/WorkspaceEntryFiles.tsx +0 -196
- package/workflow/motion-preference.d.ts.map +0 -1
- package/workflow/motion-preference.js.map +0 -1
- package/workspace/WorkspaceEntryFiles.d.ts +0 -22
- package/workspace/WorkspaceEntryFiles.d.ts.map +0 -1
- package/workspace/WorkspaceEntryFiles.js +0 -58
- package/workspace/WorkspaceEntryFiles.js.map +0 -1
- /package/session/{inspector → facets}/InspectTab.d.ts +0 -0
- /package/session/{inspector → facets}/InspectTab.js +0 -0
- /package/src/{workflow → internal}/__tests__/motion-preference.test.ts +0 -0
- /package/src/session/{inspector → facets}/InspectTab.tsx +0 -0
- /package/src/session/{inspector → facets}/__tests__/ChangesTab.test.tsx +0 -0
|
@@ -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,2CAsJ1B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
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
|
+
return (_jsxs("div", { className: cn("flex h-full flex-col", className), children: [_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: () => {
|
|
78
|
+
setQuery("");
|
|
79
|
+
inputRef.current?.focus();
|
|
80
|
+
}, 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({
|
|
81
|
+
groups,
|
|
82
|
+
showGroupHeaders,
|
|
83
|
+
selectedFile: selectedFile ?? null,
|
|
84
|
+
focusIndex,
|
|
85
|
+
optionId,
|
|
86
|
+
onOpenFile,
|
|
87
|
+
}) }), 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."] }))] })) })] }));
|
|
88
|
+
}
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Result rows — a single pass over groups that keeps the flat match index
|
|
91
|
+
// aligned with `flatResults` (and thus keyboard focus / aria-activedescendant).
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
function renderRows({ groups, showGroupHeaders, selectedFile, focusIndex, optionId, onOpenFile, }) {
|
|
94
|
+
const rows = [];
|
|
95
|
+
let matchIndex = 0;
|
|
96
|
+
for (const group of groups) {
|
|
97
|
+
if (showGroupHeaders) {
|
|
98
|
+
rows.push(_jsx(GroupHeader, { name: group.entry.name }, `h:${group.entry.id}`));
|
|
99
|
+
}
|
|
100
|
+
for (const match of group.matches) {
|
|
101
|
+
if (matchIndex >= MAX_RESULTS)
|
|
102
|
+
break;
|
|
103
|
+
const index = matchIndex++;
|
|
104
|
+
const isOpen = selectedFile?.entryId === group.entry.id &&
|
|
105
|
+
selectedFile.path === match.path;
|
|
106
|
+
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}`));
|
|
107
|
+
}
|
|
108
|
+
if (group.truncated) {
|
|
109
|
+
rows.push(_jsx(GroupNotice, { children: "Partial listing \u2014 this repository has too many files to search in full." }, `t:${group.entry.id}`));
|
|
110
|
+
}
|
|
111
|
+
if (group.error) {
|
|
112
|
+
rows.push(_jsxs(GroupNotice, { isError: true, children: ["Couldn\u2019t list files: ", group.error.message] }, `e:${group.entry.id}`));
|
|
113
|
+
}
|
|
114
|
+
if (matchIndex >= MAX_RESULTS)
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
return rows;
|
|
118
|
+
}
|
|
119
|
+
function ResultRow({ id, match, isFocused, isOpen, onOpen, }) {
|
|
120
|
+
const lastSlash = match.path.lastIndexOf("/");
|
|
121
|
+
const basename = match.path.slice(lastSlash + 1);
|
|
122
|
+
const dir = lastSlash >= 0 ? match.path.slice(0, lastSlash) : "";
|
|
123
|
+
return (_jsx("li", { id: id, role: "option", "aria-selected": isFocused, children: _jsxs("button", { type: "button", onClick: onOpen, tabIndex: -1, "aria-current": isOpen ? "true" : undefined, className: cn("flex w-full items-baseline gap-1.5 px-3 py-1 text-left 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 }) }))] }) }));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Renders a slice of the path (`text`, starting at `offset` within the full
|
|
127
|
+
* path), emphasizing the intersection with the match range `[matchStart,
|
|
128
|
+
* matchEnd)`. Non-overlapping slices render plain.
|
|
129
|
+
*/
|
|
130
|
+
function HighlightedPath({ text, offset, matchStart, matchEnd, }) {
|
|
131
|
+
const localStart = Math.max(0, matchStart - offset);
|
|
132
|
+
const localEnd = Math.min(text.length, matchEnd - offset);
|
|
133
|
+
if (localStart >= localEnd)
|
|
134
|
+
return _jsx(_Fragment, { children: text });
|
|
135
|
+
return (_jsxs(_Fragment, { children: [text.slice(0, localStart), _jsx("span", { className: "font-semibold text-foreground", children: text.slice(localStart, localEnd) }), text.slice(localEnd)] }));
|
|
136
|
+
}
|
|
137
|
+
function GroupHeader({ name }) {
|
|
138
|
+
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 }));
|
|
139
|
+
}
|
|
140
|
+
function GroupNotice({ children, isError, }) {
|
|
141
|
+
return (_jsx("li", { role: "presentation", className: cn("px-3 py-1 text-[0.65rem]", isError ? "text-destructive" : "text-muted-foreground"), children: children }));
|
|
142
|
+
}
|
|
143
|
+
function MessageState({ children }) {
|
|
144
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center p-8 text-center text-xs text-muted-foreground", children: children }));
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Inline SVG icons (SDK independence — no lucide dependency)
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
function SearchIcon() {
|
|
150
|
+
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" })] }));
|
|
151
|
+
}
|
|
152
|
+
function ClearIcon() {
|
|
153
|
+
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" }) }));
|
|
154
|
+
}
|
|
155
|
+
//# 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
|
|
@@ -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,184 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, 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 } 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
|
+
// Roving selection: arrows move relative to the *focused* item's position,
|
|
56
|
+
// so the rail scales to any number of injected views.
|
|
57
|
+
const handleKeyDown = useCallback((e, index) => {
|
|
58
|
+
let nextIndex = null;
|
|
59
|
+
if (e.key === "ArrowDown" || e.key === "ArrowRight") {
|
|
60
|
+
nextIndex = Math.min(index + 1, items.length - 1);
|
|
61
|
+
}
|
|
62
|
+
else if (e.key === "ArrowUp" || e.key === "ArrowLeft") {
|
|
63
|
+
nextIndex = Math.max(index - 1, 0);
|
|
64
|
+
}
|
|
65
|
+
if (nextIndex === null || nextIndex === index)
|
|
66
|
+
return;
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
onViewChange(items[nextIndex].id);
|
|
69
|
+
}, [items, onViewChange]);
|
|
70
|
+
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) => {
|
|
71
|
+
const isSelected = view === item.id;
|
|
72
|
+
const showBadge = item.badge != null && item.badge > 0;
|
|
73
|
+
return (_jsxs("button", { 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
|
|
74
|
+
? "bg-accent text-foreground"
|
|
75
|
+
: "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));
|
|
76
|
+
}) }));
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Explorer sidebar — multi-root file tree
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
function ExplorerSidebar({ entries, lister, selectedFile, onOpenFile, onActivateFile, onRemoveEntry, onAddLocalFolder, }) {
|
|
82
|
+
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" })] }) }))] }));
|
|
83
|
+
}
|
|
84
|
+
function SearchSidebar({ entries, lister, searcher, selectedFile, onOpenFile, }) {
|
|
85
|
+
// Filename search is the default: cached, instant, and always available.
|
|
86
|
+
// Content (text) search is opt-in and only offered when a searcher exists.
|
|
87
|
+
const [mode, setMode] = useState("name");
|
|
88
|
+
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" }))] }));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `Name | Text` search-mode selector, mirroring `FileViewer`'s `Diff | File`
|
|
92
|
+
* radiogroup (roving `tabindex`, arrow-key roving, `role="radio"`). Shown only
|
|
93
|
+
* when a content searcher is injected.
|
|
94
|
+
*/
|
|
95
|
+
function SearchModeToggle({ value, onChange, }) {
|
|
96
|
+
const options = [
|
|
97
|
+
{ value: "name", label: "Name" },
|
|
98
|
+
{ value: "text", label: "Text" },
|
|
99
|
+
];
|
|
100
|
+
const handleKeyDown = useCallback((e) => {
|
|
101
|
+
if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
|
|
102
|
+
e.preventDefault();
|
|
103
|
+
onChange(value === "name" ? "text" : "name");
|
|
104
|
+
}
|
|
105
|
+
}, [value, onChange]);
|
|
106
|
+
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) => {
|
|
107
|
+
const isSelected = value === option.value;
|
|
108
|
+
return (_jsx("button", { 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
|
|
109
|
+
? "bg-background text-foreground shadow-sm"
|
|
110
|
+
: "text-muted-foreground hover:text-foreground"), children: option.label }, option.value));
|
|
111
|
+
}) }) }));
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Extra-view sidebar — host-injected facet content (Config, Changes, …)
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
function ExtraViewSidebar({ view }) {
|
|
117
|
+
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 })] }));
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Editor area — collapse control + tab strip + read-only FileViewer
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
function EditorArea({ entries, reader, editors, selectedFile, virtualDocuments, change, reveal, onActivateEditor, onPinEditor, onCloseEditor, onCollapse, }) {
|
|
123
|
+
const viewerRef = useRef(null);
|
|
124
|
+
const activeKey = selectedFile
|
|
125
|
+
? editorKey(selectedFile.entryId, selectedFile.path)
|
|
126
|
+
: null;
|
|
127
|
+
// The active tab is a virtual document when its identity matches an injected
|
|
128
|
+
// one — the body renders the document's content instead of the file viewer.
|
|
129
|
+
const activeVirtualDocument = activeKey !== null
|
|
130
|
+
? virtualDocuments?.find((d) => editorKey(d.entryId, d.path) === activeKey)
|
|
131
|
+
: undefined;
|
|
132
|
+
const activeEntryName = selectedFile
|
|
133
|
+
? entries.find((e) => e.id === selectedFile.entryId)?.name
|
|
134
|
+
: undefined;
|
|
135
|
+
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, className: "min-w-0 flex-1 border-b-0" }))] }), activeVirtualDocument ? (
|
|
136
|
+
// A virtual document owns its body wholesale: no breadcrumbs (there is
|
|
137
|
+
// no filesystem location) and no FileViewer (there is no reader-backed
|
|
138
|
+
// file). Keyed like files so switching documents resets cleanly.
|
|
139
|
+
// Vertical-only scrolling: a lone overflow-y-auto would compute
|
|
140
|
+
// overflow-x to auto too, giving the pane a horizontal scrollbar the
|
|
141
|
+
// moment any child refuses to shrink — documents must reflow instead.
|
|
142
|
+
_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." }))] }));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Location breadcrumb for the active file: entry › folder › … › file, with an
|
|
146
|
+
* optional refresh. Display-only orientation (clickable navigation is a future
|
|
147
|
+
* enhancement); the refresh re-fetches the live file content.
|
|
148
|
+
*/
|
|
149
|
+
function Breadcrumbs({ entryName, path, onRefresh, }) {
|
|
150
|
+
const segments = path.split("/").filter(Boolean);
|
|
151
|
+
const crumbs = entryName ? [entryName, ...segments] : segments;
|
|
152
|
+
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) => {
|
|
153
|
+
const isLast = i === crumbs.length - 1;
|
|
154
|
+
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));
|
|
155
|
+
}) }), 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, {}) }))] }));
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Shared sidebar chrome
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
function SidebarHeader({ title }) {
|
|
161
|
+
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 }));
|
|
162
|
+
}
|
|
163
|
+
function SidebarEmpty({ children }) {
|
|
164
|
+
return (_jsx("div", { className: "px-2 py-6 text-center text-xs text-muted-foreground", children: children }));
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Inline SVG icons (SDK independence — no lucide dependency)
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
function FilesIcon() {
|
|
170
|
+
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" })] }));
|
|
171
|
+
}
|
|
172
|
+
function SearchIcon() {
|
|
173
|
+
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" })] }));
|
|
174
|
+
}
|
|
175
|
+
function FolderPlusIcon() {
|
|
176
|
+
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" })] }));
|
|
177
|
+
}
|
|
178
|
+
function ChevronLeftIcon() {
|
|
179
|
+
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" }) }));
|
|
180
|
+
}
|
|
181
|
+
function RefreshIcon() {
|
|
182
|
+
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" })] }));
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=WorkspaceSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceSurface.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceSurface.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAsC,MAAM,OAAO,CAAC;AAC1F,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,SAAS,GAIV,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,iDAAiD;AACjD,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AAyIpD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,UAAU,EACV,MAAM,EACN,MAAM,EACN,SAAS,GACa;IACtB,wEAAwE;IACxE,qEAAqE;IACrE,oEAAoE;IACpE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,IAAI,IAAI,gBAAgB,CAAC;IAC/C,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,IAAY,EAAE,EAAE;QACf,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC1B,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,6EAA6E;IAC7E,yCAAyC;IACzC,MAAM,WAAW,GACd,cAAoC,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7D,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,MAAM,eAAe,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAErE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAClD,KAAC,YAAY,IACX,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,UAAU,GACtB,EACF,KAAC,cAAc,IACb,aAAa,EAAC,SAAS,EACvB,WAAW,EAAE,GAAG,EAChB,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG,EACZ,UAAU,EAAC,8BAA8B,EACzC,SAAS,EAAC,gBAAgB;gBAC1B,qEAAqE;gBACrE,kEAAkE;gBAClE,mEAAmE;gBACnE,SAAS,EAAC,wBAAwB,EAClC,OAAO,EACL,eAAe,CAAC,CAAC,CAAC,CAChB,KAAC,gBAAgB,IAAC,IAAI,EAAE,eAAe,GAAI,CAC5C,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC5B,KAAC,aAAa,IACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACtB,CACH,CAAC,CAAC,CAAC,CACF,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,WAAW,EAC3B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,GAClC,CACH,EAEH,SAAS,EACP,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACtB,GAEJ,IACE,CACP,CAAC;AACJ,CAAC;AAaD,SAAS,YAAY,CAAC,EACpB,IAAI,EACJ,YAAY,EACZ,UAAU,GAKX;IACC,MAAM,KAAK,GAAwB;QACjC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAC,SAAS,KAAG,EAAE;QACvD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAC,UAAU,KAAG,EAAE;QACvD,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;KACtB,CAAC;IAEF,2EAA2E;IAC3E,sDAAsD;IACtD,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAmC,EAAE,KAAa,EAAE,EAAE;QACrD,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YACpD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACxD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO;QACtD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,EACD,CAAC,KAAK,EAAE,YAAY,CAAC,CACtB,CAAC;IAEF,OAAO,CACL,cACE,IAAI,EAAC,YAAY,gBACN,gBAAgB,sBACV,UAAU,EAC3B,SAAS,EAAC,2FAA2F,YAEpG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACzB,MAAM,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvD,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,kBACE,UAAU,gBACZ,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EACpE,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACzC,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,yEAAyE,EACzE,UAAU;oBACR,CAAC,CAAC,2BAA2B;oBAC7B,CAAC,CAAC,mEAAmE,CACxE,aAEA,IAAI,CAAC,IAAI,EACT,SAAS,IAAI,CACZ,8BACc,MAAM,EAClB,SAAS,EAAC,sLAAsL,YAE/L,IAAI,CAAC,KAAK,GACN,CACR,KAzBI,IAAI,CAAC,EAAE,CA0BL,CACV,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAE9E,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,GASjB;IACC,OAAO,CACL,eAAK,SAAS,EAAC,qDAAqD,aAClE,KAAC,aAAa,IAAC,KAAK,EAAC,UAAU,GAAG,EAClC,cAAK,SAAS,EAAC,uCAAuC,YACnD,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACjC,KAAC,YAAY,yCAAsC,CACpD,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,GAC5B,CACH,GACG,EACL,gBAAgB,IAAI,CACnB,cAAK,SAAS,EAAC,6CAA6C,YAC1D,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAC,+LAA+L,aAEzM,KAAC,cAAc,KAAG,EAClB,eAAM,SAAS,EAAC,kBAAkB,2BAAkB,IAC7C,GACL,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAQD,SAAS,aAAa,CAAC,EACrB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,UAAU,GAWX;IACC,yEAAyE;IACzE,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAa,MAAM,CAAC,CAAC;IAErD,OAAO,CACL,eAAK,SAAS,EAAC,qDAAqD,aAClE,KAAC,aAAa,IAAC,KAAK,EAAC,QAAQ,GAAG,EAC/B,QAAQ,IAAI,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAI,EAChE,QAAQ,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC7B,KAAC,sBAAsB,IACrB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAC,gBAAgB,GAC1B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,mBAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAC,gBAAgB,GAC1B,CACH,IACG,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,OAAO,GAAsE;QACjF,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;KACjC,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAmC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACpD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,6CAA6C,YAC1D,cACE,IAAI,EAAC,YAAY,gBACN,aAAa,EACxB,SAAS,EAAC,uCAAuC,YAEhD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACtB,MAAM,UAAU,GAAG,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;gBAC1C,OAAO,CACL,iBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,kBACE,UAAU,EACxB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EACrC,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,yEAAyE,EACzE,UAAU;wBACR,CAAC,CAAC,yCAAyC;wBAC3C,CAAC,CAAC,6CAA6C,CAClD,YAEA,MAAM,CAAC,KAAK,IAfR,MAAM,CAAC,KAAK,CAgBV,CACV,CAAC;YACJ,CAAC,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,EAAE,IAAI,EAAsC;IACpE,OAAO,CACL,eAAK,SAAS,EAAC,qDAAqD,aAClE,KAAC,aAAa,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAI,EAGpC,cAAK,SAAS,EAAC,0CAA0C,YACtD,IAAI,CAAC,OAAO,GACT,IACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,SAAS,UAAU,CAAC,EAClB,OAAO,EACP,MAAM,EACN,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,UAAU,GAaX;IACC,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY;QAC5B,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC;IACT,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,qBAAqB,GACzB,SAAS,KAAK,IAAI;QAChB,CAAC,CAAC,gBAAgB,EAAE,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,CAClD;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,eAAe,GAAG,YAAY;QAClC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI;QAC1D,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAI3C,eAAK,SAAS,EAAC,0DAA0D,aACvE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,gBACR,cAAc,EACzB,KAAK,EAAC,cAAc,EACpB,SAAS,EAAC,6OAA6O,YAEvP,KAAC,eAAe,KAAG,GACZ,EACR,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,2BAA2B,GACrC,CACH,IACG,EACL,qBAAqB,CAAC,CAAC,CAAC;YACvB,uEAAuE;YACvE,uEAAuE;YACvE,iEAAiE;YACjE,gEAAgE;YAChE,qEAAqE;YACrE,sEAAsE;YACtE,cAEE,SAAS,EAAC,0DAA0D,YAEnE,qBAAqB,CAAC,OAAO,IAHzB,SAAS,IAAI,SAAS,CAIvB,CACP,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CACjB,8BACE,KAAC,WAAW,IACV,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,YAAY,CAAC,IAAI,EACvB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,GAClE,EAIF,KAAC,UAAU,IACT,GAAG,EAAE,SAAS,EAEd,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,KAAK,EACjB,SAAS,EAAC,gBAAgB,IARrB,SAAS,IAAI,SAAS,CAS3B,IACD,CACJ,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,uFAAuF,oDAEhG,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,IAAI,EACJ,SAAS,GAKV;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/D,OAAO,CACL,eAAK,SAAS,EAAC,8GAA8G,aAC3H,4BAAgB,eAAe,EAAC,SAAS,EAAC,wCAAwC,YAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACvB,MAAM,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBACvC,OAAO,CACL,gBAAc,SAAS,EAAC,iCAAiC,aACtD,CAAC,GAAG,CAAC,IAAI,eAAM,SAAS,EAAC,8BAA8B,iBAAa,MAAM,uBAAS,EACpF,eAAM,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,IAAI,iBAAiB,CAAC,YACzD,KAAK,GACD,KAJE,CAAC,CAKL,CACR,CAAC;gBACJ,CAAC,CAAC,GACE,EACL,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,gBACP,aAAa,EACxB,KAAK,EAAC,aAAa,EACnB,SAAS,EAAC,8JAA8J,YAExK,KAAC,WAAW,KAAG,GACR,CACV,IACG,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,SAAS,aAAa,CAAC,EAAE,KAAK,EAA8B;IAC1D,OAAO,CACL,cAAK,SAAS,EAAC,sHAAsH,YAClI,KAAK,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA0C;IACxE,OAAO,CACL,cAAK,SAAS,EAAC,qDAAqD,YACjE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,SAAS,SAAS;IAChB,OAAO,CACL,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,aACjK,eAAM,CAAC,EAAC,4DAA4D,GAAG,EACvE,eAAM,CAAC,EAAC,WAAW,GAAG,IAClB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CACL,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,aACjK,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,eAAM,CAAC,EAAC,iBAAiB,GAAG,IACxB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CACL,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,SAAS,EAAC,gCAAgC,iBAAa,MAAM,aAC5M,eAAM,CAAC,EAAC,mFAAmF,GAAG,EAC9F,eAAM,CAAC,EAAC,kBAAkB,GAAG,IACzB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CACL,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,YACjK,eAAM,CAAC,EAAC,iBAAiB,GAAG,GACxB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,CACL,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,aACjK,eAAM,CAAC,EAAC,gEAAgE,GAAG,EAC3E,eAAM,CAAC,EAAC,2BAA2B,GAAG,IAClC,CACP,CAAC;AACJ,CAAC"}
|