Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
227 lines
5.6 KiB
TypeScript
227 lines
5.6 KiB
TypeScript
import { useLayoutEffect, useMemo } from 'react';
|
|
|
|
import {
|
|
AppSessionRuntimeContext,
|
|
registerAppSessionRuntime,
|
|
} from '../../state/appRuntimeBridge';
|
|
import {
|
|
publishSessionSnapshot,
|
|
registerSessionSnapshotActions,
|
|
} from '../../state/sessionSnapshotStore';
|
|
import { useSessionState } from '../../state/useSessionState';
|
|
import type { ReactNode } from 'react';
|
|
|
|
export type SessionPublisherProps = {
|
|
/** Peer session windows must not write the main window's restore record. */
|
|
persistSessionRestore: boolean;
|
|
children?: ReactNode;
|
|
};
|
|
|
|
/**
|
|
* Owns `useSessionState` and publishes it the same three ways `VaultPublisher`
|
|
* publishes the vault: catalog into `sessionSnapshotStore`, mutators into its
|
|
* action slot, and the whole runtime onto `appRuntimeBridge` for App.
|
|
*/
|
|
export function SessionPublisher({ persistSessionRestore, children }: SessionPublisherProps) {
|
|
const session = useSessionState({ persistSessionRestore });
|
|
const {
|
|
sessions,
|
|
orphanSessions,
|
|
workspaces,
|
|
logViews,
|
|
draggingSessionId,
|
|
sessionRenameTarget,
|
|
workspaceRenameTarget,
|
|
setActiveTabId,
|
|
closeSession,
|
|
closeSessions,
|
|
closeWorkspace,
|
|
openLogView,
|
|
closeLogView,
|
|
setDraggingSessionId,
|
|
startSessionRename,
|
|
renameSessionInline,
|
|
submitSessionRename,
|
|
resetSessionRename,
|
|
startWorkspaceRename,
|
|
submitWorkspaceRename,
|
|
resetWorkspaceRename,
|
|
removeSessionFromWorkspace,
|
|
setWorkspaceFocusedSession,
|
|
toggleWorkspaceViewMode,
|
|
createLocalTerminal,
|
|
createSerialSession,
|
|
connectToHost,
|
|
updateSessionStatus,
|
|
updateSessionFontSize,
|
|
clearSessionFontSizeOverride,
|
|
createWorkspaceWithHosts,
|
|
createWorkspaceFromSessions,
|
|
addSessionToWorkspace,
|
|
appendHostToWorkspace,
|
|
appendLocalTerminalToWorkspace,
|
|
createWorkspaceFromTargets,
|
|
updateSplitSizes,
|
|
splitSession,
|
|
reorderWorkspaceSessions,
|
|
moveFocusInWorkspace,
|
|
runSnippet,
|
|
getOrderedWorkTabs,
|
|
reorderTabs,
|
|
toggleBroadcast,
|
|
isBroadcastEnabled,
|
|
toggleGlobalBroadcast,
|
|
isGlobalBroadcastEnabled,
|
|
canUseGlobalBroadcast,
|
|
copySession,
|
|
copyWorkspace,
|
|
createSessionFromCloneSource,
|
|
updateSessionRestoreCwd,
|
|
getSessionRestoreCwd,
|
|
updateSessionDynamicTitle,
|
|
updateSessionCodingCliProvider,
|
|
} = session;
|
|
|
|
useLayoutEffect(() => {
|
|
registerAppSessionRuntime(session);
|
|
}, [session]);
|
|
|
|
// Only a real unmount clears the slot; see VaultPublisher for why.
|
|
useLayoutEffect(() => () => {
|
|
registerAppSessionRuntime(null);
|
|
}, []);
|
|
|
|
useLayoutEffect(() => {
|
|
publishSessionSnapshot({
|
|
sessions,
|
|
orphanSessions,
|
|
workspaces,
|
|
logViews,
|
|
draggingSessionId,
|
|
sessionRenameTarget,
|
|
workspaceRenameTarget,
|
|
});
|
|
}, [
|
|
draggingSessionId,
|
|
logViews,
|
|
orphanSessions,
|
|
sessionRenameTarget,
|
|
sessions,
|
|
workspaceRenameTarget,
|
|
workspaces,
|
|
]);
|
|
|
|
const sessionActions = useMemo(() => ({
|
|
setActiveTabId,
|
|
closeSession,
|
|
closeSessions,
|
|
closeWorkspace,
|
|
openLogView,
|
|
closeLogView,
|
|
setDraggingSessionId,
|
|
startSessionRename,
|
|
renameSessionInline,
|
|
submitSessionRename,
|
|
resetSessionRename,
|
|
startWorkspaceRename,
|
|
submitWorkspaceRename,
|
|
resetWorkspaceRename,
|
|
removeSessionFromWorkspace,
|
|
setWorkspaceFocusedSession,
|
|
toggleWorkspaceViewMode,
|
|
createLocalTerminal,
|
|
createSerialSession,
|
|
connectToHost,
|
|
updateSessionStatus,
|
|
updateSessionFontSize,
|
|
clearSessionFontSizeOverride,
|
|
createWorkspaceWithHosts,
|
|
createWorkspaceFromSessions,
|
|
addSessionToWorkspace,
|
|
appendHostToWorkspace,
|
|
appendLocalTerminalToWorkspace,
|
|
createWorkspaceFromTargets,
|
|
updateSplitSizes,
|
|
splitSession,
|
|
reorderWorkspaceSessions,
|
|
moveFocusInWorkspace,
|
|
runSnippet,
|
|
getOrderedWorkTabs,
|
|
reorderTabs,
|
|
toggleBroadcast,
|
|
isBroadcastEnabled,
|
|
toggleGlobalBroadcast,
|
|
isGlobalBroadcastEnabled,
|
|
canUseGlobalBroadcast,
|
|
copySession,
|
|
copyWorkspace,
|
|
createSessionFromCloneSource,
|
|
updateSessionRestoreCwd,
|
|
getSessionRestoreCwd,
|
|
updateSessionDynamicTitle,
|
|
updateSessionCodingCliProvider,
|
|
}), [
|
|
addSessionToWorkspace,
|
|
appendHostToWorkspace,
|
|
appendLocalTerminalToWorkspace,
|
|
clearSessionFontSizeOverride,
|
|
closeLogView,
|
|
closeSession,
|
|
closeSessions,
|
|
closeWorkspace,
|
|
connectToHost,
|
|
copySession,
|
|
copyWorkspace,
|
|
createLocalTerminal,
|
|
createSerialSession,
|
|
createSessionFromCloneSource,
|
|
createWorkspaceFromSessions,
|
|
createWorkspaceFromTargets,
|
|
createWorkspaceWithHosts,
|
|
getOrderedWorkTabs,
|
|
getSessionRestoreCwd,
|
|
isBroadcastEnabled,
|
|
isGlobalBroadcastEnabled,
|
|
moveFocusInWorkspace,
|
|
openLogView,
|
|
canUseGlobalBroadcast,
|
|
removeSessionFromWorkspace,
|
|
renameSessionInline,
|
|
reorderTabs,
|
|
reorderWorkspaceSessions,
|
|
resetSessionRename,
|
|
resetWorkspaceRename,
|
|
runSnippet,
|
|
setActiveTabId,
|
|
setDraggingSessionId,
|
|
setWorkspaceFocusedSession,
|
|
splitSession,
|
|
startSessionRename,
|
|
startWorkspaceRename,
|
|
submitSessionRename,
|
|
submitWorkspaceRename,
|
|
toggleBroadcast,
|
|
toggleGlobalBroadcast,
|
|
toggleWorkspaceViewMode,
|
|
updateSessionCodingCliProvider,
|
|
updateSessionDynamicTitle,
|
|
updateSessionFontSize,
|
|
updateSessionRestoreCwd,
|
|
updateSessionStatus,
|
|
updateSplitSizes,
|
|
]);
|
|
|
|
useLayoutEffect(() => {
|
|
registerSessionSnapshotActions(sessionActions);
|
|
return () => {
|
|
registerSessionSnapshotActions(null);
|
|
};
|
|
}, [sessionActions]);
|
|
|
|
return (
|
|
<AppSessionRuntimeContext.Provider value={session}>
|
|
{children}
|
|
</AppSessionRuntimeContext.Provider>
|
|
);
|
|
}
|