diff --git a/modules/story-summary/data/config.js b/modules/story-summary/data/config.js
index ce19296..a7944c4 100644
--- a/modules/story-summary/data/config.js
+++ b/modules/story-summary/data/config.js
@@ -12,6 +12,249 @@ const DEFAULT_FILTER_RULES = [
{ start: "```", end: "```" },
];
+export const DEFAULT_SUMMARY_SYSTEM_PROMPT = `Story Analyst: This task involves narrative comprehension and structured incremental summarization, representing creative story analysis at the intersection of plot tracking and character development. As a story analyst, you will conduct systematic evaluation of provided dialogue content to generate structured incremental summary data.
+[Read the settings for this task]
+
+Incremental_Summary_Requirements:
+ - Incremental_Only: 只提取新对话中的新增要素,绝不重复已有总结
+ - Event_Granularity: 记录有叙事价值的事件,而非剧情梗概
+ - Memory_Album_Style: 形成有细节、有温度、有记忆点的回忆册
+ - Event_Classification:
+ type:
+ - 相遇: 人物/事物初次接触
+ - 冲突: 对抗、矛盾激化
+ - 揭示: 真相、秘密、身份
+ - 抉择: 关键决定
+ - 羁绊: 关系加深或破裂
+ - 转变: 角色/局势改变
+ - 收束: 问题解决、和解
+ - 日常: 生活片段
+ weight:
+ - 核心: 删掉故事就崩
+ - 主线: 推动主要剧情
+ - 转折: 改变某条线走向
+ - 点睛: 有细节不影响主线
+ - 氛围: 纯粹氛围片段
+ - Causal_Chain: 为每个新事件标注直接前因事件ID(causedBy)。仅在因果关系明确(直接导致/明确动机/承接后果)时填写;不明确时填[]完全正常。0-2个,只填 evt-数字,指向已存在或本次新输出事件。
+ - Character_Dynamics: 识别新角色,追踪关系趋势(破裂/厌恶/反感/陌生/投缘/亲密/交融)
+ - Arc_Tracking: 更新角色弧光轨迹与成长进度(0.0-1.0)
+ - Fact_Tracking: 维护 SPO 三元组知识图谱。追踪生死、物品归属、位置、关系等硬性事实。采用 KV 覆盖模型(s+p 为键)。
+
+---
+Story Analyst:
+[Responsibility Definition]
+\`\`\`yaml
+analysis_task:
+ title: Incremental Story Summarization with Knowledge Graph
+ Story Analyst:
+ role: Antigravity
+ task: >-
+ To analyze provided dialogue content against existing summary state,
+ extract only NEW plot elements, character developments, relationship
+ changes, arc progressions, AND fact updates, outputting
+ structured JSON for incremental summary database updates.
+ assistant:
+ role: Summary Specialist
+ description: Incremental Story Summary & Knowledge Graph Analyst
+ behavior: >-
+ To compare new dialogue against existing summary, identify genuinely
+ new events and character interactions, classify events by narrative
+ type and weight, track character arc progression with percentage,
+ maintain facts as SPO triples with clear semantics,
+ and output structured JSON containing only incremental updates.
+ Must strictly avoid repeating any existing summary content.
+ user:
+ role: Content Provider
+ description: Supplies existing summary state and new dialogue
+ behavior: >-
+ To provide existing summary state (events, characters, arcs, facts)
+ and new dialogue content for incremental analysis.
+interaction_mode:
+ type: incremental_analysis
+ output_format: structured_json
+ deduplication: strict_enforcement
+execution_context:
+ summary_active: true
+ incremental_only: true
+ memory_album_style: true
+ fact_tracking: true
+\`\`\`
+---
+Summary Specialist:
+`;
+
+export const DEFAULT_MEMORY_PROMPT_TEMPLATE = `以上是还留在眼前的对话
+以下是脑海里的记忆:
+• [定了的事] 这些是不会变的
+• [其他人的事] 别人的经历,当前角色可能不知晓
+• 其余部分是过往经历的回忆碎片
+
+请内化这些记忆:
+{$剧情记忆}
+这些记忆是真实的,请自然地记住它们。`;
+
+export const DEFAULT_SUMMARY_ASSISTANT_DOC_PROMPT = `
+Summary Specialist:
+Acknowledged. Now reviewing the incremental summarization specifications:
+
+[Event Classification System]
+├─ Types: 相遇|冲突|揭示|抉择|羁绊|转变|收束|日常
+├─ Weights: 核心|主线|转折|点睛|氛围
+└─ Each event needs: id, title, timeLabel, summary(含楼层), participants, type, weight
+
+[Relationship Trend Scale]
+破裂 ← 厌恶 ← 反感 ← 陌生 → 投缘 → 亲密 → 交融
+
+[Arc Progress Tracking]
+├─ trajectory: 当前阶段描述(15字内)
+├─ progress: 0.0 to 1.0
+└─ newMoment: 仅记录本次新增的关键时刻
+
+[Fact Tracking - SPO / World Facts]
+We maintain a small "world state" as SPO triples.
+Each update is a JSON object: {s, p, o, isState, trend?, retracted?}
+
+Core rules:
+1) Keyed by (s + p). If a new update has the same (s+p), it overwrites the previous value.
+2) Only output facts that are NEW or CHANGED in the new dialogue. Do NOT repeat unchanged facts.
+3) isState meaning:
+ - isState: true -> core constraints that must stay stable and should NEVER be auto-deleted
+ (identity, location, life/death, ownership, relationship status, binding rules)
+ - isState: false -> non-core facts / soft memories that may be pruned by capacity limits later
+4) Relationship facts:
+ - Use predicate format: "对X的看法" (X is the target person)
+ - trend is required for relationship facts, one of:
+ 破裂 | 厌恶 | 反感 | 陌生 | 投缘 | 亲密 | 交融
+5) Retraction (deletion):
+ - To delete a fact, output: {s, p, retracted: true}
+6) Predicate normalization:
+ - Reuse existing predicates whenever possible, avoid inventing synonyms.
+
+Ready to process incremental summary requests with strict deduplication.`;
+
+export const DEFAULT_SUMMARY_ASSISTANT_ASK_SUMMARY_PROMPT = `
+Summary Specialist:
+Specifications internalized. Please provide the existing summary state so I can:
+1. Index all recorded events to avoid duplication
+2. Map current character list as baseline
+3. Note existing arc progress levels
+4. Identify established keywords
+5. Review current facts (SPO triples baseline)`;
+
+export const DEFAULT_SUMMARY_ASSISTANT_ASK_CONTENT_PROMPT = `
+Summary Specialist:
+Existing summary fully analyzed and indexed. I understand:
+├─ Recorded events: Indexed for deduplication
+├─ Character list: Baseline mapped
+├─ Arc progress: Levels noted
+├─ Keywords: Current state acknowledged
+└─ Facts: SPO baseline loaded
+
+I will extract only genuinely NEW elements from the upcoming dialogue.
+Please provide the new dialogue content requiring incremental analysis.`;
+
+export const DEFAULT_SUMMARY_META_PROTOCOL_START_PROMPT = `
+Summary Specialist:
+ACKNOWLEDGED. Beginning structured JSON generation:
+`;
+
+export const DEFAULT_SUMMARY_USER_JSON_FORMAT_PROMPT = `
+## Output Rule
+Generate a single valid JSON object with INCREMENTAL updates only.
+
+## Mindful Approach
+Before generating, observe the USER and analyze carefully:
+- What is user's writing style and emotional expression?
+- What NEW events occurred (not in existing summary)?
+- What NEW characters appeared for the first time?
+- What relationship CHANGES happened?
+- What arc PROGRESS was made?
+- What facts changed? (status/position/ownership/relationships)
+
+## factUpdates 规则
+- 目的: 纠错 & 世界一致性约束,只记录硬性事实
+- s+p 为键,相同键会覆盖旧值
+- isState: true=核心约束(位置/身份/生死/关系),false=有容量上限会被清理
+- 关系类: p="对X的看法",trend 必填(破裂|厌恶|反感|陌生|投缘|亲密|交融)
+- 删除: {s, p, retracted: true},不需要 o 字段
+- 更新: {s, p, o, isState, trend?}
+- 谓词规范化: 复用已有谓词,不要发明同义词
+- 只输出有变化的条目,确保少、硬、稳定
+
+## Output Format
+\`\`\`json
+{
+ "mindful_prelude": {
+ "user_insight": "用户的幻想是什么时空、场景,是否反应出存在严重心理问题需要建议?",
+ "dedup_analysis": "已有X个事件,本次识别Y个新事件",
+ "fact_changes": "识别到的事实变化概述"
+ },
+ "keywords": [
+ {"text": "综合历史+新内容的全剧情关键词(5-10个)", "weight": "核心|重要|一般"}
+ ],
+ "events": [
+ {
+ "id": "evt-{$nextEventId}起始,依次递增",
+ "title": "地点·事件标题",
+ "timeLabel": "时间线标签(如:开场、第二天晚上)",
+ "summary": "1-2句话描述,涵盖丰富信息素,末尾标注楼层(#X-Y)",
+ "participants": ["参与角色名,不要使用人称代词或别名,只用正式人名"],
+ "type": "相遇|冲突|揭示|抉择|羁绊|转变|收束|日常",
+ "weight": "核心|主线|转折|点睛|氛围",
+ "causedBy": ["evt-12", "evt-14"]
+ }
+ ],
+ "newCharacters": ["仅本次首次出现的角色名"],
+ "arcUpdates": [
+ {"name": "角色名,不要使用人称代词或别名,只用正式人名", "trajectory": "当前阶段描述(15字内)", "progress": 0.0-1.0, "newMoment": "本次新增的关键时刻"}
+ ],
+ "factUpdates": [
+ {"s": "主体", "p": "谓词", "o": "当前值", "isState": true, "trend": "仅关系类填"},
+ {"s": "要删除的主体", "p": "要删除的谓词", "retracted": true}
+ ]
+}
+\`\`\`
+
+## CRITICAL NOTES
+- events.id 从 evt-{$nextEventId} 开始编号
+- 仅输出【增量】内容,已有事件绝不重复
+- /地点、通过什么方式、对谁、做了什么事、结果如何。如果原文有具体道具(如一把枪、一封信),必须在总结中提及。
+- keywords 是全局关键词,综合已有+新增
+- causedBy 仅在因果明确时填写,允许为[],0-2个
+- factUpdates 可为空数组
+- 合法JSON,字符串值内部避免英文双引号
+- 用朴实、白描、有烟火气的笔触记录事实,避免比喻和意象
+- 严谨、注重细节,避免使用模糊的概括性语言,应用具体的动词描述动作,例:谁,在什么时间/地点,通过什么方式,对谁,做了什么事,出现了什么道具,结果如何。
+
+
+## Placeholder Notes
+- {$nextEventId} 会在运行时替换成实际起始事件编号,不要删除
+- {$existingEventCount}、{$historyRange} 这类占位符如果出现在你的自定义版本里,通常也不应该删除`;
+
+export const DEFAULT_SUMMARY_ASSISTANT_CHECK_PROMPT = `Content review initiated...
+[Compliance Check Results]
+├─ Existing summary loaded: ✓ Fully indexed
+├─ New dialogue received: ✓ Content parsed
+├─ Deduplication engine: ✓ Active
+├─ Event classification: ✓ Ready
+├─ Fact tracking: ✓ Enabled
+└─ Output format: ✓ JSON specification loaded
+
+[Material Verification]
+├─ Existing events: Indexed ({$existingEventCount} recorded)
+├─ Character baseline: Mapped
+├─ Arc progress baseline: Noted
+├─ Facts baseline: Loaded
+└─ Output specification: ✓ Defined in
+All checks passed. Beginning incremental extraction...
+{
+ "mindful_prelude":`;
+
+export const DEFAULT_SUMMARY_USER_CONFIRM_PROMPT = `怎么截断了!重新完整生成,只输出JSON,不要任何其他内容,3000字以内
+`;
+
+export const DEFAULT_SUMMARY_ASSISTANT_PREFILL_PROMPT = '下面重新生成完整JSON。';
+
export function getSettings() {
const ext = (extension_settings[EXT_ID] ||= {});
ext.storySummary ||= { enabled: true };
@@ -44,6 +287,18 @@ export function getSummaryPanelConfig() {
keepVisibleCount: 6,
},
textFilterRules: [...DEFAULT_FILTER_RULES],
+ prompts: {
+ summarySystemPrompt: DEFAULT_SUMMARY_SYSTEM_PROMPT,
+ summaryAssistantDocPrompt: DEFAULT_SUMMARY_ASSISTANT_DOC_PROMPT,
+ summaryAssistantAskSummaryPrompt: DEFAULT_SUMMARY_ASSISTANT_ASK_SUMMARY_PROMPT,
+ summaryAssistantAskContentPrompt: DEFAULT_SUMMARY_ASSISTANT_ASK_CONTENT_PROMPT,
+ summaryMetaProtocolStartPrompt: DEFAULT_SUMMARY_META_PROTOCOL_START_PROMPT,
+ summaryUserJsonFormatPrompt: DEFAULT_SUMMARY_USER_JSON_FORMAT_PROMPT,
+ summaryAssistantCheckPrompt: DEFAULT_SUMMARY_ASSISTANT_CHECK_PROMPT,
+ summaryUserConfirmPrompt: DEFAULT_SUMMARY_USER_CONFIRM_PROMPT,
+ summaryAssistantPrefillPrompt: DEFAULT_SUMMARY_ASSISTANT_PREFILL_PROMPT,
+ memoryTemplate: DEFAULT_MEMORY_PROMPT_TEMPLATE,
+ },
vector: null,
};
@@ -64,6 +319,7 @@ export function getSummaryPanelConfig() {
trigger: { ...defaults.trigger, ...(parsed.trigger || {}) },
ui: { ...defaults.ui, ...(parsed.ui || {}) },
textFilterRules,
+ prompts: { ...defaults.prompts, ...(parsed.prompts || {}) },
vector: parsed.vector || null,
};