@musnows/scriverse 0.6.7 → 0.6.8

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.
@@ -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=20260801-ui-font-scale-shelf-v3">
13
+ <link rel="stylesheet" href="/styles.css?v=20260802-draft-readonly-v1">
14
14
  </head>
15
15
  <body class="auth-pending">
16
16
  <section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
@@ -102,6 +102,7 @@
102
102
  </button>
103
103
  <button id="settings-button" class="settings-button" type="button" aria-label="设置" title="设置">
104
104
  <svg class="settings-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.09a2 2 0 0 1 1 1.74v.5a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.38a2 2 0 0 0-.73-2.73l-.15-.09a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2Z"/><circle cx="12" cy="12" r="3"/></svg>
105
+ <span class="settings-update-dot hidden" data-settings-update-dot aria-hidden="true"></span>
105
106
  </button>
106
107
  </div>
107
108
  </header>
@@ -219,6 +220,7 @@
219
220
  <footer class="product-footer settings-product-footer" data-product-footer aria-label="叙界项目信息">
220
221
  <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>
221
222
  <span class="product-footer-development hidden" data-product-footer-development>开发模式</span>
223
+ <a class="product-footer-update hidden" data-product-footer-update target="_blank" rel="noopener noreferrer"></a>
222
224
  </footer>
223
225
  </section>
224
226
 
@@ -382,7 +384,7 @@
382
384
  <dialog id="background-task-dialog" class="dialog wide-dialog background-task-dialog" aria-labelledby="background-task-dialog-title">
383
385
  <form method="dialog">
384
386
  <div class="dialog-header">
385
- <div><span class="eyebrow">全局进度</span><h2 id="background-task-dialog-title">后台任务中心</h2><p id="background-task-dialog-meta" class="dialog-header-meta">当前作品的分析任务与索引队列</p></div>
387
+ <div><span class="eyebrow">全局进度</span><h2 id="background-task-dialog-title">后台任务中心</h2><p id="background-task-dialog-meta" class="dialog-header-meta">系统更新与当前作品的分析任务、索引队列</p></div>
386
388
  <button class="dialog-close" value="cancel" aria-label="关闭后台任务中心" type="submit">×</button>
387
389
  </div>
388
390
  <div id="background-task-content" class="background-task-content" role="region" aria-label="后台任务状态"></div>
@@ -951,6 +953,6 @@
951
953
  <div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
952
954
  <script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
953
955
  <script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
954
- <script type="module" src="/app.js?v=20260801-timeline-lifecycle-v1"></script>
956
+ <script type="module" src="/app.js?v=20260802-draft-readonly-v1"></script>
955
957
  </body>
956
958
  </html>
@@ -1,6 +1,7 @@
1
1
  export const MODEL_PURPOSE_OPTIONS: ReadonlyArray<readonly [string, string]>;
2
2
  export const MIN_MODEL_CONTEXT_WINDOW: number;
3
3
  export const RECOMMENDED_MODEL_CONTEXT_WINDOW: number;
4
+ export function supportsMultimodalModelProtocol(protocol: string | null | undefined): boolean;
4
5
 
5
6
  export type ModelFormValues = {
6
7
  displayName: string;
@@ -10,6 +11,8 @@ export type ModelFormValues = {
10
11
  temperature: number;
11
12
  maxTokens: number;
12
13
  thinkingEnabled: boolean;
14
+ multimodalEnabled: boolean;
15
+ imageToolDefault: boolean;
13
16
  enabled: boolean;
14
17
  };
15
18
 
@@ -12,6 +12,10 @@ export const MODEL_PURPOSE_OPTIONS = Object.freeze([
12
12
  export const MIN_MODEL_CONTEXT_WINDOW = 32_768;
13
13
  export const RECOMMENDED_MODEL_CONTEXT_WINDOW = 128_000;
14
14
 
15
+ export function supportsMultimodalModelProtocol(protocol) {
16
+ return protocol === "openai-chat-completions";
17
+ }
18
+
15
19
  const purposeAliases = new Map([
16
20
  ...MODEL_PURPOSE_OPTIONS.flatMap(([key, label]) => [[key, key], [label, key]]),
17
21
  ["章节分析", "chapter-analysis"],
@@ -52,6 +56,8 @@ export function modelFormValues(model = null) {
52
56
  : (configuredTemperature ?? 0.7),
53
57
  maxTokens: model?.preset?.max_tokens ?? 32000,
54
58
  thinkingEnabled: model?.thinkingEnabled ?? true,
59
+ multimodalEnabled: model?.multimodalEnabled ?? false,
60
+ imageToolDefault: model?.imageToolDefault ?? false,
55
61
  enabled: model?.enabled ?? true
56
62
  };
57
63
  }
@@ -69,6 +75,8 @@ export function modelPayload(values, existingPreset = {}) {
69
75
  max_tokens: Number(values.maxTokens)
70
76
  },
71
77
  thinkingEnabled: Boolean(values.thinkingEnabled),
78
+ multimodalEnabled: Boolean(values.multimodalEnabled),
79
+ imageToolDefault: Boolean(values.imageToolDefault),
72
80
  enabled: Boolean(values.enabled)
73
81
  };
74
82
  }
@@ -400,6 +400,7 @@ input[type="checkbox"][hidden] { display: none; }
400
400
  .presence-person-copy small { margin-top: 3px; color: var(--muted); font-size: 10px; }
401
401
  .presence-same-page { color: var(--accent-dark); font-size: 9px; white-space: nowrap; }
402
402
  .theme-toggle, .settings-button, .topbar-icon-button {
403
+ position: relative;
403
404
  display: grid;
404
405
  flex: 0 0 34px;
405
406
  place-items: center;
@@ -411,6 +412,16 @@ input[type="checkbox"][hidden] { display: none; }
411
412
  background: transparent;
412
413
  color: var(--muted);
413
414
  }
415
+ .settings-update-dot {
416
+ position: absolute;
417
+ top: -2px;
418
+ right: -2px;
419
+ width: 9px;
420
+ height: 9px;
421
+ border: 2px solid var(--paper);
422
+ border-radius: 50%;
423
+ background: #d9363e;
424
+ }
414
425
  .theme-toggle:hover, .theme-toggle:focus-visible,
415
426
  .settings-button:hover, .settings-button:focus-visible, .settings-button[aria-current="page"],
416
427
  .topbar-icon-button:hover, .topbar-icon-button:focus-visible {
@@ -720,6 +731,8 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
720
731
  .product-footer a { color: inherit; text-decoration: none; text-underline-offset: 3px; transition: color .14s ease; }
721
732
  .product-footer a:hover, .product-footer a:focus-visible { color: var(--accent-dark); text-decoration: underline; }
722
733
  .product-footer-development { padding: 2px 8px; border: 1px solid color-mix(in srgb, var(--accent) 48%, var(--line)); border-radius: 999px; background: color-mix(in srgb, var(--accent) 10%, transparent); color: var(--accent-dark); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 9px; font-weight: 700; letter-spacing: .05em; }
734
+ .product-footer .product-footer-update { padding: 2px 8px; border: 1px solid color-mix(in srgb, var(--accent) 55%, var(--line)); border-radius: 999px; background: color-mix(in srgb, var(--accent) 9%, transparent); color: var(--accent-dark); font-weight: 700; }
735
+ .product-footer .product-footer-update:hover, .product-footer .product-footer-update:focus-visible { color: var(--accent-dark); }
723
736
  .auth-product-footer { align-self: end; max-width: 440px; margin: 0; padding-top: 14px; }
724
737
  .settings-product-footer { max-width: 1000px; }
725
738
  .access-dialog-body { display: grid; gap: 16px; max-height: calc(88vh - 82px); overflow-y: auto; padding: 18px 24px 22px; }
@@ -1268,6 +1281,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1268
1281
  .module-header h1 { margin: 0 0 6px; font-weight: 500; font-size: 24px; line-height: 1.25; }
1269
1282
  .module-header p { margin: 0; color: var(--muted); font-size: 13px; }
1270
1283
  .module-content { padding: 24px 0 80px; }
1284
+ #platform-ai-content { width: 100%; max-width: 1400px; margin-inline: auto; }
1271
1285
  .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 13px; }
1272
1286
  .record-card { position: relative; border: 1px solid var(--line); background: var(--surface-soft); padding: 18px; min-height: 130px; border-radius: 4px; }
1273
1287
  .record-card.has-card-edit h3 { padding-right: 34px; }
@@ -1411,6 +1425,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1411
1425
  .config-section { margin-top: 28px; padding-top: 24px; border-top: 1px solid var(--line); }
1412
1426
  .config-section:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
1413
1427
  .platform-system-prompt-section { margin-bottom: 36px; }
1428
+ .platform-image-tool-section { margin-bottom: 0; }
1429
+ .platform-image-tool-panel { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; padding: 16px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
1430
+ .platform-image-tool-field { display: grid; flex: 1 1 360px; gap: 7px; min-width: 0; color: var(--muted); font-size: 10px; }
1431
+ .platform-image-tool-field select { width: 100%; height: 36px; min-height: 36px; padding: 8px 10px; font-size: 12px; }
1432
+ .platform-image-tool-panel .config-save-button { flex: 0 0 auto; min-height: 36px; padding: 8px 14px; }
1414
1433
  .task-auto-run-panel {
1415
1434
  display: grid;
1416
1435
  grid-template-columns: minmax(0, 1fr) 148px;
@@ -2147,6 +2166,13 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2147
2166
  .config-section .config-save-button { min-height: 32px; padding: 5px 11px; font-size: 11px; }
2148
2167
  .config-section .card-actions { margin-top: 12px; }
2149
2168
  .config-section .card-actions .config-save-button { border: 1px solid var(--line); background: transparent; color: var(--ink); }
2169
+ .platform-image-tool-panel .config-save-button:hover, .platform-image-tool-panel .config-save-button:focus-visible { border-color: var(--accent); background: var(--paper-deep); color: var(--accent-dark); }
2170
+ @media (max-width: 850px) {
2171
+ .platform-image-tool-panel { align-items: stretch; flex-direction: column; }
2172
+ .platform-image-tool-field { flex: 0 0 auto; }
2173
+ .platform-image-tool-field select, .platform-image-tool-panel .config-save-button { height: 40px; min-height: 40px; }
2174
+ .platform-image-tool-panel .config-save-button { width: 100%; }
2175
+ }
2150
2176
  .field-label textarea {
2151
2177
  width: 100%;
2152
2178
  min-height: 140px;
@@ -2243,8 +2269,9 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2243
2269
  .ai-tool-call-detail section { min-width: 0; }
2244
2270
  .ai-tool-call-detail h3 { margin: 0 0 7px; color: var(--muted); font-size: 10px; font-weight: 600; }
2245
2271
  .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; }
2272
+ #ai-tool-call-arguments { min-height: 0; max-height: 26vh; }
2246
2273
  .ai-tool-call-detail section:last-child pre { min-height: 180px; }
2247
- @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; } }
2274
+ @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-arguments { min-height: 0; max-height: 20vh; }.ai-tool-call-detail section:last-child pre { min-height: 140px; } }
2248
2275
  .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); }
2249
2276
  .guard-card.warning { border-left-color: #c07b31; }.guard-card.failed { border-left-color: var(--accent); }
2250
2277
  .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); }
@@ -2500,6 +2527,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2500
2527
  .background-task-row > div small { color: var(--muted); font-size: 9px; }
2501
2528
  .background-task-row .task-status-badge { min-height: 24px; padding: 3px 8px; font-size: 9px; }
2502
2529
  .background-task-row .ghost-button { min-height: 30px; padding: 5px 9px; font-size: 10px; }
2530
+ .background-update-link { display: grid; place-items: center; text-decoration: none; }
2531
+ .background-task-action-placeholder { width: 42px; }
2503
2532
  .background-task-progress { color: var(--muted); font-family: var(--font-latin), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 10px; text-align: right; }
2504
2533
  .background-task-empty, .background-task-error { margin: 0; padding: 12px; color: var(--muted); font-size: 10px; text-align: center; }
2505
2534
  .background-task-error { border-left: 3px solid var(--accent); background: color-mix(in srgb, var(--accent) 6%, var(--surface)); color: var(--accent-dark); text-align: left; }
@@ -2507,6 +2536,16 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2507
2536
  .background-task-actions #background-task-open-analysis { margin-right: auto; }
2508
2537
  .merge-dialog-note { margin: 0; padding: 10px 12px; border-left: 2px solid var(--accent); background: var(--surface-soft); color: var(--muted); font-size: 11px; line-height: 1.6; }
2509
2538
  .form-field { display: grid; gap: 6px; color: var(--muted); font-size: 11px; }
2539
+ .model-multimodal-fields { gap: 9px; padding: 12px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
2540
+ .model-multimodal-heading { color: var(--ink); font-size: 12px; font-weight: 600; }
2541
+ .model-multimodal-fields .model-capability-option { display: grid !important; grid-template-columns: 16px minmax(0, 1fr); align-items: start; gap: 9px; margin: 0; padding: 10px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface); color: var(--ink) !important; transition: border-color .15s ease, background-color .15s ease; }
2542
+ .model-multimodal-fields .model-capability-option[hidden], .model-multimodal-fields .model-capability-option.hidden { display: none !important; }
2543
+ .model-capability-option > input { width: 16px !important; min-width: 16px; margin-top: 2px; }
2544
+ .model-capability-option > span { display: grid; gap: 4px; min-width: 0; }
2545
+ .model-capability-option strong { color: var(--ink); font-size: 11px; font-weight: 600; }
2546
+ .model-capability-option small, .model-multimodal-note { color: var(--muted); font-size: 9px; line-height: 1.5; }
2547
+ .model-capability-option:has(input:checked) { border-color: color-mix(in srgb, var(--accent) 62%, var(--line)); background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }
2548
+ .model-multimodal-note { margin: 0 2px; }
2510
2549
  .analysis-type-description { margin: 0; color: var(--muted); font-size: 10px; line-height: 1.55; }
2511
2550
  .task-chapter-field { transition: opacity .15s ease; }
2512
2551
  .task-chapter-field.is-disabled { opacity: .48; }
@@ -2727,6 +2766,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2727
2766
  .setting-editor-content { height: 100%; min-height: 0; padding: 16px clamp(16px, 2vw, 32px) 24px; overflow: hidden; }
2728
2767
  .setting-markdown-field { display: grid; grid-template-rows: minmax(0, 1fr); height: 100%; min-height: 0; }
2729
2768
  .entity-editor-page.is-read-only .vditor-ir pre.vditor-reset[contenteditable="false"], .entity-editor-page.is-read-only .vditor-wysiwyg pre.vditor-reset[contenteditable="false"], .entity-editor-page.is-read-only .vditor-sv[contenteditable="false"] { opacity: 1; cursor: default; }
2769
+ .markdown-editor-field.is-read-only .vditor-ir pre.vditor-reset[contenteditable="false"], .markdown-editor-field.is-read-only .vditor-wysiwyg pre.vditor-reset[contenteditable="false"], .markdown-editor-field.is-read-only .vditor-sv[contenteditable="false"] { opacity: 1; cursor: default; }
2730
2770
  .setting-markdown-heading, .markdown-editor-field-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 24px; color: var(--ink); font-size: 14px; }
2731
2771
  .setting-markdown-heading small, .markdown-editor-field-heading small { color: var(--muted); font-size: 10px; }
2732
2772
  .markdown-editor-field { display: grid; gap: 10px; min-width: 0; }
@@ -2753,6 +2793,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2753
2793
  .vditor-editor-host.vditor--dark .vditor-reset table tr { background: var(--surface); border-top-color: var(--line); }
2754
2794
  .vditor-editor-host.vditor--dark .vditor-reset table td, .vditor-editor-host.vditor--dark .vditor-reset table th { border-color: var(--line); color: var(--ink); }
2755
2795
  .vditor-editor-host.vditor--dark .vditor-reset table tbody tr:nth-child(2n) { background: var(--surface-soft); }
2796
+ .editor-dialog .dialog-fields input[readonly], .editor-dialog .dialog-fields textarea[readonly], .editor-dialog .dialog-fields select:disabled { color: var(--ink); -webkit-text-fill-color: var(--ink); opacity: 1; cursor: default; }
2756
2797
  .record-markdown-preview { display: -webkit-box; margin: 12px 0 8px; overflow: hidden; overflow-wrap: anywhere; color: var(--ink); font-size: 12px; line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 12; }
2757
2798
  .record-markdown-preview > :first-child, .knowledge-markdown-block .message-body > :first-child { margin-top: 0; }
2758
2799
  .record-markdown-preview > :last-child, .knowledge-markdown-block .message-body > :last-child { margin-bottom: 0; }
@@ -0,0 +1,170 @@
1
+ const githubLatestReleaseUrl = "https://api.github.com/repos/musnows/Scriverse/releases/latest";
2
+ const githubReleasePathPrefix = "/musnows/Scriverse/releases/";
3
+ const minutesToMilliseconds = 60 * 1000;
4
+ const secondsToMilliseconds = 1000;
5
+ export const defaultReleaseCheckIntervalMs = 60 * minutesToMilliseconds;
6
+ export const minimumReleaseCheckIntervalMs = 10 * minutesToMilliseconds;
7
+ export const maximumReleaseCheckIntervalMs = 7 * 24 * 60 * minutesToMilliseconds;
8
+ export const defaultReleaseCheckTimeoutMs = 90 * secondsToMilliseconds;
9
+ export const maximumReleaseCheckTimeoutMs = 300 * secondsToMilliseconds;
10
+ export const defaultReleaseCheckRetries = 1;
11
+ export const maximumReleaseCheckRetries = 5;
12
+ export function resolveReleaseCheckIntervalMs(value) {
13
+ if (value === undefined || value.trim() === "")
14
+ return defaultReleaseCheckIntervalMs;
15
+ const minutes = Number(value);
16
+ if (!Number.isFinite(minutes))
17
+ return defaultReleaseCheckIntervalMs;
18
+ if (minutes === 0)
19
+ return 0;
20
+ return Math.min(maximumReleaseCheckIntervalMs, Math.max(minimumReleaseCheckIntervalMs, Math.round(minutes * minutesToMilliseconds)));
21
+ }
22
+ export function resolveReleaseCheckTimeoutMs(value) {
23
+ if (value === undefined || value.trim() === "")
24
+ return defaultReleaseCheckTimeoutMs;
25
+ const seconds = Number(value);
26
+ if (!Number.isFinite(seconds) || seconds <= 0)
27
+ return defaultReleaseCheckTimeoutMs;
28
+ return Math.min(maximumReleaseCheckTimeoutMs, Math.round(seconds * secondsToMilliseconds));
29
+ }
30
+ export function resolveReleaseCheckRetries(value) {
31
+ if (value === undefined || value.trim() === "")
32
+ return defaultReleaseCheckRetries;
33
+ const retries = Number(value);
34
+ if (!Number.isFinite(retries) || retries < 0)
35
+ return defaultReleaseCheckRetries;
36
+ return Math.min(maximumReleaseCheckRetries, Math.floor(retries));
37
+ }
38
+ function parseVersion(value) {
39
+ const match = value.trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u);
40
+ if (!match)
41
+ return null;
42
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
43
+ }
44
+ export function isNewerRelease(currentVersion, candidateVersion) {
45
+ const current = parseVersion(currentVersion);
46
+ const candidate = parseVersion(candidateVersion);
47
+ if (!current || !candidate)
48
+ return false;
49
+ for (let index = 0; index < current.length; index += 1) {
50
+ const currentPart = current[index];
51
+ const candidatePart = candidate[index];
52
+ if (candidatePart !== currentPart)
53
+ return candidatePart > currentPart;
54
+ }
55
+ return false;
56
+ }
57
+ function validatedReleaseUrl(value) {
58
+ if (typeof value !== "string")
59
+ return null;
60
+ try {
61
+ const url = new URL(value);
62
+ if (url.protocol !== "https:" || url.hostname !== "github.com")
63
+ return null;
64
+ if (!url.pathname.toLocaleLowerCase().startsWith(githubReleasePathPrefix.toLocaleLowerCase()))
65
+ return null;
66
+ return url.toString();
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ export class ReleaseUpdateChecker {
73
+ currentVersion;
74
+ fetchImpl;
75
+ intervalMs;
76
+ timeoutMs;
77
+ retries;
78
+ now;
79
+ cached = null;
80
+ inFlight = null;
81
+ constructor(currentVersion, fetchImpl = fetch, options = {}) {
82
+ this.currentVersion = currentVersion;
83
+ this.fetchImpl = fetchImpl;
84
+ const configuredIntervalMs = options.intervalMs ?? defaultReleaseCheckIntervalMs;
85
+ this.intervalMs = configuredIntervalMs === 0
86
+ ? 0
87
+ : Math.min(maximumReleaseCheckIntervalMs, Math.max(minimumReleaseCheckIntervalMs, Number.isFinite(configuredIntervalMs) ? Math.round(configuredIntervalMs) : defaultReleaseCheckIntervalMs));
88
+ this.timeoutMs = Math.max(secondsToMilliseconds, Math.min(maximumReleaseCheckTimeoutMs, options.timeoutMs ?? defaultReleaseCheckTimeoutMs));
89
+ this.retries = Math.min(maximumReleaseCheckRetries, Math.max(0, Math.floor(options.retries ?? defaultReleaseCheckRetries)));
90
+ this.now = options.now ?? Date.now;
91
+ }
92
+ check() {
93
+ if (this.intervalMs === 0) {
94
+ return Promise.resolve({
95
+ enabled: false,
96
+ checked: false,
97
+ updateAvailable: false,
98
+ currentVersion: this.currentVersion
99
+ });
100
+ }
101
+ if (this.cached && this.cached.expiresAt > this.now())
102
+ return Promise.resolve(this.cached.result);
103
+ if (this.inFlight)
104
+ return this.inFlight;
105
+ this.inFlight = this.fetchLatestRelease().then((result) => {
106
+ const checkedAt = this.now();
107
+ const scheduledResult = {
108
+ ...result,
109
+ checkedAt: new Date(checkedAt).toISOString(),
110
+ nextCheckAt: new Date(checkedAt + this.intervalMs).toISOString()
111
+ };
112
+ this.cached = {
113
+ expiresAt: checkedAt + this.intervalMs,
114
+ result: scheduledResult
115
+ };
116
+ return scheduledResult;
117
+ }).finally(() => {
118
+ this.inFlight = null;
119
+ });
120
+ return this.inFlight;
121
+ }
122
+ async fetchLatestRelease() {
123
+ const unavailable = {
124
+ enabled: true,
125
+ checked: false,
126
+ updateAvailable: false,
127
+ currentVersion: this.currentVersion
128
+ };
129
+ for (let attempt = 0; attempt <= this.retries; attempt += 1) {
130
+ try {
131
+ const response = await this.fetchImpl(githubLatestReleaseUrl, {
132
+ headers: {
133
+ Accept: "application/vnd.github+json",
134
+ "User-Agent": "Scriverse-Update-Checker",
135
+ "X-GitHub-Api-Version": "2022-11-28"
136
+ },
137
+ signal: AbortSignal.timeout(this.timeoutMs)
138
+ });
139
+ if (!response.ok)
140
+ continue;
141
+ const payload = await response.json();
142
+ if (!payload || typeof payload !== "object" || Array.isArray(payload))
143
+ continue;
144
+ const release = payload;
145
+ if (typeof release.tag_name !== "string")
146
+ continue;
147
+ const releaseUrl = validatedReleaseUrl(release.html_url);
148
+ if (!releaseUrl)
149
+ continue;
150
+ const latestVersion = release.tag_name.trim().replace(/^v/u, "");
151
+ if (!parseVersion(latestVersion))
152
+ continue;
153
+ const updateAvailable = isNewerRelease(this.currentVersion, latestVersion);
154
+ return {
155
+ enabled: true,
156
+ checked: true,
157
+ updateAvailable,
158
+ currentVersion: this.currentVersion,
159
+ latestVersion,
160
+ ...(updateAvailable ? { releaseUrl } : {})
161
+ };
162
+ }
163
+ catch {
164
+ // 网络错误和超时由内部重试处理,耗尽次数后静默返回未探测状态
165
+ }
166
+ }
167
+ return unavailable;
168
+ }
169
+ }
170
+ //# sourceMappingURL=release-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-update.js","sourceRoot":"","sources":["../src/release-update.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { DATABASE_SCHEMA_VERSION, readDatabaseSchemaVersion } from "./database.j
6
6
  import { loadMasterSecret } from "./credential-vault.js";
7
7
  import { isDevelopmentAuthBypassEnabled, resolveRuntimeSecurity } from "./security.js";
8
8
  import { logger, sanitizeError } from "./logger.js";
9
+ import { resolveReleaseCheckIntervalMs, resolveReleaseCheckRetries, resolveReleaseCheckTimeoutMs } from "./release-update.js";
9
10
  const publicPath = fileURLToPath(new URL("./public/", import.meta.url));
10
11
  export function isDevelopmentServer(environment) {
11
12
  return environment.NODE_ENV === "development" || environment.npm_lifecycle_event === "dev";
@@ -77,7 +78,10 @@ export async function startLocalServer(options) {
77
78
  security,
78
79
  disableUserAuth: devAuthBypass,
79
80
  devAuthBypass,
80
- developmentServer: isDevelopmentServer(options.env)
81
+ developmentServer: isDevelopmentServer(options.env),
82
+ releaseCheckIntervalMs: resolveReleaseCheckIntervalMs(options.env.APP_UPDATE_CHECK_INTERVAL_MINUTES),
83
+ releaseCheckTimeoutMs: resolveReleaseCheckTimeoutMs(options.env.APP_UPDATE_CHECK_TIMEOUT_SECONDS),
84
+ releaseCheckRetries: resolveReleaseCheckRetries(options.env.APP_UPDATE_CHECK_RETRIES)
81
85
  });
82
86
  await runtime.cleanupAttachments();
83
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-runtime.js","sourceRoot":"","sources":["../src/server-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-runtime.js","sourceRoot":"","sources":["../src/server-runtime.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -16,7 +16,8 @@ export const WORK_AGENT_TOOL_IDS = [
16
16
  "grep",
17
17
  "search_story_entities",
18
18
  "read_character_sections",
19
- "search_drafts"
19
+ "search_drafts",
20
+ "image"
20
21
  ];
21
22
  const DEFAULT_WORK_AGENT_TOOLS = [...WORK_AGENT_TOOL_IDS];
22
23
  export function normalizeWorkAgentTools(value) {
@@ -681,13 +682,20 @@ export class Store {
681
682
  const row = this.db.get("SELECT * FROM platform_ai_settings WHERE id = 1");
682
683
  return {
683
684
  systemPrompt: String(row?.system_prompt ?? ""),
685
+ imageToolModelId: row?.image_tool_model_id === null || row?.image_tool_model_id === undefined
686
+ ? null
687
+ : String(row.image_tool_model_id),
684
688
  updatedAt: String(row?.updated_at ?? "")
685
689
  };
686
690
  }
687
691
  updatePlatformAiSettings(input) {
688
692
  const timestamp = now();
689
- this.db.run(`INSERT INTO platform_ai_settings (id, system_prompt, updated_at) VALUES (1, ?, ?)
690
- ON CONFLICT(id) DO UPDATE SET system_prompt = excluded.system_prompt, updated_at = excluded.updated_at`, input.systemPrompt ?? String(this.getPlatformAiSettings().systemPrompt), timestamp);
693
+ const current = this.getPlatformAiSettings();
694
+ this.db.run(`INSERT INTO platform_ai_settings (id, system_prompt, image_tool_model_id, updated_at) VALUES (1, ?, ?, ?)
695
+ ON CONFLICT(id) DO UPDATE SET system_prompt = excluded.system_prompt,
696
+ image_tool_model_id = excluded.image_tool_model_id, updated_at = excluded.updated_at`, input.systemPrompt ?? String(current.systemPrompt), input.imageToolModelId === undefined
697
+ ? (current.imageToolModelId === null ? null : String(current.imageToolModelId))
698
+ : input.imageToolModelId, timestamp);
691
699
  return this.getPlatformAiSettings();
692
700
  }
693
701
  getPlatformUiSettings() {
@@ -754,6 +762,9 @@ export class Store {
754
762
  agentToolCallLimit: Math.min(48, Math.max(5, Number(row?.agent_tool_call_limit ?? 12) || 12)),
755
763
  agentToolCallGlobalMultiplier: Math.min(6, Math.max(1, Number(row?.agent_tool_call_global_multiplier ?? 3) || 3)),
756
764
  agentTools: normalizeWorkAgentTools(row?.agent_tools_json),
765
+ imageToolModelId: row?.image_tool_model_id === null || row?.image_tool_model_id === undefined
766
+ ? null
767
+ : String(row.image_tool_model_id),
757
768
  alwaysIncludeSettingInfo: Number(row?.always_include_setting_info ?? 0) === 1,
758
769
  titleGenerationModelId: row?.title_generation_model_id === null || row?.title_generation_model_id === undefined
759
770
  ? null
@@ -779,6 +790,9 @@ export class Store {
779
790
  const nextAgentToolCallLimit = input.agentToolCallLimit ?? Number(current.agentToolCallLimit);
780
791
  const nextAgentToolCallGlobalMultiplier = input.agentToolCallGlobalMultiplier ?? Number(current.agentToolCallGlobalMultiplier);
781
792
  const nextAgentTools = normalizeWorkAgentTools(input.agentTools ?? current.agentTools);
793
+ const nextImageToolModelId = input.imageToolModelId === undefined
794
+ ? (current.imageToolModelId ? String(current.imageToolModelId) : null)
795
+ : input.imageToolModelId?.trim() || null;
782
796
  const nextAlwaysIncludeSettingInfo = input.alwaysIncludeSettingInfo ?? Boolean(current.alwaysIncludeSettingInfo);
783
797
  const nextTitleGenerationModelId = input.titleGenerationModelId === undefined
784
798
  ? (current.titleGenerationModelId ? String(current.titleGenerationModelId) : null)
@@ -788,8 +802,8 @@ export class Store {
788
802
  auto_run_daily_task_limit, auto_run_failure_threshold, auto_run_paused, auto_run_pause_reason,
789
803
  auto_run_resume_at, auto_run_consecutive_failures, book_summary_context_percent,
790
804
  context_compact_threshold, agent_tool_call_limit, agent_tool_call_global_multiplier,
791
- agent_tools_json, title_generation_model_id, always_include_setting_info, updated_at
792
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
805
+ agent_tools_json, title_generation_model_id, image_tool_model_id, always_include_setting_info, updated_at
806
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
793
807
  ON CONFLICT(work_id) DO UPDATE SET
794
808
  system_prompt = excluded.system_prompt,
795
809
  daily_token_quota = excluded.daily_token_quota,
@@ -808,8 +822,9 @@ export class Store {
808
822
  agent_tool_call_global_multiplier = excluded.agent_tool_call_global_multiplier,
809
823
  agent_tools_json = excluded.agent_tools_json,
810
824
  title_generation_model_id = excluded.title_generation_model_id,
825
+ image_tool_model_id = excluded.image_tool_model_id,
811
826
  always_include_setting_info = excluded.always_include_setting_info,
812
- updated_at = excluded.updated_at`, workId, nextPrompt, nextDailyTokenQuota, nextEnabled ? 1 : 0, Math.min(8, Math.max(1, nextConcurrency)), Math.min(200, Math.max(1, nextBatchLimit)), Math.min(10_000, Math.max(0, nextDailyTaskLimit)), Math.min(10, Math.max(1, nextFailureThreshold)), current.autoRunPaused ? 1 : 0, String(current.autoRunPauseReason ?? ""), current.autoRunResumeAt === null ? null : String(current.autoRunResumeAt), Math.max(0, Number(current.autoRunConsecutiveFailures) || 0), Math.min(90, Math.max(1, nextBookSummaryContextPercent)), Math.min(90, Math.max(50, nextContextCompactThreshold)), Math.min(48, Math.max(5, nextAgentToolCallLimit)), Math.min(6, Math.max(1, nextAgentToolCallGlobalMultiplier)), JSON.stringify(nextAgentTools), nextTitleGenerationModelId, nextAlwaysIncludeSettingInfo ? 1 : 0, timestamp);
827
+ updated_at = excluded.updated_at`, workId, nextPrompt, nextDailyTokenQuota, nextEnabled ? 1 : 0, Math.min(8, Math.max(1, nextConcurrency)), Math.min(200, Math.max(1, nextBatchLimit)), Math.min(10_000, Math.max(0, nextDailyTaskLimit)), Math.min(10, Math.max(1, nextFailureThreshold)), current.autoRunPaused ? 1 : 0, String(current.autoRunPauseReason ?? ""), current.autoRunResumeAt === null ? null : String(current.autoRunResumeAt), Math.max(0, Number(current.autoRunConsecutiveFailures) || 0), Math.min(90, Math.max(1, nextBookSummaryContextPercent)), Math.min(90, Math.max(50, nextContextCompactThreshold)), Math.min(48, Math.max(5, nextAgentToolCallLimit)), Math.min(6, Math.max(1, nextAgentToolCallGlobalMultiplier)), JSON.stringify(nextAgentTools), nextTitleGenerationModelId, nextImageToolModelId, nextAlwaysIncludeSettingInfo ? 1 : 0, timestamp);
813
828
  this.audit(workId, "work.ai-settings.updated", "work-ai-settings", workId, {
814
829
  systemPromptChanged: input.systemPrompt !== undefined,
815
830
  dailyTokenQuota: nextDailyTokenQuota,
@@ -823,6 +838,7 @@ export class Store {
823
838
  agentToolCallLimit: Math.min(48, Math.max(5, nextAgentToolCallLimit)),
824
839
  agentToolCallGlobalMultiplier: Math.min(6, Math.max(1, nextAgentToolCallGlobalMultiplier)),
825
840
  agentTools: nextAgentTools,
841
+ imageToolModelId: nextImageToolModelId,
826
842
  alwaysIncludeSettingInfo: nextAlwaysIncludeSettingInfo,
827
843
  titleGenerationModelId: nextTitleGenerationModelId
828
844
  });
@@ -3425,6 +3441,16 @@ export class Store {
3425
3441
  throw notFound("附件");
3426
3442
  return this.mapAttachment(row);
3427
3443
  }
3444
+ getSettingAttachment(workId, attachmentId) {
3445
+ const row = this.db.get(`SELECT attachment.*
3446
+ FROM attachments attachment
3447
+ JOIN attachment_references reference ON reference.attachment_id = attachment.id
3448
+ WHERE attachment.id = ? AND attachment.work_id = ? AND reference.work_id = ? AND reference.entity_type = 'setting'
3449
+ LIMIT 1`, attachmentId, workId, workId);
3450
+ if (!row)
3451
+ throw new AppError(404, "SETTING_IMAGE_ATTACHMENT_NOT_FOUND", "图片附件不存在或未被设定正文引用");
3452
+ return this.mapAttachment(row);
3453
+ }
3428
3454
  attachmentModules(attachmentId) {
3429
3455
  this.getAttachment(attachmentId);
3430
3456
  const modules = new Set();