Skip to content

feat(desktop): add PFTerminal as a tier-2 preset harness - #4956

Draft
0xzoz wants to merge 1 commit into
block:mainfrom
0xzoz:feat/pfterminal-preset
Draft

feat(desktop): add PFTerminal as a tier-2 preset harness#4956
0xzoz wants to merge 1 commit into
block:mainfrom
0xzoz:feat/pfterminal-preset

Conversation

@0xzoz

@0xzoz 0xzoz commented Aug 5, 2026

Copy link
Copy Markdown

Summary

Adds PFTerminal as a tier-2 preset harness — an open-source, multi-provider coding terminal built on the Codex CLI.

PFTerminal exposes the Codex app-server protocol rather than ACP, so it cannot be registered as a harness directly. It reaches Buzz through pfterminal-acp, a launcher that ships with PFTerminal and points the maintained codex-acp bridge at the PFTerminal binary via CODEX_PATH:

Buzz --ACP/stdio--> pfterminal-acp --CODEX_PATH--> codex-acp --app-server--> PFTerminal

That indirection is why underlying_cli: Some("pfterminal") is set — the CLI and the adapter install separately, so a user who has PFTerminal but not the bridge gets AdapterMissing rather than NotInstalled. This follows the existing amp / amp-acp precedent.

A distinct pfterminal-acp command is used rather than registering codex-acp with CODEX_PATH set in env, because Buzz's built-in Codex runtime is already defined around codex-acp; sharing that executable between two runtimes risks incorrect runtime identity and merged usage attribution.

Also adds the harnessCatalogCopy.ts entry, since every other preset carries one and its absence would leave PFTerminal as the only description-less runtime in the gallery. The description is a single vendor-sourced category sentence with provenance cited inline, per that file's stated content policy.

Blocked on an upstream release. pfterminal-acp is implemented and under review upstream in agtico/PfTerminal#78, but is not yet in a published PFTerminal release. Opening as a draft so the approach can be reviewed; I'll mark it ready once that lands and ships, so the preset never points at a command users cannot install. Happy to close and re-open later if you'd rather not carry a draft.

Related issue

#4958 — opened per CONTRIBUTING so a maintainer can acknowledge the approach before this is reviewed. The open question there is whether you want PFTerminal in the preset catalog at all; happy to close both if not.

No duplicates — searched open and closed issues and PRs for pfterminal, PfTerminal, and codex-acp preset.

Testing

The transport chain was exercised end-to-end against a real PFTerminal install (0.1.20) with codex-acp 1.1.9, driving the compiled pfterminal-acp binary over stdio:

ACP step Result
initialize OK — protocolVersion: 1, authMethods [api-key, chat-gpt]
session/new OK — session created in a real workspace
model catalogue 80 models enumerated
session/prompt streamed text back, stopReason: end_turn
state isolation PFTerminal used its own ~/.pfterminal; stock Codex's ~/.codex untouched
adapter missing exits 127, diagnostic on stderr, stdout left clean so the ACP stream cannot be corrupted

Repo checks on this change:

  • rustfmt --check on presets.rs — clean
  • pnpm exec tsc --noEmit — clean
  • pnpm exec biome check on both changed .ts/.tsx files — clean
  • pfterminal.svg — validated as well-formed XML and rasterised at 32px (the h-8 w-8 gallery size) and 128px to confirm the glyph stays legible

I could not run cargo check on desktop/src-tauri in my environment — the Linux Tauri system libraries (glib-2.0 et al.) are not installed on that machine — so the Rust change is syntax- and format-verified rather than type-checked locally. It is a PresetHarness struct literal identical in shape to the ten existing entries, and CI will type-check it.

UI change: the runtime gallery gains one entry. The bundled mark is the square Post Fiat glyph extracted from PFTerminal's wordmark; the full lockup is 720×220 and would letterbox to nothing in a 32px square. It carries its own dark plate, so unlike omp and grok it needs no per-id background class in RuntimeIcon. Provenance, upstream commit, license (Apache-2.0), and the exact modifications are recorded in CREDITS.md.

PFTerminal is an open-source, multi-provider coding terminal built on the
Codex CLI. It exposes the Codex app-server protocol rather than ACP, so it
reaches Buzz through `pfterminal-acp` — a launcher that ships with
PFTerminal and points the codex-acp bridge at the PFTerminal binary.

That indirection is why `underlying_cli` is set to "pfterminal": the CLI and
the adapter install separately, so a user who has PFTerminal but not the
bridge should see AdapterMissing rather than NotInstalled.

Includes the catalog copy entry, since every other preset carries one and
its absence would render PFTerminal as the only description-less runtime in
the gallery.

The logo is the square Post Fiat glyph extracted from PFTerminal's wordmark;
provenance and the exact modifications are recorded in CREDITS.md. It brings
its own dark plate, so it needs no per-id background class in RuntimeIcon.

Signed-off-by: 0xzoz <zeroexzoz@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant