@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
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { memo, useMemo, useState } from "react";
|
|
4
4
|
import { Streamdown } from "streamdown";
|
|
5
|
-
import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
5
|
+
import { MessageType, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
6
6
|
import { cn } from "@stigmer/theme";
|
|
7
7
|
import { MARKDOWN_COMPONENTS, unwrapEnclosingMarkdownFence, } from "../internal/markdown-components.js";
|
|
8
|
+
import { InteractionModeBadge } from "./InteractionModeBadge.js";
|
|
9
|
+
import { PlanDocumentMessage } from "./PlanDocumentMessage.js";
|
|
8
10
|
import { useRenderTracer } from "../internal/dev/index.js";
|
|
9
11
|
/**
|
|
10
12
|
* Renders a single message in the conversation thread.
|
|
@@ -30,7 +32,7 @@ import { useRenderTracer } from "../internal/dev/index.js";
|
|
|
30
32
|
* <MessageEntry message={agentMessage} />
|
|
31
33
|
* ```
|
|
32
34
|
*/
|
|
33
|
-
export const MessageEntry = memo(function MessageEntry({ message, className, onEdit, }) {
|
|
35
|
+
export const MessageEntry = memo(function MessageEntry({ message, className, onEdit, isPlanDocument, interactionMode, isBuildFromPlan, }) {
|
|
34
36
|
useRenderTracer("MessageEntry", {
|
|
35
37
|
messageType: message.type,
|
|
36
38
|
contentLength: message.content.length,
|
|
@@ -38,8 +40,16 @@ export const MessageEntry = memo(function MessageEntry({ message, className, onE
|
|
|
38
40
|
});
|
|
39
41
|
switch (message.type) {
|
|
40
42
|
case MessageType.MESSAGE_HUMAN:
|
|
41
|
-
|
|
43
|
+
if (isBuildFromPlan) {
|
|
44
|
+
return (_jsx(BuildFromPlanChip, { content: message.content, className: className }));
|
|
45
|
+
}
|
|
46
|
+
return (_jsx(HumanMessage, { content: message.content, className: className, onEdit: onEdit, interactionMode: interactionMode }));
|
|
42
47
|
case MessageType.MESSAGE_AI:
|
|
48
|
+
// A completed Plan turn's plan is a document, not a bubble. The flag is
|
|
49
|
+
// only ever set on a settled message, so the streaming path is untouched.
|
|
50
|
+
if (isPlanDocument) {
|
|
51
|
+
return (_jsx(PlanDocumentMessage, { content: message.content, className: className }));
|
|
52
|
+
}
|
|
43
53
|
return (_jsx(AiMessage, { content: message.content, isStreaming: message.isStreaming, className: className }));
|
|
44
54
|
case MessageType.MESSAGE_THINKING:
|
|
45
55
|
return (_jsx(ThinkingMessage, { content: message.content, isStreaming: message.isStreaming, className: className }));
|
|
@@ -49,8 +59,22 @@ export const MessageEntry = memo(function MessageEntry({ message, className, onE
|
|
|
49
59
|
return null;
|
|
50
60
|
}
|
|
51
61
|
});
|
|
52
|
-
function HumanMessage({ content, className, onEdit, }) {
|
|
53
|
-
return (_jsxs("div", { role: "article", "aria-label": "User message", className: cn("group relative ms-[20%] rounded-lg bg-muted-subtle px-4 py-3", className), children: [_jsx("p", { className: "text-sm text-foreground whitespace-pre-wrap", children: content }), onEdit && (_jsx("button", { type: "button", onClick: onEdit, "aria-label": "Edit message", title: "Edit", className: cn("absolute -top-2.5 -right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full", "border border-border bg-card text-muted-foreground shadow-sm transition", "hover:text-foreground hover:bg-accent-hover", "opacity-0 group-hover:opacity-100 focus-visible:opacity-100", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(EditIcon, {}) }))] }));
|
|
62
|
+
function HumanMessage({ content, className, onEdit, interactionMode, }) {
|
|
63
|
+
return (_jsxs("div", { role: "article", "aria-label": "User message", className: cn("group relative ms-[20%] rounded-lg bg-muted-subtle px-4 py-3", className), children: [interactionMode !== undefined && (_jsx(InteractionModeBadge, { mode: interactionMode, className: "mb-1.5" })), _jsx("p", { className: "text-sm text-foreground whitespace-pre-wrap", children: content }), onEdit && (_jsx("button", { type: "button", onClick: onEdit, "aria-label": "Edit message", title: "Edit", className: cn("absolute -top-2.5 -right-2.5 inline-flex h-7 w-7 items-center justify-center rounded-full", "border border-border bg-card text-muted-foreground shadow-sm transition", "hover:text-foreground hover:bg-accent-hover", "opacity-0 group-hover:opacity-100 focus-visible:opacity-100", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(EditIcon, {}) }))] }));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The Build-from-plan turn's user entry: a compact pill in the user-turn
|
|
67
|
+
* position (right-aligned, like the prompt bubble it replaces) carrying the
|
|
68
|
+
* plan glyph and the turn's short label. Deliberately not editable — the
|
|
69
|
+
* label is not user prose to rephrase; refining the plan happens in the plan
|
|
70
|
+
* document, and the build is re-triggered from its card.
|
|
71
|
+
*/
|
|
72
|
+
function BuildFromPlanChip({ content, className, }) {
|
|
73
|
+
return (_jsx("div", { role: "article", "aria-label": "Build from plan", className: cn("flex justify-end", className), children: _jsxs("span", { className: cn("inline-flex items-center gap-1.5 rounded-full border border-border", "bg-muted-subtle px-3 py-1.5 text-xs font-medium text-foreground"), children: [_jsx(BuildFromPlanIcon, {}), content] }) }));
|
|
74
|
+
}
|
|
75
|
+
/** The plan-card glyph (document lines + implement arrow) at chip scale. */
|
|
76
|
+
function BuildFromPlanIcon() {
|
|
77
|
+
return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: [_jsx("path", { d: "M3 4h10M3 8h7M3 12h8" }), _jsx("path", { d: "M12.5 10.5l1.5 1.5-1.5 1.5" })] }));
|
|
54
78
|
}
|
|
55
79
|
function EditIcon() {
|
|
56
80
|
return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M12 20h9" }), _jsx("path", { d: "M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z" })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageEntry.js","sourceRoot":"","sources":["../../src/execution/MessageEntry.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,
|
|
1
|
+
{"version":3,"file":"MessageEntry.js","sourceRoot":"","sources":["../../src/execution/MessageEntry.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import type { PendingApproval } from "@stigmer/protos/ai/stigmer/agentic/agentex
|
|
|
5
5
|
import type { FileChangeSet } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
6
6
|
import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
|
|
7
7
|
import type { TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
|
|
8
|
-
import { ApprovalAction, ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
8
|
+
import { ApprovalAction, ExecutionPhase, InteractionMode } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
9
9
|
import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
|
|
10
10
|
import type { SummarizationEventView } from "./useContextWindow.js";
|
|
11
11
|
import type { ResolvedPathAction } from "./file-path-resolver.js";
|
|
@@ -117,7 +117,7 @@ export interface MessageThreadProps {
|
|
|
117
117
|
* builders use this to integrate their own file viewer or
|
|
118
118
|
* navigation instead of the default open-URL / copy-to-clipboard.
|
|
119
119
|
*/
|
|
120
|
-
readonly onFilePathClick?: (path: string, resolved: ResolvedPathAction) => void;
|
|
120
|
+
readonly onFilePathClick?: (path: string, resolved: ResolvedPathAction) => boolean | void;
|
|
121
121
|
/**
|
|
122
122
|
* Absolute sandbox workspace root (e.g. `/home/daytona/workspace`).
|
|
123
123
|
* When provided, shell commands and tool output normalize absolute
|
|
@@ -157,6 +157,21 @@ export interface MessageThreadProps {
|
|
|
157
157
|
* compatible — existing consumers see no change.
|
|
158
158
|
*/
|
|
159
159
|
readonly onBuildFromPlan?: () => void;
|
|
160
|
+
/**
|
|
161
|
+
* Opens a plan in the session panel's plan document tab — the side-by-side
|
|
162
|
+
* review/refine surface. Wired to EVERY plan card: the latest opens
|
|
163
|
+
* editable/buildable, a superseded plan opens read-only (the host decides
|
|
164
|
+
* from the execution id). When omitted, cards fall back to the "Open full"
|
|
165
|
+
* preview modal (hosts without a panel).
|
|
166
|
+
*
|
|
167
|
+
* Providing this also opts the thread into LIVE plan collapse: while a
|
|
168
|
+
* Plan-mode turn streams its plan (detected via `findStreamingPlan`), the
|
|
169
|
+
* plan message is suppressed behind a compact {@link PlanStreamingCard}
|
|
170
|
+
* whose "Open plan" routes here — the host is expected to render the
|
|
171
|
+
* streaming document in its plan surface. Hosts without one (this prop
|
|
172
|
+
* omitted) keep the plan streaming inline, where it stays readable.
|
|
173
|
+
*/
|
|
174
|
+
readonly onOpenPlan?: (executionId: string) => void;
|
|
160
175
|
/**
|
|
161
176
|
* Organization slug. Required for the plan completion card's
|
|
162
177
|
* "Review plan" action, which opens the shared artifact preview
|
|
@@ -170,19 +185,32 @@ export interface MessageThreadProps {
|
|
|
170
185
|
* disabled submit.
|
|
171
186
|
*/
|
|
172
187
|
readonly planActionsDisabled?: boolean;
|
|
188
|
+
/** True while the approved plan is being uploaded ahead of the build turn. */
|
|
189
|
+
readonly planBuildPending?: boolean;
|
|
173
190
|
/**
|
|
174
|
-
*
|
|
191
|
+
* Constrain thread content to a max-width reading column
|
|
192
|
+
* (`max-w-3xl`, 768 px) inside the full-width scroll container —
|
|
193
|
+
* the scrollbar stays at the viewport edge.
|
|
175
194
|
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
195
|
+
* - `"center"` — column horizontally centered (classic chat reading view).
|
|
196
|
+
* - `"start"` — column anchored to the left edge, so the thread's left
|
|
197
|
+
* edge stays put when a sibling panel opens/closes beside it.
|
|
179
198
|
*
|
|
180
|
-
* Opt-in per DD-011 —
|
|
181
|
-
*
|
|
182
|
-
* @default false
|
|
199
|
+
* When omitted, content spans the full width. Opt-in per DD-011 —
|
|
200
|
+
* existing consumers see no layout change.
|
|
183
201
|
*/
|
|
184
|
-
readonly
|
|
202
|
+
readonly contentColumn?: ThreadContentColumn;
|
|
185
203
|
}
|
|
204
|
+
/** Reading-column alignment for {@link MessageThread} content. */
|
|
205
|
+
export type ThreadContentColumn = "center" | "start";
|
|
206
|
+
/**
|
|
207
|
+
* Class set for the optional reading column — one definition shared by both
|
|
208
|
+
* render paths (non-virtualized and virtualized) so their geometry can never
|
|
209
|
+
* drift.
|
|
210
|
+
*
|
|
211
|
+
* @internal
|
|
212
|
+
*/
|
|
213
|
+
export declare function threadContentColumnClass(column: ThreadContentColumn | undefined): string | false;
|
|
186
214
|
/**
|
|
187
215
|
* Flattened representation of one renderable item in the thread.
|
|
188
216
|
*
|
|
@@ -199,6 +227,9 @@ export type ThreadItem = {
|
|
|
199
227
|
readonly isPending?: boolean;
|
|
200
228
|
readonly isFailed?: boolean;
|
|
201
229
|
readonly isEditable?: boolean;
|
|
230
|
+
readonly isPlanDocument?: boolean;
|
|
231
|
+
readonly interactionMode?: InteractionMode;
|
|
232
|
+
readonly isBuildFromPlan?: boolean;
|
|
202
233
|
} | {
|
|
203
234
|
readonly kind: "tool-group";
|
|
204
235
|
readonly toolCalls: readonly ToolCall[];
|
|
@@ -247,6 +278,35 @@ export type ThreadItem = {
|
|
|
247
278
|
readonly key: string;
|
|
248
279
|
readonly executionId: string;
|
|
249
280
|
readonly planArtifact?: ExecutionArtifact;
|
|
281
|
+
/**
|
|
282
|
+
* The plan's title (its leading `# H1`), lifted from the plan message at
|
|
283
|
+
* build time — no fetch. Present only when the turn published an
|
|
284
|
+
* artifact (the collapsed-card path); the card falls back to "Plan".
|
|
285
|
+
*/
|
|
286
|
+
readonly planTitle?: string;
|
|
287
|
+
/**
|
|
288
|
+
* True for the most recent completed Plan execution in the thread — the
|
|
289
|
+
* only plan whose card carries the primary "Build from plan" action.
|
|
290
|
+
* Superseded plans keep their review actions (open/download) but never a
|
|
291
|
+
* build CTA, so a stale plan can't be implemented by accident.
|
|
292
|
+
*/
|
|
293
|
+
readonly isLatestPlan: boolean;
|
|
294
|
+
} | {
|
|
295
|
+
/**
|
|
296
|
+
* A plan the active Plan-mode execution is writing RIGHT NOW: the
|
|
297
|
+
* streaming plan message is suppressed and this compact card stands in
|
|
298
|
+
* while the document renders live in the panel's plan tab. On
|
|
299
|
+
* completion the item becomes `plan-completion` — a different kind
|
|
300
|
+
* under the SAME key, so the card holds one thread position and the
|
|
301
|
+
* swap reads as the card settling.
|
|
302
|
+
*/
|
|
303
|
+
readonly kind: "plan-writing";
|
|
304
|
+
readonly key: string;
|
|
305
|
+
readonly executionId: string;
|
|
306
|
+
/** Live title (the plan's leading `# H1`), growing as it streams. */
|
|
307
|
+
readonly planTitle?: string;
|
|
308
|
+
/** Length of the plan text streamed so far (drives the live size). */
|
|
309
|
+
readonly planSize: number;
|
|
250
310
|
};
|
|
251
311
|
/**
|
|
252
312
|
* Builds a flat list of renderable thread items from execution data.
|
|
@@ -256,7 +316,7 @@ export type ThreadItem = {
|
|
|
256
316
|
*
|
|
257
317
|
* @internal Exported for testing — not part of the public API.
|
|
258
318
|
*/
|
|
259
|
-
export declare function buildThreadItems(executions: readonly AgentExecution[], activeStreamExecution: AgentExecution | null | undefined, pendingUserMessage: string | null | undefined, includeApprovals: boolean, workspaceEntries: readonly WorkspaceEntry[] | undefined, summarizationEvents?: readonly SummarizationEventView[], pendingMessageFailed?: boolean, editableActiveTurn?: boolean, includeFileReviewRecords?: boolean): ThreadItem[];
|
|
319
|
+
export declare function buildThreadItems(executions: readonly AgentExecution[], activeStreamExecution: AgentExecution | null | undefined, pendingUserMessage: string | null | undefined, includeApprovals: boolean, workspaceEntries: readonly WorkspaceEntry[] | undefined, summarizationEvents?: readonly SummarizationEventView[], pendingMessageFailed?: boolean, editableActiveTurn?: boolean, includeFileReviewRecords?: boolean, collapseStreamingPlan?: boolean): ThreadItem[];
|
|
260
320
|
/**
|
|
261
321
|
* Renders a continuous conversation thread from one or more
|
|
262
322
|
* {@link AgentExecution} snapshots.
|
|
@@ -280,7 +340,7 @@ export declare function buildThreadItems(executions: readonly AgentExecution[],
|
|
|
280
340
|
* />
|
|
281
341
|
* ```
|
|
282
342
|
*/
|
|
283
|
-
export declare function MessageThread({ executions, activeStreamExecution, pendingUserMessage, pendingMessageFailed, onRetrySend, onRetryExecution, onEditMessage, className, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, showFileReviewRecords, workspaceEntries, onFilePathClick, sandboxWorkspaceRoot, summarizationEvents, virtualized, onBuildFromPlan, org, planActionsDisabled,
|
|
343
|
+
export declare function MessageThread({ executions, activeStreamExecution, pendingUserMessage, pendingMessageFailed, onRetrySend, onRetryExecution, onEditMessage, className, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, showFileReviewRecords, workspaceEntries, onFilePathClick, sandboxWorkspaceRoot, summarizationEvents, virtualized, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, contentColumn, }: MessageThreadProps): import("react/jsx-runtime").JSX.Element;
|
|
284
344
|
/**
|
|
285
345
|
* Props for {@link ThreadItemRenderer}.
|
|
286
346
|
*
|
|
@@ -294,8 +354,11 @@ export interface ThreadItemRendererProps {
|
|
|
294
354
|
readonly submittingApprovalIds?: ReadonlySet<string>;
|
|
295
355
|
readonly approvalErrors?: ReadonlyMap<string, Error>;
|
|
296
356
|
readonly onBuildFromPlan?: () => void;
|
|
357
|
+
readonly onOpenPlan?: (executionId: string) => void;
|
|
297
358
|
readonly org?: string;
|
|
298
359
|
readonly planActionsDisabled?: boolean;
|
|
360
|
+
/** True while the approved plan is being uploaded ahead of the build turn. */
|
|
361
|
+
readonly planBuildPending?: boolean;
|
|
299
362
|
readonly onRetrySend?: () => void;
|
|
300
363
|
readonly onRetryExecution?: (message: string) => void;
|
|
301
364
|
readonly onEditMessage?: (text: string) => void;
|
|
@@ -311,5 +374,5 @@ export interface ThreadItemRendererProps {
|
|
|
311
374
|
* @internal Exported for internal use by `VirtualizedThread` — not
|
|
312
375
|
* part of the public API.
|
|
313
376
|
*/
|
|
314
|
-
export declare function ThreadItemRenderer({ item, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, org, planActionsDisabled, onRetrySend, onRetryExecution, onEditMessage, }: ThreadItemRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
377
|
+
export declare function ThreadItemRenderer({ item, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, onRetrySend, onRetryExecution, onEditMessage, }: ThreadItemRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
315
378
|
//# sourceMappingURL=MessageThread.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageThread.d.ts","sourceRoot":"","sources":["../../src/execution/MessageThread.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAE9G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AACxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"MessageThread.d.ts","sourceRoot":"","sources":["../../src/execution/MessageThread.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,13 +17,16 @@ import { FileReviewCard } from "./FileReviewCard.js";
|
|
|
17
17
|
import { SummarizationCard } from "./SummarizationCard.js";
|
|
18
18
|
import { PlanCompletionCard } from "./PlanCompletionCard.js";
|
|
19
19
|
import { PlanArtifactCard } from "./PlanArtifactCard.js";
|
|
20
|
+
import { PlanStreamingCard } from "./PlanStreamingCard.js";
|
|
20
21
|
import { TodoCard } from "./TodoCard.js";
|
|
21
22
|
import { findPlanArtifact } from "../library/detect-plan-artifact.js";
|
|
23
|
+
import { findStreamingPlan } from "../library/detect-streaming-plan.js";
|
|
22
24
|
import { isInternalTool, isCollapsedToolCall } from "./tool-categories.js";
|
|
23
25
|
import { FilePathContext } from "./FilePathContext.js";
|
|
24
26
|
import { SandboxContext } from "./SandboxContext.js";
|
|
25
27
|
import { ApprovalContext } from "./ApprovalContext.js";
|
|
26
28
|
import { FileReviewContext } from "./FileReviewContext.js";
|
|
29
|
+
import { extractLeadingH1, unwrapEnclosingMarkdownFence, } from "../internal/markdown-components.js";
|
|
27
30
|
import { useRenderTracer, useKeyStability, useDomNodeCount, DevProfiler } from "../internal/dev/index.js";
|
|
28
31
|
import { useAutoScroll } from "../internal/useAutoScroll.js";
|
|
29
32
|
import { JumpToLatestButton } from "../internal/JumpToLatestButton.js";
|
|
@@ -36,6 +39,16 @@ const LazyVirtualizedThread = lazy(() => import("../internal/VirtualizedThread.j
|
|
|
36
39
|
const EMPTY_APPROVALS = [];
|
|
37
40
|
const EMPTY_SUBMITTING_IDS = new Set();
|
|
38
41
|
const EMPTY_APPROVAL_ERRORS = new Map();
|
|
42
|
+
/**
|
|
43
|
+
* Class set for the optional reading column — one definition shared by both
|
|
44
|
+
* render paths (non-virtualized and virtualized) so their geometry can never
|
|
45
|
+
* drift.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export function threadContentColumnClass(column) {
|
|
50
|
+
return column != null && cn("w-full max-w-3xl px-4", column === "center" && "mx-auto");
|
|
51
|
+
}
|
|
39
52
|
/**
|
|
40
53
|
* True once the agent has produced any real, renderable response for this turn —
|
|
41
54
|
* assistant text, a tool call (running or terminal), or streamed model thinking.
|
|
@@ -63,6 +76,40 @@ function hasStartedResponding(execution) {
|
|
|
63
76
|
return false;
|
|
64
77
|
});
|
|
65
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* True for an execution that ran in Plan mode and completed — the only kind of
|
|
81
|
+
* execution that has a reviewable plan (streaming/failed/terminated Plan turns
|
|
82
|
+
* have nothing final to review or build from).
|
|
83
|
+
*/
|
|
84
|
+
function isCompletedPlanExecution(execution) {
|
|
85
|
+
return (execution.status?.phase === ExecutionPhase.EXECUTION_COMPLETED &&
|
|
86
|
+
execution.spec?.executionConfig?.interactionMode === InteractionMode.PLAN);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Index of the message that IS the plan in a completed Plan execution: the
|
|
90
|
+
* last AI message with content — the SAME selection rule the runner's
|
|
91
|
+
* `extractFinalPlanText` uses to publish `plan.md`, so the message promoted to
|
|
92
|
+
* a document in the thread is byte-identical to the published artifact.
|
|
93
|
+
* Returns -1 when no such message exists.
|
|
94
|
+
*/
|
|
95
|
+
function findPlanMessageIndex(messages) {
|
|
96
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
97
|
+
const msg = messages[i];
|
|
98
|
+
if (msg.type === MessageType.MESSAGE_AI && msg.content.trim().length > 0) {
|
|
99
|
+
return i;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The plan's title for its compact card: the leading `# H1` of the plan
|
|
106
|
+
* message, after the same plan-scoped bare-fence unwrap the document renderers
|
|
107
|
+
* apply — so the card and the plan tab always agree on the title. `undefined`
|
|
108
|
+
* when the plan has no H1 (the card falls back to "Plan").
|
|
109
|
+
*/
|
|
110
|
+
function extractPlanTitle(content) {
|
|
111
|
+
return extractLeadingH1(unwrapEnclosingMarkdownFence(content, true)).title ?? undefined;
|
|
112
|
+
}
|
|
66
113
|
/**
|
|
67
114
|
* Adds the tool-call ids that a sub-agent renders as nested rows (the same
|
|
68
115
|
* non-internal AI tool calls {@link SubAgentSection} surfaces) to `target`,
|
|
@@ -146,7 +193,7 @@ function insertFileReviewItems(items, changeSets, anchorIndexBySetId, execTermin
|
|
|
146
193
|
*
|
|
147
194
|
* @internal Exported for testing — not part of the public API.
|
|
148
195
|
*/
|
|
149
|
-
export function buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals, workspaceEntries, summarizationEvents, pendingMessageFailed = false, editableActiveTurn = false, includeFileReviewRecords = false) {
|
|
196
|
+
export function buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals, workspaceEntries, summarizationEvents, pendingMessageFailed = false, editableActiveTurn = false, includeFileReviewRecords = false, collapseStreamingPlan = false) {
|
|
150
197
|
const items = [];
|
|
151
198
|
// Tool-call ids that render as an inline-approval-capable ToolCallItem (a
|
|
152
199
|
// regular parent tool, or a sub-agent's nested tool). Their approvals show
|
|
@@ -173,6 +220,16 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
173
220
|
const activeStreamIndex = activeStreamExecution
|
|
174
221
|
? allExecutions.length - 1
|
|
175
222
|
: -1;
|
|
223
|
+
// The most recent completed Plan execution owns the primary "Build from
|
|
224
|
+
// plan" action; every earlier plan renders as a review-only record. Resolved
|
|
225
|
+
// up front so each segment can stamp its own card with the right authority.
|
|
226
|
+
let latestPlanExecutionId = null;
|
|
227
|
+
for (let i = allExecutions.length - 1; i >= 0; i--) {
|
|
228
|
+
if (isCompletedPlanExecution(allExecutions[i])) {
|
|
229
|
+
latestPlanExecutionId = allExecutions[i].metadata?.id ?? `_e${i}`;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
176
233
|
// Build a queue of summarization events to interleave by timestamp.
|
|
177
234
|
// Events are consumed as messages pass their timestamp.
|
|
178
235
|
const pendingEvents = summarizationEvents?.length
|
|
@@ -200,6 +257,40 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
200
257
|
const isActiveStreamExec = ei === activeStreamIndex;
|
|
201
258
|
const messages = exec.status?.messages ?? [];
|
|
202
259
|
const subAgents = exec.status?.subAgentExecutions ?? [];
|
|
260
|
+
// A completed Plan turn collapses its plan message into the compact plan
|
|
261
|
+
// card (the plan-completion item): the document lives in the panel's plan
|
|
262
|
+
// tab, not the thread. While the plan is still streaming, the same
|
|
263
|
+
// treatment applies live when the host has a plan surface (streamingPlan
|
|
264
|
+
// below): the in-flight plan message is suppressed behind a plan-writing
|
|
265
|
+
// card while the panel's plan tab renders it as it streams — the content
|
|
266
|
+
// moves, it doesn't disappear. Completion swaps the live card for the
|
|
267
|
+
// settled one (same key), and the paired auto-open (useSessionPanel's
|
|
268
|
+
// planKey trigger) keeps the document side-by-side. Collapse of a
|
|
269
|
+
// COMPLETED plan is gated on the ARTIFACT existing: a plan that never
|
|
270
|
+
// published (older executions, failed upload) exists only in the message,
|
|
271
|
+
// so that path keeps the inline document promotion (isPlanDocument) —
|
|
272
|
+
// collapsing it would orphan the plan behind a card with nothing to open.
|
|
273
|
+
const isCompletedPlanExec = isCompletedPlanExecution(exec);
|
|
274
|
+
const planMessageIndex = isCompletedPlanExec
|
|
275
|
+
? findPlanMessageIndex(messages)
|
|
276
|
+
: -1;
|
|
277
|
+
const planArtifact = isCompletedPlanExec
|
|
278
|
+
? findPlanArtifact(exec)
|
|
279
|
+
: undefined;
|
|
280
|
+
const collapsePlanMessage = planMessageIndex >= 0 && planArtifact !== undefined;
|
|
281
|
+
// The plan the active Plan-mode turn is writing RIGHT NOW (detected by
|
|
282
|
+
// the H1 convention — see findStreamingPlan). Its message is suppressed
|
|
283
|
+
// in favor of a live plan-writing card, mirroring the completed-turn
|
|
284
|
+
// collapse above, while the panel's plan tab renders the document live.
|
|
285
|
+
// Two gates: collapseStreamingPlan (the host wired onOpenPlan — without a
|
|
286
|
+
// document surface the plan must keep streaming inline, DD-011) and
|
|
287
|
+
// isActiveStreamExec (a stale non-terminal execution left in the
|
|
288
|
+
// completed list by the transient skew documented above must never
|
|
289
|
+
// sprout a live card). Mutually exclusive with collapsePlanMessage by
|
|
290
|
+
// construction: one requires a terminal phase, the other forbids it.
|
|
291
|
+
const streamingPlan = collapseStreamingPlan && isActiveStreamExec
|
|
292
|
+
? findStreamingPlan(exec)
|
|
293
|
+
: undefined;
|
|
203
294
|
// This execution's settled change sets render as read-only records inside
|
|
204
295
|
// its own segment, anchored to the last stamped edit row of each set. The
|
|
205
296
|
// display seam reads the server's live projection when present and folds
|
|
@@ -247,6 +338,13 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
247
338
|
// The active execution's prompt is the one a user can edit-and-resubmit
|
|
248
339
|
// (stop + rephrase). Only mark it when the consumer enabled editing.
|
|
249
340
|
isEditable: isActiveStreamExec && editableActiveTurn,
|
|
341
|
+
// The turn's mode marks the prompt bubble (a "Plan" pill on Plan
|
|
342
|
+
// turns) so the transcript reads unambiguously after mode switches.
|
|
343
|
+
interactionMode: exec.spec?.executionConfig?.interactionMode,
|
|
344
|
+
// A Build-from-plan turn's prompt renders as a compact chip, not the
|
|
345
|
+
// message text — the text is a short label; the real instruction is
|
|
346
|
+
// runner-injected from the same flag.
|
|
347
|
+
isBuildFromPlan: exec.spec?.executionConfig?.buildFromPlan || undefined,
|
|
250
348
|
});
|
|
251
349
|
}
|
|
252
350
|
for (let mi = 0; mi < messages.length; mi++) {
|
|
@@ -258,11 +356,22 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
258
356
|
flushEventsUntil(msg.timestamp);
|
|
259
357
|
const isEmptyAi = msg.type === MessageType.MESSAGE_AI && !msg.content.trim();
|
|
260
358
|
if (!isEmptyAi) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
359
|
+
// The collapsed plan message is not rendered — the plan-completion
|
|
360
|
+
// card at the segment's end is the turn's sole plan representation.
|
|
361
|
+
// Its tool calls (below) and the todo anchor still process normally.
|
|
362
|
+
// A STREAMING plan message is suppressed the same way: its stand-in
|
|
363
|
+
// is the plan-writing card at the segment's end, and the document
|
|
364
|
+
// renders live in the panel's plan tab.
|
|
365
|
+
const suppressAsPlan = (collapsePlanMessage && mi === planMessageIndex) ||
|
|
366
|
+
mi === streamingPlan?.messageIndex;
|
|
367
|
+
if (!suppressAsPlan) {
|
|
368
|
+
items.push({
|
|
369
|
+
kind: "message",
|
|
370
|
+
message: msg,
|
|
371
|
+
key: `${execId}-m${mi}`,
|
|
372
|
+
isPlanDocument: !collapsePlanMessage && mi === planMessageIndex,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
266
375
|
// Anchor (1): the plan sits right under the agent's opening narration.
|
|
267
376
|
if (msg.type === MessageType.MESSAGE_AI ||
|
|
268
377
|
msg.type === MessageType.MESSAGE_THINKING) {
|
|
@@ -335,6 +444,41 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
335
444
|
}
|
|
336
445
|
}
|
|
337
446
|
}
|
|
447
|
+
// A completed Plan turn closes its segment with the plan card — the
|
|
448
|
+
// compact stand-in for the collapsed plan message, carrying the title the
|
|
449
|
+
// message would have shown. Every plan stays reviewable forever; only the
|
|
450
|
+
// latest carries the build authority (isLatestPlan). A superseded plan
|
|
451
|
+
// that never published an artifact is skipped — with no artifact and no
|
|
452
|
+
// build CTA it would render an empty shell.
|
|
453
|
+
if (isCompletedPlanExec) {
|
|
454
|
+
const isLatestPlan = execId === latestPlanExecutionId;
|
|
455
|
+
if (planArtifact || isLatestPlan) {
|
|
456
|
+
items.push({
|
|
457
|
+
kind: "plan-completion",
|
|
458
|
+
key: `${execId}-plan-completion`,
|
|
459
|
+
executionId: exec.metadata?.id ?? "",
|
|
460
|
+
planArtifact,
|
|
461
|
+
planTitle: collapsePlanMessage
|
|
462
|
+
? extractPlanTitle(messages[planMessageIndex].content)
|
|
463
|
+
: undefined,
|
|
464
|
+
isLatestPlan,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else if (streamingPlan) {
|
|
469
|
+
// The live stand-in for the suppressed streaming plan message. It
|
|
470
|
+
// deliberately SHARES the completion item's key: on completion this
|
|
471
|
+
// item becomes the plan-completion item above (a kind change under a
|
|
472
|
+
// stable key), so the card holds one thread position and the handoff
|
|
473
|
+
// reads as the card settling rather than a new element appearing.
|
|
474
|
+
items.push({
|
|
475
|
+
kind: "plan-writing",
|
|
476
|
+
key: `${execId}-plan-completion`,
|
|
477
|
+
executionId: exec.metadata?.id ?? "",
|
|
478
|
+
planTitle: extractLeadingH1(streamingPlan.displayText).title ?? undefined,
|
|
479
|
+
planSize: streamingPlan.displayText.length,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
338
482
|
// Anchor (3): a plan that produced no rendered narration or work item still
|
|
339
483
|
// surfaces — never silently dropped.
|
|
340
484
|
emitTodos();
|
|
@@ -399,15 +543,9 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
399
543
|
});
|
|
400
544
|
}
|
|
401
545
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
kind: "plan-completion",
|
|
406
|
-
key: "plan-completion",
|
|
407
|
-
executionId: lastExec?.metadata?.id ?? "",
|
|
408
|
-
planArtifact: findPlanArtifact(lastExec),
|
|
409
|
-
});
|
|
410
|
-
}
|
|
546
|
+
// Plan cards are emitted inside each execution's segment (see the
|
|
547
|
+
// isCompletedPlanExec block in the loop above) — attached to their plan
|
|
548
|
+
// document, persistent across later turns, never appended at the tail.
|
|
411
549
|
if (includeApprovals) {
|
|
412
550
|
// Backstop only: an approval whose tool call renders inline shows its gate
|
|
413
551
|
// on that row (see ApprovalContext / ToolCallItem). We emit a bottom card
|
|
@@ -473,11 +611,15 @@ export function buildThreadItems(executions, activeStreamExecution, pendingUserM
|
|
|
473
611
|
* />
|
|
474
612
|
* ```
|
|
475
613
|
*/
|
|
476
|
-
export function MessageThread({ executions, activeStreamExecution, pendingUserMessage, pendingMessageFailed = false, onRetrySend, onRetryExecution, onEditMessage, className, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, showFileReviewRecords = false, workspaceEntries, onFilePathClick, sandboxWorkspaceRoot, summarizationEvents, virtualized = false, onBuildFromPlan, org, planActionsDisabled,
|
|
614
|
+
export function MessageThread({ executions, activeStreamExecution, pendingUserMessage, pendingMessageFailed = false, onRetrySend, onRetryExecution, onEditMessage, className, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, showFileReviewRecords = false, workspaceEntries, onFilePathClick, sandboxWorkspaceRoot, summarizationEvents, virtualized = false, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, contentColumn, }) {
|
|
477
615
|
useRenderTracer("MessageThread", { executions, activeStreamExecution });
|
|
478
616
|
const includeApprovals = onApprovalSubmit != null;
|
|
479
617
|
const editableActiveTurn = onEditMessage != null;
|
|
480
|
-
|
|
618
|
+
// A streaming plan is collapsed behind its live card only when the host can
|
|
619
|
+
// open the plan document surface — a panel-less host (no onOpenPlan) keeps
|
|
620
|
+
// the plan streaming inline, where it remains readable (DD-011).
|
|
621
|
+
const collapseStreamingPlan = onOpenPlan != null;
|
|
622
|
+
const items = useMemo(() => buildThreadItems(executions, activeStreamExecution, pendingUserMessage, includeApprovals, workspaceEntries, summarizationEvents, pendingMessageFailed, editableActiveTurn, showFileReviewRecords, collapseStreamingPlan), [executions, activeStreamExecution, pendingUserMessage, includeApprovals, workspaceEntries, summarizationEvents, pendingMessageFailed, editableActiveTurn, showFileReviewRecords, collapseStreamingPlan]);
|
|
481
623
|
useKeyStability(items);
|
|
482
624
|
const filePathCtx = useMemo(() => ({
|
|
483
625
|
workspaceEntries: workspaceEntries ?? [],
|
|
@@ -529,14 +671,14 @@ export function MessageThread({ executions, activeStreamExecution, pendingUserMe
|
|
|
529
671
|
// cards, so the bar reuses the existing scroll machine without a new observer.
|
|
530
672
|
const unresolvedApprovalCount = pendingApprovals.length;
|
|
531
673
|
if (virtualized) {
|
|
532
|
-
return (_jsx("div", { className: cn("relative min-h-0", className), children: _jsx(Suspense, { fallback: null, children: _jsx(LazyVirtualizedThread, { items: items, formatToolCallSummary: formatToolCallSummary, onApprovalSubmit: onApprovalSubmit, submittingApprovalIds: submittingApprovalIds, approvalErrors: approvalErrors, filePathCtx: filePathCtx, sandboxCtx: sandboxCtx, approvalCtx: approvalCtx, fileReviewCtx: fileReviewCtx, unresolvedApprovalCount: unresolvedApprovalCount, onBuildFromPlan: onBuildFromPlan, org: org, planActionsDisabled: planActionsDisabled,
|
|
674
|
+
return (_jsx("div", { className: cn("relative min-h-0", className), children: _jsx(Suspense, { fallback: null, children: _jsx(LazyVirtualizedThread, { items: items, formatToolCallSummary: formatToolCallSummary, onApprovalSubmit: onApprovalSubmit, submittingApprovalIds: submittingApprovalIds, approvalErrors: approvalErrors, filePathCtx: filePathCtx, sandboxCtx: sandboxCtx, approvalCtx: approvalCtx, fileReviewCtx: fileReviewCtx, unresolvedApprovalCount: unresolvedApprovalCount, onBuildFromPlan: onBuildFromPlan, onOpenPlan: onOpenPlan, org: org, planActionsDisabled: planActionsDisabled, planBuildPending: planBuildPending, contentColumn: contentColumn, onRetrySend: onRetrySend, onRetryExecution: onRetryExecution, onEditMessage: onEditMessage }) }) }));
|
|
533
675
|
}
|
|
534
|
-
return (_jsx(NonVirtualizedThread, { items: items, className: className,
|
|
676
|
+
return (_jsx(NonVirtualizedThread, { items: items, className: className, contentColumn: contentColumn, formatToolCallSummary: formatToolCallSummary, onApprovalSubmit: onApprovalSubmit, submittingApprovalIds: submittingApprovalIds, approvalErrors: approvalErrors, filePathCtx: filePathCtx, sandboxCtx: sandboxCtx, approvalCtx: approvalCtx, fileReviewCtx: fileReviewCtx, unresolvedApprovalCount: unresolvedApprovalCount, onBuildFromPlan: onBuildFromPlan, onOpenPlan: onOpenPlan, org: org, planActionsDisabled: planActionsDisabled, planBuildPending: planBuildPending, onRetrySend: onRetrySend, onRetryExecution: onRetryExecution, onEditMessage: onEditMessage }));
|
|
535
677
|
}
|
|
536
|
-
function NonVirtualizedThread({ items, className,
|
|
678
|
+
function NonVirtualizedThread({ items, className, contentColumn, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, filePathCtx, sandboxCtx, approvalCtx, fileReviewCtx, unresolvedApprovalCount, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, onRetrySend, onRetryExecution, onEditMessage, }) {
|
|
537
679
|
const { scrollRef, sentinelRef, contentRef, isFollowing, jumpToLatest } = useAutoScroll();
|
|
538
680
|
useDomNodeCount(scrollRef, "MessageThread");
|
|
539
|
-
return (_jsxs("div", { className: cn("relative min-h-0", className), children: [_jsxs("div", { ref: scrollRef, role: "log", "aria-live": "polite", "aria-relevant": "additions", className: cn("h-full overflow-y-auto pt-6 pb-4 [overflow-anchor:none]", "[scrollbar-width:thin] [scrollbar-color:var(--color-border)_transparent]", "[&::-webkit-scrollbar]:w-1.5", "[&::-webkit-scrollbar-track]:bg-transparent", "[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-border/40"), children: [_jsx(SandboxContext.Provider, { value: sandboxCtx, children: _jsx(FilePathContext.Provider, { value: filePathCtx, children: _jsx(ApprovalContext.Provider, { value: approvalCtx, children: _jsx(FileReviewContext.Provider, { value: fileReviewCtx, children: _jsx(DevProfiler, { id: "MessageThread", children: _jsx("div", { ref: contentRef, className: cn("flex flex-col gap-4",
|
|
681
|
+
return (_jsxs("div", { className: cn("relative min-h-0", className), children: [_jsxs("div", { ref: scrollRef, role: "log", "aria-live": "polite", "aria-relevant": "additions", className: cn("h-full overflow-y-auto pt-6 pb-4 [overflow-anchor:none]", "[scrollbar-width:thin] [scrollbar-color:var(--color-border)_transparent]", "[&::-webkit-scrollbar]:w-1.5", "[&::-webkit-scrollbar-track]:bg-transparent", "[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-border/40"), children: [_jsx(SandboxContext.Provider, { value: sandboxCtx, children: _jsx(FilePathContext.Provider, { value: filePathCtx, children: _jsx(ApprovalContext.Provider, { value: approvalCtx, children: _jsx(FileReviewContext.Provider, { value: fileReviewCtx, children: _jsx(DevProfiler, { id: "MessageThread", children: _jsx("div", { ref: contentRef, className: cn("flex flex-col gap-4", threadContentColumnClass(contentColumn)), children: items.map((item) => (_jsx(ThreadItemWrapper, { animate: true, children: _jsx(ThreadItemRenderer, { item: item, formatToolCallSummary: formatToolCallSummary, onApprovalSubmit: onApprovalSubmit, submittingApprovalIds: submittingApprovalIds, approvalErrors: approvalErrors, onBuildFromPlan: onBuildFromPlan, onOpenPlan: onOpenPlan, org: org, planActionsDisabled: planActionsDisabled, planBuildPending: planBuildPending, onRetrySend: onRetrySend, onRetryExecution: onRetryExecution, onEditMessage: onEditMessage }) }, item.key))) }) }) }) }) }) }), _jsx("div", { ref: sentinelRef, "aria-hidden": "true" })] }), _jsx(JumpToLatestButton, { onClick: jumpToLatest, visible: !isFollowing && unresolvedApprovalCount === 0 }), _jsx(ApprovalPeekBar, { visible: !isFollowing && unresolvedApprovalCount > 0, count: unresolvedApprovalCount, onClick: jumpToLatest })] }));
|
|
540
682
|
}
|
|
541
683
|
/**
|
|
542
684
|
* Renders a single thread item by discriminated `kind`. Used by both
|
|
@@ -549,13 +691,13 @@ function NonVirtualizedThread({ items, className, centerContent, formatToolCallS
|
|
|
549
691
|
* @internal Exported for internal use by `VirtualizedThread` — not
|
|
550
692
|
* part of the public API.
|
|
551
693
|
*/
|
|
552
|
-
export function ThreadItemRenderer({ item, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, org, planActionsDisabled, onRetrySend, onRetryExecution, onEditMessage, }) {
|
|
694
|
+
export function ThreadItemRenderer({ item, formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, onRetrySend, onRetryExecution, onEditMessage, }) {
|
|
553
695
|
switch (item.kind) {
|
|
554
696
|
case "message":
|
|
555
697
|
if (item.isFailed) {
|
|
556
698
|
return (_jsx(FailedUserMessage, { message: item.message, onRetry: onRetrySend }));
|
|
557
699
|
}
|
|
558
|
-
return (_jsx(MessageEntry, { message: item.message, className: item.isPending ? "opacity-70" : undefined, onEdit: item.isEditable && onEditMessage
|
|
700
|
+
return (_jsx(MessageEntry, { message: item.message, className: item.isPending ? "opacity-70" : undefined, isPlanDocument: item.isPlanDocument, interactionMode: item.interactionMode, isBuildFromPlan: item.isBuildFromPlan, onEdit: item.isEditable && onEditMessage
|
|
559
701
|
? () => onEditMessage(item.message.content)
|
|
560
702
|
: undefined }));
|
|
561
703
|
case "tool-group":
|
|
@@ -580,7 +722,19 @@ export function ThreadItemRenderer({ item, formatToolCallSummary, onApprovalSubm
|
|
|
580
722
|
// When the plan was published as an artifact, show the richer reviewable
|
|
581
723
|
// card (preview / copy / download / implement). Otherwise fall back to the
|
|
582
724
|
// bare Implement CTA (older executions, or a plan that failed to publish).
|
|
583
|
-
|
|
725
|
+
// Only the latest plan receives the build action — a superseded plan's
|
|
726
|
+
// card is review-only, so a stale plan can never be implemented from it.
|
|
727
|
+
return item.planArtifact && item.executionId ? (_jsx(PlanArtifactCard, { executionId: item.executionId, artifact: item.planArtifact, title: item.planTitle, org: org, onImplement: item.isLatestPlan ? onBuildFromPlan : undefined,
|
|
728
|
+
// Every card routes to the plan document tab — the host renders a
|
|
729
|
+
// superseded plan read-only there (it receives the execution id).
|
|
730
|
+
onOpenPlan: onOpenPlan
|
|
731
|
+
? () => onOpenPlan(item.executionId)
|
|
732
|
+
: undefined, disabled: planActionsDisabled, buildPending: planBuildPending })) : (_jsx(PlanCompletionCard, { onImplement: item.isLatestPlan ? onBuildFromPlan : undefined, disabled: planActionsDisabled }));
|
|
733
|
+
case "plan-writing":
|
|
734
|
+
// The live stand-in for a plan the active turn is writing. Emitted only
|
|
735
|
+
// when onOpenPlan is wired (see buildThreadItems' collapseStreamingPlan
|
|
736
|
+
// gate), so the action is always available in practice.
|
|
737
|
+
return (_jsx(PlanStreamingCard, { title: item.planTitle, sizeBytes: item.planSize, onOpenPlan: onOpenPlan ? () => onOpenPlan(item.executionId) : undefined }));
|
|
584
738
|
}
|
|
585
739
|
}
|
|
586
740
|
// ---------------------------------------------------------------------------
|