v2: fix agent-runner lifecycle and session DB reliability

- Use DELETE journal mode for session DBs instead of WAL. WAL doesn't
  sync reliably across Docker volume mounts (VirtioFS), causing dropped
  writes and duplicate deliveries.
- Add 20s idle detection to end the query stream. The concurrent poll
  tracks SDK activity via a new 'activity' provider event. When no SDK
  events arrive for 20s and no messages are pending, the stream ends
  and the poll loop continues.
- Add touchProcessing heartbeat so the host can distinguish active
  agents from idle ones by checking status_changed recency.
- Catch query errors in the poll loop and write error responses to
  messages_out instead of crashing the process.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
gavrielc
2026-04-09 01:34:59 +03:00
parent 7201fe5032
commit 6f2a7314d0
8 changed files with 64 additions and 28 deletions

View File

@@ -80,7 +80,7 @@ export function initSessionFolder(agentGroupId: string, sessionId: string): void
const dbPath = sessionDbPath(agentGroupId, sessionId);
if (!fs.existsSync(dbPath)) {
const db = new Database(dbPath);
db.pragma('journal_mode = WAL');
db.pragma('journal_mode = DELETE');
db.exec(SESSION_SCHEMA);
db.close();
log.debug('Session DB created', { dbPath });
@@ -105,7 +105,7 @@ export function writeSessionMessage(
): void {
const dbPath = sessionDbPath(agentGroupId, sessionId);
const db = new Database(dbPath);
db.pragma('journal_mode = WAL');
db.pragma('journal_mode = DELETE');
try {
db.prepare(
@@ -134,7 +134,7 @@ export function writeSessionMessage(
export function openSessionDb(agentGroupId: string, sessionId: string): Database.Database {
const dbPath = sessionDbPath(agentGroupId, sessionId);
const db = new Database(dbPath);
db.pragma('journal_mode = WAL');
db.pragma('journal_mode = DELETE');
return db;
}