chore: bump version to 0.1576

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
arkon
2026-02-20 13:06:45 +01:00
co-authored by Claude Opus 4.6
parent 06c4e3933b
commit ee5e070776
3 changed files with 46 additions and 13 deletions
+1 -1
View File
@@ -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`) 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` 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.1575 (must match `package.json` for npm publish) **Version**: 0.1576 (must match `package.json` for npm publish)
## Project Overview ## Project Overview
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "claudeman", "name": "claudeman",
"version": "0.1575", "version": "0.1576",
"description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence", "description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",
+44 -11
View File
@@ -2135,26 +2135,42 @@ class ClaudemanApp {
return; return;
} }
if (/^[\r\n]+$/.test(data)) { if (/^[\r\n]+$/.test(data)) {
// Enter: drain any background-buffered chars, then send \r after 120ms. // Enter: use the overlay text as the authoritative source of truth.
// PTY already has the text from background sends; drain catches any remainder. // Background sends may have dropped or reordered chars (transient
// Capture sessionId NOW — the setTimeout fires 120ms later and activeSessionId // network errors, HTTP/1.1 connection races). Instead of trusting
// could change if the user switches tabs during that window. // the PTY state, we: (1) wait for in-flight sends to complete,
// (2) clear whatever the PTY has with backspaces, (3) re-send the
// correct text from the overlay, (4) send Enter. All in one batch
// so ordering is guaranteed.
const enterSessionId = this.activeSessionId; const enterSessionId = this.activeSessionId;
const correctText = this._localEchoOverlay?.pendingText || '';
this._localEchoOverlay?.clear(); this._localEchoOverlay?.clear();
// Cancel all pending timers and buffers — we'll re-send everything
if (this._inputFlushTimeout) { if (this._inputFlushTimeout) {
clearTimeout(this._inputFlushTimeout); clearTimeout(this._inputFlushTimeout);
this._inputFlushTimeout = null; this._inputFlushTimeout = null;
} }
const remainder = drainBgBuffer(); if (this._localEchoBgTimer) {
if (remainder) { clearTimeout(this._localEchoBgTimer);
this._pendingInput += remainder; this._localEchoBgTimer = null;
flushInput();
} }
setTimeout(() => { this._localEchoBgBuffer = '';
if (enterSessionId) { this._pendingInput = '';
// Discard any unsent pending chars — they'll be re-sent correctly
this._inputSendPending = '';
// Wait for any in-flight request to finish, then send correction
(async () => {
await this._waitForSendIdle();
if (!enterSessionId) return;
if (correctText) {
// Clear PTY input (backspaces) + re-type correct text + Enter.
// Extra backspaces on empty Ink input are harmless (no-ops).
const bs = '\x7f'.repeat(correctText.length + 10);
this._sendInputAsync(enterSessionId, bs + correctText + '\r');
} else {
this._sendInputAsync(enterSessionId, '\r'); this._sendInputAsync(enterSessionId, '\r');
} }
}, 120); })();
return; return;
} }
if (data.length > 1 && data.charCodeAt(0) >= 32) { if (data.length > 1 && data.charCodeAt(0) >= 32) {
@@ -3818,6 +3834,23 @@ class ClaudemanApp {
} }
/**
* Wait for the background send loop to finish its current in-flight request.
* Used by the Enter handler to ensure all background-sent chars have been
* delivered before sending the authoritative correction.
*/
_waitForSendIdle(timeoutMs = 500) {
if (!this._inputSendActive) return Promise.resolve();
return new Promise(resolve => {
const deadline = Date.now() + timeoutMs;
const check = () => {
if (!this._inputSendActive || Date.now() >= deadline) resolve();
else setTimeout(check, 10);
};
check();
});
}
_enqueueInput(sessionId, input) { _enqueueInput(sessionId, input) {
const existing = this._inputQueue.get(sessionId) || ''; const existing = this._inputQueue.get(sessionId) || '';
let combined = existing + input; let combined = existing + input;