Scaffold Lumbridge architecture and research plan
This commit is contained in:
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/target/
|
||||||
|
/.idea/
|
||||||
|
/.zed/
|
||||||
|
/.vscode/
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# Upstream research checkouts live beside this repository, never inside it.
|
||||||
|
/Research/
|
||||||
|
/research-checkouts/
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
These rules apply to the entire Lumbridge repository.
|
||||||
|
|
||||||
|
## Product boundary
|
||||||
|
|
||||||
|
Lumbridge is a terminal/workspace runtime and ACP client. It may host, supervise,
|
||||||
|
and observe coding harnesses, but must not silently impersonate them, scrape their
|
||||||
|
private credentials, or claim provider quota data that cannot be verified.
|
||||||
|
|
||||||
|
## Research boundary
|
||||||
|
|
||||||
|
Upstream repositories are cloned outside this Git repository under the desktop
|
||||||
|
workspace's `Research/` directory. They are references, not vendored code.
|
||||||
|
|
||||||
|
- Do not copy upstream implementation code without an explicit license review.
|
||||||
|
- Record the source repository and relevant license for any adapted design.
|
||||||
|
- AGPL/GPL and unlicensed repositories may be studied for behavior and UX only
|
||||||
|
unless the project deliberately changes its licensing strategy.
|
||||||
|
|
||||||
|
## Engineering rules
|
||||||
|
|
||||||
|
- Keep provider, harness, protocol, terminal, persistence, and UI boundaries
|
||||||
|
separate. A provider is not a harness and ACP is not a provider API.
|
||||||
|
- Preserve a PTY fallback. ACP adds structure but must not be required to open a
|
||||||
|
normal shell or run an arbitrary CLI.
|
||||||
|
- Keep secrets out of SQLite, logs, crash reports, command-line arguments, and
|
||||||
|
repository files. Store only opaque secret references in application state.
|
||||||
|
- Usage values must include a provenance and confidence classification.
|
||||||
|
- Avoid platform behavior hidden behind scattered `cfg` blocks; isolate it in
|
||||||
|
platform adapters with shared contract tests.
|
||||||
|
- No telemetry is enabled by default. Any future telemetry must be documented,
|
||||||
|
opt-in, redacted, and independently disableable.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
Before committing Rust changes, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all --check
|
||||||
|
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||||
|
cargo test --workspace --all-features
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Lumbridge is early. Architecture changes should begin as a short document in
|
||||||
|
`docs/decisions/` and include the rejected alternatives, portability impact,
|
||||||
|
security impact, and a way to reverse the decision.
|
||||||
|
|
||||||
|
Please keep changes small, add tests for behavior, and do not commit generated
|
||||||
|
artifacts, API keys, subscription tokens, transcripts, or upstream research
|
||||||
|
checkouts.
|
||||||
|
|
||||||
|
By contributing, you agree that your contribution is licensed under Apache-2.0.
|
||||||
|
|
||||||
Generated
+14
@@ -0,0 +1,14 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lumbridge"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"lumbridge-core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lumbridge-core"
|
||||||
|
version = "0.0.1"
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
[workspace]
|
||||||
|
members = ["apps/lumbridge", "crates/lumbridge-core"]
|
||||||
|
resolver = "2"
|
||||||
|
|
||||||
|
[workspace.package]
|
||||||
|
version = "0.0.1"
|
||||||
|
edition = "2024"
|
||||||
|
rust-version = "1.85"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
repository = "https://git.karti.ai/lumbridge-public/lumbridge-code"
|
||||||
|
|
||||||
|
[workspace.lints.rust]
|
||||||
|
unsafe_code = "forbid"
|
||||||
|
|
||||||
|
[workspace.lints.clippy]
|
||||||
|
all = "warn"
|
||||||
|
pedantic = "warn"
|
||||||
|
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright 2026 Lumbridge
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Lumbridge
|
||||||
|
|
||||||
|
Lumbridge is a fast, local-first workspace and terminal multiplexer for agentic
|
||||||
|
engineers. It will run coding harnesses side by side, preserve their sessions,
|
||||||
|
connect rich agents through ACP, and show trustworthy account and usage context
|
||||||
|
without forcing users into one model vendor.
|
||||||
|
|
||||||
|
The first supported desktop platforms are:
|
||||||
|
|
||||||
|
- macOS (Apple Silicon first, Intel when CI capacity is available)
|
||||||
|
- Ubuntu Linux
|
||||||
|
- Omarchy and compatible Arch Linux systems
|
||||||
|
|
||||||
|
Lumbridge is free and open source under Apache-2.0. Releases will be published
|
||||||
|
as installable binaries; building from source will remain supported.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
This repository is in architecture and product-definition phase. The current
|
||||||
|
binary is deliberately only a scaffold. We are validating the terminal engine,
|
||||||
|
UI stack, process/session model, ACP integration, packaging, and usage-data
|
||||||
|
contracts before committing to a large implementation.
|
||||||
|
|
||||||
|
## Product shape
|
||||||
|
|
||||||
|
- A native desktop shell with tabs, panes, workspaces, worktrees, diffs, and an
|
||||||
|
agent-aware footer.
|
||||||
|
- A Rust session runtime that survives UI restarts and can later run headless.
|
||||||
|
- ACP-native integrations where available, with supervised PTYs as the universal
|
||||||
|
fallback for any CLI harness.
|
||||||
|
- First-class harnesses for Claude Code, Codex, DeepSeek Harness, Pi, Hermes,
|
||||||
|
OpenClaw, Goose, Gemini CLI, and OpenCode.
|
||||||
|
- Subscription login owned by the upstream harness, plus separate BYOK provider
|
||||||
|
profiles for OpenAI, Anthropic, Gemini, Groq, Cerebras, DeepSeek, and more.
|
||||||
|
- Usage history, burn rate, reset windows, and forecasts with visible data
|
||||||
|
provenance instead of invented precision.
|
||||||
|
|
||||||
|
Start with [the product spec](docs/PRODUCT_SPEC.md),
|
||||||
|
[architecture](docs/ARCHITECTURE.md), and [research map](docs/RESEARCH.md).
|
||||||
|
|
||||||
|
## Scaffold
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo test --workspace
|
||||||
|
cargo run -p lumbridge
|
||||||
|
```
|
||||||
|
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
# Security
|
||||||
|
|
||||||
|
Lumbridge will launch shells and coding agents with the user's authority. That
|
||||||
|
makes process isolation, approval visibility, secret handling, and transcript
|
||||||
|
redaction core product behavior rather than optional hardening.
|
||||||
|
|
||||||
|
Do not report vulnerabilities in a public issue while the disclosure channel is
|
||||||
|
being established. For now, contact the repository owners privately through the
|
||||||
|
Lumbridge organization on git.karti.ai.
|
||||||
|
|
||||||
|
Never include real credentials, private prompts, source code, or terminal output
|
||||||
|
in a vulnerability report without first agreeing on a secure transfer method.
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "lumbridge"
|
||||||
|
description = "Local-first workspace and terminal multiplexer for agentic engineers"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
lumbridge-core = { path = "../../crates/lumbridge-core" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
use lumbridge_core::{Platform, ProductStatus};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let status = ProductStatus::architecture_phase(Platform::current());
|
||||||
|
println!(
|
||||||
|
"Lumbridge {} ({})",
|
||||||
|
env!("CARGO_PKG_VERSION"),
|
||||||
|
status.platform
|
||||||
|
);
|
||||||
|
println!("{}", status.message);
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "lumbridge-core"
|
||||||
|
description = "Domain contracts for Lumbridge"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
//! Stable domain contracts shared by Lumbridge frontends and runtimes.
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum Platform {
|
||||||
|
MacOs,
|
||||||
|
UbuntuLinux,
|
||||||
|
ArchLinux,
|
||||||
|
OtherLinux,
|
||||||
|
Unsupported,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Platform {
|
||||||
|
#[must_use]
|
||||||
|
pub const fn current() -> Self {
|
||||||
|
if cfg!(target_os = "macos") {
|
||||||
|
Self::MacOs
|
||||||
|
} else if cfg!(target_os = "linux") {
|
||||||
|
Self::OtherLinux
|
||||||
|
} else {
|
||||||
|
Self::Unsupported
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Platform {
|
||||||
|
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let name = match self {
|
||||||
|
Self::MacOs => "macOS",
|
||||||
|
Self::UbuntuLinux => "Ubuntu Linux",
|
||||||
|
Self::ArchLinux => "Arch Linux / Omarchy",
|
||||||
|
Self::OtherLinux => "Linux",
|
||||||
|
Self::Unsupported => "unsupported platform",
|
||||||
|
};
|
||||||
|
formatter.write_str(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum UsageProvenance {
|
||||||
|
ProviderReported,
|
||||||
|
HarnessReported,
|
||||||
|
LocallyMeasured,
|
||||||
|
Estimated,
|
||||||
|
Unavailable,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct ProductStatus {
|
||||||
|
pub platform: Platform,
|
||||||
|
pub message: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ProductStatus {
|
||||||
|
#[must_use]
|
||||||
|
pub const fn architecture_phase(platform: Platform) -> Self {
|
||||||
|
Self {
|
||||||
|
platform,
|
||||||
|
message: "Architecture scaffold only; no terminal sessions are started yet.",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::{Platform, ProductStatus, UsageProvenance};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn scaffold_status_is_explicit() {
|
||||||
|
let status = ProductStatus::architecture_phase(Platform::UbuntuLinux);
|
||||||
|
assert!(status.message.contains("scaffold"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn usage_can_be_explicitly_unavailable() {
|
||||||
|
assert_eq!(UsageProvenance::Unavailable, UsageProvenance::Unavailable);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# Architecture
|
||||||
|
|
||||||
|
## Recommended shape
|
||||||
|
|
||||||
|
Lumbridge should be two cooperating Rust processes:
|
||||||
|
|
||||||
|
```text
|
||||||
|
native desktop UI
|
||||||
|
| local authenticated IPC
|
||||||
|
Lumbridge session runtime
|
||||||
|
|-- PTYs and process trees
|
||||||
|
|-- ACP clients and adapters
|
||||||
|
|-- repositories and worktrees
|
||||||
|
|-- usage/event ledger
|
||||||
|
`-- secret-store handles
|
||||||
|
```
|
||||||
|
|
||||||
|
Separating the UI from the session runtime lets terminals survive renderer
|
||||||
|
restarts, permits a future headless/SSH mode, and gives persistence one owner.
|
||||||
|
The first development build may run both in one process, but boundaries and IPC
|
||||||
|
messages should be real from the beginning.
|
||||||
|
|
||||||
|
## Planned crates
|
||||||
|
|
||||||
|
- `lumbridge-core`: IDs, commands, events, errors, capability and usage types.
|
||||||
|
- `lumbridge-runtime`: session ownership, supervision, recovery, IPC server.
|
||||||
|
- `lumbridge-pty`: portable PTY and process-tree adapters.
|
||||||
|
- `lumbridge-terminal`: VT parsing, scrollback, selection, search, render model.
|
||||||
|
- `lumbridge-acp`: ACP client, capability negotiation, transcript normalization.
|
||||||
|
- `lumbridge-harness`: manifests, launch profiles, hooks, PTY fallback adapters.
|
||||||
|
- `lumbridge-provider`: BYOK providers and provider-neutral usage records.
|
||||||
|
- `lumbridge-storage`: SQLite migrations, event log, snapshots, retention.
|
||||||
|
- `lumbridge-secrets`: Keychain/libsecret adapters and redaction.
|
||||||
|
- `lumbridge-git`: repositories, worktrees, diffs, status, conflict state.
|
||||||
|
- `lumbridge-ui`: native desktop state and rendering.
|
||||||
|
- `lumbridge`: installable application entry point.
|
||||||
|
|
||||||
|
Only `lumbridge-core` and the entry point exist in the scaffold. New crates are
|
||||||
|
added after their architecture spike passes.
|
||||||
|
|
||||||
|
## Terminal path
|
||||||
|
|
||||||
|
The runtime owns PTYs, child process groups, resize signals, input ordering, and
|
||||||
|
raw output. The terminal engine turns output into immutable render snapshots and
|
||||||
|
bounded deltas for the UI. Scrollback is chunked and persisted separately from
|
||||||
|
the live screen to prevent large agent transcripts from blocking input.
|
||||||
|
|
||||||
|
We should evaluate, not blindly copy, WezTerm, Zellij, RMUX, tmux, and cmux. The
|
||||||
|
first spike must compare a reusable terminal crate with a small first-party layer.
|
||||||
|
Correctness cases include alternate screen, bracketed paste, OSC 8 links, Kitty
|
||||||
|
keyboard/graphics negotiation, Unicode width, IME, mouse modes, shell integration,
|
||||||
|
and simultaneous automation plus human input.
|
||||||
|
|
||||||
|
## UI decision gate
|
||||||
|
|
||||||
|
Do not lock the project to a webview or to Zed's private implementation details
|
||||||
|
before a measured spike. Compare:
|
||||||
|
|
||||||
|
1. GPUI for a Zed-like native model and excellent text-heavy interaction.
|
||||||
|
2. Iced/wgpu plus a dedicated terminal renderer for stable Rust portability.
|
||||||
|
3. Tauri only as a delivery-speed baseline, not the assumed winner.
|
||||||
|
|
||||||
|
The winner must render six busy panes smoothly, keep input latency low, support
|
||||||
|
IME/accessibility, package on macOS and both Linux targets, and avoid a license
|
||||||
|
or upstream-stability trap.
|
||||||
|
|
||||||
|
## Harness integration
|
||||||
|
|
||||||
|
Each harness is described by a versioned manifest: executable discovery, launch
|
||||||
|
arguments, environment allowlist, resume semantics, status/usage probes, ACP
|
||||||
|
command when available, and hook installation rules.
|
||||||
|
|
||||||
|
ACP is preferred because it provides structured prompts, plans, tool calls,
|
||||||
|
permissions, content blocks, and session lifecycle. A supervised PTY is always
|
||||||
|
available because terminal fidelity and arbitrary CLI compatibility are product
|
||||||
|
requirements. Harness-specific adapters translate both paths into the same event
|
||||||
|
model without pretending a PTY has capabilities it cannot prove.
|
||||||
|
|
||||||
|
## Usage model
|
||||||
|
|
||||||
|
Usage is an append-only observation stream, not a mutable percentage field.
|
||||||
|
Observations include account profile, provider, harness, model, units, time
|
||||||
|
window, reset time, provenance, confidence, and source timestamp. Projections are
|
||||||
|
derived views that can be recomputed as forecasting improves.
|
||||||
|
|
||||||
|
Subscription balance is provider-specific and sometimes unavailable. BYOK calls
|
||||||
|
usually expose token counts but cost still depends on cached tokens, reasoning,
|
||||||
|
tool calls, and current pricing. Adapters normalize facts without erasing their
|
||||||
|
source or uncertainty.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
SQLite in WAL mode stores metadata, commands/events, normalized usage, and small
|
||||||
|
snapshots. Large scrollback chunks and binary attachments use content-addressed
|
||||||
|
files. A write-ahead event is committed before an external mutation is reported
|
||||||
|
as accepted. Startup replays incomplete operations and reconciles live children.
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- macOS secrets: Keychain; Linux secrets: Secret Service/libsecret, with an
|
||||||
|
explicit encrypted-file fallback only if the user enables it.
|
||||||
|
- Never pass keys in process arguments. Prefer inherited file descriptors or a
|
||||||
|
minimal child environment when a harness requires environment variables.
|
||||||
|
- IPC is local, authenticated, permission-restricted, and version-negotiated.
|
||||||
|
- Transcript and crash-report redaction happens before persistence or export.
|
||||||
|
- Repository trust, harness approval mode, and sandbox mode are visible per pane.
|
||||||
|
- Remote control and plugins are out of scope until a capability/permission model
|
||||||
|
exists.
|
||||||
|
|
||||||
|
## Platform adapters
|
||||||
|
|
||||||
|
Shared contracts cover PTY, process tree, notifications, secret store, paths,
|
||||||
|
autostart, updater, and packaging. macOS uses `forkpty`/process groups and native
|
||||||
|
Keychain. Ubuntu and Omarchy use Unix PTYs, cgroups/systemd scopes when available,
|
||||||
|
and Secret Service. Omarchy is treated as Arch Linux, not as a separate kernel.
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Distribution plan
|
||||||
|
|
||||||
|
Lumbridge source and release metadata live in the public Gitea repository. Users
|
||||||
|
should not need a Rust toolchain.
|
||||||
|
|
||||||
|
Initial release artifacts:
|
||||||
|
|
||||||
|
- macOS arm64: signed and notarized `.dmg` plus a tar archive.
|
||||||
|
- macOS x86_64: added when a maintained Intel runner is available.
|
||||||
|
- Ubuntu x86_64: `.deb` and AppImage.
|
||||||
|
- Omarchy/Arch x86_64: signed package archive and an AUR recipe that downloads
|
||||||
|
the matching release artifact.
|
||||||
|
|
||||||
|
Each release includes SHA-256 checksums, a signed update manifest, SBOM, license
|
||||||
|
notices, and the exact source commit. Reproducibility is a goal, but a release is
|
||||||
|
not called reproducible until two clean builders produce matching artifacts.
|
||||||
|
|
||||||
|
The updater must verify signatures before replacing binaries, retain the prior
|
||||||
|
version for rollback, and never update a running session runtime in place.
|
||||||
|
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
# Product specification
|
||||||
|
|
||||||
|
## One sentence
|
||||||
|
|
||||||
|
Lumbridge is a high-performance, local-first terminal and workspace multiplexer
|
||||||
|
that lets engineers run, steer, compare, and understand many coding agents
|
||||||
|
without surrendering control of their accounts, keys, repositories, or shells.
|
||||||
|
|
||||||
|
## Primary user
|
||||||
|
|
||||||
|
An engineer who works across several repositories and routinely keeps multiple
|
||||||
|
coding agents, shells, test watchers, servers, and review surfaces alive at once.
|
||||||
|
The product should feel faster and calmer as concurrency rises.
|
||||||
|
|
||||||
|
## Core jobs
|
||||||
|
|
||||||
|
1. Open a repository and create a durable workspace with terminals and panes.
|
||||||
|
2. Launch a supported harness through its subscription login or a BYOK profile.
|
||||||
|
3. See whether each agent is working, waiting, blocked, complete, or disconnected.
|
||||||
|
4. Steer work without losing terminal fidelity or bypassing approval prompts.
|
||||||
|
5. Review file and Git changes by workspace or worktree.
|
||||||
|
6. Understand usage, rate-limit windows, burn rate, and likely exhaustion time.
|
||||||
|
7. Resume the entire workspace after the UI or machine restarts.
|
||||||
|
|
||||||
|
## Initial harnesses
|
||||||
|
|
||||||
|
- Claude Code
|
||||||
|
- OpenAI Codex
|
||||||
|
- DeepSeek Harness
|
||||||
|
- Pi and compatible Pi distributions
|
||||||
|
- Hermes Agent
|
||||||
|
- OpenClaw
|
||||||
|
- Goose
|
||||||
|
- Gemini CLI
|
||||||
|
- OpenCode
|
||||||
|
|
||||||
|
An arbitrary command remains a supported harness through the generic PTY adapter.
|
||||||
|
|
||||||
|
## Provider modes
|
||||||
|
|
||||||
|
Subscription mode delegates authentication to the installed upstream harness.
|
||||||
|
Lumbridge observes only documented status, usage, and protocol surfaces.
|
||||||
|
|
||||||
|
BYOK mode supports OpenAI, Anthropic, Google Gemini, Groq, Cerebras, DeepSeek,
|
||||||
|
and OpenAI-compatible endpoints. Keys live in the operating-system credential
|
||||||
|
store. A provider adapter receives an opaque secret handle, never a value stored
|
||||||
|
in project state.
|
||||||
|
|
||||||
|
Provider and harness selection are independent. For example, a generic harness
|
||||||
|
may use Cerebras by API key while Codex uses a ChatGPT subscription.
|
||||||
|
|
||||||
|
## Usage footer
|
||||||
|
|
||||||
|
The footer answers five questions in a glance:
|
||||||
|
|
||||||
|
- Which harness, provider, model, and account profile is active?
|
||||||
|
- How much of the current usage window has been consumed?
|
||||||
|
- When does the window reset?
|
||||||
|
- What is the recent and projected burn rate?
|
||||||
|
- How trustworthy is the number?
|
||||||
|
|
||||||
|
Every value is labeled internally and in detail views as provider-reported,
|
||||||
|
harness-reported, locally measured, estimated, or unavailable. Lumbridge must
|
||||||
|
not scrape browser cookies or reverse-engineer private account APIs to manufacture
|
||||||
|
an exact remaining balance. When only local observations exist, the UI says so.
|
||||||
|
|
||||||
|
## Non-goals for the first release
|
||||||
|
|
||||||
|
- A new foundation-model training or inference service.
|
||||||
|
- A hosted account or mandatory Lumbridge cloud.
|
||||||
|
- Replacing every coding harness with one Lumbridge-owned agent loop.
|
||||||
|
- Windows support.
|
||||||
|
- Mobile control, collaborative cloud sessions, or remote execution.
|
||||||
|
- Bundling third-party subscriptions or reselling model tokens.
|
||||||
|
|
||||||
|
## Experience principles
|
||||||
|
|
||||||
|
- Terminal truth first: no hidden process state and no fake terminal emulation.
|
||||||
|
- Keyboard fast, mouse understandable.
|
||||||
|
- Dense information with a quiet default presentation.
|
||||||
|
- Approval and security boundaries stay visible.
|
||||||
|
- Local and offline workflows remain useful.
|
||||||
|
- Estimates are useful only when their uncertainty is honest.
|
||||||
|
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# Research map
|
||||||
|
|
||||||
|
The working checkouts live outside this repository at:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Desktop/Lumbridge Code/Research/
|
||||||
|
```
|
||||||
|
|
||||||
|
They are shallow snapshots for study, not dependencies or vendored source.
|
||||||
|
|
||||||
|
## Multiplexers and terminal engines
|
||||||
|
|
||||||
|
- `manaflow-ai/cmux`: the current cmux product; native workspace/pane model,
|
||||||
|
automation socket, embedded browser, agent hooks, and terminal UX.
|
||||||
|
- `Helvesec/rmux`: Rust multiplexer engine, daemon, typed SDKs, tmux surface.
|
||||||
|
- `tmux/tmux`: the durable client/server and command model to remain compatible
|
||||||
|
with where useful.
|
||||||
|
- `zellij-org/zellij`: Rust workspace, layouts, plugins, collaboration, web client.
|
||||||
|
- `wez/wezterm`: mature Rust terminal emulator, multiplexer, rendering, and PTY
|
||||||
|
portability reference.
|
||||||
|
|
||||||
|
## Agent IDEs and orchestration products
|
||||||
|
|
||||||
|
- `stablyai/orca`: parallel worktrees, many harnesses, terminals, usage tracking,
|
||||||
|
remote execution, and review surfaces.
|
||||||
|
- `get-bb/bb`: self-drivable agent IDE with desktop, web, CLI, and API surfaces.
|
||||||
|
- `coder/xum`: isolated parallel agent workspaces, remote execution, review, and
|
||||||
|
cost/context UX; AGPL, so treat implementation as study-only.
|
||||||
|
- `zed-industries/zed`: high-performance Rust editor, GPUI, terminal, and ACP
|
||||||
|
client. Review the dual-license boundary file by file.
|
||||||
|
- `aaif-goose/goose`: Rust desktop/CLI/API agent, many providers, MCP, and ACP.
|
||||||
|
- `block/buzz`: Rust human/agent collaboration plus production ACP harness design.
|
||||||
|
- `bbarit/terminal`: Rust agent terminal/IDE ideas. No top-level license file was
|
||||||
|
present in the captured snapshot, so do not reuse implementation code.
|
||||||
|
|
||||||
|
## Protocols
|
||||||
|
|
||||||
|
- `agentclientprotocol/agent-client-protocol`: canonical ACP schema and spec.
|
||||||
|
- `agentclientprotocol/rust-sdk`: official high-level Rust client/agent runtime.
|
||||||
|
|
||||||
|
## Harnesses
|
||||||
|
|
||||||
|
- `openai/codex`
|
||||||
|
- `deepseek-ai/deepseek-harness`
|
||||||
|
- `google-gemini/gemini-cli`
|
||||||
|
- `badlogic/pi-mono`
|
||||||
|
- `NousResearch/hermes-agent`
|
||||||
|
- `openclaw/openclaw`
|
||||||
|
- `anomalyco/opencode`
|
||||||
|
|
||||||
|
## Research questions
|
||||||
|
|
||||||
|
1. Which terminal core gives us correctness without inheriting a product-shaped
|
||||||
|
dependency or incompatible license?
|
||||||
|
2. Can the runtime maintain smooth human input while agents read/write other
|
||||||
|
panes through automation?
|
||||||
|
3. Which UI stack meets latency, IME, accessibility, and packaging requirements?
|
||||||
|
4. What is the smallest honest common denominator across ACP harnesses?
|
||||||
|
5. Which official provider/harness surfaces expose subscription quota, and what
|
||||||
|
must remain measured or unavailable?
|
||||||
|
6. Can one event model cover PTY, ACP, Git, usage, permissions, and recovery
|
||||||
|
without turning into untyped JSON everywhere?
|
||||||
|
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Roadmap
|
||||||
|
|
||||||
|
## Phase 0 — research and decisions
|
||||||
|
|
||||||
|
- Capture upstream snapshots, licenses, relevant modules, and architectural notes.
|
||||||
|
- Benchmark UI candidates with six animated terminal panes.
|
||||||
|
- Spike PTY correctness and process-tree cleanup on macOS, Ubuntu, and Omarchy.
|
||||||
|
- Connect the official ACP Rust SDK to two contrasting harnesses.
|
||||||
|
- Audit actual usage/quota surfaces for every launch provider.
|
||||||
|
- Decide terminal core, UI stack, IPC transport, and schema evolution policy.
|
||||||
|
|
||||||
|
Exit: recorded decisions with working spikes and measured results.
|
||||||
|
|
||||||
|
## Phase 1 — terminal workspace alpha
|
||||||
|
|
||||||
|
- Durable runtime, local IPC, workspaces, tabs, splits, shells, scrollback.
|
||||||
|
- Session restore, crash recovery, command palette, keybindings, notifications.
|
||||||
|
- Repository/worktree creation and basic Git status/diff.
|
||||||
|
- macOS, Ubuntu, and Omarchy development packages.
|
||||||
|
|
||||||
|
Exit: Lumbridge is worth using as a terminal multiplexer without AI features.
|
||||||
|
|
||||||
|
## Phase 2 — agent alpha
|
||||||
|
|
||||||
|
- Generic harness manifest and PTY adapter.
|
||||||
|
- ACP client with capability negotiation and permission rendering.
|
||||||
|
- Codex, Claude Code, DeepSeek Harness, Pi, and Hermes adapters.
|
||||||
|
- Agent status, unread/needs-input state, resume, and transcript navigation.
|
||||||
|
|
||||||
|
Exit: daily multi-agent work is reliable and observable.
|
||||||
|
|
||||||
|
## Phase 3 — providers and usage
|
||||||
|
|
||||||
|
- Subscription profile discovery without credential extraction.
|
||||||
|
- BYOK profiles for OpenAI, Anthropic, Gemini, Groq, Cerebras, and DeepSeek.
|
||||||
|
- OS credential storage, redaction, provider/model catalog.
|
||||||
|
- Usage ledger, reset windows, burn charts, forecasts, export, and footer.
|
||||||
|
|
||||||
|
Exit: usage displays are useful, auditable, and honest about uncertainty.
|
||||||
|
|
||||||
|
## Phase 4 — public beta
|
||||||
|
|
||||||
|
- Goose, Gemini CLI, OpenClaw, and OpenCode adapters.
|
||||||
|
- Signed/notarized macOS releases, `.deb`, AppImage, and Arch package.
|
||||||
|
- Delta updater with signed manifests and rollback.
|
||||||
|
- Accessibility, performance, soak, migration, and recovery qualification.
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# 0001: Lumbridge is the workspace, not one more mandatory agent
|
||||||
|
|
||||||
|
Status: accepted for the architecture phase.
|
||||||
|
|
||||||
|
Lumbridge owns terminals, workspaces, session durability, integration, review,
|
||||||
|
and usage observability. Existing coding harnesses remain first-class processes.
|
||||||
|
ACP provides rich structure and PTYs provide universal compatibility.
|
||||||
|
|
||||||
|
This boundary preserves user subscriptions, harness-native capabilities, and
|
||||||
|
choice. It also prevents an early attempt to build a terminal, IDE, multiplexer,
|
||||||
|
provider SDK, and universal agent loop as one inseparable component.
|
||||||
|
|
||||||
|
We may later ship an optional Lumbridge-native harness, but the application must
|
||||||
|
remain valuable without it.
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# 0002: Usage data always carries provenance
|
||||||
|
|
||||||
|
Status: accepted for the architecture phase.
|
||||||
|
|
||||||
|
Provider quotas and subscription windows do not share a stable universal API.
|
||||||
|
Lumbridge therefore stores observations with their source and derives forecasts
|
||||||
|
without overwriting the facts.
|
||||||
|
|
||||||
|
Allowed provenance values begin as provider-reported, harness-reported, locally
|
||||||
|
measured, estimated, and unavailable. The UI may simplify these labels in compact
|
||||||
|
views, but the detail view and export retain them.
|
||||||
|
|
||||||
|
Lumbridge will not scrape browser cookies, copy upstream OAuth tokens, or label a
|
||||||
|
local estimate as an exact remaining subscription balance.
|
||||||
|
|
||||||
Reference in New Issue
Block a user