@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,145 @@
|
|
|
1
|
+
import type { RevealTarget } from "../useRevealLine.js";
|
|
2
|
+
import type { SelectedWorkspaceFile } from "./workspace-file-selection-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Options for opening a file in the surface (via `openPreview` / the surface's
|
|
5
|
+
* `onOpenFile` seam). `line` requests a jump-to-line reveal: the file opens in
|
|
6
|
+
* a line-faithful view scrolled to and highlighting that 1-based line. Absent,
|
|
7
|
+
* the file opens normally (top of file / diff-default). Deliberately an options
|
|
8
|
+
* object so future open-intents (e.g. a column) extend it without churning the
|
|
9
|
+
* callback signature.
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenFileOptions {
|
|
12
|
+
/** 1-based line to reveal after opening. */
|
|
13
|
+
readonly line?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A pending reveal request scoped to a specific editor. Extends the viewer-side
|
|
17
|
+
* {@link RevealTarget} with the `key` of the editor it targets, so a consumer
|
|
18
|
+
* applies the reveal only while that editor is the active one. Transient
|
|
19
|
+
* navigation, never editor identity (the line does not key the tab).
|
|
20
|
+
*/
|
|
21
|
+
export interface EditorReveal extends RevealTarget {
|
|
22
|
+
/** {@link editorKey} of the editor this reveal targets. */
|
|
23
|
+
readonly key: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* One open editor tab.
|
|
27
|
+
*
|
|
28
|
+
* `preview` marks the single reusable "preview" tab (shown in italics): a
|
|
29
|
+
* single click opens or replaces it in place, so casual browsing never
|
|
30
|
+
* accumulates tabs. Pinning it (double-click, or opening the file explicitly)
|
|
31
|
+
* clears the flag and the tab becomes persistent. At most one editor is a
|
|
32
|
+
* preview at any time.
|
|
33
|
+
*/
|
|
34
|
+
export interface OpenEditor {
|
|
35
|
+
/** Stable-within-page id of the owning workspace entry. */
|
|
36
|
+
readonly entryId: string;
|
|
37
|
+
/** Repo-relative (git) or root-relative (local) file path. */
|
|
38
|
+
readonly path: string;
|
|
39
|
+
/** Whether this is the reusable preview tab (italic, single per group). */
|
|
40
|
+
readonly preview: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Immutable snapshot for the `useSyncExternalStore` contract. */
|
|
43
|
+
export interface WorkspaceEditorsSnapshot {
|
|
44
|
+
/** Open editors in tab order. */
|
|
45
|
+
readonly editors: readonly OpenEditor[];
|
|
46
|
+
/** Key of the active editor, or `null` when the group is empty. */
|
|
47
|
+
readonly activeKey: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The active editor as a {@link SelectedWorkspaceFile} (stable ref between
|
|
50
|
+
* mutations), or `null`. This is what the viewer, diff correlation, and tree
|
|
51
|
+
* highlight consume — the editors store's projection into the selection shape.
|
|
52
|
+
*/
|
|
53
|
+
readonly activeFile: SelectedWorkspaceFile | null;
|
|
54
|
+
/**
|
|
55
|
+
* A pending jump-to-line reveal, or `null`. Set only by an open-with-line
|
|
56
|
+
* (`openPreview` with a `line`); cleared by any other active-editor change so
|
|
57
|
+
* returning to a tab never re-scrolls to a stale line. Consumers honor it only
|
|
58
|
+
* while `reveal.key` matches {@link activeKey}. Transient — not part of any
|
|
59
|
+
* editor's identity.
|
|
60
|
+
*/
|
|
61
|
+
readonly reveal: EditorReveal | null;
|
|
62
|
+
}
|
|
63
|
+
type Listener = () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Stable key for an editor. Uses NUL as the separator — legal in neither an
|
|
66
|
+
* entry id nor a file path — so `entryId`/`path` can never collide.
|
|
67
|
+
*/
|
|
68
|
+
export declare function editorKey(entryId: string, path: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Entry id for a virtual document — an editor tab whose content is not a
|
|
71
|
+
* workspace file (e.g. the session's `plan.md`, an execution artifact).
|
|
72
|
+
* Virtual documents share the editor group with file tabs (same open / pin /
|
|
73
|
+
* close / activate semantics); only their *content rendering* differs, via the
|
|
74
|
+
* surface's `virtualDocuments` seam. `kind` names the document family
|
|
75
|
+
* (`"plan"` today) so future virtual documents get distinct identities.
|
|
76
|
+
*/
|
|
77
|
+
export declare function virtualEntryId(kind: string): string;
|
|
78
|
+
/**
|
|
79
|
+
* True when an entry id names a virtual document rather than a workspace
|
|
80
|
+
* entry. Used by file-only consumers (diff correlation, tree highlight,
|
|
81
|
+
* reveal) to skip work that can only apply to real files.
|
|
82
|
+
*/
|
|
83
|
+
export declare function isVirtualEntryId(entryId: string): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Framework-agnostic store for the surface's open-editor group.
|
|
86
|
+
*
|
|
87
|
+
* Implements the `useSyncExternalStore` contract like the sibling selection and
|
|
88
|
+
* conversation stores: the context/ref carries the instance, and `getSnapshot`
|
|
89
|
+
* returns a snapshot object that is replaced only inside a mutation — so it is a
|
|
90
|
+
* stable reference between mutations and never triggers a render loop.
|
|
91
|
+
*
|
|
92
|
+
* VS Code preview-tab semantics:
|
|
93
|
+
* - {@link openPreview} — single click: reuse the one preview slot (or focus an
|
|
94
|
+
* already-open editor); casual browsing stays at one tab.
|
|
95
|
+
* - {@link openPinned} / {@link pin} — double-click or explicit open: the tab
|
|
96
|
+
* becomes persistent.
|
|
97
|
+
* - {@link close} — remove a tab, activating a neighbor.
|
|
98
|
+
* - {@link activate} — focus an already-open tab.
|
|
99
|
+
*/
|
|
100
|
+
export declare class WorkspaceEditorsStore {
|
|
101
|
+
private _snapshot;
|
|
102
|
+
private _listeners;
|
|
103
|
+
/** Monotonic reveal token — bumped on every open-with-line (see `openPreview`). */
|
|
104
|
+
private _revealSeq;
|
|
105
|
+
/**
|
|
106
|
+
* Single-click open: reuse the preview slot, or focus if already open.
|
|
107
|
+
*
|
|
108
|
+
* When `options.line` is set, this also records a jump-to-line reveal for the
|
|
109
|
+
* opened editor. The reveal nonce is bumped **every** time — even when the
|
|
110
|
+
* file is already open and active — so a second search hit in the same file
|
|
111
|
+
* re-scrolls the already-mounted viewer. An open without a `line` clears any
|
|
112
|
+
* pending reveal.
|
|
113
|
+
*/
|
|
114
|
+
openPreview(entryId: string, path: string, options?: OpenFileOptions): void;
|
|
115
|
+
/** Explicit open (double-click / open-to-keep): a persistent tab. */
|
|
116
|
+
openPinned(entryId: string, path: string): void;
|
|
117
|
+
/** Pin an open editor (clear its preview flag), keeping it active. */
|
|
118
|
+
pin(entryId: string, path: string): void;
|
|
119
|
+
/** Focus an already-open editor. No-op if it is not open. */
|
|
120
|
+
activate(entryId: string, path: string): void;
|
|
121
|
+
/**
|
|
122
|
+
* Close an editor. When the closed tab was active, the neighbor to its right
|
|
123
|
+
* (or, failing that, its left) becomes active — matching editor conventions.
|
|
124
|
+
*/
|
|
125
|
+
close(entryId: string, path: string): void;
|
|
126
|
+
/** Close every editor. */
|
|
127
|
+
closeAll(): void;
|
|
128
|
+
subscribe: (listener: Listener) => (() => void);
|
|
129
|
+
/** Returns the current snapshot (stable ref between mutations). */
|
|
130
|
+
getSnapshot: () => WorkspaceEditorsSnapshot;
|
|
131
|
+
private _setActive;
|
|
132
|
+
/** Build a reveal for `key` from open options, or `null` when no line given. */
|
|
133
|
+
private _makeReveal;
|
|
134
|
+
/**
|
|
135
|
+
* Replace the snapshot. `reveal` defaults to `null`, so any mutation that does
|
|
136
|
+
* not explicitly carry one clears a pending reveal (invariant: returning to a
|
|
137
|
+
* tab must not re-scroll to a stale line). The `activeFile` object reference
|
|
138
|
+
* is preserved when the active editor is unchanged, so a reveal-only update
|
|
139
|
+
* doesn't churn downstream memoization (diff correlation, tree highlight).
|
|
140
|
+
*/
|
|
141
|
+
private _commit;
|
|
142
|
+
private _notify;
|
|
143
|
+
}
|
|
144
|
+
export {};
|
|
145
|
+
//# sourceMappingURL=workspace-editors-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-editors-store.d.ts","sourceRoot":"","sources":["../../../src/internal/store/workspace-editors-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACvC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClD;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAS3B;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,UAAU,CAAuB;IACzC,mFAAmF;IACnF,OAAO,CAAC,UAAU,CAAK;IAIvB;;;;;;;;OAQG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAsB3E,qEAAqE;IACrE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB/C,sEAAsE;IACtE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ7C;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAkB1C,0BAA0B;IAC1B,QAAQ,IAAI,IAAI;IAQhB,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAK5C;IAEF,mEAAmE;IACnE,WAAW,QAAO,wBAAwB,CAAmB;IAI7D,OAAO,CAAC,UAAU;IAKlB,gFAAgF;IAChF,OAAO,CAAC,WAAW;IASnB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,OAAO;CAKhB"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// The set of workspace files open in the surface's editor group, plus which is
|
|
2
|
+
// active — the VS Code "open editors" model. Sibling to
|
|
3
|
+
// WorkspaceFileSelectionStore (which stays the single-file selection used by the
|
|
4
|
+
// launcher's Viewer tab); this store owns the multi-tab surface. Its active
|
|
5
|
+
// editor derives the same SelectedWorkspaceFile shape, so downstream diff
|
|
6
|
+
// correlation and tree highlight consume one selection regardless of source.
|
|
7
|
+
const EMPTY_SNAPSHOT = {
|
|
8
|
+
editors: [],
|
|
9
|
+
activeKey: null,
|
|
10
|
+
activeFile: null,
|
|
11
|
+
reveal: null,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Stable key for an editor. Uses NUL as the separator — legal in neither an
|
|
15
|
+
* entry id nor a file path — so `entryId`/`path` can never collide.
|
|
16
|
+
*/
|
|
17
|
+
export function editorKey(entryId, path) {
|
|
18
|
+
return `${entryId}\u0000${path}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* NUL-prefixed namespace for virtual-document entry ids — the same
|
|
22
|
+
* collision-proofing trick as {@link editorKey}: no real workspace entry id
|
|
23
|
+
* can contain NUL, so a virtual document can never alias a workspace file.
|
|
24
|
+
*/
|
|
25
|
+
const VIRTUAL_ENTRY_PREFIX = "\u0000virtual:";
|
|
26
|
+
/**
|
|
27
|
+
* Entry id for a virtual document — an editor tab whose content is not a
|
|
28
|
+
* workspace file (e.g. the session's `plan.md`, an execution artifact).
|
|
29
|
+
* Virtual documents share the editor group with file tabs (same open / pin /
|
|
30
|
+
* close / activate semantics); only their *content rendering* differs, via the
|
|
31
|
+
* surface's `virtualDocuments` seam. `kind` names the document family
|
|
32
|
+
* (`"plan"` today) so future virtual documents get distinct identities.
|
|
33
|
+
*/
|
|
34
|
+
export function virtualEntryId(kind) {
|
|
35
|
+
return `${VIRTUAL_ENTRY_PREFIX}${kind}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* True when an entry id names a virtual document rather than a workspace
|
|
39
|
+
* entry. Used by file-only consumers (diff correlation, tree highlight,
|
|
40
|
+
* reveal) to skip work that can only apply to real files.
|
|
41
|
+
*/
|
|
42
|
+
export function isVirtualEntryId(entryId) {
|
|
43
|
+
return entryId.startsWith(VIRTUAL_ENTRY_PREFIX);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Framework-agnostic store for the surface's open-editor group.
|
|
47
|
+
*
|
|
48
|
+
* Implements the `useSyncExternalStore` contract like the sibling selection and
|
|
49
|
+
* conversation stores: the context/ref carries the instance, and `getSnapshot`
|
|
50
|
+
* returns a snapshot object that is replaced only inside a mutation — so it is a
|
|
51
|
+
* stable reference between mutations and never triggers a render loop.
|
|
52
|
+
*
|
|
53
|
+
* VS Code preview-tab semantics:
|
|
54
|
+
* - {@link openPreview} — single click: reuse the one preview slot (or focus an
|
|
55
|
+
* already-open editor); casual browsing stays at one tab.
|
|
56
|
+
* - {@link openPinned} / {@link pin} — double-click or explicit open: the tab
|
|
57
|
+
* becomes persistent.
|
|
58
|
+
* - {@link close} — remove a tab, activating a neighbor.
|
|
59
|
+
* - {@link activate} — focus an already-open tab.
|
|
60
|
+
*/
|
|
61
|
+
export class WorkspaceEditorsStore {
|
|
62
|
+
_snapshot = EMPTY_SNAPSHOT;
|
|
63
|
+
_listeners = new Set();
|
|
64
|
+
/** Monotonic reveal token — bumped on every open-with-line (see `openPreview`). */
|
|
65
|
+
_revealSeq = 0;
|
|
66
|
+
// -- Mutations -----------------------------------------------------------
|
|
67
|
+
/**
|
|
68
|
+
* Single-click open: reuse the preview slot, or focus if already open.
|
|
69
|
+
*
|
|
70
|
+
* When `options.line` is set, this also records a jump-to-line reveal for the
|
|
71
|
+
* opened editor. The reveal nonce is bumped **every** time — even when the
|
|
72
|
+
* file is already open and active — so a second search hit in the same file
|
|
73
|
+
* re-scrolls the already-mounted viewer. An open without a `line` clears any
|
|
74
|
+
* pending reveal.
|
|
75
|
+
*/
|
|
76
|
+
openPreview(entryId, path, options) {
|
|
77
|
+
const key = editorKey(entryId, path);
|
|
78
|
+
const { editors } = this._snapshot;
|
|
79
|
+
const reveal = this._makeReveal(key, options);
|
|
80
|
+
if (editors.some((e) => editorKey(e.entryId, e.path) === key)) {
|
|
81
|
+
// Already open — focus it (preserving pinned/preview state) and apply the
|
|
82
|
+
// reveal (or clear it). Reuse the same editors array ref so a reveal-only
|
|
83
|
+
// update doesn't churn the tab list.
|
|
84
|
+
this._commit(editors, key, reveal);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const next = { entryId, path, preview: true };
|
|
88
|
+
const previewIndex = editors.findIndex((e) => e.preview);
|
|
89
|
+
const editorsNext = previewIndex >= 0
|
|
90
|
+
? editors.map((e, i) => (i === previewIndex ? next : e))
|
|
91
|
+
: [...editors, next];
|
|
92
|
+
this._commit(editorsNext, key, reveal);
|
|
93
|
+
}
|
|
94
|
+
/** Explicit open (double-click / open-to-keep): a persistent tab. */
|
|
95
|
+
openPinned(entryId, path) {
|
|
96
|
+
const key = editorKey(entryId, path);
|
|
97
|
+
const { editors } = this._snapshot;
|
|
98
|
+
const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
|
|
99
|
+
if (index >= 0) {
|
|
100
|
+
if (editors[index].preview) {
|
|
101
|
+
this._commit(editors.map((e, i) => (i === index ? { ...e, preview: false } : e)), key);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this._setActive(key);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this._commit([...editors, { entryId, path, preview: false }], key);
|
|
109
|
+
}
|
|
110
|
+
/** Pin an open editor (clear its preview flag), keeping it active. */
|
|
111
|
+
pin(entryId, path) {
|
|
112
|
+
const key = editorKey(entryId, path);
|
|
113
|
+
const { editors } = this._snapshot;
|
|
114
|
+
const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
|
|
115
|
+
if (index < 0 || !editors[index].preview)
|
|
116
|
+
return;
|
|
117
|
+
this._commit(editors.map((e, i) => (i === index ? { ...e, preview: false } : e)), key);
|
|
118
|
+
}
|
|
119
|
+
/** Focus an already-open editor. No-op if it is not open. */
|
|
120
|
+
activate(entryId, path) {
|
|
121
|
+
const key = editorKey(entryId, path);
|
|
122
|
+
if (!this._snapshot.editors.some((e) => editorKey(e.entryId, e.path) === key)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this._setActive(key);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Close an editor. When the closed tab was active, the neighbor to its right
|
|
129
|
+
* (or, failing that, its left) becomes active — matching editor conventions.
|
|
130
|
+
*/
|
|
131
|
+
close(entryId, path) {
|
|
132
|
+
const key = editorKey(entryId, path);
|
|
133
|
+
const { editors, activeKey } = this._snapshot;
|
|
134
|
+
const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
|
|
135
|
+
if (index < 0)
|
|
136
|
+
return;
|
|
137
|
+
const editorsNext = editors.filter((_, i) => i !== index);
|
|
138
|
+
let nextActiveKey = activeKey;
|
|
139
|
+
if (activeKey === key) {
|
|
140
|
+
const neighbor = editorsNext[index] ?? editorsNext[index - 1] ?? null;
|
|
141
|
+
nextActiveKey = neighbor
|
|
142
|
+
? editorKey(neighbor.entryId, neighbor.path)
|
|
143
|
+
: null;
|
|
144
|
+
}
|
|
145
|
+
this._commit(editorsNext, nextActiveKey);
|
|
146
|
+
}
|
|
147
|
+
/** Close every editor. */
|
|
148
|
+
closeAll() {
|
|
149
|
+
if (this._snapshot.editors.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
this._snapshot = EMPTY_SNAPSHOT;
|
|
152
|
+
this._notify();
|
|
153
|
+
}
|
|
154
|
+
// -- useSyncExternalStore contract ---------------------------------------
|
|
155
|
+
subscribe = (listener) => {
|
|
156
|
+
this._listeners.add(listener);
|
|
157
|
+
return () => {
|
|
158
|
+
this._listeners.delete(listener);
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
/** Returns the current snapshot (stable ref between mutations). */
|
|
162
|
+
getSnapshot = () => this._snapshot;
|
|
163
|
+
// -- Internal ------------------------------------------------------------
|
|
164
|
+
_setActive(key) {
|
|
165
|
+
if (this._snapshot.activeKey === key)
|
|
166
|
+
return;
|
|
167
|
+
this._commit(this._snapshot.editors, key);
|
|
168
|
+
}
|
|
169
|
+
/** Build a reveal for `key` from open options, or `null` when no line given. */
|
|
170
|
+
_makeReveal(key, options) {
|
|
171
|
+
const line = options?.line;
|
|
172
|
+
if (line == null)
|
|
173
|
+
return null;
|
|
174
|
+
return { key, line, nonce: ++this._revealSeq };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Replace the snapshot. `reveal` defaults to `null`, so any mutation that does
|
|
178
|
+
* not explicitly carry one clears a pending reveal (invariant: returning to a
|
|
179
|
+
* tab must not re-scroll to a stale line). The `activeFile` object reference
|
|
180
|
+
* is preserved when the active editor is unchanged, so a reveal-only update
|
|
181
|
+
* doesn't churn downstream memoization (diff correlation, tree highlight).
|
|
182
|
+
*/
|
|
183
|
+
_commit(editors, activeKey, reveal = null) {
|
|
184
|
+
const active = activeKey != null
|
|
185
|
+
? editors.find((e) => editorKey(e.entryId, e.path) === activeKey) ?? null
|
|
186
|
+
: null;
|
|
187
|
+
const resolvedActiveKey = active ? activeKey : null;
|
|
188
|
+
const prev = this._snapshot;
|
|
189
|
+
const activeFile = active && prev.activeKey === resolvedActiveKey && prev.activeFile
|
|
190
|
+
? prev.activeFile
|
|
191
|
+
: active
|
|
192
|
+
? { entryId: active.entryId, path: active.path }
|
|
193
|
+
: null;
|
|
194
|
+
this._snapshot = {
|
|
195
|
+
editors,
|
|
196
|
+
activeKey: resolvedActiveKey,
|
|
197
|
+
activeFile,
|
|
198
|
+
reveal,
|
|
199
|
+
};
|
|
200
|
+
this._notify();
|
|
201
|
+
}
|
|
202
|
+
_notify() {
|
|
203
|
+
for (const listener of this._listeners) {
|
|
204
|
+
listener();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=workspace-editors-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-editors-store.js","sourceRoot":"","sources":["../../../src/internal/store/workspace-editors-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A file selected for viewing.
|
|
3
|
+
*
|
|
4
|
+
* Keyed by `entryId` (not the entry value): the workspace entry id is stable
|
|
5
|
+
* within a page load but regenerated on reload, and selection is transient UI
|
|
6
|
+
* state anyway (reset on reload). Consumers must resolve the live entry via
|
|
7
|
+
* `workspace.entries.find(e => e.id === sel.entryId)` so a removed entry
|
|
8
|
+
* deselects naturally instead of holding a stale value.
|
|
9
|
+
*/
|
|
10
|
+
export interface SelectedWorkspaceFile {
|
|
11
|
+
/** Stable-within-page id of the owning workspace entry. */
|
|
12
|
+
readonly entryId: string;
|
|
13
|
+
/** Repo-relative (git) or root-relative (local) file path. */
|
|
14
|
+
readonly path: string;
|
|
15
|
+
}
|
|
16
|
+
type Listener = () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Framework-agnostic store for the currently-open workspace file.
|
|
19
|
+
*
|
|
20
|
+
* Implements the `useSyncExternalStore` contract identical to
|
|
21
|
+
* {@link import("./selection-store.js").SelectionStore}: the context carries the
|
|
22
|
+
* store instance (stable ref), and `getSelection` returns the stored object
|
|
23
|
+
* reference — a new object is allocated only inside `select` — so `getSnapshot`
|
|
24
|
+
* never triggers a re-render loop.
|
|
25
|
+
*/
|
|
26
|
+
export declare class WorkspaceFileSelectionStore {
|
|
27
|
+
private _selected;
|
|
28
|
+
private _listeners;
|
|
29
|
+
select(file: SelectedWorkspaceFile): void;
|
|
30
|
+
deselect(): void;
|
|
31
|
+
toggle(file: SelectedWorkspaceFile): void;
|
|
32
|
+
subscribe: (listener: Listener) => (() => void);
|
|
33
|
+
/** Returns the current selection (stable ref between mutations). */
|
|
34
|
+
getSelection: () => SelectedWorkspaceFile | null;
|
|
35
|
+
private _notify;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=workspace-file-selection-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-file-selection-store.d.ts","sourceRoot":"","sources":["../../../src/internal/store/workspace-file-selection-store.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B;;;;;;;;GAQG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,UAAU,CAAuB;IAIzC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAMzC,QAAQ,IAAI,IAAI;IAMhB,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAUzC,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAK5C;IAEF,oEAAoE;IACpE,YAAY,QAAO,qBAAqB,GAAG,IAAI,CAE7C;IAIF,OAAO,CAAC,OAAO;CAKhB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Which workspace file is open in the viewer. Sibling to SelectionStore (which
|
|
2
|
+
// owns thread-item inspect selection) — the two are orthogonal domains with
|
|
3
|
+
// different lifecycles, so they stay separate stores rather than one fused FSM.
|
|
4
|
+
/**
|
|
5
|
+
* Framework-agnostic store for the currently-open workspace file.
|
|
6
|
+
*
|
|
7
|
+
* Implements the `useSyncExternalStore` contract identical to
|
|
8
|
+
* {@link import("./selection-store.js").SelectionStore}: the context carries the
|
|
9
|
+
* store instance (stable ref), and `getSelection` returns the stored object
|
|
10
|
+
* reference — a new object is allocated only inside `select` — so `getSnapshot`
|
|
11
|
+
* never triggers a re-render loop.
|
|
12
|
+
*/
|
|
13
|
+
export class WorkspaceFileSelectionStore {
|
|
14
|
+
_selected = null;
|
|
15
|
+
_listeners = new Set();
|
|
16
|
+
// -- Mutations -----------------------------------------------------------
|
|
17
|
+
select(file) {
|
|
18
|
+
if (selectedEqual(this._selected, file))
|
|
19
|
+
return;
|
|
20
|
+
this._selected = file;
|
|
21
|
+
this._notify();
|
|
22
|
+
}
|
|
23
|
+
deselect() {
|
|
24
|
+
if (this._selected === null)
|
|
25
|
+
return;
|
|
26
|
+
this._selected = null;
|
|
27
|
+
this._notify();
|
|
28
|
+
}
|
|
29
|
+
toggle(file) {
|
|
30
|
+
if (selectedEqual(this._selected, file)) {
|
|
31
|
+
this.deselect();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.select(file);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// -- useSyncExternalStore contract ---------------------------------------
|
|
38
|
+
subscribe = (listener) => {
|
|
39
|
+
this._listeners.add(listener);
|
|
40
|
+
return () => {
|
|
41
|
+
this._listeners.delete(listener);
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/** Returns the current selection (stable ref between mutations). */
|
|
45
|
+
getSelection = () => {
|
|
46
|
+
return this._selected;
|
|
47
|
+
};
|
|
48
|
+
// -- Internal ------------------------------------------------------------
|
|
49
|
+
_notify() {
|
|
50
|
+
for (const listener of this._listeners) {
|
|
51
|
+
listener();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function selectedEqual(a, b) {
|
|
56
|
+
if (a === b)
|
|
57
|
+
return true;
|
|
58
|
+
if (a === null || b === null)
|
|
59
|
+
return false;
|
|
60
|
+
return a.entryId === b.entryId && a.path === b.path;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=workspace-file-selection-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-file-selection-store.js","sourceRoot":"","sources":["../../../src/internal/store/workspace-file-selection-store.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAoBhF;;;;;;;;GAQG;AACH,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAAiC,IAAI,CAAC;IAC/C,UAAU,GAAG,IAAI,GAAG,EAAY,CAAC;IAEzC,2EAA2E;IAE3E,MAAM,CAAC,IAA2B;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;YAAE,OAAO;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,IAA2B;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E,SAAS,GAAG,CAAC,QAAkB,EAAgB,EAAE;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,oEAAoE;IACpE,YAAY,GAAG,GAAiC,EAAE;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC,CAAC;IAEF,2EAA2E;IAEnE,OAAO;QACb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CACpB,CAA+B,EAC/B,CAA+B;IAE/B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* A transient request to scroll a line-faithful code view to a specific line
|
|
4
|
+
* and emphasize it — the "reveal" seam behind jump-to-line navigation (e.g. a
|
|
5
|
+
* content-search hit opening its file at the matched line).
|
|
6
|
+
*
|
|
7
|
+
* `line` is 1-based, matching the gutter and the grep's line numbers. `nonce`
|
|
8
|
+
* is a monotonic token bumped by the producer on every navigation — including a
|
|
9
|
+
* repeat navigation to the same `line` — so an already-mounted view re-scrolls
|
|
10
|
+
* even when the target line is unchanged. The line is deliberately NOT part of
|
|
11
|
+
* an editor's identity (see `WorkspaceEditorsStore`): it is navigation, not
|
|
12
|
+
* state, so it must not key a remount.
|
|
13
|
+
*/
|
|
14
|
+
export interface RevealTarget {
|
|
15
|
+
/** 1-based line to scroll to and highlight. */
|
|
16
|
+
readonly line: number;
|
|
17
|
+
/** Monotonic token; a change re-triggers the scroll (even for the same line). */
|
|
18
|
+
readonly nonce: number;
|
|
19
|
+
}
|
|
20
|
+
/** Return value of {@link useRevealLine}. */
|
|
21
|
+
export interface UseRevealLineResult<T extends HTMLElement = HTMLElement> {
|
|
22
|
+
/**
|
|
23
|
+
* Attach to the element that wraps the addressable line rows. The hook scopes
|
|
24
|
+
* its `[data-line]` query to this subtree, so multiple viewers never collide.
|
|
25
|
+
*/
|
|
26
|
+
readonly containerRef: RefObject<T | null>;
|
|
27
|
+
/** Whether a given 1-based line is the current reveal target (for the highlight). */
|
|
28
|
+
readonly isRevealed: (line: number) => boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Scrolls a line-faithful code view to `reveal.line` and reports which line to
|
|
32
|
+
* highlight.
|
|
33
|
+
*
|
|
34
|
+
* The mechanics are centralized here (rather than duplicated into each line
|
|
35
|
+
* renderer) and mirror the established `data-attribute` scroll pattern used by
|
|
36
|
+
* the workflow waterfall: the consumer renders each row with `data-line="N"`
|
|
37
|
+
* and this hook, on every `reveal.nonce` change, finds the target row within
|
|
38
|
+
* `containerRef` and scrolls it into view. Smooth scroll yields to
|
|
39
|
+
* `prefers-reduced-motion` (a JS animation the CSS rule does not cover), and
|
|
40
|
+
* the scroll is an optional call so it is a no-op under jsdom, which has no
|
|
41
|
+
* `scrollIntoView`.
|
|
42
|
+
*
|
|
43
|
+
* Placement matters: mount this inside the line renderer, which exists only
|
|
44
|
+
* after the file content has loaded — never above the async content gate — so
|
|
45
|
+
* the `[data-line]` rows are present when the effect runs and a fresh open does
|
|
46
|
+
* not race the load. A missing or out-of-range line is a silent no-op.
|
|
47
|
+
*/
|
|
48
|
+
export declare function useRevealLine<T extends HTMLElement = HTMLElement>(reveal: RevealTarget | undefined): UseRevealLineResult<T>;
|
|
49
|
+
//# sourceMappingURL=useRevealLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRevealLine.d.ts","sourceRoot":"","sources":["../../src/internal/useRevealLine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACtE;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,qFAAqF;IACrF,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC/D,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,mBAAmB,CAAC,CAAC,CAAC,CAyBxB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import { prefersReducedMotion } from "./motion-preference.js";
|
|
4
|
+
/**
|
|
5
|
+
* Scrolls a line-faithful code view to `reveal.line` and reports which line to
|
|
6
|
+
* highlight.
|
|
7
|
+
*
|
|
8
|
+
* The mechanics are centralized here (rather than duplicated into each line
|
|
9
|
+
* renderer) and mirror the established `data-attribute` scroll pattern used by
|
|
10
|
+
* the workflow waterfall: the consumer renders each row with `data-line="N"`
|
|
11
|
+
* and this hook, on every `reveal.nonce` change, finds the target row within
|
|
12
|
+
* `containerRef` and scrolls it into view. Smooth scroll yields to
|
|
13
|
+
* `prefers-reduced-motion` (a JS animation the CSS rule does not cover), and
|
|
14
|
+
* the scroll is an optional call so it is a no-op under jsdom, which has no
|
|
15
|
+
* `scrollIntoView`.
|
|
16
|
+
*
|
|
17
|
+
* Placement matters: mount this inside the line renderer, which exists only
|
|
18
|
+
* after the file content has loaded — never above the async content gate — so
|
|
19
|
+
* the `[data-line]` rows are present when the effect runs and a fresh open does
|
|
20
|
+
* not race the load. A missing or out-of-range line is a silent no-op.
|
|
21
|
+
*/
|
|
22
|
+
export function useRevealLine(reveal) {
|
|
23
|
+
const containerRef = useRef(null);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!reveal)
|
|
26
|
+
return;
|
|
27
|
+
const container = containerRef.current;
|
|
28
|
+
if (!container)
|
|
29
|
+
return;
|
|
30
|
+
const row = container.querySelector(`[data-line="${reveal.line}"]`);
|
|
31
|
+
// Optional call: jsdom (tests) implements no `scrollIntoView`.
|
|
32
|
+
row?.scrollIntoView?.({
|
|
33
|
+
block: "center",
|
|
34
|
+
behavior: prefersReducedMotion() ? "auto" : "smooth",
|
|
35
|
+
});
|
|
36
|
+
// Intentionally keyed only on the nonce: a repeat navigation to the same
|
|
37
|
+
// line (new nonce) must re-scroll, and `reveal.line` changes always ship a
|
|
38
|
+
// new nonce, so it is covered transitively.
|
|
39
|
+
}, [reveal?.nonce]);
|
|
40
|
+
const isRevealed = useCallback((line) => reveal?.line === line, [reveal?.line]);
|
|
41
|
+
return { containerRef, isRevealed };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=useRevealLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRevealLine.js","sourceRoot":"","sources":["../../src/internal/useRevealLine.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAgC9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAgC;IAEhC,MAAM,YAAY,GAAG,MAAM,CAAW,IAAI,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,eAAe,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACpE,+DAA+D;QAC/D,GAAG,EAAE,cAAc,EAAE,CAAC;YACpB,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;SACrD,CAAC,CAAC;QACH,yEAAyE;QACzE,2EAA2E;QAC3E,4CAA4C;IAC9C,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,IAAI,EACvC,CAAC,MAAM,EAAE,IAAI,CAAC,CACf,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
2
2
|
import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
|
|
3
|
+
/**
|
|
4
|
+
* The session's current plan: the published `plan.md` artifact of the most
|
|
5
|
+
* recent execution that produced one, plus the execution it belongs to
|
|
6
|
+
* (artifact content RPCs are execution-scoped).
|
|
7
|
+
*/
|
|
8
|
+
export interface SessionPlan {
|
|
9
|
+
/** ID of the execution that published the plan. */
|
|
10
|
+
readonly executionId: string;
|
|
11
|
+
/** The published `plan.md` artifact. */
|
|
12
|
+
readonly artifact: ExecutionArtifact;
|
|
13
|
+
}
|
|
3
14
|
/**
|
|
4
15
|
* Canonical filename a Plan-mode execution publishes its plan under. Kept in
|
|
5
16
|
* sync with the runner's `publishPlanArtifact` (shared/plan-artifact.ts).
|
|
@@ -23,4 +34,14 @@ export declare function isPlanArtifact(artifact: ExecutionArtifact): boolean;
|
|
|
23
34
|
* replaces rather than appends, so this is defensive.
|
|
24
35
|
*/
|
|
25
36
|
export declare function findPlanArtifact(execution: AgentExecution | null | undefined): ExecutionArtifact | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Finds the session's LATEST plan across all executions — the plan the panel's
|
|
39
|
+
* plan document tab edits and "Build from plan" implements. Executions are
|
|
40
|
+
* scanned newest-first (the array is chronological), mirroring the thread's
|
|
41
|
+
* latest-plan-owns-the-build-action rule so every surface agrees on which
|
|
42
|
+
* plan is current.
|
|
43
|
+
*
|
|
44
|
+
* Returns `undefined` when no execution in the session published a plan.
|
|
45
|
+
*/
|
|
46
|
+
export declare function findLatestSessionPlan(executions: readonly AgentExecution[]): SessionPlan | undefined;
|
|
26
47
|
//# sourceMappingURL=detect-plan-artifact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-plan-artifact.d.ts","sourceRoot":"","sources":["../../src/library/detect-plan-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAG1G;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAC3C,iBAAiB,GAAG,SAAS,CAO/B"}
|
|
1
|
+
{"version":3,"file":"detect-plan-artifact.d.ts","sourceRoot":"","sources":["../../src/library/detect-plan-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAG1G;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAC3C,iBAAiB,GAAG,SAAS,CAO/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,SAAS,cAAc,EAAE,GACpC,WAAW,GAAG,SAAS,CAUzB"}
|
|
@@ -34,4 +34,24 @@ export function findPlanArtifact(execution) {
|
|
|
34
34
|
}
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Finds the session's LATEST plan across all executions — the plan the panel's
|
|
39
|
+
* plan document tab edits and "Build from plan" implements. Executions are
|
|
40
|
+
* scanned newest-first (the array is chronological), mirroring the thread's
|
|
41
|
+
* latest-plan-owns-the-build-action rule so every surface agrees on which
|
|
42
|
+
* plan is current.
|
|
43
|
+
*
|
|
44
|
+
* Returns `undefined` when no execution in the session published a plan.
|
|
45
|
+
*/
|
|
46
|
+
export function findLatestSessionPlan(executions) {
|
|
47
|
+
for (let i = executions.length - 1; i >= 0; i--) {
|
|
48
|
+
const execution = executions[i];
|
|
49
|
+
const artifact = findPlanArtifact(execution);
|
|
50
|
+
const executionId = execution.metadata?.id;
|
|
51
|
+
if (artifact && executionId) {
|
|
52
|
+
return { executionId, artifact };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
37
57
|
//# sourceMappingURL=detect-plan-artifact.js.map
|