| prices: other makers' models at their own prices, and a gateway's spelling still finds one The list kept only Anthropic's and OpenAI's own entries from LiteLLM, so a session on a custom endpoint (DeepSeek, GLM, Gemini behind a gateway) had no price and no context window: both are read through the same lookup. - The generator keeps each maker's own API as well: gemini, deepseek, zai, moonshot, dashscope (Qwen only), xai and minimax. LiteLLM files some under the maker's prefix (zai/glm-5.3); clients log the bare name, so that is what is stored, and a bare entry wins over a prefixed one. A reseller's copy of a model is left out: its price is the reseller's. 91 models become 212. - A thinking depth spelled into the name (-thinking, -high, -xhigh, ...) is the same model at the same rate; -max, -pro, -mini stay other models. - A gateway's vendor prefix (openrouter/openai/gpt-5.5) and a display name (GPT 5.5) normalize to the id the list uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 18 天前 |
| terminal: a scrollbar no longer resizes the grid and flashes a client in a loop Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| peers: a paired machine's session opens in a tab here A session of another machine opened in that machine's own window, a new page signed in by a ticket. With full control it now opens on this canvas like one of ours, to drag and split, and comes back after a reload. The page asks /api/machines/:id/..., and this machine passes the call or socket on with the key that machine issued it, so the browser signs in to nothing there. The machine called takes it on /api/peer/proxy/, needs full control, and reaches only what a session's pane uses. What it lets through runs as the app's own route, marked in a way a request cannot carry. Nothing about a session is fetched until its tab is in front: the sidebar keeps its list only. api.ts sends a path to a paired machine only if its id is one a remote tab made known, so this machine's sessions go where they always went. With no canvas here, or a machine too old for this, its window still opens. Where a machine lets this one only see or start sessions, the sidebar now says what to change, and where. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| Update model prices | 3 小时前 |
| peers: a paired machine's session opens in a tab here A session of another machine opened in that machine's own window, a new page signed in by a ticket. With full control it now opens on this canvas like one of ours, to drag and split, and comes back after a reload. The page asks /api/machines/:id/..., and this machine passes the call or socket on with the key that machine issued it, so the browser signs in to nothing there. The machine called takes it on /api/peer/proxy/, needs full control, and reaches only what a session's pane uses. What it lets through runs as the app's own route, marked in a way a request cannot carry. Nothing about a session is fetched until its tab is in front: the sidebar keeps its list only. api.ts sends a path to a paired machine only if its id is one a remote tab made known, so this machine's sessions go where they always went. With no canvas here, or a machine too old for this, its window still opens. Where a machine lets this one only see or start sessions, the sidebar now says what to change, and where. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| worktrees: an isolated task gets a worktree of its own, prepared, and a way back A session moved onto a branch by hand could land in the workspace directory or beside another session, and nothing prepared the worktree or brought the work back. An isolated task is the one way to a directory nobody else uses: - Tendly names a new branch (tendly/<title>), makes a new worktree from a base branch, and refuses any branch already checked out anywhere. The base is recorded on the session (migration 0023). - A workspace's worktree setup, set only by the person, copies paths from the workspace directory (as APFS/reflink clones) and runs a command in the new worktree. Progress is a setup event in the conversation; a start waits. - The branch chip opens Review and finish: everything since the merge base, then merge (checked with merge-tree first, optionally squashed), push for a pull request, or discard. Finishing removes the worktree and branch and archives the session; a refused merge leaves the base as it was. - tendly_spawn takes isolated/branch the same way, from the caller's branch; tendly_status reports the branch and who shares the directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 14 天前 |
| npm: require Node 24, as the README does The bridges run under the system node and pass --use-env-proxy when an account has a proxy, which Node 20 rejects as an unknown flag. Co-Authored-By: Claude <noreply@anthropic.com> | 8 天前 |
| chat: a subagent resumed by SendMessage no longer stays running in the dock A resumed subagent's output names the card it first ran under, while its start and end come under the SendMessage card. Each line marked the first card running again and nothing ended it, so finished subagents sat in the dock with "no progress for 120 min". Output of a resumed task now goes to the card it runs under, and a card whose task has ended is never reopened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 天前 |
| Terminal: try wterm, whose rows the browser scrolls by the pixel xterm.js paints a canvas and can only move it a whole row at a time, so reading back through a long answer never scrolls smoothly however fast it draws. wterm lays the rows out as page text in an element the browser scrolls itself: by the pixel, on the compositor, with the platform's own momentum on a phone. It is opt-in for now: ?terminal=wterm switches this browser over and ?terminal=xterm back. Ghostty's emulator loads only then. Keys, paste, uploads, tap-to-select, reconnects and the way back to the latest output work as before. Steady streaming output, the way an agent writes, dropped frames on a 4x-throttled CPU (p95 33-66 ms) because wterm made a new Range for every partial row update. A Range stays attached to its document until garbage collected and every DOM mutation updates all attached Ranges, so in a page as large as this one, which collects rarely, thousands pile up and each update costs ten times more. A patch has the renderer reuse one Range, which keeps it at 60 fps. A burst of small frames is also written once per frame, and Ghostty's log of ignored sequences is kept out of the console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 22 天前 |
| readme: one column that reads on a phone, each thing said once The header is the mark and name at 300px over one line, not a 2560px banner whose words shrink to nothing on a phone. Below it: a screenshot, three short paragraphs, contents, then one section per part (install, the canvas, accounts and endpoints, other devices, how it works), each a sentence or two, a screenshot that opens full size, a short table and a link into docs/. The two-column feature grid, the highlight list and the FAQ said the same things again; they are gone. Paragraphs are one line each, so GitHub puts no spaces between Chinese characters. scripts/render-banner.mjs also renders docs/assets/wordmark-{light,dark}.png from wordmark.html. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 13 天前 |
| peers: a paired machine's session opens in a tab here A session of another machine opened in that machine's own window, a new page signed in by a ticket. With full control it now opens on this canvas like one of ours, to drag and split, and comes back after a reload. The page asks /api/machines/:id/..., and this machine passes the call or socket on with the key that machine issued it, so the browser signs in to nothing there. The machine called takes it on /api/peer/proxy/, needs full control, and reaches only what a session's pane uses. What it lets through runs as the app's own route, marked in a way a request cannot carry. Nothing about a session is fetched until its tab is in front: the sidebar keeps its list only. api.ts sends a path to a paired machine only if its id is one a remote tab made known, so this machine's sessions go where they always went. With no canvas here, or a machine too old for this, its window still opens. Where a machine lets this one only see or start sessions, the sidebar now says what to change, and where. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| Remove debugging screenshots committed by mistake Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 23 天前 |
| Initial commit: AgentDock A remote multi-agent development workspace that drives the official Claude Code and Codex CLIs rather than reimplementing them. - Rust backend (Axum, Tokio, SQLite/WAL) for sessions, workspaces, endpoint profiles and official-account management - Vue 3 + TypeScript frontend with a recursive split/stack layout engine - Node bridges that speak each client's own protocol: Claude Code's control protocol and Codex's app-server JSON-RPC Credentials stay owned by the native clients; the local state directory (.agentdock) is deliberately untracked. | 1 个月前 |
| Initial commit: AgentDock A remote multi-agent development workspace that drives the official Claude Code and Codex CLIs rather than reimplementing them. - Rust backend (Axum, Tokio, SQLite/WAL) for sessions, workspaces, endpoint profiles and official-account management - Vue 3 + TypeScript frontend with a recursive split/stack layout engine - Node bridges that speak each client's own protocol: Claude Code's control protocol and Codex's app-server JSON-RPC Credentials stay owned by the native clients; the local state directory (.agentdock) is deliberately untracked. | 1 个月前 |
| Release 0.1.113 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| Release 0.1.113 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 6 天前 |
| Publish the server to npm as one binary per platform The only documented way in was a Rust toolchain and a source build, which is a steeper ask than the thing it installs: AgentDock drives Claude Code and Codex, both installed from npm, and its own history and conversation bridges run as Node subprocesses. Node is already present, so npm costs a user nothing new. A tag now also publishes four platform packages holding a binary and one package holding only a shim, which npm resolves through os/cpu so a machine downloads just the executable it can run. No postinstall, so --ignore-scripts installs still work. The shim and the build script keep separate lists of platforms and are linked by nothing at runtime, so a target added to one alone would publish a release that cannot resolve on exactly that platform and nowhere else; a test compares the two sets. Publishing is ordered with the platform packages first and skips versions already on the registry, so a publish interrupted halfway can be re-run rather than leaving a shim whose dependencies do not exist. Also adds the MIT license file the manifest has claimed all along, now that the text ships to a registry. | 1 个月前 |
| docs: describe the code as it is now Architecture: Vue, the chat adapter layers (Node bridge by default, Rust in-process by setting), the real tables, no container runtimes, PaneKind. PLAN: the actual stack and directory layout, pnpm. The API port is 28789, and views do reconnect on their own with backoff. Terminal rendering (wterm default, xterm fallback, find) is documented, and the terminal libraries are listed among the third-party notices. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 22 天前 |
| service: tendly service install starts Tendly with the computer Each system's own per-user mechanism, so no administrator is needed: a systemd user unit on Linux (with lingering, so it starts at boot), a launchd agent on macOS, and a Run entry doing tendly start at sign-in on Windows. Linux and macOS run serve under the manager, which restarts it after a crash or an update's exit 75; start, stop and restart then go through the manager. The service carries this binary, the state directory, the given --lan/--tailscale and the installing shell's PATH, which a service manager would not find claude, codex or node on. A unit or agent at that path that this did not write is left alone unless --force is given: a hand-written one may load settings of its own. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 11 天前 |
| service: tendly service install starts Tendly with the computer Each system's own per-user mechanism, so no administrator is needed: a systemd user unit on Linux (with lingering, so it starts at boot), a launchd agent on macOS, and a Run entry doing tendly start at sign-in on Windows. Linux and macOS run serve under the manager, which restarts it after a crash or an update's exit 75; start, stop and restart then go through the manager. The service carries this binary, the state directory, the given --lan/--tailscale and the installing shell's PATH, which a service manager would not find claude, codex or node on. A unit or agent at that path that this did not write is left alone unless --force is given: a hand-written one may load settings of its own. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 11 天前 |
| tests: a browser suite over the whole app pnpm test:e2e builds the page and server, then drives them in a headless Chrome: each file starts its own gateway (state directory, port and home of its own) with the synthetic Claude Code, Codex and Pi clients from packages/native-bridge/fixtures, so no account, model or network is used, and a gateway running on the machine is left alone. 118 tests cover conversations with every client and handoffs between them, sessions and the sidebar, the canvas and its keys, terminals, files and Git, settings, sign-in and the phone layout. Each bug fixed in the previous commit has its own test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 15 天前 |
| tests: a browser suite over the whole app pnpm test:e2e builds the page and server, then drives them in a headless Chrome: each file starts its own gateway (state directory, port and home of its own) with the synthetic Claude Code, Codex and Pi clients from packages/native-bridge/fixtures, so no account, model or network is used, and a gateway running on the machine is left alone. 118 tests cover conversations with every client and handoffs between them, sessions and the sidebar, the canvas and its keys, terminals, files and Git, settings, sign-in and the phone layout. Each bug fixed in the previous commit has its own test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 15 天前 |
| Terminal: try wterm, whose rows the browser scrolls by the pixel xterm.js paints a canvas and can only move it a whole row at a time, so reading back through a long answer never scrolls smoothly however fast it draws. wterm lays the rows out as page text in an element the browser scrolls itself: by the pixel, on the compositor, with the platform's own momentum on a phone. It is opt-in for now: ?terminal=wterm switches this browser over and ?terminal=xterm back. Ghostty's emulator loads only then. Keys, paste, uploads, tap-to-select, reconnects and the way back to the latest output work as before. Steady streaming output, the way an agent writes, dropped frames on a 4x-throttled CPU (p95 33-66 ms) because wterm made a new Range for every partial row update. A Range stays attached to its document until garbage collected and every DOM mutation updates all attached Ranges, so in a page as large as this one, which collects rarely, thousands pile up and each update costs ten times more. A patch has the renderer reuse one Range, which keeps it at 60 fps. A burst of small frames is also written once per frame, and Ghostty's log of ignored sequences is kept out of the console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 22 天前 |
| Initial commit: AgentDock A remote multi-agent development workspace that drives the official Claude Code and Codex CLIs rather than reimplementing them. - Rust backend (Axum, Tokio, SQLite/WAL) for sessions, workspaces, endpoint profiles and official-account management - Vue 3 + TypeScript frontend with a recursive split/stack layout engine - Node bridges that speak each client's own protocol: Claude Code's control protocol and Codex's app-server JSON-RPC Credentials stay owned by the native clients; the local state directory (.agentdock) is deliberately untracked. | 1 个月前 |