feishu-codex-console 1.0.0-beta.6
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.
- package/.env.example +101 -0
- package/.feishu-codex-policy.example.json +11 -0
- package/.feishu-codex-runbooks.example.json +36 -0
- package/CHANGELOG.md +129 -0
- package/CODE_OF_CONDUCT.md +7 -0
- package/CONTRIBUTING.md +52 -0
- package/LICENSE +21 -0
- package/README.en.md +81 -0
- package/README.md +398 -0
- package/ROADMAP.md +40 -0
- package/SECURITY.md +53 -0
- package/dist/account-quota-card.js +233 -0
- package/dist/account-quota.js +125 -0
- package/dist/app-server-client.js +281 -0
- package/dist/card-session.js +166 -0
- package/dist/codex-events.js +1 -0
- package/dist/codex-runner.js +875 -0
- package/dist/config.js +198 -0
- package/dist/confirmation-card.js +135 -0
- package/dist/control-card.js +345 -0
- package/dist/conversation-turn-session.js +209 -0
- package/dist/data-maintenance.js +71 -0
- package/dist/device-card.js +460 -0
- package/dist/device-health.js +94 -0
- package/dist/diagnostics.js +253 -0
- package/dist/doctor.js +250 -0
- package/dist/fallback-card-session.js +37 -0
- package/dist/health-file.js +75 -0
- package/dist/index.js +4330 -0
- package/dist/lark-cli.js +558 -0
- package/dist/lark-retry.js +34 -0
- package/dist/maintenance.js +140 -0
- package/dist/model-capabilities.js +31 -0
- package/dist/onboarding-card.js +312 -0
- package/dist/permission-lease.js +22 -0
- package/dist/policy.js +506 -0
- package/dist/progress.js +267 -0
- package/dist/project-card.js +303 -0
- package/dist/project-overview-card.js +182 -0
- package/dist/project-overview.js +278 -0
- package/dist/project-policy.js +160 -0
- package/dist/project-registry.js +259 -0
- package/dist/project-status.js +45 -0
- package/dist/project-workspace.js +55 -0
- package/dist/quota-card.js +94 -0
- package/dist/recovery-policy.js +26 -0
- package/dist/redaction.js +67 -0
- package/dist/remote-ready.js +112 -0
- package/dist/response-card.js +139 -0
- package/dist/result-card.js +166 -0
- package/dist/review-card.js +452 -0
- package/dist/runbook-card.js +272 -0
- package/dist/runbooks.js +191 -0
- package/dist/runtime-card.js +337 -0
- package/dist/session-card.js +128 -0
- package/dist/session-naming.js +14 -0
- package/dist/smoke.js +28 -0
- package/dist/state-backup.js +302 -0
- package/dist/state-store.js +874 -0
- package/dist/task-card.js +640 -0
- package/dist/task-center-card.js +176 -0
- package/dist/task-failure.js +43 -0
- package/dist/task-intent.js +76 -0
- package/dist/task-queue.js +187 -0
- package/dist/task-reconciliation.js +80 -0
- package/dist/task-review.js +497 -0
- package/dist/team-card.js +275 -0
- package/dist/team-directory.js +54 -0
- package/dist/team-policy.js +93 -0
- package/dist/types.js +1 -0
- package/dist/version.js +9 -0
- package/dist/workspace-session.js +64 -0
- package/docs/ARCHITECTURE.md +54 -0
- package/docs/COMPATIBILITY.md +55 -0
- package/docs/CONFIGURATION.md +88 -0
- package/docs/DEMO.md +45 -0
- package/docs/GOOD_FIRST_ISSUES.md +23 -0
- package/docs/INSTALLATION.md +207 -0
- package/docs/OPEN_SOURCE_PRODUCT_PLAN.md +113 -0
- package/docs/PRODUCT_REQUIREMENTS_MAP.md +591 -0
- package/docs/RELEASE_CHECKLIST.md +65 -0
- package/docs/TEAM_DEPLOYMENT.md +35 -0
- package/docs/TROUBLESHOOTING.md +130 -0
- package/docs/V4_WORKSPACE_SESSION_FLOW.md +232 -0
- package/docs/requirements/D10_MAINTENANCE_AND_ECOSYSTEM.md +103 -0
- package/docs/requirements/D1_INSTALLATION_AND_FIRST_CONNECTION.md +479 -0
- package/docs/requirements/D2_DEVICE_AND_CONNECTIVITY.md +54 -0
- package/docs/requirements/D3_PROJECTS_AND_SESSIONS.md +107 -0
- package/docs/requirements/D4_REMOTE_TASK_EXECUTION.md +102 -0
- package/docs/requirements/D5_CODEX_NATIVE_INTERACTIONS.md +99 -0
- package/docs/requirements/D6_RESULTS_AND_CODE_REVIEW.md +100 -0
- package/docs/requirements/D7_SECURITY_GOVERNANCE.md +106 -0
- package/docs/requirements/D8_RELIABILITY_AND_RECOVERY.md +182 -0
- package/docs/requirements/D9_TEAM_COLLABORATION.md +129 -0
- package/package.json +76 -0
- package/scripts/capability-probe.mjs +113 -0
- package/scripts/cli.mjs +919 -0
- package/scripts/config-file.mjs +137 -0
- package/scripts/discovery-lib.mjs +78 -0
- package/scripts/install-card.mjs +37 -0
- package/scripts/install-detection.mjs +126 -0
- package/scripts/install-state.mjs +107 -0
- package/scripts/launchd.mjs +161 -0
- package/scripts/migrate-legacy.mjs +97 -0
- package/scripts/package-smoke.mjs +163 -0
- package/scripts/release-dist-tag.mjs +7 -0
- package/scripts/runbook-template.mjs +36 -0
- package/scripts/service-health.mjs +110 -0
- package/scripts/service.mjs +24 -0
- package/scripts/setup-lib.mjs +118 -0
- package/scripts/systemd.mjs +96 -0
- package/scripts/upgrade-lib.mjs +99 -0
- package/scripts/verify-release.mjs +37 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# 故障排查
|
|
2
|
+
|
|
3
|
+
先使用安装时的同一份配置运行:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
feishu-codex-bridge doctor --config /absolute/path/to/default.env
|
|
7
|
+
feishu-codex-bridge status --config /absolute/path/to/default.env
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
低风险问题可让 doctor 自动修复,并生成一份不覆盖已有文件的脱敏诊断包:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
feishu-codex-bridge doctor --fix --config /absolute/path/to/default.env
|
|
14
|
+
feishu-codex-bridge doctor \
|
|
15
|
+
--diagnostics /private/path/feishu-codex-diagnostic.json \
|
|
16
|
+
--config /absolute/path/to/default.env
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
诊断包仍可能包含项目名称、时间和错误上下文,提交 Issue 前请人工检查。
|
|
20
|
+
|
|
21
|
+
也可以让 CLI 自动选择私有文件名:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
feishu-codex-bridge support-bundle --config /absolute/path/to/default.env
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
它不会上传文件。复制给维护者前仍需人工复核。
|
|
28
|
+
|
|
29
|
+
不要在 issue、截图或日志中公开真实 `open_id`、`chat_id`、App Secret、Token、提示词、附件路径或个人目录。
|
|
30
|
+
|
|
31
|
+
## Bot 身份不可用
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx lark-cli config init --new
|
|
35
|
+
npx lark-cli whoami --as bot
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
已有飞书应用时可以不带 `--new` 重新绑定。桥接服务使用 Bot 身份,不需要把 App Secret 写入 `.env`。
|
|
39
|
+
|
|
40
|
+
## 消息或卡片事件不可用
|
|
41
|
+
|
|
42
|
+
确认飞书应用已启用机器人,并通过长连接订阅:
|
|
43
|
+
|
|
44
|
+
- `im.message.receive_v1`
|
|
45
|
+
- `card.action.trigger`
|
|
46
|
+
|
|
47
|
+
同时确认应用具有 `im:message:readonly` 和 `cardkit:card:write`。修改权限或事件后,按飞书后台要求发布新应用版本,再重新运行 `init`。
|
|
48
|
+
|
|
49
|
+
如果检查显示“已有运行中的事件消费者”,说明当前服务已经占用该应用的长连接,这本身不是权限错误。重新安装服务时,安装器会停止旧实例并等待新实例接管。
|
|
50
|
+
|
|
51
|
+
## 服务启动但安装一直等待
|
|
52
|
+
|
|
53
|
+
安装器只有在以下条件同时满足时才显示成功:
|
|
54
|
+
|
|
55
|
+
- 后台 PID 仍存活。
|
|
56
|
+
- 消息和卡片两个事件消费者都已就绪。
|
|
57
|
+
- 实例名称与本次安装一致。
|
|
58
|
+
- 后台进程读取了本次指定的配置文件。
|
|
59
|
+
- 健康心跳没有过期。
|
|
60
|
+
|
|
61
|
+
慢速机器可先延长等待:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
feishu-codex-bridge install --config /absolute/path/to/default.env --health-timeout 60s
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
macOS 日志位于实例数据目录的 `log/bridge.log` 和 `log/bridge.error.log`。Linux 使用:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
journalctl --user -u feishu-codex-bridge-default -n 200 --no-pager
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
“读取了另一份配置”通常表示服务曾用不同的 `--config` 安装。使用正确路径重新运行 `install`,不要直接修改 LaunchAgent plist 或 systemd unit。
|
|
74
|
+
|
|
75
|
+
## 飞书里显示离线
|
|
76
|
+
|
|
77
|
+
检查电脑是否开机、联网和保持唤醒。在 macOS 飞书控制台中开启“远程就绪”只能防止空闲睡眠,不能绕过合盖睡眠、断电、系统更新或网络中断。
|
|
78
|
+
|
|
79
|
+
如果健康文件存在但心跳过期,先查看错误日志,再重新安装服务。不要仅修改 `bridge-health.json`;它是运行时只读证据,不是配置入口。
|
|
80
|
+
|
|
81
|
+
## 数据升级或状态异常
|
|
82
|
+
|
|
83
|
+
先确认实际版本契约:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
feishu-codex-bridge version --json
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`upgrade` 不带 `--yes` 只展示计划。如果提示仍有运行任务,请在飞书等待完成或显式停止,不要强杀服务绕过检查。升级失败信息会保留升级前备份 ID;自动恢复也失败时,按下方手工流程恢复。
|
|
90
|
+
|
|
91
|
+
查看已有备份:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
feishu-codex-bridge backups --config /absolute/path/to/default.env
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
数据库迁移前会自动生成一致性快照;迁移任一步失败会恢复旧快照并拒绝启动。需要手工回滚时:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
feishu-codex-bridge stop --config /absolute/path/to/default.env
|
|
101
|
+
feishu-codex-bridge rollback \
|
|
102
|
+
--backup <backup-id> \
|
|
103
|
+
--yes \
|
|
104
|
+
--config /absolute/path/to/default.env
|
|
105
|
+
feishu-codex-bridge install --config /absolute/path/to/default.env
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
回滚前还会创建 `before-rollback` 安全备份。不要在服务仍运行时复制或替换 `state.sqlite`、`-wal`、`-shm` 文件。
|
|
109
|
+
|
|
110
|
+
## 重跑安装器发现旧数据
|
|
111
|
+
|
|
112
|
+
这是保护行为。`init` 会展示已有配置、服务、数据和最近健康状态,并在更新配置前创建 `0600` 备份。未知高级配置默认保留;只有明确使用 `--force-reset` 才完整重建。
|
|
113
|
+
|
|
114
|
+
旧源码安装使用:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npx feishu-codex-console migrate --from /absolute/path/to/old/source
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
迁移不会删除旧 `.env` 或数据。新服务通过验证后再手工归档旧目录。
|
|
121
|
+
|
|
122
|
+
## 完全访问模式问题
|
|
123
|
+
|
|
124
|
+
`danger-full-access` 只是服务权限上限,不会自动允许普通成员获得同等权限,也不会取消提交、推送、发布、部署等外部动作的确认。团队部署应检查:
|
|
125
|
+
|
|
126
|
+
- 管理员、操作者、只读成员是否明确分开。
|
|
127
|
+
- `CODEX_OPERATOR_SANDBOX_MODE` 是否仍为 `workspace-write`。
|
|
128
|
+
- 群聊是否加入 `ALLOWED_FEISHU_CHAT_IDS`。
|
|
129
|
+
- 项目根目录和 ACL 是否只覆盖必要仓库。
|
|
130
|
+
- 网络、Web 搜索和额外环境变量是否保持最小开放。
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# V4:工作区会话交互模型
|
|
2
|
+
|
|
3
|
+
状态:`已确认,分阶段实现`
|
|
4
|
+
日期:2026-07-17
|
|
5
|
+
范围:飞书中的项目、Codex 会话、消息、运行过程、审批与团队协作
|
|
6
|
+
|
|
7
|
+
## 1. 产品定义
|
|
8
|
+
|
|
9
|
+
> 把本地 Codex thread 映射成一个可持续交流、可以协作和接管的飞书工作会话。
|
|
10
|
+
|
|
11
|
+
飞书是远程工作入口,不是任务管理器、远程终端或通用聊天机器人。用户首先感知的是一个持续存在的工作会话;队列、任务记录、审计和恢复仍然存在,但默认退到后台。
|
|
12
|
+
|
|
13
|
+
## 2. 核心对象
|
|
14
|
+
|
|
15
|
+
| 产品对象 | 飞书载体 | 用户心智 | 是否默认可见 |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| 设备 | 机器人私聊首页 | 哪台本机可以接管 | 是 |
|
|
18
|
+
| 项目工作区 | 一个项目群 | 我正在操作哪个仓库 | 是 |
|
|
19
|
+
| Codex 会话 | 群里的一个话题/回复串 | 我在继续哪段上下文 | 是 |
|
|
20
|
+
| Turn | 用户消息与 Codex 回复 | 一轮自然交流 | 是 |
|
|
21
|
+
| Execution | 本地执行记录 | 系统正在处理 | 仅长任务简要可见 |
|
|
22
|
+
| Interrupt | 审批、追问、失败、离线 | 现在需要我决定 | 是,使用卡片 |
|
|
23
|
+
| Task/Audit | 持久任务、队列和审计记录 | 可靠性基础设施 | 默认隐藏 |
|
|
24
|
+
|
|
25
|
+
### 不变量
|
|
26
|
+
|
|
27
|
+
1. 一个工作话题只绑定一个本地项目、一个 Codex thread 和一台执行设备。
|
|
28
|
+
2. 同一话题内的普通消息默认继续当前 Codex thread,不创建新的用户可见任务。
|
|
29
|
+
3. 模型、推理和权限属于工作会话,不在每次回复中重复展示。
|
|
30
|
+
4. 卡片只承载控制、决策和异常,不包裹普通问答。
|
|
31
|
+
5. 项目和会话身份不能依赖聊天中的“当前选择”猜测;每次执行都使用入队时保存的不可变快照。
|
|
32
|
+
|
|
33
|
+
## 3. 信息架构
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
机器人私聊:首页 / 控制面
|
|
37
|
+
├─ 本地设备
|
|
38
|
+
├─ 最近项目工作区
|
|
39
|
+
├─ 最近 Codex 会话
|
|
40
|
+
└─ 创建 / 恢复工作区
|
|
41
|
+
|
|
42
|
+
项目群:一个本地项目
|
|
43
|
+
├─ 置顶工作区控制卡
|
|
44
|
+
│ ├─ 设备与分支
|
|
45
|
+
│ ├─ 模型与推理
|
|
46
|
+
│ ├─ 权限
|
|
47
|
+
│ └─ 新建会话 / 本机打开
|
|
48
|
+
└─ 话题 A、B、C:独立 Codex thread
|
|
49
|
+
├─ 自然问答
|
|
50
|
+
├─ 分析与写文件
|
|
51
|
+
├─ 代码修改
|
|
52
|
+
└─ 必要时出现审批/追问卡
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 兼容模式
|
|
56
|
+
|
|
57
|
+
首阶段不强制自动创建项目群。已有私聊和群聊继续可用:
|
|
58
|
+
|
|
59
|
+
- 私聊维持一个当前工作会话。
|
|
60
|
+
- 群聊中的顶层普通 prompt 自动在回复串中创建新工作会话。
|
|
61
|
+
- 群聊回复串使用根消息作为稳定会话键,同一话题共享一个 Codex thread。
|
|
62
|
+
- 群聊主会话中的项目和设置会复制到新话题,之后由话题独立保存。
|
|
63
|
+
|
|
64
|
+
## 4. 回复呈现规则
|
|
65
|
+
|
|
66
|
+
| 用户意图 | 接收时 | 运行中 | 完成时 |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| 提问 | 同一条轻量 Markdown 回复进入处理态 | 原消息增量更新 | 变成干净的普通回答 |
|
|
69
|
+
| 分析 | 显示当前分析动作 | 原消息增量更新摘要 | 结论 + 可选详情 |
|
|
70
|
+
| 写文件 | 一条紧凑进度消息或卡片 | 更新文件/检查阶段 | 交付摘要 + 文件入口 |
|
|
71
|
+
| 改代码 | 一张紧凑运行卡 | 更新命令、文件和测试阶段 | 结果摘要 + Diff/测试入口 |
|
|
72
|
+
| 审批/追问 | 不创建新任务 | 暂停当前 turn | 决策卡处理后继续原 turn |
|
|
73
|
+
| 失败/离线 | — | — | 异常卡 + 一个明确恢复动作 |
|
|
74
|
+
|
|
75
|
+
普通回答不得默认展示:任务 ID、thread ID、token、权限、模型、重复 prompt、重新执行、新会话按钮或安全脚注。这些信息进入工作区控制卡、任务中心或“详情”。
|
|
76
|
+
|
|
77
|
+
普通回答遵循移动端优先的排版:先给结论,段落保持简短,列表默认不超过 5 项,不使用宽表格;简短的首句结论优先映射为飞书原生富文本标题,让消息预览直接表达内容,而不是暴露 Markdown 符号或只显示泛化标签。
|
|
78
|
+
|
|
79
|
+
飞书原生文本与富文本消息最多编辑 20 次。渐进回答必须合并高频增量、限制中间刷新次数,并始终为成功、失败、取消或中断的最终状态预留编辑额度;不得因追求逐 token 动画而留下永远停在“处理中”的消息。
|
|
80
|
+
|
|
81
|
+
## 5. 关键流程
|
|
82
|
+
|
|
83
|
+
### 5.1 创建工作区
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
私聊机器人
|
|
87
|
+
→ 选择在线设备
|
|
88
|
+
→ 选择授权项目
|
|
89
|
+
→ 创建或绑定项目群
|
|
90
|
+
→ 生成置顶工作区控制卡
|
|
91
|
+
→ 新建第一个话题会话
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 5.2 持续对话
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
用户在话题发送消息
|
|
98
|
+
→ 根据 chat + root message 定位工作会话
|
|
99
|
+
→ 若当前 turn 运行中则追加要求
|
|
100
|
+
→ 否则恢复该话题绑定的 Codex thread
|
|
101
|
+
→ 系统在后台创建 Execution 记录
|
|
102
|
+
→ 使用与意图匹配的轻量呈现
|
|
103
|
+
→ 完成后会话回到 idle,可继续下一轮
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 5.3 多项目并行
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
项目群 A / 话题 A1 → 项目 A / Codex thread A1
|
|
110
|
+
项目群 B / 话题 B1 → 项目 B / Codex thread B1
|
|
111
|
+
项目群 B / 话题 B2 → 项目 B / Codex thread B2
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
不同项目可受全局并发限制并行;同一工作树默认串行。用户无需发送 `/use` 来辨认正在操作的项目。
|
|
115
|
+
|
|
116
|
+
### 5.4 审批与接管
|
|
117
|
+
|
|
118
|
+
审批卡必须绑定工作区、会话、turn、发起人和有效期。批准后恢复原 turn,不新建任务。团队成员需要通过显式转交或接管获得控制权,发起人和管理员保留可审计的收回能力。
|
|
119
|
+
|
|
120
|
+
### 5.5 回到本机
|
|
121
|
+
|
|
122
|
+
工作区控制卡提供“在本机打开”。本机 Codex 读取同一个 thread;飞书侧停止发送新 turn,但不复制或重建上下文。
|
|
123
|
+
|
|
124
|
+
## 6. 状态模型
|
|
125
|
+
|
|
126
|
+
### 工作区
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
unbound → ready ↔ offline
|
|
130
|
+
↓
|
|
131
|
+
blocked
|
|
132
|
+
↓
|
|
133
|
+
archived
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 工作会话
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
idle → running → idle
|
|
140
|
+
├─ waiting_for_approval → running
|
|
141
|
+
├─ waiting_for_answer → running
|
|
142
|
+
├─ failed → idle(用户继续或重试)
|
|
143
|
+
└─ interrupted → idle(恢复上下文,不自动重放)
|
|
144
|
+
|
|
145
|
+
idle → archived
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Turn
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
accepted → running → completed
|
|
152
|
+
├─ failed
|
|
153
|
+
├─ cancelled
|
|
154
|
+
└─ interrupted
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Task 是 Turn 的可靠执行记录,不再作为主要交互对象。
|
|
158
|
+
|
|
159
|
+
## 7. 数据与路由
|
|
160
|
+
|
|
161
|
+
### 会话键
|
|
162
|
+
|
|
163
|
+
- 私聊:`chat_id`
|
|
164
|
+
- 群主会话:沿用部署的 `chat` 或 `member` 隔离策略
|
|
165
|
+
- 群话题:`chat_id::topic::root_message_id`
|
|
166
|
+
|
|
167
|
+
群话题优先使用 `root_id`;只有缺少 `root_id` 时才回退到 `thread_id`。群顶层普通 prompt 使用自己的 `message_id` 作为新话题根键,并在回复时开启 `reply-in-thread`。
|
|
168
|
+
|
|
169
|
+
### 工作区快照
|
|
170
|
+
|
|
171
|
+
每个新话题从群主会话复制:
|
|
172
|
+
|
|
173
|
+
- 项目路径
|
|
174
|
+
- 模型与推理设置
|
|
175
|
+
- 持久 sandbox 上限
|
|
176
|
+
|
|
177
|
+
不会复制:
|
|
178
|
+
|
|
179
|
+
- Codex thread ID
|
|
180
|
+
- 临时完全访问租约
|
|
181
|
+
- 运行或排队任务
|
|
182
|
+
- 未完成审批和问题
|
|
183
|
+
|
|
184
|
+
## 8. 安全与团队规则
|
|
185
|
+
|
|
186
|
+
- 项目 ACL 在创建话题和每轮执行前都检查。
|
|
187
|
+
- 话题共享不等于执行权共享;默认由当前控制者操作。
|
|
188
|
+
- 完全访问仍不绕过 commit、push、deploy、PR 和外部副作用确认。
|
|
189
|
+
- 群被重新绑定项目时,已有话题保持原项目快照;不会静默漂移。
|
|
190
|
+
- 审计记录 actor、workspace、session、turn、结果和权限,不记录秘密。
|
|
191
|
+
|
|
192
|
+
## 9. 分阶段迁移
|
|
193
|
+
|
|
194
|
+
### Phase 1:对话成为主界面
|
|
195
|
+
|
|
196
|
+
- [x] 确认产品对象和交互不变量。
|
|
197
|
+
- [x] 解析飞书 `root_id`、`thread_id` 和 `reply_to`。
|
|
198
|
+
- [x] 群回复串获得独立、共享的 Codex 会话键。
|
|
199
|
+
- [x] 问答与分析使用可更新的 Markdown 消息,不创建完整任务卡。
|
|
200
|
+
- [x] 普通回复自动把短结论映射为飞书原生富文本标题,清理会话列表里的 Markdown 符号,并使用无装饰的轻量处理中状态。
|
|
201
|
+
- [x] 顶层群 prompt 自动回复到话题。
|
|
202
|
+
- [x] 项目和设置复制到新话题。
|
|
203
|
+
|
|
204
|
+
### Phase 2:紧凑执行与结果
|
|
205
|
+
|
|
206
|
+
- [ ] 写文件和代码任务改为一张紧凑状态卡。
|
|
207
|
+
- [ ] 完成结果以普通回复呈现,Diff/测试作为次级入口。
|
|
208
|
+
- [ ] 取消重复完成通知、重复 prompt 和每轮元数据。
|
|
209
|
+
- [ ] Token、额度、模型和权限移入详情与工作区控制卡。
|
|
210
|
+
|
|
211
|
+
### Phase 3:项目群工作区
|
|
212
|
+
|
|
213
|
+
- [ ] 私聊首页支持创建、恢复和搜索工作区。
|
|
214
|
+
- [ ] 可选自动创建项目群并邀请成员/机器人。
|
|
215
|
+
- [ ] 置顶工作区控制卡成为项目唯一控制面。
|
|
216
|
+
- [ ] 实现本机打开、归档和跨设备接管。
|
|
217
|
+
|
|
218
|
+
### Phase 4:团队化
|
|
219
|
+
|
|
220
|
+
- [ ] 话题级转交、接管和观察者模式。
|
|
221
|
+
- [ ] 工作区模板、团队策略和审计导出。
|
|
222
|
+
- [ ] 多设备路由与同项目锁冲突提示。
|
|
223
|
+
|
|
224
|
+
## 10. V4 验收标准
|
|
225
|
+
|
|
226
|
+
1. 在群里同时打开两个话题,能稳定对应两个不同 Codex thread。
|
|
227
|
+
2. 简单问题只出现一条持续更新的普通回复,不出现绿色任务完成卡。
|
|
228
|
+
3. 同一话题继续提问会沿用原 Codex thread;新话题不会继承旧 thread。
|
|
229
|
+
4. 任何任务都能从持久记录恢复,但用户不需要理解 Task 才能正常使用。
|
|
230
|
+
5. 卡片只在控制、审批、追问、长任务和异常中出现。
|
|
231
|
+
6. 多项目执行时,用户仅凭群名和话题标题即可辨认项目与上下文。
|
|
232
|
+
7. 原有私聊、队列、安全门禁、审批、任务中心和审计数据保持兼容。
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# D10 维护与开源生态
|
|
2
|
+
|
|
3
|
+
## 1. 用户问题
|
|
4
|
+
|
|
5
|
+
Feishu Codex Console 会长期运行在真实开发机上。安装者需要在不理解源码、不丢失队列和会话的前提下升级、诊断和回退;维护者需要确定发布物与运行时依赖一致;贡献者需要从一个清楚、可测试的小改动进入项目。
|
|
6
|
+
|
|
7
|
+
## 2. 产品目标
|
|
8
|
+
|
|
9
|
+
1. 一条命令看懂版本与兼容性,一条命令生成脱敏支持包。
|
|
10
|
+
2. 升级默认只预览;执行前备份,执行后验证,失败尽可能自动回退。
|
|
11
|
+
3. 配置、状态、SQLite、仓库策略和运行手册都有显式版本。
|
|
12
|
+
4. npm tarball 是真实安装单位,而不是只能从维护者源码目录运行。
|
|
13
|
+
5. 贡献者只根据公开文档即可完成检查、打包和提交。
|
|
14
|
+
|
|
15
|
+
## 3. 已确认产品决策
|
|
16
|
+
|
|
17
|
+
- 稳定版采用 Semantic Versioning。`1.x` 保证已文档化 CLI、配置 v1、策略 v1、运行手册 v1 和自动状态迁移;内部 TypeScript 模块不承诺为公共 API。
|
|
18
|
+
- npm 包精确固定 `@openai/codex` 与 `@larksuite/cli`。升级依赖必须经过跨平台、tarball 和真实飞书/Codex 验证。
|
|
19
|
+
- 当前不开放插件 API。扩展点先保持为内部适配边界,直到飞书核心协议和安全模型稳定。
|
|
20
|
+
- 其他 IM/Agent 适配器暂不进入主包;未来需保持核心任务域与传输层解耦后再独立评估。
|
|
21
|
+
- 默认不收集匿名遥测。安装、任务和恢复指标只保存在本地;未来遥测必须显式选择加入且不含代码、提示词、Diff、身份 ID 或路径。
|
|
22
|
+
- 一个 npm 包升级一个本机实例。多设备编排不与本地包升级混在一起。
|
|
23
|
+
|
|
24
|
+
## 4. 版本契约
|
|
25
|
+
|
|
26
|
+
| 契约 | 当前版本 | 不兼容处理 |
|
|
27
|
+
|---|---:|---|
|
|
28
|
+
| 配置文件 | 1 | 未填写按 v1;未知未来版本拒绝启动 |
|
|
29
|
+
| 持久状态 | 6 | 逐版本迁移;迁移前备份;失败恢复 |
|
|
30
|
+
| SQLite schema | 1 | `PRAGMA user_version` 校验和事务化迁移 |
|
|
31
|
+
| 仓库策略 | 1 | 整份失败关闭 |
|
|
32
|
+
| 运行手册 | 1 | 整份失败关闭,替换参数后再次检查 |
|
|
33
|
+
| 健康文件 | 1 | 安装器只接受已知健康格式 |
|
|
34
|
+
|
|
35
|
+
新增环境变量必须有安全默认值,并同步 `.env.example`、配置参考、向导和测试。删除或重新解释配置键需要主版本和迁移说明。
|
|
36
|
+
|
|
37
|
+
## 5. 安全升级状态机
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
读取当前健康与版本
|
|
41
|
+
→ 有活动任务:拒绝
|
|
42
|
+
→ 无 --yes:只显示计划
|
|
43
|
+
→ 创建并校验 SQLite 备份
|
|
44
|
+
→ 用目标包运行 doctor
|
|
45
|
+
→ 停止旧服务
|
|
46
|
+
→ 安装目标包
|
|
47
|
+
→ 等待 PID、配置、心跳和两个飞书消费者
|
|
48
|
+
→ 版本一致:完成
|
|
49
|
+
→ 任一步失败:停止失败服务 → 恢复数据 → 恢复可用旧服务 → 报告备份 ID
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
排队但从未启动的任务保留在 SQLite,升级后按 D8 规则重新授权和恢复。运行中任务不会为升级被静默中断;操作者必须先等待或显式停止。
|
|
53
|
+
|
|
54
|
+
如果旧 npm 临时目录已被清理,工具仍恢复数据并尝试启动当前可用包,但必须明确提示无法保证旧包二进制回退。手工 `backup` / `backups` / `rollback` 始终保留。
|
|
55
|
+
|
|
56
|
+
## 6. 诊断与支持
|
|
57
|
+
|
|
58
|
+
- `version --json`:产品、Node、固定依赖、配置/状态/SQLite 和平台契约。
|
|
59
|
+
- `doctor`:只读检查;`doctor --fix` 只修复文件权限、过期健康标记和日志容量。
|
|
60
|
+
- `support-bundle`:默认写入私有数据目录的脱敏 JSON,不覆盖已有文件。
|
|
61
|
+
- Issue 模板要求版本、平台、最小复现和人工复核后的支持包;禁止上传数据库、凭据和真实身份。
|
|
62
|
+
|
|
63
|
+
支持包是诊断辅助,不是匿名遥测,也不会自动上传。
|
|
64
|
+
|
|
65
|
+
## 7. 发布门禁
|
|
66
|
+
|
|
67
|
+
1. tag、`package.json` 和 Release 版本完全一致。
|
|
68
|
+
2. Ubuntu 与 macOS 完成 `npm ci`、typecheck、全部测试、构建和真实 tarball 安装。
|
|
69
|
+
3. tarball 验证双 CLI、断点安装恢复、配置权限、运行手册初始化和升级只读预览。
|
|
70
|
+
4. 兼容性文档必须和固定依赖、配置/状态/SQLite 版本一致。
|
|
71
|
+
5. 预发布使用 npm `next` dist-tag;稳定版使用 `latest`。
|
|
72
|
+
6. 发布前完成真实 macOS、Linux、飞书成员角色、任务交接、审批、审阅和恢复清单。
|
|
73
|
+
|
|
74
|
+
## 8. 开源贡献路径
|
|
75
|
+
|
|
76
|
+
- `README.md` 提供中文产品和安装入口,`README.en.md` 提供完整英文入门路径。
|
|
77
|
+
- `CONTRIBUTING.md` 给出代码地图、检查命令和高风险变更要求。
|
|
78
|
+
- `ROADMAP.md` 公开现在、下一阶段、后续和明确非目标。
|
|
79
|
+
- Good First Issue 只选择不需要真实凭据、范围单一、有自动验收的工作。
|
|
80
|
+
- 安全漏洞通过私有 Security Advisory;授权绕过、凭据泄漏和命令策略逃逸不得公开披露。
|
|
81
|
+
|
|
82
|
+
## 9. 验收标准
|
|
83
|
+
|
|
84
|
+
- [x] 配置存在显式 v1 合约,未知未来版本拒绝加载。
|
|
85
|
+
- [x] 版本命令报告固定依赖和数据合约。
|
|
86
|
+
- [x] 支持包使用现有脱敏 doctor 输出并写入私有目录。
|
|
87
|
+
- [x] 升级无 `--yes` 不修改系统;有活动任务时拒绝。
|
|
88
|
+
- [x] 执行升级前生成校验备份,成功后验证健康与产品版本。
|
|
89
|
+
- [x] 失败路径恢复数据,并在旧包仍存在时验证旧服务。
|
|
90
|
+
- [x] 运行手册可从已安装 npm 包初始化且不覆盖团队文件。
|
|
91
|
+
- [x] tarball 测试覆盖安装恢复、运行手册和升级预览。
|
|
92
|
+
- [x] 发布门禁验证兼容性文档与包清单。
|
|
93
|
+
- [x] 中英文入口、配置、兼容性、演示、Roadmap 和贡献入口齐全。
|
|
94
|
+
- [ ] 发布候选版本完成一次干净 macOS 和 Linux 实机升级/降级演练。
|
|
95
|
+
- [ ] 建立真实 GitHub `good first issue`,并由外部贡献者完成一次文档或纯测试 PR。
|
|
96
|
+
|
|
97
|
+
## 10. 后续版本
|
|
98
|
+
|
|
99
|
+
- `runbooks validate` 与本地 JSON Schema。
|
|
100
|
+
- 支持包在飞书中生成前的字段预览和选择性导出。
|
|
101
|
+
- 本地、明确 opt-in 的安装/首任务可靠性统计。
|
|
102
|
+
- 多设备中心控制面的独立协议、版本协商和代理升级设计。
|
|
103
|
+
- 核心任务域成熟后,再评估稳定 adapter SDK;不直接暴露安全关键内部对象。
|