fix: clearCompleted must also delete from _knownSessions
Without this, _onSessionAdded never fires on reactivation because isKnown=true short-circuits the new-session detection branch. clearCompleted is called on lock file creation / ghost watch fire. It clears _completedSessions cooldown but the session key stayed in _knownSessions (isKnown=true), so poll() treated it as already tracked and silently updated the entry instead of firing _onSessionAdded. Fix: also delete from _knownSessions in clearCompleted() so next poll sees the session as unknown and fires _onSessionAdded -> creates new plugin status box. Also: findExistingPost skipped in plugin mode on session-added to prevent stale post reuse from REST search results.
This commit is contained in:
@@ -106,6 +106,10 @@ class SessionMonitor extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
clearCompleted(sessionKey) {
|
clearCompleted(sessionKey) {
|
||||||
this._completedSessions.delete(sessionKey);
|
this._completedSessions.delete(sessionKey);
|
||||||
|
// Also remove from _knownSessions so the next poll sees it as a new session
|
||||||
|
// and fires _onSessionAdded (which creates the new status box).
|
||||||
|
// Without this, isKnown=true suppresses _onSessionAdded even after clearCompleted.
|
||||||
|
this._knownSessions.delete(sessionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -287,8 +287,11 @@ async function startDaemon() {
|
|||||||
logger.info({ sessionKey }, 'Reactivating session — creating fresh status box');
|
logger.info({ sessionKey }, 'Reactivating session — creating fresh status box');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for existing post (restart recovery)
|
// Check for existing post (restart recovery — REST mode only).
|
||||||
if (!postId) {
|
// In plugin mode we always create a fresh post: the plugin manages its own
|
||||||
|
// KV store and the old post is already marked done. Reusing it would make
|
||||||
|
// the status box appear stuck at the old position in the thread.
|
||||||
|
if (!postId && !(usePlugin && pluginClient)) {
|
||||||
const saved = savedOffsets[sessionKey]; // eslint-disable-line security/detect-object-injection
|
const saved = savedOffsets[sessionKey]; // eslint-disable-line security/detect-object-injection
|
||||||
if (saved) {
|
if (saved) {
|
||||||
// Try to find existing post in channel history
|
// Try to find existing post in channel history
|
||||||
@@ -300,7 +303,9 @@ async function startDaemon() {
|
|||||||
if (!postId) {
|
if (!postId) {
|
||||||
try {
|
try {
|
||||||
if (usePlugin && pluginClient) {
|
if (usePlugin && pluginClient) {
|
||||||
// Plugin mode: create custom_livestatus post via plugin
|
// Plugin mode: always create a fresh custom_livestatus post.
|
||||||
|
// The plugin replaces any existing KV entry for this sessionKey so there
|
||||||
|
// is no risk of duplicate boxes.
|
||||||
postId = await pluginClient.createSession(sessionKey, channelId, rootPostId, agentId);
|
postId = await pluginClient.createSession(sessionKey, channelId, rootPostId, agentId);
|
||||||
logger.info({ sessionKey, postId, channelId, mode: 'plugin' }, 'Created status box via plugin');
|
logger.info({ sessionKey, postId, channelId, mode: 'plugin' }, 'Created status box via plugin');
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user