chore: rebrand to Agent Orchestrator + fix pragma busy_timeout crash

Rebrand all user-visible BTerminal references to Agent Orchestrator
(window title, product name, identifier, status bar, updater URL,
context registration, CLAUDE.md branch reference).

Fix critical btmsg/bttask crash: pragma_update uses execute() internally
but PRAGMA busy_timeout returns a result row, causing "Execute returned
results" error that silently broke all CommsTab message loading.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
DexterFromLab 2026-03-12 11:42:13 +01:00
parent a313da8892
commit 4fee567dd9
8 changed files with 19 additions and 18 deletions

View file

@ -1,4 +1,4 @@
# BTerminal — Claude Behavioral Guide # Agent Orchestrator — Claude Behavioral Guide
## Workflow ## Workflow
@ -22,7 +22,7 @@
## Rules ## Rules
- Do not modify v1 code (`bterminal.py`) unless explicitly asked — it is production-stable. - Do not modify v1 code (`bterminal.py`) unless explicitly asked — it is production-stable.
- v2/v3 work goes on the `v2-mission-control` branch, not master. - v2/v3 work goes on the `dexter_changes` branch (repo: agent-orchestrator), not master.
- v2 architecture decisions must reference `docs/task_plan.md` Decisions Log. - v2 architecture decisions must reference `docs/task_plan.md` Decisions Log.
- v3 architecture decisions must reference `docs/v3-task_plan.md` Decisions Log. - v3 architecture decisions must reference `docs/v3-task_plan.md` Decisions Log.
- When adding new decisions, append to the Decisions Log table with date. - When adding new decisions, append to the Decisions Log table with date.

View file

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BTerminal</title> <title>Agent Orchestrator</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View file

@ -33,7 +33,7 @@ fn open_db() -> Result<Connection, String> {
.map_err(|e| format!("Failed to open btmsg.db: {e}"))?; .map_err(|e| format!("Failed to open btmsg.db: {e}"))?;
conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(())) conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(()))
.map_err(|e| format!("Failed to set WAL mode: {e}"))?; .map_err(|e| format!("Failed to set WAL mode: {e}"))?;
conn.pragma_update(None, "busy_timeout", 5000) conn.query_row("PRAGMA busy_timeout = 5000", [], |_| Ok(()))
.map_err(|e| format!("Failed to set busy_timeout: {e}"))?; .map_err(|e| format!("Failed to set busy_timeout: {e}"))?;
Ok(conn) Ok(conn)
} }
@ -480,7 +480,7 @@ fn open_db_or_create() -> Result<Connection, String> {
conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(())) conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(()))
.map_err(|e| format!("Failed to set WAL mode: {e}"))?; .map_err(|e| format!("Failed to set WAL mode: {e}"))?;
conn.pragma_update(None, "busy_timeout", 5000) conn.query_row("PRAGMA busy_timeout = 5000", [], |_| Ok(()))
.map_err(|e| format!("Failed to set busy_timeout: {e}"))?; .map_err(|e| format!("Failed to set busy_timeout: {e}"))?;
// Create tables if they don't exist (same schema as Python btmsg CLI) // Create tables if they don't exist (same schema as Python btmsg CLI)

View file

@ -33,7 +33,7 @@ fn open_db() -> Result<Connection, String> {
.map_err(|e| format!("Failed to open btmsg.db: {e}"))?; .map_err(|e| format!("Failed to open btmsg.db: {e}"))?;
conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(())) conn.query_row("PRAGMA journal_mode=WAL", [], |_| Ok(()))
.map_err(|e| format!("Failed to set WAL mode: {e}"))?; .map_err(|e| format!("Failed to set WAL mode: {e}"))?;
conn.pragma_update(None, "busy_timeout", 5000) conn.query_row("PRAGMA busy_timeout = 5000", [], |_| Ok(()))
.map_err(|e| format!("Failed to set busy_timeout: {e}"))?; .map_err(|e| format!("Failed to set busy_timeout: {e}"))?;
// Migration: add version column if missing // Migration: add version column if missing

View file

@ -1,8 +1,8 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "bterminal", "productName": "agent-orchestrator",
"version": "0.1.0", "version": "0.1.0",
"identifier": "com.dexterfromlab.bterminal", "identifier": "com.dexterfromlab.agent-orchestrator",
"build": { "build": {
"frontendDist": "../dist", "frontendDist": "../dist",
"devUrl": "http://localhost:9700", "devUrl": "http://localhost:9700",
@ -12,7 +12,7 @@
"app": { "app": {
"windows": [ "windows": [
{ {
"title": "BTerminal", "title": "Agent Orchestrator",
"width": 1920, "width": 1920,
"height": 1080, "height": 1080,
"resizable": true, "resizable": true,
@ -27,7 +27,7 @@
"plugins": { "plugins": {
"updater": { "updater": {
"endpoints": [ "endpoints": [
"https://github.com/DexterFromLab/BTerminal/releases/latest/download/latest.json" "https://github.com/DexterFromLab/agent-orchestrator/releases/latest/download/latest.json"
], ],
"dialog": true, "dialog": true,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEJCRkZEMERDMTUwMzY5MjIKUldRaWFRTVYzTkQvdTYwRDh6YStaSE9rWUZYYkRGd3UvVUcydE1IQVdTM29uNTRPTlpjQmFqVFEK" "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEJCRkZEMERDMTUwMzY5MjIKUldRaWFRTVYzTkQvdTYwRDh6YStaSE9rWUZYYkRGd3UvVUcydE1IQVdTM29uNTRPTlpjQmFqVFEK"
@ -50,7 +50,7 @@
], ],
"category": "DeveloperTool", "category": "DeveloperTool",
"shortDescription": "Multi-session Claude agent dashboard", "shortDescription": "Multi-session Claude agent dashboard",
"longDescription": "BTerminal is a terminal emulator with integrated Claude AI agent sessions, SSH management, and a tiling pane layout. Built with Tauri, Svelte 5, and xterm.js.", "longDescription": "Agent Orchestrator is a multi-project agent dashboard with integrated Claude AI sessions, SSH management, and multi-agent orchestration. Built with Tauri, Svelte 5, and xterm.js.",
"linux": { "linux": {
"deb": { "deb": {
"depends": [ "depends": [

View file

@ -32,7 +32,7 @@
loading = true; loading = true;
try { try {
// Register project if not already (INSERT OR IGNORE) // Register project if not already (INSERT OR IGNORE)
await ctxRegisterProject(projectName, `BTerminal project: ${projectName}`, projectCwd); await ctxRegisterProject(projectName, `Agent Orchestrator project: ${projectName}`, projectCwd);
const [ctx, shared, sums] = await Promise.all([ const [ctx, shared, sums] = await Promise.all([
ctxGetContext(projectName), ctxGetContext(projectName),

View file

@ -155,7 +155,7 @@
</button> </button>
<span class="sep"></span> <span class="sep"></span>
{/if} {/if}
<span class="item version">BTerminal v3</span> <span class="item version">Agent Orchestrator v3</span>
</div> </div>
</div> </div>

View file

@ -54,8 +54,8 @@
try { try {
agents = await getGroupAgents(groupId); agents = await getGroupAgents(groupId);
channels = await getChannels(groupId); channels = await getChannels(groupId);
} catch { } catch (e) {
// btmsg.db might not exist console.error('[CommsTab] loadData failed:', e);
} }
} }
@ -70,8 +70,8 @@
} else if (currentView.type === 'channel') { } else if (currentView.type === 'channel') {
channelMessages = await getChannelMessages(currentView.channelId, 100); channelMessages = await getChannelMessages(currentView.channelId, 100);
} }
} catch { } catch (e) {
// silently fail console.error('[CommsTab] loadMessages failed:', e);
} }
} }
@ -91,7 +91,8 @@
$effect(() => { $effect(() => {
void groupId; void groupId;
if (groupId) { if (groupId) {
ensureAdmin(groupId).catch(() => {}); console.log('[CommsTab] groupId:', groupId);
ensureAdmin(groupId).catch((e) => console.error('[CommsTab] ensureAdmin failed:', e));
loadData(); loadData();
} }
}); });