Presto 新版系统架构:Modular Runtime + Recipe Layer Stack
一句话架构
Presto 从“桌面 App + 插件页”演化为“常驻控制面 + 可层叠菜谱 + 可替换入口 + 受控能力服务”的本地优先模块化 Runtime。
桌面主程序不再是唯一入口,而是官方 Dashboard / Console;真正的系统核心是常驻后台服务 prestod,它负责解析 Recipe Layer、生成 Desired State、安装与启动插件服务、路由 capability provider、维护 lockfile、暴露 API,并把运行状态反馈给多个入口。
架构边界
该设计借鉴 Docker、Homebrew、NPM、VS Code、Mihomo、K8s、systemd、Terraform、Nix、Git 的工程思想,但不把 Presto 做成通用编排平台。
核心约束:Presto 只编排 Presto 生态内的 package、capability、provider 和 service;Recipe 是声明式编排,不是任意脚本执行器。
prestod 是唯一事实来源,负责 API、状态、调谐和服务生命周期。1. C4 Context:系统上下文
Entry Plane / 入口平面
Control Plane / 控制平面
Capability Plane / 能力平面
Distribution Plane / 分发平面
2. C4 Container:prestod 内部容器图
typst.compile@13. Recipe Layer Stack:菜谱层叠模型
Recipe Layers
基础能力、默认 provider、基础 UI entry
Typst, Tinymist, PDF exporter
组织模板、导出规则、默认工作流
个人 provider、预热策略、禁用项
项目级 capability 与 lockfile 偏好
- required capabilities
- selected providers
- service runtime policy
- entrypoints
- lockfile candidates
- prewarm resident services
- start workspace services
- keep lazy services idle
- run job services on demand
4. 关键运行流程:导入菜谱并应用
5. 服务生命周期状态机
服务模式包括 resident、workspace、document、onDemand、job、external、container。启动延时通过常驻 prestod、懒启动、预热、idle TTL、progressive capability 和可视化 warming 状态处理。
6. 核心概念表
| 概念 | 职责 | 类比来源 | Presto 中的约束 |
|---|---|---|---|
| Package | 可安装、可签名、可缓存的分发单元。 | NPM package / Homebrew formula | 来自可信 registry,不在用户配置中任意指向本地命令。 |
| Capability | 版本化能力协议,包含输入、输出、错误、事件、取消语义与 conformance tests。 | LSP / OpenAPI / VS Code provider | 依赖解析基于能力协议,不基于插件血缘或 fork 关系。 |
| Provider | 某个 package 对某个 capability 的实现声明。 | VS Code default formatter / Terraform provider | 可被用户、workspace、recipe 或官方默认选择与覆盖。 |
| Service | 运行时实体,可暴露一个或多个 provider。 | systemd service / K8s Pod / Docker container | 生命周期由 prestod 管理,支持 native、docker、wasm、external runtime class。 |
| Recipe | 用户可理解的组合单位,声明一组 package、capability、provider、entrypoint 和 runtime policy。 | Homebrew Bundle / Clash profile / Docker layer | 只能声明受控 desired state,不能执行任意脚本。 |
| Profile | 一组已启用 Recipe Layers 合并后的用户运行环境。 | Mihomo profile / Vercel environment | 可导入、导出、切换、回滚,并生成 lockfile。 |
7. 配置与 Lockfile 示例
Recipe 声明示例
apiVersion: presto.dev/v1
kind: Recipe
metadata:
name: official/gongwen-writing
title: 公文写作包
requires:
capabilities:
- document.render.typst@1
- document.export.pdf@1
- workflow.gongwen.assistant@1
providers:
document.render.typst@1: presto/typst
typst.preview.live@1: presto/tinymist
packages:
required:
- presto/typst
- presto/gongwen-template-pack
recommended:
- presto/tinymist
runtimePolicy:
presto/tinymist:
mode: workspace
activation:
- onWorkspaceOpen
- onCapabilityRequest
idleTimeout: 10m
Resolved Profile 摘要示例
profile:
layers:
- official/base
- official/typst-writing
- school/gongwen-standard
- user/my-preferences
resolved:
providers:
typst.compile@1: presto/typst
typst.preview.live@1: presto/tinymist
ai.text.generate@1: presto/deepseek
services:
typst-service:
mode: resident
state: ready
tinymist-service:
mode: workspace
state: warming
pdf-exporter:
mode: onDemand
state: idle
lock:
presto/typst: 0.13.1#sha256:...
presto/tinymist: 0.14.18#sha256:...
8. MVP 收敛建议
| 阶段 | 目标 | 范围控制 |
|---|---|---|
| 阶段 1:插件市场 MVP | 拆出 Typst/Tinymist,建立 manifest、capability、provider、default pack。 | 不开放完整 UI DSL,不做第三方 Dashboard。 |
| 阶段 2:prestod + Runtime Console | 常驻 core、服务状态、启动/停止、日志、配置导入导出。 | 单机单控制面,不做多节点与动态服务发现。 |
| 阶段 3:Recipe Layer | 官方菜谱、组织菜谱、用户菜谱、workspace lock、层叠覆盖。 | Recipe 只声明受控能力和策略,不允许任意 command。 |
| 阶段 4:多入口 | Desktop、CLI、API、MCP、第三方 Dashboard 连接同一 runtime。 | 入口是 client,不拥有系统事实来源。 |
| 阶段 5:高级 runtime class | Docker、remote、wasm 作为可选运行后端。 | 不是基础依赖,不把 Presto 变成通用 PaaS。 |
9. 结论
推荐定位:Presto Core 是本地常驻控制面;Presto Desktop 是官方控制台与默认入口;插件服务是受控 capability provider;Recipe 是面向用户的组合与订阅单位;Registry 是可信分发平面。
复杂度控制:采用这些架构思想作为北极星,但 MVP 必须收敛为“单机、单控制面、受控 package、声明式 Recipe、可观测 service lifecycle”。Presto 不做通用本地编排平台,只编排 Presto 生态内的创作、排版、模板、导出、AI 与工作流能力。