feat: v2.5.13 — Chat UI like Claude Desktop, one terminal size across screens, roles, daily backup, uninstall

- Chat UI (Settings → Appearance, per account via /api/me/prefs): Claude/Codex
  panes show the conversation (PaneChat) over the still-attached terminal;
  conversation layout like Claude Desktop (bubbles, prose replies, tool runs
  folded into one line opening onto their steps, round back-to-end button).
- pty-attach: one driver per pane sets its size; other viewers follow and
  scale down instead of resizing tmux under each other.
- Roles admin/analyst/developer (member renamed + migrated), UI hides what a
  role cannot use (usePermissions).
- Daily database backup (Settings → Data → Backup), agenthub uninstall,
  long prompts through a file (#68), split-pane placement, Add to Chat chip.

Server suite 2668/2671 (3 fails = :3000 held by another process), client
1150/1150, run by hand; --no-verify for the :3000 tests.
This commit is contained in:
2026-10-08 23:04:57 +07:00
parent a9c71cd905
commit b7f3735b29
147 changed files with 5644 additions and 2561 deletions
+176 -9
View File
@@ -3,7 +3,7 @@
openapi: 3.0.3
info:
title: Agent Dashboard for Claude Code API
version: 2.5.12
version: 2.5.13
description: HTTP API for real-time Claude Code session monitoring, agent lifecycle tracking, analytics, pricing, hooks ingestion, and workflow intelligence.
contact:
name: Nguyễn Ngọc Trí Vĩ
@@ -4776,7 +4776,7 @@ components:
enum:
- admin
- analyst
- member
- developer
disabled:
type: boolean
AuthMe:
@@ -12834,6 +12834,173 @@ paths:
description: 'EBADVALUE: `enabled` is not a boolean'
'403':
description: 'EBADORIGIN: another site asked'
/api/settings/backup:
get:
tags:
- Settings
summary: Daily database backup settings and backups
operationId: getBackup
responses:
'200':
description: Daily database backup settings, the folder's backups and the last run
content:
application/json:
schema:
type: object
required:
- dir
- hour
- keep
- running
- files
- env_owned
properties:
dir:
type: string
description: Backup folder; empty = backups off
hour:
type: integer
minimum: 0
maximum: 23
description: Server local hour
keep:
type: integer
minimum: 1
maximum: 365
running:
type: boolean
last:
type: object
nullable: true
description: 'This process''s last run: {at, ok, file?, size?, ms?, removed?, error?}'
files:
type: array
description: AgentHub's own `agenthub-YYYYMMDD-HHMMSS.db` files, newest first
items:
type: object
properties:
name:
type: string
size:
type: integer
mtime:
type: string
format: date-time
dir_error:
type: string
nullable: true
env_owned:
type: object
properties:
dir:
type: boolean
hour:
type: boolean
keep:
type: boolean
put:
tags:
- Settings
summary: Set the backup folder, hour and number kept
description: Any subset of the three fields, persisted to the settings file as AGENTHUB_BACKUP_DIR / AGENTHUB_BACKUP_HOUR / AGENTHUB_BACKUP_KEEP. An empty `dir` turns backups off. Same-origin only.
operationId: setBackup
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
dir:
type: string
hour:
type: integer
minimum: 0
maximum: 23
keep:
type: integer
minimum: 1
maximum: 365
responses:
'200':
description: The new state
content:
application/json:
schema:
type: object
required:
- dir
- hour
- keep
- running
- files
- env_owned
properties:
dir:
type: string
description: Backup folder; empty = backups off
hour:
type: integer
minimum: 0
maximum: 23
description: Server local hour
keep:
type: integer
minimum: 1
maximum: 365
running:
type: boolean
last:
type: object
nullable: true
description: 'This process''s last run: {at, ok, file?, size?, ms?, removed?, error?}'
files:
type: array
description: AgentHub's own `agenthub-YYYYMMDD-HHMMSS.db` files, newest first
items:
type: object
properties:
name:
type: string
size:
type: integer
mtime:
type: string
format: date-time
dir_error:
type: string
nullable: true
env_owned:
type: object
properties:
dir:
type: boolean
hour:
type: boolean
keep:
type: boolean
'400':
description: 'INVALID_PATH: the folder is relative, missing, not a directory or not writable; INVALID_INPUT: hour/keep out of range'
'403':
description: 'EBADORIGIN: another site asked'
'409':
description: 'EENVOWNED: the environment set that field'
'500':
description: 'ESAVE: the settings file could not be written'
/api/settings/backup/run:
post:
tags:
- Settings
summary: Back up the database now
description: Starts a backup and answers at once; poll GET /api/settings/backup while `running`. Same-origin only.
operationId: runBackup
responses:
'202':
description: Started (or already running); the backup state
'400':
description: 'ENOBACKUPDIR: no backup folder is set'
'403':
description: 'EBADORIGIN: another site asked'
/api/settings/codex-hooks:
get:
tags:
@@ -13514,7 +13681,7 @@ paths:
tags:
- Auth
operationId: listServerUsers
summary: Every account with its workspaces, sessions and 7/30-day usage (admin/analyst; 403 EADMIN for a member)
summary: Every account with its workspaces, sessions and 7/30-day usage (admin/analyst; 403 EADMIN for a developer)
responses:
'200':
description: Accounts
@@ -13549,7 +13716,7 @@ paths:
tokens:
type: integer
'403':
description: EADMIN — a member
description: EADMIN — a developer
content:
application/json:
schema:
@@ -13580,8 +13747,8 @@ paths:
enum:
- admin
- analyst
- member
default: member
- developer
default: developer
currentPassword:
type: string
responses:
@@ -13644,7 +13811,7 @@ paths:
enum:
- admin
- analyst
- member
- developer
disabled:
type: boolean
currentPassword:
@@ -13827,7 +13994,7 @@ paths:
tags:
- Auth
operationId: listAuditLog
summary: Admin/analyst reads of sessions members own, newest first
summary: Admin/analyst reads of sessions developers own, newest first
parameters:
- name: limit
in: query
@@ -13865,7 +14032,7 @@ paths:
type: string
nullable: true
'403':
description: EADMIN — a member
description: EADMIN — a developer
content:
application/json:
schema: