ai_co_discuss 0.2.18 → 0.2.19
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/README.md +1 -1
- package/backend/free_room.py +16 -5
- package/backend/server.py +3 -1
- package/docs/architecture.md +3 -3
- package/docs/runner.md +3 -3
- package/docs/workflow.md +1 -1
- package/package.json +1 -1
- package/web/modern.css +1 -1
- package/web/modern.js +555 -538
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ codiscuss setup
|
|
|
71
71
|
|
|
72
72
|
讨论进行中可在右侧进度看板邀请新专家(沿用本机软件配置);Codex、Claude 可填写已有会话 ID,请一个带着自己上下文的原会话加入,它工作时不要在原窗口继续操作。也可从成员的“…”菜单让其暂离、请回或移除。暂离保留位置与会话,不参与安排;这些操作不暂停讨论,主持人会被唤醒重新安排。主持人不能暂离,需先更换。
|
|
73
73
|
|
|
74
|
-
只想让 AI 干活时,在第 3 步将房间用法改为“自由协作”,只需填写话题名称,任务在对话中随时补充:选择一位或多位 AI,并在每张卡片背面选择接入方式:本机唤醒(App / CLI / API
|
|
74
|
+
只想让 AI 干活时,在第 3 步将房间用法改为“自由协作”,只需填写话题名称,任务在对话中随时补充:选择一位或多位 AI,并在每张卡片背面选择接入方式:本机唤醒(App / CLI / API)、手动接入(凭据交给你自己的会话)或网页代发(回答由你转发)。你是需求方,由一位 AI 主持(默认第一位,可点皇冠更换;网页 AI 不能主持);有本机唤醒的成员时点击“创建并连接”,之后在频道里直接发消息。`@` 到的成员必须回应;没 `@` 的消息交给主持人分派,其他成员只在被你或主持人点名时发言。处理中可随时停止。运行中可在右侧成员栏邀请、请离或请回 AI,指定主持人,或发起关联的头脑风暴。详见 [自由协作房间](docs/workflow.md#自由协作房间)。
|
|
75
75
|
|
|
76
76
|
**通过 API 接入**:添加 Codex(OpenAI)、Claude、Gemini、DeepSeek、Qwen 或 Grok,翻开卡片选择 API,填写并保存 API Key,选择或输入模型 ID。默认提供官方 Base URL,也可填写 OpenRouter 等兼容服务的地址并选择对应请求协议。Grok 始终显示,无需安装 Cursor 或 Grok Bot。API 可以担任主持人,与 CLI / App 专家混用,也可进入自由协作房间。API 与网页专家不访问项目文件,只有 CLI 专家可选择只读或写入;API 仍可通过房间工具保存讨论发言和主持安排。调用由本机服务发出,费用按所选 API 账号计费;密钥仅保存于本机。模型与配置说明见 [API 接入](docs/runner.md#api-接入)。
|
|
77
77
|
|
package/backend/free_room.py
CHANGED
|
@@ -4,9 +4,9 @@ A free room has no floor, turns or rounds. The user (holding the room control cr
|
|
|
4
4
|
names members; each named member gets one durable request per message. The local runner
|
|
5
5
|
delivers a runner member's open requests as one execution, and the member's answer completes
|
|
6
6
|
them. A manual member finds its own requests and answers by request id; an online member's
|
|
7
|
-
answer is forwarded by the owner.
|
|
8
|
-
|
|
9
|
-
launched here.
|
|
7
|
+
answer is forwarded by the owner. The user is the client, never the host: one member that
|
|
8
|
+
answers by itself always hosts, routes unnamed messages, names members in its answers, and is
|
|
9
|
+
woken once when everything it dispatched has finished. No software is launched here.
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import hmac
|
|
@@ -28,6 +28,11 @@ ACTIVE = ("dispatched", "started")
|
|
|
28
28
|
ACCESS_MODES = ("runner", "manual", "online")
|
|
29
29
|
# AI-created requests (host dispatches and hand-offs) allowed per chain; each owner message starts a chain.
|
|
30
30
|
MAX_AUTO_HOPS = 8
|
|
31
|
+
# A host that left gives up the role; the first active runner member (else manual) then takes it.
|
|
32
|
+
RELEASE_HOST = "UPDATE room_members SET role='member' WHERE room_id=? AND role='host' AND status<>'active'"
|
|
33
|
+
ASSIGN_HOST = """UPDATE room_members SET role='host' WHERE id=(SELECT id FROM room_members WHERE room_id=? AND status='active'
|
|
34
|
+
AND access<>'online' ORDER BY access='runner' DESC, id LIMIT 1)
|
|
35
|
+
AND NOT EXISTS (SELECT 1 FROM room_members WHERE room_id=? AND role='host' AND status='active')"""
|
|
31
36
|
TERMINAL = ("completed", "cancelled", "failed")
|
|
32
37
|
SESSION_MODES = ("new", "borrowed")
|
|
33
38
|
FREE_OPERATIONS = ("messages", "attachments", "move", "folder", "archive", "restore", "delete")
|
|
@@ -141,7 +146,9 @@ def sync_discussion_members(connection, room_id, payload, settings):
|
|
|
141
146
|
|
|
142
147
|
|
|
143
148
|
def sync_participants(connection, room_id):
|
|
144
|
-
"""
|
|
149
|
+
"""Keep one active AI host, then mirror member capabilities and the host into shared room metadata."""
|
|
150
|
+
connection.execute(RELEASE_HOST, (room_id,))
|
|
151
|
+
connection.execute(ASSIGN_HOST, (room_id, room_id))
|
|
145
152
|
members = connection.execute("SELECT name,access,role,status FROM room_members WHERE room_id=? AND status<>'removed' ORDER BY id", (room_id,)).fetchall()
|
|
146
153
|
experts = {row["name"]: "online" if row["access"] == "online" else "cli" for row in members}
|
|
147
154
|
host = next((row["name"] for row in members if row["role"] == "host" and row["status"] == "active"), "用户")
|
|
@@ -270,8 +277,10 @@ def recipients(connection, room_id, payload):
|
|
|
270
277
|
"""Resolve an owner message's recipients as (member id, purpose) pairs.
|
|
271
278
|
|
|
272
279
|
A single active member is named by default. With several, an unnamed message goes to the
|
|
273
|
-
AI host for routing
|
|
280
|
+
AI host for routing; only a room of online members has none, and then it stays a plain note.
|
|
274
281
|
"""
|
|
282
|
+
# Rooms created while the user could host get their AI host on the next message.
|
|
283
|
+
sync_participants(connection, room_id)
|
|
275
284
|
active = active_members(connection, room_id)
|
|
276
285
|
if payload.get("to") is not None:
|
|
277
286
|
return [(member_id, "ask") for member_id in named_members(active, payload["to"])]
|
|
@@ -769,6 +778,8 @@ def member_action(connection, room_id, member_id, token, payload):
|
|
|
769
778
|
role = payload.get("role")
|
|
770
779
|
if role not in ("host", "member") or (role == "host" and member["access"] == "online"):
|
|
771
780
|
raise ValueError("role 须为 host 或 member;在线成员不能担任主持人")
|
|
781
|
+
if role == "member" and member["role"] == "host":
|
|
782
|
+
raise ValueError("自由房间须由一位 AI 主持;请指定另一位成员担任主持人")
|
|
772
783
|
if role == "host":
|
|
773
784
|
connection.execute("UPDATE room_members SET role='member' WHERE room_id=? AND role='host'", (room_id,))
|
|
774
785
|
connection.execute("UPDATE room_members SET role=? WHERE id=?", (role, member_id))
|
package/backend/server.py
CHANGED
|
@@ -22,7 +22,7 @@ from urllib.parse import parse_qs, quote, urlsplit
|
|
|
22
22
|
from .free_room import (add_member, after_free_message, authorize_free_write, check_answer, check_proxy, execution_action, free_view,
|
|
23
23
|
inbox, interrupt_member, member_action, member_values, migrate_free_tables, proxy_member, reserve_execution,
|
|
24
24
|
discussion_members, room_mode, save_room_access, sync_discussion_members, view_execution)
|
|
25
|
-
from .free_room import add_discussion_member, convert_suggestion, discussion_member_action, message_suggestions, save_suggestions
|
|
25
|
+
from .free_room import add_discussion_member, convert_suggestion, discussion_member_action, message_suggestions, save_suggestions, sync_participants
|
|
26
26
|
from .identity import MAX_ROOM_AGENTS, PARTICIPANTS, is_ai, is_participant
|
|
27
27
|
from .room_import import import_room, imported_attachment
|
|
28
28
|
from .runtime import (authorize_write, begin_write, configure_runtime, event_action,
|
|
@@ -609,6 +609,8 @@ def create_room(connection, payload, control_token=""):
|
|
|
609
609
|
save_topic_settings(connection, room_id, settings)
|
|
610
610
|
save_room_access(connection, room_id, control_token, members,
|
|
611
611
|
{"mode": "free" if free else "brainstorm", "host": settings["host"], "created_at": utc_now()})
|
|
612
|
+
if free:
|
|
613
|
+
sync_participants(connection, room_id)
|
|
612
614
|
if parent_id is not None:
|
|
613
615
|
connection.execute("INSERT INTO room_links (room_id,parent_id,created_at) VALUES (?,?,?)", (room_id, parent_id, utc_now()))
|
|
614
616
|
if automatic:
|
package/docs/architecture.md
CHANGED
|
@@ -161,7 +161,7 @@ Python 在一个只读事务快照中查询;D1 使用同一个 batch 事务读
|
|
|
161
161
|
|
|
162
162
|
### 主题与交互边界
|
|
163
163
|
|
|
164
|
-
新建表单独立选择房间用法(头脑风暴/自由协作)与接入方式(程序唤醒/手动),共用内联角色库。接入方式以分段切换放在参与区标题旁;每次添加生成独立实例,已加入成员以 `ExpertCard.vue` 渲染为翻面卡片:正面是身份与只读配置(状态、软件、模型、强度、项目权限),背面是设置,项目只读 / 可写按专家分别设置,App 与手动会话显示“由软件设置”,API
|
|
164
|
+
新建表单独立选择房间用法(头脑风暴/自由协作)与接入方式(程序唤醒/手动),共用内联角色库。接入方式以分段切换放在参与区标题旁;每次添加生成独立实例,已加入成员以 `ExpertCard.vue` 渲染为翻面卡片:正面是身份与只读配置(状态、软件、模型、强度、项目权限),背面是设置,项目只读 / 可写按专家分别设置,App 与手动会话显示“由软件设置”,API 与网页专家显示“不访问”,缺少的软件路径在背面直接填写;卡片上的皇冠指定主持人,移出按钮同步修复主持人选择,角色库为卡片下方的“添加”标签行。自由协作的用户是需求方,默认由第一位能自行发言的成员主持,可点皇冠更换。支持本地参与的卡片翻面设置参与能力和软件入口,纯网页角色不翻面。自动 CLI 从本机软件目录下拉选择模型,不要求手填 ID;模型与强度同层显示,恢复默认只清除当前实例覆盖。App、网页和手动会话在原软件内设置。`EffortSlider.vue` 按所选模型的实际档位显示,首档为空值的 CLI 默认,显示标签与提交值分离(Extra High 对应 xhigh);标题处的档位名随拖动实时预览、松手才提交,悬停、拖动与键盘聚焦分别有光晕反馈,减少动态效果时不做过渡;agy 的强度随模型,不另显示滑杆。目录不可用时显示原因并保留软件默认,不虚构列表。
|
|
165
165
|
|
|
166
166
|
项目权限选择仅对 CLI 入口开放;API 与网页专家不访问项目文件,界面显示“不访问”。创建卡片、接入设置、经典主题和自由房间邀请沿用同一 CLI 入口判断,API 不继承本场可写配置,执行器强制归一为只读。App 的实际文件权限在原软件中配置。
|
|
167
167
|
|
|
@@ -239,9 +239,9 @@ running 状态即使只有 pending 事件,也必须先暂停才能重新启动
|
|
|
239
239
|
|
|
240
240
|
- **凭据**:建房时由客户端提供房间控制凭据和每位成员的成员凭证,服务端只存哈希。用户身份的房间写入(发言、附件、存档、恢复、删除、打断)都须控制凭据;频道排序和归入文件夹只改共享目录,与站点级文件夹操作一样不需要凭据;无凭据、错误凭据、成员凭证或他房凭据一律只读。成员凭证只能以该成员身份发言或上传附件。声明字段(`author`、`source`、localhost)不代替凭据。
|
|
241
241
|
- **成员**:`room_members` 以 `id` 为稳定主键,`access` 为 `runner`(接入程序投递)、`manual`(成员自行读写)或 `online`(只读、原文代发),`session_mode` 标记是否借用用户正在使用的会话。房主用控制凭据 `POST members` 运行中加入成员,`POST members/ID {action}` 让成员离开(`away`,作废其进行中执行与未投递请求)、请回(`active`,必须提供不同于原凭证的新凭证,旧凭证副本不再有效)或移除(`remove`,保留历史发言)。同一成员凭证不能复用于其他成员或房主;相同凭证与配置的邀请、请回重试返回已有结果。会话续接由本机接入程序负责,服务端不保存会话绑定。
|
|
242
|
-
- **请求**:用户消息按结构化接收者 `to
|
|
242
|
+
- **请求**:用户消息按结构化接收者 `to`(成员名)为每位成员生成一条请求;省略且仅有一位在场成员时默认点名该成员,多位成员时交给主持人(`route`),只有在线成员而没有主持人时只作留言,不广播。网页从点名按钮和正文中代码与引用之外的 `@成员` 生成 `to`。请求状态为 `pending`(待投递)→ `delivering`(处理中)→ `completed` / `cancelled` / `failed`。
|
|
243
243
|
- **执行**:`member_executions` 每位成员最多一个 `dispatched/started`(部分唯一索引),不同成员可并行。接入程序用控制凭据 `GET inbox`、`POST executions {member_id, client_id}`(同一 `client_id` 返回同一执行)把成员的全部待投递请求打包;`POST executions/ID {action}` 支持 `renew`(租约 120 秒,不超过单次执行时限,默认 20 分钟)、`fail`(请求标记失败)和 `release`(仅确认未送达时退回队列)。租约过期的执行在下次读取或领取时标记失败,不自动重发。
|
|
244
|
-
-
|
|
244
|
+
- **主持人与任务链**:用户是需求方,不担任主持人。只要有在场的非在线成员,房间就保持恰好一位主持人:成员变动时,离开或移出的主持人失去角色,由第一位在场的 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 完成回交,回交请求按(派活消息,主持人)唯一,重复执行不会重复唤醒。
|
|
245
245
|
- **回应建议**:普通成员新发言的结构化 `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 发布前显式执行。已有历史消息不补写建议。
|
|
246
246
|
- **在线成员**:`access=online` 的成员只读,不进入 `inbox`,不能用自己的凭证发言;房主以控制凭据代发其回答(`author` 为该成员、`submitted_by` 为用户、`source=proxy`),可带 `request_ids` 关闭它的待处理请求。
|
|
247
247
|
- **关联房间**:从自由房间发起的讨论房间在建房时带 `parent_room_id`,记录在 `room_links`;讨论房间视图有 `parent_room`,自由房间视图列出 `linked_rooms`。头脑风暴的轮次、时长与名单因此天然独立于自由房间。
|
package/docs/runner.md
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
|
|
22
22
|
自定义地址保留完整路径前缀,填写到协议根路径,例如 [OpenRouter](https://openrouter.ai/docs/api_reference/overview) 的 `https://openrouter.ai/api/v1`,选择 Chat Completions 并填写其返回的 `provider/model` ID。程序分别追加 `/responses`、`/chat/completions`、`/messages` 或 `/models/{model}:generateContent`;不改写模型 ID 中的点号、横线或斜线,不按房间身份强制套用官方协议或思考参数。实现参考 [Cherry Studio 的供应商解析说明(固定版本)](https://github.com/CherryHQ/cherry-studio/blob/843a297fe73e9f527c8eb8291c0e1335f2279c04/docs/references/ai/provider-resolution.md) 对供应商、协议、Base URL 与 API 模型 ID 的拆分方式;协议转换独立实现,不引入其代码或 SDK。
|
|
23
23
|
|
|
24
|
-
`POST /api/local/api-key`(CLI 为 `codiscuss launch api-key --file FILE`)接收 `{base_url, api_key}`,仅向本机服务目录的 `api-keys/UUID.json` 写入,返回 `{api_key_ref}`。文件依赖本机用户目录权限保护,不作加密保险库;不要共享此目录。Base URL 改动后必须重新填写该地址对应的 Key。`launch settings` 读取结果附带 `api_keys`(`{Base URL: api_key_ref}`,同一地址取最近保存的一份,不含密钥),新建表单与改 Base URL 时自动带出该地址已保存的 Key,无需重复填写。网页密钥输入框不设保存按钮,失焦或回车即保存,可切换明文显示;它是用 CSS
|
|
24
|
+
`POST /api/local/api-key`(CLI 为 `codiscuss launch api-key --file FILE`)接收 `{base_url, api_key}`,仅向本机服务目录的 `api-keys/UUID.json` 写入,返回 `{api_key_ref}`。文件依赖本机用户目录权限保护,不作加密保险库;不要共享此目录。Base URL 改动后必须重新填写该地址对应的 Key。`launch settings` 读取结果附带 `api_keys`(`{Base URL: api_key_ref}`,同一地址取最近保存的一份,不含密钥),新建表单与改 Base URL 时自动带出该地址已保存的 Key,无需重复填写。网页密钥输入框不设保存按钮,失焦或回车即保存,可切换明文显示;它是用 CSS 遮挡的文本框,避免浏览器提示生成或保存密码。本次输入的密钥只在组件内存保留,保存后仍留在框内,可切换明文;本机不把已保存的密钥回传网页,重新打开时只显示遮挡占位,输入新 Key 即更换;密钥不进入控制器快照、localStorage、启动待办、房间数据或上游错误日志。
|
|
25
25
|
|
|
26
|
-
`POST /api/local/api-check`(CLI 为 `codiscuss launch api-check --file FILE`)接收 API profile,用该 profile 带一个空工具向模型发送一次极短请求(30 秒超时),一并核对地址、密钥、协议、模型与工具调用支持,成功返回 `{ok:true}`,失败只报 HTTP 状态。会产生一次极小的模型调用费用。网页 API
|
|
26
|
+
`POST /api/local/api-check`(CLI 为 `codiscuss launch api-check --file FILE`)接收 API profile,用该 profile 带一个空工具向模型发送一次极短请求(30 秒超时),一并核对地址、密钥、协议、模型与工具调用支持,成功返回 `{ok:true}`,失败只报 HTTP 状态。会产生一次极小的模型调用费用。网页 API 卡片背面标题右侧的闪电按钮调用此入口。
|
|
27
27
|
|
|
28
28
|
启动配置中的 API profile 为 `{adapter:"api", base_url, api_protocol, api_key_ref, model}`;`api_protocol` 为 `responses/chat/anthropic/gemini`。启动器在私有房间配置保存 `api_home`,供服务解析密钥引用。API 不需要 executable、项目目录、会话 ID 或技能安装;API 会话编号是本机参与者绑定,不是厂商的聊天 ID。模型列表入口仍为 `launch models` / `/api/local/models`,传入此 profile,只返回模型元数据。
|
|
29
29
|
|
|
@@ -102,7 +102,7 @@ codiscuss local stop
|
|
|
102
102
|
python server.py --host 127.0.0.1 --local-launch
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
需要 Node.js 24+ 与已安装、已登录的 AI 客户端;讨论所需的最小工具权限按 [单次执行权限](#单次执行权限)
|
|
105
|
+
需要 Node.js 24+ 与已安装、已登录的 AI 客户端;讨论所需的最小工具权限按 [单次执行权限](#单次执行权限) 提供。新建时分别选择房间用法与“程序唤醒”,从卡片下方的“添加”行加入本地参与实例,点卡片上的皇冠指定主持人;自由协作默认由第一位能自行发言的成员主持(用户是需求方),头脑风暴须选择本地 AI 主持。参与区只显示已加入的实例,用独立“移出”按钮调整名单。自动 CLI 卡片翻到背面后通过真实软件目录下拉选择模型,并按该模型支持的档位显示强度滑杆;首档使用 CLI 默认,agy 的强度包含在模型 ID 中。恢复默认只清除该实例的模型与强度覆盖,App、网页和手动会话在原软件设置。配置入口不依赖勾选立即启动,移出后重新加入保留本次填写。接入方式默认“程序唤醒”,“创建后立即启动 AI”默认勾选;本机服务未连接时只建房。项目文件权限在各自动 CLI 卡片上按专家设置(默认只读,在线专家固定只读),卡片背面“取消”或 Esc 恢复翻面前的设置,“完成”保留修改;卡片只在缺少软件路径、Sidecar IPC 目录或 Codex App 来源聊天时显示对应输入。项目目录可直接输入,也可点输入框右侧的文件夹图标经 `POST /api/local/pick-directory` 在运行本机服务的电脑上弹出系统目录选择窗口(Windows 用 PowerShell WinForms,macOS 用 osascript,Linux 用 zenity),取消时不返回路径,窗口最长等待 10 分钟。再点击“创建并启动讨论”;不勾选则只建房,之后在“接入”页启动。自由协作的“创建并连接”登记自动成员,后续点名产生任务时才唤醒。复用会话、单个 AI 的工作目录与项目等高级覆盖,以及“保存为本机软件默认配置”,在建房后的“接入”页设置,保存本身不启动任何 AI。卡片输入沿用当前页面的启动草稿,不随只建房请求保存到网站。正常首次自动接入无需下载 JSON、手动登记房间或另执行 `run start`。
|
|
106
106
|
|
|
107
107
|
网页在发送前把完整已提交输入、原提交号和控制凭据保存在当前站点的浏览器本地存储。服务启动失败或响应丢失后,刷新仍会显示“继续未完成的启动”;点击“继续本次启动”沿用原请求和本机已固定配置,无需重新填写,也不随新的默认配置变化。刷新只恢复界面,不自动运行;已暂停、结束、过期或在启动期间改变的房间不会因此重新开始。部分失败明确显示已核实的阶段,已建房不等于回滚;结果不明时保留原请求待核对。
|
|
108
108
|
|
package/docs/workflow.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
成员回答下的执行报告列出请求编号、耗时、终态与工作区观察文件;失败或取消的报告保留在原请求下。报告展示最近 100 次执行;“未提供自动改动检测”表示非 Git 目录或未上报,不能据此判断没有文件变化。
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
自由协作房间从同一角色库选择一位或多位成员。用户是需求方而不是主持人:只要有能自行发言的成员(本机唤醒或手动接入),房间就始终有一位 AI 主持人,默认是第一位本机唤醒的成员,可点皇冠或在成员菜单中更换;主持人不能直接卸任,离开或被移出时由下一位成员接任,原先由用户主持的旧房间在下一条消息时自动指定。只有一位成员时,每条消息都交给它;有多位时,在输入框上方点选成员,或在正文中 `@成员`(代码和引用中的 @ 不算,输入框中会生效的 @ 显示为蓝色),被点名的成员各自处理;未点名的消息交给主持人分派。只有网页 AI 成员时没有主持人,未点名的消息只作留言。输入 `@` 后,输入框上方弹出在场成员菜单,继续输入可筛选;用方向键与 Enter / Tab 或点击补全,Esc 关闭。选择只修改草稿。输入框 Enter 发送、Shift + Enter 换行;成员处理中且草稿为空时,发送按钮变为红色停止按钮。自动成员空闲时,服务把它名下所有未处理的消息打包成一次执行交给原会话;执行期间再发的消息排队,下一次一起投递。手动成员自行读取自己的请求,在线成员由用户转交。成员按时间顺序处理,后面的消息可以修正前面的。
|
|
18
18
|
|
|
19
19
|
运行中可在右侧成员栏邀请 AI(沿用本机软件配置和本房间工作目录),也可让成员离开、请回或移除。自动成员的项目文件权限默认只读;需要它修改项目时,在邀请前选择“项目文件可写”,权限只应用于这位成员;App 与手动成员的文件权限由其软件设置,API 与网页成员不访问项目文件。填写已有会话 ID 时续接该原会话,不新建。离开会立即停止它的工作;请回时换发新凭证并续接它原来的会话。邀请时可选“手动接入”:成员不会被自动唤醒,而是得到一份私有凭据文件,由你在它的会话中按参与技能读写。绑定你正在使用的会话的成员会标注“借用会话”:它工作时不要在原窗口继续操作。
|
|
20
20
|
|