ai_co_discuss 0.3.98 → 0.3.99

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/docs/runner.md CHANGED
@@ -116,13 +116,13 @@ API 成员可以担任专家或主持人。房间指定了项目目录时,它
116
116
  工作流把一种多人协作的做法存下来,供别的房间复用:一份给主持人读的做法说明(SKILL.md),加一组 Agent 卡片(每张就是一个专家预设)。工作流在左侧“频道工具 → 工作流”页管理(没打开房间时也能用):查看说明、接力顺序和成员卡片,新建、导入、编辑、删除都在这里。要在房间里用时,在输入框要求主持人启动(打 `/` 选工作流可以直接写好这句请求,权限见下文);主持人此后按说明组织工作。它只带来做法和成员;没画流程时不保证工序,具体怎么做由主持人判断。你随时可以 @ 任何成员。
117
117
 
118
118
  - **内置工作流**:安装包自带“小说剧本连载”(`story-serial`:编剧、写手、两位批评家与记录员逐集接力,附项目模板与状态检查脚本,脚本需要 Python 的 PyYAML)。默认不安装。在终端里运行 `codiscuss setup` 时,选完软件后有一步“安装配置”:先显示概览,按 → 展开,用空格勾选要装的工作流,回车继续;不勾就不装。也可以直接加 `--workflows` 安装全部(`install` 同样适用,非交互运行只认这个选项)。装的时候,已有同名的会覆盖为包里的最新版,原来那份先备份到服务目录的 `backups/workflows/`。选择只对这一次有效,不会记住,不选就不动工作流库。
119
- - **保存**:在“工作流”页点“添加”,选“新建”,或导入别人分享的 zip 或文件夹(手机、平板上同样可用)。导入的内容先在编辑页预览,点保存才写入。选中一个工作流后,右侧显示它的描述、接力顺序、成员卡片和做法说明,可“编辑”“复制路径”或“删除”。编辑页可以“从当前房间成员导入”卡片,提示词保持原文。想让主持人起草,打开下面的“主持人完整权限”。
120
- - **流程画布**:编辑页的成员卡片默认显示为流程画布(可切回“卡片列表”)。卡片就是平时用的专家卡片,拖标题栏移动,点卡片翻面设置;没放上画布的卡片列在画布上方,点一下放到接力末尾并自动连上。从「开始」右侧的圆点拖线连到卡片,排出谁先谁后;同一列并排的几张(由同一张交来、交给同一张)同时做;“主持人检查点”放在两棒之间,前一棒做完先交回主持人把关;从后面连回前面的卡片就是循环(虚线),走到这里交回主持人,要返工就从连回的那张再来一圈,通过就往下走。画布下方实时显示排出的顺序,排不成接力时说明原因。保存后,主持人按这个工作流派活时照画布交接,程序负责一棒接一棒、检查点和循环;画布留空时仍由主持人按做法说明组织。暂不支持按条件分支,需要判断的地方放主持人检查点。
119
+ - **保存**:在“工作流”页点列表上方的 +,选“新建”,或导入别人分享的 zip 或文件夹(手机、平板上同样可用)。导入的内容先放上画布预览,点“保存”才写入。复制文件夹路径和删除工作流在说明抽屉底部。编辑页可以“从当前房间成员导入”卡片,提示词保持原文。想让主持人起草,打开下面的“主持人完整权限”。
120
+ - **流程画布**:“工作流”页左边是工作流列表,其余整块就是选中工作流的画布。每位成员是一张小卡(序号、头像、名称、模型与权限),拖动即可移动;单击打开右侧的专家卡片,翻面设置或 × 删除。左上“成员”添加卡片(平台、预设,或当前房间的成员),“检查点”添加主持人检查点;也可以从卡片右侧的圆点拖线到空白处,就地选要加的成员并自动连上。名称在右上角直接改,Ctrl+S 保存。从「开始」右侧的圆点拖线连到卡片,排出谁先谁后;同一列并排的几张(由同一张交来、交给同一张)同时做;检查点放在两棒之间,前一棒做完先交回主持人把关;从后面连回前面的卡片就是循环(金色虚线),走到这里交回主持人,要返工就从连回的那张再来一圈,通过就往下走。底部的胶囊实时显示排出的顺序,排不成接力时变红说明原因。描述和做法说明在右上的说明图标里。主持人按这个工作流派活时照画布交接,程序负责一棒接一棒、检查点和循环;没连线时仍由主持人按做法说明组织。暂不支持按条件分支,需要判断的地方放检查点。
121
121
  - **让主持人自己建**:建房时(第 3 节“协作方式”)或在“成员与设置 → 协作设置”勾选“主持人完整权限”后,直接对主持人说要什么分工(或“把这个房间的做法存成工作流”),它会自己保存、在本房间启用,并邀请工作流里的成员,接着就按流程派活,不需要你导入或添加成员。之后让它改流程,改动从成员下一次执行起生效。打开这个开关后,也可以在输入框输入 `/` 选一个已保存的工作流,输入框里会写好“启用工作流「名称」(ID),”,补上要做的事发给主持人,它就启用这个工作流并带来成员(没打开时该项灰显)。主持人带来的成员项目权限最高为可写;只有本地软件担任的主持人能这样做,API 主持人不行。
122
122
  - **主持人完整权限的其他控制**:同一个开关打开后,主持人会自己处理房间里的问题、持续推进:成员跑偏时插话、卡住时打断或重试、模型不可用时换模型、无法恢复时换人;你也可以直接说“停下写手”“全部停下”“下一个让批评家先说”“请一位 Codex 进来只读评审”“把记录员请出去”“开个 Goal 把剩下几集写完”“暂停讨论”。邀请只用本机已配置的软件,项目权限最高可写;它自己开的 Goal 用你的默认预算(不限时为 8 次续跑、90 分钟)。成员连续 10 分钟没有新输出时,系统会提醒主持人检查;主持人派出长任务时还可以给自己设定时检查(每 5–120 分钟一次,房间空闲后自动结束)。它也能撤回自己派出的活,正在循环的接力会立即停下。以下仍由你决定:对主持人自己操作或更换主持人、批准超出上限的轮数、高于可写的权限或放行工具、改项目目录、撤回你的消息、私聊。API 主持人没有命令行,不能这样做。
123
123
  - **分享**:工作流存在本机服务目录的 `workflows` 文件夹,一个工作流一个文件夹;编辑页可复制路径,把整个文件夹(或打成 zip)发给对方即可分享。导入时会列出每张卡片的提示词和项目权限;要求写文件的卡片默认按只读导入,逐张勾选后才放开。
124
124
  - **给 API 成员登记命令**:以 API 方式加入的成员没有命令行。工作流文件夹里放一个 `commands.json`(写法见 `workflow-creator` 技能),登记它们能运行的命令(例如检查脚本,脚本也放在工作流文件夹里),随工作流一起分享;启用后 API 成员只能按名字运行这些命令,改不了命令行,只读成员只能运行标为只读的命令。命令以你的身份在本机运行,所以导入别人的工作流时,编辑页会列出每条完整命令,勾选“允许这些命令在本机运行”才会带上;主持人起草或修改工作流时不能增删命令。
125
- - **修改与结束**:修改工作流会作用于所有启用它的房间,成员下一次执行就按新内容;新增的卡片不会自动进入房间,主持人用到时会自己补上,也可以在右栏工作流一行点刷新图标立即补齐(删掉的卡片,其成员留作普通成员;与库一致时不显示该图标);工作流卡片的提示词只读,在“工作流”页点“编辑”修改。工作流进行中时,主持人只在请求和它的用途相符(或你说按工作流做)时才用,其他请求照常处理。用完在“成员与设置 → 协作设置”的工作流一行点请离成员图标(或逐个让成员离开):工作流带来的成员离开(主持人保留),正在进行的工作随之停止,工作流结束,右栏这一块消失;成员会话保留,下次在输入框打 `/` 选它就把原成员请回来,接着原来的上下文。换工作流时直接选另一个,原来的成员留作普通成员。
125
+ - **修改与结束**:修改工作流会作用于所有启用它的房间,成员下一次执行就按新内容;新增的卡片不会自动进入房间,主持人用到时会自己补上,也可以在右栏工作流一行点刷新图标立即补齐(删掉的卡片,其成员留作普通成员;与库一致时不显示该图标);工作流卡片的提示词只读,在“工作流”页的画布上修改。工作流进行中时,主持人只在请求和它的用途相符(或你说按工作流做)时才用,其他请求照常处理。用完在“成员与设置 → 协作设置”的工作流一行点请离成员图标(或逐个让成员离开):工作流带来的成员离开(主持人保留),正在进行的工作随之停止,工作流结束,右栏这一块消失;成员会话保留,下次在输入框打 `/` 选它就把原成员请回来,接着原来的上下文。换工作流时直接选另一个,原来的成员留作普通成员。
126
126
 
127
127
  ## 朗读与语音输入(可选)
128
128
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai_co_discuss",
3
- "version": "0.3.98",
3
+ "version": "0.3.99",
4
4
  "bin": {
5
5
  "codiscuss": "runner/codiscuss.mjs"
6
6
  },
@@ -106,7 +106,8 @@ export function compile_flow(flow, cards = [], labels = {}) {
106
106
  if (starts.length !== 1) return { steps: [], gates: [], errors: ['画布须有且只有一个开始节点'], empty: false };
107
107
  const start = starts[0];
108
108
  const used = shape.nodes.filter(node => node.type !== 'start');
109
- if (!used.length) return { steps: [], gates: [], errors: [], empty: true };
109
+ // Cards laid out with no arrow from the start yet are no relay at all, not a broken one.
110
+ if (!used.length || !shape.edges.some(edge => edge.source === start.id)) return { steps: [], gates: [], errors: [], empty: true };
110
111
  const known = new Set(cards);
111
112
  const label = node => node.type === 'host' ? '主持人检查点' : node.type === 'start' ? '开始' : `卡片 ${labels[node.card] || node.card}`;
112
113
  const placed = new Set();
@@ -494,10 +494,12 @@ export function load_room_workflow(config) {
494
494
  const workflow = get_workflow(config.api_home, binding.id);
495
495
  const { directory } = workflow;
496
496
  const cards = Object.fromEntries(workflow.agents.map(agent => [agent.card, agent]));
497
+ // A canvas whose start has no arrow yet asks for no relay.
498
+ const flow = workflow.flow ? compile_flow(workflow.flow, Object.keys(cards)) : null;
497
499
  return { id: binding.id, label: workflow.label || binding.id, description: workflow.description || '', directory, skill_path: join(directory, 'SKILL.md'), skill: workflow.skill,
498
500
  revision: createHash('sha256').update(workflow.skill).digest('hex').slice(0, REVISION_LENGTH),
499
501
  members: binding.members || {}, cards, commands: workflow.commands,
500
- ...(workflow.flow ? { flow: compile_flow(workflow.flow, Object.keys(cards)) } : {}) };
502
+ ...(flow && !flow.empty ? { flow } : {}) };
501
503
  } catch (error) { return { id: binding.id, error: error.message }; }
502
504
  }
503
505