@musnows/scriverse 0.6.2 → 0.6.4
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/dist/ai-protocol.js +22 -9
- package/dist/ai-protocol.js.map +1 -1
- package/dist/ai-tool-results.js +71 -0
- package/dist/ai-tool-results.js.map +1 -1
- package/dist/ai.js +913 -195
- package/dist/ai.js.map +1 -1
- package/dist/app.js +245 -46
- package/dist/app.js.map +1 -1
- package/dist/cli-core.js +23 -13
- package/dist/cli-core.js.map +1 -1
- package/dist/database.js +251 -2
- package/dist/database.js.map +1 -1
- package/dist/docx-export.js +89 -0
- package/dist/docx-export.js.map +1 -0
- package/dist/google-vertex-auth.js +155 -0
- package/dist/google-vertex-auth.js.map +1 -0
- package/dist/image-captcha.js +8 -5
- package/dist/image-captcha.js.map +1 -1
- package/dist/public/ai-context-meter.js +4 -0
- package/dist/public/ai-mentions.js +10 -0
- package/dist/public/ai-message-time.js +3 -9
- package/dist/public/ai-tool-call.js +4 -0
- package/dist/public/app.js +1004 -131
- package/dist/public/display-labels.js +2 -1
- package/dist/public/index.html +75 -16
- package/dist/public/page-route.js +2 -2
- package/dist/public/styles.css +155 -19
- package/dist/public/system-status.d.ts +12 -0
- package/dist/public/system-status.js +16 -0
- package/dist/public/theme-init.js +2 -2
- package/dist/security.js +101 -9
- package/dist/security.js.map +1 -1
- package/dist/store.js +290 -21
- package/dist/store.js.map +1 -1
- package/dist/user-auth.js +62 -24
- package/dist/user-auth.js.map +1 -1
- package/dist/version.js +1 -1
- package/dist/writing-progress-time.js +23 -0
- package/dist/writing-progress-time.js.map +1 -1
- package/package.json +2 -1
|
@@ -68,7 +68,8 @@ export function providerConnectionLabel(value) {
|
|
|
68
68
|
export function providerProtocolLabel(value) {
|
|
69
69
|
return enumLabel({
|
|
70
70
|
"openai-chat-completions": "OpenAI Chat Completions",
|
|
71
|
-
"anthropic-messages": "Anthropic Messages"
|
|
71
|
+
"anthropic-messages": "Anthropic Messages",
|
|
72
|
+
"google-vertex": "Google Vertex"
|
|
72
73
|
}, value, "未知接口协议");
|
|
73
74
|
}
|
|
74
75
|
|
package/dist/public/index.html
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
<meta name="description" content="面向长篇小说创作的 AI 协作工作台">
|
|
7
7
|
<meta name="theme-color" content="#8b3d2c">
|
|
8
8
|
<title>叙界 · 小说 AI 创作工作台</title>
|
|
9
|
-
<script src="/theme-init.js?v=
|
|
9
|
+
<script src="/theme-init.js?v=20260801-work-audit-page-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
12
|
<link rel="stylesheet" href="/vendor/vditor/dist/index.css?v=3.11.2">
|
|
13
|
-
<link rel="stylesheet" href="/styles.css?v=
|
|
13
|
+
<link rel="stylesheet" href="/styles.css?v=20260801-ai-roleplay-chat-merge-v1">
|
|
14
14
|
</head>
|
|
15
15
|
<body class="auth-pending">
|
|
16
16
|
<section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
<p id="auth-error" class="auth-error" role="alert"></p>
|
|
59
59
|
</div>
|
|
60
60
|
<footer class="product-footer auth-product-footer" data-product-footer aria-label="叙界项目信息">
|
|
61
|
-
<span class="product-footer-meta"><span>© <time data-product-footer-year></time
|
|
61
|
+
<span class="product-footer-meta"><span>© <time data-product-footer-year></time></span><span aria-hidden="true">·</span><span>叙界 <span data-product-footer-version>v—</span></span><span aria-hidden="true">·</span><a href="https://github.com/musnows/Scriverse" target="_blank" rel="noopener noreferrer" aria-label="在 GitHub 查看叙界仓库">GitHub</a></span>
|
|
62
62
|
<span class="product-footer-development hidden" data-product-footer-development>开发模式</span>
|
|
63
63
|
</footer>
|
|
64
64
|
</section>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
<button id="mobile-module-tab" class="mobile-module-tab" type="button" aria-label="打开作品模块" aria-expanded="false">模块</button>
|
|
75
75
|
<div id="work-meta" class="work-meta">尚未选择作品</div>
|
|
76
76
|
<div class="top-actions">
|
|
77
|
-
<span id="save-state" class="save-state"
|
|
77
|
+
<span id="save-state" class="save-state" role="status" aria-live="polite" aria-label="系统状态:检测中">检测中</span>
|
|
78
78
|
<div id="presence-control" class="presence-control hidden">
|
|
79
79
|
<button id="presence-button" class="presence-button" type="button" aria-expanded="false" aria-controls="presence-panel"><span class="presence-status-dot" aria-hidden="true"></span><span id="presence-count">1 人</span></button>
|
|
80
80
|
<section id="presence-panel" class="presence-panel hidden" aria-label="当前作品在线协作者">
|
|
@@ -159,7 +159,7 @@
|
|
|
159
159
|
</div>
|
|
160
160
|
<div id="book-shelf" class="book-shelf" data-testid="book-shelf"></div>
|
|
161
161
|
<footer class="product-footer" data-product-footer aria-label="叙界项目信息">
|
|
162
|
-
<span class="product-footer-meta"><span>© <time data-product-footer-year></time
|
|
162
|
+
<span class="product-footer-meta"><span>© <time data-product-footer-year></time></span><span aria-hidden="true">·</span><span>叙界 <span data-product-footer-version>v—</span></span><span aria-hidden="true">·</span><a href="https://github.com/musnows/Scriverse" target="_blank" rel="noopener noreferrer" aria-label="在 GitHub 查看叙界仓库">GitHub</a></span>
|
|
163
163
|
<span class="product-footer-development hidden" data-product-footer-development>开发模式</span>
|
|
164
164
|
</footer>
|
|
165
165
|
</section>
|
|
@@ -186,6 +186,19 @@
|
|
|
186
186
|
<div id="platform-usage-content" class="module-content usage-page-content"></div>
|
|
187
187
|
</section>
|
|
188
188
|
|
|
189
|
+
<section id="work-audit-view" class="shelf-view work-audit-view hidden" aria-labelledby="work-audit-title">
|
|
190
|
+
<div class="shelf-header work-audit-header">
|
|
191
|
+
<div><span id="work-audit-eyebrow" class="eyebrow">作品安全</span><h1 id="work-audit-title">操作记录</h1><p>按时间倒序查看作品写入与管理操作,以及完整的操作者、对象和变更详情。</p></div>
|
|
192
|
+
<div class="settings-detail-actions">
|
|
193
|
+
<button id="work-audit-return" class="ghost-button settings-parent-button" type="button">返回设置</button>
|
|
194
|
+
<button id="work-audit-refresh" class="ghost-button" type="button">刷新记录</button>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
<div class="work-audit-toolbar" aria-live="polite"><p id="work-audit-summary">正在读取操作记录……</p></div>
|
|
198
|
+
<div id="work-audit-list" class="work-audit-list" aria-live="polite"></div>
|
|
199
|
+
<div class="work-audit-footer"><button id="work-audit-load-more" class="primary-button hidden" type="button">加载更多记录</button></div>
|
|
200
|
+
</section>
|
|
201
|
+
|
|
189
202
|
<section id="settings-hub-view" class="shelf-view hidden" aria-labelledby="settings-hub-title">
|
|
190
203
|
<div class="shelf-header settings-hub-header">
|
|
191
204
|
<div><span class="eyebrow">工作台配置</span><h1 id="settings-hub-title">设置</h1><p>集中管理 AI、显示偏好、内容检索与作品导出。</p></div>
|
|
@@ -200,11 +213,11 @@
|
|
|
200
213
|
<button id="writing-progress-button" class="settings-hub-card" type="button"><span class="settings-card-mark">字</span><strong>写作目标</strong><small>每日目标、总字数目标与近 30 天趋势</small></button>
|
|
201
214
|
<button id="work-audit-button" class="settings-hub-card" type="button"><span class="settings-card-mark">录</span><strong>操作记录</strong><small>查看作品修改、操作者、对象与时间</small></button>
|
|
202
215
|
<button id="appearance-button" class="settings-hub-card" type="button" data-settings-action="appearance"><span class="settings-card-mark">Aa</span><strong>显示设置</strong><small>中文字体、等宽英文字体、字号与行距</small></button>
|
|
203
|
-
<button id="export-button" class="settings-hub-card" type="button" data-settings-action="export"><span class="settings-card-mark"
|
|
216
|
+
<button id="export-button" class="settings-hub-card" type="button" data-settings-action="export" aria-haspopup="menu" aria-controls="manuscript-export-menu" aria-expanded="false"><span class="settings-card-mark">出</span><strong>导出正文</strong><small>选择导出 Markdown ZIP 或 DOCX;不包含角色和设定资料</small></button>
|
|
204
217
|
</div>
|
|
205
218
|
<p id="settings-work-note" class="settings-work-note"></p>
|
|
206
219
|
<footer class="product-footer settings-product-footer" data-product-footer aria-label="叙界项目信息">
|
|
207
|
-
<span class="product-footer-meta"><span>© <time data-product-footer-year></time
|
|
220
|
+
<span class="product-footer-meta"><span>© <time data-product-footer-year></time></span><span aria-hidden="true">·</span><span>叙界 <span data-product-footer-version>v—</span></span><span aria-hidden="true">·</span><a href="https://github.com/musnows/Scriverse" target="_blank" rel="noopener noreferrer" aria-label="在 GitHub 查看叙界仓库">GitHub</a></span>
|
|
208
221
|
<span class="product-footer-development hidden" data-product-footer-development>开发模式</span>
|
|
209
222
|
</footer>
|
|
210
223
|
</section>
|
|
@@ -265,7 +278,7 @@
|
|
|
265
278
|
<div id="ai-panel-resize" class="panel-resize-handle" role="separator" aria-label="调整创作助手宽度" aria-orientation="vertical" tabindex="0"></div>
|
|
266
279
|
<div class="ai-heading">
|
|
267
280
|
<button id="ai-panel-toggle" class="panel-collapse-button" type="button" aria-label="收起创作助手" aria-expanded="true">›</button>
|
|
268
|
-
<div class="ai-heading-title"><span class="status-dot"></span><strong>创作助手</strong></div>
|
|
281
|
+
<div class="ai-heading-title"><span id="ai-status-dot" class="status-dot" role="status" aria-label="创作助手状态:正常" title="创作助手状态:正常"></span><strong>创作助手</strong></div>
|
|
269
282
|
<div class="ai-heading-actions">
|
|
270
283
|
<span id="ai-conversation-title" title="当前对话">新对话</span>
|
|
271
284
|
<button id="ai-history-toggle" type="button" aria-label="历史记录" aria-controls="ai-history-dialog" aria-expanded="false" aria-haspopup="dialog" title="历史记录"><svg class="ai-heading-action-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"></path><path d="M3 3v5h5M12 7v5l3.5 2"></path></svg></button>
|
|
@@ -293,6 +306,7 @@
|
|
|
293
306
|
<div class="prompt-options">
|
|
294
307
|
<select id="ai-task" aria-label="任务类型">
|
|
295
308
|
<option value="chat">问答</option>
|
|
309
|
+
<option value="roleplay">角色扮演</option>
|
|
296
310
|
<option value="continue">续写</option>
|
|
297
311
|
<option value="polish">润色选中文本</option>
|
|
298
312
|
</select>
|
|
@@ -302,7 +316,15 @@
|
|
|
302
316
|
<option value="chapter-summary">当前章节 + 全书概要</option>
|
|
303
317
|
<option value="volume">当前卷</option>
|
|
304
318
|
<option value="book">全书</option>
|
|
319
|
+
<option value="settings-catalog">设定库</option>
|
|
320
|
+
</select>
|
|
321
|
+
<select id="ai-roleplay-character" class="ai-roleplay-character hidden" aria-label="角色扮演角色卡">
|
|
322
|
+
<option value="">选择角色卡</option>
|
|
305
323
|
</select>
|
|
324
|
+
<label class="ai-include-setting-info" for="ai-include-setting-info">
|
|
325
|
+
<input id="ai-include-setting-info" type="checkbox" checked>
|
|
326
|
+
<span>注入设定信息</span>
|
|
327
|
+
</label>
|
|
306
328
|
</div>
|
|
307
329
|
<div class="field-label prompt-model-field">
|
|
308
330
|
<select id="ai-model" aria-label="实际使用模型"></select>
|
|
@@ -346,6 +368,17 @@
|
|
|
346
368
|
<small>关闭时可横向滚动</small>
|
|
347
369
|
</button>
|
|
348
370
|
</div>
|
|
371
|
+
<div id="manuscript-export-menu" class="manuscript-export-menu hidden" role="menu" aria-label="导出正文格式">
|
|
372
|
+
<strong>选择导出格式</strong>
|
|
373
|
+
<button type="button" role="menuitem" data-export-format="markdown">
|
|
374
|
+
<span>导出 Markdown</span>
|
|
375
|
+
<small>打包为 ZIP,内含 Markdown 正文</small>
|
|
376
|
+
</button>
|
|
377
|
+
<button type="button" role="menuitem" data-export-format="docx">
|
|
378
|
+
<span>导出 DOCX</span>
|
|
379
|
+
<small>Word 正文;有封面时嵌入为首页</small>
|
|
380
|
+
</button>
|
|
381
|
+
</div>
|
|
349
382
|
<input id="new-import-file" class="hidden" type="file" accept=".txt,.docx">
|
|
350
383
|
<input id="cover-file" class="hidden" type="file" accept="image/png,image/jpeg,image/webp">
|
|
351
384
|
<input id="avatar-file" class="hidden" type="file" accept="image/png,image/jpeg,image/webp">
|
|
@@ -384,6 +417,18 @@
|
|
|
384
417
|
</section>
|
|
385
418
|
</dialog>
|
|
386
419
|
|
|
420
|
+
<dialog id="system-restart-dialog" class="dialog system-restart-dialog" aria-labelledby="system-restart-dialog-title" aria-describedby="system-restart-dialog-description">
|
|
421
|
+
<div class="dialog-header">
|
|
422
|
+
<div><span class="eyebrow">系统状态</span><h2 id="system-restart-dialog-title" tabindex="-1">系统已重启或升级</h2></div>
|
|
423
|
+
</div>
|
|
424
|
+
<div class="dialog-fields">
|
|
425
|
+
<p id="system-restart-dialog-description" class="system-restart-message">本次登录已经失效,请重新登录。</p>
|
|
426
|
+
</div>
|
|
427
|
+
<div class="dialog-actions">
|
|
428
|
+
<button id="system-restart-confirm" class="primary-button" type="button">我知道了</button>
|
|
429
|
+
</div>
|
|
430
|
+
</dialog>
|
|
431
|
+
|
|
387
432
|
<dialog id="form-dialog" class="dialog">
|
|
388
433
|
<form id="dynamic-form" method="dialog">
|
|
389
434
|
<div class="dialog-header">
|
|
@@ -621,6 +666,24 @@
|
|
|
621
666
|
<option value="consolas">Consolas</option>
|
|
622
667
|
</select>
|
|
623
668
|
</label>
|
|
669
|
+
<label>界面字号
|
|
670
|
+
<select id="appearance-ui-font-size" name="uiFontSize">
|
|
671
|
+
<option value="14">14 px(小)</option>
|
|
672
|
+
<option value="15">15 px</option>
|
|
673
|
+
<option value="16">16 px(标准)</option>
|
|
674
|
+
<option value="17">17 px</option>
|
|
675
|
+
<option value="18">18 px(大)</option>
|
|
676
|
+
</select>
|
|
677
|
+
</label>
|
|
678
|
+
<label>Agent 对话字号
|
|
679
|
+
<select id="appearance-ai-font-size" name="aiFontSize">
|
|
680
|
+
<option value="12">12 px(小)</option>
|
|
681
|
+
<option value="13">13 px</option>
|
|
682
|
+
<option value="14">14 px(标准)</option>
|
|
683
|
+
<option value="15">15 px</option>
|
|
684
|
+
<option value="16">16 px(大)</option>
|
|
685
|
+
</select>
|
|
686
|
+
</label>
|
|
624
687
|
<label>正文字号
|
|
625
688
|
<select id="appearance-font-size" name="fontSize">
|
|
626
689
|
<option value="15">15 px</option>
|
|
@@ -645,6 +708,7 @@
|
|
|
645
708
|
<strong>字体预览 Typography 0123</strong>
|
|
646
709
|
<span>中文默认使用黑体,English letters always use monospace.</span>
|
|
647
710
|
<span>第二段用于预览正文的行距与段落密度。</span>
|
|
711
|
+
<span id="font-size-preview">界面 16 px · Agent 对话 14 px</span>
|
|
648
712
|
</div>
|
|
649
713
|
</div>
|
|
650
714
|
<div class="dialog-actions">
|
|
@@ -710,12 +774,6 @@
|
|
|
710
774
|
</form>
|
|
711
775
|
</dialog>
|
|
712
776
|
|
|
713
|
-
<dialog id="work-audit-dialog" class="dialog wide-dialog work-audit-dialog" aria-labelledby="work-audit-title">
|
|
714
|
-
<div class="dialog-header"><div><span class="eyebrow">作品安全</span><h2 id="work-audit-title">操作记录</h2><p class="dialog-header-meta">按时间倒序展示当前作品的写入与管理操作。</p></div><div class="settings-dialog-header-actions"><button id="work-audit-settings-return" class="ghost-button settings-parent-button" type="button">返回设置</button><button id="work-audit-close" class="dialog-close" aria-label="关闭操作记录" type="button">×</button></div></div>
|
|
715
|
-
<div id="work-audit-list" class="work-audit-list"></div>
|
|
716
|
-
<div class="dialog-actions"><button id="work-audit-refresh" class="ghost-button" type="button">刷新</button><button id="work-audit-load-more" class="primary-button hidden" type="button">加载更多</button></div>
|
|
717
|
-
</dialog>
|
|
718
|
-
|
|
719
777
|
<dialog id="platform-ui-settings-dialog" class="dialog" aria-labelledby="platform-ui-settings-title">
|
|
720
778
|
<div class="dialog-header"><div><span class="eyebrow">系统管理员</span><h2 id="platform-ui-settings-title">界面与分页</h2></div><div class="settings-dialog-header-actions"><button id="platform-ui-settings-return" class="ghost-button settings-parent-button" type="button">返回设置</button><button id="platform-ui-settings-close" class="dialog-close" aria-label="关闭" type="button">×</button></div></div>
|
|
721
779
|
<form id="platform-ui-settings-form">
|
|
@@ -843,7 +901,8 @@
|
|
|
843
901
|
<dl class="ai-tool-call-info">
|
|
844
902
|
<div><dt>函数名称</dt><dd><code id="ai-tool-call-name"></code></dd></div>
|
|
845
903
|
<div><dt>调用时间</dt><dd><time id="ai-tool-call-time"></time></dd></div>
|
|
846
|
-
<div
|
|
904
|
+
<div><dt>函数信息</dt><dd id="ai-tool-call-description"></dd></div>
|
|
905
|
+
<div><dt>返回字符数</dt><dd id="ai-tool-call-result-length"></dd></div>
|
|
847
906
|
</dl>
|
|
848
907
|
<section><h3>参数</h3><pre id="ai-tool-call-arguments"></pre></section>
|
|
849
908
|
<section><h3>返回值</h3><pre id="ai-tool-call-result"></pre></section>
|
|
@@ -896,6 +955,6 @@
|
|
|
896
955
|
<div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
|
|
897
956
|
<script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
|
|
898
957
|
<script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
|
|
899
|
-
<script type="module" src="/app.js?v=
|
|
958
|
+
<script type="module" src="/app.js?v=20260801-ai-roleplay-chat-merge-v1"></script>
|
|
900
959
|
</body>
|
|
901
960
|
</html>
|
|
@@ -53,7 +53,7 @@ export function serializePageRoute(route = {}) {
|
|
|
53
53
|
} else if (view === "welcome" && workId) {
|
|
54
54
|
params.set("view", "welcome");
|
|
55
55
|
params.set("work", workId);
|
|
56
|
-
} else if (view === "settings" || view === "platform-ai" || view === "platform-usage") {
|
|
56
|
+
} else if (view === "settings" || view === "platform-ai" || view === "platform-usage" || (view === "work-audit" && workId)) {
|
|
57
57
|
params.set("view", view);
|
|
58
58
|
if (workId) params.set("work", workId);
|
|
59
59
|
appendReturnContext(params, route);
|
|
@@ -87,7 +87,7 @@ export function parsePageRoute(hash = "") {
|
|
|
87
87
|
return { view, workId, entity, entityId: entityId || null, entityMode };
|
|
88
88
|
}
|
|
89
89
|
if (view === "welcome" && workId) return { view, workId };
|
|
90
|
-
if (view === "settings" || view === "platform-ai" || view === "platform-usage") {
|
|
90
|
+
if (view === "settings" || view === "platform-ai" || view === "platform-usage" || (view === "work-audit" && workId)) {
|
|
91
91
|
const route = { view, workId: workId || null };
|
|
92
92
|
const returnView = value(params, "from");
|
|
93
93
|
if (returnViewSet.has(returnView)) route.returnView = returnView;
|
package/dist/public/styles.css
CHANGED
|
@@ -55,11 +55,16 @@
|
|
|
55
55
|
--relationship-detail-muted: #67758c;
|
|
56
56
|
--font-latin: "SFMono-Regular", "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono";
|
|
57
57
|
--font-cjk: "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", "Heiti SC";
|
|
58
|
+
--ui-font-size: 16px;
|
|
59
|
+
--ui-font-scale: 1;
|
|
60
|
+
--ai-font-size: 14px;
|
|
61
|
+
--ai-font-scale: 1;
|
|
58
62
|
--editor-font-size: 17px;
|
|
59
63
|
--editor-line-height: 1.55;
|
|
60
64
|
--left-panel-width: 280px;
|
|
61
65
|
--ai-panel-width: 360px;
|
|
62
66
|
font-family: var(--font-latin), var(--font-cjk), monospace, sans-serif;
|
|
67
|
+
font-size: var(--ui-font-size);
|
|
63
68
|
line-height: 1.5;
|
|
64
69
|
color: var(--ink);
|
|
65
70
|
background: var(--paper);
|
|
@@ -81,6 +86,7 @@
|
|
|
81
86
|
[data-pending-view="settings"] .auth-pending #settings-hub-view.hidden,
|
|
82
87
|
[data-pending-view="platform-ai"] .auth-pending #platform-ai-view.hidden,
|
|
83
88
|
[data-pending-view="platform-usage"] .auth-pending #platform-usage-view.hidden,
|
|
89
|
+
[data-pending-view="work-audit"] .auth-pending #work-audit-view.hidden,
|
|
84
90
|
[data-pending-view="module"] .auth-pending #module-view.hidden { display: block !important; }
|
|
85
91
|
[data-pending-view="welcome"] .auth-pending #welcome-view.hidden,
|
|
86
92
|
[data-pending-view="editor"] .auth-pending #editor-view.hidden { display: grid !important; }
|
|
@@ -581,14 +587,41 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
|
|
|
581
587
|
.writing-goal-fields label { display: grid; gap: 7px; color: var(--muted); font-size: 10px; font-weight: 650; }
|
|
582
588
|
.writing-goal-fields input { width: 100%; min-height: 38px; padding: 8px 10px; background: var(--surface); font-size: 12px; font-weight: 500; }
|
|
583
589
|
@media (max-width: 680px) { .writing-progress-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } .writing-goal-fields { grid-template-columns: 1fr; } }
|
|
584
|
-
.work-audit-
|
|
585
|
-
.work-audit-
|
|
586
|
-
.work-audit-
|
|
587
|
-
.work-audit-
|
|
588
|
-
.work-audit-
|
|
589
|
-
.work-audit-
|
|
590
|
-
.work-audit-
|
|
591
|
-
|
|
590
|
+
.work-audit-view { padding-bottom: 48px; }
|
|
591
|
+
.work-audit-header { margin-bottom: 22px; }
|
|
592
|
+
.work-audit-header h1 { font-size: clamp(30px, 4vw, 48px); }
|
|
593
|
+
.work-audit-toolbar, .work-audit-list, .work-audit-footer { width: 100%; max-width: 1400px; margin-inline: auto; }
|
|
594
|
+
.work-audit-toolbar { display: flex; align-items: center; min-height: 42px; padding: 0 18px; border: 1px solid var(--line); border-bottom: 0; border-radius: 7px 7px 0 0; background: var(--surface-soft); }
|
|
595
|
+
.work-audit-toolbar p { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.5; }
|
|
596
|
+
.work-audit-list { display: grid; border: 1px solid var(--line); border-radius: 0 0 7px 7px; background: var(--panel); }
|
|
597
|
+
.work-audit-row { display: grid; grid-template-columns: minmax(160px, 190px) minmax(0, 1fr); gap: 24px; padding: 22px 20px; border-bottom: 1px solid var(--line); }
|
|
598
|
+
.work-audit-row:last-child { border-bottom: 0; }
|
|
599
|
+
.work-audit-time { min-width: 0; }
|
|
600
|
+
.work-audit-time time { display: grid; gap: 4px; color: var(--muted); font-family: var(--font-mono), monospace; font-variant-numeric: tabular-nums; }
|
|
601
|
+
.work-audit-time span { font-size: 13px; line-height: 1.35; }
|
|
602
|
+
.work-audit-time strong { color: var(--ink); font-size: 18px; font-weight: 600; line-height: 1.25; }
|
|
603
|
+
.work-audit-event { display: grid; min-width: 0; gap: 14px; }
|
|
604
|
+
.work-audit-event-heading { display: flex; align-items: baseline; flex-wrap: wrap; gap: 7px 12px; }
|
|
605
|
+
.work-audit-event-heading strong { color: var(--ink); font-size: 17px; font-weight: 650; line-height: 1.35; }
|
|
606
|
+
.work-audit-event-heading code { color: var(--muted); font: 11px/1.5 var(--font-mono), monospace; overflow-wrap: anywhere; }
|
|
607
|
+
.work-audit-meta, .work-audit-details { margin: 0; }
|
|
608
|
+
.work-audit-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
|
|
609
|
+
.work-audit-meta > div, .work-audit-details > div { min-width: 0; }
|
|
610
|
+
.work-audit-meta > div { display: grid; gap: 4px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); }
|
|
611
|
+
.work-audit-meta dt, .work-audit-details dt { color: var(--muted); font-size: 10px; font-weight: 650; line-height: 1.4; }
|
|
612
|
+
.work-audit-meta dd, .work-audit-details dd { margin: 0; overflow-wrap: anywhere; color: var(--ink); font-size: 12px; line-height: 1.55; }
|
|
613
|
+
.work-audit-meta code, .work-audit-details code { font-family: var(--font-mono), monospace; font-size: 11px; }
|
|
614
|
+
.work-audit-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 18px; padding: 14px 16px; border-left: 3px solid color-mix(in srgb, var(--accent) 55%, var(--line)); background: color-mix(in srgb, var(--accent) 4%, var(--surface-soft)); }
|
|
615
|
+
.work-audit-details > div { display: grid; grid-template-columns: minmax(88px, .35fr) minmax(0, 1fr); gap: 10px; }
|
|
616
|
+
.work-audit-footer { display: flex; justify-content: center; padding-top: 18px; }
|
|
617
|
+
.work-audit-footer button { min-width: 160px; }
|
|
618
|
+
.work-audit-list > .entity-history-empty { font-size: 13px; }
|
|
619
|
+
@media (max-width: 720px) {
|
|
620
|
+
.work-audit-row { grid-template-columns: 1fr; gap: 14px; padding: 18px 14px; }
|
|
621
|
+
.work-audit-time time { display: flex; align-items: baseline; gap: 8px; }
|
|
622
|
+
.work-audit-time strong { font-size: 16px; }
|
|
623
|
+
.work-audit-meta, .work-audit-details { grid-template-columns: 1fr; }
|
|
624
|
+
}
|
|
592
625
|
.settings-work-note { max-width: 1000px; margin: 18px auto 0; color: var(--muted); font-size: 11px; }
|
|
593
626
|
.usage-page-content { width: 100%; max-width: 1400px; margin: 0 auto; padding-top: 0; }
|
|
594
627
|
.usage-overview { min-width: 0; container-name: usage-overview; container-type: inline-size; }
|
|
@@ -613,6 +646,7 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
|
|
|
613
646
|
.usage-calendar-section > header, .usage-work-section > header { display: flex; align-items: end; justify-content: space-between; gap: 18px; margin-bottom: 14px; }
|
|
614
647
|
.usage-calendar-section h3, .usage-work-section h3 { margin: 0 0 4px; font-size: 15px; font-weight: 650; }
|
|
615
648
|
.usage-calendar-section header p, .usage-work-section header p { margin: 0; color: var(--muted); font-size: 10px; }
|
|
649
|
+
.usage-calendar-widget { position: relative; }
|
|
616
650
|
.usage-calendar-scroll { max-width: 100%; padding: 10px 12px 12px; overflow-x: auto; border: 1px solid var(--line); border-radius: 6px; background: var(--surface); }
|
|
617
651
|
.usage-calendar-scroll:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
618
652
|
.usage-calendar-frame { width: max-content; min-width: 100%; }
|
|
@@ -640,13 +674,16 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
|
|
|
640
674
|
gap: 3px;
|
|
641
675
|
min-width: calc(var(--usage-week-count) * 14px);
|
|
642
676
|
}
|
|
643
|
-
.usage-calendar-cell { display: block; width: 11px; height: 11px; border: 1px solid color-mix(in srgb, var(--line) 82%, transparent); border-radius: 2px; background: var(--paper-deep); }
|
|
677
|
+
.usage-calendar-cell { display: block; width: 11px; height: 11px; padding: 0; border: 1px solid color-mix(in srgb, var(--line) 82%, transparent); border-radius: 2px; background: var(--paper-deep); cursor: pointer; }
|
|
644
678
|
.usage-calendar-cell[data-level="1"], .usage-calendar-legend i[data-level="1"] { border-color: color-mix(in srgb, var(--accent) 25%, var(--line)); background: color-mix(in srgb, var(--accent) 18%, var(--surface)); }
|
|
645
679
|
.usage-calendar-cell[data-level="2"], .usage-calendar-legend i[data-level="2"] { border-color: color-mix(in srgb, var(--accent) 46%, var(--line)); background: color-mix(in srgb, var(--accent) 42%, var(--surface)); }
|
|
646
680
|
.usage-calendar-cell[data-level="3"], .usage-calendar-legend i[data-level="3"] { border-color: color-mix(in srgb, var(--accent) 72%, var(--line)); background: color-mix(in srgb, var(--accent) 70%, var(--surface)); }
|
|
647
681
|
.usage-calendar-cell[data-level="4"], .usage-calendar-legend i[data-level="4"] { border-color: var(--accent-dark); background: var(--accent-dark); }
|
|
648
|
-
.usage-calendar-cell.is-future { border-color: transparent; background: transparent; }
|
|
649
|
-
.usage-calendar-cell
|
|
682
|
+
.usage-calendar-cell.is-future { border-color: transparent; background: transparent; cursor: default; }
|
|
683
|
+
.usage-calendar-cell:hover, .usage-calendar-cell:focus-visible { position: relative; z-index: 1; border-color: var(--ink); outline: 2px solid color-mix(in srgb, var(--ink) 48%, transparent); outline-offset: 1px; }
|
|
684
|
+
.usage-calendar-tooltip { position: absolute; z-index: 4; width: max-content; max-width: min(280px, calc(100% - 16px)); padding: 7px 9px; border: 1px solid color-mix(in srgb, var(--ink) 24%, transparent); border-radius: 5px; background: color-mix(in srgb, var(--ink) 94%, transparent); box-shadow: 0 8px 22px rgba(0,0,0,.22); color: var(--panel); font: 10px/1.45 var(--font-latin), var(--font-cjk), monospace; overflow-wrap: anywhere; text-align: center; pointer-events: none; transform: translate(-50%, -100%); }
|
|
685
|
+
.usage-calendar-tooltip[data-placement="bottom"] { transform: translateX(-50%); }
|
|
686
|
+
.usage-calendar-tooltip[hidden] { display: none; }
|
|
650
687
|
.usage-calendar-legend { display: flex; align-items: center; justify-content: flex-end; gap: 4px; margin-top: 8px; color: var(--muted); font-size: 9px; }
|
|
651
688
|
.usage-calendar-legend i { width: 11px; height: 11px; border: 1px solid color-mix(in srgb, var(--line) 82%, transparent); border-radius: 2px; background: var(--paper-deep); }
|
|
652
689
|
.usage-work-table-scroll { max-width: 100%; overflow-x: auto; border: 1px solid var(--line); border-radius: 6px; }
|
|
@@ -1678,6 +1715,15 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
1678
1715
|
.config-section-header { display: flex; align-items: flex-end; justify-content: space-between; margin-bottom: 14px; }
|
|
1679
1716
|
.config-section-header h2 { margin: 0 0 6px; font-size: 18px; font-weight: 600; }
|
|
1680
1717
|
.config-section-header p { margin: 0; color: var(--muted); font-size: 11px; }
|
|
1718
|
+
.config-section-header .config-doc-link {
|
|
1719
|
+
display: inline;
|
|
1720
|
+
margin-left: 4px;
|
|
1721
|
+
color: var(--accent-dark);
|
|
1722
|
+
text-decoration: underline;
|
|
1723
|
+
text-underline-offset: 2px;
|
|
1724
|
+
}
|
|
1725
|
+
.config-section-header .config-doc-link:hover,
|
|
1726
|
+
.config-section-header .config-doc-link:focus-visible { color: var(--accent); }
|
|
1681
1727
|
.ai-agent-tools { display: grid; gap: 8px; }
|
|
1682
1728
|
.ai-agent-tools label { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 8px; align-items: start; color: var(--muted); font-size: 11px; line-height: 1.45; }
|
|
1683
1729
|
.ai-agent-tools input { width: 16px; margin-top: 2px; }
|
|
@@ -1999,6 +2045,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
1999
2045
|
.ai-heading-actions #ai-new-conversation { padding: 0; font: 17px/1 var(--font-latin), monospace; }
|
|
2000
2046
|
.ai-heading-actions button:hover, .ai-heading-actions button[aria-expanded="true"] { background: var(--paper-deep); color: var(--ink); }
|
|
2001
2047
|
.status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 3px rgba(94,118,92,.14); }
|
|
2048
|
+
.status-dot.is-error { background: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent); }
|
|
2002
2049
|
.ai-history-dialog-body { min-height: min(360px, 55vh); max-height: 65vh; overflow-y: auto; padding: 18px 24px 24px; }
|
|
2003
2050
|
.ai-history-list { display: grid; gap: 8px; }
|
|
2004
2051
|
.ai-history-item { display: grid; gap: 5px; width: 100%; min-width: 0; padding: 14px 16px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); text-align: left; }
|
|
@@ -2011,10 +2058,19 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2011
2058
|
.field-label select { padding: 8px; font-size: 12px; }
|
|
2012
2059
|
.book-summary-context-percent-field { width: min(100%, 280px); }
|
|
2013
2060
|
.context-compact-threshold-field { width: min(100%, 280px); }
|
|
2014
|
-
.
|
|
2061
|
+
.agent-tool-call-limit-field { width: min(100%, 280px); }
|
|
2062
|
+
.daily-token-quota-field { width: min(100%, 144px); }
|
|
2063
|
+
.agent-tool-call-global-multiplier-field { width: auto; min-width: 0; }
|
|
2064
|
+
.book-summary-context-percent-field input, .context-compact-threshold-field input, .agent-tool-call-limit-field input, .daily-token-quota-field input { width: 64px; min-height: 32px; padding: 5px 8px; font-size: 13px; font-family: var(--font-latin), monospace; }
|
|
2065
|
+
.daily-token-quota-field input { width: 144px; }
|
|
2015
2066
|
.config-inline-save { display: flex; align-items: flex-end; gap: 10px; margin: 14px 0 4px; flex-wrap: wrap; }
|
|
2016
2067
|
.config-inline-save .book-summary-context-percent-field,
|
|
2017
|
-
.config-inline-save .context-compact-threshold-field
|
|
2068
|
+
.config-inline-save .context-compact-threshold-field,
|
|
2069
|
+
.config-inline-save .agent-tool-call-limit-field,
|
|
2070
|
+
.config-inline-save .daily-token-quota-field { display: grid; gap: 6px; width: 64px; margin: 0; color: var(--muted); font-size: 10px; }
|
|
2071
|
+
.config-inline-save .daily-token-quota-field { width: 144px; }
|
|
2072
|
+
.config-inline-save .agent-tool-call-global-multiplier-field { display: grid; gap: 6px; width: auto; margin: 0; color: var(--muted); font-size: 10px; }
|
|
2073
|
+
.agent-tool-call-global-multiplier-toggle button { min-width: 32px; padding: 0 10px; font-family: var(--font-latin), monospace; font-size: 12px; font-variant-numeric: tabular-nums; }
|
|
2018
2074
|
.relationship-index-summary { display: grid; gap: 14px; padding: 15px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
|
|
2019
2075
|
.relationship-index-state-row { display: flex; align-items: center; gap: 12px 18px; flex-wrap: wrap; color: var(--muted); font-size: 10px; }
|
|
2020
2076
|
.relationship-index-state-row strong { color: var(--ink); font-family: var(--font-latin), monospace; font-weight: 600; }
|
|
@@ -2052,7 +2108,9 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2052
2108
|
.quick-actions button { min-width: 0; min-height: 30px; border: 1px solid var(--line); background: transparent; border-radius: 3px; padding: 5px 3px; color: var(--muted); font-size: 10px; white-space: nowrap; }
|
|
2053
2109
|
.quick-actions button:hover { color: var(--ink); background: var(--paper-deep); }
|
|
2054
2110
|
.ai-feed { flex: 1; min-height: 0; overflow-y: auto; margin: 10px -5px 12px; padding: 0 5px; }
|
|
2055
|
-
.ai-context-compaction-divider { display: grid; grid-template-columns: minmax(16px, 1fr) auto minmax(16px, 1fr); gap: 9px; align-items: center;
|
|
2111
|
+
.ai-context-compaction-divider { display: grid; grid-template-columns: minmax(16px, 1fr) auto minmax(16px, 1fr); gap: 9px; align-items: center; min-width: 0; color: var(--muted); font-size: 9px; line-height: 1; text-align: center; }
|
|
2112
|
+
.ai-feed > .ai-context-compaction-divider { margin: 4px 0 16px; }
|
|
2113
|
+
.ai-process-list > .ai-context-compaction-divider { padding: 2px 0; }
|
|
2056
2114
|
.ai-context-compaction-divider::before, .ai-context-compaction-divider::after { height: 1px; background: color-mix(in srgb, var(--muted) 36%, transparent); content: ""; }
|
|
2057
2115
|
.ai-context-compaction-divider span { letter-spacing: .08em; white-space: nowrap; }
|
|
2058
2116
|
.assistant-message, .user-message { position: relative; margin-bottom: 12px; padding: 12px 13px; border-radius: 5px; font-size: 12px; line-height: 1.55; }
|
|
@@ -2116,9 +2174,6 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2116
2174
|
.ai-process-step-body { max-height: 220px; overflow: auto; padding: 8px 9px; border-left: 2px solid color-mix(in srgb, var(--accent) 46%, var(--line)); background: var(--paper-deep); color: var(--muted); font-size: 10px; }
|
|
2117
2175
|
.ai-process-intermediate-step .ai-process-step-body { border-left-color: var(--muted); }
|
|
2118
2176
|
.ai-process-tool-step { padding-top: 1px; }
|
|
2119
|
-
.ai-process-context-compaction { display: grid; grid-template-columns: minmax(12px, 1fr) auto minmax(12px, 1fr); gap: 8px; align-items: center; min-width: 0; padding: 2px 0; color: var(--muted); font-size: 8px; line-height: 1; text-align: center; }
|
|
2120
|
-
.ai-process-context-compaction::before, .ai-process-context-compaction::after { height: 1px; background: color-mix(in srgb, var(--muted) 38%, transparent); content: ""; }
|
|
2121
|
-
.ai-process-context-compaction span { letter-spacing: .08em; white-space: nowrap; }
|
|
2122
2177
|
@keyframes ai-process-pulse { 0%, 100% { opacity: .45; transform: scale(.8); } 50% { opacity: 1; transform: scale(1); } }
|
|
2123
2178
|
@media (prefers-reduced-motion: reduce) { .is-streaming .ai-process-details[open] > summary::before { animation: none; } }
|
|
2124
2179
|
.ai-tool-call-list { display: grid; gap: 5px; margin-top: 10px; }
|
|
@@ -2133,12 +2188,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2133
2188
|
.ai-tool-call-info dt { margin-bottom: 4px; color: var(--muted); font-size: 9px; }
|
|
2134
2189
|
.ai-tool-call-info dd { min-width: 0; margin: 0; color: var(--ink); font-size: 11px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
2135
2190
|
.ai-tool-call-info code, .ai-tool-call-info time { font-family: var(--font-latin), monospace; }
|
|
2136
|
-
.ai-tool-call-description { grid-column: 1 / -1; }
|
|
2137
2191
|
.ai-tool-call-detail section { min-width: 0; }
|
|
2138
2192
|
.ai-tool-call-detail h3 { margin: 0 0 7px; color: var(--muted); font-size: 10px; font-weight: 600; }
|
|
2139
2193
|
.ai-tool-call-detail pre { min-height: 120px; max-height: 32vh; overflow: auto; margin: 0; padding: 12px; border: 1px solid var(--line); border-radius: 5px; background: var(--paper-deep); color: var(--ink); font: 10px/1.55 var(--font-latin), monospace; white-space: pre-wrap; word-break: break-word; }
|
|
2140
2194
|
.ai-tool-call-detail section:last-child pre { min-height: 180px; }
|
|
2141
|
-
@media (max-width: 680px) { .ai-tool-call-info { grid-template-columns: minmax(0, 1fr); }.ai-tool-call-
|
|
2195
|
+
@media (max-width: 680px) { .ai-tool-call-info { grid-template-columns: minmax(0, 1fr); }.ai-tool-call-detail pre { min-height: 100px; max-height: 26vh; }.ai-tool-call-detail section:last-child pre { min-height: 140px; } }
|
|
2142
2196
|
.guard-card { margin-top: 10px; padding: 9px 10px; border: 1px solid var(--line); border-left: 3px solid var(--green); border-radius: 4px; background: var(--surface-soft); }
|
|
2143
2197
|
.guard-card.warning { border-left-color: #c07b31; }.guard-card.failed { border-left-color: var(--accent); }
|
|
2144
2198
|
.guard-card strong { display: block; margin-bottom: 5px; font-size: 10px; }.guard-card p { margin: 4px 0; color: var(--muted); font-size: 9px; line-height: 1.45; }.guard-card p b { color: var(--ink); }
|
|
@@ -2156,6 +2210,29 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2156
2210
|
.ai-context-warning button:first-child:hover, .ai-context-warning button:first-child:focus-visible { background: var(--accent-dark); color: #fff; }
|
|
2157
2211
|
.prompt-options { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 7px; }
|
|
2158
2212
|
.prompt-options select { padding: 6px; color: var(--muted); font-size: 10px; }
|
|
2213
|
+
.prompt-options .ai-roleplay-character { min-width: 0; }
|
|
2214
|
+
.ai-panel.is-roleplaying .ai-roleplay-character { border-color: color-mix(in srgb, var(--accent) 52%, var(--line)); background: color-mix(in srgb, var(--accent) 8%, var(--surface)); color: var(--accent-dark); }
|
|
2215
|
+
.prompt-options .ai-include-setting-info {
|
|
2216
|
+
grid-column: 1 / -1;
|
|
2217
|
+
display: inline-flex;
|
|
2218
|
+
align-items: center;
|
|
2219
|
+
gap: 6px;
|
|
2220
|
+
min-height: 28px;
|
|
2221
|
+
color: var(--muted);
|
|
2222
|
+
font-size: 10px;
|
|
2223
|
+
cursor: pointer;
|
|
2224
|
+
user-select: none;
|
|
2225
|
+
}
|
|
2226
|
+
.prompt-options .ai-include-setting-info input {
|
|
2227
|
+
width: 14px;
|
|
2228
|
+
height: 14px;
|
|
2229
|
+
margin: 0;
|
|
2230
|
+
accent-color: var(--accent);
|
|
2231
|
+
}
|
|
2232
|
+
.prompt-options .ai-include-setting-info:has(input:disabled) {
|
|
2233
|
+
opacity: 0.55;
|
|
2234
|
+
cursor: not-allowed;
|
|
2235
|
+
}
|
|
2159
2236
|
.prompt-model-field { margin: 0 0 7px; }
|
|
2160
2237
|
.prompt-model-field select { padding: 6px; color: var(--muted); font-size: 10px; }
|
|
2161
2238
|
.prompt-composer { position: relative; }
|
|
@@ -2310,6 +2387,13 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2310
2387
|
.markdown-table-menu button:hover, .markdown-table-menu button:focus-visible { background: var(--paper-deep); color: var(--accent-dark); }
|
|
2311
2388
|
.markdown-table-menu button span { font-size: 11px; font-weight: 600; }
|
|
2312
2389
|
.markdown-table-menu button small { color: var(--muted); font-size: 9px; }
|
|
2390
|
+
.manuscript-export-menu { position: fixed; z-index: 90; display: grid; min-width: 240px; gap: 3px; padding: 8px; border: 1px solid var(--line); border-radius: 6px; background: var(--panel); box-shadow: 0 14px 38px rgba(49,42,32,.22); }
|
|
2391
|
+
.manuscript-export-menu.hidden { display: none; }
|
|
2392
|
+
.manuscript-export-menu > strong { padding: 5px 8px 7px; color: var(--muted); font-size: 9px; }
|
|
2393
|
+
.manuscript-export-menu button { display: grid; width: 100%; gap: 2px; padding: 8px 9px; border: 0; border-radius: 4px; background: transparent; color: var(--ink); text-align: left; }
|
|
2394
|
+
.manuscript-export-menu button:hover, .manuscript-export-menu button:focus-visible { background: var(--paper-deep); color: var(--accent-dark); outline: 0; }
|
|
2395
|
+
.manuscript-export-menu button span { font-size: 11px; font-weight: 600; }
|
|
2396
|
+
.manuscript-export-menu button small { color: var(--muted); font-size: 9px; line-height: 1.45; }
|
|
2313
2397
|
.chapter-annotations-dialog { width: min(820px, 94vw); }
|
|
2314
2398
|
.chapter-annotations-list { display: grid; gap: 10px; max-height: 62vh; overflow: auto; padding: 18px 24px; }
|
|
2315
2399
|
.chapter-comment-module-list { display: grid; gap: 10px; }
|
|
@@ -2366,6 +2450,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2366
2450
|
.dialog-fields label { display: grid; gap: 6px; color: var(--muted); font-size: 11px; }
|
|
2367
2451
|
.dialog-fields input, .dialog-fields textarea, .dialog-fields select { width: 100%; padding: 9px 10px; font-size: 13px; }
|
|
2368
2452
|
.dialog-fields textarea { resize: vertical; min-height: 90px; line-height: 1.6; }
|
|
2453
|
+
.system-restart-dialog { width: min(500px, 92vw); }
|
|
2454
|
+
.system-restart-message { margin: 0; color: var(--ink); font-size: 13px; line-height: 1.7; }
|
|
2369
2455
|
.background-task-dialog { width: min(860px, 94vw); }
|
|
2370
2456
|
.background-task-content { display: grid; gap: 16px; max-height: 64vh; overflow-y: auto; padding: 20px 24px; }
|
|
2371
2457
|
.background-task-section { display: grid; gap: 12px; min-width: 0; padding: 15px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
|
|
@@ -3177,3 +3263,53 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
3177
3263
|
*, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
|
|
3178
3264
|
.dialog-submit-progress > span { width: 100%; transform: none; }
|
|
3179
3265
|
}
|
|
3266
|
+
|
|
3267
|
+
/* 显示设置中的界面字号覆盖常用控件和辅助文字;正文与 Agent 对话分别独立调节。 */
|
|
3268
|
+
body { font-size: var(--ui-font-size); }
|
|
3269
|
+
:is(.module-nav button, .ghost-button, .primary-button, .module-header p, .eyebrow,
|
|
3270
|
+
.panel-heading, .field-label, .dialog-header-meta, .dialog-fields label,
|
|
3271
|
+
.dialog-fields .form-field-note, .appearance-grid label, .config-section-header p,
|
|
3272
|
+
.config-section .config-save-button, .font-preview span, .settings-hub-card small,
|
|
3273
|
+
.settings-hub-card strong, .shelf-header p, .topbar, .book-card small) {
|
|
3274
|
+
font-size: calc(1em * var(--ui-font-scale));
|
|
3275
|
+
}
|
|
3276
|
+
.appearance-grid select, .dialog-fields input, .dialog-fields textarea, .dialog-fields select { font-size: calc(13px * var(--ui-font-scale)); }
|
|
3277
|
+
|
|
3278
|
+
/* Agent 面板原有的细小字号统一以可读的对话字号为基准缩放。 */
|
|
3279
|
+
.ai-panel,
|
|
3280
|
+
.ai-history-dialog,
|
|
3281
|
+
.ai-tool-call-dialog { font-size: var(--ai-font-size); }
|
|
3282
|
+
.ai-heading-title strong { font-size: calc(14px * var(--ai-font-scale)); }
|
|
3283
|
+
.ai-heading-actions > span, .ai-heading-actions button { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3284
|
+
.quick-actions button { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3285
|
+
.ai-context-compaction-divider { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3286
|
+
.assistant-message, .user-message { font-size: var(--ai-font-size); }
|
|
3287
|
+
.assistant-message > .message-heading, .user-message > .message-heading { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3288
|
+
.ai-message-status, .message-card-actions button, .message-meta { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3289
|
+
.message-body h1 { font-size: calc(17px * var(--ai-font-scale)); }
|
|
3290
|
+
.message-body h2 { font-size: calc(15px * var(--ai-font-scale)); }
|
|
3291
|
+
.message-body h3, .message-body h4 { font-size: calc(13px * var(--ai-font-scale)); }
|
|
3292
|
+
.message-body h5, .message-body h6 { font-size: calc(11px * var(--ai-font-scale)); }
|
|
3293
|
+
.message-body pre { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3294
|
+
.message-body .markdown-image small { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3295
|
+
.ai-process-details > summary, .ai-process-step-body, .ai-tool-call-summary { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3296
|
+
.ai-process-details > summary > small, .ai-process-step > small { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3297
|
+
.guard-card strong, .guard-card p, .message-actions button { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3298
|
+
.ai-context-warning strong { font-size: calc(11px * var(--ai-font-scale)); }
|
|
3299
|
+
.ai-context-warning p, .ai-context-warning button { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3300
|
+
.prompt-options select, .prompt-model-field select, .ai-mention-option strong, .ai-mention-empty { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3301
|
+
.ai-mention-option small { font-size: calc(8px * var(--ai-font-scale)); }
|
|
3302
|
+
.ai-prompt { font-size: var(--ai-font-size); }
|
|
3303
|
+
.ai-prompt-reference { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3304
|
+
.ai-context-meter b { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3305
|
+
.ai-context-popover-header strong { font-size: calc(12px * var(--ai-font-scale)); }
|
|
3306
|
+
.ai-context-popover-header small, .ai-context-distribution-label { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3307
|
+
.ai-context-distribution-label small, .ai-context-distribution-label strong { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3308
|
+
.ai-send-button { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3309
|
+
.ai-citation-main strong { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3310
|
+
.ai-citation-main small, .ai-citation-main span, .message-citations span { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3311
|
+
.ai-history-item strong { font-size: calc(14px * var(--ai-font-scale)); }
|
|
3312
|
+
.ai-history-item small { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3313
|
+
.ai-tool-call-info dt, .ai-tool-call-detail h3 { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3314
|
+
.ai-tool-call-info dd { font-size: calc(11px * var(--ai-font-scale)); }
|
|
3315
|
+
.ai-tool-call-detail pre { font-size: calc(10px * var(--ai-font-scale)); }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SystemHealthStatus = "checking" | "ready" | "degraded" | "offline";
|
|
2
|
+
|
|
3
|
+
export type SystemStatusPresentation = {
|
|
4
|
+
label: string;
|
|
5
|
+
tone: "ok" | "pending" | "error";
|
|
6
|
+
title: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function systemStatusPresentation(snapshot?: {
|
|
10
|
+
status?: SystemHealthStatus | string;
|
|
11
|
+
version?: string;
|
|
12
|
+
}): SystemStatusPresentation;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const supportedSystemStatuses = new Set(["checking", "ready", "degraded", "offline"]);
|
|
2
|
+
|
|
3
|
+
export function systemStatusPresentation(snapshot = {}) {
|
|
4
|
+
const status = supportedSystemStatuses.has(snapshot.status) ? snapshot.status : "checking";
|
|
5
|
+
const version = String(snapshot.version ?? "").trim();
|
|
6
|
+
if (status === "ready") {
|
|
7
|
+
return {
|
|
8
|
+
label: "就绪",
|
|
9
|
+
tone: "ok",
|
|
10
|
+
title: version ? `服务连接正常 · v${version}` : "服务连接正常"
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (status === "degraded") return { label: "服务异常", tone: "error", title: "服务可访问,但请求出现异常" };
|
|
14
|
+
if (status === "offline") return { label: "连接中断", tone: "error", title: "无法连接到本地服务,系统将自动重试" };
|
|
15
|
+
return { label: "检测中", tone: "pending", title: "正在检查本地服务状态" };
|
|
16
|
+
}
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
// 会话恢复期间按目标路由预显示对应视图的骨架屏
|
|
15
15
|
const pendingView = ["editor", "module", "welcome"].includes(routeView) && routeParams.get("work")
|
|
16
16
|
? routeView
|
|
17
|
-
: ["settings", "platform-ai", "platform-usage"].includes(routeView) ? routeView : "shelf";
|
|
17
|
+
: ["settings", "platform-ai", "platform-usage", "work-audit"].includes(routeView) ? routeView : "shelf";
|
|
18
18
|
document.documentElement.dataset.pendingView = pendingView;
|
|
19
|
-
if (["shelf", "settings", "platform-ai", "platform-usage"].includes(pendingView)) {
|
|
19
|
+
if (["shelf", "settings", "platform-ai", "platform-usage", "work-audit"].includes(pendingView)) {
|
|
20
20
|
document.documentElement.classList.add("pending-shelf-mode");
|
|
21
21
|
}
|
|
22
22
|
}
|