@musnows/scriverse 1.1.4 → 1.1.6

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.
@@ -98,3 +98,13 @@ export function roleplayUserTurnTitleSource(content) {
98
98
  if (!parsed.hasMarkup) return content;
99
99
  return parsed.userMessage || parsed.sceneDirection;
100
100
  }
101
+
102
+ export function aiConversationTitleSource(content) {
103
+ const source = roleplayUserTurnTitleSource(content);
104
+ const wrapped = unwrapRegion(source.trim(), USER_MESSAGE_TAG) ?? unwrapRegion(source.trim(), "author_instruction");
105
+ const prompt = wrapped && !wrapped.rest ? wrapped.inner : source;
106
+ return prompt.replace(
107
+ /<ai_reference kind="(character|setting|chapter|context-settings)" id="[^"]+">([\s\S]*?)<\/ai_reference>/gu,
108
+ (_reference, _kind, name) => unescapeXmlText(name)
109
+ );
110
+ }
@@ -1598,6 +1598,18 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1598
1598
  .chapter-content { position: relative; z-index: 1; grid-column: 2; grid-row: 1; resize: none; width: 100%; height: auto; min-height: 100%; margin: 0; padding: 32px 36px 72px; border: 0; background: transparent; border-radius: 0; font-size: var(--editor-font-size); line-height: var(--editor-line-height); letter-spacing: .01em; overflow-wrap: break-word; overflow: hidden; }
1599
1599
  .app-shell.editor-typewriter-mode .chapter-content { padding-bottom: max(72px, 45dvh); }
1600
1600
  .chapter-content:focus { box-shadow: none; }
1601
+ .chapter-content-skeleton { position: absolute; z-index: 3; grid-column: 2; grid-row: 1; display: grid; align-content: start; gap: 16px; width: 100%; min-height: 100%; margin: 0; padding: 36px 36px 72px; background: var(--paper); pointer-events: none; }
1602
+ .chapter-content-skeleton.hidden { display: none; }
1603
+ .chapter-content-skeleton-line { position: relative; display: block; height: 14px; overflow: hidden; border-radius: 4px; background: color-mix(in srgb, var(--line) 78%, var(--paper)); }
1604
+ .chapter-content-skeleton-line::after { position: absolute; inset: 0; background: linear-gradient(110deg, transparent 18%, color-mix(in srgb, var(--surface) 72%, transparent) 48%, transparent 78%); content: ""; transform: translateX(-110%); animation: image-upload-placeholder-shimmer 1.45s ease-in-out infinite; }
1605
+ .chapter-content-skeleton-line:nth-child(2) { width: 92%; }
1606
+ .chapter-content-skeleton-line:nth-child(3) { width: 84%; }
1607
+ .chapter-content-skeleton-line:nth-child(4) { width: 46%; }
1608
+ .chapter-content-skeleton-line:nth-child(5) { width: 96%; margin-top: 8px; }
1609
+ .chapter-content-skeleton-line:nth-child(6) { width: 88%; }
1610
+ .chapter-content-skeleton-line:nth-child(7) { width: 73%; }
1611
+ .chapter-content-skeleton-line:nth-child(8) { width: 38%; }
1612
+ @media (prefers-reduced-motion: reduce) { .chapter-content-skeleton-line::after { animation: none; } }
1601
1613
  .chapter-whitespace-overlay { position: relative; z-index: 2; grid-column: 2; grid-row: 1; width: 100%; height: 100%; overflow: hidden; opacity: 0; pointer-events: none; }
1602
1614
  .chapter-whitespace-overlay.is-visible { opacity: 1; }
1603
1615
  #chapter-whitespace-inner { box-sizing: border-box; min-height: 100%; color: transparent; white-space: pre-wrap; }
@@ -4575,6 +4587,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
4575
4587
  .editor-view .editor-actions > button { min-width: 0; min-height: 34px; padding-inline: 6px; font-size: 11px; }
4576
4588
  .chapter-title { font-size: 18px; }
4577
4589
  .chapter-content { padding: 22px 16px 64px 12px; font-size: max(16px, var(--editor-font-size)); }
4590
+ .chapter-content-skeleton { gap: 14px; padding: 26px 16px 64px 12px; }
4578
4591
  .app-shell.editor-typewriter-mode .chapter-content { padding-bottom: max(64px, 45dvh); }
4579
4592
  .chapter-line-numbers { width: 32px; font-size: 11px; }
4580
4593
  .chapter-editor-scroll { grid-template-columns: 32px minmax(0, 1fr); }
@@ -95,4 +95,10 @@ export function roleplayUserTurnTitleSource(content) {
95
95
  return content;
96
96
  return parsed.userMessage || parsed.sceneDirection;
97
97
  }
98
+ export function aiConversationTitleSource(content) {
99
+ const source = roleplayUserTurnTitleSource(content);
100
+ const wrapped = unwrapRegion(source.trim(), USER_MESSAGE_TAG) ?? unwrapRegion(source.trim(), "author_instruction");
101
+ const prompt = wrapped && !wrapped.rest ? wrapped.inner : source;
102
+ return prompt.replace(/<ai_reference kind="(character|setting|chapter|context-settings)" id="[^"]+">([\s\S]*?)<\/ai_reference>/gu, (_reference, _kind, name) => unescapeXmlText(name));
103
+ }
98
104
  //# sourceMappingURL=roleplay-turn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"roleplay-turn.js","sourceRoot":"","sources":["../src/roleplay-turn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roleplay-turn.js","sourceRoot":"","sources":["../src/roleplay-turn.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -14,7 +14,7 @@ import { buildWritingCalendar, writingDateKey } from "./writing-progress-time.js
14
14
  import { DEFAULT_AGENT_TOOL_CALL_LIMIT, MIN_AGENT_TOOL_CALL_LIMIT, resolveMaxAgentToolCallLimit } from "./ai-tool-results.js";
15
15
  import { DEFAULT_AI_STREAM_IDLE_TIMEOUT_SECONDS, normalizeAiStreamIdleTimeoutSeconds } from "./ai-stream-timeout.js";
16
16
  import { normalizeCharacterAttributes, normalizeCharacterState } from "./public/character-profile.js";
17
- import { normalizeRoleplayScenePin, roleplayUserTurnDisplayText, roleplayUserTurnTitleSource } from "./roleplay-turn.js";
17
+ import { aiConversationTitleSource, normalizeRoleplayScenePin, roleplayUserTurnDisplayText, roleplayUserTurnTitleSource } from "./roleplay-turn.js";
18
18
  import { chapterAnnotationLineHashes, createChapterLineIds, MAX_CHAPTER_LINE_IDS, parseChapterAnnotationLineIds, parseChapterAnnotationLineHashes, parseChapterLineIds, reconcileChapterLineIds, reanchorChapterAnnotations } from "./chapter-annotation-anchor.js";
19
19
  import { chapterTitleFormats, isChapterTitlePreference, parseChapterTitleNumber, planAutoNumberedTitles, planVolumeTitleRenumber, renumberChapterTitle, resolveChapterTitleFormat } from "./chapter-title-numbering.js";
20
20
  import { normalizeRoleplayMemoryContent, roleplayMemoryCandidateIsSafe } from "./roleplay-memory.js";
@@ -261,7 +261,7 @@ function normalizeAiConversationTaskType(value, roleplayCharacterId) {
261
261
  return "chat";
262
262
  }
263
263
  export function defaultAiConversationTitle(prompt) {
264
- const normalized = roleplayUserTurnTitleSource(prompt).replace(/\s+/gu, " ").trim();
264
+ const normalized = aiConversationTitleSource(prompt).replace(/\s+/gu, " ").trim();
265
265
  return Array.from(normalized).slice(0, 15).join("") || "新对话";
266
266
  }
267
267
  function isRecord(value) {
@@ -7237,7 +7237,7 @@ export class Store {
7237
7237
  role: requiredString(message, "role") === "assistant" ? "assistant" : "user",
7238
7238
  content: requiredString(message, "content")
7239
7239
  }));
7240
- return { title: requiredString(conversation, "title"), messages };
7240
+ return { title: this.aiConversationDisplayTitle(conversationId, requiredString(conversation, "title")), messages };
7241
7241
  }
7242
7242
  setAiConversationContextWarning(conversationId, pending) {
7243
7243
  const conversation = this.db.get("SELECT id FROM ai_conversations WHERE id = ?", conversationId);
@@ -7255,12 +7255,17 @@ export class Store {
7255
7255
  });
7256
7256
  return this.getAiConversation(conversationId);
7257
7257
  }
7258
- setAiConversationTitle(conversationId, title) {
7258
+ setAiConversationTitle(conversationId, title, expectedTitle) {
7259
7259
  const conversation = this.db.get("SELECT id FROM ai_conversations WHERE id = ?", conversationId);
7260
7260
  if (!conversation)
7261
7261
  throw notFound("AI 对话");
7262
7262
  const normalizedTitle = title.replace(/\s+/gu, " ").trim().slice(0, 200) || "新对话";
7263
7263
  this.db.transaction(() => {
7264
+ if (expectedTitle !== undefined) {
7265
+ const current = this.db.get("SELECT title FROM ai_conversations WHERE id = ?", conversationId);
7266
+ if (!current || this.aiConversationDisplayTitle(conversationId, requiredString(current, "title")) !== expectedTitle)
7267
+ return;
7268
+ }
7264
7269
  this.db.run("UPDATE ai_conversations SET title = ?, updated_at = ? WHERE id = ?", normalizedTitle, now(), conversationId);
7265
7270
  this.syncAiHistorySearchShortTermsForSource("conversation", conversationId);
7266
7271
  });
@@ -7711,6 +7716,16 @@ export class Store {
7711
7716
  this.syncAiHistorySearchShortTermsForSource(sourceType, String(row.source_id));
7712
7717
  }
7713
7718
  }
7719
+ aiConversationDisplayTitle(conversationId, title) {
7720
+ if (!title.startsWith("<"))
7721
+ return title;
7722
+ const firstUserMessage = this.db.get("SELECT content FROM ai_conversation_messages WHERE conversation_id = ? AND role = 'user' ORDER BY created_at, rowid LIMIT 1", conversationId);
7723
+ if (!firstUserMessage)
7724
+ return title;
7725
+ const content = requiredString(firstUserMessage, "content");
7726
+ const legacyTitle = Array.from(roleplayUserTurnTitleSource(content).replace(/\s+/gu, " ").trim()).slice(0, 15).join("") || "新对话";
7727
+ return title === legacyTitle ? defaultAiConversationTitle(content) : title;
7728
+ }
7714
7729
  mapAiConversation(row) {
7715
7730
  const roleplayCharacterId = optionalString(row, "roleplay_character_id");
7716
7731
  const roleplayUserCharacterId = optionalString(row, "roleplay_user_character_id");
@@ -7726,7 +7741,7 @@ export class Store {
7726
7741
  return {
7727
7742
  id: requiredString(row, "id"),
7728
7743
  workId: requiredString(row, "work_id"),
7729
- title: requiredString(row, "title"),
7744
+ title: this.aiConversationDisplayTitle(conversationId, requiredString(row, "title")),
7730
7745
  isFavorite: booleanValue(row, "is_favorite"),
7731
7746
  messageCount: numberValue(row, "message_count"),
7732
7747
  preview: roleplayUserTurnDisplayText(requiredString(row, "preview")),