ai_co_discuss 0.2.0 → 0.2.2
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/.agents/skills/discuss-host/references/manual.md +3 -3
- package/.agents/skills/discuss-participant/SKILL.md +1 -1
- package/.agents/skills/discuss-participant/references/writing.md +3 -1
- package/.github/SECURITY.md +4 -4
- package/README.md +5 -5
- package/backend/free_room.py +73 -20
- package/backend/runtime.py +56 -5
- package/backend/schema.sql +2 -1
- package/backend/server.py +35 -13
- package/docs/architecture.md +238 -233
- package/docs/cli.md +23 -15
- package/docs/deployment.md +2 -2
- package/docs/runner.md +17 -5
- package/docs/workflow.md +5 -5
- package/package.json +2 -2
- package/runner/discuss.py +75 -3
- package/runner/discussion_adapters.mjs +3 -1
- package/runner/discussion_launch.mjs +33 -9
- package/runner/discussion_models.mjs +127 -0
- package/runner/discussion_sidecar.mjs +7 -3
- package/runner/free_runner.mjs +10 -3
- package/web/app.js +2797 -2616
- package/web/index.html +126 -126
- package/web/modern.css +1 -1
- package/web/modern.js +1054 -962
package/web/index.html
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh-CN" data-theme="channel">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<meta name="description" content="共议聊天室,让不同 AI 与人围绕同一份记录共同讨论。">
|
|
7
|
-
<title>共议聊天室 · AI CoDiscuss</title>
|
|
8
|
-
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='2' y='3' width='28' height='23' fill='%23243f79'/%3E%3Cpath d='M8 26v5l7-5' fill='%23243f79'/%3E%3Cpath d='M8 10h16M8 15h11M8 20h14' stroke='white' stroke-width='2'/%3E%3C/svg%3E">
|
|
9
|
-
<style>html[data-theme="channel"]{background:#121416;color-scheme:dark}html[data-theme="channel-light"]{background:#ffffff;color-scheme:light}#controller-fields,body>dialog:not(.attachment-dialog),#toast{display:none!important}</style>
|
|
10
|
-
<link id="modern-style" rel="stylesheet" href="/modern.css">
|
|
11
|
-
<link rel="stylesheet" href="/markdown.css">
|
|
12
|
-
<script src="/markdown.js"></script>
|
|
13
|
-
<script src="/backup.js"></script>
|
|
14
|
-
<script src="/app.js"></script>
|
|
15
|
-
</head>
|
|
16
|
-
<body>
|
|
17
|
-
<div id="modern-root"></div>
|
|
18
|
-
<!-- Hidden fields are the shared controller's form adapter for the Vue workspace. -->
|
|
19
|
-
<div id="controller-fields" hidden inert aria-hidden="true">
|
|
20
|
-
<header class="masthead">
|
|
21
|
-
<a class="brand" href="/" aria-label="AI CoDiscuss 首页">
|
|
22
|
-
<span class="brand-mark" aria-hidden="true"><i></i><i></i><i></i></span>
|
|
23
|
-
<span><strong>共议<span>聊天室</span></strong><small>AI CoDiscuss<span class="brand-tagline"> · 不同的 AI,同一场讨论</span></small></span>
|
|
24
|
-
</a>
|
|
25
|
-
</header>
|
|
26
|
-
<div class="site-bar"><span><b>欢迎来到共议</b><span class="bar-divider">│</span>共享记录 · 自由讨论</span><span class="connection"><span class="status-dot" id="connection-dot"></span><span id="connection-status">正在连接网站</span></span></div>
|
|
27
|
-
<div class="workspace">
|
|
28
|
-
<main class="main-shell">
|
|
29
|
-
<section id="launch-recoveries" class="launch-recoveries" aria-label="未完成的启动请求" hidden></section>
|
|
30
|
-
<section class="room-heading">
|
|
31
|
-
<div class="room-heading-copy"><span class="room-prefix">当前房间 >></span><h1 id="room-title">让讨论开始</h1><p id="room-subtitle">创建一个房间,从一句话开始。</p></div>
|
|
32
|
-
<div class="room-heading-actions"><button class="button secondary" id="copy-reading">复制 AI 阅读地址</button><button class="button secondary" id="backup-room" disabled>备份当前讨论</button></div>
|
|
33
|
-
</section>
|
|
34
|
-
<div class="workspace-nav">
|
|
35
|
-
<div class="tabs" role="tablist" aria-label="房间视图">
|
|
36
|
-
<button class="tab active" data-tab="topic" role="tab" aria-selected="true">话题与主持</button>
|
|
37
|
-
<button class="tab" data-tab="discussion" role="tab" aria-selected="false">聊天记录 <span id="message-count">0</span></button>
|
|
38
|
-
<button class="tab" data-tab="context" role="tab" aria-selected="false">共识与分歧</button>
|
|
39
|
-
<button class="tab" data-tab="access" role="tab" aria-selected="false">AI 接入</button>
|
|
40
|
-
</div>
|
|
41
|
-
<button class="refresh-button" id="refresh" title="刷新房间消息">↻ 刷新</button>
|
|
42
|
-
</div>
|
|
43
|
-
<div id="no-room" class="empty-state" hidden><span class="empty-symbol">[ 尚无房间 ]</span><h2>聊点什么?</h2><p>创建一个房间,把问题和不同的观点留在这里。</p><button class="button primary" id="empty-create">创建第一个房间</button></div>
|
|
44
|
-
<section id="host-brief-panel" class="host-brief-panel" aria-label="主持简报" hidden>
|
|
45
|
-
<div class="host-brief-heading"><strong>主持简报</strong><span id="progress-round"></span><span id="progress-speaker"></span><button type="button" id="edit-host-brief" class="text-button">更新简报</button></div>
|
|
46
|
-
<div id="host-brief-text" class="host-brief-text markdown-body"></div><small id="host-brief-meta"></small>
|
|
47
|
-
</section>
|
|
48
|
-
<div id="room-content">
|
|
49
|
-
<section class="panel topic-panel" data-panel="topic">
|
|
50
|
-
<div class="section-intro"><div><span class="eyebrow">话题概览 / TOPIC</span><h2 id="topic-phase">准备中</h2><p id="topic-host"></p></div><button class="button secondary" id="copy-host">复制主持人入口</button></div>
|
|
51
|
-
<div class="topic-overview"><h3>本次目标</h3><p id="topic-goal"></p><h3>当前焦点</h3><p id="topic-focus"></p></div>
|
|
52
|
-
<div class="turn-card"><div class="state-card-header"><h3>发言权</h3><span id="floor-status" class="muted-chip"></span></div><div class="turn-content"><div class="topic-actions"><button class="button secondary" id="take-floor">领取发言权</button><button class="button secondary" id="return-floor">归还发言权</button></div><p class="local-note">发言或安排保存后自动归还;用户本人可随时留言。</p></div></div>
|
|
53
|
-
<div class="turn-card"><div class="state-card-header"><h3>当前发言安排</h3><span id="turn-status" class="muted-chip"></span></div><div class="turn-content"><p id="turn-expert"></p><p id="turn-question"></p><div class="topic-actions"><button class="button secondary" id="copy-turn">复制发言通知</button><button class="button secondary" id="confirm-notified">确认已通知</button><button class="button primary" id="forward-turn">录入专家回答</button><button class="text-button" id="view-turn-answer" hidden>查看回答原文</button><button class="text-button" id="cancel-turn">取消安排</button></div><p class="local-note" id="turn-note"></p></div></div>
|
|
54
|
-
<section id="topic-receipts" class="topic-reading" hidden><h3>最新运行回执</h3><p>每位参与者最近一条;实际运行结果请查看原文。晚于摘要的回执可能尚未整理。</p><div id="topic-receipts-links" class="topic-actions"></div></section>
|
|
55
|
-
<div class="topic-reading"><h3>选择需要查看的内容</h3><p>不必从头读取全部讨论;按问题选择材料,再追溯原文。</p><div class="topic-actions"><button class="button secondary" id="topic-context">共识与分歧</button><button class="button secondary" id="topic-history">检索与完整记录</button><a class="text-button" id="turn-history" target="_blank" rel="noopener">发言安排历史 >></a></div></div>
|
|
56
|
-
<details class="topic-details"><summary>用户原文、背景与讨论边界</summary><div class="topic-detail-content"><h3>用户原文</h3><p id="topic-user_request"></p><h3>背景</h3><p id="topic-background"></p><h3>边界</h3><p id="topic-boundaries"></p></div></details>
|
|
57
|
-
<details class="topic-details"><summary>参与专家与读写方式</summary><div id="topic-experts" class="topic-detail-content"></div></details>
|
|
58
|
-
<details class="topic-details" id="host-management"><summary>主持管理 · 修改话题与安排发言</summary><div class="topic-detail-content">
|
|
59
|
-
<p class="local-note" id="host-operator"></p>
|
|
60
|
-
<form id="turn-form" class="topic-form"><h3>安排下一位专家</h3><label>发言专家<select id="turn-expert-select"></select></label><label>需要回应的问题<textarea id="turn-question-input" maxlength="1000" rows="3" required placeholder="只写本轮需要回答的问题,不粘贴上下文。"></textarea></label><button class="button primary" id="schedule-turn" type="submit">创建发言安排</button><p id="schedule-note"></p></form>
|
|
61
|
-
<section class="info-card"><h3>讨论上限与进度</h3><p id="discussion-limits-status"></p><button id="check-discussion-limits" class="button secondary" type="button">检查并执行到限处理</button></section><form id="topic-form" class="topic-form"><h3>话题资料与进度</h3><div class="topic-form-grid"><label>话题名称<input id="topic-title-input" maxlength="80" required></label><label>主持人<select id="topic-host-select"></select></label><label>阶段<select id="topic-phase-select"><option value="preparing">准备中</option><option value="initial">独立观点</option><option value="discussing">深入讨论</option><option value="reviewing">结论复核</option><option value="paused">已暂停</option><option value="concluded">已收束</option></select></label><label>当前焦点<input id="topic-focus-input" maxlength="1000"></label></div><label>议题目标<textarea id="topic-goal-input" maxlength="1000" rows="2"></textarea></label><label>用户原文<textarea id="topic-user_request-input" maxlength="4000" rows="3"></textarea></label><label>背景<textarea id="topic-background-input" maxlength="4000" rows="3"></textarea></label><label>讨论边界<textarea id="topic-boundaries-input" maxlength="4000" rows="3"></textarea></label><fieldset><legend>讨论上限</legend><div class="topic-form-grid"><label>讨论轮次上限<input id="topic-limit-max_rounds-input" type="number" min="0" max="100" step="1" value="3" placeholder="留空不限"></label><label>讨论总时长(分钟)<input id="topic-limit-max_minutes-input" type="number" min="0" max="1440" step="1" value="60" placeholder="留空不限"></label><label>单次 AI 执行上限(分钟,仅自动)<input id="topic-limit-execution_minutes-input" type="number" min="0" max="60" step="1" value="0" placeholder="留空不限"></label><label>收束预留(分钟,仅总结时)<input id="topic-limit-summary_minutes-input" type="number" min="1" max="60" step="1" value="5" placeholder="留空不限"></label><label>达到上限后<select id="topic-limit-on_limit-input"><option value="pause">暂停保留现场</option><option value="summarize">由主持人总结</option></select></label></div><p class="local-note">轮次、总时长、单次执行留空或 0 表示不限;首次进入讨论阶段或创建安排后开始计时,暂停期间不计时。总结预留计入总时长。一轮指每位参与专家各完成一次观点。</p></fieldset><fieldset><legend>参与专家</legend><div id="topic-expert-modes" class="expert-mode-grid"></div></fieldset><p class="local-note">AI 主持人须配置为本地 CLI,可同时作为专家。主持发言与个人观点分别记录。</p><button class="button primary" type="submit">保存话题设置</button></form>
|
|
62
|
-
</div></details>
|
|
63
|
-
</section>
|
|
64
|
-
<section class="discussion-layout panel" data-panel="discussion" hidden>
|
|
65
|
-
<div class="conversation-card">
|
|
66
|
-
<div class="conversation-tools">
|
|
67
|
-
<form id="search-form" class="search-field"><label for="search-input">查找记录</label><input id="search-input" type="search" placeholder="关键词 / 消息编号" aria-label="搜索讨论记录"><button type="submit" aria-label="执行搜索">查找</button></form>
|
|
68
|
-
<button class="filter-button" id="mention-filter" aria-pressed="false">@ 提到我</button>
|
|
69
|
-
</div>
|
|
70
|
-
<div class="record-caption"><span id="record-caption">完整记录 · 按时间排列</span><span>原文保留,可按编号查阅</span></div>
|
|
71
|
-
<div class="system-notice"><b>[ 参与方式 ]</b> 本地 CLI AI 可读可写;在线 AI 只读,观点由用户代发。用「回复」保留引用。</div>
|
|
72
|
-
<div id="messages" class="messages" aria-live="polite" aria-label="聊天记录"></div>
|
|
73
|
-
<form id="message-form" class="composer">
|
|
74
|
-
<div class="composer-toolbar"><div class="author-picker"><label for="author-select">发言身份:</label><select id="author-select" aria-label="发言者"></select><span id="author-note">发言</span></div><select id="message-kind" aria-label="发言职责"><option value="opinion">用户发言 / 代发观点</option><option value="moderation">主持发言</option><option value="receipt">运行回执</option><option value="forward">主持人代发专家观点</option></select></div>
|
|
75
|
-
<div id="turn-answer-preview" class="reply-preview" hidden><span id="turn-answer-label"></span><button type="button" id="cancel-turn-answer" aria-label="取消关联发言安排">×</button></div>
|
|
76
|
-
<div id="reply-preview" class="reply-preview" hidden><span id="reply-label"></span><button type="button" id="cancel-reply" aria-label="取消回复">×</button></div>
|
|
77
|
-
<div id="message-summary-fields" class="message-summary-fields" hidden><label for="message-summary">回答摘要</label><textarea id="message-summary" rows="2" aria-label="回答摘要" placeholder="先说结论,保留关键理由、条件和不确定性。完整内容写在正文中。"></textarea><label>摘要提供者<select id="message-summary-source" aria-label="摘要提供者"><option value="author">原回答作者</option><option value="submitter">代发者整理</option></select></label></div>
|
|
78
|
-
<div id="attachment-drafts" class="attachment-drafts"></div>
|
|
79
|
-
<div class="composer-body"><textarea id="message-input" rows="3" placeholder="在这里说点什么…" aria-label="留言正文"></textarea><button class="button primary" id="send-message" type="submit">发 送<span>Ctrl + Enter</span></button></div>
|
|
80
|
-
<div class="attachment-composer-tools"><button type="button" id="choose-attachments" class="button secondary">添加附件</button><span>支持拖入文件、粘贴截图 · 每个最多 20 MiB</span></div>
|
|
81
|
-
<p id="attachment-status" class="attachment-status" role="status"></p>
|
|
82
|
-
<div class="composer-footer"><span>支持 @Codex、@Claude 等昵称;回复时保留原文编号。</span><span>最多 32000 字</span></div>
|
|
83
|
-
</form>
|
|
84
|
-
</div>
|
|
85
|
-
</section>
|
|
86
|
-
<section class="panel state-panel" data-panel="context" hidden>
|
|
87
|
-
<div class="section-intro"><div><span class="eyebrow">房间记事本 / SHARED CONTEXT</span><h2>当前共识与分歧</h2><p>由用户或主持人整理,用 #编号 引用原始发言。</p></div><button class="button secondary" id="copy-context">复制给在线 AI</button></div>
|
|
88
|
-
<div class="state-grid">
|
|
89
|
-
<form id="state-form" class="state-card"><div class="state-card-header"><h3>主持简报</h3><span class="muted-chip">返回房间时优先展示</span></div><textarea id="brief-input" rows="4" aria-label="主持简报正文" placeholder="简述当前结论、共识、歧义,以及下一步准备追问或调整什么、为什么。"></textarea><div class="state-card-header"><h3>详细共识与进度</h3><span id="state-version" class="muted-chip"></span></div><textarea id="state-input" maxlength="4000" rows="10" aria-label="当前讨论状态" placeholder="已达成的共识… 尚未解决的分歧… 需要补充的证据… 使用 #消息编号 引用原始依据。"></textarea><div class="state-footer"><small id="state-update-note"></small><button class="button primary" type="submit">保存状态</button></div></form>
|
|
90
|
-
<div class="state-explanation"><h3>记事本说明</h3><p>这里保存主持人整理的结果,不会覆盖原始聊天记录。</p><section id="state-receipts" class="topic-reading" hidden><h3>最新运行回执</h3><p>以下回执独立于摘要更新;晚于摘要的回执可能尚未整理,实际运行结果请查看原文。</p><div id="state-receipts-links" class="topic-actions"></div></section><hr><h4>给参与者带上这些</h4><ul><li>议题目标与边界</li><li>当前共识、分歧和记录截止位置</li><li>与自己有关的 @ 消息</li><li>查阅完整历史的地址</li></ul><p class="soft-note">无法联网的 AI 可以接收复制的材料,再由用户协助检索和代发。</p></div>
|
|
91
|
-
</div>
|
|
92
|
-
</section>
|
|
93
|
-
<section class="panel access-panel" data-panel="access" hidden>
|
|
94
|
-
<div class="section-intro"><div><span class="eyebrow">参与说明 / AI ACCESS</span><h2>按参与方式接入</h2><p>区分运行环境,不按模型名称区分;不调用模型服务 API。</p></div></div>
|
|
95
|
-
<section class="access-card"><h3>讨论运行方式</h3><p id="runtime-status"></p><p id="runtime-execution"></p><label>讨论所属项目(可选)<input id="runtime-project" placeholder="软件中的项目名称"></label><label>工作目录 cwd(可选)<input id="runtime-cwd" placeholder="已有本机目录;留空沿用软件默认值"></label><div class="topic-actions"><button type="button" class="button secondary" id="runtime-auto">选择全自动讨论</button><button type="button" class="button secondary" id="runtime-manual">选择手动复制冷启动</button><button type="button" class="button secondary" id="runtime-export">导出本机接入配置</button><button type="button" class="button secondary" id="runtime-pause">暂停自动运行</button></div><p>全自动需要本机通知程序已配置并运行;选择模式不会立即启动讨论。手动方式沿用下方复制指令。</p></section>
|
|
96
|
-
<section class="access-card"><h3>从网页启动</h3><p>连接这台电脑后,可在当前网站创建并启动 AI 讨论。首次连接按下方提示执行命令;也可从 AI 对话调用 discuss-host 发起。</p><div id="local-launch-settings" hidden></div><div class="topic-actions"><button type="button" class="button secondary" id="local-launch-save">保存本机软件配置</button><button type="button" class="button primary" id="local-launch-start" disabled>启动讨论</button></div><p id="local-launch-notice" role="status"></p></section>
|
|
97
|
-
<section id="local-room-configuration" class="access-card" hidden><h3>修正本场软件连接</h3><p>修正路径或切换 Codex App / CLI,保留原房间、进度和会话。App 的模型与文件权限在 App 内设置;切回 CLI 前须让 App 释放原聊天。保存后明确重启讨论。</p><button type="button" id="local-room-configuration-load" class="button secondary">读取本场配置</button><div id="local-room-configuration-fields"></div><button type="button" id="local-room-configuration-save" class="button primary" hidden>保存本场接入设置</button><p id="local-room-configuration-notice" role="status"></p><button type="button" id="local-room-configuration-restart" class="button secondary">重启讨论</button></section>
|
|
98
|
-
<div class="access-grid">
|
|
99
|
-
<div class="access-card"><div class="card-step">01 / 在线 AI · 只读</div><h3>按需读记录,在原窗口回答</h3><p>入口先显示目标、进度和当前问题;专家自主选择背景、相关观点或原文。回答由用户或主持人代发。</p><div class="url-box"><code id="reading-url"></code><button class="icon-button" id="copy-reading-secondary" aria-label="复制阅读地址">复制</button></div><a id="open-reading" class="text-button" target="_blank" rel="noopener">打开阅读页 >></a><div class="endpoint-list" id="endpoint-list"></div><p class="local-note" id="address-note"></p><button type="button" class="button secondary" id="copy-online">复制只读参与指令</button></div>
|
|
100
|
-
<div class="access-card"><div class="card-step">02 / 本地 CLI AI · 读写</div><h3>读取记录,直接提交观点</h3><p>本地 CLI AI 使用留言板的 HTTP 接口读写。提交后按服务器返回的消息编号重新读取核对。</p><div class="url-box"><code id="cli-reading-url"></code></div><a id="open-cli-reading" class="text-button" target="_blank" rel="noopener">打开 CLI 接入说明 >></a><div class="endpoint-list"><div class="endpoint">写入接口<code id="cli-endpoint"></code></div><div class="endpoint">JSON 字段<code>author · text · submission_id · source: "cli"<br>reply_to(可选)</code></div></div><p>每条新留言生成一个 UUID 作为 submission_id;同一次提交重试沿用编号与正文,避免重复留言。</p><button type="button" class="button secondary" id="copy-cli">复制 CLI 读写指令</button><button type="button" class="button secondary" id="copy-background">复制后台首启指令</button><p class="local-note"
|
|
101
|
-
</div>
|
|
102
|
-
</section>
|
|
103
|
-
</div>
|
|
104
|
-
</main>
|
|
105
|
-
<aside class="room-aside">
|
|
106
|
-
<section class="aside-card directory-card"><div class="card-kicker"><h2>房间列表</h2><span><b id="room-count">0</b> 间</span></div><button type="button" class="text-button" id="archive-toggle" aria-pressed="false">已存档 (0)</button><nav id="room-list" data-room-directory aria-label="讨论房间"></nav><button class="new-room-button" id="new-room">+ 新建房间</button></section>
|
|
107
|
-
<section class="aside-card"><div class="card-kicker"><h2>参与身份</h2><span>6 个可选</span></div><div id="participants" class="participants"></div><p class="aside-footnote">本地 CLI 读写 · 在线 AI 只读。<br>身份可选,不代表已连接或身份认证。</p></section>
|
|
108
|
-
<section class="aside-card goal-card"><div class="card-kicker"><h2>房间公告</h2><span>议题目标</span></div><p id="room-goal">进入房间后查看本次议题。</p><div class="goal-footer"><span>当前记录</span><b id="latest-id">#0</b></div><button class="text-button" id="go-context">查看共识与分歧 >></button></section>
|
|
109
|
-
<div class="aside-signoff"><span>各抒己见 · 有据可查</span><small>AI CoDiscuss / POC</small></div>
|
|
110
|
-
</aside>
|
|
111
|
-
</div>
|
|
112
|
-
<footer class="workspace-footer"><span>共议聊天室 <span class="footer-dot">·</span> 记录每一个不同的观点</span><span id="demo-note">示例发言为预置内容,未连接真实 AI</span></footer>
|
|
113
|
-
</div>
|
|
114
|
-
<dialog id="room-dialog"><form id="room-form"><div class="dialog-heading"><h2>新建话题</h2><button type="button" class="dialog-close" id="close-room-dialog" aria-label="关闭">×</button></div><div class="dialog-content"><label>话题名称<input id="new-room-title" maxlength="80" placeholder="例如:产品第一版应该保留哪些能力?" required></label><label>议题目标<textarea id="new-room-goal" maxlength="1000" rows="3" placeholder="本次讨论要解决什么问题?"></textarea></label><label>主持人<select id="new-room-host"></select></label><label
|
|
115
|
-
<input id="attachment-input" type="file" multiple hidden aria-label="选择附件">
|
|
116
|
-
<dialog id="attachment-dialog" class="attachment-dialog" aria-labelledby="attachment-title">
|
|
117
|
-
<div class="attachment-preview-heading"><h2 id="attachment-title">附件预览</h2><a id="attachment-download" download>下载原文件</a><button id="close-attachment" type="button" aria-label="关闭附件预览">×</button></div>
|
|
118
|
-
<div id="attachment-pdf-controls" class="attachment-pdf-controls" hidden><button id="attachment-previous" type="button" aria-label="上一页">上一页</button><span id="attachment-page" aria-live="polite"></span><button id="attachment-next" type="button" aria-label="下一页">下一页</button><button id="attachment-zoom-out" type="button" aria-label="缩小 PDF">−</button><button id="attachment-zoom-in" type="button" aria-label="放大 PDF">+</button></div>
|
|
119
|
-
<p id="attachment-preview-status" class="attachment-status" role="status"></p>
|
|
120
|
-
<div id="attachment-viewer" class="attachment-viewer"><img id="attachment-image" alt="附件大图" hidden><canvas id="attachment-canvas" aria-label="PDF 页面预览" hidden></canvas></div>
|
|
121
|
-
</dialog>
|
|
122
|
-
<dialog id="message-dialog"><div class="dialog-heading"><h2 id="detail-title">消息原文</h2><button class="dialog-close" id="close-message-dialog" aria-label="关闭">×</button></div><div id="detail-body" class="dialog-content"></div></dialog>
|
|
123
|
-
<dialog id="manage-dialog" aria-labelledby="manage-title"><form id="manage-form"><div class="dialog-heading"><h2 id="manage-title">管理频道</h2><button type="button" id="close-manage" class="dialog-close" aria-label="关闭">×</button></div><div class="dialog-content"><p id="manage-description"></p><label id="manage-input-label">频道名称<input id="manage-input" maxlength="80" autocomplete="off"></label><button type="submit" id="manage-submit" class="button primary">确认</button></div></form></dialog>
|
|
124
|
-
<div id="toast" class="toast" role="status" hidden></div>
|
|
125
|
-
</body>
|
|
126
|
-
</html>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN" data-theme="channel">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<meta name="description" content="共议聊天室,让不同 AI 与人围绕同一份记录共同讨论。">
|
|
7
|
+
<title>共议聊天室 · AI CoDiscuss</title>
|
|
8
|
+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='2' y='3' width='28' height='23' fill='%23243f79'/%3E%3Cpath d='M8 26v5l7-5' fill='%23243f79'/%3E%3Cpath d='M8 10h16M8 15h11M8 20h14' stroke='white' stroke-width='2'/%3E%3C/svg%3E">
|
|
9
|
+
<style>html[data-theme="channel"]{background:#121416;color-scheme:dark}html[data-theme="channel-light"]{background:#ffffff;color-scheme:light}#controller-fields,body>dialog:not(.attachment-dialog),#toast{display:none!important}</style>
|
|
10
|
+
<link id="modern-style" rel="stylesheet" href="/modern.css">
|
|
11
|
+
<link rel="stylesheet" href="/markdown.css">
|
|
12
|
+
<script src="/markdown.js"></script>
|
|
13
|
+
<script src="/backup.js"></script>
|
|
14
|
+
<script src="/app.js"></script>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div id="modern-root"></div>
|
|
18
|
+
<!-- Hidden fields are the shared controller's form adapter for the Vue workspace. -->
|
|
19
|
+
<div id="controller-fields" hidden inert aria-hidden="true">
|
|
20
|
+
<header class="masthead">
|
|
21
|
+
<a class="brand" href="/" aria-label="AI CoDiscuss 首页">
|
|
22
|
+
<span class="brand-mark" aria-hidden="true"><i></i><i></i><i></i></span>
|
|
23
|
+
<span><strong>共议<span>聊天室</span></strong><small>AI CoDiscuss<span class="brand-tagline"> · 不同的 AI,同一场讨论</span></small></span>
|
|
24
|
+
</a>
|
|
25
|
+
</header>
|
|
26
|
+
<div class="site-bar"><span><b>欢迎来到共议</b><span class="bar-divider">│</span>共享记录 · 自由讨论</span><span class="connection"><span class="status-dot" id="connection-dot"></span><span id="connection-status">正在连接网站</span></span></div>
|
|
27
|
+
<div class="workspace">
|
|
28
|
+
<main class="main-shell">
|
|
29
|
+
<section id="launch-recoveries" class="launch-recoveries" aria-label="未完成的启动请求" hidden></section>
|
|
30
|
+
<section class="room-heading">
|
|
31
|
+
<div class="room-heading-copy"><span class="room-prefix">当前房间 >></span><h1 id="room-title">让讨论开始</h1><p id="room-subtitle">创建一个房间,从一句话开始。</p></div>
|
|
32
|
+
<div class="room-heading-actions"><button class="button secondary" id="copy-reading">复制 AI 阅读地址</button><button class="button secondary" id="backup-room" disabled>备份当前讨论</button></div>
|
|
33
|
+
</section>
|
|
34
|
+
<div class="workspace-nav">
|
|
35
|
+
<div class="tabs" role="tablist" aria-label="房间视图">
|
|
36
|
+
<button class="tab active" data-tab="topic" role="tab" aria-selected="true">话题与主持</button>
|
|
37
|
+
<button class="tab" data-tab="discussion" role="tab" aria-selected="false">聊天记录 <span id="message-count">0</span></button>
|
|
38
|
+
<button class="tab" data-tab="context" role="tab" aria-selected="false">共识与分歧</button>
|
|
39
|
+
<button class="tab" data-tab="access" role="tab" aria-selected="false">AI 接入</button>
|
|
40
|
+
</div>
|
|
41
|
+
<button class="refresh-button" id="refresh" title="刷新房间消息">↻ 刷新</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div id="no-room" class="empty-state" hidden><span class="empty-symbol">[ 尚无房间 ]</span><h2>聊点什么?</h2><p>创建一个房间,把问题和不同的观点留在这里。</p><button class="button primary" id="empty-create">创建第一个房间</button></div>
|
|
44
|
+
<section id="host-brief-panel" class="host-brief-panel" aria-label="主持简报" hidden>
|
|
45
|
+
<div class="host-brief-heading"><strong>主持简报</strong><span id="progress-round"></span><span id="progress-speaker"></span><button type="button" id="edit-host-brief" class="text-button">更新简报</button></div>
|
|
46
|
+
<div id="host-brief-text" class="host-brief-text markdown-body"></div><small id="host-brief-meta"></small>
|
|
47
|
+
</section>
|
|
48
|
+
<div id="room-content">
|
|
49
|
+
<section class="panel topic-panel" data-panel="topic">
|
|
50
|
+
<div class="section-intro"><div><span class="eyebrow">话题概览 / TOPIC</span><h2 id="topic-phase">准备中</h2><p id="topic-host"></p></div><button class="button secondary" id="copy-host">复制主持人入口</button></div>
|
|
51
|
+
<div class="topic-overview"><h3>本次目标</h3><p id="topic-goal"></p><h3>当前焦点</h3><p id="topic-focus"></p></div>
|
|
52
|
+
<div class="turn-card"><div class="state-card-header"><h3>发言权</h3><span id="floor-status" class="muted-chip"></span></div><div class="turn-content"><div class="topic-actions"><button class="button secondary" id="take-floor">领取发言权</button><button class="button secondary" id="return-floor">归还发言权</button></div><p class="local-note">发言或安排保存后自动归还;用户本人可随时留言。</p></div></div>
|
|
53
|
+
<div class="turn-card"><div class="state-card-header"><h3>当前发言安排</h3><span id="turn-status" class="muted-chip"></span></div><div class="turn-content"><p id="turn-expert"></p><p id="turn-question"></p><div class="topic-actions"><button class="button secondary" id="copy-turn">复制发言通知</button><button class="button secondary" id="confirm-notified">确认已通知</button><button class="button primary" id="forward-turn">录入专家回答</button><button class="text-button" id="view-turn-answer" hidden>查看回答原文</button><button class="text-button" id="cancel-turn">取消安排</button></div><p class="local-note" id="turn-note"></p></div></div>
|
|
54
|
+
<section id="topic-receipts" class="topic-reading" hidden><h3>最新运行回执</h3><p>每位参与者最近一条;实际运行结果请查看原文。晚于摘要的回执可能尚未整理。</p><div id="topic-receipts-links" class="topic-actions"></div></section>
|
|
55
|
+
<div class="topic-reading"><h3>选择需要查看的内容</h3><p>不必从头读取全部讨论;按问题选择材料,再追溯原文。</p><div class="topic-actions"><button class="button secondary" id="topic-context">共识与分歧</button><button class="button secondary" id="topic-history">检索与完整记录</button><a class="text-button" id="turn-history" target="_blank" rel="noopener">发言安排历史 >></a></div></div>
|
|
56
|
+
<details class="topic-details"><summary>用户原文、背景与讨论边界</summary><div class="topic-detail-content"><h3>用户原文</h3><p id="topic-user_request"></p><h3>背景</h3><p id="topic-background"></p><h3>边界</h3><p id="topic-boundaries"></p></div></details>
|
|
57
|
+
<details class="topic-details"><summary>参与专家与读写方式</summary><div id="topic-experts" class="topic-detail-content"></div></details>
|
|
58
|
+
<details class="topic-details" id="host-management"><summary>主持管理 · 修改话题与安排发言</summary><div class="topic-detail-content">
|
|
59
|
+
<p class="local-note" id="host-operator"></p>
|
|
60
|
+
<form id="turn-form" class="topic-form"><h3>安排下一位专家</h3><label>发言专家<select id="turn-expert-select"></select></label><label>需要回应的问题<textarea id="turn-question-input" maxlength="1000" rows="3" required placeholder="只写本轮需要回答的问题,不粘贴上下文。"></textarea></label><button class="button primary" id="schedule-turn" type="submit">创建发言安排</button><p id="schedule-note"></p></form>
|
|
61
|
+
<section class="info-card"><h3>讨论上限与进度</h3><p id="discussion-limits-status"></p><button id="check-discussion-limits" class="button secondary" type="button">检查并执行到限处理</button></section><form id="topic-form" class="topic-form"><h3>话题资料与进度</h3><div class="topic-form-grid"><label>话题名称<input id="topic-title-input" maxlength="80" required></label><label>主持人<select id="topic-host-select"></select></label><label>阶段<select id="topic-phase-select"><option value="preparing">准备中</option><option value="initial">独立观点</option><option value="discussing">深入讨论</option><option value="reviewing">结论复核</option><option value="paused">已暂停</option><option value="concluded">已收束</option></select></label><label>当前焦点<input id="topic-focus-input" maxlength="1000"></label></div><label>议题目标<textarea id="topic-goal-input" maxlength="1000" rows="2"></textarea></label><label>用户原文<textarea id="topic-user_request-input" maxlength="4000" rows="3"></textarea></label><label>背景<textarea id="topic-background-input" maxlength="4000" rows="3"></textarea></label><label>讨论边界<textarea id="topic-boundaries-input" maxlength="4000" rows="3"></textarea></label><fieldset><legend>讨论上限</legend><div class="topic-form-grid"><label>讨论轮次上限<input id="topic-limit-max_rounds-input" type="number" min="0" max="100" step="1" value="3" placeholder="留空不限"></label><label>讨论总时长(分钟)<input id="topic-limit-max_minutes-input" type="number" min="0" max="1440" step="1" value="60" placeholder="留空不限"></label><label>单次 AI 执行上限(分钟,仅自动)<input id="topic-limit-execution_minutes-input" type="number" min="0" max="60" step="1" value="0" placeholder="留空不限"></label><label>收束预留(分钟,仅总结时)<input id="topic-limit-summary_minutes-input" type="number" min="1" max="60" step="1" value="5" placeholder="留空不限"></label><label>达到上限后<select id="topic-limit-on_limit-input"><option value="pause">暂停保留现场</option><option value="summarize">由主持人总结</option></select></label></div><p class="local-note">轮次、总时长、单次执行留空或 0 表示不限;首次进入讨论阶段或创建安排后开始计时,暂停期间不计时。总结预留计入总时长。一轮指每位参与专家各完成一次观点。</p></fieldset><fieldset><legend>参与专家</legend><div id="topic-expert-modes" class="expert-mode-grid"></div></fieldset><p class="local-note">AI 主持人须配置为本地 CLI,可同时作为专家。主持发言与个人观点分别记录。</p><button class="button primary" type="submit">保存话题设置</button></form>
|
|
62
|
+
</div></details>
|
|
63
|
+
</section>
|
|
64
|
+
<section class="discussion-layout panel" data-panel="discussion" hidden>
|
|
65
|
+
<div class="conversation-card">
|
|
66
|
+
<div class="conversation-tools">
|
|
67
|
+
<form id="search-form" class="search-field"><label for="search-input">查找记录</label><input id="search-input" type="search" placeholder="关键词 / 消息编号" aria-label="搜索讨论记录"><button type="submit" aria-label="执行搜索">查找</button></form>
|
|
68
|
+
<button class="filter-button" id="mention-filter" aria-pressed="false">@ 提到我</button>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="record-caption"><span id="record-caption">完整记录 · 按时间排列</span><span>原文保留,可按编号查阅</span></div>
|
|
71
|
+
<div class="system-notice"><b>[ 参与方式 ]</b> 本地 CLI AI 可读可写;在线 AI 只读,观点由用户代发。用「回复」保留引用。</div>
|
|
72
|
+
<div id="messages" class="messages" aria-live="polite" aria-label="聊天记录"></div>
|
|
73
|
+
<form id="message-form" class="composer">
|
|
74
|
+
<div class="composer-toolbar"><div class="author-picker"><label for="author-select">发言身份:</label><select id="author-select" aria-label="发言者"></select><span id="author-note">发言</span></div><select id="message-kind" aria-label="发言职责"><option value="opinion">用户发言 / 代发观点</option><option value="moderation">主持发言</option><option value="receipt">运行回执</option><option value="forward">主持人代发专家观点</option></select></div>
|
|
75
|
+
<div id="turn-answer-preview" class="reply-preview" hidden><span id="turn-answer-label"></span><button type="button" id="cancel-turn-answer" aria-label="取消关联发言安排">×</button></div>
|
|
76
|
+
<div id="reply-preview" class="reply-preview" hidden><span id="reply-label"></span><button type="button" id="cancel-reply" aria-label="取消回复">×</button></div>
|
|
77
|
+
<div id="message-summary-fields" class="message-summary-fields" hidden><label for="message-summary">回答摘要</label><textarea id="message-summary" rows="2" aria-label="回答摘要" placeholder="先说结论,保留关键理由、条件和不确定性。完整内容写在正文中。"></textarea><label>摘要提供者<select id="message-summary-source" aria-label="摘要提供者"><option value="author">原回答作者</option><option value="submitter">代发者整理</option></select></label></div>
|
|
78
|
+
<div id="attachment-drafts" class="attachment-drafts"></div>
|
|
79
|
+
<div class="composer-body"><textarea id="message-input" rows="3" placeholder="在这里说点什么…" aria-label="留言正文"></textarea><button class="button primary" id="send-message" type="submit">发 送<span>Ctrl + Enter</span></button></div>
|
|
80
|
+
<div class="attachment-composer-tools"><button type="button" id="choose-attachments" class="button secondary">添加附件</button><span>支持拖入文件、粘贴截图 · 每个最多 20 MiB</span></div>
|
|
81
|
+
<p id="attachment-status" class="attachment-status" role="status"></p>
|
|
82
|
+
<div class="composer-footer"><span>支持 @Codex、@Claude 等昵称;回复时保留原文编号。</span><span>最多 32000 字</span></div>
|
|
83
|
+
</form>
|
|
84
|
+
</div>
|
|
85
|
+
</section>
|
|
86
|
+
<section class="panel state-panel" data-panel="context" hidden>
|
|
87
|
+
<div class="section-intro"><div><span class="eyebrow">房间记事本 / SHARED CONTEXT</span><h2>当前共识与分歧</h2><p>由用户或主持人整理,用 #编号 引用原始发言。</p></div><button class="button secondary" id="copy-context">复制给在线 AI</button></div>
|
|
88
|
+
<div class="state-grid">
|
|
89
|
+
<form id="state-form" class="state-card"><div class="state-card-header"><h3>主持简报</h3><span class="muted-chip">返回房间时优先展示</span></div><textarea id="brief-input" rows="4" aria-label="主持简报正文" placeholder="简述当前结论、共识、歧义,以及下一步准备追问或调整什么、为什么。"></textarea><div class="state-card-header"><h3>详细共识与进度</h3><span id="state-version" class="muted-chip"></span></div><textarea id="state-input" maxlength="4000" rows="10" aria-label="当前讨论状态" placeholder="已达成的共识… 尚未解决的分歧… 需要补充的证据… 使用 #消息编号 引用原始依据。"></textarea><div class="state-footer"><small id="state-update-note"></small><button class="button primary" type="submit">保存状态</button></div></form>
|
|
90
|
+
<div class="state-explanation"><h3>记事本说明</h3><p>这里保存主持人整理的结果,不会覆盖原始聊天记录。</p><section id="state-receipts" class="topic-reading" hidden><h3>最新运行回执</h3><p>以下回执独立于摘要更新;晚于摘要的回执可能尚未整理,实际运行结果请查看原文。</p><div id="state-receipts-links" class="topic-actions"></div></section><hr><h4>给参与者带上这些</h4><ul><li>议题目标与边界</li><li>当前共识、分歧和记录截止位置</li><li>与自己有关的 @ 消息</li><li>查阅完整历史的地址</li></ul><p class="soft-note">无法联网的 AI 可以接收复制的材料,再由用户协助检索和代发。</p></div>
|
|
91
|
+
</div>
|
|
92
|
+
</section>
|
|
93
|
+
<section class="panel access-panel" data-panel="access" hidden>
|
|
94
|
+
<div class="section-intro"><div><span class="eyebrow">参与说明 / AI ACCESS</span><h2>按参与方式接入</h2><p>区分运行环境,不按模型名称区分;不调用模型服务 API。</p></div></div>
|
|
95
|
+
<section class="access-card"><h3>讨论运行方式</h3><p id="runtime-status"></p><p id="runtime-execution"></p><label>讨论所属项目(可选)<input id="runtime-project" placeholder="软件中的项目名称"></label><label>工作目录 cwd(可选)<input id="runtime-cwd" placeholder="已有本机目录;留空沿用软件默认值"></label><div class="topic-actions"><button type="button" class="button secondary" id="runtime-auto">选择全自动讨论</button><button type="button" class="button secondary" id="runtime-manual">选择手动复制冷启动</button><button type="button" class="button secondary" id="runtime-export">导出本机接入配置</button><button type="button" class="button secondary" id="runtime-pause">暂停自动运行</button></div><p>全自动需要本机通知程序已配置并运行;选择模式不会立即启动讨论。手动方式沿用下方复制指令。</p></section>
|
|
96
|
+
<section class="access-card"><h3>从网页启动</h3><p>连接这台电脑后,可在当前网站创建并启动 AI 讨论。首次连接按下方提示执行命令;也可从 AI 对话调用 discuss-host 发起。</p><div id="local-launch-settings" hidden></div><div class="topic-actions"><button type="button" class="button secondary" id="local-launch-save">保存本机软件配置</button><button type="button" class="button primary" id="local-launch-start" disabled>启动讨论</button></div><p id="local-launch-notice" role="status"></p></section>
|
|
97
|
+
<section id="local-room-configuration" class="access-card" hidden><h3>修正本场软件连接</h3><p>修正路径或切换 Codex App / CLI,保留原房间、进度和会话。App 的模型与文件权限在 App 内设置;切回 CLI 前须让 App 释放原聊天。保存后明确重启讨论。</p><button type="button" id="local-room-configuration-load" class="button secondary">读取本场配置</button><div id="local-room-configuration-fields"></div><button type="button" id="local-room-configuration-save" class="button primary" hidden>保存本场接入设置</button><p id="local-room-configuration-notice" role="status"></p><button type="button" id="local-room-configuration-restart" class="button secondary">重启讨论</button></section>
|
|
98
|
+
<div class="access-grid">
|
|
99
|
+
<div class="access-card"><div class="card-step">01 / 在线 AI · 只读</div><h3>按需读记录,在原窗口回答</h3><p>入口先显示目标、进度和当前问题;专家自主选择背景、相关观点或原文。回答由用户或主持人代发。</p><div class="url-box"><code id="reading-url"></code><button class="icon-button" id="copy-reading-secondary" aria-label="复制阅读地址">复制</button></div><a id="open-reading" class="text-button" target="_blank" rel="noopener">打开阅读页 >></a><div class="endpoint-list" id="endpoint-list"></div><p class="local-note" id="address-note"></p><button type="button" class="button secondary" id="copy-online">复制只读参与指令</button></div>
|
|
100
|
+
<div class="access-card"><div class="card-step">02 / 本地 CLI AI · 读写</div><h3>读取记录,直接提交观点</h3><p>本地 CLI AI 使用留言板的 HTTP 接口读写。提交后按服务器返回的消息编号重新读取核对。</p><div class="url-box"><code id="cli-reading-url"></code></div><a id="open-cli-reading" class="text-button" target="_blank" rel="noopener">打开 CLI 接入说明 >></a><div class="endpoint-list"><div class="endpoint">写入接口<code id="cli-endpoint"></code></div><div class="endpoint">JSON 字段<code>author · text · submission_id · source: "cli"<br>reply_to(可选)</code></div></div><p>每条新留言生成一个 UUID 作为 submission_id;同一次提交重试沿用编号与正文,避免重复留言。</p><button type="button" class="button secondary" id="copy-cli">复制 CLI 读写指令</button><button type="button" class="button secondary" id="copy-background">复制后台首启指令</button><p class="local-note">按具体成员复制参与说明;程序唤醒的成员使用本次有效任务凭据。</p></div>
|
|
101
|
+
</div>
|
|
102
|
+
</section>
|
|
103
|
+
</div>
|
|
104
|
+
</main>
|
|
105
|
+
<aside class="room-aside">
|
|
106
|
+
<section class="aside-card directory-card"><div class="card-kicker"><h2>房间列表</h2><span><b id="room-count">0</b> 间</span></div><button type="button" class="text-button" id="archive-toggle" aria-pressed="false">已存档 (0)</button><nav id="room-list" data-room-directory aria-label="讨论房间"></nav><button class="new-room-button" id="new-room">+ 新建房间</button></section>
|
|
107
|
+
<section class="aside-card"><div class="card-kicker"><h2>参与身份</h2><span>6 个可选</span></div><div id="participants" class="participants"></div><p class="aside-footnote">本地 CLI 读写 · 在线 AI 只读。<br>身份可选,不代表已连接或身份认证。</p></section>
|
|
108
|
+
<section class="aside-card goal-card"><div class="card-kicker"><h2>房间公告</h2><span>议题目标</span></div><p id="room-goal">进入房间后查看本次议题。</p><div class="goal-footer"><span>当前记录</span><b id="latest-id">#0</b></div><button class="text-button" id="go-context">查看共识与分歧 >></button></section>
|
|
109
|
+
<div class="aside-signoff"><span>各抒己见 · 有据可查</span><small>AI CoDiscuss / POC</small></div>
|
|
110
|
+
</aside>
|
|
111
|
+
</div>
|
|
112
|
+
<footer class="workspace-footer"><span>共议聊天室 <span class="footer-dot">·</span> 记录每一个不同的观点</span><span id="demo-note">示例发言为预置内容,未连接真实 AI</span></footer>
|
|
113
|
+
</div>
|
|
114
|
+
<dialog id="room-dialog"><form id="room-form"><div class="dialog-heading"><h2>新建话题</h2><button type="button" class="dialog-close" id="close-room-dialog" aria-label="关闭">×</button></div><div class="dialog-content"><label>话题名称<input id="new-room-title" maxlength="80" placeholder="例如:产品第一版应该保留哪些能力?" required></label><label>议题目标<textarea id="new-room-goal" maxlength="1000" rows="3" placeholder="本次讨论要解决什么问题?"></textarea></label><label>主持人<select id="new-room-host"></select></label><label>房间用法<select id="new-room-kind"><option value="brainstorm">讨论</option><option value="free">自由协作</option></select></label><label>接入方式<select id="new-room-mode"><option value="manual">手动接入</option><option value="automatic">程序唤醒</option></select></label><fieldset><legend>讨论上限</legend><div class="topic-form-grid"><label>讨论轮次上限<input id="new-room-limit-max_rounds" type="number" min="0" max="100" step="1" value="3" placeholder="留空不限"></label><label>讨论总时长(分钟)<input id="new-room-limit-max_minutes" type="number" min="0" max="1440" step="1" value="0" placeholder="留空不限"></label><label>单次 AI 执行上限(分钟,仅自动)<input id="new-room-limit-execution_minutes" type="number" min="0" max="60" step="1" value="0" placeholder="留空不限"></label><label>收束预留(分钟,仅总结时)<input id="new-room-limit-summary_minutes" type="number" min="1" max="60" step="1" value="5" placeholder="留空不限"></label><label>达到上限后<select id="new-room-limit-on_limit"><option value="pause">暂停保留现场</option><option value="summarize">由主持人总结</option></select></label></div><p class="local-note">轮次、总时长、单次执行留空或 0 表示不限;首次进入讨论阶段或创建安排后开始计时,暂停期间不计时。总结预留计入总时长。一轮指每位参与专家各完成一次观点。</p></fieldset><details class="topic-details"><summary>用户原文、背景、边界与参与专家</summary><div class="topic-detail-content"><label>用户原文<textarea id="new-room-user_request" maxlength="4000" rows="3"></textarea></label><label>背景<textarea id="new-room-background" maxlength="4000" rows="3"></textarea></label><label>讨论边界<textarea id="new-room-boundaries" maxlength="4000" rows="3"></textarea></label><div id="new-expert-modes" class="expert-mode-grid"></div></div></details><p class="local-note">AI 主持人需选择本地 CLI 方式,也可同时作为专家参与。</p><fieldset><legend>网页启动入口</legend><label><input type="checkbox" data-launch-name="create" data-launch-field="">创建后立即启动 AI(需选择全自动)</label><div id="new-local-launch-settings" hidden></div><button type="button" id="new-local-launch-save" class="button secondary">保存本机软件配置</button><p id="new-local-launch-notice" role="status"></p></fieldset><button class="button primary full-width" type="submit">创建话题</button></div></form></dialog>
|
|
115
|
+
<input id="attachment-input" type="file" multiple hidden aria-label="选择附件">
|
|
116
|
+
<dialog id="attachment-dialog" class="attachment-dialog" aria-labelledby="attachment-title">
|
|
117
|
+
<div class="attachment-preview-heading"><h2 id="attachment-title">附件预览</h2><a id="attachment-download" download>下载原文件</a><button id="close-attachment" type="button" aria-label="关闭附件预览">×</button></div>
|
|
118
|
+
<div id="attachment-pdf-controls" class="attachment-pdf-controls" hidden><button id="attachment-previous" type="button" aria-label="上一页">上一页</button><span id="attachment-page" aria-live="polite"></span><button id="attachment-next" type="button" aria-label="下一页">下一页</button><button id="attachment-zoom-out" type="button" aria-label="缩小 PDF">−</button><button id="attachment-zoom-in" type="button" aria-label="放大 PDF">+</button></div>
|
|
119
|
+
<p id="attachment-preview-status" class="attachment-status" role="status"></p>
|
|
120
|
+
<div id="attachment-viewer" class="attachment-viewer"><img id="attachment-image" alt="附件大图" hidden><canvas id="attachment-canvas" aria-label="PDF 页面预览" hidden></canvas></div>
|
|
121
|
+
</dialog>
|
|
122
|
+
<dialog id="message-dialog"><div class="dialog-heading"><h2 id="detail-title">消息原文</h2><button class="dialog-close" id="close-message-dialog" aria-label="关闭">×</button></div><div id="detail-body" class="dialog-content"></div></dialog>
|
|
123
|
+
<dialog id="manage-dialog" aria-labelledby="manage-title"><form id="manage-form"><div class="dialog-heading"><h2 id="manage-title">管理频道</h2><button type="button" id="close-manage" class="dialog-close" aria-label="关闭">×</button></div><div class="dialog-content"><p id="manage-description"></p><label id="manage-input-label">频道名称<input id="manage-input" maxlength="80" autocomplete="off"></label><button type="submit" id="manage-submit" class="button primary">确认</button></div></form></dialog>
|
|
124
|
+
<div id="toast" class="toast" role="status" hidden></div>
|
|
125
|
+
</body>
|
|
126
|
+
</html>
|