--- status: live type: reference module: dsh-round-table last_updated: 2026-10-06 --- # 工具与 HTTP API / Tools and HTTP API 本参考对应源码1.0.0,接口与已验收0.1.18一致,本次仅调整版本编号。1.0.0尚未公开发布;已发行的GitHub Release及[npm包](https://www.npmjs.com/package/dsh-round-table/v/0.1.18)仍为0.1.18。完整注册与校验以源码为准。 / This reference covers source version 1.0.0, a version-number-only change retaining the accepted 0.1.18 API. Version 1.0.0 is not publicly released; GitHub and npm installation remains 0.1.18. Source validators remain authoritative. 接手先读本仓库[当前形态](PRD.md)、[PRD](PRD.md)、[ENGINEERING](ENGINEERING.md),再用本表定位实际合同。 / Read the current product/engineering documentation before using these route summaries. ## 新增契约 / New contracts ### 当前自由步骤合同 / Current free-step contract 自由步骤以`steps.version=1`及workflow schema3保存;schema1/2历史保留、未知4+只读。空/未完整steps草稿可以validate/save,但layout与运行预览使用严格图校验;运行时每项必须有效名称且恰一名普通成员。初始preview/start面向第一阶段全部真实nodeIds,包含首阶段并行;`confirmed:true`启动首阶段并授权预览里明确勾选的未来规则,未勾选未来环节仍需手动开始。新逐环节UI没有全局手动/自动下拉。内部entry/join helper只计算依赖,不可activate、暂存输入、持有秘书job或消耗配额。 / Schema3 stores the free-step layout; old schema1/2 remains intact and future versions are read-only. Partial drafts may validate/save, but layout and execution are strict. Initial preview/start authorizes every real first-stage item and selected future automatic rules; unchecked future steps remain manual. Internal helpers have no execution authority. Agent工具调用要求exec.agent为当前真实实例及未归档原会话。meeting_list与meeting_minutes_data限定本人参加/可信创建/专属秘书的会议;meeting_join只允许可信创建者邀请或成员幂等确认自己已在会,禁止非成员自行加入陌生会取得文件读取权。可信创建者绑定原会话身份,同SID替代不继承。宿主管理HTTP保持用户管理入口。 / Agent tools require an authentic current, unarchived session. Lists and minutes are scoped to owned or joined meetings, and joining cannot self-grant access to an unfamiliar meeting. Creator authority is bound to the original session incarnation; host user management remains available. | 工具或动作 / Tool or action | 参数与边界 / Parameters and boundary | |---|---| | meeting_propose_task_cards | meetingId, generationId, discussionId, requestId, items, emptyReason;仅本次真实原生成成员回传,不执行工作 / Only the selected authentic generator can submit cards; no work execution | | meeting_file_index | meetingId;当前真实成员只读本会批准索引 / Current authentic members read this meeting's approved index | | meeting_read_file | meetingId, fileId;精确版本、SHA和权限检查 / Exact approved version, hash and actor validation | | task-card-generate | requestId, recipientIds, instruction?, messageIds?, assetIds?;空正文允许,必须明确@成员 / Empty prose allowed; explicit recipients required | | task-card-adjust | requestId, cardId, expectedVersion, note;只请求原生成者调整一张卡 / Adjust one card with its original generator | | task-card-edit | requestId, cardId, expectedVersion, title, body, assigneeSessionId?;版本冲突拒绝 / Version conflicts rejected | | task-card-adopt | requestId, cardId, proposalId, expectedVersion;过时建议不覆盖 / Stale proposals never overwrite | | task-card-publish | requestId, cards:[{cardId,version}];先写文件再通知所选执行成员;unknown时重试原ID / File before notification; retry the original uncertain request | | meeting-folder-connect | confirmed:true;明确复制历史,不执行 / Explicit historical adoption, no execution | | meeting-folder-status / meeting-file-read | 只读完整性快照 / fileId 精确原件 / Read-only integrity snapshot or exact file | | workflow-input-add | runId,nodeId,requestId,text,messageIds,assetIds,confirmed:true;暂存资料,自动运行暂停 / Stage inputs and pause automatic execution | | workflow-published-cards / workflow-bind-card | 已发布卡片 / node,binding:{publicationId,cardId,version,fileId,sha256};绑定不执行 / Published snapshots; binding alone does not execute | | workflow-auto-rounds | runId,loopId,maxRounds,expected,confirmed:true;明确增加自动轮次,不改旧执行 / Extend automatic round limits without rewriting history | 旧全局策略默认manual;mode:automatic需confirmed:true。逐环节策略必须使用初始预览指纹和confirmed:true,automatic容器仅协调已授权规则,不把未勾选节点升级成自动。自动暂停/重启后resume也需confirmed:true。旧手动任务/模板协议仅供历史兼容与原授权恢复,当前用户面已移除。 / Legacy global policy defaults to manual. Per-node starts require a real initial preview and confirmation; their coordinator cannot promote unchecked nodes. Pause/restart resumption requires confirmation. Old task/template protocols remain for historical compatibility. [中文使用指南](../README.md) · [English guide](../README.en.md) 本文按当前路由及工具注册实现列出接口。参数列是要点,不替代运行时校验;`?` 表示可选,枚举用代码表示。除集合 GET 外,**所有会议子操作均使用 POST,包括只读操作**。不将操作数量等同于独立 URL 数量。 This reference follows the current route handlers and tool registrations. Parameters are a summary, not a complete validation schema. `?` means optional. **Every meeting action uses POST, including read operations; only the collection has GET.** Operation counts are not interchangeable with URL counts. `GET /plugins/round-table/local-scope` 为桌面用户面的只读实例识别接口,返回 home/profile 的稳定不透明哈希 `scope` 及 `profileName`;缺少宿主身份返回503。草稿、待核实请求及视图按该标识隔离,识别前不读取旧草稿。旧未分区记录只能在用户核对归属后导入,原记录保留。 / This read-only identity endpoint returns a stable opaque home/profile scope and profile name, or 503 when the host identity is absent. Local drafts and pending requests are partitioned by that identity; legacy import requires explicit ownership confirmation. 会议操作可携带 `x-round-table-scope`;与当前实例不符时返回409且 `requestState: rejected`,不执行操作。它用于阻止旧实例草稿投向新实例,不替代宿主访问控制。 / A mismatched scope header rejects the operation before execution; it is a stale-instance guard, not an authentication mechanism. `POST /plugins/round-table/meetings` 新增可选 `requestId`(1–100位字母、数字、下划线或连字符)。同ID和同初始标题、说明、工作区、成员返回同一会议;改内容的重试拒绝。客户端保存此请求身份再创建,成员续建独立记录阶段。 / An optional creation request ID recovers the same meeting after a lost response; reusing it for different initial content is rejected. ## 权限与公共约定 / Authority and conventions ### 目标直接 API 版本 / Target direct API versions | 包 / Package | 本版版本 / Version | |---|---| | `@deepseek-ai/cordis` | `4.0.4` | | `@deepseek-ai/dsh-tools`, `dsh-home-paths`, `dsh-agent`, `dsh-session`, `dsh-subagent`, `dsh-api-session-controller / dsh-api-workspace-controller`, `dsh-persona`, `dsh-llm`(均为 `@deepseek-ai/` 作用域 / all scoped under `@deepseek-ai/`) | `0.2.0-rc.2` | | `@deepseek-ai/schemastery` | `3.18.4` | | React(peer要求 / peer range;本次验证 / tested) | `^18.2.0`;`18.3.1` | 运行时守卫逐个精确检查上表的Cordis/DSH/Schemastery包,必须与peerDependencies一致。它不把其他 `0.1.x` 或RC版本当作已兼容,也不要求所有传递依赖使用同一个RC。缺包或未验证版本在注册插件服务前报错。 / The guard checks the exact direct Cordis/DSH/Schemastery versions declared in peerDependencies before registering services. Other 0.1.x or RC versions are not assumed compatible; transitive packages need not all have the same RC number. - 管理路由服务于宿主用户面,不注册为普通 Agent 的流程调度工具。插件路由不额外校验浏览器用户身份,不是面向公网的鉴权 API;访问控制依赖宿主部署边界。宿主应限制管理接口可访问者,勿把此清单视为公开网络授权。 / Management routes serve the host user panel, not ordinary Agent scheduling tools. They add no browser-user authentication and are not a public authenticated API. Access depends on the host deployment boundary; this inventory is not authorization to expose the routes publicly. - 任务认领、完成、失败和正式回传校验调用 Agent 的原会话身份与接收成员。建会、列表、入会和只读数据工具不具有同样的接收任务身份校验。秘书工具限制另由生命周期装配。 / Task claim, completion, failure and formal submission validate the calling Agent's original session against the task recipient. Create/list/join/data tools do not share that recipient-specific check. Secretary tool restrictions are installed separately by its lifecycle. - 多数管理动作返回 `{meeting}` 或专用结果;失败返回 `{error}`。通常为400(校验)、404(不存在)、405(方法),冲突可能409;聊天或修改写入异常可能500。失败文本或HTTP码不总能证明未提交,须遵循下面的请求恢复规则。 / Results usually contain `{meeting}` or an action-specific payload; failures contain `{error}`. Common statuses are 400, 404 and 405, with 409 for conflicts and possible 500 for chat/revision writes. An error alone does not always prove non-commit; follow request recovery rules below. - 读取/编辑/保存/预览本身不新增执行授权。正式提交、验收、选路可能令既已授权且勾选自动的下游满足条件,从而按冻结规则接力;未勾选的未来环节仍等手动确认,普通讨论/生成草稿不完成流程。 / Read/edit/save/preview does not add execution authority. Formal results, review or routing may satisfy already authorized automatic stages; unchecked future stages still wait, and ordinary replies/generated drafts do not complete stages. ## Agent 工具 / Agent tools | 工具 / Tool | 参数要点 / Key parameters | 行为 / Behavior | |---|---|---| | `round_table_ping` | 无 / none | 自检,返回 `pong, version`;不证明全部功能可用 / Self-check; does not certify every feature | | `meeting_create` | `title, workspaceId, description?, memberSessionIds?` | 创建会议及专属秘书;`description`在工具中可选、HTTP中必填。失败可能已建会,错误含会议ID供重试 / Create meeting and secretary; description optional here but required over HTTP. Secretary failure can leave the meeting created | | `meeting_list` | 无 / none | 返回 `{meetings}` 的会议事件投影 / Return meeting event projections | | `meeting_join` | `meetingId, sessionId` | 真实原创建者可邀请;普通成员只幂等确认本人已在本会,不可自授陌生会议权限。使用原成员检查及ensureMemberBriefing处理或恢复未完成简报 / Authentic creator may invite; members may only confirm their existing membership. Original-member checks and briefing recovery apply | | `meeting_task_claim` | `meetingId, taskId, result?, error?` | 接收成员认领,进入执行中 / Recipient claims work and enters execution | | `meeting_task_complete` | `meetingId, taskId, result?, error?` | 接收成员完成;放行任务走正式结果提交,需有效结果 / Recipient completes; release tasks submit a valid formal result | | `meeting_task_fail` | `meetingId, taskId, result?, error?` | 接收成员报告失败 / Recipient reports failure | | `meeting_reply_message` | `meetingId, discussionId, text, requestId?` | 原讨论实际接收成员回传普通回应;校验真实 Agent 与宿主送达证据,不认领/完成/验收任务、不自动转发。可多次反馈:每阶段新 requestId,同次重试保持编号与正文;未传编号时按正文摘要兼容去重 / Authorized original recipient returns an ordinary reply with verified Agent and host receipt; no task transition or forwarding. Use a new ID for each phase and the same ID/text for retry; omitted IDs use legacy text-hash deduplication | | `meeting_submit_result` | `meetingId, taskId, result` | 正式回传,返回taskId/status/messageId;不创建新运行或把普通回复当完成。已有授权自动节点可能因成果可用而继续 / Formal result; no new run or implicit reply completion. Previously authorized automatic nodes may become eligible | | `meeting_minutes_data` | `meetingId, scope?` | `scope=full`默认或`since_last`;返回完整JSON字符串 `snapshot`,只读不推进游标 / Full JSON snapshot; read-only, no cursor advancement | ## 集合接口 / Collection 基础路径 / Base: `/plugins/round-table/meetings` | 方法与路径 / Method and path | 参数 / Parameters | 结果与影响 / Result and effect | |---|---|---| | `GET /plugins/round-table/meetings` | query `view=summary?`, `detail=?`; header `If-None-Match?` | `{meetings}`,含归档;摘要模式省略大详情,`detail`指定完整项;支持ETag/304 / List including archives; compact summaries with selected detail, ETag/304 | | `POST /plugins/round-table/meetings` | `title, description, secretaryWorkspaceId, memberSessionIds?` | `{meeting, secretaryFailed?}`;秘书失败可能仍返回200及保留会议 / Create; 200 can retain a meeting with secretary failure | | `POST /plugins/round-table/meetings` | `action:"availability", ids?` | `{connections}`;最多检查500个传入会话ID,只读连接状态,不创建会议 / Read-only connection state for up to 500 supplied IDs | 后续表格中每行均为 **`POST /plugins/round-table/meetings//`**。`meetingId`应按单个路径段编码,body为JSON对象。 / Every row below is **`POST /plugins/round-table/meetings//`**. Encode the meeting ID as one path segment; use a JSON object body. ## 会议与成员 / Meeting and membership | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `edit` | `title, description` | 修改会议,同步秘书标题,不回写旧标签 / Edit meeting and secretary title, keep historical labels | | `delete` | `confirmed:true, notify?` | 永久删除,`notify`默认true;清会议及专属秘书主日志,保留普通成员 / Permanent deletion, notice defaults true; keep ordinary sessions | | `join` | `sessionId, role?, origin?` | 入会,必要时恢复原会话,并发送未发送过的简报;不把秘书作为普通成员 / Join, restore if needed, brief once; secretary excluded | | `leave` | `sessionId` | 退会,不停止原窗口 / Leave without stopping original session | | `retry-secretary` | `secretaryWorkspaceId` | 重试或补建秘书,已建秘书必须沿用原工作区 / Retry/provision secretary; existing workspace cannot change | | `member-names` | `names:{sessionId:name}` | 更新当前成员显示名,单名最多160字符 / Update current member display names | | `member-status` | `{}` | `{members}`:连接、忙碌、其他会议的阻塞任务 / Connections, busy state and cross-meeting blocking tasks | | `member-retry` | `sessionId, confirmed:true` | 核对本会原成员并恢复同一会话,返回 `{status}`;不解除归档、不替代已删除会话,未知读取不当作删除 / Verify and restore the same meeting member session, returning `{status}`; no unarchive or replacement, read failures remain unknown | | `member-reply` | `sessionId` | `{text?}`:最近可发布回复前1800字符,不替代候选全文预览 / Short latest reply preview, not full publication evidence | | `archive` | `archived:boolean, confirmed:true`归档时 / on archive | 归档结束等待并暂停,恢复不重开任务 / Archive ends waits; restore stays paused | | `pin` | `pinned:boolean` | 持久置顶或取消 / Persist pin state | | `export` | `{}` | `{markdown}`:会议消息、任务、验收和流程记录 / Markdown meeting/task/review/workflow export | `origin`仅审计,形如 `{source:"existing"|"preset", presetId?, workspaceId?}`,不授予工作区或文件权限。删除的JSONL后端、句柄和无回收站边界见使用指南。 / `origin` is audit metadata only and grants no workspace/file permissions. See the guide for deletion backend and handle limits. ## 讨论与旧即时操作 / Discussion and legacy immediate actions | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `chat-preview` | `input:ChatInput` | `{plan}`,校验来源并返回fingerprint;不投递 / Validate and preview without delivery | | `chat-send` | `input, fingerprint, requestId` | `{receipt}`:含 `messageId`,普通发送另含 `discussionId`,任务发送含 `releaseId`;按 record/send/queue 提交,检查预览一致性 / Receipt identifies the message plus discussion or release; commit against the preview | | `discussion-retry` | `discussionId, sessionId` | `{ok:true}`:offline/failed 重新排入原投递;uncertain/delivering 只在原宿主证据已证明送达时改为 delivered,不盲重投 / Requeue offline/failed original delivery; uncertain/delivering become delivered only with original host proof, without blind resend | | `discussion-close` | `discussionId, sessionId, confirmed:true` | `{ok:true}`:结束这位成员的普通讨论等待,不停止原窗口、保留已回传内容 / End this recipient’s discussion wait without stopping its original session or removing replies | | `message` | `text, requestId` | `{meeting}`:仅保存普通正文 / Save text only | | `lookup-message` | `id` | `{message}`:查一条正式流消息 / Retrieve one stream message | | `mark-conclusion` | `messageId` | 将来源消息标记为结论,不唤醒成员 / Mark source as conclusion without waking members | | `broadcast` | `text, deliveries:[{sessionId,status,error?}]` | 只簿记用户面已执行的投递;`status=delivered|undelivered` / Record deliveries already performed by client; not a server-side sender | | `dispatch` | `toSessionId, title, text` | 旧即时派遣,返回 `{dispatch:{taskId,status,attemptId}}` / Legacy immediate task dispatch | | `cancel` | `taskId, attemptId?` | 旧任务取消;放行任务委托stop-release,不能撤回已送达消息 / Legacy cancellation, delegates release tasks to stop-release | ```ts interface ChatInput { kind?: 'message' | 'task' contextTaskId?: string mode: 'record' | 'send' | 'queue' instruction: string messageIds: string[] assetIds: string[] recipientIds: string[] runId: string | null nodeId?: string } ``` `record`只记录。新客户端显式传 `kind:"message"`,`send`冻结明确正文及资料、建立普通 discussion 投递,不创建 ReleaseDraft/工作任务/流程激活或消耗任务次数额度;忙碌原窗口通过 FIFO 接收。`contextTaskId` 必须属于本会,只关联澄清,不改任务要求或状态。显式 `kind:"task"` 的 `send` 保留任务放行语义;省略 kind 兼容旧客户端的任务发送,因此新客户端不能靠省略来发送普通消息。`queue` 暂存到已有流程目标,不接受 `kind:"message"`。`requestId` 是同次重试身份(1–70位字母、数字、下划线或连字符),同 ID 不能换内容;fingerprint 变更需新预览。 / `record` only saves. New clients explicitly use `kind:"message"`: `send` freezes selected text/materials into a discussion delivery without a release draft, work task, workflow activation or task-attempt charge; busy original sessions receive it through FIFO. `contextTaskId` must belong to this meeting and only links clarification without changing task requirements or state. Explicit `kind:"task"` retains work release semantics; omitted kind preserves legacy task sending, so new clients must not omit it for ordinary messages. `queue` stores input for an existing stage and rejects message kind. Retry IDs use 1–70 letters, digits, underscores or hyphens; keep the same ID/content for the same attempt. Changed fingerprints require another preview. ## 任务与回传 / Tasks and results | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `release-draft` | `id, instruction, messageIds[], recipientIds[], assetIds?, title?, parentTaskId?, version?` | `{draft}`:存草稿,不执行 / Save draft, no execution | | `release` | `draftId, version` | `{draft}`:版本一致时冻结资料、建立成员任务并排队 / Freeze matching draft and queue member tasks | | `retry-release` | `taskId, allowDuplicate?` | 仅offline或uncertain;不能证明已送达时uncertain重试须明确允许重复 / Retry offline/uncertain; duplicate consent needed if uncertain remains unproved | | `stop-release` | `taskId` | 仅queued/offline,可结束尚未投递任务 / Stop only an undelivered queued/offline task | | `release-pause` | `paused:boolean` | 暂停或恢复授权队列,不影响原窗口 / Pause/resume authorized queue, keep original sessions | | `close-task` | `taskId, confirmed:true, reason?` | 结束本会等待,不停止原窗口;已完成结果保留 / End meeting wait, retain original work/results | | `review-task` | `taskId, review, note?` | `review=accepted|changes_requested`;只验收最新已提交结果,新操作追加 `reviewHistory`,相同状态和意见重试不重复追加;旧记录仍读原 review 字段 / Review latest submitted result; append review history for a new decision, deduplicate identical status/note retries, and retain legacy review fields | | `revision-preview` | `taskId, note` | `{plan}`:需要原结果标为要求修改,核对下游消费和额度 / Preview revision, checks review state, consumers and budgets | | `revision-start` | `taskId, note, fingerprint, requestId, confirmed:true` | `{release}`:关联修改,原结果不覆盖 / Start linked revision, keep original result | | `repair-image-input` | `taskId, confirmed:true` | 仅已证实的本插件图片不兼容失败;核对宿主上下文后替换图片输入并结束等待,保留审计 / Narrow verified unsupported-image recovery with retained audit | | `publish-candidates` | `sessionId, before?` | 分页原会话assistant正文,返回items/cursor;排除思考、工具日志与超长正文 / Page actual assistant text, excluding reasoning/tool logs/oversized text | | `publish-reply` | `sessionId, seq, digest, requestId, confirmed:true, excerpt?, note?, taskId?` | 校验宿主原文;独立发布或补交未完成任务,保留来源 / Verify host reply; publish or fill outstanding task with provenance | `revision-start`返回409并带 `requestState:"rejected"` 才明确表示本次预提交校验拒绝;保留意见、新预览。一般存储或网络失败不带这个标记时可能已提交,应核对并重试原requestId,不能盲建第二项修改。 / A 409 with `requestState:"rejected"` explicitly identifies pre-commit rejection; retain notes and preview again. Other storage/network failures may follow commit: verify and retry the same request ID instead of blindly creating another revision. `publish-reply.taskId`支持delivered/in_progress/uncertain/failed的放行任务人工补交,不覆盖已完成结果。摘录校验和摘要验证由宿主源码执行,客户端不能替换正文。 / Manual fill-in supports delivered/in_progress/uncertain/failed release tasks and does not overwrite completed results. Host-side provenance checks prevent client-supplied replacement text. ## 资料与模板 / Assets and templates | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `asset-upload` | `name, data(base64), mimeType?` | `{asset}`:校验大小/类型/编码,同名保留版本,按内容SHA-256去重 / Validate, version names, deduplicate content hash | | `asset-upload-begin` | `requestId,name,mimeType,totalBytes` | `{upload:{uploadId,offset,totalBytes}}`:完整引用最大256MiB;同请求恢复原加载 / Complete reference up to 256MiB; resume same request | | `asset-upload-chunk` | `uploadId,offset,data(base64)` | `{upload}`:512KiB连续块,相同块幂等,拒绝不同字节覆盖 / Sequential 512KiB chunks, identical retries only | | `asset-upload-finish` | `uploadId` | `{asset}`:全长度及SHA核验后批准版本与位置;不创建消息或执行 / Verify complete length/hash, approve reference; no message or execution | | `asset-upload-cancel` | `uploadId` | `{cancelled,approvedAssetId?}`:撤回临时加载;已批准原件保留 / Cancel intake, keep approved original | | `asset-read` | `id` | `{asset}`:小文本/图片核验后提供data;完整文件引用仅元信息、批准位置、未解析说明 / Small text/images retain data; opaque references return metadata and approved location only | | `asset-download` | `id` | 校验精确版本后返回完整原件流,attachment下载;仅宿主界面 / Verified complete original stream as download, host UI only | | `save-template` | `id(资料包/draft), title?, templateId?` | 保存要求与接收成员,不固定复制资料 / Save instruction/recipient template, not frozen evidence | | `delete-template` | `id` | 删除本会议模板 / Delete local meeting template | | `list-templates` | `{}` | `{templates}`:跨会议列表,含sourceMeetingId / Cross-meeting template list | | `delete-draft` | `id` | 仅删除未放行的资料包 / Delete only an unreleased draft | 直接解析的图片/文本最多2MiB,文本最多100000字符;普通完整文件引用最大256MiB,未解析,不自动解压或向模型注入二进制/base64。验证失败返回requestState=rejected和retryable=false,不建议无效重试。HTTP均按会议/实例限定,不接受任意宿主路径。 / Parsed images/text are limited to 2MiB and 100,000 text characters. Complete references are limited to 256MiB, unparsed and not extracted or injected as binary/base64 into models. Permanent validation failures return rejected and retryable=false. Requests are meeting/instance scoped; arbitrary host paths are not accepted. ## 纪要 / Minutes | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `minutes` | `scope:full|since_last` | 启动生成任务,可能调用模型,默认草稿 / Start generation, may invoke models, draft by default | | `minutes-data` | `scope:full|since_last` | `{data}`:只读生成输入,不推进成功基线 / Preview input without advancing baseline | | `cancel-minutes` | `{}` | 取消当前生成,不推进游标 / Cancel current job, no cursor advancement | | `review-minutes` | `minutesId, confirmed:true, acknowledgeConflicts?` | 记录人工核对;有冲突必须明确acknowledgeConflicts / Record human review; conflicts need explicit acknowledgement | | `publish-minutes` | `minutesId` | 公开已核对纪要到消息流,不唤醒 / Publish reviewed minutes to stream without waking members | | `send-minutes` | `minutesId` | 通知普通成员;分别记录送达并支持重试未送达成员 / Notify ordinary members, track individual delivery/retry | | `minutes-source` | `source:formal|session, confirmed?` | session需confirmed:true;切换输入来源,不混增量基线 / Session mode requires consent; source-specific baselines | 结构化任务快照与冲突检测不是所有内容的事实保证。模型文本必须核对;已知冲突确认后仍随分享和导出保留。 / Structured snapshots and conflict checks do not certify all content. Review prose; acknowledged conflicts remain visible on sharing/export. ## 流程 / Workflows 以下接口包含当前steps与旧图兼容动作。choice/partial/loop/temporary等不是新步骤列表的预设功能,不能从兼容接口反推当前UI;新内部helper拒绝作为这些执行/输入动作目标。 / This table includes compatibility routes; their presence is not a promise of controls in the new step list. Internal helper targets are rejected. | action | 参数 / Parameters | 行为 / Behavior | |---|---|---| | `workflow-validate` | `definition` | `{issues}`:validateWorkflowDraft,steps允许空/半配置;旧图仍严格 / Draft validation; partial steps allowed, legacy graphs strict | | `workflow-layout` | `definition` | validateWorkflowGraph严格通过后返回布局,不保存 / Strict graph validation and layout, no save | | `workflow-save` | `definition, expectedRevision?, confirmedFuture?` | 保存草稿不执行;自动/逐环节运行的未来规则变更需确认并暂停待恢复,活动结构/已开始字段冻结 / Save only; future changes require confirmation and pause/resume, active topology/started fields frozen | | `workflow-initial-preview` | `requestId` | `{plan}`:实际首阶段全部工作(可并行)、可用性、warnings/automaticWarnings,不预留执行 / Preview all real first-stage work and warnings, no reservation | | `workflow-initial-start` | `definitionRevision, fingerprint, requestId, mode?, confirmed` | 原子建立运行并开始实际首阶段全部项;只对旧真实minutes可预留秘书,helper不会生成纪要 / Atomic run/first-stage start; only real minutes may reserve secretary jobs, never helpers | | `workflow-create` | `definitionRevision, requestId, mode?, confirmed?` | `{run}`:仅旧策略支持建立运行,旧global automatic需确认;逐环节策略必须带真实预览指纹initial-start,汇合也先预览,人工路线不自动选择 / Legacy-only creation; global automatic needs confirmation, per-node starts require preview-bound initial-start | | `workflow-view` | `runId` | `{views}`:投影每环节状态 / Stage projections | | `workflow-preview` | `runId, nodeIds[], retry?` | `{plan}`:下一环节/重跑预览 / Preview next stage or retry | | `workflow-start` | `runId, nodeIds[], fingerprint, requestId, retry?, confirmed?` | `{activations}`:逐环节手动启动需confirmed:true及实际预览指纹;冻结/恢复/配额检查保持 / Per-node manual starts require confirmation and preview fingerprint; freeze/resume/budget checks apply | | `workflow-choice` | `runId, nodeId, edgeId, reason?` | 旧真实人工门选路;不新增启动授权,已有授权自动下游可满足条件 / Legacy routing adds no start authority; authorized automatic downstream may become eligible | | `workflow-clear-choice` | `runId, nodeId, activationId?` | 撤销未被后续使用的路线 / Clear unconsumed choice | | `workflow-partial-preview` | `runId, joinId` | `{plan}`:缺分支时预览已有结果 / Preview partial branch results | | `workflow-partial` | `runId, joinId, skipBranchIds[], fingerprint, confirmed:true, reason` | 旧图只记录明确省略、不新增授权;是否接力沿原运行规则/恢复条件;steps helper拒绝partial / Legacy omission adds no authority; existing rules/resumption govern later work, step helpers reject partial | | `workflow-bypass` | `runId, nodeId, activationId?, confirmed:true, reason` | 跳过处理并沿用输入,保留缺失说明 / Bypass processing with omission notice | | `workflow-queue-input` | `runId, nodeId, messageId` | 为已有目标暂存正式消息 / Store message for existing target | | `workflow-temporary-preview` | `runId, input:TemporaryInput` | `{plan}`:临时回应预览 / Preview temporary request | | `workflow-temporary-start` | `runId, input, fingerprint, requestId` | `{activation}`:临时回应计入额度但不完成计划节点 / Temporary work consumes budget without completing planned stage | | `workflow-budget` | `runId, requestId, work, minutes, expected, confirmed:true` | 追加非负整数累计额度,不执行;expected为预览的有效累计上限 / Grant cumulative budget without execution; expected contains current effective limits | | `workflow-control` | `runId, control, confirmed?` | `pause|resume|stop|complete`,stop需confirmed:true;不停止原窗口 / Run control; stop needs confirmation, keeps sessions | `TemporaryInput`及流程定义为版本化对象,使用以下字段;不要把旧UI示例或未知schema当兼容承诺。 / These are versioned input contracts; historical UI examples and unknown schemas are not compatibility promises. ```ts interface TemporaryInput { instruction: string recipientIds: string[] messageIds: string[] assetIds: string[] nodeId?: string } // workflow-budget.expected interface ExpectedBudget { workAttempts: number; minutesStarts: number } // Core definition fields; use the runtime validator for all constraints. interface WorkflowDefinition { id: string; revision: number; title: string; entryId: string executionPolicy?: 'per-node-v1' steps?: {version:1; stages:{id:string; nodeIds:string[]}[]} nodes: { id: string; title: string; kind: 'work'|'join'|'minutes'; memberIds: string[]; instruction: string; inputs: WorkflowInput[]; includeIncoming: boolean; decision?: boolean; requireReview?: boolean; autoReceiveAndRun?:boolean; confirmation?:boolean; stepsInternal?:'entry'|'join'; cardBinding?:{publicationId:string;cardId:string;version:number;fileId:string;sha256:string} }[] edges: { id: string; from: string; to: string; kind: 'flow'|'choice'|'loop'; label?: string; loopId?: string }[] parallelGroups: { id: string; sourceId: string; branchIds: string[]; joinId: string }[] loops: { id: string; nodeIds: string[]; entryIds: string[]; gateId: string; advanceId: string; maxRounds: number }[] limits: { nodeAttempts: number; workAttempts: number; minutesStarts: number } layoutRevision: number; positions: Record } type WorkflowInput = { kind:'message'; id:string } | { kind:'asset'; id:string } | { kind:'node'; nodeId:string; round:'current'|'previous' } | { kind:'activation'; activationId:string } ``` `maxRounds`为历史兼容字段,当前手动回路不执行轮次上限;nodeAttempts和运行累计额度仍执行。工作次数不保证Token或费用上限。 / `maxRounds` is retained for old data; manual loops do not enforce its round cap. Attempt and cumulative run budgets still apply, without a token/cost guarantee. ## 归档准入与状态 / Archive admission and state 归档会议允许 `archive, pin, export, lookup-message, asset-read, asset-download, meeting-folder-status, meeting-file-read, minutes-data, member-status, member-reply, publish-candidates, list-templates`;永久删除单独进入删除准入门。其他动作要求先恢复。 / Archived meetings allow these reads and management actions; permanent deletion has separate admission. Other actions require restoration first. 放行任务状态为 `queued, offline, delivering, uncertain, delivered, in_progress, completed, failed, cancelled`;验收状态独立为 `accepted|changes_requested`。`delivered`不代表阅读或完成,`uncertain`不允许盲目重发。 / Release states are distinct from acceptance. Delivered is not read or complete; uncertain delivery must not be blindly resent. 同一DSH_HOME仅一个队列宿主;跨profile不隔离默认存储,不支持跨进程exactly-once。冻结输入不隔离原会话记忆和权限。 / One queue host per DSH_HOME; default storage is shared across profiles, without cross-process exactly-once. Frozen evidence does not isolate session memory or permissions. ## 历史兼容验证说明 / Historical compatibility notes 本节的verify:layout和浏览器环境参数属于内部维护工作区;公开仓库只保留typecheck及verify:package,不附内部回归/业务证据。 / Historical browser-validation scripts are maintained privately; this public repository provides type and package checks. 默认圆桌每次打开380px,与原Agent主页面并排,关闭/卸载恢复占位;完整工作台保留左侧导航。流程图按宽高fit,Ctrl+滚轮只缩放画布,手动倍率保持到重新适配。选人浮层独立于输入裁切,真实DOM/CSS与命中门禁为npm run verify:layout(需本地Chrome及Playwright测试运行时,可通过ROUND_TABLE_CHROME_PATH、ROUND_TABLE_PLAYWRIGHT_MODULE配置)。普通恢复凭据仅标记对应已处理提醒,不删除源;未知发送不标成已解决。 恢复使用sessionController.resolveAgent,禁止create-or-adopt回落;DSH_HOME/round-table-member-identities持久绑定原header、preset与workspaceId,首次/重试/重启比对,读取失败不冒称删除。 / Recovery uses existing-only resolveAgent; durable identity bindings reject replacement incarnations across attempts and restarts. 逐环节策略:WorkflowDefinition/Run.executionPolicy="per-node-v1",node.autoReceiveAndRun严格boolean、缺省false;自动为true必须includeIncoming=true。旧图逐环节策略仍为schema2;自由步骤steps.version=1以schema3显式保存。阶段顺序及nodeIds为结构依据,编译器创建规范的入口/并行汇合依赖,这些stepsInternal节点不得执行、暂存输入或持有activation/秘书绑定。空/半配置草稿允许保存,运行定义必须严格完整;第一阶段可包含多个真实工作节点,initial-preview/start一次展示并明确授权首阶段,不自动授权后续未勾选节点。旧活动策略与运行拓扑冻结,旧versions和activation保留。未来规则保存、重启均须核对后明确恢复。schema1/2/3支持,4及以上只读。 / Per-node execution remains default-false and explicitly preview-confirmed. Free step stages compile canonical dependencies under schema 3; internal helpers have no execution authority. Partial drafts are saveable but unstartable, and the entire first stage is explicitly previewed. Legacy snapshots and active topology are preserved; schema 4+ is read-only.