fix: persist codexapp streaming state
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
const ASSET_VERSION = '20260615-codexapp-steer-status';
|
||||
const ASSET_VERSION = '20260615-codexapp-steer-status-session-menu';
|
||||
const WS_URL = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws`;
|
||||
const RENDER_DEBOUNCE = 100;
|
||||
const COMPOSER_SUGGESTION_DEBOUNCE = 120;
|
||||
@@ -2287,6 +2287,18 @@
|
||||
send({ type: 'set_session_pinned', sessionId: session.id, pinned: nextPinned });
|
||||
}
|
||||
|
||||
function setSessionActionMenuOpen(item, open) {
|
||||
if (!item) return;
|
||||
item.classList.toggle('menu-open', open);
|
||||
item.querySelector('.session-item-btn.more')?.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
}
|
||||
|
||||
function closeSessionActionMenus(exceptItem = null) {
|
||||
document.querySelectorAll('.session-item.menu-open').forEach((item) => {
|
||||
if (item !== exceptItem) setSessionActionMenuOpen(item, false);
|
||||
});
|
||||
}
|
||||
|
||||
function createSessionListItem(session) {
|
||||
const item = document.createElement('div');
|
||||
const isPinned = !!session.pinnedAt;
|
||||
@@ -2305,7 +2317,7 @@
|
||||
<div class="session-item-actions">
|
||||
<button class="session-item-btn pin${isPinned ? ' active' : ''}" title="${isPinned ? '取消置顶' : '置顶'}" aria-label="${isPinned ? '取消置顶' : '置顶'}">${isPinned ? '✓' : '⇧'}</button>
|
||||
<div class="session-item-more">
|
||||
<button class="session-item-btn more" type="button" title="更多操作" aria-label="更多操作" aria-haspopup="menu">⋯</button>
|
||||
<button class="session-item-btn more" type="button" title="更多操作" aria-label="更多操作" aria-haspopup="menu" aria-expanded="false">⋯</button>
|
||||
<div class="session-item-menu" role="menu" aria-label="会话操作">
|
||||
<button class="session-item-menu-btn copy-id" type="button" role="menuitem">复制 ID</button>
|
||||
<button class="session-item-menu-btn edit" type="button" role="menuitem">重命名</button>
|
||||
@@ -2321,20 +2333,26 @@
|
||||
: null;
|
||||
if (target?.classList.contains('more')) {
|
||||
e.stopPropagation();
|
||||
const nextOpen = !item.classList.contains('menu-open');
|
||||
closeSessionActionMenus(item);
|
||||
setSessionActionMenuOpen(item, nextOpen);
|
||||
return;
|
||||
}
|
||||
if (target?.classList.contains('copy-id')) {
|
||||
e.stopPropagation();
|
||||
closeSessionActionMenus();
|
||||
copyTextToClipboard(session.id, '会话 ID 已复制');
|
||||
return;
|
||||
}
|
||||
if (target?.classList.contains('pin')) {
|
||||
e.stopPropagation();
|
||||
closeSessionActionMenus();
|
||||
toggleSessionPinned(session);
|
||||
return;
|
||||
}
|
||||
if (target?.classList.contains('delete')) {
|
||||
e.stopPropagation();
|
||||
closeSessionActionMenus();
|
||||
const doDelete = () => {
|
||||
if (getLastSessionForAgent(currentAgent) === session.id) {
|
||||
localStorage.removeItem(getAgentSessionStorageKey(currentAgent));
|
||||
@@ -2355,6 +2373,7 @@
|
||||
}
|
||||
if (target?.classList.contains('edit')) {
|
||||
e.stopPropagation();
|
||||
closeSessionActionMenus();
|
||||
startEditSessionTitle(item, session);
|
||||
return;
|
||||
}
|
||||
@@ -2362,6 +2381,7 @@
|
||||
e.stopPropagation();
|
||||
return;
|
||||
}
|
||||
closeSessionActionMenus();
|
||||
openSession(session.id);
|
||||
});
|
||||
|
||||
@@ -5566,7 +5586,10 @@
|
||||
if (e.key === 'ArrowDown') { e.preventDefault(); navigateCmdMenu(1); return; }
|
||||
if (e.key === 'ArrowUp') { e.preventDefault(); navigateCmdMenu(-1); return; }
|
||||
if (e.key === 'Tab') { e.preventDefault(); selectCmdMenuItem(); return; }
|
||||
if (e.key === 'Escape') { hideCmdMenu(); return; }
|
||||
if (e.key === 'Escape') { hideCmdMenu(); closeSessionActionMenus(); return; }
|
||||
}
|
||||
if (e.key === 'Escape') {
|
||||
closeSessionActionMenus();
|
||||
}
|
||||
if (e.key === 'Enter' && !e.shiftKey) {
|
||||
if (isMobileInputMode()) {
|
||||
@@ -5601,10 +5624,16 @@
|
||||
|
||||
// Close cmd menu on outside click
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!(e.target instanceof Element) || !e.target.closest('.session-item-more')) {
|
||||
closeSessionActionMenus();
|
||||
}
|
||||
if (!cmdMenu.contains(e.target) && e.target !== msgInput) {
|
||||
hideCmdMenu();
|
||||
}
|
||||
});
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape') closeSessionActionMenus();
|
||||
});
|
||||
|
||||
// --- Toast Notification ---
|
||||
function showToast(text, sessionId) {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
document.documentElement.dataset.dividerTime = dividerTime;
|
||||
})();
|
||||
</script>
|
||||
<link rel="stylesheet" href="style.css?v=20260615-codexapp-steer-status">
|
||||
<link rel="stylesheet" href="style.css?v=20260615-codexapp-steer-status-session-menu">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
|
||||
</head>
|
||||
<body>
|
||||
@@ -150,6 +150,6 @@
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.1/marked.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
||||
<script src="app.js?v=20260615-codexapp-steer-status"></script>
|
||||
<script src="app.js?v=20260615-codexapp-steer-status-session-menu"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1204,6 +1204,9 @@ body.session-loading-active {
|
||||
.session-item:focus-within .session-item-actions {
|
||||
display: flex;
|
||||
}
|
||||
.session-item.menu-open .session-item-actions {
|
||||
display: flex;
|
||||
}
|
||||
.session-item-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
@@ -1242,7 +1245,7 @@ body.session-loading-active {
|
||||
.session-item-menu {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: calc(100% + 6px);
|
||||
top: calc(100% + 4px);
|
||||
z-index: 20;
|
||||
display: none;
|
||||
min-width: 104px;
|
||||
@@ -1252,8 +1255,7 @@ body.session-loading-active {
|
||||
background: var(--bg-secondary);
|
||||
box-shadow: 0 10px 24px rgba(61, 42, 26, 0.14);
|
||||
}
|
||||
.session-item-more:hover .session-item-menu,
|
||||
.session-item-more:focus-within .session-item-menu {
|
||||
.session-item.menu-open .session-item-menu {
|
||||
display: grid;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user