@musnows/scriverse 0.6.11 → 0.6.13

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=20260805-ai-tool-call-settings-v7">
13
+ <link rel="stylesheet" href="/styles.css?v=20260807-task-reference-links-v1">
14
14
  </head>
15
15
  <body class="auth-pending">
16
16
  <section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
@@ -998,6 +998,6 @@
998
998
  <div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
999
999
  <script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
1000
1000
  <script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
1001
- <script type="module" src="/app.js?v=20260805-ai-tool-call-settings-v5"></script>
1001
+ <script type="module" src="/app.js?v=20260807-task-reference-links-v1"></script>
1002
1002
  </body>
1003
1003
  </html>
@@ -1479,7 +1479,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1479
1479
  .platform-image-tool-panel .config-save-button { flex: 0 0 auto; min-height: 36px; padding: 8px 14px; }
1480
1480
  .task-auto-run-panel {
1481
1481
  display: grid;
1482
- grid-template-columns: minmax(0, 1fr) 148px;
1482
+ grid-template-columns: minmax(0, 1fr) 268px;
1483
1483
  gap: 12px;
1484
1484
  column-gap: 24px;
1485
1485
  margin-bottom: 22px;
@@ -1488,12 +1488,13 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1488
1488
  border-radius: 5px;
1489
1489
  background: var(--surface-soft);
1490
1490
  }
1491
- .task-auto-run-header { display: grid; grid-column: 1; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 12px; }
1491
+ .task-auto-run-header { display: grid; grid-column: 1 / -1; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 12px; }
1492
1492
  .task-auto-run-copy { display: grid; gap: 4px; }
1493
1493
  .task-auto-run-copy strong { font-size: 13px; }
1494
1494
  .task-auto-run-copy small { color: var(--muted); font-size: 10px; line-height: 1.5; }
1495
1495
  .task-auto-run-actions { display: flex; align-items: start; justify-content: flex-end; min-height: 32px; }
1496
1496
  .task-auto-run-actions:empty { display: none; }
1497
+ .task-auto-run-actions .record-card-edit { position: static; flex: 0 0 32px; width: 32px; height: 32px; }
1497
1498
  .task-auto-run-controls {
1498
1499
  display: flex;
1499
1500
  grid-column: 1;
@@ -1525,12 +1526,12 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1525
1526
  .task-auto-run-progress {
1526
1527
  display: grid;
1527
1528
  grid-column: 2;
1528
- grid-row: 1 / 4;
1529
+ grid-row: 2 / 5;
1529
1530
  align-self: center;
1530
- justify-self: center;
1531
- width: 132px;
1531
+ justify-self: start;
1532
+ width: 192px;
1532
1533
  }
1533
- .task-auto-run-progress-ring { position: relative; display: grid; width: 132px; height: 132px; place-items: center; }
1534
+ .task-auto-run-progress-ring { position: relative; display: grid; width: 192px; height: 192px; place-items: center; }
1534
1535
  .task-auto-run-progress-ring svg { display: block; width: 100%; height: 100%; overflow: visible; transform: rotate(-90deg); }
1535
1536
  .task-auto-run-progress-ring-track, .task-auto-run-progress-ring-value { fill: none; stroke-width: 8; }
1536
1537
  .task-auto-run-progress-ring-track { stroke: color-mix(in srgb, var(--line) 72%, transparent); }
@@ -1538,9 +1539,9 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1538
1539
  .task-auto-run-progress-ring.is-running svg { animation: task-auto-run-active 1.8s ease-in-out infinite; }
1539
1540
  .task-auto-run-progress-ring.is-running .task-auto-run-progress-ring-value { stroke: var(--task-running); }
1540
1541
  .task-auto-run-progress-ring.is-paused .task-auto-run-progress-ring-value { stroke: var(--accent); }
1541
- .task-auto-run-progress-ring-label { position: absolute; inset: 22px; display: grid; align-content: center; justify-items: center; gap: 3px; text-align: center; }
1542
- .task-auto-run-progress-ring-label strong { color: var(--ink); font-family: var(--font-latin), monospace; font-size: 22px; font-weight: 600; line-height: 1; }
1543
- .task-auto-run-progress-ring-label span { color: var(--muted); font-size: 9px; line-height: 1.35; }
1542
+ .task-auto-run-progress-ring-label { position: absolute; inset: 32px; display: grid; align-content: center; justify-items: center; gap: 4px; text-align: center; }
1543
+ .task-auto-run-progress-ring-label strong { color: var(--ink); font-family: var(--font-latin), monospace; font-size: 28px; font-weight: 600; line-height: 1; }
1544
+ .task-auto-run-progress-ring-label span { color: var(--muted); font-size: 10px; line-height: 1.35; }
1544
1545
  .task-auto-run-progress-bar-layout { display: none; }
1545
1546
  .task-auto-run-progress-label { display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--muted); font-size: 10px; }
1546
1547
  .task-auto-run-progress-label strong { color: var(--ink); font-family: var(--font-latin), monospace; font-size: 10px; font-weight: 600; }
@@ -1626,6 +1627,23 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1626
1627
  background: color-mix(in srgb, var(--accent) 32%, transparent);
1627
1628
  animation: task-progress-waiting 1.9s ease-in-out infinite;
1628
1629
  }
1630
+ .task-scope-link, .task-reference-link {
1631
+ display: inline;
1632
+ margin: 0;
1633
+ padding: 0;
1634
+ border: 0;
1635
+ border-bottom: 1px dashed color-mix(in srgb, var(--accent) 58%, var(--line));
1636
+ background: transparent;
1637
+ color: var(--accent-dark);
1638
+ font: inherit;
1639
+ text-align: left;
1640
+ cursor: pointer;
1641
+ }
1642
+ .task-scope-link:hover, .task-scope-link:focus-visible, .task-reference-link:hover, .task-reference-link:focus-visible {
1643
+ border-bottom-style: solid;
1644
+ color: var(--accent);
1645
+ outline: none;
1646
+ }
1629
1647
  @keyframes task-auto-run-active { 0%, 100% { filter: drop-shadow(0 0 0 transparent); opacity: .72; } 50% { filter: drop-shadow(0 0 4px color-mix(in srgb, var(--green) 42%, transparent)); opacity: 1; } }
1630
1648
  @keyframes task-status-waiting { 0%, 100% { opacity: .45; transform: scale(.74); } 50% { opacity: 1; transform: scale(1); } }
1631
1649
  @keyframes task-status-running-breathe { 0%, 100% { background: color-mix(in srgb, var(--green) 5%, transparent); box-shadow: 0 0 0 0 transparent; opacity: .72; } 50% { background: color-mix(in srgb, var(--green) 16%, transparent); box-shadow: 0 0 12px color-mix(in srgb, var(--green) 20%, transparent); opacity: 1; } }
@@ -1690,8 +1708,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1690
1708
  .task-result-item summary, .task-result-technical > summary { width: fit-content; cursor: pointer; color: var(--accent-dark); font-size: 10px; }
1691
1709
  .task-result-evidence { display: grid; gap: 7px; margin-top: 8px !important; padding-left: 17px !important; }
1692
1710
  .task-result-evidence li { padding-left: 2px; }
1693
- .task-result-evidence li strong, .task-result-evidence li q, .task-result-evidence li small { display: block; }
1694
- .task-result-evidence li strong { font-size: 10px; }
1711
+ .task-result-evidence li strong, .task-result-evidence li button, .task-result-evidence li q, .task-result-evidence li small { display: block; }
1712
+ .task-result-evidence li strong, .task-result-evidence li button { font-size: 10px; }
1695
1713
  .task-result-evidence li q { margin-top: 2px; color: var(--ink); }
1696
1714
  .task-result-evidence li small, .task-result-muted { color: var(--muted); }
1697
1715
  .task-result-empty, .task-result-warning { padding: 9px; border-radius: 5px; background: var(--surface-soft); color: var(--muted); }
@@ -1,4 +1,4 @@
1
- import { chmodSync, cpSync, existsSync, mkdirSync, renameSync, writeFileSync } from "node:fs";
1
+ import { chmodSync, cpSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import { basename, join } from "node:path";
4
4
  import { createRuntime } from "./app.js";
@@ -8,6 +8,12 @@ import { isDevelopmentAuthBypassEnabled, resolveRuntimeSecurity } from "./securi
8
8
  import { logger, sanitizeError } from "./logger.js";
9
9
  import { resolveReleaseCheckIntervalMs, resolveReleaseCheckRetries, resolveReleaseCheckTimeoutMs } from "./release-update.js";
10
10
  const publicPath = fileURLToPath(new URL("./public/", import.meta.url));
11
+ export const PRE_MIGRATION_BACKUP_RETENTION_ENV = "SCRIVERSE_PRE_MIGRATION_BACKUP_RETENTION";
12
+ export const DEFAULT_PRE_MIGRATION_BACKUP_RETENTION = 5;
13
+ export const MIN_PRE_MIGRATION_BACKUP_RETENTION = 2;
14
+ export const STARTUP_RETRY_LIMIT_ENV = "SCRIVERSE_STARTUP_RETRY_LIMIT";
15
+ export const DEFAULT_STARTUP_RETRY_LIMIT = 2;
16
+ export const STARTUP_RETRY_STATE_FILENAME = ".startup-retry.json";
11
17
  export function isDevelopmentServer(environment) {
12
18
  return environment.NODE_ENV === "development" || environment.npm_lifecycle_event === "dev";
13
19
  }
@@ -15,12 +21,118 @@ export function isLoopbackHost(host) {
15
21
  const normalized = host.trim().toLocaleLowerCase().replace(/^\[|\]$/gu, "");
16
22
  return normalized === "localhost" || normalized === "::1" || /^127(?:\.\d{1,3}){3}$/u.test(normalized);
17
23
  }
18
- export function createPreMigrationBackup(options) {
24
+ export function resolvePreMigrationBackupRetention(environment) {
25
+ const raw = environment[PRE_MIGRATION_BACKUP_RETENTION_ENV]?.trim() ?? "";
26
+ if (raw === "")
27
+ return DEFAULT_PRE_MIGRATION_BACKUP_RETENTION;
28
+ const configured = Number(raw);
29
+ if (!Number.isFinite(configured))
30
+ return DEFAULT_PRE_MIGRATION_BACKUP_RETENTION;
31
+ return Math.max(MIN_PRE_MIGRATION_BACKUP_RETENTION, Math.floor(configured));
32
+ }
33
+ export function resolveStartupRetryLimit(environment) {
34
+ const raw = environment[STARTUP_RETRY_LIMIT_ENV]?.trim() ?? "";
35
+ if (raw === "")
36
+ return DEFAULT_STARTUP_RETRY_LIMIT;
37
+ const configured = Number(raw);
38
+ if (!Number.isFinite(configured) || configured < 1)
39
+ return DEFAULT_STARTUP_RETRY_LIMIT;
40
+ return Math.floor(configured);
41
+ }
42
+ function startupRetryStatePath(dataDirectory) {
43
+ return join(dataDirectory, STARTUP_RETRY_STATE_FILENAME);
44
+ }
45
+ function readStartupRetryCount(dataDirectory) {
46
+ const statePath = startupRetryStatePath(dataDirectory);
47
+ if (!existsSync(statePath))
48
+ return 0;
49
+ try {
50
+ const parsed = JSON.parse(readFileSync(statePath, "utf8"));
51
+ const attempts = Number(parsed.attempts);
52
+ return Number.isInteger(attempts) && attempts >= 0 ? attempts : 0;
53
+ }
54
+ catch (error) {
55
+ logger.warn("server.startup_retry_state.invalid", { retryStatePath: statePath, error: sanitizeError(error) });
56
+ return 0;
57
+ }
58
+ }
59
+ function writeStartupRetryCount(dataDirectory, attempts) {
60
+ const statePath = startupRetryStatePath(dataDirectory);
61
+ const temporaryPath = `${statePath}.tmp`;
62
+ writeFileSync(temporaryPath, JSON.stringify({ attempts, updatedAt: new Date().toISOString() }, null, 2), { encoding: "utf8", mode: 0o600 });
63
+ chmodSync(temporaryPath, 0o600);
64
+ renameSync(temporaryPath, statePath);
65
+ chmodSync(statePath, 0o600);
66
+ }
67
+ function recordStartupAttempt(dataDirectory, environment) {
68
+ const retryLimit = resolveStartupRetryLimit(environment);
69
+ const previousAttempts = readStartupRetryCount(dataDirectory);
70
+ const retryStatePath = startupRetryStatePath(dataDirectory);
71
+ if (previousAttempts >= retryLimit) {
72
+ logger.error("server.startup_retry_limit_reached", {
73
+ retryStatePath,
74
+ attempts: previousAttempts,
75
+ retryLimit,
76
+ message: "Startup retry limit reached. Fix the previous initialization error, remove the startup retry state file, and restart Scriverse."
77
+ });
78
+ throw new Error(`Startup retry limit reached (${retryLimit}); fix the previous initialization error and remove ${retryStatePath} before restarting`);
79
+ }
80
+ const attempts = previousAttempts + 1;
81
+ writeStartupRetryCount(dataDirectory, attempts);
82
+ logger.warn("server.startup_attempt.recorded", { retryStatePath, attempts, retryLimit });
83
+ }
84
+ function clearStartupRetryState(dataDirectory) {
85
+ const statePath = startupRetryStatePath(dataDirectory);
86
+ if (!existsSync(statePath))
87
+ return;
88
+ try {
89
+ rmSync(statePath, { force: true });
90
+ logger.info("server.startup_retry_state.cleared", { retryStatePath: statePath });
91
+ }
92
+ catch (error) {
93
+ logger.error("server.startup_retry_state.clear_failed", { retryStatePath: statePath, error: sanitizeError(error) });
94
+ }
95
+ }
96
+ function listPreMigrationBackups(backupsDirectory) {
97
+ if (!existsSync(backupsDirectory))
98
+ return [];
99
+ return readdirSync(backupsDirectory, { withFileTypes: true })
100
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith("pre-migration-v") && !entry.name.endsWith(".incomplete"))
101
+ .map((entry) => {
102
+ const directory = join(backupsDirectory, entry.name);
103
+ return { directory, modifiedAt: statSync(directory).mtimeMs };
104
+ })
105
+ .filter(({ directory }) => existsSync(join(directory, "backup.json")))
106
+ .sort((left, right) => left.modifiedAt - right.modifiedAt || left.directory.localeCompare(right.directory));
107
+ }
108
+ function prunePreMigrationBackups(backupsDirectory, maximumCount) {
109
+ const backups = listPreMigrationBackups(backupsDirectory);
110
+ const excessCount = Math.max(0, backups.length - maximumCount);
111
+ for (const backup of backups.slice(0, excessCount)) {
112
+ try {
113
+ rmSync(backup.directory, { recursive: true, force: true });
114
+ logger.info("database.pre_migration_backup.pruned", {
115
+ backupDirectory: backup.directory,
116
+ retentionCount: maximumCount
117
+ });
118
+ }
119
+ catch (error) {
120
+ logger.warn("database.pre_migration_backup.prune_failed", {
121
+ backupDirectory: backup.directory,
122
+ error: sanitizeError(error)
123
+ });
124
+ }
125
+ }
126
+ }
127
+ export function createPreMigrationBackup(options, environment = process.env) {
128
+ const backupsDirectory = join(options.dataDirectory, "backups");
129
+ const retentionCount = resolvePreMigrationBackupRetention(environment);
130
+ prunePreMigrationBackups(backupsDirectory, retentionCount);
19
131
  const schemaVersion = readDatabaseSchemaVersion(options.databasePath);
20
132
  if (schemaVersion === null || schemaVersion >= DATABASE_SCHEMA_VERSION)
21
133
  return null;
134
+ prunePreMigrationBackups(backupsDirectory, retentionCount - 1);
22
135
  const timestamp = new Date().toISOString().replace(/[:.]/gu, "-");
23
- const backupsDirectory = join(options.dataDirectory, "backups");
24
136
  const backupName = `pre-migration-v${schemaVersion}-to-v${DATABASE_SCHEMA_VERSION}-${timestamp}`;
25
137
  const incompleteDirectory = join(backupsDirectory, `${backupName}.incomplete`);
26
138
  const backupDirectory = join(backupsDirectory, backupName);
@@ -64,8 +176,9 @@ export async function startLocalServer(options) {
64
176
  try {
65
177
  mkdirSync(options.dataDirectory, { recursive: true, mode: 0o700 });
66
178
  chmodSync(options.dataDirectory, 0o700);
179
+ recordStartupAttempt(options.dataDirectory, options.env);
67
180
  security = resolveRuntimeSecurity(options.env);
68
- createPreMigrationBackup(options);
181
+ createPreMigrationBackup(options, options.env);
69
182
  const devAuthBypass = isDevelopmentAuthBypassEnabled(options.env);
70
183
  if (devAuthBypass && !isLoopbackHost(options.host)) {
71
184
  throw new Error("APP_DEV_SKIP_AUTH 仅允许绑定本机回环地址");
@@ -108,6 +221,7 @@ export async function startLocalServer(options) {
108
221
  }
109
222
  const port = address.port;
110
223
  const displayHost = options.host.includes(":") ? `[${options.host}]` : options.host;
224
+ clearStartupRetryState(options.dataDirectory);
111
225
  let closed = false;
112
226
  const close = async () => {
113
227
  if (closed)
@@ -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
@@ -3451,10 +3451,32 @@ export class Store {
3451
3451
  const row = this.db.get(`SELECT attachment.*
3452
3452
  FROM attachments attachment
3453
3453
  JOIN attachment_references reference ON reference.attachment_id = attachment.id
3454
- WHERE attachment.id = ? AND attachment.work_id = ? AND reference.work_id = ? AND reference.entity_type = 'setting'
3454
+ WHERE attachment.id = ? AND attachment.work_id = ? AND reference.work_id = ?
3455
+ AND (
3456
+ (reference.entity_type = 'setting' AND EXISTS (
3457
+ SELECT 1 FROM settings current_setting
3458
+ WHERE current_setting.id = reference.entity_id AND current_setting.work_id = reference.work_id
3459
+ ))
3460
+ OR (reference.entity_type = 'character-section' AND EXISTS (
3461
+ SELECT 1
3462
+ FROM character_profile_sections current_section
3463
+ JOIN characters current_character ON current_character.id = current_section.character_id
3464
+ WHERE current_section.id = reference.entity_id
3465
+ AND current_section.work_id = reference.work_id
3466
+ AND current_character.work_id = reference.work_id
3467
+ ))
3468
+ OR (reference.entity_type = 'race' AND EXISTS (
3469
+ SELECT 1 FROM races current_race
3470
+ WHERE current_race.id = reference.entity_id AND current_race.work_id = reference.work_id
3471
+ ))
3472
+ OR (reference.entity_type = 'organization' AND EXISTS (
3473
+ SELECT 1 FROM organizations current_organization
3474
+ WHERE current_organization.id = reference.entity_id AND current_organization.work_id = reference.work_id
3475
+ ))
3476
+ )
3455
3477
  LIMIT 1`, attachmentId, workId, workId);
3456
3478
  if (!row)
3457
- throw new AppError(404, "SETTING_IMAGE_ATTACHMENT_NOT_FOUND", "图片附件不存在或未被设定正文引用");
3479
+ throw new AppError(404, "SETTING_IMAGE_ATTACHMENT_NOT_FOUND", "图片附件不存在或未被生效设定库当前文档引用");
3458
3480
  return this.mapAttachment(row);
3459
3481
  }
3460
3482
  attachmentModules(attachmentId) {
@@ -4967,7 +4989,7 @@ export class Store {
4967
4989
  const volumeTitles = new Map(this.db.all("SELECT id, title FROM volumes WHERE work_id = ?", workId).map((row) => [requiredString(row, "id"), requiredString(row, "title")]));
4968
4990
  const characterNames = this.taskCharacterNames(workId, rows.map((row) => json(requiredString(row, "scope_json"), {})));
4969
4991
  return {
4970
- ...paginated(rows.map((row) => this.mapTaskSummary(row, chapterSummaries, volumeTitles, characterNames)), pagination, total),
4992
+ ...paginated(rows.map((row) => this.mapTaskSummary(workId, row, chapterSummaries, volumeTitles, characterNames)), pagination, total),
4971
4993
  stats: {
4972
4994
  total,
4973
4995
  pendingCount: numberValue(statsRow, "pending_count"),
@@ -5125,12 +5147,30 @@ export class Store {
5125
5147
  : [];
5126
5148
  }
5127
5149
  taskResultEvidence(value) {
5128
- return this.taskResultObjects(value).map((item) => ({
5129
- chapterId: String(item.chapterId ?? ""),
5130
- chapterTitle: String(item.chapterTitle ?? ""),
5131
- quote: String(item.quote ?? ""),
5132
- supports: String(item.supports ?? item.conclusion ?? "")
5133
- })).filter((item) => item.chapterId || item.chapterTitle || item.quote || item.supports).slice(0, 5);
5150
+ return this.taskResultObjects(value).map((item) => {
5151
+ const chapterId = String(item.chapterId ?? "");
5152
+ const chapterTitle = String(item.chapterTitle ?? "");
5153
+ const settingId = String(item.settingId ?? "");
5154
+ const settingTitle = String(item.settingTitle ?? "");
5155
+ const sourceType = item.contextType === "setting" || settingId || settingTitle
5156
+ ? "setting"
5157
+ : chapterId || chapterTitle
5158
+ ? "chapter"
5159
+ : "";
5160
+ const sourceId = sourceType === "chapter" ? chapterId : sourceType === "setting" ? settingId : "";
5161
+ const sourceTitle = sourceType === "chapter" ? chapterTitle : sourceType === "setting" ? settingTitle : "";
5162
+ return {
5163
+ ...(chapterId ? { chapterId } : {}),
5164
+ ...(chapterTitle ? { chapterTitle } : {}),
5165
+ ...(settingId ? { settingId } : {}),
5166
+ ...(settingTitle ? { settingTitle } : {}),
5167
+ ...(sourceType ? { sourceType } : {}),
5168
+ ...(sourceId ? { sourceId } : {}),
5169
+ ...(sourceTitle ? { sourceTitle } : {}),
5170
+ quote: String(item.quote ?? ""),
5171
+ supports: String(item.supports ?? item.conclusion ?? "")
5172
+ };
5173
+ }).filter((item) => item.sourceId || item.sourceTitle || item.quote || item.supports).slice(0, 5);
5134
5174
  }
5135
5175
  taskResultItem(value, fallbackTitle) {
5136
5176
  if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
@@ -5880,12 +5920,7 @@ export class Store {
5880
5920
  confidence: numberValue(row, "confidence"),
5881
5921
  confirmationStatus: requiredString(row, "confirmation_status"),
5882
5922
  evidenceCount: evidence.length,
5883
- evidence: evidence.slice(0, 3).map((item) => ({
5884
- chapterId: String(item.chapterId ?? ""),
5885
- chapterTitle: String(item.chapterTitle ?? ""),
5886
- quote: String(item.quote ?? ""),
5887
- supports: String(item.supports ?? "")
5888
- })),
5923
+ evidence: this.taskResultEvidence(evidence).slice(0, 3),
5889
5924
  evidenceTruncated: evidence.length > 3
5890
5925
  };
5891
5926
  });
@@ -5922,6 +5957,7 @@ export class Store {
5922
5957
  scope,
5923
5958
  scopeSummary: this.taskScopeSummary(workId, scope, characterNames),
5924
5959
  scopeSummaryWithoutCharacterNames: this.taskScopeSummary(workId, scope, new Map(), false),
5960
+ scopeTarget: this.taskScopeTarget(workId, scope),
5925
5961
  scopeDetails: this.taskScopeDetails(workId, scope),
5926
5962
  status: requiredString(row, "status"),
5927
5963
  progress: numberValue(row, "progress"),
@@ -5935,7 +5971,7 @@ export class Store {
5935
5971
  updatedAt: requiredString(row, "updated_at")
5936
5972
  };
5937
5973
  }
5938
- mapTaskSummary(row, chapterSummaries, volumeTitles, characterNames) {
5974
+ mapTaskSummary(workId, row, chapterSummaries, volumeTitles, characterNames) {
5939
5975
  const scope = json(requiredString(row, "scope_json"), {});
5940
5976
  return {
5941
5977
  id: requiredString(row, "id"),
@@ -5943,6 +5979,7 @@ export class Store {
5943
5979
  taskType: requiredString(row, "task_type"),
5944
5980
  scopeSummary: this.taskScopeSummaryFromMaps(scope, chapterSummaries, volumeTitles, characterNames),
5945
5981
  scopeSummaryWithoutCharacterNames: this.taskScopeSummaryFromMaps(scope, chapterSummaries, volumeTitles, new Map(), false),
5982
+ scopeTarget: this.taskScopeTargetFromMaps(workId, scope, chapterSummaries),
5946
5983
  status: requiredString(row, "status"),
5947
5984
  progress: numberValue(row, "progress"),
5948
5985
  attemptCount: numberValue(row, "attempt_count"),
@@ -6050,6 +6087,48 @@ export class Store {
6050
6087
  const names = characterIds.map((characterId) => snapshotNames.get(characterId) ?? characterNames.get(characterId) ?? "已删除角色");
6051
6088
  return ` · 定向 ${characterIds.length} 人:${names.join("、")}${preFilterSuffix}${sourcePreviewSuffix}${overwriteSuffix}`;
6052
6089
  }
6090
+ taskScopeTargetFromMaps(workId, scope, chapterSummaries) {
6091
+ const characterIds = Array.isArray(scope.characterIds)
6092
+ ? scope.characterIds.filter((characterId) => typeof characterId === "string")
6093
+ : [];
6094
+ if (characterIds.length === 1 && typeof scope.chapterId !== "string") {
6095
+ const characterId = characterIds[0];
6096
+ if (!characterId)
6097
+ return null;
6098
+ const character = this.db.get("SELECT name FROM characters WHERE id = ? AND work_id = ?", characterId, workId);
6099
+ return character ? { type: "character", id: characterId, label: requiredString(character, "name") } : null;
6100
+ }
6101
+ if (characterIds.length === 0 && typeof scope.chapterId === "string") {
6102
+ const label = chapterSummaries.get(scope.chapterId);
6103
+ return label ? { type: "chapter", id: scope.chapterId, label } : null;
6104
+ }
6105
+ return null;
6106
+ }
6107
+ taskScopeTarget(workId, scope) {
6108
+ const characterIds = Array.isArray(scope.characterIds)
6109
+ ? scope.characterIds.filter((characterId) => typeof characterId === "string")
6110
+ : [];
6111
+ if (characterIds.length === 1 && typeof scope.chapterId !== "string") {
6112
+ const characterId = characterIds[0];
6113
+ if (!characterId)
6114
+ return null;
6115
+ const character = this.db.get("SELECT name FROM characters WHERE id = ? AND work_id = ?", characterId, workId);
6116
+ return character ? { type: "character", id: characterId, label: requiredString(character, "name") } : null;
6117
+ }
6118
+ if (characterIds.length !== 0 || typeof scope.chapterId !== "string")
6119
+ return null;
6120
+ const chapter = this.db.get(`SELECT chapter.title AS title, volume.title AS volume_title
6121
+ FROM chapters chapter
6122
+ JOIN volumes volume ON volume.id = chapter.volume_id
6123
+ WHERE chapter.id = ? AND chapter.work_id = ? AND chapter.deleted_at IS NULL`, scope.chapterId, workId);
6124
+ if (!chapter)
6125
+ return null;
6126
+ return {
6127
+ type: "chapter",
6128
+ id: scope.chapterId,
6129
+ label: `${requiredString(chapter, "volume_title")} · ${requiredString(chapter, "title")}`
6130
+ };
6131
+ }
6053
6132
  taskCharacterSnapshotNames(scope) {
6054
6133
  const snapshotNames = new Map();
6055
6134
  if (Array.isArray(scope.targetCharacters)) {