@musnows/scriverse 0.9.9 → 1.0.0

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.
@@ -9,7 +9,7 @@
9
9
  <script src="/theme-init.js?v=20260827-reader-prefetch-v1"></script>
10
10
  <link rel="icon" href="/icon.svg?v=20260712" type="image/svg+xml">
11
11
  <link rel="manifest" href="/site.webmanifest">
12
- <link rel="stylesheet" href="/styles.css?v=20260816-task-scope-volume-collapse-v2&feature=ai-tool-call-copy-feedback-v2&feature=ai-send-control-v3&feature=character-gender-v1&feature=character-filter-state-v1&feature=relationship-canvas-scale-v1&feature=relationship-table-scroll-v1&feature=galaxy-compact-controls-v2&feature=galaxy-motion-mode-v2&feature=chapter-search-replace-v3&feature=task-auto-run-ring-center-v3&feature=character-relationship-delete-v1&feature=ai-assistant-workspace-v2&feature=mobile-module-tab-position-v1&feature=volume-detail-icon-v1&feature=editor-actions-flow-v1&feature=reader-controls-subpanel-v1&feature=reader-focus-ring-v1&feature=ai-message-actions-v1&feature=assistant-responsive-navigation-v2&feature=ai-composer-square-controls-v2&feature=annotation-line-counts-v1&feature=chapter-comment-filters-v1&feature=line-number-gutter-fill-v1&feature=ai-relationship-roleplay-v1&feature=ai-model-picker-v1&feature=markdown-word-count-five-digit-v2&feature=ai-stream-character-count-stable-v1&feature=ai-stream-character-count-five-digit-v1&feature=annotation-marker-offset-v1&feature=mobile-ai-entry-hidden-v1&feature=phone-client-entry-v1&feature=ai-stream-idle-timeout-v1&feature=ai-user-message-width-v2&feature=ai-chat-image-attachments-v9&feature=ai-message-image-preview-v1&feature=ai-thinking-scroll-v2&feature=toast-click-dismiss-v3&feature=character-avatar-v6&feature=admin-ai-conversations-v1&feature=ai-usage-pricing-v1&feature=ai-usage-pricing-badge-v2&feature=ai-token-quota-positive-v5&feature=ai-token-usage-details-v1&feature=ai-token-usage-details-centered-v1&feature=ai-stream-connection-seconds-v1&feature=ai-token-usage-estimated-price-v1&feature=record-favorites-v1&feature=entity-detail-favorites-v1&feature=entity-pin-v1&feature=character-persona-summary-v1&feature=ai-roleplay-scene-turn-v1&feature=admin-account-identity-v2&feature=task-detail-failure-orange-v1&feature=character-card-header-alignment-v6&feature=character-card-title-fit-v2&feature=book-import-progress-v1&feature=editor-toolbar-compact-v2&feature=reader-first-frame-v1&feature=auth-compact-v2&feature=editor-preview-toggle-v2&feature=setting-title-chrome-v2&feature=entity-pin-icon-center-v1&feature=chapter-center-bottom-space-v1&feature=work-editor-preferences-v1&feature=work-editor-preference-checkbox-v1&feature=ai-roleplay-memory-v2&feature=ai-roleplay-memory-v3&feature=ai-roleplay-memory-v5&feature=character-editor-header-actions-v1&feature=roleplay-memory-header-actions-v1&feature=roleplay-memory-header-toolbar-v1&feature=roleplay-memory-action-icons-v1&feature=roleplay-memory-action-colors-v1&feature=roleplay-memory-pin-border-v1&feature=ai-write-tools-v2&feature=ai-write-card-actions-compact-v1&feature=ai-write-plan-actions-footer-v1&feature=ai-question-actions-footer-v1&feature=ai-question-selection-highlight-v1&feature=ai-question-submit-guidance-v1&feature=ai-question-answer-limit-v1&feature=semantic-search-v6&feature=chapter-title-renumber-v1&feature=ai-writing-skills-v1&feature=remote-mcp-v1&feature=character-alias-chips-v2&feature=character-title-input-v1&feature=character-detail-value-wrap-v2&feature=ai-settings-textarea-font-v1&feature=ai-usage-stat-display-v1&feature=ai-usage-year-v1&feature=ai-skill-slash-menu-v1">
12
+ <link rel="stylesheet" href="/styles.css?v=20260816-task-scope-volume-collapse-v2&feature=ai-tool-call-copy-feedback-v2&feature=ai-send-control-v3&feature=character-gender-v1&feature=character-filter-state-v1&feature=relationship-canvas-scale-v1&feature=relationship-table-scroll-v1&feature=galaxy-compact-controls-v2&feature=galaxy-motion-mode-v2&feature=chapter-search-replace-v3&feature=task-auto-run-ring-center-v3&feature=character-relationship-delete-v1&feature=ai-assistant-workspace-v2&feature=mobile-module-tab-position-v1&feature=volume-detail-icon-v1&feature=editor-actions-flow-v1&feature=reader-controls-subpanel-v1&feature=reader-focus-ring-v1&feature=ai-message-actions-v1&feature=assistant-responsive-navigation-v2&feature=ai-composer-square-controls-v2&feature=annotation-line-counts-v1&feature=chapter-comment-filters-v1&feature=line-number-gutter-fill-v1&feature=ai-relationship-roleplay-v1&feature=ai-model-picker-v1&feature=markdown-word-count-five-digit-v2&feature=ai-stream-character-count-stable-v1&feature=ai-stream-character-count-five-digit-v1&feature=annotation-marker-offset-v1&feature=mobile-ai-entry-hidden-v1&feature=phone-client-entry-v1&feature=ai-stream-idle-timeout-v1&feature=ai-user-message-width-v2&feature=ai-chat-image-attachments-v9&feature=ai-message-image-preview-v1&feature=ai-thinking-scroll-v2&feature=toast-click-dismiss-v3&feature=character-avatar-v6&feature=admin-ai-conversations-v1&feature=ai-usage-pricing-v1&feature=ai-usage-pricing-badge-v2&feature=ai-token-quota-positive-v5&feature=ai-token-usage-details-v1&feature=ai-token-usage-details-centered-v1&feature=ai-stream-connection-seconds-v1&feature=ai-token-usage-estimated-price-v1&feature=record-favorites-v1&feature=entity-detail-favorites-v1&feature=entity-pin-v1&feature=character-persona-summary-v1&feature=ai-roleplay-scene-turn-v1&feature=admin-account-identity-v2&feature=task-detail-failure-orange-v1&feature=character-card-header-alignment-v6&feature=character-card-title-fit-v2&feature=book-import-progress-v1&feature=editor-toolbar-compact-v2&feature=reader-first-frame-v1&feature=auth-compact-v2&feature=editor-preview-toggle-v2&feature=setting-title-chrome-v2&feature=entity-pin-icon-center-v1&feature=chapter-center-bottom-space-v1&feature=work-editor-preferences-v1&feature=work-editor-preference-checkbox-v1&feature=ai-roleplay-memory-v2&feature=ai-roleplay-memory-v3&feature=ai-roleplay-memory-v5&feature=character-editor-header-actions-v1&feature=roleplay-memory-header-actions-v1&feature=roleplay-memory-header-toolbar-v1&feature=roleplay-memory-action-icons-v1&feature=roleplay-memory-action-colors-v1&feature=roleplay-memory-pin-border-v1&feature=ai-write-tools-v2&feature=ai-write-card-actions-compact-v1&feature=ai-write-plan-actions-footer-v1&feature=ai-question-actions-footer-v1&feature=ai-question-selection-highlight-v1&feature=ai-question-submit-guidance-v1&feature=ai-question-answer-limit-v1&feature=ai-question-batch-v1&feature=semantic-search-v6&feature=chapter-title-renumber-v1&feature=ai-writing-skills-v1&feature=remote-mcp-v1&feature=character-alias-chips-v2&feature=character-title-input-v1&feature=character-detail-value-wrap-v2&feature=ai-settings-textarea-font-v1&feature=ai-usage-stat-display-v1&feature=ai-usage-year-v1&feature=ai-skill-slash-menu-v1&feature=ai-message-citation-popover-v1&feature=line-citation-menu-separator-v1&feature=global-im-v103&feature=im-sidebar-compact-v1&feature=im-narration-contrast-v1&feature=im-member-add-plus-v2&feature=im-button-hierarchy-v1&feature=im-icon-button-size-v1&feature=compact-sidebar-directory-v4">
13
13
  </head>
14
14
  <body class="auth-pending">
15
15
  <section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
@@ -92,6 +92,10 @@
92
92
  <svg class="topbar-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7.5h16M4 12h16M4 16.5h10"/><circle cx="18" cy="16.5" r="2.5"/></svg>
93
93
  <span id="background-task-count" class="background-task-count hidden" aria-hidden="true">0</span>
94
94
  </button>
95
+ <button id="im-open-button" class="topbar-icon-button im-open-button" type="button" aria-label="打开 IM" title="IM" aria-controls="im-view">
96
+ <svg class="topbar-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16v11H9l-5 4Z"/><path d="M8 9h8M8 12h5"/></svg>
97
+ <span id="im-unread-count" class="background-task-count im-unread-count hidden" aria-hidden="true">0</span>
98
+ </button>
95
99
  <button id="top-search-button" class="topbar-icon-button" type="button" aria-label="全文检索" title="全文检索(Command/Ctrl+F)" disabled>
96
100
  <svg class="topbar-icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6.5"/><path d="m16.2 16.2 4.3 4.3"/></svg>
97
101
  </button>
@@ -142,9 +146,9 @@
142
146
  <button class="module-nav-secondary hidden" type="button" data-work-settings><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.09a2 2 0 0 1 1 1.74v.5a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.09a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2Z"/><circle cx="12" cy="12" r="3"/></svg>作品设置</button>
143
147
  </nav>
144
148
  <div class="panel-heading">
145
- <span>作品目录</span>
149
+ <span class="panel-heading-label"><span class="panel-heading-label-full">作品目录</span><span class="panel-heading-label-compact">目录</span></span>
146
150
  <div class="panel-heading-actions">
147
- <span id="chapter-count">0 章</span>
151
+ <span id="chapter-count"><span class="chapter-count-number">0</span><span class="chapter-count-unit"> 章</span></span>
148
152
  <button id="chapter-batch-button" class="chapter-batch-button" type="button" aria-label="批量管理章节" title="批量管理章节"><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="m3.5 6 1.5 1.5L7.5 5"/><path d="M10 6h10"/><path d="m3.5 12 1.5 1.5 2.5-2.5"/><path d="M10 12h10"/><path d="m3.5 18 1.5 1.5 2.5-2.5"/><path d="M10 18h10"/></svg></button>
149
153
  <button id="new-volume-button" class="add-button" type="button" aria-label="新建分卷" title="新建分卷">+</button>
150
154
  </div>
@@ -169,6 +173,28 @@
169
173
  </footer>
170
174
  </section>
171
175
 
176
+ <section id="im-view" class="im-view hidden" aria-label="IM 工作区">
177
+ <aside class="im-conversations" aria-label="IM 会话列表">
178
+ <div class="im-create-actions">
179
+ <p>单选角色创建单聊,多选角色创建群聊</p>
180
+ <div class="im-create-action-buttons"><button id="im-new-conversation" class="primary-button" type="button" aria-label="新建会话" title="新建会话"><span class="im-new-conversation-full">新建会话</span><span class="im-new-conversation-compact" aria-hidden="true">+</span></button><button id="im-settings-button" class="im-icon-button im-settings-icon-button" type="button" aria-label="IM 设置" title="IM 设置"><svg class="settings-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.09a2 2 0 0 1 1 1.74v.5a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.09a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2Z"/><circle cx="12" cy="12" r="3"/></svg></button></div>
181
+ </div>
182
+ <div id="im-conversation-list" class="im-conversation-list" aria-live="polite"></div>
183
+ <div id="im-conversations-resize" class="im-conversations-resize-handle" role="separator" aria-label="调整 IM 会话列表宽度" aria-orientation="vertical" aria-valuemin="72" aria-valuemax="420" aria-valuenow="300" tabindex="0"></div>
184
+ </aside>
185
+ <section class="im-chat" aria-labelledby="im-chat-title">
186
+ <header class="im-chat-header"><button id="im-mobile-back" class="im-mobile-back im-button im-button-secondary" type="button" aria-label="返回会话列表">‹</button><div><h2 id="im-chat-title">选择会话</h2><p id="im-chat-subtitle">角色单聊或混合群聊</p></div><div><button id="im-announcement-button" class="im-icon-button im-chat-header-icon-button im-button-announcement hidden" type="button" aria-label="发布公告" title="发布公告" aria-haspopup="dialog" aria-controls="im-announcement-dialog"><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="3.5" y="5" width="17" height="14" rx="2"></rect><path d="M8 3v2M16 3v2M7 9h10M7 13h7"></path></svg></button><button id="im-stop" class="im-button im-button-secondary hidden" type="button">停止 AI</button><button id="im-retry" class="im-button im-button-positive hidden" type="button">重试 AI</button><button id="im-details-toggle" class="im-icon-button im-chat-header-icon-button" type="button" aria-label="成员与设置" title="成员与设置" aria-controls="im-details" aria-expanded="false" disabled><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75"></path></svg></button></div></header>
187
+ <div id="im-message-feed" class="im-message-feed" aria-live="polite"><p class="im-feed-empty">选择会话后开始交流。</p></div>
188
+ <footer class="im-composer-shell">
189
+ <div id="im-composer-resize" class="im-composer-resize-handle" role="separator" aria-label="调整消息编辑区域高度" aria-orientation="horizontal" aria-valuemin="64" aria-valuemax="420" aria-valuenow="68" tabindex="0"></div>
190
+ <div id="im-mention-menu" class="im-mention-menu hidden" role="listbox" aria-label="提及群成员"></div>
191
+ <div id="im-composer" class="im-composer" contenteditable="false" role="textbox" aria-label="IM 消息" aria-multiline="true" aria-autocomplete="list" aria-controls="im-mention-menu" aria-expanded="false" aria-disabled="true" data-placeholder="输入消息;使用 @ 提及角色或人类,Enter 发送,Shift+Enter 换行"></div>
192
+ <button id="im-send" class="im-send-button" type="button" aria-label="发送消息" title="发送消息" disabled><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M21 3 9.5 14.5M21 3l-7 18-4.5-6.5L3 10l18-7Z"></path></svg></button>
193
+ </footer>
194
+ </section>
195
+ <aside id="im-details" class="im-details" aria-label="IM 会话详情"><div id="im-details-resize" class="im-details-resize-handle" role="separator" aria-label="调整 IM 会话详情宽度" aria-orientation="vertical" aria-valuemin="240" aria-valuemax="520" aria-valuenow="320" tabindex="0"></div><header><h2>成员与设置</h2><button id="im-details-close" class="im-icon-button" type="button" aria-label="隐藏成员与设置">×</button></header><div id="im-details-content"></div></aside>
196
+ </section>
197
+
172
198
  <section id="platform-ai-view" class="shelf-view hidden" aria-labelledby="platform-ai-title">
173
199
  <div class="shelf-header">
174
200
  <div><span class="eyebrow">平台资源</span><h1 id="platform-ai-title">AI 管理</h1><p>供应商、模型与全局系统提示词对所有作品生效;每本书可在“AI 设置”中追加自己的系统提示词。</p></div>
@@ -355,6 +381,13 @@
355
381
  </div>
356
382
  </div>
357
383
  </div>
384
+ <section id="ai-citation-popover" class="ai-citation-popover hidden" role="dialog" aria-hidden="true" aria-labelledby="ai-citation-popover-title" aria-describedby="ai-citation-popover-description ai-citation-popover-quote">
385
+ <header class="ai-citation-popover-header">
386
+ <div><strong id="ai-citation-popover-title">正文引用</strong><small id="ai-citation-popover-description"></small></div>
387
+ <button id="ai-citation-popover-close" class="ai-citation-popover-close" type="button" aria-label="关闭正文引用">×</button>
388
+ </header>
389
+ <blockquote id="ai-citation-popover-quote" class="ai-citation-popover-quote" tabindex="0"></blockquote>
390
+ </section>
358
391
  <div class="prompt-box">
359
392
  <section id="ai-semantic-search-panel" class="ai-semantic-search-panel hidden" aria-labelledby="ai-semantic-search-title">
360
393
  <header><div><strong id="ai-semantic-search-title">主动语义检索</strong><small>只在点击检索后调用 embedding;结果默认仅查看。</small></div><button id="ai-semantic-search-close" type="button" aria-label="关闭主动语义检索">×</button></header>
@@ -495,6 +528,7 @@
495
528
  <div id="line-citation-menu" class="line-citation-menu hidden" role="menu" aria-label="正文行操作">
496
529
  <strong id="line-citation-label">已选择正文</strong>
497
530
  <button id="add-line-citation" type="button" role="menuitem">添加到创作助手引用</button>
531
+ <div id="line-citation-annotation-separator" class="line-citation-menu-separator hidden" role="separator" aria-orientation="horizontal"></div>
498
532
  <button id="add-line-annotation" type="button" role="menuitem">添加评论</button>
499
533
  <button id="add-line-todo" type="button" role="menuitem">添加待办</button>
500
534
  </div>
@@ -1220,6 +1254,10 @@
1220
1254
  </nav>
1221
1255
  </div>
1222
1256
  <div id="ai-history-action-menu" class="ai-history-action-menu hidden" role="menu" aria-label="对话操作">
1257
+ <button type="button" role="menuitem" data-ai-history-action="rename">
1258
+ <span>重命名对话</span>
1259
+ <small>修改当前对话的显示名称</small>
1260
+ </button>
1223
1261
  <button type="button" role="menuitem" data-ai-history-action="favorite">
1224
1262
  <span>收藏对话</span>
1225
1263
  <small>收藏后不会被清理</small>
@@ -1259,7 +1297,12 @@
1259
1297
  <button id="ai-question-close" class="dialog-close" aria-label="关闭提问" type="button">×</button>
1260
1298
  </div>
1261
1299
  <div class="ai-question-body">
1262
- <p id="ai-question-text" class="ai-question-text"></p>
1300
+ <nav id="ai-question-navigation" class="ai-question-navigation hidden" aria-label="问题切换">
1301
+ <button id="ai-question-previous" class="ghost-button" type="button" aria-label="上一题">上一题</button>
1302
+ <output id="ai-question-progress" aria-live="polite">问题 1 / 1</output>
1303
+ <button id="ai-question-next" class="ghost-button" type="button" aria-label="下一题">下一题</button>
1304
+ </nav>
1305
+ <p id="ai-question-text" class="ai-question-text" tabindex="-1"></p>
1263
1306
  <form id="ai-question-form">
1264
1307
  <div id="ai-question-options" class="ai-question-options" role="radiogroup" aria-label="预设选项"></div>
1265
1308
  <label class="ai-question-custom-field"><span class="field-label ai-question-custom-heading"><span>自定义回答 / 补充信息</span><output id="ai-question-answer-count" for="ai-question-custom-answer" aria-live="polite">已填写 0 / 3000</output></span><input id="ai-question-custom-answer" type="text" maxlength="3000" aria-describedby="ai-question-answer-count" placeholder="可补充所选方案;未选预设时作为自定义回答" autocomplete="off"></label>
@@ -1321,7 +1364,67 @@
1321
1364
  </section>
1322
1365
  </dialog>
1323
1366
 
1367
+ <dialog id="im-settings-dialog" class="dialog im-settings-dialog" aria-labelledby="im-settings-title">
1368
+ <div class="dialog-header"><div><span class="eyebrow">个人 IM</span><h2 id="im-settings-title">身份与模型</h2></div><button class="dialog-close" type="button" data-im-dialog-close aria-label="关闭 IM 设置">×</button></div>
1369
+ <form id="im-settings-form" class="account-settings-form">
1370
+ <p class="im-privacy-note">身份卡只直接注入群内 AI,不展示给其他人类;AI 回复仍可能自然提及这些内容,请勿填写秘密。</p>
1371
+ <label>AI 对你的称呼<input id="im-setting-name" name="preferredName" maxlength="80"></label>
1372
+ <label>代词 / 性别<input id="im-setting-pronouns" name="pronouns" maxlength="80"></label>
1373
+ <label>身份简介<textarea id="im-setting-identity" name="identitySummary" maxlength="2000" rows="4"></textarea></label>
1374
+ <label>补充说明<textarea id="im-setting-notes" name="additionalNotes" maxlength="4000" rows="5"></textarea></label>
1375
+ <label>主模型<select id="im-setting-primary" name="primaryModelId"></select></label>
1376
+ <label>Fallback 模型<select id="im-setting-fallback" name="fallbackModelId"></select></label>
1377
+ <p id="im-setting-model-note" class="im-setting-model-note" role="status">可先单独保存身份;主模型和 fallback 都配置后,AI 角色才能生成回答。</p>
1378
+ <label>每个模型最大失败次数<input id="im-setting-retries" name="retryCount" type="number" min="1" max="20" value="3" required><small>数字 3 表示主模型最多请求 3 次;全部失败后 fallback 再最多请求 3 次。</small></label>
1379
+ <div class="card-actions"><button class="ghost-button" type="button" data-im-dialog-close>取消</button><button class="primary-button" type="submit">保存 IM 设置</button></div>
1380
+ </form>
1381
+ </dialog>
1382
+
1383
+ <dialog id="im-group-dialog" class="dialog wide-dialog im-group-dialog" aria-labelledby="im-group-title">
1384
+ <div class="dialog-header"><div><span class="eyebrow">角色会话</span><h2 id="im-group-title">新建 IM 会话</h2></div><button class="dialog-close" type="button" data-im-dialog-close aria-label="关闭新建会话">×</button></div>
1385
+ <form id="im-group-form" class="im-group-form">
1386
+ <p id="im-create-guidance" class="im-create-guidance">请先选择一本书,再选择要开始会话的角色。</p>
1387
+ <div class="im-create-role-toolbar">
1388
+ <label>选择书籍<select id="im-create-work" required><option value="">请选择书籍</option></select></label>
1389
+ <label>搜索角色<input id="im-create-search" type="search" maxlength="100" placeholder="输入角色名字" disabled></label>
1390
+ </div>
1391
+ <fieldset><legend>选择角色(1 个为单聊,2–10 个为群聊)</legend><div id="im-group-character-options" class="im-option-grid im-character-option-grid"><p class="im-empty">选择书籍后显示角色。</p></div></fieldset>
1392
+ <div id="im-create-selected" class="im-create-selected hidden" aria-live="polite"></div>
1393
+ <section id="im-create-group-settings" class="im-create-group-settings hidden">
1394
+ <label>群名称<input id="im-create-group-title" name="title" maxlength="80" disabled></label>
1395
+ <div class="im-group-settings-row"><label>回复模式<select name="replyMode" disabled><option value="mention">Mention 模式</option><option value="proactive">主动交流</option></select></label><label>主动阈值<input name="responseThreshold" type="number" min="0" max="100" value="60" disabled></label><label>AI 消息上限<input name="maxAiMessages" type="number" min="1" max="100" value="20" disabled></label></div>
1396
+ </section>
1397
+ <fieldset id="im-create-human-section" class="hidden"><legend>人类成员(群聊可选,最多 49 人)</legend><label>搜索用户<input id="im-create-human-search" type="search" maxlength="100" placeholder="输入用户名或显示名称"></label><div id="im-create-selected-humans" class="im-create-selected hidden" aria-live="polite"></div><div id="im-group-human-options" class="im-option-grid"><p class="im-empty">输入关键词搜索用户。</p></div></fieldset>
1398
+ <div class="card-actions"><button class="ghost-button" type="button" data-im-dialog-close>取消</button><button id="im-create-submit" class="primary-button" type="submit" disabled>请先选择书籍</button></div>
1399
+ </form>
1400
+ </dialog>
1401
+
1402
+ <dialog id="im-announcement-dialog" class="dialog im-announcement-dialog" aria-labelledby="im-announcement-title">
1403
+ <div class="dialog-header"><div><span class="eyebrow">群聊旁白</span><h2 id="im-announcement-title">发布公告</h2></div><button class="dialog-close" type="button" data-im-dialog-close aria-label="关闭发布公告">×</button></div>
1404
+ <form id="im-announcement-form" class="im-announcement-form">
1405
+ <p class="im-announcement-note">公告将作为一次性旁白进入所有当前 AI 角色的后续上下文,不会触发 AI 回复。发布后不可编辑或删除。</p>
1406
+ <label>旁白内容<textarea id="im-announcement-content" name="content" maxlength="20000" rows="7" placeholder="描述场景变化、共同事件或所有角色都应知道的信息" required></textarea></label>
1407
+ <div class="card-actions"><button class="ghost-button" type="button" data-im-dialog-close>取消</button><button class="primary-button" type="submit">发布旁白公告</button></div>
1408
+ </form>
1409
+ </dialog>
1410
+
1411
+ <dialog id="im-member-add-dialog" class="dialog im-member-add-dialog" aria-labelledby="im-member-add-title">
1412
+ <div class="dialog-header"><div><span id="im-member-add-eyebrow" class="eyebrow">群聊成员</span><h2 id="im-member-add-title">添加成员</h2></div><button class="dialog-close" type="button" data-im-dialog-close aria-label="关闭添加成员">×</button></div>
1413
+ <form id="im-member-add-form" class="im-member-add-form">
1414
+ <p id="im-member-add-guidance" class="im-member-add-guidance"></p>
1415
+ <div id="im-member-add-character-fields" class="im-member-picker-toolbar hidden">
1416
+ <label>选择书籍<select id="im-member-add-work"><option value="">请选择书籍</option></select></label>
1417
+ <label>搜索角色<input id="im-member-add-character-search" type="search" maxlength="100" placeholder="输入角色名字" disabled></label>
1418
+ </div>
1419
+ <div id="im-member-add-human-fields" class="im-member-picker-toolbar hidden">
1420
+ <label>搜索用户<input id="im-member-add-human-search" type="search" maxlength="100" placeholder="输入用户名或显示名称"></label>
1421
+ </div>
1422
+ <div id="im-member-add-options" class="im-member-picker-options" role="group" aria-label="可添加成员"></div>
1423
+ <div class="card-actions"><button class="ghost-button" type="button" data-im-dialog-close>取消</button><button id="im-member-add-submit" class="primary-button im-button" type="submit" disabled>请选择成员</button></div>
1424
+ </form>
1425
+ </dialog>
1426
+
1324
1427
  <div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
1325
- <script type="module" src="/app.js?v=20260816-extended-thinking-effort-v1&feature=ai-tool-call-copy-feedback-v2&feature=ai-send-control-v2&feature=analysis-task-queue-refresh-v1&feature=character-gender-v1&feature=character-filter-state-v1&feature=relationship-canvas-scale-v1&feature=relationship-table-scroll-v1&feature=ai-session-id-copy-v2&feature=galaxy-motion-mode-v3&feature=galaxy-edge-label-threshold-v1&feature=calculate-time-tool-v2&feature=analysis-task-expired-toast-v1&feature=global-replace-volume-v1&feature=chapter-search-replace-v1&feature=chapter-save-toast-v1&feature=character-relationship-delete-v1&feature=character-relationship-group-v1&feature=analysis-task-stability-delay-v1&feature=ai-assistant-workspace-v2&feature=volume-detail-icon-v1&feature=volume-story-order-v1&feature=reader-manual-chapter-navigation-v1&feature=ai-message-reference-badges-v1&feature=ai-roleplay-message-reference-v1&feature=ai-message-actions-v1&feature=assistant-responsive-navigation-v3&feature=annotation-permissions-v1&feature=annotation-line-counts-v1&feature=ai-relationship-roleplay-v1&feature=ai-roleplay-user-character-visibility-v1&feature=ai-roleplay-story-recall-v1&feature=ai-model-picker-v1&feature=ai-fork-model-unlock-v1&feature=context-percent-format-v1&feature=annotation-precise-locate-v1&feature=markdown-word-count-stable-v1&feature=ai-stream-character-count-stable-v2&feature=ai-process-empty-intermediate-v1&feature=ai-feed-scroll-follow-v2&feature=ai-message-retry-v1&feature=ai-stream-idle-timeout-v2&feature=ai-config-delete-v1&feature=ai-provider-protocol-options-v1&feature=ai-provider-thinking-type-v1&feature=ai-chat-image-attachments-v8&feature=ai-message-image-preview-v1&feature=ai-thinking-scroll-v2&feature=ai-image-conversation-model-lock-v1&feature=toast-click-dismiss-v2&feature=system-restart-dialog-delay-v1&feature=character-avatar-v6&feature=character-death-position-v1&feature=admin-ai-conversations-v1&feature=ai-usage-pricing-v1&feature=ai-usage-pricing-badge-v2&feature=ai-usage-pricing-label-v1&feature=ai-usage-token-breakdown-v1&feature=ai-usage-pricing-cache-v2&feature=ai-usage-pricing-manual-refresh-v1&feature=ai-monthly-token-quota-v1&feature=ai-provider-token-quota-v1&feature=ai-token-quota-positive-v6&feature=ai-model-thinking-label-v1&feature=ai-model-picker-focus-v1&feature=ai-provider-model-import-v1&feature=ai-assistant-brain-icon-v1&feature=ai-token-usage-details-v1&feature=ai-token-usage-details-centered-v1&feature=ai-token-usage-raw-input-v1&feature=ai-stream-connection-seconds-v1&feature=phone-client-entry-v1&feature=ai-usage-pricing-cache-v1&feature=ai-model-thinking-label-v3&feature=ai-roleplay-speaker-label-v1&feature=toast-modal-host-v1&feature=api-key-copy-existing-v1&feature=character-favorite-v1&feature=record-favorites-v1&feature=ai-token-usage-estimated-price-v1&feature=entity-detail-favorites-v1&feature=entity-pin-v1&feature=entity-pin-icon-v1&feature=roleplay-favorite-label-v1&feature=ai-roleplay-knowledge-tools-v1&feature=character-persona-summary-v1&feature=ai-roleplay-scene-turn-v2&feature=admin-account-identity-v2&feature=ai-provider-analysis-timeout-v1&feature=task-detail-failure-orange-v1&feature=book-import-progress-v1&feature=presence-multiple-users-v1&feature=ai-context-input-output-v1&feature=editor-blank-lines-preserved-v1&feature=reader-first-frame-v1&feature=vditor-lazy-load-v1&feature=ui-module-preload-v1&feature=reader-initial-prefetch-v1&feature=editor-preview-toggle-v2&feature=vditor-fullscreen-disabled-v1&feature=chapter-auto-indent-v1&feature=chapter-centered-scroll-v1&feature=work-editor-preferences-v1&feature=ai-context-output-usage-v1&feature=ai-roleplay-memory-v4&feature=ai-roleplay-memory-v5&feature=roleplay-memory-header-actions-v1&feature=roleplay-memory-header-toolbar-v1&feature=roleplay-memory-action-icons-v1&feature=roleplay-memory-action-colors-v1&feature=annotation-line-anchor-v1&feature=stable-line-ids-v1&feature=live-annotation-anchors-v1&feature=chapter-comment-filters-v1&feature=ai-write-tools-v3&feature=ai-question-option-supplement-v1&feature=ai-question-selection-highlight-v1&feature=ai-question-continuation-ui-v1&feature=ai-question-tool-result-v1&feature=ai-question-submit-guidance-v1&feature=ai-question-answer-limit-v1&feature=semantic-search-v6&feature=chapter-title-renumber-v1&feature=ai-writing-skills-v3&feature=ai-cancel-preserve-process-v2&feature=remote-mcp-v1&feature=character-alias-chips-v2&feature=character-title-input-v1&feature=character-detail-value-wrap-v2&feature=chapter-batch-editor-refresh-v1&feature=ai-usage-stat-display-v1&feature=ai-usage-year-v1&feature=semantic-search-rag-label-v1&feature=ai-skill-slash-menu-v1&feature=ai-roleplay-scene-bubble-v1&feature=ai-roleplay-scene-collapse-v1&feature=markdown-adjacent-blockquotes-v1&feature=chapter-save-shortcut-v2"></script>
1428
+ <script type="module" src="/app.js?v=20260816-extended-thinking-effort-v1&feature=ai-history-rename-v1&feature=ai-tool-call-copy-feedback-v2&feature=ai-send-control-v2&feature=analysis-task-queue-refresh-v1&feature=character-gender-v1&feature=character-filter-state-v1&feature=relationship-canvas-scale-v1&feature=relationship-table-scroll-v1&feature=ai-session-id-copy-v2&feature=galaxy-motion-mode-v3&feature=galaxy-edge-label-threshold-v1&feature=calculate-time-tool-v2&feature=analysis-task-expired-toast-v1&feature=global-replace-volume-v1&feature=chapter-search-replace-v1&feature=chapter-save-toast-v1&feature=character-relationship-delete-v1&feature=character-relationship-group-v1&feature=analysis-task-stability-delay-v1&feature=ai-assistant-workspace-v2&feature=volume-detail-icon-v1&feature=volume-story-order-v1&feature=reader-manual-chapter-navigation-v1&feature=ai-message-reference-badges-v1&feature=ai-roleplay-message-reference-v1&feature=ai-message-actions-v1&feature=assistant-responsive-navigation-v3&feature=annotation-permissions-v1&feature=annotation-line-counts-v1&feature=ai-relationship-roleplay-v1&feature=ai-roleplay-user-character-visibility-v1&feature=ai-roleplay-story-recall-v1&feature=ai-model-picker-v1&feature=ai-fork-model-unlock-v1&feature=context-percent-format-v1&feature=annotation-precise-locate-v1&feature=markdown-word-count-stable-v1&feature=ai-stream-character-count-stable-v2&feature=ai-process-empty-intermediate-v1&feature=ai-feed-scroll-follow-v2&feature=ai-message-retry-v1&feature=ai-stream-idle-timeout-v2&feature=ai-config-delete-v1&feature=ai-provider-protocol-options-v1&feature=ai-provider-thinking-type-v1&feature=ai-chat-image-attachments-v8&feature=ai-message-image-preview-v1&feature=ai-thinking-scroll-v2&feature=ai-image-conversation-model-lock-v1&feature=toast-click-dismiss-v2&feature=system-restart-dialog-delay-v1&feature=character-avatar-v6&feature=character-death-position-v1&feature=admin-ai-conversations-v1&feature=ai-usage-pricing-v1&feature=ai-usage-pricing-badge-v2&feature=ai-usage-pricing-label-v1&feature=ai-usage-token-breakdown-v1&feature=ai-usage-pricing-cache-v2&feature=ai-usage-pricing-manual-refresh-v1&feature=ai-monthly-token-quota-v1&feature=ai-provider-token-quota-v1&feature=ai-token-quota-positive-v6&feature=ai-model-thinking-label-v1&feature=ai-model-picker-focus-v1&feature=ai-provider-model-import-v1&feature=ai-assistant-brain-icon-v1&feature=ai-token-usage-details-v1&feature=ai-token-usage-details-centered-v1&feature=ai-token-usage-raw-input-v1&feature=ai-stream-connection-seconds-v1&feature=phone-client-entry-v1&feature=ai-usage-pricing-cache-v1&feature=ai-model-thinking-label-v3&feature=ai-roleplay-speaker-label-v1&feature=toast-modal-host-v1&feature=api-key-copy-existing-v1&feature=character-favorite-v1&feature=record-favorites-v1&feature=ai-token-usage-estimated-price-v1&feature=entity-detail-favorites-v1&feature=entity-pin-v1&feature=entity-pin-icon-v1&feature=roleplay-favorite-label-v1&feature=ai-roleplay-knowledge-tools-v1&feature=character-persona-summary-v1&feature=ai-roleplay-scene-turn-v2&feature=admin-account-identity-v2&feature=ai-provider-analysis-timeout-v1&feature=task-detail-failure-orange-v1&feature=book-import-progress-v1&feature=presence-multiple-users-v1&feature=ai-context-input-output-v1&feature=editor-blank-lines-preserved-v1&feature=reader-first-frame-v1&feature=vditor-lazy-load-v1&feature=ui-module-preload-v1&feature=reader-initial-prefetch-v1&feature=editor-preview-toggle-v2&feature=vditor-fullscreen-disabled-v1&feature=chapter-auto-indent-v1&feature=chapter-centered-scroll-v1&feature=work-editor-preferences-v1&feature=ai-context-output-usage-v1&feature=ai-roleplay-memory-v4&feature=ai-roleplay-memory-v5&feature=roleplay-memory-header-actions-v1&feature=roleplay-memory-header-toolbar-v1&feature=roleplay-memory-action-icons-v1&feature=roleplay-memory-action-colors-v1&feature=annotation-line-anchor-v1&feature=stable-line-ids-v1&feature=live-annotation-anchors-v1&feature=chapter-comment-filters-v1&feature=ai-write-tools-v3&feature=ai-question-option-supplement-v1&feature=ai-question-selection-highlight-v1&feature=ai-question-continuation-ui-v1&feature=ai-question-tool-result-v1&feature=ai-question-tool-summary-v1&feature=ai-question-submit-guidance-v1&feature=ai-question-batch-v1&feature=ai-question-answer-limit-v1&feature=semantic-search-v6&feature=chapter-title-renumber-v1&feature=ai-writing-skills-v3&feature=ai-cancel-preserve-process-v2&feature=remote-mcp-v1&feature=character-alias-chips-v2&feature=character-title-input-v1&feature=character-detail-value-wrap-v2&feature=chapter-batch-editor-refresh-v1&feature=ai-usage-stat-display-v1&feature=ai-usage-year-v1&feature=semantic-search-rag-label-v1&feature=ai-skill-slash-menu-v1&feature=ai-roleplay-scene-bubble-v1&feature=ai-roleplay-scene-collapse-v1&feature=markdown-adjacent-blockquotes-v1&feature=chapter-save-shortcut-v2&feature=ai-message-citation-popover-v1&feature=line-citation-menu-separator-v1&feature=global-im-v103&feature=im-sidebar-compact-v1&feature=im-settings-gear-v1&feature=compact-sidebar-directory-v2"></script>
1326
1429
  </body>
1327
1430
  </html>
@@ -1,11 +1,12 @@
1
1
  export type RestorableModule = "drafts" | "settings" | "characters" | "races" | "organizations" | "timeline" | "outlines" | "relationships" | "reviews" | "tasks" | "ai-settings";
2
2
  export type PageRoute =
3
3
  | { view: "shelf" }
4
+ | { view: "im" }
4
5
  | { view: "editor"; workId: string; chapterId: string | null }
5
6
  | { view: "reader"; workId: string; chapterId: string | null }
6
7
  | { view: "module"; workId: string; module: RestorableModule }
7
8
  | { view: "welcome"; workId: string }
8
- | { view: "settings" | "platform-ai"; workId: string | null; returnView?: "shelf" | "editor" | "module" | "welcome"; returnModule?: RestorableModule; returnChapterId?: string };
9
+ | { view: "settings" | "platform-ai"; workId: string | null; returnView?: "shelf" | "im" | "editor" | "module" | "welcome"; returnModule?: RestorableModule; returnChapterId?: string };
9
10
 
10
11
  export const RESTORABLE_MODULES: readonly RestorableModule[];
11
12
  export function serializePageRoute(route?: Record<string, unknown>): string;
@@ -14,7 +14,7 @@ export const RESTORABLE_MODULES = Object.freeze([
14
14
  ]);
15
15
 
16
16
  const moduleSet = new Set(RESTORABLE_MODULES);
17
- const returnViewSet = new Set(["shelf", "editor", "module", "welcome"]);
17
+ const returnViewSet = new Set(["shelf", "im", "editor", "module", "welcome"]);
18
18
  const entityEditorSet = new Set(["setting", "character", "race", "organization"]);
19
19
 
20
20
  function value(params, key) {
@@ -36,6 +36,8 @@ export function serializePageRoute(route = {}) {
36
36
 
37
37
  if (view === "login") {
38
38
  params.set("view", "login");
39
+ } else if (view === "im") {
40
+ params.set("view", "im");
39
41
  } else if (view === "editor" && workId) {
40
42
  params.set("view", "editor");
41
43
  params.set("work", workId);
@@ -74,6 +76,7 @@ export function parsePageRoute(hash = "") {
74
76
  const workId = value(params, "work");
75
77
 
76
78
  if (view === "login") return { view: "login" };
79
+ if (view === "im") return { view: "im" };
77
80
 
78
81
  if (view === "editor" && workId) {
79
82
  const chapterId = value(params, "chapter");