feat: add interactive VT and workspace command plane
CI / rust (push) Successful in 3m48s

This commit is contained in:
2026-08-31 17:05:49 -07:00
parent 32d190c6c6
commit b838d000db
54 changed files with 3004 additions and 113 deletions
@@ -16,9 +16,10 @@ arrives. Process-local session IDs are correlation IDs only; durable IDs are
assigned by the persisted runtime protocol later.
Runtime events contain ordered raw PTY bytes. The UI spike may line-frame plain
fixture output for display, but ANSI/VT parsing, screen state, cursor behavior,
scrollback, and terminal input modes belong to `lumbridge-terminal`. The UI must
not infer terminal semantics from raw strings.
fixture output for deterministic surfaces, but the live pane sends bytes through
`lumbridge-terminal`. ANSI/VT parsing, screen state, cursor behavior, scrollback,
and terminal input modes never belong to the runtime actor or UI. The UI must not
infer terminal semantics from raw strings.
Dropping the UI-side actor disconnects its bounded channels, releases an actor
blocked by event backpressure, terminates the process group through
@@ -0,0 +1,24 @@
# 0005: Terminal semantics stay behind a Lumbridge-owned contract
Status: accepted for the first terminal slice.
Lumbridge uses `alacritty_terminal` with default features disabled as its first
VT state engine. The dependency is mature enough to cover substantially more
terminal behavior than a new parser, but its types do not cross into runtime,
storage, IPC, or UI APIs.
`lumbridge-terminal` accepts ordered raw PTY bytes and exposes immutable
Lumbridge snapshots containing cells, styles, colors, cursor, terminal modes,
and sanitized title state. It owns terminal key and paste encoding. Protocol
replies such as device-status responses return as bytes and enter the same
bounded actor queue as all other PTY input, preserving ordering.
Clipboard writes such as OSC 52 are disabled by default. Transcript-bearing
snapshots deliberately omit `Debug`, and terminal titles are bounded and stripped
of controls. A renderer may derive plain rows for a spike, but that is not the
terminal model and must not become the persistence or automation contract.
Adopting this engine is reversible: conformance fixtures target the Lumbridge
contract, and no upstream application code is copied into this repository.
Kitty keyboard/graphics behavior, OSC 8 links, mouse modes, IME, selection, and
platform rendering remain explicit qualification work.
@@ -0,0 +1,20 @@
# 0006: Every workspace controller uses one typed command plane
Status: accepted for implementation.
Human UI, CLI automation, remote clients, and agents submit the same typed
workspace commands. Stable request IDs make retries idempotent. Pane IDs, split
ratios, surfaces, launch intents, and close dispositions are validated before
state changes, and a multi-command setup plan is applied atomically. Reusing an
ID with a different origin or command is a conflict, not a silent duplicate.
Each request has an origin and an explicit Observe, Configure, or Execute grant.
The command declares the minimum capability it needs. Creating or terminating a
process requires Execute; layout-only changes require Configure. Launch intents
refer to a user shell or an approved harness profile and working directory, not
arbitrary executable arguments or secret values.
This reducer is not an authorization bypass. The future IPC layer authenticates
the caller and supplies its granted capability; the reducer rechecks it before
mutation. Durable audit events record request and object identities, never
terminal input, transcript content, provider keys, or pane titles by default.
@@ -0,0 +1,27 @@
# 0007: Lumbridge Harness is optional, separate, and capability-scoped
Status: accepted for architecture; implementation and fork policy pending.
Lumbridge may distribute a separately versioned Lumbridge Harness for prompt
refinement, trace analysis, recommendations, and agent coordination. The native
Rust terminal workspace remains complete without it, and the Harness does not
run inside the UI process.
The captured DeepSeek Harness is an MIT-licensed and architecturally useful
reference, but it is also an unaudited Node/TypeScript developer preview with a
web client and broad native dependency closure. A maintained fork, if selected,
lives in its own repository/process, preserves required notices, and exposes a
small versioned protocol. Its React UI is not embedded in Lumbridge. We can later
replace the implementation with a first-party Rust service without changing the
desktop contract.
Model access is provider-neutral and begins with OpenAI-compatible endpoints so
development can use a self-hosted Spark/Qwen model or a user-selected service
such as Cerebras. Endpoint credentials are opaque secret-store handles.
Trace analysis is opt-in per workspace. The user chooses the trace projection
and destination; local processing stays local, while hosted processing requires
an explicit preview and consent. Suggestions and decision-shelf choices carry no
authority. Any setup, launch, mutation, or autopilot action becomes a typed
workspace plan and can use only the Observe, Configure, or Execute capability
granted to that run.