Closes #926. ## What changes Recurring Missions now survive OpenCode restarts (update, crash and relaunch, reboot) without a manual **Resume**, and the scheduler offers more than "once a day at a fixed time". - **Native schedules.** OpenCode's own scheduler (`experimental.schedules`, OpenCode 2.2.3+) owns the calendar; Missions decides whether a passage may run (CAS admission, no duplicates, Pause/Stop, errors and uncertain states stay manual). A dedicated technical conversation with a local no-op model carries the wake, so wakes, titles and compaction make no provider HTTP requests. - **Richer scheduling**, in one collapsed **Scheduling** section of the Create/Edit editor (default: once, immediately, no condition): date, delay, interval (≥15 min), daily, chosen weekdays, up to eight times a day, day of month, native cron; optional end date/duration and a maximum number of launched passages; five event conditions (another schedule succeeds, a one-time Mission completes, new local commits, a new message in a followed conversation, explicit files change). Up to five upcoming dates are previewed in the saved IANA zone. - **Created paused, started with Play.** Everything is editable before the first launch; after it, edits follow the approved matrix (future parameters between passages, objective/notes journaled during a passage). - **Keep OpenCode running.** A Preferences setting supervises the shared OpenCode service through the OS (Windows Task Scheduler with a periodic recovery task, macOS LaunchAgent, Linux systemd user unit with lingering, WSL from Windows). ON by default at the first Play unless OFF was saved; OFF removes supervision without stopping OpenCode; a live service is never killed or duplicated. - **Existing daily schedules** keep their path and controls; no migration. - Help (English and nine translations) and dev-docs are updated. ## Validation - Typechecks (4 workspaces); server Missions/host-lifetime suites; UI unit tests 1945/1945; help 31/31 and build. - Real isolated OpenCode services (2.2.5, minimum 2.2.3): resting schedule resumes after service restart with no client and no Resume; 32 real passages with history/quota/phase preserved; concurrent wakes admit once; DST and catch-up for every frequency type; forced local auto-compaction and restart during maintenance with zero provider HTTP; real upgrade 2.2.3 → 2.2.5. - OS supervision on Windows, WSL, Ubuntu VM (two real reboots, healthy before login; OFF without a session) and macOS VM (Aqua session, crashes, OFF/adoption). On the final bundle: two real periodic Windows recovery relaunches; WSL OFF/Retry on a live HTTP 500 service keeps the same process. - Windows Electron and Tauri packages run in private profiles: paused creation, nine frequencies, preview. - Full browser suite: 956/957 in the last tier; the failure is `directory-browser.test.ts` (folder picker timeout), unchanged by this branch, and that file passes 20/20 on rerun. Earlier dev-baseline runs on the same machine also lost module loads to `net::ERR_NO_BUFFER_SPACE`. ## Known limits (not qualified in this PR) - macOS reboot followed by a real login, and a Windows host reboot/logon (needs a disposable bench). - Real screen-reader output (keyboard, ARIA and RTL checks pass). - Linux/macOS desktop packages. - OpenCode's background *pre*-compaction never applies to the technical wake conversations: their local model reports zero tokens, below the native minimum. Their automatic local compaction is qualified. ## Follow-up Integration with native `/goal` comes in a separate PR.
10 KiB
OpenCode 设置
CodeNomad 连接到执行主机上的共享 OpenCode 服务。选择 CLI、更新其文件、重启该服务和重新加载配置是不同操作,彼此不能替代。
选择或安装 CLI
- 打开设置 → OpenCode,使用 OpenCode 版本下方的 OpenCode 可执行文件卡片选择程序。
- 保持选中自动条目,以优先使用服务器 PATH(除非其中是较旧的 OpenCode),其次是用户 npm 的 OpenCode 2 安装;也可使用浏览可执行文件…,或输入路径并选择添加。
- 使用检查状态和更新。如果缺少 OpenCode,选择安装并启动 OpenCode;请先检查主机和安装范围。
- 如果设置流程提供连接并继续,请在解决报告的问题后使用它。
安装使用随附 Node/npm,进行与其他客户端共享的标准用户安装。为用户安装并配置 PATH会更改该用户的终端设置;之后请打开新终端。浏览器连接的是 CodeNomad 服务器:其文件选择器和可执行文件选择针对该服务器,而非浏览设备。
当 PATH 中排在最前面的是较旧的 OpenCode 时,提供的操作取决于其安装方式。对于通过 npm 安装的 OpenCode 1.x,用 OpenCode 2 替换 OpenCode {version} 会请求确认,移除该 npm 软件包,并在同一 npm 文件夹中安装 OpenCode 2;OpenCode 数据文件夹会保留,OpenCode 2 会自行导入 1.x 的对话。以其他方式(winget、Homebrew、手动)安装的较旧或不可用的 OpenCode 绝不会被修改:为 CodeNomad 安装 OpenCode 2 会在其旁边的用户 npm 文件夹中安装 OpenCode 2,之后 CodeNomad 使用该副本。如果该旧命令本身位于用户 npm 文件夹中(例如 ~/.local/bin 中的链接),或该文件夹不可写,设置会说明原因,而不提供此操作:移动或重命名该命令,或修复文件夹权限,然后选择检查状态和更新。终端中的 opencode 命令可能仍会启动旧版本。显式选择的自定义可执行文件绝不会被替换。
已安装可执行文件和正在运行的服务可能版本不同。请在 OpenCode 版本卡片中比较已安装版本和运行中的服务,不要假定选择另一个可执行文件就已替换活动守护进程;版本详情列出了最低版本和推荐版本。安装繁忙或可执行文件被锁定时,等待安装程序或进程释放它,检查状态后再重试;不要运行相互竞争的安装程序。
必需、推荐和未验证版本
| 分类 | 当前要求 | 含义 |
|---|---|---|
| 最低 | OpenCode 2.2.3 | 图像设置和 Design 扩展使用的图像生成工具、Code Mode 中 JavaScript 任务的正确执行顺序,以及原生重放和压缩格式;旧版本保存的对话在更新后仍可读取。 |
| 推荐 | OpenCode 2.2.5 | 已验证目标,与技术最低要求不同。 |
| 未验证 | 尚未完整验证的更新版本或自定义版本 | 不会仅因未经测试而拒绝;会检查所连接服务的实际 API 契约。 |
所连接的服务必须提供所需的会话、权限、Form、收件箱和会话环境契约。原生任务计划还会检查计划 API、插件/提供商包和实际生效的 experimental.schedules 设置。可用性取决于这些实际使用的能力,也适用于兼容的未来版本。如果设置报告运行中的服务不受支持,请选择/安装受支持的 CLI,并在准备好后显式重启共享服务。
主机、WSL 和共享服务范围
Windows 上,所选 WSL 可执行文件在其指定发行版中运行。请在那里安装/更新,并使用该发行版内有效的路径。WSL 连接依赖 Windows localhost 转发。Windows CLI 和 WSL CLI 不是可互换的执行环境。
OpenCode 管理其全局服务注册、会话、消息和数据库。CodeNomad 不会按窗口或项目创建私有 OpenCode 数据库。关闭项目标签页会在 CodeNomad 中关闭该项目;会话继续在 OpenCode 中运行,重新打开项目时会再次出现。CodeNomad 绝不会卸载原生 Location。关闭整个窗口、退出或重新加载会保留项目连接以便恢复;这些操作以及关闭后端都不会停止共享守护进程。参阅项目。
保持 OpenCode 运行
在首次启动 Mission 前,首次启动 Mission 时保持关闭 可保存显式关闭的选择,无需先安装监管。
在 设置 → OpenCode 中,保持 OpenCode 运行 会在执行主机上安装系统监管,由使用此服务的所有 CodeNomad 配置共享。它独立于 Missions 运行,即使 CodeNomad 已关闭也有效。若未提前显式关闭,首次启动 Mission 时会启用;创建暂停的 Mission 会保留此选择。暂停、停止或删除 Mission 均保留此偏好。
关闭会移除监管,OpenCode 继续运行但不再被自动重启。如需持续停止,请先关闭此项,再显式停止 OpenCode。监管启用时,opencode service stop 后会重新启动。
运行中 · 监管已生效 要求系统监管进程活跃且 OpenCode 服务健康。已安装 · 服务启动中、正在安装或移除监管… 和 监管失败 表示不同状态。仅服务有响应,监管仍属未确认。详情会在已知时显示原因、上次尝试、监管进程重试和系统恢复安全检查。检查监管状态 只读取;重试监管 显式修复请求的安装。未确认的操作会保留原始请求;重试原始操作 仅重新发送完全相同的操作。设置版本发生更改时,会刷新以供查看,而非覆盖。
Windows、macOS 和 WSL 在登录后启动。WSL 需要为所选发行版启用 localhost 转发。在原生 Linux 上,linger 会在登录前启动 所有已启用的用户服务,并在注销后保持运行。关闭时,仅当 linger 由 CodeNomad 启用且其他监管不再需要时才会恢复;个人设置会保留。如果在没有用户会话打开时恢复 linger 可能导致脱离监管的 OpenCode 进程停止,恢复操作会暂缓,并继续显示 重试监管。请在用户会话打开,或脱离监管的 OpenCode 进程退出、可以安全恢复后重试。如果 Linux 需要权限,请在执行主机上授权后重试;请求的偏好仍会保存。睡眠和休眠由操作系统控制。不可用或不受支持的执行主机会显示禁用的控件及说明。
更新、重启或重新加载
- 在设置 → OpenCode中选择检查状态和更新。
- 若要替换已安装 CLI 文件,在提供时选择更新到 OpenCode {version}。等待完成。
- 检查运行服务状态。只有打算为所有已连接客户端激活所选安装时,才使用重启共享服务。
- 若不安装任何内容而只重启进程,展开故障排查,选择重启 OpenCode 服务并确认。
| 操作 | 范围与影响 | 安全恢复 |
|---|---|---|
| 更新 CLI | 更改受支持的已安装可执行文件;不会隐式重启运行中的守护进程。 | 失败后检查已安装和运行中两个版本;解决错误后才显式重试。 |
| 重启服务 | 替换共享进程,中断所有已连接 OpenCode 客户端中的活动工作;保留会话历史。 | 健康运行中的原生任务计划会自动恢复;请检查待处理轮次及任何暂停、错误或不确定状态。现有每日条目需要继续。请单独检查一次性对话及其恢复控件;参见任务。 |
| 重新加载 OpenCode 配置 | 保留进程,但为所有客户端重建每个已加载 Location。取消待处理权限/Form,关闭终端/后台命令;可能中断活动工作。 | 重新加载后检查资源和待处理工作。不要仅因回复丢失而重复提示词或修改操作。 |
已保存配置或已安装插件仍不可用,且可以接受中断时,请显式使用重新加载 OpenCode 配置(运行中的服务支持时位于故障排查下)。它不是无害的显示刷新。CodeNomad 不会用所选的较旧 CLI 降级正在运行的较新守护进程。
会话环境
- 打开设置 → 高级并展开环境变量。
- 添加、更改或移除配置文件的覆盖值;每项更改都会立即保存。
- 通过 CodeNomad 发送下一条提示词、自定义命令或会话 Shell 请求,将当前环境应用到该对话。
这是配置文件范围的设置,在每次发送前由服务器端应用。仅打开/阅读对话或保存设置不会更改原生会话。移除覆盖值会恢复执行主机继承的值;若那里也没有则移除该变量。应用环境失败会阻止发送,而非使用过时值。
此环境控制该原生会话后续的本地 Shell 启动。已运行进程保留其环境。它不会重新配置提供商、MCP/LSP 服务器、独立终端或仅属于 Location 的后台 Shell。排队提示词不会各自捕获环境,其他 OpenCode 客户端也可能替换同一会话环境。不要假定完全在 OpenCode 内创建的子会话会收到 CodeNomad 发送时更新。
启动已停止服务时也会传递允许的变量;连接现有守护进程不会更改其进程环境。在 WSL 中,值会与 Linux 执行环境合并,而非 Windows PATH/HOME。更改这些覆盖值不会迁移 OpenCode 数据库或服务注册。
编辑原生配置文件
- 打开设置 → 配置文件并选择文件。
- 检查显示路径,编辑后选择保存。
- 使用重新加载重读文件;这不是重新加载 OpenCode 配置。
此编辑器仅提供其列出的全局 opencode.json 和 opencode.jsonc 文件,位于 CodeNomad 服务器用户的 .config/opencode 目录下。它不是任意文件编辑器、项目配置选择器,也不保证 WSL/自定义发现目录的守护进程会读取该文件。请通过显示路径验证目标;其他根目录使用守护进程自身工具处理。
保存按文本写入文件;不会验证整个原生配置或重启/重新加载 OpenCode。请与其他客户端协调编辑:此界面不提供外部更改合并。替换大量配置前请保留副本。切换文件或重新加载未保存草稿时,会询问是否丢弃。
针对具体配置的流程请参阅集成、提供商、任务和 OpenCode 文档。