@musnows/scriverse 0.7.2 → 0.7.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/README.en.md +3 -0
- package/README.md +8 -0
- package/dist/ai-connectivity-test.js +109 -0
- package/dist/ai-connectivity-test.js.map +1 -0
- package/dist/ai-conversation-export.js +70 -0
- package/dist/ai-conversation-export.js.map +1 -0
- package/dist/ai-stream-timeout.js +18 -0
- package/dist/ai-stream-timeout.js.map +1 -0
- package/dist/ai.js +926 -354
- package/dist/ai.js.map +1 -1
- package/dist/app.js +498 -80
- package/dist/app.js.map +1 -1
- package/dist/attachment-storage.js +28 -12
- package/dist/attachment-storage.js.map +1 -1
- package/dist/backup-encryption.js +129 -0
- package/dist/backup-encryption.js.map +1 -0
- package/dist/character-extraction.js +133 -0
- package/dist/character-extraction.js.map +1 -0
- package/dist/cli-core.js +7 -6
- package/dist/cli-core.js.map +1 -1
- package/dist/collaboration-presence.js +200 -18
- package/dist/collaboration-presence.js.map +1 -1
- package/dist/database.js +335 -3
- package/dist/database.js.map +1 -1
- package/dist/docx-export.js +1 -1
- package/dist/docx-export.js.map +1 -1
- package/dist/domain.js +18 -0
- package/dist/domain.js.map +1 -1
- package/dist/epub-export.js +319 -0
- package/dist/epub-export.js.map +1 -0
- package/dist/hybrid-search.js +8 -0
- package/dist/hybrid-search.js.map +1 -1
- package/dist/image-metadata.js +17 -2
- package/dist/image-metadata.js.map +1 -1
- package/dist/presence-store.js +160 -0
- package/dist/presence-store.js.map +1 -0
- package/dist/public/ai-connectivity-test.d.ts +7 -0
- package/dist/public/ai-connectivity-test.js +82 -0
- package/dist/public/ai-context-meter.js +27 -0
- package/dist/public/ai-mentions.js +14 -0
- package/dist/public/ai-request-manager.js +99 -0
- package/dist/public/ai-stream-protocol.js +51 -0
- package/dist/public/app.js +3587 -559
- package/dist/public/background-task-center.js +1 -1
- package/dist/public/chapter-editor-virtualization.js +52 -0
- package/dist/public/chapter-version-diff.d.ts +20 -0
- package/dist/public/chapter-version-diff.js +116 -0
- package/dist/public/foreshadow-reminder.d.ts +32 -0
- package/dist/public/foreshadow-reminder.js +73 -0
- package/dist/public/global-replace-refresh.js +60 -0
- package/dist/public/index.html +161 -31
- package/dist/public/outline-board.d.ts +61 -0
- package/dist/public/outline-board.js +137 -0
- package/dist/public/page-route.d.ts +1 -0
- package/dist/public/page-route.js +8 -0
- package/dist/public/presence-client-id.d.ts +10 -0
- package/dist/public/presence-client-id.js +31 -0
- package/dist/public/reading-preview.d.ts +32 -0
- package/dist/public/reading-preview.js +136 -0
- package/dist/public/s3-backup-ui.d.ts +10 -0
- package/dist/public/s3-backup-ui.js +29 -0
- package/dist/public/setting-filters.d.ts +16 -0
- package/dist/public/setting-filters.js +19 -0
- package/dist/public/styles.css +522 -11
- package/dist/public/upload-progress.d.ts +2 -0
- package/dist/public/upload-progress.js +10 -0
- package/dist/s3-backup.js +197 -12
- package/dist/s3-backup.js.map +1 -1
- package/dist/security.js +86 -21
- package/dist/security.js.map +1 -1
- package/dist/server-runtime.js +38 -18
- package/dist/server-runtime.js.map +1 -1
- package/dist/store.js +899 -104
- package/dist/store.js.map +1 -1
- package/dist/upload-limits.js +35 -0
- package/dist/upload-limits.js.map +1 -0
- package/dist/user-auth.js +56 -10
- package/dist/user-auth.js.map +1 -1
- package/dist/utils.js +3 -0
- package/dist/utils.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -2
package/dist/public/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
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=20260812-ai-conversation-export-mobile-foreshadow-epub-character-extraction-outline-reader-v1">
|
|
14
14
|
</head>
|
|
15
15
|
<body class="auth-pending">
|
|
16
16
|
<section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<button id="auth-login-tab" type="button" role="tab" aria-selected="true">登录</button>
|
|
24
24
|
<button id="auth-register-tab" type="button" role="tab" aria-selected="false" aria-disabled="true" disabled>注册已禁用</button>
|
|
25
25
|
</div>
|
|
26
|
-
<form id="login-form" class="auth-form">
|
|
26
|
+
<form id="login-form" class="auth-form" method="post" action="/api/auth/login">
|
|
27
27
|
<label>用户名<input name="username" autocomplete="username" maxlength="100" required></label>
|
|
28
28
|
<label>密码<input id="login-password" name="password" type="password" autocomplete="current-password" maxlength="200" required aria-describedby="login-lock-hint"></label>
|
|
29
29
|
<p id="login-lock-hint" class="auth-security-hint">登录和注册采用验证码与来源限速防护,不会因他人输错密码而锁定账户。</p>
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
<p id="login-captcha-hint" class="auth-captcha-hint">点击按钮显示验证码,显示后点击图片可刷新</p>
|
|
39
39
|
<button class="primary-button" type="submit">登录</button>
|
|
40
40
|
</form>
|
|
41
|
-
<form id="register-form" class="auth-form hidden">
|
|
41
|
+
<form id="register-form" class="auth-form hidden" method="post" action="/api/auth/register">
|
|
42
42
|
<label>用户名<input name="username" autocomplete="username" minlength="3" maxlength="40" pattern="[A-Za-z0-9_.\-\u4e00-\u9fff]+" required></label>
|
|
43
43
|
<label id="register-setup-token-field" class="hidden">初始化令牌<input name="setupToken" type="password" autocomplete="off" minlength="32" maxlength="500" aria-describedby="register-setup-token-hint"><small id="register-setup-token-hint">请输入服务端 APP_SETUP_TOKEN 的值。</small></label>
|
|
44
44
|
<label>密码<span class="password-field"><input id="register-password" name="password" type="password" autocomplete="new-password" minlength="10" maxlength="200" required><button class="password-toggle" type="button" data-password-toggle="register-password" aria-label="显示密码" aria-pressed="false" title="显示密码"><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M2.5 12s3.3-5.5 9.5-5.5S21.5 12 21.5 12 18.2 17.5 12 17.5 2.5 12 2.5 12Z"/><circle cx="12" cy="12" r="2.8"/></svg></button></span></label>
|
|
@@ -125,8 +125,9 @@
|
|
|
125
125
|
</div>
|
|
126
126
|
<nav id="module-nav" class="module-nav" aria-label="作品模块">
|
|
127
127
|
<button type="button" data-module="editor" class="active"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>正文</button>
|
|
128
|
+
<button id="reader-open-button" type="button" aria-label="打开沉浸式阅读预览" title="阅读预览"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 5.5A2.5 2.5 0 0 1 5.5 3H11v16H5.5A2.5 2.5 0 0 0 3 21.5Z"/><path d="M21 5.5A2.5 2.5 0 0 0 18.5 3H13v16h5.5a2.5 2.5 0 0 1 2.5 2.5Z"/></svg>阅读预览</button>
|
|
128
129
|
<button type="button" data-module="drafts"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 20h4l11-11a2.8 2.8 0 0 0-4-4L4 16v4Z"/><path d="m13.5 6.5 4 4"/></svg>想法</button>
|
|
129
|
-
<button type="button" data-module="settings"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m16 6 4 14"/><path d="M12 6v14"/><path d="M8 8v12"/><path d="M4 4v16"/></svg
|
|
130
|
+
<button type="button" data-module="settings"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m16 6 4 14"/><path d="M12 6v14"/><path d="M8 8v12"/><path d="M4 4v16"/></svg>设定</button>
|
|
130
131
|
<button type="button" data-module="characters"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>角色</button>
|
|
131
132
|
<button type="button" data-module="organizations"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>组织</button>
|
|
132
133
|
<button type="button" data-module="timeline"><svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>时间轴</button>
|
|
@@ -156,7 +157,10 @@
|
|
|
156
157
|
<section id="shelf-view" class="shelf-view hidden" aria-labelledby="shelf-title">
|
|
157
158
|
<div class="shelf-header">
|
|
158
159
|
<div><span class="eyebrow">我的创作书架</span><h1 id="shelf-title">选择一本书,继续写下去</h1><p>封面、正文、人物关系和创作约束都保存在同一部作品中。</p></div>
|
|
159
|
-
<
|
|
160
|
+
<div class="shelf-header-actions">
|
|
161
|
+
<button id="shelf-recycle-bin" class="ghost-button" type="button" aria-controls="work-recycle-bin-dialog" aria-haspopup="dialog">作品回收站</button>
|
|
162
|
+
<button id="shelf-new-work" class="primary-button" type="button">新建作品</button>
|
|
163
|
+
</div>
|
|
160
164
|
</div>
|
|
161
165
|
<div id="book-shelf" class="book-shelf" data-testid="book-shelf"></div>
|
|
162
166
|
<footer class="product-footer" data-product-footer aria-label="叙界项目信息">
|
|
@@ -216,7 +220,7 @@
|
|
|
216
220
|
<button id="work-audit-button" class="settings-hub-card" type="button"><span class="settings-card-mark">录</span><strong>操作记录</strong><small>查看作品修改、操作者、对象与时间</small></button>
|
|
217
221
|
<button id="global-replace-button" class="settings-hub-card" type="button"><span class="settings-card-mark">替</span><strong>全局替换</strong><small>替换已保存正文、设定库或两者内容</small></button>
|
|
218
222
|
<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>
|
|
219
|
-
<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
|
|
223
|
+
<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 或 EPUB;不包含角色和设定资料</small></button>
|
|
220
224
|
</div>
|
|
221
225
|
<p id="settings-work-note" class="settings-work-note"></p>
|
|
222
226
|
<footer class="product-footer settings-product-footer" data-product-footer aria-label="叙界项目信息">
|
|
@@ -244,6 +248,7 @@
|
|
|
244
248
|
<input id="chapter-title" class="chapter-title" aria-label="章节标题" placeholder="章节标题">
|
|
245
249
|
<div class="editor-actions">
|
|
246
250
|
<span id="chapter-stats" class="chapter-stats">0 字 · v0</span>
|
|
251
|
+
<button id="chapter-reader-button" class="ghost-button" type="button">阅读预览</button>
|
|
247
252
|
<button id="insight-button" class="ghost-button" type="button" aria-controls="chapter-insight-toast" aria-expanded="false">章节概览</button>
|
|
248
253
|
<button id="versions-button" class="ghost-button" type="button">版本</button>
|
|
249
254
|
<button id="chapter-annotations-button" class="ghost-button" type="button">评论</button>
|
|
@@ -253,6 +258,28 @@
|
|
|
253
258
|
<button id="save-button" class="primary-button" type="button">保存正文</button>
|
|
254
259
|
</div>
|
|
255
260
|
</div>
|
|
261
|
+
<section id="chapter-foreshadow-reminder" class="chapter-foreshadow-reminder hidden" aria-live="polite" aria-labelledby="chapter-foreshadow-reminder-title">
|
|
262
|
+
<div class="chapter-foreshadow-reminder-summary">
|
|
263
|
+
<span id="chapter-foreshadow-reminder-role" class="chapter-foreshadow-reminder-role">提醒章</span>
|
|
264
|
+
<div>
|
|
265
|
+
<strong id="chapter-foreshadow-reminder-title">本章有伏笔需要留意</strong>
|
|
266
|
+
<span id="chapter-foreshadow-reminder-context"></span>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
<div class="chapter-foreshadow-reminder-actions">
|
|
270
|
+
<span id="chapter-foreshadow-reminder-counter" class="chapter-foreshadow-reminder-counter"></span>
|
|
271
|
+
<button id="chapter-foreshadow-reminder-previous" class="ghost-button" type="button" aria-label="查看上一条伏笔提醒">上一条</button>
|
|
272
|
+
<button id="chapter-foreshadow-reminder-next" class="ghost-button" type="button" aria-label="查看下一条伏笔提醒">下一条</button>
|
|
273
|
+
<button id="chapter-foreshadow-reminder-details-button" class="ghost-button" type="button" aria-controls="chapter-foreshadow-reminder-details" aria-expanded="false">查看详情</button>
|
|
274
|
+
<button id="chapter-foreshadow-reminder-snooze" class="ghost-button" type="button">暂不处理</button>
|
|
275
|
+
<button id="chapter-foreshadow-reminder-resolve" class="primary-button" type="button">标记已回收</button>
|
|
276
|
+
</div>
|
|
277
|
+
<dl id="chapter-foreshadow-reminder-details" class="chapter-foreshadow-reminder-details hidden">
|
|
278
|
+
<div id="chapter-foreshadow-reminder-description-row"><dt>伏笔说明</dt><dd id="chapter-foreshadow-reminder-description"></dd></div>
|
|
279
|
+
<div id="chapter-foreshadow-reminder-note-row"><dt>本章节点</dt><dd id="chapter-foreshadow-reminder-note"></dd></div>
|
|
280
|
+
<div><dt>重要程度</dt><dd id="chapter-foreshadow-reminder-importance"></dd></div>
|
|
281
|
+
</dl>
|
|
282
|
+
</section>
|
|
256
283
|
<div class="editor-body">
|
|
257
284
|
<div class="chapter-editor-frame">
|
|
258
285
|
<aside id="chapter-line-numbers" class="chapter-line-numbers" aria-label="正文行号,可拖拽引用多行"><div id="chapter-line-numbers-inner"></div></aside>
|
|
@@ -330,7 +357,7 @@
|
|
|
330
357
|
<select id="ai-model" aria-label="实际使用模型"></select>
|
|
331
358
|
</div>
|
|
332
359
|
<div class="prompt-composer">
|
|
333
|
-
<div id="ai-prompt" class="ai-prompt" contenteditable="true" role="textbox" aria-multiline="true" aria-keyshortcuts="Enter" title="Enter 发送,Shift+Enter 换行" data-placeholder="告诉 AI 你想讨论或修改什么……"></div>
|
|
360
|
+
<div id="ai-prompt" class="ai-prompt" contenteditable="true" role="textbox" aria-multiline="true" aria-autocomplete="list" aria-controls="ai-mention-menu" aria-haspopup="listbox" aria-expanded="false" aria-keyshortcuts="Enter" title="Enter 发送,Shift+Enter 换行" data-placeholder="告诉 AI 你想讨论或修改什么……"></div>
|
|
334
361
|
<div id="ai-mention-menu" class="ai-mention-menu hidden" role="listbox" aria-label="引用角色、设定、章节或上下文能力"></div>
|
|
335
362
|
<div class="prompt-composer-actions">
|
|
336
363
|
<button id="ai-context-meter" class="ai-context-meter is-empty" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="ai-context-popover" aria-live="polite" aria-label="当前上下文用量"><b>—</b></button>
|
|
@@ -345,6 +372,55 @@
|
|
|
345
372
|
</aside>
|
|
346
373
|
</div>
|
|
347
374
|
|
|
375
|
+
<section id="reader-view" class="reader-view hidden" data-reader-theme="paper" role="dialog" aria-labelledby="reader-title">
|
|
376
|
+
<header class="reader-header">
|
|
377
|
+
<button id="reader-close" class="entity-editor-back" type="button">返回工作台</button>
|
|
378
|
+
<div class="reader-heading">
|
|
379
|
+
<span class="eyebrow">沉浸式阅读预览</span>
|
|
380
|
+
<h1 id="reader-title">阅读预览</h1>
|
|
381
|
+
</div>
|
|
382
|
+
<details id="reader-settings" class="reader-settings">
|
|
383
|
+
<summary>显示设置</summary>
|
|
384
|
+
<div class="reader-settings-panel">
|
|
385
|
+
<label>字号<select id="reader-font-size" aria-label="阅读字号">
|
|
386
|
+
<option value="16">16 像素</option><option value="18">18 像素</option><option value="20">20 像素</option><option value="22">22 像素</option><option value="24">24 像素</option>
|
|
387
|
+
</select></label>
|
|
388
|
+
<label>行距<select id="reader-line-height" aria-label="阅读行距">
|
|
389
|
+
<option value="1.6">紧凑 1.6</option><option value="1.8">适中 1.8</option><option value="1.9">舒展 1.9</option><option value="2">宽松 2.0</option><option value="2.2">宽松 2.2</option>
|
|
390
|
+
</select></label>
|
|
391
|
+
<label>主题<select id="reader-theme" aria-label="阅读主题">
|
|
392
|
+
<option value="paper">纸张</option><option value="light">明亮</option><option value="dark">夜间</option>
|
|
393
|
+
</select></label>
|
|
394
|
+
</div>
|
|
395
|
+
</details>
|
|
396
|
+
<div class="reader-jump-controls" aria-label="阅读导航与模式">
|
|
397
|
+
<label>分卷<select id="reader-volume" aria-label="从分卷开始阅读"></select></label>
|
|
398
|
+
<label>章节<select id="reader-chapter" aria-label="快速跳章"></select></label>
|
|
399
|
+
<label>方式<select id="reader-mode" aria-label="阅读方式"><option value="scroll">连续滚动</option><option value="paged">翻页阅读</option></select></label>
|
|
400
|
+
</div>
|
|
401
|
+
</header>
|
|
402
|
+
<main id="reader-viewport" class="reader-viewport" tabindex="0" aria-describedby="reader-keyboard-hint">
|
|
403
|
+
<article id="reader-document" class="reader-document" aria-live="polite">
|
|
404
|
+
<header class="reader-chapter-header">
|
|
405
|
+
<span id="reader-volume-title" class="eyebrow">正文</span>
|
|
406
|
+
<h2 id="reader-chapter-title">请选择章节</h2>
|
|
407
|
+
<p id="reader-chapter-meta">0 字</p>
|
|
408
|
+
</header>
|
|
409
|
+
<div id="reader-page-shell" class="reader-page-shell">
|
|
410
|
+
<div id="reader-content" class="reader-content"></div>
|
|
411
|
+
</div>
|
|
412
|
+
<div id="reader-continuation" class="reader-continuation">
|
|
413
|
+
<button id="reader-continue" class="ghost-button" type="button">继续下一章</button>
|
|
414
|
+
</div>
|
|
415
|
+
</article>
|
|
416
|
+
</main>
|
|
417
|
+
<footer class="reader-footer">
|
|
418
|
+
<button id="reader-previous" class="ghost-button" type="button">上一章</button>
|
|
419
|
+
<div class="reader-footer-status"><div class="reader-page-actions"><button id="reader-page-previous" class="hidden" type="button" aria-label="上一页">‹</button><strong id="reader-progress" role="status" aria-live="polite">第 0 / 0 章</strong><button id="reader-page-next" class="hidden" type="button" aria-label="下一页">›</button></div><small id="reader-keyboard-hint">Esc 关闭;PageUp/PageDown 或方向键阅读</small></div>
|
|
420
|
+
<button id="reader-next" class="primary-button" type="button">下一章</button>
|
|
421
|
+
</footer>
|
|
422
|
+
</section>
|
|
423
|
+
|
|
348
424
|
<div id="toast-region" class="toast-region" data-position="bottom-right" aria-live="polite" popover="manual"></div>
|
|
349
425
|
<div id="chapter-type-menu" class="chapter-type-menu hidden" role="menu" aria-label="章节操作" data-testid="chapter-type-menu">
|
|
350
426
|
<strong>标记章节</strong>
|
|
@@ -378,10 +454,14 @@
|
|
|
378
454
|
<span>导出 DOCX</span>
|
|
379
455
|
<small>Word 正文;有封面时嵌入为首页</small>
|
|
380
456
|
</button>
|
|
457
|
+
<button type="button" role="menuitem" data-export-format="epub">
|
|
458
|
+
<span>导出 EPUB</span>
|
|
459
|
+
<small>电子书正文;包含元信息、封面和可跳转目录</small>
|
|
460
|
+
</button>
|
|
381
461
|
</div>
|
|
382
462
|
<input id="new-import-file" class="hidden" type="file" accept=".txt,.docx">
|
|
383
463
|
<input id="cover-file" class="hidden" type="file" accept="image/png,image/jpeg,image/webp">
|
|
384
|
-
<input id="avatar-file" class="hidden" type="file" accept="image/png,image/jpeg,image/webp">
|
|
464
|
+
<input id="avatar-file" class="hidden" type="file" accept="image/png,image/jpeg,image/webp,image/gif">
|
|
385
465
|
|
|
386
466
|
<dialog id="background-task-dialog" class="dialog wide-dialog background-task-dialog" aria-labelledby="background-task-dialog-title">
|
|
387
467
|
<form method="dialog">
|
|
@@ -448,7 +528,7 @@
|
|
|
448
528
|
</dialog>
|
|
449
529
|
|
|
450
530
|
<dialog id="chapter-batch-dialog" class="dialog chapter-batch-dialog" aria-labelledby="chapter-batch-title">
|
|
451
|
-
<form id="chapter-batch-form">
|
|
531
|
+
<form id="chapter-batch-form" method="post">
|
|
452
532
|
<div class="dialog-header">
|
|
453
533
|
<div><span class="eyebrow">正文工具</span><h2 id="chapter-batch-title">章节批量管理</h2><p class="dialog-header-meta">选择多个章节后统一移动、修改属性或软删除。</p></div>
|
|
454
534
|
<button id="chapter-batch-close" class="dialog-close" type="button" aria-label="关闭章节批量管理">×</button>
|
|
@@ -508,11 +588,12 @@
|
|
|
508
588
|
</dialog>
|
|
509
589
|
|
|
510
590
|
<section id="entity-editor-view" class="entity-editor-view hidden" aria-label="全屏资料编辑">
|
|
511
|
-
<form id="setting-editor-form" class="entity-editor-page hidden" aria-label="设定编辑器">
|
|
591
|
+
<form id="setting-editor-form" class="entity-editor-page hidden" aria-label="设定编辑器" method="post">
|
|
512
592
|
<header class="entity-editor-header setting-editor-header">
|
|
513
593
|
<button id="setting-editor-back" class="entity-editor-back" type="button">返回设定库</button>
|
|
514
594
|
<div class="entity-editor-heading">
|
|
515
595
|
<span id="setting-editor-eyebrow" class="eyebrow">新建设定</span>
|
|
596
|
+
<span id="setting-editor-version" class="character-version-badge">新档案</span>
|
|
516
597
|
<span id="setting-editor-readonly-badge" class="entity-editor-readonly-badge hidden">只读模式</span>
|
|
517
598
|
<input id="setting-editor-name" class="setting-editor-title-input" name="title" maxlength="200" placeholder="新建设定" aria-label="设定标题">
|
|
518
599
|
<div class="setting-editor-header-fields">
|
|
@@ -541,7 +622,7 @@
|
|
|
541
622
|
</div>
|
|
542
623
|
</form>
|
|
543
624
|
|
|
544
|
-
<form id="character-editor-form" class="entity-editor-page hidden" aria-labelledby="character-editor-title">
|
|
625
|
+
<form id="character-editor-form" class="entity-editor-page hidden" aria-labelledby="character-editor-title" method="post">
|
|
545
626
|
<header class="character-editor-header">
|
|
546
627
|
<button id="character-editor-close" class="entity-editor-back" type="button">返回角色列表</button>
|
|
547
628
|
<div>
|
|
@@ -575,7 +656,7 @@
|
|
|
575
656
|
</footer>
|
|
576
657
|
</form>
|
|
577
658
|
|
|
578
|
-
<form id="knowledge-editor-form" class="entity-editor-page hidden" aria-labelledby="knowledge-editor-title">
|
|
659
|
+
<form id="knowledge-editor-form" class="entity-editor-page hidden" aria-labelledby="knowledge-editor-title" method="post">
|
|
579
660
|
<header class="character-editor-header knowledge-editor-header">
|
|
580
661
|
<button id="knowledge-editor-close" class="entity-editor-back" type="button">返回列表</button>
|
|
581
662
|
<div>
|
|
@@ -595,7 +676,7 @@
|
|
|
595
676
|
<main id="knowledge-editor-fields" class="character-editor-fields"></main>
|
|
596
677
|
</div>
|
|
597
678
|
<footer class="character-editor-actions knowledge-editor-actions">
|
|
598
|
-
<p id="knowledge-editor-footer-note"
|
|
679
|
+
<p id="knowledge-editor-footer-note">保存后继续留在当前页面。</p>
|
|
599
680
|
<div><button id="knowledge-editor-cancel" class="ghost-button" type="button">返回列表</button><button id="knowledge-editor-submit" class="primary-button" type="submit">保存档案</button></div>
|
|
600
681
|
</footer>
|
|
601
682
|
</form>
|
|
@@ -615,7 +696,7 @@
|
|
|
615
696
|
</div>
|
|
616
697
|
<div class="access-dialog-body">
|
|
617
698
|
<form id="search-form" class="search-form">
|
|
618
|
-
<label>关键词<input id="search-query" name="query" type="search" maxlength="
|
|
699
|
+
<label>关键词<input id="search-query" name="query" type="search" maxlength="100" placeholder="搜索正文、设定、人物、时间线、关系、大纲、伏笔或 Agent 历史" required></label>
|
|
619
700
|
<label>资料类型<select id="search-type" name="type">
|
|
620
701
|
<option value="">全部资料</option>
|
|
621
702
|
<option value="chapter">章节</option>
|
|
@@ -640,7 +721,7 @@
|
|
|
640
721
|
</dialog>
|
|
641
722
|
|
|
642
723
|
<dialog id="replace-dialog" class="dialog replace-dialog" aria-labelledby="replace-dialog-title" aria-describedby="replace-dialog-description">
|
|
643
|
-
<form id="replace-form">
|
|
724
|
+
<form id="replace-form" method="post">
|
|
644
725
|
<div class="dialog-header">
|
|
645
726
|
<div><span class="eyebrow">内容工具</span><h2 id="replace-dialog-title">全局替换</h2><p id="replace-dialog-description" class="dialog-header-meta">只处理已保存内容;每个被修改的章节或设定都会保留一个可恢复版本。</p></div>
|
|
646
727
|
<button id="replace-dialog-close" class="dialog-close" aria-label="关闭全局替换" type="button">×</button>
|
|
@@ -734,7 +815,7 @@
|
|
|
734
815
|
<strong>字体预览 Typography 0123</strong>
|
|
735
816
|
<span>中文默认使用黑体,English letters always use monospace.</span>
|
|
736
817
|
<span>第二段用于预览正文的行距与段落密度。</span>
|
|
737
|
-
<span id="font-size-preview">界面 14 px · Agent 对话
|
|
818
|
+
<span id="font-size-preview">界面 14 px · Agent 对话 12 px</span>
|
|
738
819
|
</div>
|
|
739
820
|
</div>
|
|
740
821
|
<div class="dialog-actions">
|
|
@@ -745,11 +826,18 @@
|
|
|
745
826
|
</form>
|
|
746
827
|
</dialog>
|
|
747
828
|
|
|
748
|
-
<dialog id="versions-dialog" class="dialog wide-dialog">
|
|
829
|
+
<dialog id="versions-dialog" class="dialog wide-dialog" aria-labelledby="chapter-versions-title" aria-describedby="chapter-version-diff-summary">
|
|
749
830
|
<div class="dialog-header">
|
|
750
|
-
<div><span class="eyebrow">版本历史</span><h2>章节保存记录</h2></div>
|
|
751
|
-
<button id="versions-close" class="dialog-close" aria-label="
|
|
831
|
+
<div><span class="eyebrow">版本历史</span><h2 id="chapter-versions-title">章节保存记录</h2></div>
|
|
832
|
+
<button id="versions-close" class="dialog-close" aria-label="关闭章节版本历史" type="button">×</button>
|
|
752
833
|
</div>
|
|
834
|
+
<section class="chapter-version-compare" aria-label="选择要比较的章节版本">
|
|
835
|
+
<label>较早内容<select id="chapter-version-before" aria-label="选择比较前的版本"></select></label>
|
|
836
|
+
<button id="chapter-version-compare" class="ghost-button" type="button">比较差异</button>
|
|
837
|
+
<label>较新内容<select id="chapter-version-after" aria-label="选择比较后的版本"></select></label>
|
|
838
|
+
</section>
|
|
839
|
+
<p id="chapter-version-diff-summary" class="chapter-version-diff-summary" aria-live="polite"></p>
|
|
840
|
+
<div id="chapter-version-diff" class="chapter-version-diff" aria-label="逐行差异结果"></div>
|
|
753
841
|
<div id="versions-list" class="versions-list"></div>
|
|
754
842
|
</dialog>
|
|
755
843
|
|
|
@@ -764,14 +852,25 @@
|
|
|
764
852
|
</div>
|
|
765
853
|
</dialog>
|
|
766
854
|
|
|
855
|
+
<dialog id="work-recycle-bin-dialog" class="dialog wide-dialog" aria-labelledby="work-recycle-bin-title" aria-describedby="work-recycle-bin-description">
|
|
856
|
+
<div class="dialog-header">
|
|
857
|
+
<div><span class="eyebrow">作品安全</span><h2 id="work-recycle-bin-title">作品回收站</h2></div>
|
|
858
|
+
<button id="work-recycle-bin-close" class="dialog-close" aria-label="关闭作品回收站" type="button">×</button>
|
|
859
|
+
</div>
|
|
860
|
+
<div class="import-history-body">
|
|
861
|
+
<p id="work-recycle-bin-description" class="import-history-note">删除的作品默认保留 30 天,期间会完整保留正文、层级、设定、关联资料与版本历史。恢复后可继续编辑;彻底删除后无法恢复。</p>
|
|
862
|
+
<div id="work-recycle-bin-list" class="entity-history-list recycle-bin-list" aria-live="polite"></div>
|
|
863
|
+
</div>
|
|
864
|
+
</dialog>
|
|
865
|
+
|
|
767
866
|
<dialog id="chapter-recycle-bin-dialog" class="dialog wide-dialog" aria-labelledby="chapter-recycle-bin-title" aria-describedby="chapter-recycle-bin-description">
|
|
768
867
|
<div class="dialog-header">
|
|
769
|
-
<div><span class="eyebrow">正文安全</span><h2 id="chapter-recycle-bin-title"
|
|
770
|
-
<button id="chapter-recycle-bin-close" class="dialog-close" aria-label="
|
|
868
|
+
<div><span class="eyebrow">正文安全</span><h2 id="chapter-recycle-bin-title">正文回收站</h2></div>
|
|
869
|
+
<button id="chapter-recycle-bin-close" class="dialog-close" aria-label="关闭正文回收站" type="button">×</button>
|
|
771
870
|
</div>
|
|
772
871
|
<div class="import-history-body">
|
|
773
|
-
<p id="chapter-recycle-bin-description" class="import-history-note"
|
|
774
|
-
<div id="chapter-recycle-bin-list" class="entity-history-list" aria-live="polite"></div>
|
|
872
|
+
<p id="chapter-recycle-bin-description" class="import-history-note">删除的分卷与章节默认保留 30 天。分卷会连同其中章节一起恢复;独立章节会恢复到原分卷。彻底删除会清理正文、版本和关联资料,且无法恢复。</p>
|
|
873
|
+
<div id="chapter-recycle-bin-list" class="entity-history-list recycle-bin-list" aria-live="polite"></div>
|
|
775
874
|
</div>
|
|
776
875
|
</dialog>
|
|
777
876
|
|
|
@@ -789,7 +888,7 @@
|
|
|
789
888
|
</dialog>
|
|
790
889
|
|
|
791
890
|
<dialog id="writing-progress-dialog" class="dialog wide-dialog writing-progress-dialog" aria-labelledby="writing-progress-title">
|
|
792
|
-
<form id="writing-goal-form">
|
|
891
|
+
<form id="writing-goal-form" method="post">
|
|
793
892
|
<div class="dialog-header"><div><span class="eyebrow">创作节奏</span><h2 id="writing-progress-title">写作目标与字数趋势</h2><p class="dialog-header-meta">趋势根据正文版本历史重建,软删除章节不会继续计入。</p></div><button id="writing-progress-close" class="dialog-close" aria-label="关闭写作目标" type="button">×</button></div>
|
|
794
893
|
<div class="writing-progress-body">
|
|
795
894
|
<div class="writing-progress-stats"><article><small>当前总字数</small><strong id="writing-current-words">0</strong></article><article><small>今日新增</small><strong id="writing-today-words">0</strong></article><article><small>每日目标完成</small><strong id="writing-daily-completion">0%</strong></article><article><small>总目标完成</small><strong id="writing-total-completion">0%</strong></article></div>
|
|
@@ -802,7 +901,7 @@
|
|
|
802
901
|
|
|
803
902
|
<dialog id="platform-ui-settings-dialog" class="dialog" aria-labelledby="platform-ui-settings-title">
|
|
804
903
|
<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>
|
|
805
|
-
<form id="platform-ui-settings-form">
|
|
904
|
+
<form id="platform-ui-settings-form" method="post">
|
|
806
905
|
<div class="dialog-fields">
|
|
807
906
|
<label>Toast 提示位置<select id="toast-position" name="toastPosition" aria-label="Toast 提示位置"><option value="bottom-right">右下角(默认)</option><option value="top-right">右上角</option></select></label>
|
|
808
907
|
<small>该设置对所有用户生效,保存后的提示会立即显示在新位置。</small>
|
|
@@ -836,6 +935,17 @@
|
|
|
836
935
|
<div class="settings-dialog-header-actions"><button id="s3-backup-settings-return" class="ghost-button settings-parent-button" type="button">返回设置</button><button id="s3-backup-close" class="dialog-close" aria-label="关闭 S3 系统备份" type="button">×</button></div>
|
|
837
936
|
</div>
|
|
838
937
|
<div class="s3-backup-body">
|
|
938
|
+
<fieldset class="s3-backup-encryption" aria-describedby="s3-backup-encryption-description">
|
|
939
|
+
<legend>备份加密</legend>
|
|
940
|
+
<div class="s3-backup-encryption-control">
|
|
941
|
+
<label><input id="s3-backup-encryption-toggle" type="checkbox"><span><strong>使用端到端加密</strong><small id="s3-backup-encryption-description">开启后,数据库快照、CredentialVault 恢复密钥和新上传图片都会先在本机加密。</small></span></label>
|
|
942
|
+
<span id="s3-backup-encryption-status" class="s3-backup-status">正在读取状态</span>
|
|
943
|
+
</div>
|
|
944
|
+
<div id="s3-backup-encryption-warning" class="s3-backup-encryption-warning hidden" role="note">
|
|
945
|
+
<strong>当前备份为明文</strong>
|
|
946
|
+
<p>请将所有 S3 目标桶设置为私有桶,避免数据库、密钥与图片被公开访问。</p>
|
|
947
|
+
</div>
|
|
948
|
+
</fieldset>
|
|
839
949
|
<section class="s3-backup-overview" aria-labelledby="s3-backup-overview-title">
|
|
840
950
|
<div><h3 id="s3-backup-overview-title">备份目标</h3><p id="s3-backup-summary">正在读取备份配置……</p></div>
|
|
841
951
|
<div class="s3-backup-overview-actions"><button id="s3-backup-run-all" class="ghost-button" type="button">立即备份已启用目标</button><button id="s3-backup-add" class="primary-button" type="button">新增目标</button></div>
|
|
@@ -849,7 +959,7 @@
|
|
|
849
959
|
</dialog>
|
|
850
960
|
|
|
851
961
|
<dialog id="s3-backup-target-dialog" class="dialog editor-dialog s3-backup-target-dialog" aria-labelledby="s3-backup-target-title">
|
|
852
|
-
<form id="s3-backup-target-form">
|
|
962
|
+
<form id="s3-backup-target-form" method="post" action="/api/platform/backups/targets">
|
|
853
963
|
<div class="dialog-header"><div><span class="eyebrow">系统备份目标</span><h2 id="s3-backup-target-title">新增 S3 目标</h2><p class="dialog-header-meta">AK 与 SK 会使用系统主密钥加密保存,读取配置时不会回显。</p></div><button id="s3-backup-target-close" class="dialog-close" aria-label="关闭 S3 目标编辑" type="button">×</button></div>
|
|
854
964
|
<div class="dialog-fields s3-backup-target-fields">
|
|
855
965
|
<label>配置名称<input id="s3-backup-name" name="name" maxlength="100" required autocomplete="off" placeholder="例如:异地 MinIO"></label>
|
|
@@ -873,6 +983,16 @@
|
|
|
873
983
|
</form>
|
|
874
984
|
</dialog>
|
|
875
985
|
|
|
986
|
+
<dialog id="s3-backup-key-dialog" class="dialog s3-backup-key-dialog" aria-labelledby="s3-backup-key-title" aria-describedby="s3-backup-key-description">
|
|
987
|
+
<div class="dialog-header"><div><span class="eyebrow">仅显示这一次</span><h2 id="s3-backup-key-title">立即保存备份加密密钥</h2><p id="s3-backup-key-description" class="dialog-header-meta">密钥丢失后,任何人都无法恢复加密备份。请先复制或下载并存放到 Scriverse 设备之外。</p></div></div>
|
|
988
|
+
<div class="s3-backup-key-body">
|
|
989
|
+
<div class="s3-backup-encryption-warning" role="alert"><strong>确认已保存后才会开启加密</strong><p>Scriverse 不会在后续设置页面再次展示这把密钥。刷新页面会放弃此次开启,下次可重新生成;关闭已启用的加密不会清除密钥,以便历史备份继续可恢复。开启加密不会回写桶内已有的明文图片对象,请继续将所有 S3 桶保持为私有桶。</p></div>
|
|
990
|
+
<label>备份加密密钥<textarea id="s3-backup-key-value" rows="3" readonly spellcheck="false" aria-label="备份加密密钥"></textarea></label>
|
|
991
|
+
<div class="s3-backup-key-actions"><button id="s3-backup-key-copy" class="ghost-button" type="button">复制密钥</button><button id="s3-backup-key-download" class="ghost-button" type="button">下载密钥文件</button></div>
|
|
992
|
+
</div>
|
|
993
|
+
<div class="dialog-actions"><button id="s3-backup-key-confirm" class="primary-button" type="button">我已保存</button></div>
|
|
994
|
+
</dialog>
|
|
995
|
+
|
|
876
996
|
<dialog id="account-dialog" class="dialog account-dialog" aria-labelledby="account-dialog-title">
|
|
877
997
|
<div class="dialog-header"><div><span class="eyebrow">个人账户</span><h2 id="account-dialog-title">账户设置</h2></div><button id="account-dialog-close" class="dialog-close" aria-label="关闭" type="button">×</button></div>
|
|
878
998
|
<div class="account-settings-body">
|
|
@@ -880,14 +1000,14 @@
|
|
|
880
1000
|
<header class="account-settings-section-header"><h3 id="profile-settings-title">个人资料</h3><p>用于作品协作和历史记录中的作者标识。</p></header>
|
|
881
1001
|
<div class="avatar-settings">
|
|
882
1002
|
<div id="profile-avatar-preview" class="user-avatar profile-avatar-preview" role="img" aria-label="当前头像"><span class="user-avatar-fallback">作</span></div>
|
|
883
|
-
<div class="avatar-settings-copy"><strong>头像图片</strong><small>支持 PNG、JPEG、WebP,文件不超过
|
|
1003
|
+
<div class="avatar-settings-copy"><strong>头像图片</strong><small>支持 PNG、JPEG、WebP、GIF,文件不超过 2 MB。选择后可框选正方形选区再裁剪上传。</small></div>
|
|
884
1004
|
<div class="avatar-settings-actions"><button id="avatar-upload-button" class="ghost-button" type="button">上传头像</button><button id="avatar-remove-button" class="ghost-button hidden" type="button">移除头像</button></div>
|
|
885
1005
|
</div>
|
|
886
|
-
<form id="profile-form" class="account-settings-form"><label>显示名称<input id="profile-display-name" name="displayName" maxlength="80" required></label><button class="primary-button" type="submit">保存名称</button></form>
|
|
1006
|
+
<form id="profile-form" class="account-settings-form" method="post"><label>显示名称<input id="profile-display-name" name="displayName" maxlength="80" required></label><button class="primary-button" type="submit">保存名称</button></form>
|
|
887
1007
|
</section>
|
|
888
1008
|
<section class="account-settings-section" aria-labelledby="password-settings-title">
|
|
889
1009
|
<header class="account-settings-section-header"><h3 id="password-settings-title">修改密码</h3><p>新密码至少需要 10 个字符。</p></header>
|
|
890
|
-
<form id="password-form" class="account-settings-form password-settings-form"><label>当前密码<input name="currentPassword" type="password" autocomplete="current-password" maxlength="200" required></label><label>新密码<input name="newPassword" type="password" autocomplete="new-password" minlength="10" maxlength="200" required></label><label>确认新密码<input name="passwordConfirmation" type="password" autocomplete="new-password" minlength="10" maxlength="200" required></label><button class="primary-button" type="submit">更新密码</button></form>
|
|
1010
|
+
<form id="password-form" class="account-settings-form password-settings-form" method="post" action="/api/auth/password"><label>当前密码<input name="currentPassword" type="password" autocomplete="current-password" maxlength="200" required></label><label>新密码<input name="newPassword" type="password" autocomplete="new-password" minlength="10" maxlength="200" required></label><label>确认新密码<input name="passwordConfirmation" type="password" autocomplete="new-password" minlength="10" maxlength="200" required></label><button class="primary-button" type="submit">更新密码</button></form>
|
|
891
1011
|
</section>
|
|
892
1012
|
<section class="account-settings-section" aria-labelledby="api-key-settings-title">
|
|
893
1013
|
<header class="account-settings-section-header"><h3 id="api-key-settings-title">CLI API Key</h3><p>用于 CLI 登录。服务端只保存摘要,重置后旧 Key 会立即失效,新 Key 仅显示一次。</p></header>
|
|
@@ -928,6 +1048,10 @@
|
|
|
928
1048
|
<p>预览</p>
|
|
929
1049
|
</aside>
|
|
930
1050
|
</div>
|
|
1051
|
+
<div id="avatar-upload-progress" class="image-upload-progress-panel hidden" role="status" aria-live="polite" aria-busy="true">
|
|
1052
|
+
<div class="image-upload-placeholder-box" aria-hidden="true"><span class="image-upload-placeholder-icon">IMG</span><span class="image-upload-placeholder-shine"></span></div>
|
|
1053
|
+
<div class="image-upload-progress-copy"><strong>正在上传头像</strong><small id="avatar-upload-progress-name"></small><div class="image-upload-progress" data-upload-progress data-upload-progress-label="头像上传进度" style="--upload-progress: 0%"><div class="image-upload-progress-heading"><span data-upload-progress-text>上传中 0%</span><output data-upload-progress-value>0%</output></div><div class="image-upload-progress-track" role="progressbar" aria-label="头像上传进度" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><span data-upload-progress-fill></span></div></div></div>
|
|
1054
|
+
</div>
|
|
931
1055
|
<div class="dialog-actions">
|
|
932
1056
|
<button id="avatar-crop-cancel" class="ghost-button" type="button">取消</button>
|
|
933
1057
|
<button id="avatar-crop-confirm" class="primary-button" type="button">确认裁剪</button>
|
|
@@ -937,7 +1061,7 @@
|
|
|
937
1061
|
<dialog id="members-dialog" class="dialog wide-dialog" aria-labelledby="members-dialog-title">
|
|
938
1062
|
<div class="dialog-header"><div><span id="members-dialog-eyebrow" class="eyebrow">作品权限</span><h2 id="members-dialog-title">成员模块权限</h2></div><div class="settings-dialog-header-actions"><button id="members-settings-return" class="ghost-button settings-parent-button hidden" type="button">返回设置</button><button id="members-dialog-close" class="dialog-close" aria-label="关闭" type="button">×</button></div></div>
|
|
939
1063
|
<div class="access-dialog-body">
|
|
940
|
-
<form id="member-permission-form" class="member-permission-form">
|
|
1064
|
+
<form id="member-permission-form" class="member-permission-form" method="post">
|
|
941
1065
|
<label class="member-person-field">选择成员<select id="member-user-select" required></select><small>先选择已注册用户,再逐项配置模块权限。</small></label>
|
|
942
1066
|
<fieldset id="member-permission-fieldset" disabled>
|
|
943
1067
|
<legend>模块读写权限</legend>
|
|
@@ -993,6 +1117,12 @@
|
|
|
993
1117
|
<button id="ai-history-next" type="button" disabled>下一页</button>
|
|
994
1118
|
</nav>
|
|
995
1119
|
</div>
|
|
1120
|
+
<div id="ai-history-action-menu" class="ai-history-action-menu hidden" role="menu" aria-label="对话操作">
|
|
1121
|
+
<button type="button" role="menuitem" data-ai-history-action="export">
|
|
1122
|
+
<span>导出 Markdown</span>
|
|
1123
|
+
<small>下载当前对话的角色、时间和消息正文</small>
|
|
1124
|
+
</button>
|
|
1125
|
+
</div>
|
|
996
1126
|
</dialog>
|
|
997
1127
|
|
|
998
1128
|
<dialog id="relationship-map-dialog" class="relationship-map-dialog" aria-label="放大人物关系图" data-testid="relationship-map-expanded">
|
|
@@ -1026,6 +1156,6 @@
|
|
|
1026
1156
|
<div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
|
|
1027
1157
|
<script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
|
|
1028
1158
|
<script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
|
|
1029
|
-
<script type="module" src="/app.js?v=
|
|
1159
|
+
<script type="module" src="/app.js?v=20260812-ai-stream-connectivity-global-replace-foreshadow-epub-character-extraction-outline-reader-v1"></script>
|
|
1030
1160
|
</body>
|
|
1031
1161
|
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type OutlineBoardForeshadow = {
|
|
2
|
+
id?: string | null;
|
|
3
|
+
title?: string | null;
|
|
4
|
+
status?: string | null;
|
|
5
|
+
importance?: string | null;
|
|
6
|
+
roles?: string[];
|
|
7
|
+
plannedPayoff?: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type OutlineBoardOutline = {
|
|
11
|
+
goal?: string | null;
|
|
12
|
+
conflict?: string | null;
|
|
13
|
+
turningPoint?: string | null;
|
|
14
|
+
notes?: string | null;
|
|
15
|
+
status?: string | null;
|
|
16
|
+
truncated?: boolean;
|
|
17
|
+
updatedAt?: string | null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type OutlineBoardChapter = {
|
|
21
|
+
id?: string | null;
|
|
22
|
+
title?: string | null;
|
|
23
|
+
chapterType?: string | null;
|
|
24
|
+
sortOrder?: number | null;
|
|
25
|
+
outline?: OutlineBoardOutline | null;
|
|
26
|
+
foreshadows?: OutlineBoardForeshadow[];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type OutlineBoardVolume<T extends OutlineBoardChapter = OutlineBoardChapter> = {
|
|
30
|
+
id?: string | null;
|
|
31
|
+
title?: string | null;
|
|
32
|
+
sortOrder?: number | null;
|
|
33
|
+
chapters?: T[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type OutlineBoard<T extends OutlineBoardChapter = OutlineBoardChapter> = {
|
|
37
|
+
volumes?: Array<OutlineBoardVolume<T>>;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type OutlineBoardState = {
|
|
41
|
+
query: string;
|
|
42
|
+
volumeId: string;
|
|
43
|
+
outlineStatus: "all" | "empty" | "draft" | "ready" | "completed";
|
|
44
|
+
foreshadowStatus: "all" | "none" | "unresolved" | "resolved" | "abandoned";
|
|
45
|
+
sort: "tree" | "status" | "foreshadows" | "title";
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export declare function normalizeOutlineBoardState(value?: Partial<OutlineBoardState>): OutlineBoardState;
|
|
49
|
+
|
|
50
|
+
export declare function prepareOutlineBoard<T extends OutlineBoardChapter>(
|
|
51
|
+
board: OutlineBoard<T> | null | undefined,
|
|
52
|
+
value?: Partial<OutlineBoardState>
|
|
53
|
+
): {
|
|
54
|
+
state: OutlineBoardState;
|
|
55
|
+
volumes: Array<OutlineBoardVolume<T> & { chapters: T[] }>;
|
|
56
|
+
totalChapterCount: number;
|
|
57
|
+
visibleChapterCount: number;
|
|
58
|
+
filtersActive: boolean;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export declare function outlineBoardUnresolvedCount(chapter: OutlineBoardChapter): number;
|