Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
829c061
feat(tui): adopt Herdr-style agent plugin architecture
lawrencecchen Sep 21, 2026
4888fc5
perf(cloud): move VM guest setup into snapshot contract
lawrencecchen Sep 21, 2026
e186665
docs: preserve Herdr handoff for startup work
lawrencecchen Sep 21, 2026
3b2caeb
test(cloud): assert snapshot guest contract
lawrencecchen Sep 21, 2026
f77ad52
fix(cloud): race first terminal seed with prompt identity
lawrencecchen Sep 21, 2026
1e30ef6
chore(cloud): promote snapshot-v2 desktop ladder
lawrencecchen Sep 21, 2026
01dc721
perf(cloud): warm snapshot terminal and preserve session journal
lawrencecchen Sep 21, 2026
68513ca
test(cloud): verify warm prompt contract
lawrencecchen Sep 21, 2026
40e9d19
fix(cloud): derive seeded terminal from session snapshot
lawrencecchen Sep 21, 2026
ccc59d6
fix(cloud): tolerate empty warm session before seed
lawrencecchen Sep 21, 2026
47a0876
fix(cloud): verify warm terminal through terminal list
lawrencecchen Sep 21, 2026
cb1da52
chore(cloud): promote exact warm Herdr snapshot
lawrencecchen Sep 21, 2026
0770d44
fix(cloud): reuse terminal-list ids during prompt seed
lawrencecchen Sep 21, 2026
77bef31
fix(cloud): inspect terminal list for existing seed
lawrencecchen Sep 21, 2026
c89fadd
chore(cloud): promote prompt-seed-safe Herdr snapshot
lawrencecchen Sep 21, 2026
e7b1406
fix(cloud): persist terminal id after workspace creation
lawrencecchen Sep 21, 2026
8f32d31
chore(cloud): promote final warm Herdr snapshot
lawrencecchen Sep 21, 2026
33bcc13
Merge origin main into feat-herdr-plugin-architecture
lawrencecchen Sep 21, 2026
f02be06
Restore exact warm snapshot manifest after main merge
lawrencecchen Sep 21, 2026
4654a80
chore(cloud): keep snapshot source provenance exact
lawrencecchen Sep 21, 2026
c3be22a
chore(cloud): record exact cmux-tui pin in manifest
lawrencecchen Sep 21, 2026
79367d7
test(cloud): cover warm snapshot prompt contract
lawrencecchen Sep 21, 2026
dabb28b
chore(cloud): promote merged-source warm snapshot
lawrencecchen Sep 21, 2026
90ba7fe
test(cloud): align contracts with snapshot-v2 attach
lawrencecchen Sep 21, 2026
64865b7
fix(merge): retain current Workspace cloud mirror helpers
lawrencecchen Sep 21, 2026
03b34bb
fix(merge): preserve cloud terminal icon helpers
lawrencecchen Sep 21, 2026
a293b09
Merge remote-tracking branch 'origin/main' into feat-herdr-plugin-arc…
lawrencecchen Sep 21, 2026
2ae8617
fix(merge): restore device manual mirror helper
lawrencecchen Sep 21, 2026
2dc3086
fix(cloud): use current Stack SDK in startup benchmark
lawrencecchen Sep 22, 2026
40a3d60
feat(mac): add tag-scoped runtime config profiles
lawrencecchen Sep 22, 2026
5c646b2
Merge remote-tracking branch 'origin/main' into feat-herdr-plugin-arc…
lawrencecchen Sep 22, 2026
8ce2fbb
test(cloud): New Machine open must link a just-created VM
lawrencecchen Sep 22, 2026
912ddf5
fix(cloud): link a new machine before resolving its first terminal
lawrencecchen Sep 22, 2026
183de04
chore(cloud): delete dead Freestyle heal helpers and guard the no-wor…
lawrencecchen Sep 22, 2026
b263b11
docs(cloud): record the ensure_linked open requirement
lawrencecchen Sep 22, 2026
805cf78
perf(cloud): open a new machine from its create receipt
lawrencecchen Sep 22, 2026
65e3f8e
perf(cloud): redial a fresh machine and link it from the create receipt
lawrencecchen Sep 23, 2026
866ea3f
perf(cloud): take create usage events off the critical path; recover …
lawrencecchen Sep 23, 2026
bd2507c
perf(cloud): detect clones within 50 ms, announce first, and quiet re…
lawrencecchen Sep 23, 2026
853ec0c
docs(cloud): record New Machine latency floor and open decisions
lawrencecchen Sep 23, 2026
d0ad1a9
chore(cloud): raw Freestyle create-to-reachable benchmark
lawrencecchen Sep 23, 2026
91ed485
perf(cloud): never hold a provider refresh on stats or the port scan
lawrencecchen Sep 23, 2026
e1ccd5c
perf(cloud): start the clone's daemon before re-keying and prompt sync
lawrencecchen Sep 23, 2026
371ca12
chore(cloud): rebake every size with daemon-first clone boot (fastboot5)
lawrencecchen Sep 23, 2026
33b65ad
perf(cloud): first link to a new trusted machine skips the attach req…
lawrencecchen Sep 23, 2026
34e9072
chore(cloud): probe raw-create reachability every 50 ms
lawrencecchen Sep 23, 2026
cad10fb
docs(cloud): record v9 New Machine measurements and remaining blocks
lawrencecchen Sep 23, 2026
8291e52
fix(cloud): new machines show their name in the prompt in every envir…
lawrencecchen Sep 23, 2026
3e92ca5
chore(cloud): rebake every size with the prompt-name refresh (fastboot6)
lawrencecchen Sep 23, 2026
9a6f722
Merge remote-tracking branch 'origin/main' into feat-herdr-plugin-arc…
lawrencecchen Sep 23, 2026
379ea02
fix(cloud): keep attaching machines created before the snapshot-v2 ma…
lawrencecchen Sep 23, 2026
2b23eab
chore: drop root working notes from the branch
lawrencecchen Sep 23, 2026
897f8b7
test: drop the source-shape plugin artifact test
lawrencecchen Sep 23, 2026
0d2b850
fix(cloud): make the published port list a constant (warning budget)
lawrencecchen Sep 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .github/workflows/cmux-tui-build-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ on:
required: false
default: false
type: boolean
build_agent_plugin:
description: "Build and upload the Unix userland agent screen-detection plugin"
required: false
default: false
type: boolean

permissions: {}

Expand Down Expand Up @@ -279,7 +284,34 @@ jobs:
cargo build -p cmux-relay --bin cmux-relay --release --locked --target ${{ matrix.build_target }}
cargo build -p chatmux-relay --bin chatmux-relay --release --locked --target ${{ matrix.build_target }}

- name: Build agent screen-detection plugin
if: inputs.build_agent_plugin && runner.os != 'Windows'
env:
AGENT_PLUGIN_CROSS: ${{ matrix.cross }}
AGENT_PLUGIN_TARGET: ${{ matrix.build_target }}
RUNNER_OS: ${{ runner.os }}
working-directory: cmux-tui
shell: bash
run: |
set -euo pipefail
plugin_manifest="bindings/examples/rust-agent-screen-detection/Cargo.toml"
# The reference plugin is its own Cargo workspace. Use the common
# target directory so staging has one predictable path and the
# plugin can reuse SDK dependencies from the TUI build.
export CARGO_TARGET_DIR="$GITHUB_WORKSPACE/cmux-tui/target"
if [[ "$AGENT_PLUGIN_CROSS" == "true" && "$RUNNER_OS" == "Linux" ]]; then
cargo zigbuild \
--manifest-path "$plugin_manifest" \
--release --locked --target "$AGENT_PLUGIN_TARGET"
else
cargo build \
--manifest-path "$plugin_manifest" \
--release --locked --target "$AGENT_PLUGIN_TARGET"
fi

- name: Stage binary
env:
BUILD_AGENT_PLUGIN: ${{ inputs.build_agent_plugin }}
shell: bash
run: |
mkdir -p dist
Expand All @@ -290,6 +322,10 @@ jobs:
cp "cmux-tui/target/${{ matrix.target }}/release/cmux-tui-hook${{ matrix.ext }}" "$hook_binary"
cp "cmux-tui/target/${{ matrix.target }}/release/cmux-relay${{ matrix.ext }}" "$relay_binary"
cp "cmux-tui/target/${{ matrix.target }}/release/chatmux-relay${{ matrix.ext }}" "dist/chatmux-relay-${{ matrix.target }}${{ matrix.ext }}"
if [[ "$BUILD_AGENT_PLUGIN" == "true" && "${{ runner.os }}" != "Windows" ]]; then
cp "cmux-tui/target/${{ matrix.target }}/release/cmux-agent-screen-detection${{ matrix.ext }}" \
"dist/cmux-agent-screen-detection-${{ matrix.target }}${{ matrix.ext }}"
fi
if [[ -n "${{ matrix.compatibility_target }}" ]]; then
cp "$binary" "dist/cmux-tui-${{ matrix.compatibility_target }}${{ matrix.ext }}"
cp "$hook_binary" "dist/cmux-tui-hook-${{ matrix.compatibility_target }}${{ matrix.ext }}"
Expand Down Expand Up @@ -356,6 +392,14 @@ jobs:
path: dist/chatmux-relay-*${{ matrix.ext }}
if-no-files-found: error

- name: Upload agent screen-detection plugin artifact
if: inputs.build_agent_plugin && runner.os != 'Windows'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cmux-agent-screen-detection-${{ matrix.target }}
path: dist/cmux-agent-screen-detection-*${{ matrix.ext }}
if-no-files-found: error

build-windows:
name: build x86_64-pc-windows-gnu
if: inputs.include_windows
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/cmux-tui-sdks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,9 @@ jobs:
cargo +1.88.0 fmt --manifest-path cmux-tui/bindings/rust/Cargo.toml -- --check
cargo +1.88.0 test --manifest-path cmux-tui/bindings/rust/Cargo.toml --locked
cargo +1.88.0 test --manifest-path cmux-tui/bindings/rust-sidebar/Cargo.toml --locked
cargo +1.88.0 test \
--manifest-path cmux-tui/bindings/examples/rust-agent-screen-detection/Cargo.toml \
--locked
cargo +1.88.0 clippy \
--manifest-path cmux-tui/bindings/examples/rust-agent-dashboard/Cargo.toml \
--locked \
Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/cmux-tui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,19 @@ jobs:
- name: Test isolated TUI test-runner policy
run: python3 .github/scripts/test_run_cmux_tui_core_tests_isolated.py

- name: cargo fmt
id: rustfmt-check
working-directory: cmux-tui
run: cargo fmt --check

- name: userland agent plugin package tests
working-directory: cmux-tui
# The reference plugin is an independent Cargo workspace, so the
# daemon workspace test does not compile it. Keep this explicit check
# in both hosted OS lanes.
run: cargo test --manifest-path bindings/examples/rust-agent-screen-detection/Cargo.toml --locked


- name: focused Linux journal process-fence test
if: inputs.mode == 'focused' && runner.os == 'Linux'
working-directory: cmux-tui
Expand Down Expand Up @@ -819,6 +832,8 @@ jobs:
package_pypi: ${{ inputs.mode == 'full' }}
include_windows: ${{ inputs.mode == 'full' }}
target_set: ${{ inputs.mode == 'full' && 'all' || 'macos-arm64' }}
# Build the exact reference plugin beside the daemon artifact.
build_agent_plugin: true
verify_linux_arm64: ${{ inputs.mode == 'full' }}
macos_runner: blacksmith-6vcpu-macos-15
linux_runner: blacksmith-4vcpu-ubuntu-2404
Expand Down
5 changes: 5 additions & 0 deletions Assets.xcassets/AgentIcons/ATTRIBUTIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Agent icons

Cursor, Gemini, Kiro, GitHub Copilot, CodeBuddy, Qoder, Kimi and Ollama SVGs come from [Lobe Icons](https://github.com/lobehub/lobe-icons/tree/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons) under the MIT license in `LOBE-LICENSE.txt`. Original SVG paths are unchanged; currentColor is replaced with black and white for light and dark appearances.

Factory uses its [published site icon](https://factory.ai/icon.svg), retrieved on 2026-09-17. The redundant outer SVG wrapper is removed for asset-catalog compatibility.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions Assets.xcassets/AgentIcons/CodeBuddy.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images": [
{
"filename": "CodeBuddy.svg",
"idiom": "universal"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"preserves-vector-representation": true
}
}
25 changes: 25 additions & 0 deletions Assets.xcassets/AgentIcons/Copilot.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"images": [
{
"filename": "Copilot.svg",
"idiom": "universal"
},
{
"filename": "Copilot-dark.svg",
"idiom": "universal",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
]
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"preserves-vector-representation": true
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions Assets.xcassets/AgentIcons/Copilot.imageset/Copilot.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions Assets.xcassets/AgentIcons/Cursor.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"images": [
{
"filename": "Cursor.svg",
"idiom": "universal"
},
{
"filename": "Cursor-dark.svg",
"idiom": "universal",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
]
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"preserves-vector-representation": true
}
}
1 change: 1 addition & 0 deletions Assets.xcassets/AgentIcons/Cursor.imageset/Cursor-dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions Assets.xcassets/AgentIcons/Cursor.imageset/Cursor.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions Assets.xcassets/AgentIcons/Factory.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images": [
{
"filename": "Factory.svg",
"idiom": "universal"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"preserves-vector-representation": true
}
}
Loading
Loading