fix: event-loop freezes, plugin-install boot crash, tmux attach/scrollbar, Codex transcripts

- GET /api/workflows: one LEAD() window pass in a read worker (read-pool.js,
  workflow-stats.js); idx_events_session restored, idx_events_tool added
- compat-sqlite gains function/pluck/readonly so a plugin install without a
  better-sqlite3 build boots again; antigravity-usage uses db.js's Database
- install-hooks adds no checkout hooks while the agenthub plugin is enabled
  (events were doubled)
- terminal attach runs the live tmux server's own binary; the pane scrollbar
  gets a visible 2-column style, and claude panes start with
  CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 so tmux keeps history to scroll
- Codex sessions' conversation in GET /api/sessions/:id/transcript
- Codex/Antigravity sessions claimed by their workspace without hooks
- UI-audit follow-ups, docs and OpenAPI
This commit is contained in:
2026-10-05 17:01:05 +07:00
parent 442f133930
commit 198fbb7980
78 changed files with 2716 additions and 873 deletions
+3 -2
View File
@@ -1895,8 +1895,9 @@ router.post("/:id/:action", sameOriginGuard, async (req, res) => {
const picked = pickSlot(current.id);
if (picked === null) return { allBusy: true };
slot = picked;
const liveId = slot ? runs.runIdForLane(current.id, slot) : current.run_id;
const live = liveId ? runs.getRun(liveId) : null;
// By the pane's own name, slot 0 too: a terminal tab in pane 0 is no
// run, so `run_id` does not name it, and a start there would take it over.
const live = runs.getRun(runs.runIdForLane(current.id, slot || 0));
if (live && live.status === "running") {
return { conflict: true };
}