farming-code 2.2.7 → 2.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +110 -199
  2. package/README.zh_cn.md +106 -237
  3. package/THIRD_PARTY_NOTICES.md +11 -2
  4. package/backend/acp-checkpoint-store.js +198 -0
  5. package/backend/acp-runtime.js +306 -83
  6. package/backend/acp-session-state.js +202 -6
  7. package/backend/acp-transcript.js +112 -0
  8. package/backend/agent-activity.js +6 -157
  9. package/backend/agent-manager.js +1496 -737
  10. package/backend/agent-provider-session.js +17 -242
  11. package/backend/agent-runtime-binding.js +219 -0
  12. package/backend/agent-session-history.js +66 -1
  13. package/backend/auth.js +79 -6
  14. package/backend/codex-models.js +81 -84
  15. package/backend/codex-session-archive.js +45 -0
  16. package/backend/codex-terminal-profile.js +500 -0
  17. package/backend/codex-transcript-sanitizer.js +12 -0
  18. package/backend/codex-transcript.js +230 -8
  19. package/backend/config-manager.js +30 -0
  20. package/backend/control-api.js +192 -17
  21. package/backend/farming-net-pass.js +285 -0
  22. package/backend/farming-net-registry.js +112 -0
  23. package/backend/farming-net-server.js +298 -0
  24. package/backend/farming-session-store.js +5 -13
  25. package/backend/git-worktree-info.js +181 -0
  26. package/backend/local-session-engine.js +411 -186
  27. package/backend/main-page-session.js +5 -2
  28. package/backend/native-pty-controller-generation.js +106 -0
  29. package/backend/native-pty-host-client.js +275 -7
  30. package/backend/native-pty-host-identity.js +86 -0
  31. package/backend/native-pty-host.js +813 -114
  32. package/backend/native-session-engine.js +100 -28
  33. package/backend/packaged-node-pty.js +22 -2
  34. package/backend/provider-adapters.js +253 -0
  35. package/backend/provider-session-service.js +241 -0
  36. package/backend/runtime-observation.js +81 -0
  37. package/backend/server.js +294 -86
  38. package/backend/session-engine-bridge.js +21 -2
  39. package/backend/session-engine-router.js +1 -1
  40. package/backend/session-engine.js +1 -1
  41. package/backend/session-stream-protocol.js +185 -0
  42. package/backend/storage-layout.js +55 -0
  43. package/backend/terminal-attach-checkpoint.js +74 -0
  44. package/backend/terminal-exit-quiescence.js +39 -0
  45. package/backend/terminal-reducer-flow-control.js +97 -0
  46. package/backend/terminal-screen-state.js +11 -2
  47. package/backend/terminal-screen-worker-pool.js +59 -6
  48. package/backend/terminal-screen-worker-thread.js +97 -57
  49. package/backend/terminal-screen-worker.js +133 -51
  50. package/backend/terminal-state-serialization.js +127 -0
  51. package/backend/terminal-status.js +23 -4
  52. package/backend/usage-monitor.js +81 -4
  53. package/backend/workspace-directory.js +152 -0
  54. package/backend/workspace-file-router.js +182 -76
  55. package/backend/workspace-file-service.js +319 -4
  56. package/backend/workspace-root-registry.js +164 -0
  57. package/dist/assets/App-CHYpgECZ.js +208 -0
  58. package/dist/assets/{FileEditorMarkdownPreview-elKWc8Im.js → FileEditorMarkdownPreview--Cri80nQ.js} +92 -92
  59. package/dist/assets/FileEditorPane-DGJlEKdf.js +2 -0
  60. package/dist/assets/IconGlyphs-Cc14sepw.js +1 -0
  61. package/dist/assets/ProjectFilesSection-Cz1wG4NT.js +12 -0
  62. package/dist/assets/{ReviewPage-BaXu1ZdX.js → ReviewPage-LonRc6Fz.js} +1 -1
  63. package/dist/assets/code-dark-B1pAtO_P.css +1 -0
  64. package/dist/assets/file-icons-Bw2qd5iT.js +1 -0
  65. package/dist/assets/{index-B8SHldPE.js → index-miO2r9IZ.js} +3 -3
  66. package/dist/assets/main-DNe0jPw-.css +1 -0
  67. package/dist/assets/workspace-editor-model-BQol4qbA.js +1 -0
  68. package/dist/assets/workspace-editor-monaco-5gFbeDPF.js +1 -0
  69. package/dist/assets/workspace-editor-monaco-xPv8JzHH.js +4 -0
  70. package/dist/assets/workspace-view-state-DvYG_9PH.js +7 -0
  71. package/dist/assets/workspace-working-copy-D8-s_Sgh.js +1 -0
  72. package/dist/index.html +1 -1
  73. package/frontend/farming-net/app.css +625 -0
  74. package/frontend/farming-net/app.js +268 -0
  75. package/frontend/farming-net/index.html +86 -0
  76. package/frontend/reading-anchor.js +198 -0
  77. package/frontend/session-bridge.js +12 -3
  78. package/frontend/session-modal-bridge.js +5 -12
  79. package/frontend/skins/crt/app.js +1976 -793
  80. package/frontend/skins/crt/index.html +313 -23
  81. package/frontend/skins/crt/styles/billing.css +294 -223
  82. package/frontend/skins/crt/styles/monochrome-green.css +7 -2
  83. package/frontend/terminal-replay.js +372 -0
  84. package/package.json +10 -3
  85. package/shared/browser-protocol.d.ts +5 -0
  86. package/shared/browser-protocol.js +130 -0
  87. package/dist/assets/App-iA2BU9P6.js +0 -124
  88. package/dist/assets/FileEditorPane-RWiFD2cq.js +0 -5
  89. package/dist/assets/IconGlyphs-DfL0EBnj.js +0 -1
  90. package/dist/assets/ProjectFilesSection-Q4PDsWmM.js +0 -12
  91. package/dist/assets/code-dark-CDkOQAtK.css +0 -1
  92. package/dist/assets/file-icons-EFUGSSwf.js +0 -1
  93. package/dist/assets/main-DpYuBonn.css +0 -1
  94. package/dist/assets/qoder-C9LmmOSf.svg +0 -1
  95. package/dist/assets/qoder-Cf9gl0Y5.svg +0 -1
  96. package/dist/assets/qoder-gHCinseV.svg +0 -1
  97. package/dist/assets/workspace-view-state-CTyDzk2D.js +0 -1
  98. package/dist/assets/zsh-CLpveKlF.svg +0 -1
  99. package/dist/assets/zsh-FxSpMPbz.svg +0 -1
  100. /package/dist/assets/{api-D1lyBYIQ.js → api-D8nyOEbz.js} +0 -0
  101. /package/dist/assets/{core-ZlAPicox.js → core-D0LFJkDt.js} +0 -0
  102. /package/dist/assets/{useWorkspaceMenuKeyboard-CneKAZUJ.js → useWorkspaceMenuKeyboard-Brws6Ar9.js} +0 -0
package/README.zh_cn.md CHANGED
@@ -9,321 +9,190 @@
9
9
  ![Node](https://img.shields.io/badge/node-%3E%3D22-339933?logo=nodedotjs&logoColor=white)
10
10
  ![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux-555)
11
11
 
12
- Farming 是一个面向 AI coding agent 的远程浏览器工作台。当前公开版本是 **Farming 2**。
12
+ Farming 是一个开源、可自定义、运行在开发机上的浏览器 AI Coding Agent 工作台。它把多个实时 Agent、结构化对话、真实终端、项目文件、Review、历史记录和运行时控制放在一起,同时代码仓库和 Agent 进程仍然留在开发机上。
13
13
 
14
- 它当前已经把远程 terminal、Codex / Claude Code、历史 session、项目级 agent、打开的编辑器、项目文件、搜索、轻量编辑、git review、usage 和机器状态收进同一个页面,减少人在 SSH、IDE、浏览器、监控页面和 agent 面板之间反复切换。
15
-
16
- 远程托管和多端浏览器接入是 Farming 的内核能力:agent、shell、项目文件和 git 状态都留在远程机器上持续运行;用户可以从电脑端浏览器做长时间操作,也可以从手机浏览器随时回到现场,看进度、切 session,或者做一次轻量介入。Farming 2 把这套能力组织成一个面向 Codex / Claude Code 的浏览器工作台,当前默认 UI 皮肤叫 Farming Code。
17
-
18
- 浏览器现在通过同一个后端提供两套实时 UI:`/farming/code/` 是 Farming Code,`/farming/crt/` 是原始 CRT 界面;`/farming/` 仍默认打开 Farming Code。当 Code 无法启动或渲染时,故障页面会在错误详情浮层后显示仍连接当前 Agent 的 CRT 界面,不会重启正在运行的 Agent。
19
-
20
- 产品介绍、截图和架构图见 [Farming 2 Wiki](https://github.com/zhuwenzhuang/farming/wiki)。
21
-
22
- ![Farming Code 工作台](./docs/products/code/assets/01-code-workspace.png)
23
-
24
- > 如果你是参与本仓库开发的 AI Agent,请先阅读 [`AGENTS.md`](./AGENTS.md),中文版本见 [`AGENTS.zh_cn.md`](./AGENTS.zh_cn.md)。
25
-
26
- ## 当前价值与长期目标
27
-
28
- 当前阶段,Farming 做的是一件很实在的事:把指挥 AI coding agent 时最常打开的工具能力放到一起。用户可以在同一个远程工作台里看 live terminal、恢复 Codex / Claude session、检查文件、搜索代码、做小修改、看 blame、看 usage 和 CPU/MEM 状态。它不是完整 IDE,也不是新的 agent 模型;它先把“观察现场”和“轻量介入”这两个高频动作变短。
29
-
30
- 远程托管是这里的关键价值。长任务可以继续跑在 Linux 开发机上,浏览器只是进入现场的入口;电脑端适合编辑、搜索、审查和长时间跟进,手机端适合离开电脑后查看状态、确认输出、发一句输入或启动一个简单 agent。这样用户不用把本地机器、远程 shell、agent session 和项目文件拆成几套上下文来回维护。
31
-
32
- 更长期的目标仍然是人的注意力管理。人类注意力有限,也没有真正的多线程处理能力;当多个 agent 同时工作时,真正消耗人的不是某一个终端,而是在不同页面、不同任务状态和不同上下文之间反复切换。
33
-
34
- Farming 未来希望探索的是:让系统逐步判断哪些 agent 值得关注,哪些任务只是后台推进,哪些变化需要汇报,哪些地方需要人介入。Main Agent 是这个方向上的长期机制:它最终应该结合 Codex、Claude Code、shell agent 和更多工具型 agent,观察任务状态、组织子 agent、汇总进展,并减少人的上下文切换。
35
-
36
- 这部分仍在探索中,是 Farming 的终极目标;Farming 2 先把工具整合和远程工作台体验做好,作为后续 Main Agent 和多 agent 注意力管理能力的基础。
37
-
38
- ## Farming 2 带来的变化
39
-
40
- Farming 2 是本仓库最近最大的一次产品变化。它把 Farming 从一个较轻的复古 agent monitor,推进成了更实用的远程 coding workbench,也为长期的 Main Agent 注意力管理目标补齐底座:
41
-
42
- - 在浏览器里启动和管理 Codex、Claude、OpenCode、Qoder、bash 和 zsh session;
43
- - 发现并恢复 Codex、Claude、OpenCode 和 Qoder 的本地历史 session,再重新接入 Farming 托管的实时 terminal;
44
- - Codex / Claude 启动选项按 provider 收敛,不展示当前 agent 无法表达的控件;
45
- - 在一个工作区里组织 project-scoped agents、pinned/unread sessions、Search、History 和 active terminals;
46
- - 提供 Project Files:Open Editors、文件树、文件搜索、Monaco 编辑、Markdown/图片预览、git changes、git diff、行级 git blame;
47
- - terminal 输出里的 `path:line` 可直接打开文件,`http(s)` URL 可直接在新标签页打开;
48
- - Codex / Claude Composer 暴露底层运行时能表达的启动权限、模型和速度 profile;App Server Codex 会直接更新当前 thread 的权限,terminal-owned session 切换权限时才重启 CLI:已有 provider Session ID 时 resume,还没有可 resume 的 ID 时启动新会话;
49
- - Composer 支持文本附件;粘贴或选择图片时会保存到 Farming 服务侧 `~/.farming/attachments`,并把图片路径插入消息,便于远端 Codex / Claude 读取;Farming 自动生成的图片附件默认保留 7 天后清理;
50
- - 显示轻量 usage、context、token rate、quota 与机器状态,例如 CPU、MEM;
51
- - 复用 Farming 的远程托管和多端浏览器接入能力,让桌面和手机访问同一套远程 Linux 服务。
52
-
53
- 具体截图、安装方式和产品说明见 [Farming 2 产品介绍](./docs/products/code/README.zh_cn.md)。
14
+ Coding CLI 已经能正常工作的开发机上运行 Farming,就可以从电脑或手机回到同一批任务。关闭浏览器不会停止 Agent;Farming Server 重启时,独立的原生 PTY Host 也可以保留正在运行的终端会话。
54
15
 
55
16
  ## 快速开始
56
17
 
57
- 默认推荐通过 npm 安装,把 Farming 运行在已经能正常执行 `codex` 或 `claude` 的开发机上。
18
+ 准备好 Node.js 22 或更新版本,以及至少一个已安装、已登录的受支持 Coding CLI,然后用一行命令安装并启动 Farming:
58
19
 
59
20
  ```bash
60
- npm install --global farming-code
61
- farming daemon
21
+ npm install --global farming-code@latest && farming daemon
62
22
  ```
63
23
 
64
- 默认端口是 `6694`,浏览器路径是 `/farming`,配置目录是 `~/.farming`,并默认启用 token auth。首次鉴权启动会生成一个随机但可读的口令,并保存到 `~/.farming/.session-token`;之后重启和升级都会复用这个 token,除非显式设置 `FARMING_TOKEN`。在中文时区默认是中文俳句式口令,日本时区默认是日文俳句式口令,其它时区默认是英文短语。启动日志会打印类似下面的 URL:
24
+ 打开命令输出的带鉴权 URL,选择 **New Agent**、Agent 类型和 Workspace,然后从 Chat Terminal 开始工作。
65
25
 
66
- ```text
67
- http://linux-host:6694/farming?token=<startup-token>
68
- ```
26
+ ![Farming Code 工作台](./docs/products/code/assets/01-code-workspace.png)
69
27
 
70
- 把完整 URL 复制到桌面或手机浏览器中打开,点击 `New Agent`,选择 `Codex`、`Claude Code`、`bash` 或 `zsh`,填入 workspace,就可以进入远程工作台。
28
+ ## 两套界面,同一套运行时
71
29
 
72
- ## 下载与部署形态
30
+ Farming 2 在同一批 Agent 和 Session 上提供两套完整的浏览器界面。
73
31
 
74
- npm 包是默认发布形态;也可以从 [GitHub Releases](https://github.com/zhuwenzhuang/farming/releases) 下载手动安装产物。
32
+ ### Farming Code
75
33
 
76
- Farming 2 当前有三种实际部署形态:
34
+ 默认工作台,适合阅读对话、介入任务、编辑文件和检查工作区修改。
77
35
 
78
- | 环境 | 产物 | 适用场景 |
79
- | --- | --- | --- |
80
- | macOS 与 Linux | `npm install --global farming-code` | 默认路径,需要 Node.js 22+,并且系统 runtime 能加载 `node-pty`。 |
81
- | 不使用 npm 的环境 | GitHub Releases 平台 CLI | 手动安装,升级也需要手动替换。 |
82
- | 目录部署 | `farming-<version>-<platform>-<arch>.tar.gz` | 包含 production dependencies 和 launcher 脚本的 App Bundle,直接使用目标系统 runtime。 |
83
- | 老 Linux x64(glibc < 2.28) | `farming-<version>-linux-x64-legacy-glibc228.tar.gz` | 带固定 glibc 2.28 runtime 的首次安装引导包。它把 Farming 安装到 `~/.farming/npm`;后续与普通 npm 安装一样一键更新。目标机仍需 Node.js 22 和 npm。 |
84
- | 自建老 Linux 包 | `farming-<version>-linux-x64-glibc217.tar.gz` | 独立构建的兼容包;基于 glibc 2.17 重新编译 `node-pty`,但仍要求目标机有可用的 Node.js runtime。 |
36
+ ![Farming Code 结构化 Chat](./docs/products/code/assets/11-code-agent-process.png)
85
37
 
86
- 如果要通过 Farming 启动 Codex 或 Claude Code,同一台机器上仍然需要提前安装并登录对应 CLI。Farming 托管的是这些 CLI session,不替代它们自己的安装和账号流程。
38
+ ### Farming CRT
87
39
 
88
- ## 架构
40
+ 键盘优先的控制室,适合同时观察多个 Agent、打开结构化 Chat 或原生 Terminal、搜索历史和查看实时用量遥测。
89
41
 
90
- ```text
91
- 浏览器皮肤
92
- React + Vite + Monaco + terminal renderer
93
- |
94
- | HTTP / WebSocket
95
- v
96
- Farming 内核
97
- Express server + token auth + agent manager + session providers
98
- |
99
- | native pty host + session engine
100
- v
101
- 执行环境
102
- bash / zsh / Codex / Claude Code
103
- ```
42
+ ![Farming CRT 控制台](./docs/products/crt/assets/01-crt-dashboard.png)
104
43
 
105
- 内核负责 agent 生命周期、WebSocket 状态同步、session engine、workspace 文件 API、历史 session provider、模型/profile 发现、usage 采集和配置管理。产品皮肤负责把这些能力组织成不同体验。新的交互 session 默认使用 native pty host:node-pty agent 进程放在独立 host 进程里,Farming server 和浏览器可以重新连回仍存活的 terminal。native pty host 默认会跨 Farming server 重启保留;当没有 live session 和 client 后会在空闲宽限期后退出。只有希望 host 跟随 server 一起退出时才设置 `FARMING_NATIVE_PTY_HOST_PERSIST=0`。只有调试进程内 node-pty engine 时才设置 `FARMING_SESSION_ENGINE=local`。
44
+ | | Farming Code | Farming CRT |
45
+ | --- | --- | --- |
46
+ | 更适合 | 长对话、文件、编辑、Diff、Review | 总览监控、键盘控制、终端操作、遥测 |
47
+ | 实时 Session | 结构化 Chat 与真实 PTY Terminal | 磷光风格 Chat 与真实 xterm Terminal |
48
+ | 导航方式 | 项目侧栏、Search、History、Files | 稳定 Agent 机位和键盘控制台 |
49
+ | 外观 | 浅色与深色 | CRT 效果、终端字号、可选 Dynamic Heat |
50
+ | 入口 | `/farming/code/` 或 `/farming/` | `/farming/crt/` |
106
51
 
107
- 浏览器 terminal renderer 默认使用 xterm.js。旧的 Ghostty web renderer 仍保留为显式调试路径,可通过 `localStorage.farmingTerminalEngine = 'ghostty'` 切换。
52
+ 切换界面不会重启或复制 Agent。如果 Farming Code 启动或渲染失败,有限范围的诊断层仍会保留后面的实时 CRT 界面,而不是把正在运行的 Session 一起遮掉。
108
53
 
109
- ## 安装与发布
54
+ 完整能力矩阵和截图导览见 [Farming 2 产品总览](./docs/products/README.zh_cn.md)。两套界面的完整流程分别见 [Farming Code 指南](./docs/products/code/README.zh_cn.md) 和 [Farming CRT 指南](./docs/products/crt/README.zh_cn.md)。
110
55
 
111
- Farming 2 最适合运行在一台 Linux 开发机上;这台机器里应当已经能在普通 SSH shell 中正常运行 Codex 或 Claude Code。
56
+ ## Farming Net:部署门户
112
57
 
113
- 默认安装方式:
58
+ Farming Net 是一套独立、带 Token 鉴权的 Farming 环境目录。卡片可以指向当前设备、远程开发机、内网地址或隧道中的 Farming;已登记的目标接受短时签名通行证,让用户只保留一个门户登录,不再分别记录每个部署地址和目标 Token。
114
59
 
115
60
  ```bash
116
- npm install --global farming-code
117
- farming daemon
61
+ FARMING_NET_PORT=6693 FARMING_NET_BASE_PATH=/farming-net npm run start:net
118
62
  ```
119
63
 
120
- npm 安装后可在 **设置 更新** 一键升级。Farming 会先在旧服务仍运行时完成 npm 安装,安装成功后才重启;如果新服务无法启动,会尝试恢复旧版本。等价的手动命令是 `npm install --global farming-code@latest`。
64
+ 门户自己的 Token、签名身份和私有 `instances.json` 注册表放在 `~/.farming-net/`。它不代理目标流量,也不保存目标 Token;每个目标仍是独立 Farming 服务,并且主动决定是否信任门户。登记方式和安全边界见 [Farming Net 指南](./docs/products/net/README.zh_cn.md)。
121
65
 
122
- 兼容发布形态主要有两种:
66
+ ## 现在可以做什么
123
67
 
124
- - 单文件 CLI:适合现代 Linux 和 macOS,拿到一个 `farming` 可执行文件后直接运行。
125
- - App bundle:适合目录式部署;包是一个 tarball,解压后通过根目录 `./farming` 脚本启动,脚本负责 Node heap 和运行环境。
68
+ - 按项目组织实时 Agent,置顶或重命名重点工作、查看未读状态、搜索实时与历史 Session,并归档或恢复任务。
69
+ - Codex、Claude Code、OpenCode Qoder 使用结构化 ACP Chat。计划、推理、工具调用、权限请求、内嵌终端、子 Session、附件、排队追问和精确修改摘要都可以保留,但不会淹没最终答案。
70
+ - 在结构化 Chat 与真实 PTY Terminal 之间切换同一个 Provider Session。支持的 Codex 模型、思考强度、Fast、Ultra 和权限修改会作用到实时工作流;兼容 Terminal 会立即应用模型修改,并在接受下一条 Composer 消息前确认 CLI 的真实状态。
71
+ - 浏览、搜索并轻量编辑 Project Files,通过复用 VS Code 图算法的 Git History 查看提交树与变更文件,检查 Git Changes、Diff 和 Blame,再把 Commit 或 Working Copy 修改送入带 Revision、行内评论和 Reviewed 状态的 Review。
72
+ - 在 Provider 提供所需数据时查看 CPU/MEM、Token Rate、Context、Quota、Provider 用量,以及 CRT 的按日/实时 Token 遥测。
73
+ - 从电脑或手机继续同一个 Farming Code 任务,Agent 进程始终留在开发机上。
126
74
 
127
- 源码远程部署脚本是开发团队把当前 checkout 部署到固定 Linux 机器的便捷路径。
75
+ ![Farming Code 项目文件与 Blame](./docs/products/code/assets/04-files-editor-blame.png)
128
76
 
129
- 如果要启动 Codex Claude Code,目标机器上还需要提前安装并登录对应 CLI,确保在普通 SSH shell 中直接运行 `codex` 或 `claude` 能进入交互。
77
+ ![Files 中分开的已跟踪与未跟踪 Review 入口](./docs/products/code/assets/10-review-workflow.png)
130
78
 
131
- ### 从源码打包
79
+ ## 支持的 Agent 路径
132
80
 
133
- 构建单文件 CLI
134
-
135
- ```bash
136
- npm install
137
- npm run release:cli
138
- ```
81
+ Farming 会发现开发机上已经安装的 CLI。有 ACP 支持的 Provider 使用更完整的结构化运行时,其他检测到的 Coding Agent 仍然可以作为一等 Terminal Session 使用。
139
82
 
140
- 构建可解压运行的 app bundle:
83
+ | Agent | 结构化 Chat | 原生 Terminal | History / Resume |
84
+ | --- | --- | --- | --- |
85
+ | Codex | ACP | 是 | 是 |
86
+ | Claude Code | ACP | 是 | 是 |
87
+ | OpenCode | ACP | 是 | 是 |
88
+ | Qoder | ACP | 是 | 是 |
89
+ | Qwen Code | — | 是 | 取决于 CLI |
90
+ | Aider | — | 是 | 取决于 CLI |
91
+ | GitHub Copilot CLI | — | 是 | 取决于 CLI |
92
+ | Amazon Q | — | 是 | 取决于 CLI |
93
+ | bash / zsh | — | 是 | 没有 Provider Session Resume |
141
94
 
142
- ```bash
143
- npm install
144
- npm run release:app
145
- ```
95
+ Farming 承载的是已经能在同一台机器正常工作的 CLI,不替代 Provider 的安装、登录和账户配置。
146
96
 
147
- `release:app` 会生成 `releases/<version>/farming-<version>-<platform>-<arch>.tar.gz`,包内包含已经构建好的前端、production dependencies 和根目录启动脚本,使用目标系统 runtime。
97
+ ## 运行默认值与 Daemon 命令
148
98
 
149
- 如果目标是 glibc 低于 2.28 Linux x64,构建带固定 glibc 2.28 runtime 的发布资产:
99
+ 默认端口是 `6694`,Base Path `/farming`,配置目录是 `~/.farming`,Token 鉴权默认开启。启动日志会打印类似下面的 URL:
150
100
 
151
- ```bash
152
- npm run release:app:legacy-linux
153
- ```
154
-
155
- 它会生成 `farming-<version>-linux-x64-legacy-glibc228.tar.gz`。这是首次安装引导包:安装器把 runtime 解压到 `~/.farming/glibc228`,把包内 Farming 版本放入私有 prefix `~/.farming/npm`,并生成稳定入口 `~/.farming/bin/farming`。后续普通版本更新直接通过 npm 安装到同一 prefix,再用兼容 launcher 重启;不需要反复下载兼容 tar。
156
-
157
- 如果只需要将 `node-pty` 编译到更低 ABI,仍可在干净的 Linux x64 构建环境中准备 glibc 2.17、Node.js 22+、GCC/G++、Make 和 Python 3,然后运行:
158
-
159
- ```bash
160
- npm run release:app:linux-compat
101
+ ```text
102
+ http://development-host:6694/farming?token=<startup-token>
161
103
  ```
162
104
 
163
- 该命令会强制从源码编译 `node-pty`,并在其 native module 依赖高于 glibc 2.17 时拒绝产物。远程安装使用 `FARMING_REMOTE=user@host FARMING_RELEASE_TARBALL=<archive> npm run release:remote:linux-compat`。这个 ABI 包仍使用目标机器自己的 Node.js 和 libc。
164
-
165
- 如果已经在配置好的 Linux x64 构建机上准备了干净源码,`scripts/build-linux-compat-release-on-builder.sh` 可以继续自动完成容器构建、ABI 校验、打包后 bash Agent 冒烟和产物输出。通过 `FARMING_COMPAT_IMAGE` 指定构建机上已经存在的镜像。脚本使用 `--pull=never`,并默认关闭容器网络,以复用已有镜像和缓存,避免发布时隐式下载构建环境;只有确实需要主动刷新缓存时才设置 `FARMING_COMPAT_ALLOW_NETWORK=1`。
166
-
167
- ### 启动单文件 CLI
168
-
169
- 拿到对应平台的单文件 `farming` 后:
105
+ 常用守护进程命令:
170
106
 
171
107
  ```bash
172
- chmod +x farming
173
- ./farming daemon
108
+ farming status
109
+ farming url
110
+ farming logs
111
+ farming stop
174
112
  ```
175
113
 
176
- 它会优先监听 `6694`、挂载到 `/farming`,并自动创建 `~/.farming/settings.json`、token 文件和必要运行目录;如果未显式指定端口且 `6694` 已占用,会自动上探选择可用端口。启动后终端会打印带 token 的浏览器 URL。前台运行可直接执行 `./farming` 或 `./farming start`;常用管理命令是 `./farming status`、`./farming logs`、`./farming stop`。
177
-
178
- ### 启动 app bundle
179
-
180
- 普通 Linux 上:
181
-
182
- ```bash
183
- tar -xzf farming-<version>-linux-x64.tar.gz
184
- cd farming-<version>-linux-x64
185
- ./farming
186
- ```
114
+ 第一次带鉴权启动会把随机、可读的 Token 写入 `~/.farming/.session-token`;后续重启和升级都会复用,除非显式设置 `FARMING_TOKEN`。Token 默认根据时区使用中文、日文或英文。
187
115
 
188
- 标准包的启动脚本直接使用目标机器的普通 Node.js 和 native runtime。glibc 低于 2.28 的 Linux x64 请改用 `-legacy-glibc228` 包并执行一次 `./farming` 完成引导;之后使用 `~/.farming/bin/farming`。这个稳定入口保证 npm 更新、server 重启和 PTY 子进程都继续经过兼容 runtime。
116
+ ![启动 Agent](./docs/products/code/assets/02-start-agent-picker.png)
189
117
 
190
- App bundle 常用命令:
118
+ ## 桌面与手机
191
119
 
192
- ```bash
193
- ./farming status
194
- ./farming logs
195
- ./farming stop
196
- ./farming start
197
- ./farming url
198
- ```
120
+ 桌面端把项目、对话、文件和 Review 放在彼此靠近的位置。移动端一次聚焦一段对话、一个终端或一个文件,并把导航移入抽屉,更适合查看进度和发送短介入。
199
121
 
200
- ### 源码远程部署
122
+ <p align="center">
123
+ <img src="./docs/products/code/assets/05-mobile-agent-chat.jpg" alt="Farming Code 手机界面" width="320">
124
+ </p>
201
125
 
202
- 如果本机可以 SSH 到目标 Linux,且已经配置 `config/farming.deploy.env`:
126
+ Farming CRT 当前只作为桌面界面使用。手机请使用 Farming Code;CRT 手机方案目前仍是概念设计,不属于已支持的产品能力。
203
127
 
204
- ```bash
205
- npm run release:remote
206
- ```
128
+ ## 安装与更新
207
129
 
208
- 这条路径会从当前源码 checkout 构建 app bundle、上传到远端、安装并启动服务,适合团队开发和 dogfood。
130
+ npm 包是默认分发方式。**Settings Updates** 可以原地升级 npm 安装:Farming 会在当前 Server 仍运行时安装新包,只在安装成功后重启;新 Server 无法启动时会尝试回退。
209
131
 
210
- ### 开发调试
132
+ GitHub Releases 也提供独立 CLI 和目录 Bundle。旧版 Linux x64 可以用 `linux-x64-legacy-glibc228` 完成第一次安装,后续应用更新继续使用同一个私有 npm Prefix。受控环境还可以单独构建 glibc 2.17 ABI Bundle。当前产物和版本说明见 [GitHub Releases](https://github.com/zhuwenzhuang/farming/releases)。
211
133
 
212
- 只在本地开发 Farming 本身时,才需要直接启动源码服务:
134
+ 从源码开发:
213
135
 
214
136
  ```bash
215
137
  npm install
216
138
  npm start
217
139
  ```
218
140
 
219
- 服务启动后会打印一个 token URL。仅在可信本地开发环境中,可以关闭 token 校验:
220
-
221
- ```bash
222
- npm run start:no-auth
223
- ```
224
-
225
- 远程安装和 release 细节见 [`docs/products/code/README.zh_cn.md`](./docs/products/code/README.zh_cn.md)。
226
-
227
- ## 配置
228
-
229
- 运行时配置存储在 `~/.farming/settings.json`。
230
- Agent session 元数据单独存储在 `~/.farming/sessions/`。Farming 使用稳定的
231
- `fsess_*` 文件作为自己的 Agent 记录;live `agent-...` id 以及 Codex / Claude
232
- provider session id 都作为这些记录上的元数据保存。主页面 Projects membership
233
- 存放在 `sessions/index.json`,`mainPageSessionKeys` 只是为兼容 API 暴露出来的投影。
234
- 归档 run/history 存储在 `~/.farming/history/runs.json`,不属于 `settings.json`。
235
- 主题覆盖配置、启动 token、server pid/state/log 文件和 native pty host 日志也都在同一个 config 目录下。
236
-
237
- 主要用户配置项:
238
-
239
- - `defaultLaunchAgent`:New Agent 默认 provider,目前是 `codex` 或 `claude`;
240
- - `agentLaunchProfiles.codex`:Codex 的启动权限、模型、reasoning、service tier profile;
241
- - `agentLaunchProfiles.claude`:Claude 的启动 permission、model、effort profile;
242
- - `agentHomes`:管理 Codex、Claude、OpenCode、Qoder 的 agent home 元数据,每项只包含 `id` 和 `path`;每个 provider 都保留不可删除的 `default` home;
243
- - `workspaceHistory`:New Agent 启动时使用的最近 workspace;
244
- - `dangerouslySkipAgentPermissionsByDefault`:是否默认让支持的 coding agent(如 Codex、Claude、OpenCode、Qoder、Qwen、Aider、GitHub Copilot CLI、Amazon Q)使用各自最激进的权限绕过启动 flag。
245
-
246
- Native terminal session 由 Farming pty host 托管,通过从 `configDir` 派生的本地 socket 连接。默认保留 host 以支持 server 重启恢复;最后一个 live session 和 client 都消失后,host 会在短暂空闲宽限期后自退出。后续 terminal runtime 工作应面向 native pty host 和 xterm.js 链路。
247
-
248
- 更新行为跟随安装方式:普通 npm 安装和通过 `-legacy-glibc228.tar.gz` 引导的老 Linux 安装都读取 npm registry,并在 **设置 → 更新** 提供一键升级。更新先安装到原有 npm prefix,旧服务在安装期间继续运行;随后重启,新服务启动失败时回退。源码 checkout 通过 Git 更新,单文件 CLI 手动替换。标准 App bundle 仍作为目录部署路径,可使用保存在 `settings.updateUrl` 中的可信 HTTP(S) 包目录或 manifest URL。
141
+ 只有在可信本地开发环境中,才可以用 `npm run start:no-auth` 关闭 Token 鉴权。
249
142
 
250
- 最简单的更新源是一个以 `/` 结尾的 HTTP(S) 目录 URL,目录里列出带平台标记的 `farming-<version>-<platform>-<arch>.tar.gz` app bundle,并为每个 bundle 提供相邻的 `<bundle>.sha256` 文件。Farming 会在解压前校验所选 bundle 的 SHA-256 与归档路径,再运行 installer。
143
+ ## 工作原理
251
144
 
252
- 部署配置模板位于 `config/`:
145
+ ```text
146
+ Farming Code / Farming CRT
147
+ React, Monaco, xterm.js, CRT browser skin
148
+ │ HTTP + WebSocket
149
+
150
+ Farming core
151
+ auth, Agent manager, ACP, history, files, review, usage
152
+ │ native PTY host + session providers
153
+
154
+ Development host
155
+ repositories, shells, Codex, Claude Code, OpenCode, Qoder, ...
156
+ ```
253
157
 
254
- - `config/farming.deploy.env.example`
255
- - `config/farming.install.env.example`
158
+ 后端负责生命周期、鉴权、Session 路由、Workspace 边界、History 和配置。交互式 Terminal 默认由独立的原生 PTY Host 持有,因此浏览器和 Server 可以重新连接,而不需要替换实际进程。xterm.js WebGL 是唯一受支持的产品 Terminal Renderer;Ghostty Web Adapter 只保留为显式调试路径,不作为运行时 Fallback。
256
159
 
257
- 真实 `.env` 配置文件会被 git 忽略。
160
+ 运行时设置存放在 `~/.farming/settings.json`。Farming Session 元数据、项目成员索引、归档运行、主题设置、更新状态、日志和启动 Token 使用 `~/.farming/` 下彼此独立的文件。外部 Provider History 仍然只读。
258
161
 
259
162
  ## 安全
260
163
 
261
- Farming 可以控制目标机器上的真实 terminal 和 agent 进程,适合运行在可信开发机和可信网络中。不要在没有 VPN、SSH tunnel、HTTPS 反向代理或网络 ACL 等额外安全层的情况下直接暴露到公网。
262
-
263
- 启动 token 会同时保护 HTTP 页面和 WebSocket 连接。它在首次鉴权启动时随机生成,持久保存到 `~/.farming/.session-token`,并在后续重启和升级中复用。生成的新 token 刻意做成比长十六进制串更容易复制的可读口令:中文时区默认生成中文俳句式口令,日本时区默认生成日文俳句式口令,其它时区默认生成英文短语;也可以用 `FARMING_TOKEN_LOCALE=zh|ja|en|auto` 显式指定新 token 的生成语言。
264
-
265
- `FARMING_DISABLE_AUTH=1` 只应该用于可信本地开发环境。terminal-owned 的 Codex / Claude session 切换权限时会用所选 flag 重启 CLI:已有 provider Session ID 时会 resume,还没有可 resume 的 ID 时启动新会话。App Server Codex 则直接在当前 thread 上更新审批和 sandbox 策略,不启动 CLI。
266
-
267
- 安全上报和部署注意事项见 [SECURITY.md](./SECURITY.md)。
164
+ Farming 会控制目标机器上的真实终端和文件。请只运行在可信开发机和可信网络中,不要在没有 VPN、SSH Tunnel、HTTPS Reverse Proxy 或等价访问控制时直接暴露到公网。
268
165
 
269
- ## 排错
270
-
271
- - **Codex 或 Claude Code 无法启动**:先确认同一台机器上对应 CLI 已安装、已登录,并能在普通 shell 中直接运行。
272
- - **Native PTY 无法启动**:检查目标系统的 Node.js 与打包的 `node-pty` runtime 是否兼容;glibc 低于 2.28 的 Linux x64 请使用 `-legacy-glibc228` 包。
273
- - **端口占用**:可以传 `--port <port>`;如果没有显式指定端口,默认 daemon 启动会自动上探选择可用端口。
274
- - **手机访问不了**:使用启动日志里打印的 Network URL,并确认手机能访问目标开发机。
275
- - **找不到 token URL**:运行 `./farming url`,或查看 `./farming logs`。
276
-
277
- ## 目录结构
278
-
279
- ```text
280
- farming/
281
- ├── .gitattributes # 源码归档 export-ignore 规则
282
- ├── backend/ # Node.js server、session engine、agent manager、session/history/usage/file/slash-command APIs
283
- ├── src/ # React + Vite 前端;Farming Code 皮肤与交互 helper 位于 src/components/code/
284
- ├── frontend/skins/crt/ # 独立的实时 CRT 入口、应用逻辑与视觉效果
285
- ├── frontend/*.js # 多皮肤共享的 terminal/session 浏览器 bridge
286
- ├── docs/
287
- │ ├── products/code/ # Farming 2 产品介绍、Farming Code 皮肤截图、安装说明和验收 dogfood 方案
288
- │ └── products/crt/ # CRT 皮肤 README 和布局说明
289
- ├── config/ # 部署 / 安装配置模板
290
- ├── scripts/ # 部署、release、测试、产品截图和辅助脚本
291
- ├── tests/e2e/ # Playwright 展示与浏览器流程测试
292
- ├── reference/ # 外部项目源码、工具链和调研 walkthrough;不作为 Farming 运行时依赖
293
- ├── pkg.config.cjs # 平台 CLI 应用打包配置(@yao-pkg/pkg + legacy pkg)
294
- └── bin/farming # 开发态产品 CLI;发布后二进制也叫 farming
295
- ```
166
+ Token 鉴权同时保护 HTTP 和 WebSocket。`FARMING_DISABLE_AUTH=1` 只适合可信本地开发;Workspace 文件 API 会校验所有路径都位于所选项目根目录内。报告和部署说明见 [SECURITY.md](./SECURITY.md)。
296
167
 
297
- 公开产品文档现在从根 README 和 `docs/products/` 下的皮肤 README 进入。`releases/` 是本地打包输出目录,不提交到源码仓库。
168
+ ## 文档
298
169
 
299
- ## 测试
170
+ - [Farming 2 产品总览与能力矩阵](./docs/products/README.zh_cn.md)
171
+ - [Farming Code 指南](./docs/products/code/README.zh_cn.md)
172
+ - [Farming CRT 指南](./docs/products/crt/README.zh_cn.md)
173
+ - [Farming Net 部署门户](./docs/products/net/README.zh_cn.md)
174
+ - [移动端指南](./docs/products/code/mobile-guide.zh_cn.md)
175
+ - [ACP 运行时](./docs/products/code/acp-runtime.zh_cn.md)
176
+ - [Review 基础](./docs/products/code/review-foundation.zh_cn.md)
177
+ - [版本历史](https://github.com/zhuwenzhuang/farming/releases)
178
+ - [贡献者说明](./AGENTS.zh_cn.md)
300
179
 
301
- 运行主检查:
302
-
303
- ```bash
304
- npm run check
305
- ```
306
-
307
- 常用单项命令:
180
+ ## 开发检查
308
181
 
309
182
  ```bash
310
183
  npm test
311
184
  npm run typecheck
312
185
  npm run lint
186
+ FARMING_BASE_PATH=/farming npm run build
313
187
  npm run test:e2e:playwright
314
188
  ```
315
189
 
316
- Playwright 测试会在合适位置使用 fake coding-agent executable,常规 UI 回归不会消耗真实 Codex / Claude 额度。
317
-
318
- ## 作者
190
+ 产品截图由匿名 Demo Workspace 和真实浏览器流程生成:
319
191
 
320
- - [zhuwenzhuang](https://github.com/zhuwenzhuang)
321
- - [l4wei](https://github.com/l4wei)
322
-
323
- ## 贡献
324
-
325
- 欢迎提交 issue 和 pull request。开始前请阅读 [CONTRIBUTING.md](./CONTRIBUTING.md);如果改动影响用户可见行为、打包方式或部署方式,请同步更新 README、产品文档和相关验收说明。
192
+ ```bash
193
+ npm run docs:product:screenshots
194
+ ```
326
195
 
327
196
  ## License
328
197
 
329
- MIT
198
+ Farming 使用 [MIT License](./LICENSE)。第三方组件声明见 [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md)。
@@ -15,8 +15,8 @@ preserved in bundled `node_modules` when bundled dependencies are enabled.
15
15
  | Package | Version | License | Purpose |
16
16
  | --- | --- | --- | --- |
17
17
  | `@agentclientprotocol/sdk` | 1.2.1 | Apache-2.0 | ACP JSON-RPC client and protocol types |
18
- | `@agentclientprotocol/codex-acp` | 1.1.2 | Apache-2.0 | Codex ACP adapter |
19
- | `@agentclientprotocol/claude-agent-acp` | 0.58.1 | Apache-2.0 | Claude Code ACP adapter |
18
+ | `@agentclientprotocol/codex-acp` | 1.1.4 | Apache-2.0 | Codex ACP adapter |
19
+ | `@agentclientprotocol/claude-agent-acp` | 0.59.0 | Apache-2.0 | Claude Code ACP adapter |
20
20
  | `@xterm/addon-clipboard` | 0.2.0 | MIT | Browser terminal clipboard integration |
21
21
  | `@xterm/addon-fit` | 0.11.0 | MIT | Browser terminal sizing |
22
22
  | `@xterm/addon-search` | 0.16.0 | MIT | Browser terminal search |
@@ -65,6 +65,15 @@ The CRT skin bundles one font file under `frontend/skins/crt/fonts/`:
65
65
 
66
66
  The corresponding license texts are stored beside the font files.
67
67
 
68
+ ## Adapted Source Code
69
+
70
+ Farming's Git history swimlane transform and graph-row renderer adapt the
71
+ Visual Studio Code SCM history graph from Microsoft Visual Studio Code commit
72
+ `0217c2f1a0defc7fdbfb4feba74e71e366de6822`. The adapted files retain the
73
+ Microsoft copyright and MIT license header. Visual Studio Code is licensed
74
+ under the MIT License:
75
+ https://github.com/microsoft/vscode/blob/0217c2f1a0defc7fdbfb4feba74e71e366de6822/LICENSE.txt
76
+
68
77
  ## Bundled Data
69
78
 
70
79
  Farming includes a generated Chinese poetic token word list at