From c78bb53968a0bc584dff153e66c7b1ba40bae007 Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 22 Feb 2026 07:34:33 +0100 Subject: [PATCH] chore: bump version to 0.1598 --- CLAUDE.md | 2 +- package.json | 2 +- src/web/public/app.js | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 64b7f02e..8bb64d65 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -35,7 +35,7 @@ When user says "COM": 1. Increment version in BOTH `package.json` AND `CLAUDE.md` (verify they match with `grep version package.json && grep Version CLAUDE.md`) 2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web` -**Version**: 0.1597 (must match `package.json` for npm publish) +**Version**: 0.1598 (must match `package.json` for npm publish) ## Project Overview diff --git a/package.json b/package.json index 4e70ce98..e25902c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claudeman", - "version": "0.1597", + "version": "0.1598", "description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js", diff --git a/src/web/public/app.js b/src/web/public/app.js index 00f5b7e3..c013d443 100644 --- a/src/web/public/app.js +++ b/src/web/public/app.js @@ -2336,6 +2336,30 @@ class ClaudemanApp { flushInput(); return; } + // Tab key: send pending text + Tab to PTY for tab completion. + // Set a flag so flushPendingWrites() re-detects buffer text when + // the PTY response arrives (event-driven, no fixed timer). + if (data === '\t') { + const text = this._localEchoOverlay?.pendingText || ''; + this._localEchoOverlay?.clear(); + this._flushedOffsets?.delete(this.activeSessionId); + this._flushedTexts?.delete(this.activeSessionId); + if (text) { + this._pendingInput += text; + } + this._pendingInput += data; + if (this._inputFlushTimeout) { + clearTimeout(this._inputFlushTimeout); + this._inputFlushTimeout = null; + } + flushInput(); + // Only arm detection if there was actual text — stray Tabs from + // UI navigation (Ctrl+Tab) on an empty prompt should be ignored. + if (text) { + this._tabCompletionSessionId = this.activeSessionId; + } + return; + } // Control chars (Ctrl+C, single ESC): send buffered text + control char immediately const text = this._localEchoOverlay?.pendingText || ''; this._localEchoOverlay?.clear(); @@ -2700,6 +2724,19 @@ class ClaudemanApp { if (this._localEchoOverlay?.hasPending) { this._localEchoOverlay.rerender(); } + + // After Tab completion: the PTY response just arrived. Detect the + // completed text in the buffer and render it in the overlay. + if (this._tabCompletionSessionId && this._tabCompletionSessionId === this.activeSessionId + && this._localEchoOverlay && !this._localEchoOverlay.pendingText) { + this._tabCompletionSessionId = null; + this._localEchoOverlay._bufferDetectDone = false; + this._localEchoOverlay._detectBufferText(); + if (this._localEchoOverlay._flushedOffset > 0) { + this._localEchoOverlay._lastRenderKey = ''; + this._localEchoOverlay._render(); + } + } } /** @@ -4813,6 +4850,9 @@ class ClaudemanApp { this.flickerFilterBuffer = ''; this.flickerFilterActive = false; + // Clear tab completion detection flag — don't carry across sessions + this._tabCompletionSessionId = null; + // Clean up pending terminal writes to prevent old session data from appearing in new session if (this.syncWaitTimeout) { clearTimeout(this.syncWaitTimeout);