feat: AI commit messages, change tree, router behavesAs, sidebar times (v2.2.0)

- Changes panel: Files and Changes merged into one panel; the overview's
  groups drawn as a folder tree (compacted chains, file counts, fold,
  stage/unstage a whole folder)
- AI-suggested commit message for what is staged
  (POST /api/lanes/:id/git/commit-message, claude -p --safe-mode, haiku)
- AI Router: optional "Behaves as" Claude model id, written as
  modelPicker options into the router's --settings file (issue #56)
- Sidebar: session rows show last activity, live rows their start time;
  a closed Terminal row can be removed (DELETE /api/run/history/:id)
- Every pane's CLI starts only once a client is attached; claude panes
  no longer forced inline; tmux scrollbar one column wide
- Update notifier: "Check for updates" reopens a closed notice
This commit is contained in:
2026-10-06 12:36:06 +07:00
parent 6c605849d8
commit f0500dc592
41 changed files with 1201 additions and 249 deletions
+17
View File
@@ -158,6 +158,23 @@ router.get("/history", (req, res) => {
});
});
/**
* Forget one closed Terminal tab (`tool = 'shell'`) from the history — the
* sidebar's remove. A live pane is refused; another tool's row is a 404.
*/
router.delete("/history/:id", (req, res) => {
if (runs.listRuns().some((h) => h.id === req.params.id)) {
return res.status(409).json({ error: { code: "ERUNLIVE", message: "terminal is still open" } });
}
const dr = require("../lib/dashboard-runs");
if (!dr.forgetShellRun(req.params.id)) {
return res
.status(404)
.json({ error: { code: "ENOTFOUND", message: "no closed terminal with that id" } });
}
res.json({ removed: req.params.id });
});
/**
* Suggest plausible working directories. Pulls from:
* - "dashboard": the dashboard server's cwd