chore: bump version to 0.1641

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
arkon
2026-02-25 17:14:53 +01:00
co-authored by Claude Opus 4.6
parent fd0b75c9a5
commit 64ad8b467b
4 changed files with 48 additions and 16 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.1640 (must match `package.json`) **Version**: 0.1641 (must match `package.json`)
## Project Overview ## Project Overview
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "claudeman", "name": "claudeman",
"version": "0.1640", "version": "0.1641",
"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",
+37 -14
View File
@@ -960,6 +960,7 @@ const VoiceInput = {
}, },
_onWebSpeechResult(event) { _onWebSpeechResult(event) {
if (!this.isRecording) return;
this._resetSilenceTimeout(); this._resetSilenceTimeout();
let interim = ''; let interim = '';
let finalText = ''; let finalText = '';
@@ -1023,13 +1024,18 @@ const VoiceInput = {
_insertText(text) { _insertText(text) {
if (!app.activeSessionId || !text.trim()) return; if (!app.activeSessionId || !text.trim()) return;
const trimmed = text.trim(); const trimmed = text.trim();
if (app._localEchoEnabled && app._localEchoOverlay) { const mode = this._getDeepgramConfig().insertMode || 'direct';
// Local echo on: inject into overlay so backspace/editing works (same as paste).
app._localEchoOverlay.appendText(trimmed); if (mode === 'compose') {
setTimeout(() => { if (app.terminal) app.terminal.focus(); }, 150);
} else {
// Local echo off: show editable compose overlay before sending to PTY.
this._showComposeOverlay(trimmed); this._showComposeOverlay(trimmed);
} else {
// Direct mode: inject into local echo overlay if available, else send to PTY
if (app._localEchoEnabled && app._localEchoOverlay) {
app._localEchoOverlay.appendText(trimmed);
} else {
app.sendInput(trimmed).catch(() => {});
}
setTimeout(() => { if (app.terminal) app.terminal.focus(); }, 150);
} }
}, },
@@ -2585,14 +2591,29 @@ class ClaudemanApp {
const settingsPromise = fetch('/api/settings').then(r => r.ok ? r.json() : null).catch(() => null); const settingsPromise = fetch('/api/settings').then(r => r.ok ? r.json() : null).catch(() => null);
this.loadQuickStartCases(null, settingsPromise); this.loadQuickStartCases(null, settingsPromise);
this.setupEventListeners(); this.setupEventListeners();
// Mobile settings gear: non-passive touchstart to prevent keyboard dismiss // Mobile: ensure button taps register even when keyboard is visible.
const settingsBtn = document.querySelector('.btn-settings-mobile'); // On mobile, tapping a button while the soft keyboard is up causes the
if (settingsBtn) { // browser to dismiss the keyboard first (blur event), swallowing the tap.
settingsBtn.addEventListener('touchstart', (e) => { // The button only receives the click on a second tap. Fix: intercept
e.preventDefault(); // touchstart on buttons while keyboard is visible, preventDefault to stop
e.stopPropagation(); // the dismiss-swallows-tap behavior, and trigger the click programmatically.
app.openAppSettings(); if (MobileDetection.isTouchDevice()) {
}, { passive: false }); const addKeyboardTapFix = (container) => {
if (!container) return;
container.addEventListener('touchstart', (e) => {
if (!KeyboardHandler.keyboardVisible) return;
const btn = e.target.closest('button');
if (!btn) return;
e.preventDefault();
btn.click();
// Refocus terminal so keyboard stays open (e.g. voice input button)
if (typeof app !== 'undefined' && app.terminal) {
app.terminal.focus();
}
}, { passive: false });
};
addKeyboardTapFix(document.querySelector('.toolbar'));
addKeyboardTapFix(document.querySelector('.welcome-overlay'));
} }
// System stats polling deferred until sessions exist (started in handleInit/session:created) // System stats polling deferred until sessions exist (started in handleInit/session:created)
// Setup online/offline detection // Setup online/offline detection
@@ -10995,6 +11016,7 @@ class ClaudemanApp {
document.getElementById('voiceDeepgramKey').value = voiceCfg.apiKey || ''; document.getElementById('voiceDeepgramKey').value = voiceCfg.apiKey || '';
document.getElementById('voiceLanguage').value = voiceCfg.language || 'en-US'; document.getElementById('voiceLanguage').value = voiceCfg.language || 'en-US';
document.getElementById('voiceKeyterms').value = voiceCfg.keyterms || 'claudeman, tmux, respawn, subagent, ralph, fastify, xterm, pty'; document.getElementById('voiceKeyterms').value = voiceCfg.keyterms || 'claudeman, tmux, respawn, subagent, ralph, fastify, xterm, pty';
document.getElementById('voiceInsertMode').value = voiceCfg.insertMode || 'direct';
// Reset key visibility to hidden // Reset key visibility to hidden
const keyInput = document.getElementById('voiceDeepgramKey'); const keyInput = document.getElementById('voiceDeepgramKey');
keyInput.type = 'password'; keyInput.type = 'password';
@@ -11190,6 +11212,7 @@ class ClaudemanApp {
apiKey: document.getElementById('voiceDeepgramKey').value.trim(), apiKey: document.getElementById('voiceDeepgramKey').value.trim(),
language: document.getElementById('voiceLanguage').value, language: document.getElementById('voiceLanguage').value,
keyterms: document.getElementById('voiceKeyterms').value.trim(), keyterms: document.getElementById('voiceKeyterms').value.trim(),
insertMode: document.getElementById('voiceInsertMode').value,
}); });
// Save notification preferences separately // Save notification preferences separately
+9
View File
@@ -1175,6 +1175,15 @@
<span class="voice-provider-status" id="voiceProviderStatus">—</span> <span class="voice-provider-status" id="voiceProviderStatus">—</span>
</div> </div>
<div class="settings-section-header">Behavior</div>
<div class="settings-item" style="grid-column: 1 / -1;">
<span class="settings-item-label">Insert mode</span>
<select id="voiceInsertMode" class="form-select" style="width: auto;">
<option value="direct">Direct to input</option>
<option value="compose">Compose dialog</option>
</select>
</div>
<div class="settings-section-header">Deepgram Nova-3</div> <div class="settings-section-header">Deepgram Nova-3</div>
<div class="form-row" style="grid-column: 1 / -1;"> <div class="form-row" style="grid-column: 1 / -1;">
<label for="voiceDeepgramKey">API Key</label> <label for="voiceDeepgramKey">API Key</label>