Repository navigation
v0.107.0
Added
- HQ native core.
8sync hq uinow also serves a loopback JSON core (random port + token, handed to the web server asHQ_CORE/HQ_CORE_TOKEN, never passed on to rooms): theclaude agentslisting behind a fingerprint cache (re-run only when a session/job file changes or a room's pid dies, ≤ 30 s),8sync ls --allrows from warm transcript digests (only appended lines are read), boards and the awake probe in process, a 5 s machine sampler (GetSystemTimes, GlobalMemoryStatusEx, Toolhelp working sets, NVML, PDH RAPL energy; Linux /proc + powercap) instead oftasklist/nvidia-smi/typeperfper request, the Hạn mức transcript scan, and the project size walk. Without the core (anext devserver) every route keeps its own probe. One client, 60 s: HQ node 5.5 → 4.0 s CPU, RSS 181 → 132 MB (plus ~1.3 s in the core), and noclaude agents/tasklist/8sync lsprocess per poll; office 349 → 87 ms, board 386 → 108 ms, machine 1405 → 546 ms. - HQ sidebar: Đóng phòng / Xóa phòng. Each room row has a "⋯" menu (always shown on phones, 44 px). Đóng phòng runs
claude stop(conversation kept, "Mở team" resumes it; tmux kill for hq-* rooms); Xóa phòng looks up the registry entry bound to that session first, then runsclaude stop,claude rm(drops its own worktree unless it holds unpushed commits) and8sync ccc . rm <name>from the folder whose registry holds it, which deletes the transcript, and the confirm says so. An entry it cannot remove (none found, its folder went with the worktree,rmfailed) comes back as a warning toast, not a success. Both confirm with the room's state (waiting on the owner, working, stuck).POST /api/sessions/[name]/end {action}; omp rooms and terminals the owner opened are refused. - HQ sidebar: Đóng dự án. The project "⋯" hides a project (HQ state,
hidden_projects, carried on/api/office); it comes back by itself when a room waits on the owner, is stuck, or does anything after the close. "Hiện dự án đã đóng (N)" lists them with "Hiện lại", and the toast has an undo. - HQ sidebar: Xóa worktree. For a project folder that is a git worktree (like
card-113-devunder.claude/worktrees): the confirm reads git first and refuses with the reasons when a room still runs inside, it is locked, another worktree sits inside, files are uncommitted, or commits are not merged into the main branch or not pushed; never the main repo. Thengit worktree remove <path>from the main worktree, never--force; the branch stays. "Đóng N phòng" in the dialog clears the live-room guard. Roots come from HQ's own project list, never from the request (GET|POST /api/projects/worktree). - OmniRoute on the VPS at
https://vps.8syncdev.com/router-ai, no port in any URL (scripts/vps/omniroute/,.github/workflows/omniroute-image.yml). Owner (2026-10-19): "cài OmniRoute lên ovh vps có trang /router-ai … auto update … auto clean rác", then "url web ovh không được lộ port".- Image. The workflow builds each upstream release with
OMNIROUTE_BASE_PATH=/router-ai, using upstream's own publish settings (webpack, 12 GB build heap). It pushesghcr.io/8-sync-dev/omniroute-router-ai:<tag>and:latest, daily at 01:00 VN. - Why a custom build. Next.js fixes basePath at build time. The upstream images' start-up patch (v3.8.51) leaves client-side links and lazy chunks at the root, so the dashboard broke under a subpath. Serving the dashboard on its own port was rejected by the owner, and DNS for a subdomain was blocked by Vercel's fair-use limit.
install.sh. Runs from the PC with Git Bash: it copies the files, runssetup.shon the VPS, then runs live checks. These cover the gate on the dashboard, a 401 on the API without a key, the HQ link unchanged, and port 8444 closed.setup.sh. Idempotent:- generates the secrets once (
.env, 600); - starts the container: 2 GB memory, 1 GB heap, no host port;
- adds
import /sites/*.routesto the main site once and installsrouter-ai.routes, where/router-ai/v1/*is open (OmniRoute API keys are the lock) and the dashboard sits behind the same GitHub gate as HQ plus OmniRoute's own password; - validates Caddy with every real site file in a throwaway container, and restores the previous files if the reload fails;
- retires the first install's
:8444site from the edge compose, the oauth2-proxy allowlist and ufw.
- generates the secrets once (
omniroute-update.timer(daily 04:00 VN) pulls the compose image. It tags the running imageomniroute:rollbackbefore pulling, then recreates the container. It rolls back when creation fails or the container is not healthy within 3 minutes, and it records that image id and skips it afterwards. The compose tag always ends on an image that runs.vps-clean.timer(daily 04:40 VN) removes stopped containers older than 3 days, unused images and build cache older than 7 days, journald beyond 300 MB / 14 days, and the apt cache. It never touches volumes,/srv,/homeor the CI caches.- Combo for omp. OmniRoute combo
omp-manh(GLM-5.3-Flash → DeepSeek-V4-Flash → MiniMax-M2.7 → gpt-oss-20b, priority) is wired into omp asomniroute/omp-manh. All four steps share one LLM7 free key, so its daily token quota stops the whole combo. One omp turn with tools used it up in UAT (429 "Daily token quota exceeded"), so another provider is needed before agents can rely on it. - Referer rule. The
/router-aibuild still sendsfetch('/api/…')and<img src="/providers/…">without the basePath.router-ai.routesredirects page loads and rewrites fetches and images whose Referer is a/router-aipage, and leaves/sw.jsalone so the PWA worker never takes scope/over HQ. A fresh login lands on/router-ai/homewith 67 requests and none failing. - Shared lock. The update and cleanup scripts share
/run/lock/8sync-docker.lock. - Claude. Claude models resold by others (LLM7
claude-*) are hidden. omp's OmniRoute key is limited to the free LLM7 models and combos; any other model returns 403. - Owner guide:
Downloads/OmniRoute-huong-dan.pdf.
- Image. The workflow builds each upstream release with
Changed
- Lead merges stacked PRs in order. The lead's approved-card step (
BACKLOG_FIRST) never merges into a base other than main. Once the root PR is on main, it runsgh pr edit <pr> --base mainand merges; otherwise it merges the root first. UAT on ai-game-studio found 13 open PRs based on other branches, and PR 103 merged intocard-125-ui-paletteinstead of main. That repo also getsdelete_branch_on_merge, so GitHub retargets dependent PRs when a base merges. - omp team on any non-Claude model:
8sync ccc auto omp on --model <provider/model>(also--omp-modelonauto on --omp/auto up --omp) stores the team model in auto.json; the team is blocked only when that model (else omp's default) isanthropic/…, so anomniroute/<combo>team runs while the owner's omp default stays a Claude login. Rooms open with8sync . omp-<role> --model <m>(new--modelon8sync . <name>);auto status --jsonaddsomp_model. The omp extension sends its live model toauto nudge --model; a room onanthropic/…gets no nudge, and a nudge without--modelis still judged by omp's global default.- The whole session runs on that model. A session started with
--modelgets the same model for--smol,--slowand--plan, and no--advisor. Before this, the launch added 8sync's role flags (--plan opus --slow opus) and the advisor, which runs on omp'smodelRoles.advisor(anthropic/claude-opus-5-5:max). A room "on" OmniRoute would have sent part of its calls to the Claude login. Checked on the realompcommand line.
- The whole session runs on that model. A session started with
Install or update: curl -fsSL https://get.8syncdev.com/install | sh · 8sync up · then 8sync ccc kit
What's Changed
- v0.107.0: HQ native core, sidebar close/delete, omp team model, OmniRoute /router-ai by @8syncdev in #127
Full Changelog: v0.106.0...v0.107.0