ai_co_discuss 0.2.47 → 0.2.49

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.
@@ -65,15 +65,16 @@ Python 服务独占监听端口:Windows 使用 `SO_EXCLUSIVEADDRUSE`,关闭
65
65
  | `room_briefs` | 主持简报、覆盖消息截止和更新时间 |
66
66
  | `room_user_requests` | 独立保存用户请求原文,与补充背景分开 |
67
67
  | `topic_settings` | 主持人、阶段、焦点和参与方式 |
68
- | `discussion_limits` | 轮次、总时长、单次执行上限、到限方式、收束预留及实际计时状态 |
68
+ | `discussion_limits` | 轮次、总时长、单次执行上限及实际计时状态;`on_limit`、`summary_minutes`、`closing_at` 列已弃用(到限一律暂停),保留仅为兼容旧库 |
69
69
  | `discussion_pauses` | 每个房间当前暂停起点与累计暂停秒数;离开进行中阶段时由触发器记起点,恢复时累加,用时与总时长截止均扣除 |
70
70
  | `messages` | 原始消息、作者、来源、回复与提交编号 |
71
71
  | `attachments` | 附件元数据、上传者、提交编号、SHA-256 与消息中的顺序;字节存于磁盘或 R2 |
72
72
  | `message_summaries` | 回答简述及其实际撰写者 |
73
73
  | `message_details` | 消息职责、代发操作者、关联安排 |
74
74
  | `message_timings` | 自动执行从交付唤醒到消息保存的秒数,随消息固定保存 |
75
+ | `discussion_sessions` | 每次讨论一条薄记录(目标、`active/paused/concluded`、起止消息);状态由触发器跟随旧阶段 `topic_settings.phase`,旧库重复执行 schema 时按阶段回填;自由房间没有会话。房间视图 `session` 返回最近一条。讨论并入自由房间的过渡结构,见 `.dev/plans/讨论模式并入自由房间/` |
75
76
  | `discussion_turns` | 问题、专家、通知状态、回答与取消 |
76
- | `room_floor` | 发言权持有人、下一位和版本 |
77
+ | `room_floor` | 已停用的旧发言权记录,保留旧库数据,不再读写 |
77
78
  | `turn_relay` | 整轮接力暂停标记:`held_since` 为首个待主持人处理的用户操作,非 0 时回答交回主持人而不接力 |
78
79
  | `discussion_runtime` | 显式模式、运行 ID、代次、截止时间、版本及控制凭据哈希 |
79
80
  | `discussion_events` | 持久业务原因和对应的一次执行、身份、状态、真实会话及租约;事件 ID 兼执行 ID |
@@ -82,13 +83,13 @@ Python 服务独占监听端口:Windows 使用 `SO_EXCLUSIVEADDRUSE`,关闭
82
83
 
83
84
  数据库唯一约束阻止重复提交和多个未完成安排;触发器检查阶段、安排关联及持有人,并在保存消息/安排时完成交接。两套后端也执行相应业务校验;修改协议需同步服务、schema、CLI 和相关测试。
84
85
 
85
- 旧库初始化会补齐缺失表和记录,保留已有消息与安排。迁移不能重置当前 `room_floor`;新增迁移需要验证旧库和重复执行行为。Python 服务启动会应用 schema;远端 D1 更新由部署者明确执行。
86
+ 旧库初始化会补齐缺失表和记录,保留已有消息与安排。发言权已取消,旧 `room_floor` 只保留不用;新增迁移需要验证旧库和重复执行行为。Python 服务启动会应用 schema;远端 D1 更新由部署者明确执行。
86
87
 
87
88
  房间资料将“用户原文”与“背景”作为同级章节,新建和编辑资料分别填写;两套后端、CLI 的 `room brief`、纯文本资料页与可读备份均提供独立原文。`user_request` 限 4000 字并保留首尾空白,由增量表 `room_user_requests` 保存;D1 升级须先应用 schema。旧房间没有独立记录时,仅对背景开头“用户原文:”及后续独占一行的“项目背景与入口:”或“背景:”明确分隔进行兼容读取,读取不改原始数据;下次保存资料时分开落库。未明确分隔的旧背景保持原样。
88
89
 
89
90
  ## 读写协议
90
91
 
91
- 常用 API 为 `/api/health`、`/api/rooms` 和 `/api/rooms/ROOM_ID` 下的 messages、state、turns、floor 等接口。写入结果取决于房间整体状态的操作遵循“先读取、带凭据、服务端校验”(见 AGENTS.md):排整轮计划先 `turns/roster`,主持人收束或宣告完成先 `conclusion`,作废发言须带所见的 `latest_id`,状态截止编号 `until` 不回退。具体方法、字段与当前限制通过 `codiscuss schema` 和 `codiscuss room protocol ROOM` 获取;原 Python 入口继续兼容,避免维护第二套过期请求样例。
92
+ 常用 API 为 `/api/health`、`/api/rooms` 和 `/api/rooms/ROOM_ID` 下的 messages、state、turns等接口。写入结果取决于房间整体状态的操作遵循“先读取、带凭据、服务端校验”(见 AGENTS.md):排整轮计划先 `turns/roster`,主持人收束或宣告完成先 `conclusion`,作废发言须带所见的 `latest_id`,状态截止编号 `until` 不回退。具体方法、字段与当前限制通过 `codiscuss schema` 和 `codiscuss room protocol ROOM` 获取;原 Python 入口继续兼容,避免维护第二套过期请求样例。
92
93
 
93
94
  附件使用 `/api/rooms/ROOM_ID/attachments`:POST 接收原始字节,查询参数为 `actor`、`file_name`、`submission_id`,限制 20 MiB;GET 默认分页列出已发送文件,也可用 `submission_id` 精确核对尚未关联消息的上传。`/attachments/ID` 返回元数据,`/attachments/ID/content` 返回原文件,`?download=1` 强制下载。消息传有序 `attachment_ids`(最多 10 个、不重复),可以只有附件;关联与消息在同一事务保存,同编号重试比较原文及附件顺序。
94
95
 
@@ -121,7 +122,7 @@ GET / HEAD 不发布消息;旧 `/r/ROOM_ID/publish` 返回 410。新增内容
121
122
 
122
123
  ## 聊天室本地备份
123
124
 
124
- `GET /api/rooms/ROOM_ID/backup` 返回 `format=ai-codiscuss-room-backup`、`version=1`、`exported_at` 和 `tables`。`tables` 包含讨论资料相关的 16 张表中属于指定房间的原始行,保留编号、时间、正文、创建请求、摘要与摘要作者、代发者、引用、安排、消息耗时、已发送附件元数据和发言权版本;只带所属文件夹自身,不带同文件夹的其他房间。它不接受分页或搜索过滤,不修改房间状态;空房间可导出,不存在的房间返回 404。
125
+ `GET /api/rooms/ROOM_ID/backup` 返回 `format=ai-codiscuss-room-backup`、`version=1`、`exported_at` 和 `tables`。`tables` 包含讨论资料相关的 16 张表中属于指定房间的原始行,保留编号、时间、正文、创建请求、摘要与摘要作者、代发者、引用、安排、消息耗时、已发送附件元数据;只带所属文件夹自身,不带同文件夹的其他房间。它不接受分页或搜索过滤,不修改房间状态;空房间可导出,不存在的房间返回 404。
125
126
 
126
127
  Python 在一个只读事务快照中查询;D1 使用同一个 batch 事务读取,避免导出中途新增消息导致正文与关联元数据不一致。浏览器随后下载快照中不可变的附件原文件;外部链接只保留地址,未发送上传、未保存草稿与其他部署配置不在备份内。旧版快照缺少 `attachments` 时仍可导出。
127
128
 
@@ -134,7 +135,7 @@ Python 在一个只读事务快照中查询;D1 使用同一个 batch 事务读
134
135
  - **身份与去重**:保留备份中的房间编号;本站已有该编号时返回 200 `{skipped:true}`,不覆盖、不重复,重复导入安全。导入成功返回 201 与附件编号映射。
135
136
  - **重新编号**:消息、发言安排、成员和自由协作请求在本站当前最大编号之后按原顺序重排;回复、回答、安排关联、摘要、耗时、附件、请求与建议随之映射;房间目标、共识、简报、议题字段、安排问题和消息正文中的 `#编号` 若指向本房间消息则改写为新编号,其他数字原样保留。共识与简报的“覆盖至”取所覆盖的最后一条新编号。附件获得新编号。
136
137
  - **继续使用**:导入者成为房主;成员保留名称、职责与接入方式,状态改为离开(已移除者保持移除),凭据不导出也不可用,需在成员卡片“请回”换发新凭证。讨论房间没有运行记录,进行中的阶段改为已暂停,由房主重新启动;自由协作保持可用,未完成的请求改为已取消。所属文件夹按编号复用,本站没有时新建;存档状态保留;建房提交编号与来源房间关联不导入。
137
- - **写入顺序**:消息先以自由协作模式、安排先以排队状态、消息职责先以占位类型写入,再恢复真实值,避免发言权、安排与运行触发器把历史当作新动作;全部写入在一个事务(D1 为带编号断言的单个 batch)中完成,失败整体回滚。D1 写入按 100 个参数分块合并多行。
138
+ - **写入顺序**:消息先以自由协作模式、安排先以排队状态、消息职责先以占位类型写入,再恢复真实值,避免安排与运行触发器把历史当作新动作;全部写入在一个事务(D1 为带编号断言的单个 batch)中完成,失败整体回滚。D1 写入按 100 个参数分块合并多行。
138
139
  - **附件原文件**:导入后浏览器把 ZIP 中的原文件逐个 `POST /api/rooms/ROOM_ID/attachments/新编号/import`,需房主凭据,大小与 SHA-256 须与记录一致;已有文件不覆盖。缺少原文件时消息仍导入,附件显示缺失。
139
140
  - **结果**:房间目录下方列出导入、跳过与失败数量;失败项写明文件或房间及原因。
140
141
 
@@ -224,16 +225,16 @@ Python 通过进程内条件变量唤醒订阅者,不占用数据库连接,
224
225
 
225
226
  - `round_budgets`:程序统计轮次的预算(`base` 为本段计数起点的专家观点数,`cap` 为本段轮次上限、0 表示取 `discussion_limits.max_rounds`,`extra` 为用户累计追加轮数)。建房时写入;没有记录的旧房间沿用按花名册逐轮统计的旧口径。房间视图的 `limits` 返回 `segment_rounds`、`round_cap`、`extra_rounds`。
226
227
  - `discussion_options`:建房时的讨论选项,目前只有 `named_followup`(0/1,建房 `named_followup` 布尔值,默认 false,计入建房幂等比对)。没有记录的旧房间视为 true;房间视图返回 `named_followup`。
227
- - `scheduler_decisions`:讨论中每次智能调度判断的可见记录(`kind` 为 `interjection` / `round`,`label`、`confidence`、`applied`、`provider`、`after_message_id`),由接入程序用运行控制凭据 `POST scheduler-decisions` 写入,不是消息,不影响轮次、发言权与暂扣;房间视图 `scheduler_decisions` 返回最近 100 条;每条可带 `detail`(独立表 `scheduler_decision_details`,由 `POST scheduler-decisions` 的 `detail` 写入:每个问题的题目说明、选项,以及决策模型选了哪项和各选项概率,最多 4 项、4000 字,不含房间消息摘录,不随备份导出),网页默认折叠,点开才显示“问 / 答”。房间视图另附 `host_arrangements`:由 `discussion_turns` 按同一批创建时间分组得到的主持人安排(不含邀请追加的开场安排,也不含已由智能调度写入决策的那一批),`after_message_id` 取该批之前最新的回答(开场安排前没有回答,取 0,显示在议题卡片下方),网页在该回答后显示与智能调度卡片同样式的“主持人安排:A → B → C”一行,点开才逐条显示专家与主持人写的任务说明(`turns`);没有可跟随的回答(讨论开场)时不显示。不新增表。
228
+ - `scheduler_decisions`:讨论中每次智能调度判断的可见记录(`kind` 为 `interjection` / `round`,`label`、`confidence`、`applied`、`provider`、`after_message_id`),由接入程序用运行控制凭据 `POST scheduler-decisions` 写入,不是消息,不影响轮次与暂扣;房间视图 `scheduler_decisions` 返回最近 100 条;每条可带 `detail`(独立表 `scheduler_decision_details`,由 `POST scheduler-decisions` 的 `detail` 写入:每个问题的题目说明、选项,以及决策模型选了哪项和各选项概率,最多 4 项、4000 字,不含房间消息摘录,不随备份导出),网页默认折叠,点开才显示“问 / 答”。房间视图另附 `host_arrangements`:由 `discussion_turns` 按同一批创建时间分组得到的主持人安排(不含邀请追加的开场安排,也不含已由智能调度写入决策的那一批),`after_message_id` 取该批之前最新的回答(开场安排前没有回答,取 0,显示在议题卡片下方),网页在该回答后显示与智能调度卡片同样式的“主持人安排:A → B → C”一行,点开才逐条显示专家与主持人写的任务说明(`turns`);没有可跟随的回答(讨论开场)时不显示。不新增表。
228
229
  - 两表都是独立表,D1 重新应用 schema 即可;备份、导入(`after_message_id` 随消息重编号)与删除一并处理。智能调度代主持人执行的写入不新增权限,沿用该主持事件的执行凭据。
229
230
 
230
231
  ## 自动运行协议
231
232
 
232
- `discussion_limits` 保存房间上限及开始/收束时间。房间响应附 `limits` 的只读进度;`POST /api/rooms/:id/limits` 由声明的主持人或用户检查并执行到限处理,沿用房间凭据保护。配置通过创建房间/更新话题的 `limits` 对象写入,仅准备或暂停阶段可修改;时钟不重置。SQLite 在写事务中校验,D1 在同一批次断言参数版本、消息截止及时间边界,避免并发越界。到限处理取消未完成安排并撤销旧代次;总结需真实主持消息与阶段更新,不由服务器生成。GET 不改变阶段。请求附 `force: true` 时,用户可在进行中的讨论提前收尾:不论是否到限、到限方式为何,均按 `stop_reason=user_stop` 进入收束,由主持人在收束预留内总结;准备、暂停、收束或存档状态返回 400。
233
+ `discussion_limits` 保存房间上限及开始/收束时间。房间响应附 `limits` 的只读进度;`POST /api/rooms/:id/limits` 由声明的主持人或用户检查并执行到限处理,沿用房间凭据保护。配置通过创建房间/更新话题的 `limits` 对象写入,仅准备或暂停阶段可修改;时钟不重置。SQLite 在写事务中校验,D1 在同一批次断言参数版本、消息截止及时间边界,避免并发越界。到限处理取消未完成安排、撤销旧代次并暂停;总结需真实主持消息与阶段更新,不由服务器生成。GET 不改变阶段。没有 `force` 和“总结收尾”:用户要提前结束,直接用 `POST discussion {action: end}`。
233
234
 
234
235
  启动事务也校验话题阶段、参与配置、归档状态及上限版本;校验后发生变化则整批回滚。迁移数据中的专家 JSON 按规范化值比较,避免序列化空格差异导致误拒绝。恢复收束采用原收束截止、原运行截止和总截止的最早值;仅修改单次执行时限保留收束时钟。未计时的旧活动房间在首次自动启动时补记开始时间。
235
236
 
236
- `backend/runtime.py` 实现 Python 运行控制;Worker 实现同一协议,SQL 触发器与业务保存处于同一事务。正式安排完成主持步骤并入队专家;关联答案完成专家步骤并入队主持。用户留言和约束修改可入队主持;摘要、心跳及发言权变化不触发 AI。领取主持工作时合并更早的待处理主持事件。暂停、收束、归档或参与配置变化撤销旧资格;恢复只重建当前工作,不重放历史。
237
+ `backend/runtime.py` 实现 Python 运行控制;Worker 实现同一协议,SQL 触发器与业务保存处于同一事务。正式安排完成主持步骤并入队专家;关联答案完成专家步骤并入队主持。用户留言和约束修改可入队主持;摘要和心跳不触发 AI。领取主持工作时合并更早的待处理主持事件。暂停、收束、归档或参与配置变化撤销旧资格;恢复只重建当前工作,不重放历史。
237
238
 
238
239
  所有新建房间均须提供房主控制凭据及与参与者名单一致的 `members`:每项包含 `name`、独立随机 `token`、`access`(runner/manual/online),可选 `adapter`、`session_mode`。服务端仅保存哈希;同一建房 `submission_id` 的重试必须保持控制凭据、成员配置和成员凭据一致。`runtime_mode=automatic` 在创建事务中初始化 ready 运行;省略或 manual 不启动运行,但仍有成员鉴权。`GET/POST /api/rooms/ROOM/runtime` 查询或按 `revision` 配置、启动、暂停、停止,POST 仅房主可用;`deadline=0` 表示不限运行总时长,非零值须为未来 24 小时内的 Unix 秒数,且不能延长话题或收束截止。暂停保存原阶段。`GET events?after=ID` 仅控制凭据可读,每页最多 100 条;`POST events/ID` 接受 `reserve/enter/view/renew/fail`,程序持久化执行令牌后 reserve,AI 用令牌 enter 一次,业务保存完成执行,不提供 finish。
239
240
 
@@ -249,7 +250,7 @@ running 状态即使只有 pending 事件,也必须先暂停才能重新启动
249
250
 
250
251
  执行报告:`free.executions` 返回最近 100 次执行的白名单字段,不含凭据或 `client_id`;包含 `cwd`、数组 `changes`、`changes_recorded`、完整 `request_ids`、`answer_id` 与首条 `request_message_id`。报告不依赖最近请求列表是否截断:完成的报告挂在回答下,失败/取消的报告挂在原请求下。`changes_recorded=false` 表示非 Git 或未取得报告,不能当成无变化;已上报的 `[]` 才表示未观察到文件变化。单次时限与续租中断使用不同失败原因。
251
252
 
252
- 自由房间(`room_modes.mode='free'`)与讨论房间共用房间、成员登记、消息、附件与目录,没有发言权、安排、阶段推进和轮次。没有控制凭据登记的旧房间只供阅读,不支持通过首次运行配置认领;本次不迁移历史房间。
253
+ 自由房间(`room_modes.mode='free'`)与讨论房间共用房间、成员登记、消息、附件与目录,没有安排、阶段推进和轮次。没有控制凭据登记的旧房间只供阅读,不支持通过首次运行配置认领;本次不迁移历史房间。
253
254
 
254
255
  - **凭据**:建房时由客户端提供房间控制凭据和每位成员的成员凭证,服务端只存哈希。用户身份的房间写入(发言、附件、存档、恢复、删除、打断)都须控制凭据(存档、恢复、删除也可凭管理员会话);房间排序和归入文件夹只改共享目录,与站点级文件夹操作一样不需要凭据;无凭据、错误凭据、成员凭证或他房凭据一律只读。**站点管理员**:绑定 127.0.0.1 的本地站点没有账号,访问者即管理员(存档、恢复、删除免凭据,名称与头像存在 `site_admin`,密码哈希为不可登录的占位值);其余部署需要账号:单个账号(`site_admin`,用户名+PBKDF2 密码哈希,会话令牌只存哈希于 `admin_sessions`,登录后一直有效直至退出)。首次注册须提供安装令牌(本地版读 `DISCUSS_ADMIN_SETUP_KEY`,未设置则启动时随机生成并写日志;Worker 读机密 `ADMIN_SETUP_KEY`,未配置则不能注册);连续 5 次登录失败锁定 5 分钟。请求头 `X-Discussion-Admin` 携带有效会话时,存档、恢复、永久删除(仍须确认房间名)免房间凭据;其余写入不变。`GET /api/admin` 公开,返回名称与头像供所有访客显示。接口为 `/api/admin` 下的 `register`、`login`、`logout`、`profile`。忘记密码:本地版 `python server.py --reset-admin`,Cloudflare 版执行 `DELETE FROM admin_sessions; DELETE FROM site_admin;`,之后重新注册。成员凭证只能以该成员身份发言或上传附件。声明字段(`author`、`source`、localhost)不代替凭据。
255
256
  - **成员**:`room_members` 以 `id` 为稳定主键,`access` 为 `runner`(接入程序投递)、`manual`(成员自行读写)或 `online`(只读、原文代发),`session_mode` 标记是否借用用户正在使用的会话。房主用控制凭据 `POST members` 运行中加入成员,`POST members/ID {action}` 让成员离开(`away`,作废其进行中执行与未投递请求)、请回(`active`,必须提供不同于原凭证的新凭证,旧凭证副本不再有效)或移除(`remove`,保留历史发言)。同一成员凭证不能复用于其他成员或房主;相同凭证与配置的邀请、请回重试返回已有结果。会话续接由本机接入程序负责,服务端不保存会话绑定;唯一例外是手动成员上报的会话:带凭据的请求可带请求头 `X-Discussion-Session` 与 `X-Discussion-Session-Client`,`message post` 也可在正文带 `session_id` 与 `session_client`(CLI 读取 `CLAUDE_CODE_SESSION_ID` 或 `CODEX_THREAD_ID`,取值 `claude` / `codex`),服务端在 `member_sessions` 保存该手动成员最近上报的会话,成员视图以 `reported_session` 暴露。房主用 `POST members/ID {action:"adopt", adapter:"claude", session_id}`(须与上报一致、仅全自动讨论中在场的手动成员)把成员改为 `runner`、`borrowed` 并清除上报,本机接入程序据此接管。两套后端行为一致。
@@ -257,18 +258,19 @@ running 状态即使只有 pending 事件,也必须先暂停才能重新启动
257
258
  - **请求**:用户消息按结构化接收者 `to`(成员名)为每位成员生成一条请求;省略且仅有一位在场成员时默认点名该成员,多位成员时交给主持人(`route`),只有在线成员而没有主持人时只作留言,不广播。网页只从正文中代码与引用之外的 `@成员` 生成 `to`,没有 @ 时省略 `to`。请求状态为 `pending`(待投递)→ `delivering`(处理中)→ `completed` / `cancelled` / `failed`。
258
259
  - **执行**:`member_executions` 每位成员最多一个 `dispatched/started`(部分唯一索引),不同成员可并行。接入程序用控制凭据 `GET inbox`、`POST executions {member_id, client_id}`(同一 `client_id` 返回同一执行)把成员的全部待投递请求打包;`POST executions/ID {action}` 支持 `renew`(租约 120 秒,不超过单次执行时限,默认 20 分钟)、`fail`(请求标记失败)和 `release`(仅确认未送达时退回队列)。租约过期的执行在下次读取或领取时标记失败,不自动重发。
259
260
  - **主持人与任务链**:用户是需求方,不担任主持人。只要有在场的非在线成员,房间就保持恰好一位主持人:成员变动时,离开或移出的主持人失去角色,由第一位在场的 runner 成员(没有则手动成员)接任;建房和每条房主消息前也做同样的补位,因此旧房间在下一条消息时自动获得主持人。房主用 `POST members/ID {action:"role", role:"host"}` 更换主持人(在线成员不能担任),把现任主持人改为 `member` 会被拒绝。多位成员时未点名的房主消息生成给主持人的 `route` 请求。主持人的回答可带 `to` 点名其他成员(不能点名自己),这些请求组成一个批次(`free_batches`);批次内全部进入终态后,只要有一个完成就给主持人生成一次 `handoff` 请求,全部失败则停下该任务链。每条房主消息开启一条任务链(`chain_id` 为该消息编号),链上 AI 发起的请求(派活与回交)最多 8 次,超出即停下(`free_chains`,原因 `budget` / `all_failed`),房主发新消息开启新链。Worker 用同一批次内的集合 SQL 完成回交,回交请求按(派活消息,主持人)唯一,重复执行不会重复唤醒。
260
- - **智能调度推荐**:接入程序用控制凭据 `POST recommendations {message_id, member_id, provider, confidence}` 为一条已交给主持人(`route`)的未点名消息记录推荐对象(在场、由本机唤醒、非该主持人),写入 `member_recommendations`(每条消息一条,重复提交忽略;独立表,D1 重新应用 schema 即可),有效期 60 秒,主持人的请求不受影响。房主用 `POST recommendations/MESSAGE_ID {action:"adopt", mode}` 采纳:`interrupt` 取消主持人这条请求(已投递则作废主持人本次整个执行),`after` 等主持人这条请求进入终态。两种方式都先置为 `waiting`,由 `release`(采纳时与每次 `inbox` 读取时执行)在主持人请求已终态时为推荐成员建一条 `ask` 请求(`created_by=user`、`chain_id` 为原消息),状态改为 `adopted`。过期 5 秒宽限后采纳返回 409,重复采纳返回原结果。房间视图 `free.recommendations` 带成员名、状态、方式、置信度与剩余秒数 `expires_in`;备份、导入(仅作历史,不再生效)与删除一并处理。`inbox` 的待投递项带 `purpose` 供接入程序识别。
261
+ - **智能调度推荐**:接入程序用控制凭据 `POST recommendations {message_id, member_id, provider, confidence}` 为一条已交给主持人(`route`)的未点名消息记录推荐对象(在场的非该主持人成员,含手动与在线成员),写入 `member_recommendations`(每条消息一条,重复提交忽略;独立表,D1 重新应用 schema 即可),有效期 60 秒,主持人的请求不受影响。房主用 `POST recommendations/MESSAGE_ID {action:"adopt", mode}` 采纳:`interrupt` 取消主持人这条请求(已投递则作废主持人本次整个执行),`after` 等主持人这条请求进入终态。两种方式都先置为 `waiting`,由 `release`(采纳时与每次 `inbox` 读取时执行)在主持人请求已终态时为推荐成员建一条 `ask` 请求(`created_by=user`、`chain_id` 为原消息),状态改为 `adopted`。过期 5 秒宽限后采纳返回 409,重复采纳返回原结果。房间视图 `free.recommendations` 带成员名、状态、方式、置信度与剩余秒数 `expires_in`;备份、导入(仅作历史,不再生效)与删除一并处理。`inbox` 的待投递项带 `purpose` 供接入程序识别。`inbox.members` 只列由本机唤醒的成员;手动与在线成员另列于 `inbox.observers`(含待处理请求,供智能调度识别主持人与推荐对象),接入程序从不向它们投递。
261
262
  - **回应建议**:普通成员新发言的结构化 `to` 与正文在场成员 @ 合并保存到 `member_suggestions`(原消息编号、稳定成员编号),排除自己、代码与引用;不会创建请求。消息读取返回 `suggestions`,包含目标在场状态及已转换的请求编号。房主用 `POST suggestions {message_id,member_id}` 转换:同一事务记录用户确认消息,调用现有建请求路径,`message_id` 保留原回答、`chain_id` 使用用户确认消息编号、`created_by=user`。`UNIQUE(message_id,member_id)` 使重复或并发点击只生成一个请求及一条确认,终态不重新派发。权限、在场状态和未存档条件在写入事务内校验;Worker 使用批次断言。升级须应用包含新表的 schema;Python 重启时自动建表,D1 发布前显式执行。已有历史消息不补写建议。
263
+ - **讨论中的直接提问**:讨论房间的用户消息带 `to`(点名成员名列表)时,除保存消息外为每位被点名的在场成员建一条 `ask` 请求(`created_by=user`,不入 `free_batches`,不占安排);讨论运行中点名主持人不重复建请求。`GET inbox`、`POST executions` 与 `executions/ID` 对讨论房间同样可用,成员以 `execution_id`(接入程序交付)或 `request_ids`(手动 / 代发)提交 `chat` 回答,走自由房间的写入校验。同一成员的 `member_executions` 与 `discussion_events` 互斥(任一方领取时另一方有进行中则返回 409)。房间视图 `asks` 给出最近请求与执行,供消息旁的状态徽标。本机服务以 `DiscussionWithQuestions`(`runner/discussion_service.mjs`)并行运行讨论 runner 与 `FreeRoomRunner`,共用同一成员会话绑定。
262
264
  - **在线成员**:`access=online` 的成员只读,不进入 `inbox`,不能用自己的凭证发言;房主以控制凭据代发其回答(`author` 为该成员、`submitted_by` 为用户、`source=proxy`),可带 `request_ids` 关闭它的待处理请求。
263
265
  - **关联房间**:从自由房间发起的讨论房间在建房时带 `parent_room_id`,记录在 `room_links`;讨论房间视图有 `parent_room`,自由房间视图列出 `linked_rooms`。头脑风暴的轮次、时长与名单因此天然独立于自由房间。
264
266
  - **手动成员**:手动成员不进入 `inbox`,也不能被领取执行;它用成员凭证读写,回答时可带 `request_ids` 关闭自己的待处理请求,不带则是普通发言、不关闭任何请求。
265
267
  - **改动记录**:接入程序在执行前后对成员 cwd 做 Git 工作区快照(状态与内容哈希),执行结束且进程退出后用 `report {changes}` 记录一次。房间视图的 `free.conflicts` 列出不同成员在同一 cwd、时段重叠的执行均观察到变化的文件,只作“可能冲突”提示;非 Git 目录不记录。快照也会包含其他进程在同一目录的写入,不能确定修改者;分工修改不同文件仍可能出现提示,不代表已发生覆盖。
266
268
  - **回答**:接入程序投递的成员回答须带 `execution_id` 并使用成员凭证;消息保存、执行完成、请求完成和成员已读游标在同一事务中写入。执行结束、被打断或过期后的回答返回 409;缺少执行编号返回 400,不能改作普通发言。消息类型为 `chat`,不计入讨论轮次。
267
269
  - **打断**:`POST members/ID/interrupt`(控制凭据)作废该成员的进行中执行及所有未投递请求,不会自动重新开始;成员的已读游标不前移,下一次请求从同一位置读起。执行失败只影响该成员的请求,房间不暂停。
268
- - **讨论成员变更**:房主修改讨论名单或读写能力时,为新增或改变能力的成员提供新凭证,未变成员保留原凭证;删去的成员立即停用。成员主持不能自行扩大名单或更改主持职责。运行中名单只能经 `POST members`(邀请,接入方式须与推进方式一致)与 `POST members/ID {action: away|active|remove}` 变更,“编辑议题”改名单返回 400。暂离从 `experts` 中移出、成员行保持 `away`,同事务取消它进行中与排队的安排;请回须新凭证;主持人不能暂离或移除;有进行中安排的专家仅在话题暂停时可暂离或移除。暂停时 `{action: redo}` 删除该专家最近一条观点(含摘要、耗时、附件,被其回答的安排改为 `cancelled`)。`experts` 变化不再暂停运行:触发器 `runtime_experts_changed` 在无进行中安排和主持执行时为主持人生成 `members:` 事件,纯新增专家保留排队安排;邀请事务通过 `queue_invited_expert` 将新专家的开场安排追加为 `queued`,到它轮次才产生执行。无现有安排、暂停或收束期间不自动创建安排,由主持人恢复推进时排在本轮末尾。暂离、移除、请回仍作废排队并重排;只有更换主持人才暂停并换代。本机接入程序接受只新增参与者的配置变化,已绑定会话的条目仍须保持不变。
270
+ - **讨论成员变更**:房主修改讨论名单或读写能力时,为新增或改变能力的成员提供新凭证,未变成员保留原凭证;删去的成员立即停用。成员主持不能自行扩大名单或更改主持职责。运行中名单只能经 `POST members`(邀请,接入方式须与推进方式一致)与 `POST members/ID {action: away|active|remove}` 变更,“编辑议题”改名单返回 400。暂离从 `experts` 中移出、成员行保持 `away`,同事务取消它进行中与排队的安排;请回须新凭证;主持人不能暂离或移除;有进行中安排的专家仅在话题暂停时可暂离或移除。已保存的观点不能删除,没有 `redo` 动作。`experts` 变化不再暂停运行:触发器 `runtime_experts_changed` 在无进行中安排和主持执行时为主持人生成 `members:` 事件,纯新增专家保留排队安排;邀请事务通过 `queue_invited_expert` 将新专家的开场安排追加为 `queued`,到它轮次才产生执行。无现有安排、暂停或收束期间不自动创建安排,由主持人恢复推进时排在本轮末尾。暂离、移除、请回仍作废排队并重排;只有更换主持人才暂停并换代。本机接入程序接受只新增参与者的配置变化,已绑定会话的条目仍须保持不变。
269
271
  - **范围**:成员名称是 AI 实例名(见下文“参与者身份”),一个房间最多 12 位 AI。早期创建的自由房间表在 Python 启动时补齐新列。Cloudflare Worker 实现同一协议:成员与执行状态的校验放在同一 D1 批次的断言中,校验后状态变化则整批回滚。备份只导出成员名称、状态与请求,不导出凭据哈希。
270
272
 
271
273
  ## 参与者身份
272
274
 
273
- 平台是类型,参与者是实例。`backend/identity.py`、Worker、CLI、启动器与网页使用同一规则:用户,或 `平台名` / `平台名-后缀`(后缀 1–16 个字母、数字、下划线或汉字)。各端按前缀确定平台,用于头像、可用客户端和适配器;消息作者、发言权、安排、成员、会话绑定与私有配置都按完整实例名区分,因此两个 Claude 实例有各自的会话和凭证。房间最多 12 位 AI。启动器为新实例继承平台的本机配置,但不继承另一实例绑定的会话;运行中邀请时由启动器取未用过的名称(`Claude-2`、`Claude-3` …),已移除成员的名称不会复用,以免续接到它的旧会话。
275
+ 平台是类型,参与者是实例。`backend/identity.py`、Worker、CLI、启动器与网页使用同一规则:用户,或 `平台名` / `平台名-后缀`(后缀 1–16 个字母、数字、下划线或汉字)。各端按前缀确定平台,用于头像、可用客户端和适配器;消息作者、安排、成员、会话绑定与私有配置都按完整实例名区分,因此两个 Claude 实例有各自的会话和凭证。房间最多 12 位 AI。启动器为新实例继承平台的本机配置,但不继承另一实例绑定的会话;运行中邀请时由启动器取未用过的名称(`Claude-2`、`Claude-3` …),已移除成员的名称不会复用,以免续接到它的旧会话。
274
276
 
package/docs/cli.md CHANGED
@@ -53,11 +53,11 @@ codiscuss message post ROOM --as 用户 --body "请参考附件" --attachment AT
53
53
 
54
54
  上传回执中的 `attachment.id` 是后续引用的编号;上传和消息分别使用自己的提交编号。单个文件最多 20 MiB,消息最多重复指定 10 次 `--attachment`;仅附件消息可省略正文。普通 `attachment list ROOM` 只列已发送附件,可加 `--message ID`、`--page N`;精确提交查询用于核对未关联的上传。下载路径必须明确、父目录已存在且目标文件不存在;客户端验证长度和 SHA-256,不覆盖已有文件。
55
55
 
56
- 所有写入须有对应凭据;使用 `--access-file` 或接入程序绑定的 `DISCUSS_ACCESS_FILE`。自动任务先上传,再提交关联回答;回答完成后执行凭据不能继续上传。AI 发言仍需有效安排、发言权和摘要;下载后由参与软件自身工具读取,不默认把全部附件加入通知。`--dry-run` 预览路径与元数据,不上传字节或创建下载文件。结果不明先查原上传编号;重试沿用原文件、身份和编号。
56
+ 所有写入须有对应凭据;使用 `--access-file` 或接入程序绑定的 `DISCUSS_ACCESS_FILE`。自动任务先上传,再提交关联回答;回答完成后执行凭据不能继续上传。AI 发言仍需有效安排和摘要;下载后由参与软件自身工具读取,不默认把全部附件加入通知。`--dry-run` 预览路径与元数据,不上传字节或创建下载文件。结果不明先查原上传编号;重试沿用原文件、身份和编号。
57
57
 
58
58
  ## 讨论上限参数
59
59
 
60
- `room create` / `room update` 支持 `--max-rounds`、`--max-minutes`、`--execution-minutes`(三者均以 0 表示不限;单次执行默认 0,可设 1–60 分钟)、`--on-limit pause|summarize`、`--summary-minutes`。未传字段沿用旧值;活动阶段须先暂停才能改上限。`room view` 包含 `limits` 与 `completed_rounds`,`room limits ROOM` 单独读取,`room limits ROOM --check --as 身份 --access-file FILE` 检查并执行到限处理;`room limits ROOM --done --conclusion REV --as 主持人`(REV 来自 `room conclusion ROOM`,未带或过期被拒绝)通知程序目标已完成:到限方式为暂停时暂停并保留现场,为总结时进入总结,均不直接收束。检查不会启动 AI,也不代写总结。用户侧追加轮次、要求总结与重启已收束讨论走 `POST /api/rooms/ROOM/limits`,`action` 为 `extend`(`rounds`)、`summarize`、`reopen`(`max_rounds`、`max_minutes`),仅限用户。
60
+ `room create` / `room update` 支持 `--max-rounds`、`--max-minutes`、`--execution-minutes`(三者均以 0 表示不限;单次执行默认 0,可设 1–60 分钟)。到限一律暂停,不再有 `--on-limit` / `--summary-minutes`(旧客户端传 `on_limit=pause` 被忽略,传 `summarize` 被拒绝)。未传字段沿用旧值;活动阶段须先暂停才能改上限。`room view` 包含 `limits` 与 `completed_rounds`,`room limits ROOM` 单独读取,`room limits ROOM --check --as 身份 --access-file FILE` 检查并执行到限处理;`room limits ROOM --done --conclusion REV --as 主持人`(REV 来自 `room conclusion ROOM`,未带或过期被拒绝)通知程序目标已完成:暂停并保留现场,不直接收束。检查不会启动 AI,也不代写总结。用户侧追加轮次与重启已收束讨论走 `POST /api/rooms/ROOM/limits`,`action` 为 `extend`(`rounds`)、`reopen`(`max_rounds`、`max_minutes`),仅限用户。
61
61
 
62
62
  `run start` 的 `--deadline` 可省略,此时采用房间总时长;房间总时长为 0 时不限总时长。显式传 0 也表示不另设运行期限,仍受话题上限约束;非零值与话题截止取更早值。不限总时长仍受轮次上限、主动设置的单次执行超时及手动停止约束。暂停或重新启动不会重置话题计时;继续前需调整已耗尽的上限。
63
63
 
@@ -80,7 +80,7 @@ codiscuss room brief $room
80
80
  codiscuss room protocol $room
81
81
  ```
82
82
 
83
- `--experts-file` 替换完整参与配置,更新时不可只传单个增量。`--host` 可显式指定主持人,默认采用创建操作者。新房间发言权由主持人持有,之后每次需读取最新状态。名单与主持职责只能由房主变更;新增或改变读写能力时,使用网页或 `api` 同时提供对应 `members` 及新凭据,保留未变成员凭据。
83
+ `--experts-file` 替换完整参与配置,更新时不可只传单个增量。`--host` 可显式指定主持人,默认采用创建操作者。名单与主持职责只能由房主变更;新增或改变读写能力时,使用网页或 `api` 同时提供对应 `members` 及新凭据,保留未变成员凭据。
84
84
 
85
85
  主持人创建安排并回读:
86
86
 
@@ -89,7 +89,6 @@ $turn_submission = [guid]::NewGuid().ToString()
89
89
  $planned = codiscuss turn create $room --as Codex --expert Gemini --question '基于议题资料提出你的初始观点、依据与风险。' --submission-id $turn_submission --access-file $host_access | ConvertFrom-Json
90
90
  $turn = $planned.data.turn.id
91
91
  codiscuss turn view $room $turn
92
- codiscuss floor view $room
93
92
  codiscuss turn prompt $room $turn -o text
94
93
  ```
95
94
 
@@ -100,27 +99,20 @@ Gemini 在自己的会话中读取实际房间与安排,并将完整回答保
100
99
  ```powershell
101
100
  codiscuss room view $room
102
101
  codiscuss turn current $room
103
- $floor = (codiscuss floor view $room | ConvertFrom-Json).data
104
- codiscuss floor take $room --as Gemini --revision $floor.revision --access-file $expert_access
105
- codiscuss floor view $room
106
102
  $answer_submission = [guid]::NewGuid().ToString()
107
103
  $posted = codiscuss message post $room --as Gemini --turn $turn --summary '在此填写回答的简述' --body-file data/answer.txt --submission-id $answer_submission --access-file $expert_access | ConvertFrom-Json
108
104
  codiscuss message view $room $posted.data.message.id
109
105
  codiscuss turn current $room
110
- codiscuss floor view $room
111
106
  ```
112
107
 
113
- 确认 `holder` 为自己才能提交;否则保留草稿等待。完整原文保存成功后安排为 `answered`,发言权自动归还,下一位为主持人。主持人读过回答后更新状态,并在下一次安排或主持发言前重新领取:
108
+ 完整原文保存成功后安排为 `answered`,下一位为主持人。主持人读过回答后更新状态:
114
109
 
115
110
  ```powershell
116
111
  codiscuss state set $room --as Codex --body-file data/state.txt --brief-file data/brief.txt --until $posted.data.message.id --access-file $host_access
117
112
  codiscuss state view $room
118
- $floor = (codiscuss floor view $room | ConvertFrom-Json).data
119
- codiscuss floor take $room --as Codex --revision $floor.revision --access-file $host_access
120
- codiscuss floor view $room
121
113
  ```
122
114
 
123
- 先按实际阅读结果准备 `data/state.txt` 与 `data/brief.txt`。跨会话时使用已核对的消息编号,不假定别的终端变量存在。共享状态更新本身不占用发言权。
115
+ 先按实际阅读结果准备 `data/state.txt` 与 `data/brief.txt`。跨会话时使用已核对的消息编号,不假定别的终端变量存在。
124
116
 
125
117
  ## 常用命令
126
118
 
@@ -131,17 +123,16 @@ codiscuss floor view $room
131
123
  | 查找原文 | `message list ROOM --query 关键词 --author Gemini --page 1` |
132
124
  | 查看 @ | `message list ROOM --mention Codex` |
133
125
  | 增量读取 | `message list ROOM --after ID`,按返回的 `next_after` 续读 |
134
- | 主持发言 | 领取后 `message post ROOM --as Codex --kind moderation --body-file FILE --submission-id UUID` |
135
- | 在线专家代发 | 被正式安排后,由主持人 `floor take ROOM --as Codex --speaker Claude --revision N`,再 `message post ROOM --as Codex --author Claude --turn TURN --summary-file SUMMARY --summary-by Claude --body-file FILE --submission-id UUID` |
136
- | 放弃发言 | `floor return ROOM --as NAME --revision N`;未完成安排仍需处理 |
137
- | 整轮安排 | 主持人领取后 `turn roster ROOM` 后 `turn create ROOM --as Codex --plan-file PLAN.json --roster REV --submission-id UUID`;PLAN 为 `[{"expert":"Claude","question":"…"}]`,按顺序接力;多项计划须先 `turn roster ROOM` 取得最新专家状态,把其 `revision` 用 `--roster` 带上,并包含 `waiting` 中的每位专家(主持人除外;尚未注册的手动专家列在 `unregistered`,不在 `waiting` 中,也不能被安排,否则返回 400 并列出名字):未带 revision 返回 400,名单已变化返回 409,缺人返回 400 并列出名字 |
138
- | 继续原计划 | 用户介入或打断后,主持人领取并 `turn continue ROOM --as Codex`;改用新安排则排队自动作废 |
139
- | 取消安排 | 主持人领取后 `turn cancel ROOM TURN --as Codex` |
126
+ | 主持发言 | `message post ROOM --as Codex --kind moderation --body-file FILE --submission-id UUID` |
127
+ | 在线专家代发 | 被正式安排后,主持人 `message post ROOM --as Codex --author Claude --turn TURN --summary-file SUMMARY --summary-by Claude --body-file FILE --submission-id UUID` |
128
+ | 整轮安排 | 主持人 `turn roster ROOM` 后 `turn create ROOM --as Codex --plan-file PLAN.json --roster REV --submission-id UUID`;PLAN 为 `[{"expert":"Claude","question":"…"}]`,按顺序接力;多项计划须先 `turn roster ROOM` 取得最新专家状态,把其 `revision` 用 `--roster` 带上,并包含 `waiting` 中的每位专家(主持人除外;尚未注册的手动专家列在 `unregistered`,不在 `waiting` 中,也不能被安排,否则返回 400 并列出名字):未带 revision 返回 400,名单已变化返回 409,缺人返回 400 并列出名字 |
129
+ | 继续原计划 | 用户介入或打断后,主持人 `turn continue ROOM --as Codex`;改用新安排则排队自动作废 |
130
+ | 取消安排 | 主持人 `turn cancel ROOM TURN --as Codex` |
140
131
  | 切换阶段 | `room update ROOM --as Codex --phase discussing` |
141
132
  | 暂停 / 收束 | `room update ROOM --as Codex --phase paused` / `concluded`;按工作流先完成必要记录和清理。主持人收束须先 `room conclusion ROOM` 取得阻碍项 `blockers` 与 `revision`,再 `--conclusion REV`:未带返回 400,状态已变返回 409,有未处理留言、state 未覆盖最新发言或仍有排队安排返回 400;已收束的讨论只有用户能重新开启 |
142
133
  | 检查参数 | `schema COMMAND SUBCOMMAND` 或 `COMMAND SUBCOMMAND --help` |
143
134
 
144
- 代发时只有原作者确实提供该摘要才写 `--summary-by 原作者`;主持人整理的摘要标注主持人。必要 `receipt` 也需发言权,不能带 `--turn`,正常启停不生成。
135
+ 代发时只有原作者确实提供该摘要才写 `--summary-by 原作者`;主持人整理的摘要标注主持人。`--kind` 只有 `opinion`、`moderation`、`chat`;运行回执(`receipt`)已取消,`message list --kind receipt` 仅用于读取旧房间的历史回执。
145
136
 
146
137
  `--after` 与 `--page` 互斥;每次最多 20 条,`has_more` 表示还有内容。过滤后的游标仅代表该过滤范围,不能作为全部材料的已读截止。阶段、安排和发言权需单独读取。
147
138
 
@@ -187,7 +178,7 @@ codiscuss message list $room --submission-id $answer_submission
187
178
  | 3 | 网络失败或结果不能确认;POST 可能已保存 |
188
179
  | 130 | 中断,写入结果需核对 |
189
180
 
190
- `--as` 声明业务身份,不是身份认证;所有房间写入都必须带有效的 `--access-file`,不能仅凭发言权写入。
181
+ `--as` 声明业务身份,不是身份认证;所有房间写入都必须带有效的 `--access-file`,不能仅凭 `--as` 写入。
191
182
 
192
183
  ## 运行控制与一次执行
193
184
 
@@ -122,7 +122,7 @@ npm run deploy -- --cwd .wrangler/deploy
122
122
 
123
123
  管理员注册:Cloudflare 站点须先设置安装令牌机密,未设置则无法注册管理员:`npx wrangler pages secret put ADMIN_SETUP_KEY --project-name YOUR_PROJECT_NAME`。忘记密码时在 D1 执行 `DELETE FROM admin_sessions; DELETE FROM site_admin;` 后重新注册。
124
124
 
125
- 第一次对新库执行 schema;升级已有站点前先备份并在本地副本核验迁移。当前 schema 以增量表、索引和触发器扩展数据结构,重复执行不应清空已有记录或重置发言权;仍需按实际升级版本测试。
125
+ 第一次对新库执行 schema;升级已有站点前先备份并在本地副本核验迁移。当前 schema 以增量表、索引和触发器扩展数据结构,重复执行不应清空已有记录;仍需按实际升级版本测试。
126
126
 
127
127
  `deploy` 会先构建,再将 `dist/pages/` 发布到 `main`。配置为真值前不要直接运行根目录默认部署。构建本身不发布、不改远端数据库。Git 集成部署需自行将实际 D1 配置提供给构建环境,不能直接用公开模板当作生产配置。
128
128
 
@@ -216,7 +216,7 @@ codiscuss run start ROOM --site SITE --revision REV --access-file "PRIVATE.json"
216
216
 
217
217
  网页“重启”按钮用于已暂停或到期的自动讨论;尚未启动的新房间使用上述命令。超过既定上限时先调整上限再继续。`codiscuss service status` 中的“运行中”表示房间运行状态,实际 AI 是否进入及是否保存结果,以网页执行回执为准;“等待启动”表示房间当前未自动运行。暂停单个房间使用网页暂停或 `codiscuss run pause …`,停止本机服务则用 `codiscuss service stop`,后者会暂停它托管的所有活动房间。
218
218
 
219
- 轮次、时长及单次执行上限由网站保存并校验;到限后暂停或交给主持人收束,收束预留计入总时长。准备/暂停阶段可编辑参数,保存不重新计时。运行控制字段见 [CLI 使用](cli.md#运行控制与一次执行)。
219
+ 轮次、时长及单次执行上限由网站保存并校验;到限后暂停,由用户决定追加轮次或结束。准备/暂停阶段可编辑参数,保存不重新计时。运行控制字段见 [CLI 使用](cli.md#运行控制与一次执行)。
220
220
 
221
221
  需要单个房间运行而不使用常驻服务时,可在仓库执行 `npm run runner -- start --config FILE --minutes 60`;`watch` 仅恢复事件消费,不恢复已暂停房间。`--minutes` 可省略并采用网页总时长,0 表示不另设运行期限;同时设置时取更早的非零截止。话题和运行均不限总时长时,按轮次上限或手动停止结束,主动设置的单次执行超时仍有效;不要让独立 runner 与常驻服务同时消费同一房间配置。
222
222
 
package/docs/runner.md CHANGED
@@ -126,7 +126,7 @@ python server.py --host 127.0.0.1 --local-launch
126
126
 
127
127
  Codex 切换必须已有实际会话;程序从原绑定读取编号,保留运行目录、事件记录及其他参与者的绑定。服务只在暂停状态且自己启动的旧 CLI 进程已退出后采用切换。切到 App 后保持 App 运行,模型、思考强度和实际文件权限由 App 设置,任务仍携带本场项目读写要求;原 CLI 模型设置保留供切回时使用。切回 CLI 前必须让 App 实际释放原会话,不能只看空闲状态;本功能不强制关闭 App 或夺取写入锁,未释放时执行会报占用并暂停。保存或队列受理都不代表已发言,重启后核对执行进入与保存的原文。
128
128
 
129
- 新建表单切到全自动时,默认选入已配置路径的本地软件,并选择其中一位主持;没有配置则需明确选择和补齐。支持的软件列表不会全部自动参会,手动与自动模式各保留本次表单中的选择。只有自动模式显示单次 AI 执行上限,默认不限,留空或 0 表示不限,按需填写 1–60 分钟。“直接结束(不总结)”保留已有记录;需要主持总结时,在允许收尾的运行状态使用“请主持人收尾”。
129
+ 新建表单切到全自动时,默认选入已配置路径的本地软件,并选择其中一位主持;没有配置则需明确选择和补齐。支持的软件列表不会全部自动参会,手动与自动模式各保留本次表单中的选择。只有自动模式显示单次 AI 执行上限,默认不限,留空或 0 表示不限,按需填写 1–60 分钟。“结束讨论”保留已有记录并回到自由协作;需要主持总结时,直接请主持人写一份。
130
130
 
131
131
  网页启动由显式启用的 Python 回环服务执行;Cloudflare、普通 Python 公共部署不提供本机配置或进程操作。`--local-launch` 拒绝非 `127.0.0.1` 监听,本机页面继续使用同源接口;线上页面须先完成下节的站点授权,随后由浏览器直接请求本机服务。Node 启动器生成私有配置并调用接入服务,API 模型调用仅发生在已启动房间的有效执行中。启动器会启动或复用讨论服务;网站与服务仍是独立进程。
132
132
 
@@ -175,7 +175,7 @@ codiscuss launch start --file 本次启动.json
175
175
  | `cwd`、`discussion_project` | 本次公共目录 / 项目,可省略;参与者的 cwd / project_name / project_id 优先 |
176
176
  | `minutes` | 本次运行时长,默认采用房间 max_minutes;范围 [0,1440],0 表示不限总时长,仍受房间已设上限约束 |
177
177
 
178
- 预览核对软件字段、路径、参与方式和讨论上限,不创建房间、服务或 AI;它不证明账号登录和工具权限已就绪。不限总时长时,运行的 `deadline` 为 0,按轮次上限或手动停止结束;执行租约与单次超时继续有效,进入收束后按收束预留生成有限截止。启动回执只含房间、状态与文件路径,不输出令牌。`current_task` 返回当前主持须读取的任务文件和本次执行凭据路径,随后按参与技能实际 `execution enter`。
178
+ 预览核对软件字段、路径、参与方式和讨论上限,不创建房间、服务或 AI;它不证明账号登录和工具权限已就绪。不限总时长时,运行的 `deadline` 为 0,按轮次上限或手动停止结束;执行租约与单次超时继续有效。启动回执只含房间、状态与文件路径,不输出令牌。`current_task` 返回当前主持须读取的任务文件和本次执行凭据路径,随后按参与技能实际 `execution enter`。
179
179
 
180
180
  建房提交号、房间控制凭据、各实例的成员凭证、本次解析后的软件配置、启动期望版本和首个主持执行先保存在本机,再进行后续操作。网页已生成的成员凭证由启动器保留,不能重新生成造成交付文件失效。网络结果不明时沿用原文件重试,不换提交号;重试使用本次已保存配置,后来修改本机默认值只影响新请求。改变单场显式配置仍会被拒绝作为同次重试。启动后的房间仍需从原进度看板明确继续,重复启动不会自动恢复暂停或结束的讨论。已使用其他配置登记的房间拒绝重复接管,沿用原配置。
181
181
 
@@ -271,7 +271,7 @@ Windows 的 `executable` 填原生 `.exe`,不填 npm 的 `.cmd` / `.ps1` 包
271
271
 
272
272
  ### 单次执行权限
273
273
 
274
- 每次执行只开放本场讨论所需的最小权限,不使用全部放行或绕过审批参数。任务文件的 `cli` 为 `codiscuss`;Windows 下 Codex 与 agy 经 PowerShell 执行命令,npm 生成的 `codiscuss.ps1` 会被执行策略拒绝,因此改为 `codiscuss.cmd`,Claude 仍用 `codiscuss`。`subcommands` 列出唯一放行的网站子命令:`room`、`message`、`turn`、`state`、`floor`、`execution`、`health`、`schema`;`service`、`launch`、`run`、`api`、`setup`、`install`、`local` 不放行。提示词要求命令以该 `cli` 开头,不用 `python discuss.py`、`cd` 或管道。规则不含路径,重装或更换 Python 无需更新;子进程 PATH 中的 `codiscuss` 须指向本次安装,setup 的持久命令检查会核对。
274
+ 每次执行只开放本场讨论所需的最小权限,不使用全部放行或绕过审批参数。任务文件的 `cli` 为 `codiscuss`;Windows 下 Codex 与 agy 经 PowerShell 执行命令,npm 生成的 `codiscuss.ps1` 会被执行策略拒绝,因此改为 `codiscuss.cmd`,Claude 仍用 `codiscuss`。`subcommands` 列出唯一放行的网站子命令:`room`、`message`、`turn`、`state`、`execution`、`health`、`schema`;`service`、`launch`、`run`、`api`、`setup`、`install`、`local` 不放行。提示词要求命令以该 `cli` 开头,不用 `python discuss.py`、`cd` 或管道。规则不含路径,重装或更换 Python 无需更新;子进程 PATH 中的 `codiscuss` 须指向本次安装,setup 的持久命令检查会核对。
275
275
 
276
276
  项目文件权限 `project_access` 为 `read`(默认)或 `write`:启动文件顶层设本场值,`participants.NAME.project_access` 覆盖单个 AI,空字符串表示沿用本场值。它只随本次启动保存,不能存入本机默认配置;网页新建讨论在每张自动 CLI 卡片上设置该 AI 的项目文件权限,不再提供本场共享的权限选项;已建房间的“接入”页仍可设置本场值与单个 AI 覆盖。三种 CLI 都在用户指定的 cwd 启动;省略 cwd 时才使用独立草稿目录。agy 的权限全部由其独立讨论项目执行,见下文。App 适配器的写权限由 App 自身决定,任务文件始终写明本场要求。
277
277
 
@@ -318,6 +318,8 @@ Codex 要求 CLI 0.163.0 或更新版本,使用 permission profiles 和本地
318
318
 
319
319
  运行中的讨论同样可用 `room-member` 邀请或请回专家,但只接受由本机唤醒的成员(不接受 `access: manual`)。`participants[name].session_id` 指定已有会话时,成员标记为 `borrowed`,首次投递即续接该会话;网页仅对 Codex CLI / App 与 Claude 提供此项,agy 照旧拒绝。邀请前在本机核对会话确实存在(Codex 查 `CODEX_HOME/sessions`,Claude 查 `CLAUDE_CONFIG_DIR/projects`),填错时当场报错,不会让讨论在轮到它时暂停;Claude 会话只能在原目录续接,未指定项目时沿用原目录,项目目录不同则拒绝。Codex 会话若正被 App 持有,CLI 续接报 active writer,进度看板在暂停原因下提供“切换到 Codex App”,保存采用后可在弹窗内重启。常驻服务每轮检查成员视图:已注册(`registered_at` 非空)且带 `reported_session` 的手动 Claude 专家,`adopt_member_profile` 在本机配置登记其借用会话(会话须存在于 `CLAUDE_CONFIG_DIR/projects` 且 Claude 软件已配置),随后调用 `adopt` 把成员转为托管;任一步失败则保持手动并记录一次日志,同一会话 ID 不重试。讨论配置只新增参与者时常驻服务直接采用,讨论不暂停;已有参与者的项目、cwd 或身份变化仍须暂停后重新接入。
320
320
 
321
+ 讨论房间同样登记一个 `FreeRoomRunner`(`DiscussionWithQuestions`):只投递用户的直接提问(`ask`),任务文件说明“这不是发言安排,不改变讨论进度”;与讨论执行互斥由网站保证。
322
+
321
323
  每次检查读取 `inbox`:成员没有进行中的执行且有待投递消息时,先持久化本地 `client_id` 再领取执行,然后用原适配器续接该成员的绑定会话;任务文件列出执行编号、待处理消息和已读起点,凭据文件只含成员凭证。进程退出而网站未收到回答、软件报错或超过单次执行时限时报告失败;只有确认未送达才退回队列重试,最多 3 次。领取后、调用前中断的投递不自动重发。主持人的任务文件带 `role: "host"` 和每条请求的 `request_purposes`(`ask` / `route` / `handoff`),说明里写明如何用 `--to` 派活与何时结束。网站上执行被打断、成员离开或被移除后,只停止该成员的进程;不同成员各自投递,可以并行。成员配置了 cwd 且位于 Git 工作区时,执行前后各做一次快照,执行结束且进程退出后报告改动的文件,供网站提示可能冲突;服务重启会丢失尚未报告的快照。只能在网页创建自由房间,不支持对话入口。
322
324
 
323
325
  ### 智能调度(可选)
@@ -330,8 +332,8 @@ Codex 要求 CLI 0.163.0 或更新版本,使用 permission profiles 和本地
330
332
  - **讨论房间(有把握即执行)**:投递主持事件前先只读判断,置信度 ≥ 0.7 才执行,否则照常唤醒主持人:
331
333
  - **插话**:`held_since` 后恰有一条用户留言时判断。仅补充信息且有排队安排 → `turns/continue`;在问某位非主持专家 → 新计划先请该专家回应这条留言(问题引用原文 300 字),原排队安排按原顺序跟在后面(最多 10 项);改变方向、多条留言或话题修改 → 主持人。仅补充但计划已结束时,按下一条处理。
332
334
  - **轮次衔接**:仅 `named_followup` 为 false、无排队、上一轮已完成时判断。继续 → 先请模型选出的专家(不是上一轮最后发言者),其余按房间专家顺序,统一使用 `peer_round_question`;第 1 轮后自动把阶段从 `initial` 改为 `discussing`。可收束、跑偏、重复或卡住 → 主持人。
333
- - **执行方式**:有把握时 runner 领取该主持事件,以 `smart-scheduler` 会话进入,用本次执行凭据以主持人身份领取发言权、改阶段、创建或继续安排;网站的发言权、上限与凭据校验照常生效。到限、阶段不在进行中或已有进行中安排时不判断。执行中任一写入失败,把同一事件交回主持人软件并标记已进入(任务说明与 API 主持都跳过 `execution enter`)。判断失败或置信度不足时,主持任务附 `scheduler_suggestions` 供参考。
334
- - **成员变化**:新邀请的专家由网站在入场事务中加入现有队列的补齐位置(本轮未发言的专家之后、会再次发言的专家之前,没有重复时在队尾),当前执行与其余安排的相对顺序不变,runner 到它的安排生效时才交付;手动专家仍由原会话提交。暂离、移除、请回等需要重排的变化会作废排队安排(留下最近一次实际安排之后的 `skipped`)。本轮未完成且无排队时,runner 不调用模型,按原顺序补回仍在场专家的安排,再请本轮尚未发言的专家开场,不唤醒主持人。
335
+ - **执行方式**:有把握时 runner 领取该主持事件,以 `smart-scheduler` 会话进入,用本次执行凭据以主持人身份改阶段、创建或继续安排;网站的上限与凭据校验照常生效。到限、阶段不在进行中或已有进行中安排时不判断。执行中任一写入失败,把同一事件交回主持人软件并标记已进入(任务说明与 API 主持都跳过 `execution enter`)。判断失败或置信度不足时,主持任务附 `scheduler_suggestions` 供参考。
336
+ - **成员变化**:新邀请的专家由网站在入场事务中加入现有队列的末尾,当前执行与其余安排的相对顺序不变,runner 到它的安排生效时才交付;手动专家仍由原会话提交。暂离、移除、请回等需要重排的变化会作废排队安排(留下最近一次实际安排之后的 `skipped`)。本轮未完成且无排队时,runner 不调用模型,按原顺序补回仍在场专家的安排,再请本轮尚未发言的专家开场,不唤醒主持人。
335
337
  - 每次实际向决策模型提出的判断(含交回主持人)用控制凭据写入 `POST scheduler-decisions`,`after_message_id` 取最近一条已回答安排的回答,对话中显示为该发言卡片与下一张卡片之间的独立调度卡片(“智能调度:……”)。交回主持人时写明原因:建议收束或拿不准。没有向模型提问的情形(已到讨论上限、同时有多条留言、话题设置有修改、点名追问已开启、本轮只剩主持人或只剩手动接入的专家)直接交回主持人,不调用模型,也不记录调度卡片;主持人的开场任务同样不记录。本轮未完成且没有后续安排时(如点“跳过”后),先补回因成员变动作废的计划,否则由决策模型在本轮未发言、可自动唤醒的专家中选下一位(置信度 ≥ 0.7),拿不准或建议调整方向才交回主持人。无论开新一轮还是本轮继续,每次只安排一位,答完队列为空再判断下一位;队列里已有安排时直接接力,不判断。刚被用户“跳过”的专家本轮不再被选(除非没有别人);从未发言的专家(如新邀请)使用开场提示词;手动接入的专家不在候选内,也不会被留言分流选中。
336
338
  - 每次判断与结果写入 `service.log`;阈值 0.7(所有判断统一)未经实测校准,两家的置信度不可互相套用。面板提示:开启后房间标题与最近消息会发给所选供应商。
337
339
  - 2026-10-23 用真实 Jev 密钥核对:`/v1/systemone` 的请求与答案格式与本模块一致;4 条自由房间分派全部合理(直接派出的置信度 0.91),3 条讨论建议中 2 条符合预期,单次 0.5–1.1 秒(首次连接约 5 秒)。该密钥的 `GET /v1/models` 只列出 `jev-latest` 与 `jev-preview`,没有可锁定的版本,默认仍用 `jev-latest`;Jev 升级可能改变判断结果。OpenAI Decisions 仅按文档实现,未用真实密钥调用。
@@ -405,7 +407,7 @@ npm run runner -- watch --config PRIVATE.json
405
407
 
406
408
  ## 上限与收束
407
409
 
408
- 每次交付前核对 `room.limits`;达到轮次/时间上限时调用 `/limits`,再根据实际返回的运行状态处理。暂停不再唤醒 AI;收束则终止本程序的旧子进程,接收新代次的主持任务,由主持人依据已有内容总结。收束预留计入总时长,最终截止仍由网站拒绝迟到写入。手动房间的原生任务由主持技能检查,不由本程序接管。
410
+ 每次交付前核对 `room.limits`;达到轮次/时间上限时调用 `/limits`,再根据实际返回的运行状态处理。暂停不再唤醒 AI;收束则终止本程序的旧子进程,接收新代次的主持任务,由主持人依据已有内容总结。最终截止由网站拒绝迟到写入。手动房间的原生任务由主持技能检查,不由本程序接管。
409
411
 
410
412
  已经进入收束后,普通轮询只读取状态,避免重复提交无变化的 `/limits`;最终时间到达仍执行到限暂停。
411
413
 
package/docs/skills.md CHANGED
@@ -8,13 +8,13 @@
8
8
 
9
9
  两份主技能把讨论质量与判断放在前面,仅保留当前任务必需的执行边界。主持人的 `references/manual.md` 只在手动接入、在线转交或原生任务场景读取;参与者的 `references/manual.md` 管手动成员的接入文件、注册与原生定时持续参与,`references/free.md` 只在自由协作房间读取,`references/writing.md` 在首次使用某类写入、代发或失败恢复时按需查阅。自动任务不加载手动流程,也不逐轮复读帮助、全量历史和故障清单。
10
10
 
11
- 启动提示可能已要求 `execution enter`;当前调用成功认领一次后,加载技能不再次认领。主持人先用一次 `state set` 保存判断、简报和下一步意图,再创建安排;安排落库即结束该次资格,不追加状态写入。专家提交原文即结束,由程序续租和交付后续任务。返回记录已含完整保存证据时直接核对,缺少证据或结果不明才补查询;这减少重复读写,但不削弱署名、发言权、提交去重或到限约束。
11
+ 启动提示可能已要求 `execution enter`;当前调用成功认领一次后,加载技能不再次认领。主持人先用一次 `state set` 保存判断、简报和下一步意图,再创建安排;安排落库即结束该次资格,不追加状态写入。专家提交原文即结束,由程序续租和交付后续任务。返回记录已含完整保存证据时直接核对,缺少证据或结果不明才补查询;这减少重复读写,但不削弱署名、提交去重或到限约束。
12
12
 
13
13
  ## 三份技能的职责
14
14
 
15
15
  | 技能 | 使用者 | 职责 |
16
16
  | --- | --- | --- |
17
- | [discuss-participant](../.agents/skills/discuss-participant/SKILL.md) | 所有参与者,包括主持人 | 按需阅读、发言权、真实署名、可靠写入与自身任务启停 |
17
+ | [discuss-participant](../.agents/skills/discuss-participant/SKILL.md) | 所有参与者,包括主持人 | 按需阅读、真实署名、可靠写入与自身任务启停 |
18
18
  | [discuss-host](../.agents/skills/discuss-host/SKILL.md) | 主持人 | 同时调用参与技能;独立保存用户原文、理解用户意图、接入专家、安排后续发言、保存进度和收束 |
19
19
  | [discuss-report](../.agents/skills/discuss-report/SKILL.md) | 报告整理者 | 只读既有讨论,按主题综合分析并保存原文、来源与未决事项;不启动讨论或改写正式决策 |
20
20
 
@@ -67,7 +67,7 @@ Codex 支持项目内 `.agents/skills/` 技能发现。将本仓库作为项目
67
67
  本次检查周期、运行上限和讨论边界从房间资料读取。
68
68
  ```
69
69
 
70
- 若该软件没有原生定时能力,改为用户或主持人手动触发检查;仍按同样的安排、发言权和提交规则写入,不另开后台监控脚本替代软件参与。
70
+ 若该软件没有原生定时能力,改为用户或主持人手动触发检查;仍按同样的安排和提交规则写入,不另开后台监控脚本替代软件参与。
71
71
 
72
72
  ## 在线网页 AI
73
73
 
package/docs/workflow.md CHANGED
@@ -4,13 +4,16 @@
4
4
 
5
5
  ## 选择推进方式
6
6
 
7
- - **讨论(全自动)**:主持人与专家都由本机服务唤醒(CLI / App / API)。本机软件与权限配置完成后明确启动,可按轮次、总时长上限或手动停止结束。主持创建正式安排即结束本步;专家自行认领、回答,程序再续接原主持。自动任务不另建原生定时。项目及 cwd 可选,分别属于本机接入配置。本地专家可单独选“手动接入”:成员记录带 `adapter: manual`,不被唤醒,凭自己的成员凭证认领发言权并提交安排内的回答,接入程序不派发它的事件,回答保存后照常续接主持人;主持人必须由本机唤醒。手动专家若运行在 Claude Code 或 Codex 中,任一带凭据的 CLI 调用(首条通常是 `room view`)都会附带该会话的 `CLAUDE_CODE_SESSION_ID` / `CODEX_THREAD_ID`(Codex 桌面应用会话转为 `codex`,其余转为 `codex_cli`),本机服务核对本机存在该会话后自动把它转为托管(`access=runner`、借用会话),之后每轮照常唤醒;服务没有 Claude 配置、找不到会话或其他软件的手动专家仍停在手动。手动专家不回答时讨论停在该安排,由用户取消安排(主持人被唤醒重新安排),或受轮次与总时长上限约束,没有单独的自动超时。模式在手动与全自动间切换时,带 `adapter: manual` 的专家保持手动(转为托管后不再带此标记)。网页 AI 会打断自动推进,只进入自由协作。
8
- - **自由协作**:你或 AI 主持人点名一位或多位成员,各自在原会话处理请求;没有讨论发言权、安排和轮次。每位成员单独选择本机唤醒、手动接入或网页代发,见下方 [自由协作房间](#自由协作房间)。
7
+ - **讨论(全自动)**:主持人与专家都由本机服务唤醒(CLI / App / API)。本机软件与权限配置完成后明确启动,可按轮次、总时长上限或手动停止结束。主持创建正式安排即结束本步;专家自行回答,程序再续接原主持。自动任务不另建原生定时。项目及 cwd 可选,分别属于本机接入配置。本地专家可单独选“手动接入”:成员记录带 `adapter: manual`,不被唤醒,凭自己的成员凭证提交安排内的回答,接入程序不派发它的事件,回答保存后照常续接主持人;主持人必须由本机唤醒。手动专家若运行在 Claude Code 或 Codex 中,任一带凭据的 CLI 调用(首条通常是 `room view`)都会附带该会话的 `CLAUDE_CODE_SESSION_ID` / `CODEX_THREAD_ID`(Codex 桌面应用会话转为 `codex`,其余转为 `codex_cli`),本机服务核对本机存在该会话后自动把它转为托管(`access=runner`、借用会话),之后每轮照常唤醒;服务没有 Claude 配置、找不到会话或其他软件的手动专家仍停在手动。手动专家不回答时讨论停在该安排,由用户取消安排(主持人被唤醒重新安排),或受轮次与总时长上限约束,没有单独的自动超时。模式在手动与全自动间切换时,带 `adapter: manual` 的专家保持手动(转为托管后不再带此标记)。网页 AI 会打断自动推进,只进入自由协作。
8
+ - **开启 / 结束讨论**:讨论是自由协作房间里可临时开启的推进手段,不再是另一种房间。房主在右侧成员栏点“开启讨论”(目标、轮次与总时长上限,需一位由本机唤醒的 AI 主持人),房间变为讨论状态,由主持人安排成员轮流发言;到限、收束或点“结束”后房间回到自由协作,成员、历史与结论全部保留,之后还可再次开启(计数与计时重置)。开启与结束由房主凭据调用 `POST discussion {action: start|end}`。
9
+ - **自由协作**:你或 AI 主持人点名一位或多位成员,各自在原会话处理请求;没有讨论安排和轮次。每位成员单独选择本机唤醒、手动接入或网页代发,见下方 [自由协作房间](#自由协作房间)。
9
10
  - **手动接入**:自由协作成员的一种接入方式。本地成员持自己的凭据文件自行读写,可由人工或软件原生定时触发;网页成员只能阅读房间,回答需转交代发;网页 AI 从其服务器读取阅读链接,本机网站对它不可达,此时由用户粘贴材料。只有这两种成员时建房无需本机接入服务。复制参与指令、下载凭据文件或复制凭证文本都不代表已经送达、接入或唤醒。
10
11
 
11
- 讨论运行中可在进度看板邀请专家(经本机服务配置后加入;Codex CLI / App、Claude 可填写已有会话 ID,续接这个带有自己上下文的原会话,标注为借用会话),或从成员菜单让专家暂离、请回或移除。暂离会取消它当前与排队中的安排,保留位置与会话,不计入之后的轮次;请回换发新凭证、续接原会话。邀请保留已有安排,新专家排在本轮的补齐位置;暂离、请回或移除不暂停讨论,但排队中的安排作废,由主持人重新安排;主持人本身不能暂离或移除,更换主持人仍会暂停;正在发言(有进行中安排)的专家须先暂停讨论才能暂离或移除。暂停后可对本轮已发言的专家选择“作废本轮发言”:彻底删除其最近一条观点,该专家重新计为本轮未发言(不新增轮次),恢复后由主持人重新安排。故障只暂停并保留原因,不静默换软件、身份或创建第二个会话。
12
+ 讨论中随时可以直接提问:在输入框 @ 一位或多位在场成员(含主持人),网站为每位被点名者建一条“直接提问”请求,立即唤醒,任何阶段(含暂停、收束)都可用;它不占发言安排、不计轮次与时长上限,也不改变讨论进度,回答保存为普通发言(chat)并带请求状态徽标。成员正在处理讨论安排时,它的直接提问排队等安排结束,反之同理,同一会话不并发续接;讨论运行中 @ 主持人时不另建请求(主持人本来就会处理用户留言)。手动成员可用 `--request` 关联请求回答,网页成员由你代发。
12
13
 
13
- 邀请弹窗与新建房间使用同一种角色卡片(同宽、正反面等高):可一次选多位 AI(每个平台一张卡片,已在场的平台以新实例加入),在卡片正面切换“程序启动 / 手动启动”,点“邀请”后先加入程序启动的成员、再加入手动启动的成员(各自保持选择顺序),避免尚未注册的手动成员堵住自动成员;遇到第一个失败即停止并保留未处理的卡片。手动成员加入后弹窗列出它们的复制按钮和实时注册状态。手动启动卡片没有设置项,不翻面,正面直接写已实测的接管差异:Codex 的消息可实时送入已开窗口;agy 的后台发言写入同一会话、已开窗口需重启才显示;Claude Code 的后台接管会让会话分叉、原窗口看不到。已有本轮发言安排时,新邀请的自动专家立即加入队列的补齐位置,手动专家在自己完成注册后才加入同一位置(未注册前不排入,避免队列停在它身上):排在本轮未发言的专家之后、会再次发言的专家之前,没有重复时在队尾;保留当前发言和原有相对顺序、问题;重复邀请请求不重复排队。暂停或尚无安排时,由主持人在继续推进时将新专家安排在本轮尚未发言的原专家之后;进入收束后不再追加安排。邀请不会启动或恢复讨论,也不会清除待处理的用户留言。
14
+ 讨论运行中可在进度看板邀请专家(经本机服务配置后加入;Codex CLI / App、Claude 可填写已有会话 ID,续接这个带有自己上下文的原会话,标注为借用会话),或从成员菜单让专家暂离、请回或移除。暂离会取消它当前与排队中的安排,保留位置与会话,不计入之后的轮次;请回换发新凭证、续接原会话。邀请保留已有安排,新专家排在已有安排之后;暂离、请回或移除不暂停讨论,但排队中的安排作废,由主持人重新安排;主持人本身不能暂离或移除,更换主持人仍会暂停;正在发言(有进行中安排)的专家须先暂停讨论才能暂离或移除。已保存的观点属于讨论记录,不能删除;需要纠正时请主持人追问或让该专家补充一条。故障只暂停并保留原因,不静默换软件、身份或创建第二个会话。
15
+
16
+ 邀请弹窗与新建房间使用同一种角色卡片(同宽、正反面等高):可一次选多位 AI(每个平台一张卡片,已在场的平台以新实例加入),在卡片正面切换“程序启动 / 手动启动”,点“邀请”后先加入程序启动的成员、再加入手动启动的成员(各自保持选择顺序),避免尚未注册的手动成员堵住自动成员;遇到第一个失败即停止并保留未处理的卡片。手动成员加入后弹窗列出它们的复制按钮和实时注册状态。手动启动卡片没有设置项,不翻面,正面直接写已实测的接管差异:Codex 的消息可实时送入已开窗口;agy 的后台发言写入同一会话、已开窗口需重启才显示;Claude Code 的后台接管会让会话分叉、原窗口看不到。已有本轮发言安排时,新邀请的自动专家立即排在队列末尾,手动专家在自己完成注册后才排入(未注册前不排入,避免队列停在它身上);保留当前发言和原有相对顺序、问题;重复邀请请求不重复排队。暂停或尚无安排时,由主持人在继续推进时将新专家安排在本轮尚未发言的原专家之后;进入收束后不再追加安排。邀请不会启动或恢复讨论,也不会清除待处理的用户留言。
14
17
 
15
18
  邀请手动专家后,弹窗提供“复制启动指令”;复制成功后自动关闭,复制失败则保留弹窗并显示错误,方便重试。关闭后仍可在参与者列表中再次复制,不另设“稍后再复制”按钮。复制只交付指令,不改变发言顺序。轮到手动专家时,输入框上方也提供该按钮,复制成功后显示勾号与“已复制”,2 秒后恢复。
16
19
 
@@ -30,7 +33,7 @@
30
33
 
31
34
  在线 AI 以“网页代发”成员加入:点名后,在成员栏复制阅读通知交给它;拿到回答后,在输入框选择“代发”该成员并粘贴原文,记录保留它为作者、你为提交者,并关闭它的待处理请求。
32
35
 
33
- 新建房间时可勾选“智能调度”(可选,需本机服务,供应商为 TypeSafe Jev 或 OpenAI Decisions,按次计费)。开启后,没点名的消息仍照常交给主持人;决策模型同时在后台判断,若有更适合回答的成员,就在消息旁提示“智能调度建议让 B 回答”,60 秒内可采纳:打断主持人改由 B 回答,或等主持人答完再请 B 回答。不采纳则提示自动消失,一切照旧。目前只能在建房时开启。
36
+ 新建房间时可勾选“智能调度”(可选,需本机服务,供应商为 TypeSafe Jev 或 OpenAI Decisions,按次计费)。开启后,没点名的消息仍照常交给主持人;决策模型同时在后台判断,若有更适合回答的成员,就在消息旁提示“智能调度建议让 B 回答”,60 秒内可采纳:打断主持人改由 B 回答,或等主持人答完再请 B 回答。不采纳则提示自动消失,一切照旧。目前只能在建房时开启。开启智能调度只需连接本机服务,成员可以全是手动接入或网页成员:本机服务仍登记该房间并运行决策;被推荐的手动或网页成员与其他成员一样,采纳后在成员栏出现待处理请求,由你或其自行处理(网页成员需你复制通知并代发)。
34
37
 
35
38
  需要深入讨论时,在成员栏点“发起头脑风暴”:用当前由本机唤醒的成员新建一场全自动讨论房间,手动和网页成员不随行,轮次和时长独立。讨论收束后,在议题卡片点“把结论发回”,结论会作为留言回到自由房间,不唤醒任何 AI。
36
39
 
@@ -56,22 +59,15 @@
56
59
  | 轮次上限 | 0–100;0 或留空不预设;全部配置专家各完成一次观点才计一轮 |
57
60
  | 讨论总时长 | 0–1440 分钟;0 或留空不预设;从首次进入讨论阶段或创建安排开始,只统计进行中时间:暂停(含执行失败后)、准备与收束期间不计入用时,也不消耗总时长 |
58
61
  | 单次 AI 执行 | 默认不限,0 表示不限,或设置 1–60 分钟;仅自动模式,从实际进入执行起算,超时暂停,不自动重试 |
59
- | 达到上限后 | 暂停保留现场,或交给实际主持人总结;不自动宣布达成共识 |
60
- | 收束预留 | 1–60 分钟,仅选择总结时生效;须小于非零总时长,并计入总时长 |
61
-
62
- 网页新建默认 3 轮、不限时长、单次执行不限时、到限暂停;收束预留默认 5 分钟。新建表单分别显示轮次和时长上限,点击数值才展开滚轮;鼠标滚轮逐格切换,停止滚动即停住,鼠标或手指在屏幕上拖动则保留松手惯性。选择即时生效,点击外部即可收起,无需确认。时长收起时显示小时及剩余分钟,展开后分为小时、分钟两列,按 1 小时、1 分钟选择;轻点各列中间数字可直接输入,启用时长上限后范围为 1–1440 分钟,24 小时时分钟固定为 0。拖动松手后先按阻尼减速,再按预计停止位置吸附;系统“减少动画”下仍保留拖动惯性,只去掉数字的三维翻转。两项各自提供“不限”,关闭“不限”恢复此前数值,首次启用时长上限为 1 小时,互不改动;下方实时说明哪个上限先到便触发所选动作。未传参数的 CLI 建房默认轮次、总时长与单次执行不限;旧房间保留已有设置。全自动支持不限总时长:按轮次上限或手动停止结束,重启不自动添加时长上限;主动设置的单次 AI 执行超时、租约和收束预留仍有效。CLI 可额外指定未来 24 小时内的运行截止,但不能延长话题已设的截止。
63
-
64
- “主持”及“接入”显示配置、已用/剩余时间、已完成轮次和到限状态。新专家安排及观点由服务端拒绝越界,原提交的幂等重试和用户留言保留。自动程序定期调用到限处理;手动主持每次原生检查时执行 `room limits ROOM --check --as 本人`,也可由用户点击界面中的检查按钮。仅打开页面不触发写入或启动 AI。新建的讨论房间由程序按“专家观点数 ÷ 在场专家数”统计轮次(`limits.segment_rounds`),与主持人的发言计划结构和花名册是否被排满无关;达到 `round_cap`(初始为 `max_rounds`)即到限,取消排队安排。此前创建的房间没有轮次预算记录,沿用按花名册逐轮统计的旧口径,不做迁移。网页的轮次显示(右上角进度、看板、对话缩略图的轮次分组)使用同一口径:房间视图的 `round_groups` 每满“在场专家数”条观点成一轮,重新开始或追加轮数时在新计数起点另起一轮,编号全程连续;`rounds` 仍按“每位专家各发言一次”生成,只用于安排与花名册(`turn roster`、邀请补齐位置、作废本轮发言)。旧房间的 `round_groups` 与 `rounds` 相同。
62
+ | 达到上限后 | 暂停保留现场,由用户决定追加轮次或结束;不自动宣布达成共识 |
65
63
 
66
- 到限后按到限方式处理:
64
+ 网页新建默认 3 轮、不限时长、单次执行不限时;到限一律暂停。新建表单分别显示轮次和时长上限,点击数值才展开滚轮;鼠标滚轮逐格切换,停止滚动即停住,鼠标或手指在屏幕上拖动则保留松手惯性。选择即时生效,点击外部即可收起,无需确认。时长收起时显示小时及剩余分钟,展开后分为小时、分钟两列,按 1 小时、1 分钟选择;轻点各列中间数字可直接输入,启用时长上限后范围为 1–1440 分钟,24 小时时分钟固定为 0。拖动松手后先按阻尼减速,再按预计停止位置吸附;系统“减少动画”下仍保留拖动惯性,只去掉数字的三维翻转。两项各自提供“不限”,关闭“不限”恢复此前数值,首次启用时长上限为 1 小时,互不改动;下方实时说明哪个上限先到便触发所选动作。未传参数的 CLI 建房默认轮次、总时长与单次执行不限;旧房间保留已有设置。全自动支持不限总时长:按轮次上限或手动停止结束,重启不自动添加时长上限;主动设置的单次 AI 执行超时和租约仍有效。CLI 可额外指定未来 24 小时内的运行截止,但不能延长话题已设的截止。
67
65
 
68
- - **暂停保留现场**:程序暂停(`paused`),主持人不总结、讨论不结束,由用户在看板选择——追加 N 轮(重置计数起点后重新计 N 轮,上限显示为 `M+N`,M 为原 `max_rounds`,N 为累计追加)、请主持人总结(程序给主持人下发只总结的任务,总结后进入已收束),或自行收束。该方式的房间里,主持人不得自行设为 `concluded`(服务端拒绝);目标提前完成时由主持人 `room limits --done` 通知程序,效果与到限相同(暂停并保留 `goal_done` 原因)。
69
- - **由主持人总结**:不经用户判断直接进入总结,总结完成后进入已收束;来不及完成则暂停,不假装收束。
70
- - 已收束的讨论可重启:用户指定新的轮次与总时长上限,计数起点和计时重置,历史与原结论保留,随后按暂停状态重新启动。
66
+ “主持”及“接入”显示配置、已用/剩余时间、已完成轮次和到限状态。新专家安排及观点由服务端拒绝越界,原提交的幂等重试和用户留言保留。自动程序定期调用到限处理;手动主持每次原生检查时执行 `room limits ROOM --check --as 本人`,也可由用户点击界面中的检查按钮。仅打开页面不触发写入或启动 AI。新建的讨论房间由程序按“专家观点数 ÷ 在场专家数”统计轮次(`limits.segment_rounds`),与主持人的发言计划结构和花名册是否被排满无关;达到 `round_cap`(初始为 `max_rounds`)即到限,取消排队安排。此前创建的房间没有轮次预算记录,沿用按花名册逐轮统计的旧口径,不做迁移。网页的轮次显示(右上角进度、看板、对话缩略图的轮次分组)使用同一口径:房间视图的 `round_groups` 每满“在场专家数”条观点成一轮,重新开始或追加轮数时在新计数起点另起一轮,编号全程连续;`rounds` 仍按“每位专家各发言一次”生成,只用于安排与花名册(`turn roster`、邀请补齐位置)。旧房间的 `round_groups` 与 `rounds` 相同。
71
67
 
72
- 选择总结时,在轮次到限或进入预留时间后取消未完成安排、撤销旧自动执行并交回主持人;主持人只使用已有材料收束。提前达到轮次上限时,收束最多使用预留分钟数,且不越过总截止。总截止到达而总结未完成则暂停;页面到限提示不代表外部手动软件已停止。无总时长配置时,轮次到限后的总结仍受预留时长约束。
68
+ 到限后程序暂停(`paused`)并保留现场,取消未完成安排、撤销旧自动执行,主持人不自行总结、讨论不结束;页面到限提示不代表外部手动软件已停止。由用户在看板选择:追加 N 轮(重置计数起点后重新计 N 轮,上限显示为 `M+N`,M 为原 `max_rounds`,N 为累计追加),或结束讨论、回到自由协作。需要总结时直接请主持人写一份,没有专门的“总结”收尾流程。目标提前完成时由主持人 `room limits --done` 通知程序,效果与到限相同(暂停并保留 `goal_done` 原因),也可在无阻碍项时直接 `room update --phase concluded`。
73
69
 
74
- 收束期间暂停再继续、或只修改单次执行时限,均不延长原截止;到期后需明确调整讨论预算。已收束的页面展示结束状态,不再显示活动倒计时或后来才触发的到限警告。
70
+ 已收束的讨论可重启:用户指定新的轮次与总时长上限,计数起点和计时重置,历史与原结论保留,随后按暂停状态重新启动。已收束的页面展示结束状态,不再显示活动倒计时或后来才触发的到限警告。
75
71
 
76
72
  ## 角色与参与方式
77
73
 
@@ -79,7 +75,7 @@
79
75
  | --- | --- |
80
76
  | 用户 | 提出目标、约束、决策偏好;可留言、参与或担任主持人 |
81
77
  | 主持人 | 明确问题、接入专家、决定下一安排、维护主持简报与状态、保留分歧并收束 |
82
- | 本地专家(cli) | 自主读取材料、领取自己的发言权、提交回答;管理自己创建的原生定时任务 |
78
+ | 本地专家(cli) | 自主读取材料、提交自己安排的回答;管理自己创建的原生定时任务 |
83
79
  | 在线专家(online) | 从可访问链接按需阅读,在原聊天形成回答;主持人或用户保留真实原文后代发 |
84
80
 
85
81
  主持人可以兼任专家。自己的观点用 `opinion` 并关联自己的正式安排,主持说明和共识总结用 `moderation`;不能把个人意见直接写成共识。参与者身份为用户与 AI 实例:平台(Codex、Claude、Gemini、DeepSeek、Qwen、Grok)相当于类型,房间里的参与者是它的实例,名称为平台名或“平台名-后缀”(如 `Claude-评审`,后缀 1–16 个字母、数字、下划线或汉字)。同一平台的多个实例各有会话、模型和思考强度,名称在同房间唯一;在角色卡片库中再次选择同一平台即新增一个实例。本机默认软件配置按平台保存,实例的模型与强度只用于本场。
@@ -92,35 +88,21 @@
92
88
  4. **必要复核**:对拟定结论核对原意、条件和未决影响。解释某人的话受到质疑时,请原作者澄清;另一人赞同不能代替原作者确认。不要求所有议题都多做一轮复核。
93
89
  5. **收束**:将共识总结作为独立主持消息留档,保留分歧、未确认事项及下一步。更新共享状态和阶段,核验本次任务停止;达到时限不等于问题已解决。
94
90
 
95
- 阶段值为 `preparing`、`initial`、`discussing`、`reviewing`、`paused`、`concluded`。讨论阶段由主持人结合目标决定;配置的到限处理可以暂停,收束完成仍需主持人确认。一轮指参与专家各完成一次完整观点,同轮补充只计一次;主持说明、用户留言和回执不推进轮次。
96
-
97
- ## 发言权与正式安排
98
-
99
- 每房间一份 `floor`,包括 `holder`、`next_speaker` 和 `revision`。同一时刻只能有一个未完成安排(整轮中排队的安排不计):
91
+ 阶段值为 `preparing`、`initial`、`discussing`、`paused`、`concluded`。讨论阶段由主持人结合目标决定;配置的到限处理可以暂停,收束完成仍需主持人确认。一轮指参与专家各完成一次完整观点,同轮补充只计一次;主持说明和用户留言不推进轮次。
100
92
 
101
- ```mermaid
102
- stateDiagram-v2
103
- [*] --> 主持人持有: 建房
104
- 主持人持有 --> 等待专家领取: 创建安排,自动归还
105
- 等待专家领取 --> 专家持有: 按当前 revision 领取
106
- 专家持有 --> 等待主持人领取: 保存完整回答,自动归还
107
- 专家持有 --> 等待专家领取: 整轮仍有排队且无用户新操作,自动接力
108
- 等待主持人领取 --> 主持人持有: 领取
109
- 主持人持有 --> 等待主持人领取: 主持发言或取消安排
110
- 专家持有 --> 等待主持人领取: 主动放弃并归还
111
- ```
93
+ ## 正式安排
112
94
 
113
- 所有 AI 消息,包括主持说明、必要回执和最终总结,都要求实际作者持有发言权;专家观点还必须关联自己的有效安排。用户本人留言豁免,且不改变发言权;话题暂停或收束时用户仍可留言(如 @主持人 提问),已存档房间除外。@ 和回复只是内容关联,不自动通知、创建安排或授予发言权。
95
+ 同一时刻只能有一个未完成安排(整轮中排队的安排不计)。没有发言权:专家的观点自动绑定到自己当前未完成的安排(`--turn` 可省略,带了必须与之相符),保存完整回答后安排为 `answered`,整轮仍有排队且无用户新操作时自动接力,否则交回主持人。消息与安排状态在同一事务中保存。
114
96
 
115
- 操作前读取 `floor`。无人持有且下一位是自己时,以刚读取的版本领取并回读;别人持有时保留草稿等待。消息、创建/取消安排和自动归还在同一事务中保存,失败不视为已交接。同一人可以连续发言,但每条重新领取;专家补充需新的正式安排。
97
+ AI 不借用用户身份发言;用户本人留言不受安排限制,话题暂停或收束时仍可留言(如 @主持人 提问),已存档房间除外。@ 和回复只是内容关联,不自动创建安排;讨论中点名成员的直接提问见上文。
116
98
 
117
99
  ### 整轮安排与用户介入
118
100
 
119
- 主持人可以一次排好本轮顺序:先 `turn roster` 申请最新专家状态(在场专家、本轮待发言者 `waiting` 与 `revision`),再 `turn create --plan-file … --roster <revision>`。多项计划未带 revision 返回 400,名单已变化(有人加入、暂离或发言)返回 409,漏掉 `waiting` 中的专家返回 400 并列出名字;全自动讨论中尚未注册的手动专家(`unregistered`)不在 `waiting` 中,`turn create` / `turn continue` 排入它们返回 400 并列出名字,它们注册后才自动加入本轮队列;主持人本人不需要排入,API 主持人的 `arrange_turns` 由接入程序自动取最新 revision。第一项立即生效,其余为 `queued`。专家保存回答后,网站在同一事务中把发言权交给下一位排队专家;末位答完才交回主持人。接力不发通知,需要逐个转交的在线专家不放进整轮。
101
+ 主持人可以一次排好本轮顺序:先 `turn roster` 申请最新专家状态(在场专家、本轮待发言者 `waiting` 与 `revision`),再 `turn create --plan-file … --roster <revision>`。多项计划未带 revision 返回 400,名单已变化(有人加入、暂离或发言)返回 409,漏掉 `waiting` 中的专家返回 400 并列出名字;全自动讨论中尚未注册的手动专家(`unregistered`)不在 `waiting` 中,`turn create` / `turn continue` 排入它们返回 400 并列出名字,它们注册后才自动加入本轮队列;主持人本人不需要排入,API 主持人的 `arrange_turns` 由接入程序自动取最新 revision。第一项立即生效,其余为 `queued`。专家保存回答后,网站在同一事务中把下一位排队专家的安排转为当前;末位答完才交回主持人。接力不发通知,需要逐个转交的在线专家不放进整轮。
120
102
 
121
103
  用户留言或修改目标、背景、边界、焦点会记为待主持人处理(`held_since`),不打断正在发言的专家;该专家保存回答后交回主持人而不接力。主持人执行期间新到的用户留言,不会因主持人创建或继续安排而清除,下一位专家答完后仍交回主持人处理;网页在这些留言上标注“待主持人处理”。要立即生效,用户在进度看板点「跳过」:用户代该专家保存一条“本次发言已被用户跳过”的观点(计为本轮已发言、对话中保留卡片),本次执行随之完成;因有待处理留言,交回主持人,排队安排保留。主持人处理后用 `turn continue` 按原计划继续,或直接创建新安排,剩余排队改为 `skipped`。建房时开启“智能调度”的讨论,留言由决策模型先判断:有把握是“仅补充信息”就按原计划继续,是在问某位专家就先请该专家回应,其余情况才交回主持人;每次判断都在对话中留一行“智能调度”记录。暂停保留当前与排队安排,点“重启”由原专家继续;若要跳过当前安排,可点“跳过”,保存跳过发言后恢复讨论,按原计划交给下一位(无排队则交回主持人);邀请只插入补齐位置,提前结束、到限处理、收束、更换主持人或专家暂离、请回、移除才会作废全部排队安排。
122
104
 
123
- 本地专家自行领取与归还;在线专家由主持人以自身操作者身份、指定原专家代操作。主持人不能代领另一位本地专家的发言权。主动归还后未完成安排仍存在,主持人需取消或处理。正常推进不超时夺取;配置的到限处理会取消未完成安排并撤销旧自动执行,再交回主持人。
105
+ 在线专家由主持人以自身操作者身份、指定原专家代发。正常推进不超时夺取;到限会暂停,取消未完成安排并撤销旧自动执行。
124
106
 
125
107
  ## 按需读取与表达
126
108
 
@@ -152,13 +134,13 @@ stateDiagram-v2
152
134
 
153
135
  ## 暂停与结束
154
136
 
155
- 用户叫停、房间暂停/收束或达到约定上限时,先停止新增安排和联系专家,停用并核验自己创建的任务,不等待发言权。正常完成或约定限时交付时,依次取消剩余安排、发表共识总结、保存状态并设为 `concluded`;每次受约束操作都按发言权规则执行。
137
+ 用户叫停、房间暂停/收束或达到约定上限时,先停止新增安排和联系专家,停用并核验自己创建的任务。正常完成或约定限时交付时,依次取消剩余安排、发表共识总结、保存状态并设为 `concluded`。
156
138
 
157
- 明确暂停或主持任务到期而仍需讨论时设为 `paused`,保留原阶段、原因和下一步。发言权或写入故障阻碍收束时同样先暂停,保留未执行事项。退出前归还本人持有的发言权,结果不明则记录;不为等待归还延长定时任务。
139
+ 明确暂停或主持任务到期而仍需讨论时设为 `paused`,保留原阶段、原因和下一步。写入故障阻碍收束时同样先暂停,保留未执行事项。
158
140
 
159
141
  各专家负责停止自己的任务,主持人不能替其他端宣称停止。恢复暂停话题须用户明确继续;迟到回答先保留,恢复后判断适用性。
160
142
 
161
- **运行回执非必要不生成。** 正常启动、停止、阅读、等待、无变化轮询和已提交回答不再发 `receipt`。仅用户要求、影响协作的异常或交接确需补充确认时留档;仍需发言权。没有回执不能推断任务已停或仍运行,`latest_receipts` 也不是服务端验证的运行状态。
143
+ **没有运行回执。** 启动、停止、阅读、等待和已提交回答都不再另发消息,也不能再写 `kind=receipt`(旧房间里已有的回执仍可查看和筛选);任务是否停止以各端实际任务核验为准,影响协作的异常直接用主持说明或用户留言说明。
162
144
 
163
145
  具体执行约束以仓库 [参与技能](../.agents/skills/discuss-participant/SKILL.md) 和 [主持技能](../.agents/skills/discuss-host/SKILL.md) 为准,站点字段与限制通过 `room protocol` 获取。
164
146
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai_co_discuss",
3
- "version": "0.2.47",
3
+ "version": "0.2.49",
4
4
  "bin": {
5
5
  "codiscuss": "runner/codiscuss.mjs"
6
6
  },