* feat(website): serve paseo.sh in Simplified Chinese
Every page of the website now has a Simplified Chinese version under
/zh-CN: the interface, docs, blog posts, comparison pages, legal pages,
all changelog releases and the homepage mockup. English URLs are unchanged.
The URL alone decides the language. There is no browser-language redirect
and no stored preference, because either would have to redirect the
unprefixed English URLs that people share and search engines index.
Internal links carry the page's language instead, and hreflang alternates
point Chinese search results at /zh-CN.
Translated headings pin the English anchor with {#id}, so section links
work in both languages. content-translations.test.ts fails when a page
has no translation or a translation's headings drift from the English.
Changelog releases and plugin listings without a translation render
whole in English under a notice, so a release never waits on one.
Plugin manifests and the registry gain optional translations and
OVERVIEW.zh-CN.md fields; older clients and registries ignore them.
* feat(website): replace the native language select with an EN/ZH menu
The header showed an OS-native select whose popup did not match the site.
The trigger now shows the language abbreviated (EN, ZH) and opens a menu in
the app's dropdown style that names each language in itself, with its name
in the page language underneath. Rows are real links to the same page in
that language; arrows, Escape, outside presses and taps behave as a menu
button, and the menu keeps itself on screen when a narrow header pushes the
trigger toward an edge.
Also drops the stray space after the full-width comma in the Chinese
homepage subtitle.
* docs(website): translate main's new docs and 0.12.0 release notes
Main added Keep run workspaces to the schedules docs, rewrote plugin icons
around inline SVG, and promoted 0.12.0 with new entries. Bring the Chinese
pages and changelog in line so no section falls back to English.
* fix(server): leave plugin listing translations to the registry
The daemon rejected manifests whose translations the registry would refuse,
so a plugin main installs could fail to load here. Paseo never reads
translations; the registry validates them at publish. Docs now say which
checks are automated at publish and which are human review.
* docs(plugins): describe the registry's final overview translation discovery
* style(server): format manifest test
* test(app): measure sidebar rows one at a time
After a reload the developer error toast appears while expectVerticalOrder
measures every row at once. Each concurrent boundingBox runs the toast
locator handler, and only one of them resumes, so the poll timed out on
every attempt since #7424. Measuring sequentially keeps one action in flight.
* test(app): return sidebar row measuring to main
#7480 hides the developer toast instead of running a locator handler, so
measuring the rows concurrently no longer races it. Reverts 41ac23016.
* test(app): wait for the compact shell before opening compact Changes
The shell survives the breakpoint, so right after the resize the wide
Explorer could still be visible: the test skipped the Explorer toggle and
the tab then disappeared, or toggled at the wrong time. Wait for the
compact-shell marker, as the composer helpers do since #7424.
* docs(website): translate main's plugin file panel docs
* test(app): edit the code font size after the font family remount
A committed appearance change remounts the settings screen through
AppearanceStyleBoundary, and the new form starts from the stored size.
Filling the size before that remount lost the edit in CI.
* docs(website): translate main's client/ui import docs
Follows #7474: one /client/ui entry, StreamedText instead of useRevealedText,
SettingsGroup dropped from the settings table, and the new
'UI imports in v0.13' migration section.
* test(app): wait for the previous layout's file panel picker to leave
After a resize the old layout's picker animates out while the new one is
already mounted, so the Use button matched two elements and the strict
locator failed. Wait for the shell's layout and a single picker first.
11 KiB
title, description, nav
| title | description | nav |
|---|---|---|
| 配置 | 配置托管实例和前台部署。 | 配置 |
配置
托管实例从主目录的 config.json 和默认值加载配置。前台部署可以用环境变量覆盖这个文件。
配置存放在哪里
Paseo 默认使用 ~/.paseo 作为主目录。配置文件是:
~/.paseo/config.json
你可以通过设置 PASEO_HOME 或在 CLI 命令上使用 --home 来更改主目录。
优先级
托管的 start 和桌面应用先使用默认值,再应用 config.json。继承来的 daemon 设置环境变量会从它们的启动环境中移除。
前台的 paseo daemon run、Docker 和直接由进程管理器启动的方式会在文件之后应用环境变量。已有的旧版进程管理器参数在 worker 重启后保持其优先级。修改部署覆盖项需要停止并重新启动该部署。列表类设置会在各个来源之间追加,包括主机名和 CORS 来源。
示例
配置监听地址、主机名和 MCP 的最小示例:
{
"$schema": "https://paseo.sh/schemas/paseo.config.v1.json",
"version": 1,
"daemon": {
"listen": "127.0.0.1:6767",
"hostnames": ["localhost", ".localhost"],
"mcp": { "enabled": true }
}
}
daemon.hostnames 是主要字段。旧的 daemon.allowedHosts 名称作为已弃用的别名仍然可用,以保持向后兼容。
应用更改
通过 CLI 编辑所选的文件:
paseo daemon config get daemon.listen --home ~/paseo-test
paseo daemon config set daemon.listen 127.0.0.1:6800 --home ~/paseo-test
paseo daemon config unset features.webUi.enabled --home ~/paseo-test
get [path] 报告已配置的值,并把缺失的字段标记为 unset。它不会创建主目录。set 会把输入解析为 JSON,否则当作字符串;--string 强制作为字面字符串。--json 选择输出格式。对于包含点号的动态键,请使用整个对象的 JSON。未知路径、无效值和无效的现有文件都会被拒绝,不会写入。密码使用 set-password。
编辑成功后会保存经过校验的文件,然后在实例可达时重新加载一次。输出会区分已应用的更改、需要重启的项和部署覆盖项。已停止、未绑定或不可达的实例会报告 saved; not applied。重新加载失败时会报告 saved; reload failed 并以非零状态退出;文件仍然保存。编辑从不会隐式重启。
直接编辑 config.json 后,重新加载它:
paseo reload
daemon 会在应用任何内容之前校验整个文件。它会应用运行时安全的更改,并列出仍然需要重启的设置。如果它报告了需要重启的路径,请运行:
paseo daemon restart
运行时安全的设置包括:中继启用、MCP 设置、浏览器工具、主机名、CORS 来源、受信任的代理、Git 进程限制、Agent 和终端配置、Provider 定义、元数据生成、应用基础 URL、Provider 目录超时,以及全局插件开关。删除其中某个设置会应用该字段缺省时的行为;删除某个 Provider 会把它从之后的启动中移除。
当你删除 daemon.relay.enabled 时,新的主目录会保持中继关闭。如果 daemon 启动时其配置就已经省略了这个字段,它会为了兼容而保持旧版的中继开启行为。编辑较旧的配置时,请显式设置 daemon.relay.enabled。
监听地址、身份验证、中继端点和 TLS、worktree 分配、服务代理地址、内置的 Web UI、日志、语音合成与识别、语音、凭据以及本地模型设置都需要重启。重新加载会先应用同一文件中的其他有效编辑,再报告这些路径。
部署环境变量和旧版进程管理器参数仍然具有最终决定权。当某个启动覆盖项阻止了文件中已更改的设置生效时,重新加载会在 overrideControlledPaths 下报告它。这包括启动设置,例如监听地址、密码、中继端点和 TLS、服务代理和 Web UI 设置、日志、语音合成与识别以及语音配置。主机名和 CORS 来源等列表设置仍然在各个来源之间追加,因此 config.json 中的值继续生效。要让文件中的值具有决定权,请停止该部署并在不带覆盖项的情况下重新启动。
Agent Provider
Agent Provider,包括 Paseo 自带的一等 Provider 和你在 agents.providers 下添加的自定义条目,都在单独的页面中介绍。
心智模型见 Provider,Paseo 可以启动的全部 Agent 见支持的 Provider。要让 Claude 指向兼容 Anthropic 的端点(Z.AI、Alibaba/Qwen)、使用多个配置、自定义二进制文件、ACP Agent,以及了解 additionalModels 的合并行为,见自定义 Provider。完整的字段参考在 GitHub 上的 docs/custom-providers.md。
worktree
新的 worktree 默认创建在 $PASEO_HOME/worktrees 下。要把新的 worktree 放到其他位置,请设置 worktrees.root:
{
"worktrees": {
"root": "/mnt/fast/paseo-worktrees"
}
}
相对路径基于 PASEO_HOME 解析。已有的 worktree 保持原位;修改此设置只会改变 Paseo 之后创建和发现由 Paseo 管理的 worktree 的位置。
语音
语音通过 features.dictation 和 features.voiceMode 配置,Provider 凭据放在 providers 下。
语音的设计理念、架构以及完整的本地和 OpenAI 设置示例,见语音文档。
内置的 Web UI
daemon 可以在同一个 HTTP 服务器上提供浏览器 Web 客户端。官方 Docker 镜像中默认启用此功能,普通 CLI 和由桌面应用管理的 daemon 默认关闭。
从 CLI 启用它:
paseo daemon config set features.webUi.enabled true
paseo daemon start
或者设置环境变量:
PASEO_WEB_UI_ENABLED=true paseo daemon run
或者把它持久化到 config.json 中:
{
"features": {
"webUi": {
"enabled": true
}
}
}
启用后,打开 daemon 的 HTTP 地址(例如 http://localhost:6767/)即可加载 Web 应用。静态 UI 文件无需 daemon 身份验证即可加载;API 和 WebSocket 请求仍然需要配置的密码。
日志
daemon 日志默认使用独立的控制台输出和文件输出:
- 控制台:
info及以上 - 文件(
$PASEO_HOME/daemon.log):trace及以上 - 文件轮转:单个文件最大
10m,除当前文件外保留3个轮转文件
{
"log": {
"console": {
"level": "info",
"format": "pretty"
},
"file": {
"level": "trace",
"path": "daemon.log",
"rotate": {
"maxSize": "10m",
"maxFiles": 3
}
}
}
}
旧版字段 log.level 和 log.format 仍然受支持,并映射到新的输出目标设置。
密码验证
你可以要求连接 daemon 时提供密码。设置后,所有 HTTP 和 WebSocket 客户端都必须通过验证。只有 /api/health 存活检查端点例外,以便进程管理器和负载均衡器无需凭据即可探测。
设置密码最简单的方式是使用 CLI:
paseo daemon set-password
它会提示你输入密码,把 bcrypt 哈希写入 config.json,并提示你重启 daemon。身份验证属于启动设置,因此 paseo reload 也会把它报告为需要重启。
或者设置 PASEO_PASSWORD 环境变量(明文,启动时自动哈希):
PASEO_PASSWORD=my-secret paseo daemon start
或者直接把哈希写入 config.json:
{
"daemon": {
"auth": {
"password": "$2b$12$..."
}
}
}
设置密码后,重启 daemon 使更改生效。
使用密码连接
CLI 按以下顺序获取密码:
-
tcp://主机 URI 上的password查询参数:paseo --host "tcp://192.168.1.10:6767?password=my-secret" ls -
PASEO_PASSWORD环境变量,在主机未携带内嵌密码时作为后备使用(适用于localhost:6767、裸的host:port,或不带password=查询参数的tcp://主机):PASEO_PASSWORD=my-secret paseo ls PASEO_PASSWORD=my-secret paseo --host 192.168.1.10:6767 ls
URI 中的 password= 总是优先于环境变量,因此你可以全局设置 PASEO_PASSWORD,同时通过在 URI 中写明密码来连接另一个 daemon。
在移动应用中,在直接连接的设置界面输入密码。
中继
新的主目录会写入 daemon.relay.enabled: false。配对设备时,Paseo 会先询问再启用中继;已有的主目录保留其已保存的值。选择和配置连接方式见连接方式,中继的加密模型见安全。
在 config.json 中设置持久化的值:
{
"daemon": {
"relay": {
"enabled": true
}
}
}
PASEO_RELAY_ENABLED=true|false 会为前台部署覆盖文件中的值。托管的 start 使用文件中的值。在通过应用或 paseo daemon pair --relay 修改中继之前,请结束并重新启动部署以移除它的覆盖项。
常用环境变量
PASEO_HOME,设置 Paseo 主目录PASEO_HOST,设置 CLI 命令的 daemon 目标PASEO_PASSWORD,在 daemon 上表示要求的密码(明文,启动时哈希);在 CLI 上表示主机 URI 未包含密码时用于连接的密码PASEO_LISTEN,覆盖daemon.listenPASEO_RELAY_ENABLED,为本次 daemon 启动启用或关闭出站中继PASEO_HOSTNAMES,覆盖或扩展daemon.hostnamesPASEO_ALLOWED_HOSTS,PASEO_HOSTNAMES的已弃用别名PASEO_WEB_UI_ENABLED,启用或关闭由 daemon 提供的 Web UIPASEO_WEB_UI_DIST_DIR,覆盖 daemon Web UI 的构建目录PASEO_TRUSTED_PROXIES,为X-Forwarded-*请求头配置受信任的反向代理范围PASEO_LOG_CONSOLE_LEVEL,覆盖log.console.levelPASEO_LOG_FILE_LEVEL,覆盖log.file.levelPASEO_LOG_FILE_PATH,覆盖log.file.pathPASEO_LOG_FILE_ROTATE_SIZE,覆盖log.file.rotate.maxSizePASEO_LOG_FILE_ROTATE_COUNT,覆盖log.file.rotate.maxFilesPASEO_LOG、PASEO_LOG_FORMAT,旧版日志覆盖项(仍受支持)OPENAI_API_KEY,覆盖 OpenAI Provider 密钥OPENAI_STT_API_KEY、OPENAI_STT_BASE_URL,OpenAI 语音转文字端点(听写和语音模式 STT)OPENAI_TTS_API_KEY、OPENAI_TTS_BASE_URL,OpenAI 文字转语音端点(语音模式 TTS)PASEO_VOICE_LLM_PROVIDER,覆盖语音 LLM Provider(claude、codex、opencode)PASEO_DICTATION_STT_PROVIDER、PASEO_VOICE_STT_PROVIDER、PASEO_VOICE_TTS_PROVIDER,覆盖语音 Provider 的选择(local或openai)PASEO_LOCAL_MODELS_DIR,控制本地模型目录PASEO_DICTATION_LOCAL_STT_MODEL,覆盖本地听写 STT 模型PASEO_VOICE_LOCAL_STT_MODEL、PASEO_VOICE_LOCAL_TTS_MODEL,覆盖本地语音 STT/TTS 模型PASEO_DICTATION_LANGUAGE、PASEO_VOICE_LANGUAGE,覆盖听写和语音 STT 的语言PASEO_VOICE_LOCAL_TTS_SPEAKER_ID、PASEO_VOICE_LOCAL_TTS_SPEED,可选的本地语音 TTS 调优
Schema
要在编辑器中获得自动补全和校验,请把 $schema 设为:
https://paseo.sh/schemas/paseo.config.v1.json