@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.
- package/dist/ai-protocol.js +5 -1
- package/dist/ai-protocol.js.map +1 -1
- package/dist/ai.js +390 -27
- package/dist/ai.js.map +1 -1
- package/dist/app.js +25 -5
- package/dist/app.js.map +1 -1
- package/dist/database.js +43 -2
- package/dist/database.js.map +1 -1
- package/dist/public/app.js +275 -78
- package/dist/public/index.html +5 -3
- package/dist/public/model-config.d.ts +3 -0
- package/dist/public/model-config.js +8 -0
- package/dist/public/styles.css +42 -1
- package/dist/release-update.js +170 -0
- package/dist/release-update.js.map +1 -0
- package/dist/server-runtime.js +5 -1
- package/dist/server-runtime.js.map +1 -1
- package/dist/store.js +32 -6
- package/dist/store.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
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=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"
|
|
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=
|
|
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
|
}
|
package/dist/public/styles.css
CHANGED
|
@@ -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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"}
|
package/dist/server-runtime.js
CHANGED
|
@@ -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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAA+B,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
-
|
|
690
|
-
|
|
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();
|