Files
endorphin-tessera-gui/README.md
T
2026-10-20 01:10:02 +08:00

109 lines
3.6 KiB
Markdown

# Tessera
Tessera is a clean desktop rendering host. It starts with an empty page. Coding agents submit source code to a namespace through a local CRUD API; Tessera parses that code, builds its architecture tree, compiles it to drawing commands, and renders the result.
## Aster source dependency
[Aster](vendor/aster/README.md) is an independent Git repository checked out as a
submodule at `vendor/aster`. Tessera records its exact commit in the Git submodule
entry; `.gitmodules` records its source URL. See [vendor](vendor/README.md) for
initialization, version updates, and the checkout layout.
Cargo directly depends on Aster's `frontend`, `compiler`, and `core` library
packages through paths inside that submodule. The `core` dependency is named
`endor_core` in Tessera's manifest. These packages also bring in Aster's `objects`
package. Aster retains its own Cargo workspace and source history.
Rust 1.91 or newer is required. Building Tessera compiles the required Aster
libraries automatically; no separate Aster build or CLI/server process is
required. Tessera does not depend on Aster's storage, host, CLI, or server packages.
This change establishes the source and library dependency only. The namespace
API still uses the experimental Tessera parser described below. Executing Endor
through Aster and replacing that parser is the next implementation step; no
Aster source changes are part of this integration.
## Start
Initialize the Aster submodule first, following the SSH identity instructions in
[vendor](vendor/README.md):
```bash
git submodule update --init --recursive
```
For local native builds and window runs (automated tests run only in CI):
```bash
cargo run --release
```
Tessera listens only on `127.0.0.1:4737`.
Start every agent integration by reading the live Markdown guide:
```bash
curl http://127.0.0.1:4737/agent
```
## Namespace code API
The initial active namespace is `app.main`. Tessera has no file concept.
```text
GET /v1/namespaces/app.main/code
PUT /v1/namespaces/app.main/code
DELETE /v1/namespaces/app.main/code
```
Submit code as plain text:
```bash
curl \
--request PUT \
--header 'Content-Type: text/plain; charset=utf-8' \
--data-binary @- \
http://127.0.0.1:4737/v1/namespaces/app.main/code <<'TESSERA'
namespace app.main
use tessera.ui::{Column, Text}
export scene Main {
render {
Column(gap: 12, padding: 24) {
Text("Hello", role: .title)
Text("Rendered by Tessera")
}
}
}
TESSERA
```
Updates are atomic. Invalid code returns diagnostics with HTTP 422 and preserves the last successfully rendered revision.
## Developer tools
The developer sidebar is closed by default.
- macOS: `Command-Option-I` or `F12`
- Windows/Linux: `Control-Shift-I` or `F12`
The upper section displays the compiler-produced architecture tree. Selecting a node shows the corresponding source range below it.
## Current syntax experiment
The first parser intentionally supports only enough syntax to test the architecture:
- `namespace`
- namespace-only `use`
- one `export scene`
- one `render` root
- `Column`, `Row`, `Spacer`, and `Text`
- `gap`, `padding`, and `.title`
There are no files, HTML, CSS, JavaScript, DOM, or resource-network concepts in the runtime.
## Validation
Local Cargo builds and native window runs are allowed; do not run local tests or Docker. Automated tests and Clippy run in [.gitea](.gitea/README.md) on ces-control using Dockerfile.ci. The Linux CI checks portable code and software-renderer tests, not macOS window presentation. Aster dependency unit tests remain in Aster CI. CI bot SSH secrets are documented in .gitea/README.md.