@team-harness/memory-algorithms 0.1.0

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.
Files changed (69) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +203 -0
  3. package/dist/contracts.d.ts +178 -0
  4. package/dist/contracts.js +1 -0
  5. package/dist/index.d.ts +14 -0
  6. package/dist/index.js +6 -0
  7. package/dist/runtime/documents.d.ts +15 -0
  8. package/dist/runtime/documents.js +209 -0
  9. package/dist/runtime/l1.d.ts +10 -0
  10. package/dist/runtime/l1.js +172 -0
  11. package/dist/runtime/run.d.ts +44 -0
  12. package/dist/runtime/run.js +191 -0
  13. package/dist/runtime/skill-workspace.d.ts +70 -0
  14. package/dist/runtime/skill-workspace.js +156 -0
  15. package/dist/runtime/skills.d.ts +9 -0
  16. package/dist/runtime/skills.js +48 -0
  17. package/dist/runtime/telemetry.d.ts +10 -0
  18. package/dist/runtime/telemetry.js +5 -0
  19. package/dist/runtime/tools.d.ts +15 -0
  20. package/dist/runtime/tools.js +5 -0
  21. package/dist/upstream/config.d.ts +1 -0
  22. package/dist/upstream/config.js +1 -0
  23. package/dist/upstream/core/conversation/l0-recorder.d.ts +6 -0
  24. package/dist/upstream/core/conversation/l0-recorder.js +1 -0
  25. package/dist/upstream/core/memory-prompt/composer.d.ts +6 -0
  26. package/dist/upstream/core/memory-prompt/composer.js +33 -0
  27. package/dist/upstream/core/memory-prompt/types.d.ts +103 -0
  28. package/dist/upstream/core/memory-prompt/types.js +21 -0
  29. package/dist/upstream/core/prompts/l1-dedup.d.ts +33 -0
  30. package/dist/upstream/core/prompts/l1-dedup.js +202 -0
  31. package/dist/upstream/core/prompts/l1-extraction.d.ts +24 -0
  32. package/dist/upstream/core/prompts/l1-extraction.js +400 -0
  33. package/dist/upstream/core/prompts/persona-generation.d.ts +29 -0
  34. package/dist/upstream/core/prompts/persona-generation.js +284 -0
  35. package/dist/upstream/core/prompts/scene-extraction.d.ts +40 -0
  36. package/dist/upstream/core/prompts/scene-extraction.js +534 -0
  37. package/dist/upstream/core/record/l1-dedup.d.ts +10 -0
  38. package/dist/upstream/core/record/l1-dedup.js +108 -0
  39. package/dist/upstream/core/record/l1-extractor.d.ts +33 -0
  40. package/dist/upstream/core/record/l1-extractor.js +128 -0
  41. package/dist/upstream/core/record/l1-writer.d.ts +95 -0
  42. package/dist/upstream/core/record/l1-writer.js +1 -0
  43. package/dist/upstream/core/scene/filename-normalizer.d.ts +6 -0
  44. package/dist/upstream/core/scene/filename-normalizer.js +30 -0
  45. package/dist/upstream/core/scene/scene-format.d.ts +26 -0
  46. package/dist/upstream/core/scene/scene-format.js +53 -0
  47. package/dist/upstream/core/scene/scene-index.d.ts +7 -0
  48. package/dist/upstream/core/scene/scene-index.js +1 -0
  49. package/dist/upstream/core/scene/scene-navigation.d.ts +66 -0
  50. package/dist/upstream/core/scene/scene-navigation.js +107 -0
  51. package/dist/upstream/core/skill/conversation-add/message-compressor.d.ts +47 -0
  52. package/dist/upstream/core/skill/conversation-add/message-compressor.js +58 -0
  53. package/dist/upstream/core/skill/conversation-add/oversize-strategy.d.ts +41 -0
  54. package/dist/upstream/core/skill/conversation-add/oversize-strategy.js +100 -0
  55. package/dist/upstream/core/skill/prompts/skill-review-prompt.d.ts +39 -0
  56. package/dist/upstream/core/skill/prompts/skill-review-prompt.js +197 -0
  57. package/dist/upstream/core/skill/skill-extractor.d.ts +146 -0
  58. package/dist/upstream/core/skill/skill-extractor.js +432 -0
  59. package/dist/upstream/core/skill/skill-format.d.ts +46 -0
  60. package/dist/upstream/core/skill/skill-format.js +191 -0
  61. package/dist/upstream/core/skill/skill-tools.d.ts +75 -0
  62. package/dist/upstream/core/skill/skill-tools.js +193 -0
  63. package/dist/upstream/core/skill/types.d.ts +324 -0
  64. package/dist/upstream/core/skill/types.js +7 -0
  65. package/dist/upstream/utils/sanitize.d.ts +96 -0
  66. package/dist/upstream/utils/sanitize.js +359 -0
  67. package/package.json +28 -0
  68. package/upstream/baseline.json +426 -0
  69. package/upstream/changes.md +81 -0
@@ -0,0 +1,48 @@
1
+ import { SkillExtractor, formatTranscript } from "../upstream/core/skill/skill-extractor.js";
2
+ import { SKILL_REVIEW_PROMPT } from "../upstream/core/skill/prompts/skill-review-prompt.js";
3
+ import { Run, coverage, hash, uniqueRefs } from "./run.js";
4
+ import { SkillCore } from "./skill-workspace.js";
5
+ import { validateMessages } from "./l1.js";
6
+ export async function extractSkills(deps, input) {
7
+ input = { ...input, messages: structuredClone(input.messages) };
8
+ const run = new Run(deps, input, "skill", hash({ scope: input.scopeKey, messages: input.messages, reason: input.reason, headChars: input.headChars, tailChars: input.tailChars, prefixSkillsLimit: input.prefixSkillsLimit }));
9
+ const cov = coverage(input.messages.map(m => m.id));
10
+ try {
11
+ run.check();
12
+ validateMessages(input.messages);
13
+ if (!input.messages.length)
14
+ return run.result([], cov);
15
+ const head = input.headChars ?? 8000, tail = input.tailChars ?? 32000, prefix = input.prefixSkillsLimit ?? 20;
16
+ if (![head, tail, prefix].every(n => Number.isSafeInteger(n) && n >= 0) || head + tail === 0 || tail === 0)
17
+ throw new Error("Invalid Skill input limits (tail must be positive)");
18
+ const core = new SkillCore(run);
19
+ const extractor = new SkillExtractor({ core, systemPrompt: SKILL_REVIEW_PROMPT, headChars: head, tailChars: tail, prefixSkillsLimit: prefix,
20
+ logger: { info: () => { }, warn: () => { run.check(); run.diagnostics.push("Skill prefetch degraded; existing candidates may be incomplete"); }, error: () => { } },
21
+ maxIterations: run.limits.maxIterations, maxTokens: run.limits.maxOutputTokens,
22
+ runner: { run: async (p) => run.model(p.systemPrompt ?? "", p.prompt, (p.tools ?? {}), p.maxIterations, p.maxTokens) } });
23
+ await extractor.extract({ user_id: input.scopeKey, team_id: input.scopeKey, agent_id: input.scopeKey,
24
+ task_id: input.runId, messages: input.messages.map(m => ({ role: m.role, content: m.content })), reason: input.reason });
25
+ const changes = core.changes();
26
+ const evidence = uniqueRefs(input.messages.flatMap(m => m.evidence.map(ref => m.completeness === "truncated" ? { ...ref, completeness: "truncated" } : ref)));
27
+ for (const change of changes)
28
+ if (change.after)
29
+ change.after.evidence = uniqueRefs([...change.after.evidence, ...evidence]);
30
+ // Original extractor truncates the formatted transcript, not individual messages.
31
+ const transcriptLength = formatTranscript(input.messages.map(m => ({ role: m.role, content: m.content }))).length;
32
+ cov.processed = cov.remaining;
33
+ cov.remaining = [];
34
+ cov.truncated = input.messages.filter(m => m.completeness === "truncated").map(m => m.id);
35
+ if (transcriptLength > head + tail) {
36
+ for (const change of changes)
37
+ if (change.after)
38
+ change.after.evidence = change.after.evidence.map(ref => ({ ...ref, completeness: "truncated" }));
39
+ cov.truncated = input.messages.map(m => m.id);
40
+ run.diagnostics.push("Upstream Skill head-tail truncation applied; evidence is run-level, not sentence-level. Increase limits to analyze omitted text.");
41
+ }
42
+ run.check();
43
+ return run.result(changes, cov, transcriptLength > head + tail ? "partial" : "completed");
44
+ }
45
+ catch (error) {
46
+ return run.failure(error, cov);
47
+ }
48
+ }
@@ -0,0 +1,10 @@
1
+ export declare const metricProducer: {
2
+ send: (..._args: unknown[]) => void;
3
+ };
4
+ export declare const trace: {
5
+ report: (..._args: unknown[]) => void;
6
+ };
7
+ export declare const obsLogger: {
8
+ info: (..._args: unknown[]) => void;
9
+ warn: (..._args: unknown[]) => void;
10
+ };
@@ -0,0 +1,5 @@
1
+ // Compatibility sink: upstream telemetry is intentionally not connected to a service.
2
+ const discard = (..._args) => { };
3
+ export const metricProducer = { send: discard };
4
+ export const trace = { report: discard };
5
+ export const obsLogger = { info: discard, warn: discard };
@@ -0,0 +1,15 @@
1
+ export interface LocalTool<T = unknown> {
2
+ description: string;
3
+ inputSchema: Record<string, unknown>;
4
+ execute(args: T): Promise<string>;
5
+ }
6
+ export declare function jsonSchema<T>(schema: Record<string, unknown>): Record<string, unknown> & {
7
+ __type?: T;
8
+ };
9
+ export declare function tool<T>(value: {
10
+ description: string;
11
+ inputSchema: Record<string, unknown> & {
12
+ __type?: T;
13
+ };
14
+ execute(args: T): Promise<string>;
15
+ }): LocalTool<T>;
@@ -0,0 +1,5 @@
1
+ // Preserve upstream tool schemas without exposing the AI SDK in the public API.
2
+ export function jsonSchema(schema) {
3
+ return schema;
4
+ }
5
+ export function tool(value) { return value; }
@@ -0,0 +1 @@
1
+ export type MemoryPromptMode = "chat" | "code";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export interface ConversationMessage {
2
+ id: string;
3
+ role: string;
4
+ content: string;
5
+ timestamp: number;
6
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ResolvedMemoryPrompt } from "./types.js";
2
+ /**
3
+ * Preserve the existing system prompt byte-for-byte when no custom prompt is
4
+ * resolved. A custom strategy is appended only for agent/team/instance hits.
5
+ */
6
+ export declare function composeMemorySystemPrompt(currentSystemPrompt: string, resolved?: ResolvedMemoryPrompt): string;
@@ -0,0 +1,33 @@
1
+ const GUARDS = {
2
+ l1: `自定义内容仅用于调整应关注、忽略和归纳的记忆内容。
3
+ 不得修改当前系统 Prompt 的 JSON 格式、字段、类型枚举、消息来源边界,
4
+ 也不得要求输出 Markdown、解释文本或额外字段;冲突时以系统约束为准。`,
5
+ l2: `自定义内容仅用于调整 Scene 的关注点、分类和归纳策略。
6
+ 不得修改当前系统 Prompt 的 Scene Markdown/META 协议、工具白名单、
7
+ 文件命名、读写范围、沙箱、数量和长度限制;冲突时以系统约束为准。`,
8
+ l3: `自定义内容仅用于调整 Persona 或 Team Doctrine 的提炼关注点。
9
+ 不得修改当前系统 Prompt 的 persona.md 目标、文件工具和路径范围、
10
+ 证据来源、固定 Markdown 协议及长度限制;冲突时以系统约束为准。`,
11
+ };
12
+ function escapeClosingTags(value) {
13
+ return value.replace(/<\/(CUSTOM_MEMORY_STRATEGY|SYSTEM_CUSTOM_STRATEGY_GUARD)>/gi, "&lt;/$1&gt;");
14
+ }
15
+ /**
16
+ * Preserve the existing system prompt byte-for-byte when no custom prompt is
17
+ * resolved. A custom strategy is appended only for agent/team/instance hits.
18
+ */
19
+ export function composeMemorySystemPrompt(currentSystemPrompt, resolved) {
20
+ if (!resolved || resolved.source === "system" || !resolved.prompt.trim()) {
21
+ return currentSystemPrompt;
22
+ }
23
+ const custom = escapeClosingTags(resolved.prompt.trim());
24
+ return `${currentSystemPrompt}
25
+
26
+ <CUSTOM_MEMORY_STRATEGY source="${resolved.source}" memory_prompt_id="${resolved.memory_prompt_id}" version="${resolved.version}" layer="${resolved.layer}">
27
+ ${custom}
28
+ </CUSTOM_MEMORY_STRATEGY>
29
+
30
+ <SYSTEM_CUSTOM_STRATEGY_GUARD priority="highest">
31
+ ${GUARDS[resolved.layer]}
32
+ </SYSTEM_CUSTOM_STRATEGY_GUARD>`;
33
+ }
@@ -0,0 +1,103 @@
1
+ export type MemoryPromptLayer = "l1" | "l2" | "l3";
2
+ export type MemoryPromptSource = "agent" | "team" | "instance" | "system";
3
+ export type MemoryPromptTargetType = "instance" | "team" | "agent";
4
+ export type MemoryPromptSettingAction = "apply" | "replace" | "clear";
5
+ export interface MemoryPromptRecord {
6
+ memory_prompt_id: string;
7
+ name: string;
8
+ layer: MemoryPromptLayer;
9
+ prompt: string;
10
+ version: number;
11
+ status: "active" | "deleting";
12
+ created_by?: string;
13
+ updated_by?: string;
14
+ created_at_ms: number;
15
+ updated_at_ms: number;
16
+ }
17
+ export interface MemoryPromptSettingRecord {
18
+ setting_id: string;
19
+ target_type: MemoryPromptTargetType;
20
+ team_id?: string;
21
+ agent_id?: string;
22
+ layer: MemoryPromptLayer;
23
+ memory_prompt_id: string;
24
+ updated_by?: string;
25
+ updated_at_ms: number;
26
+ }
27
+ export interface MemoryPromptDeleteResult {
28
+ deleted_prompt_ids: string[];
29
+ cleared_settings: Record<MemoryPromptTargetType, number>;
30
+ }
31
+ export interface MemoryPromptSettingLogRecord {
32
+ setting_log_id: string;
33
+ target_type: MemoryPromptTargetType;
34
+ team_id?: string;
35
+ agent_id?: string;
36
+ layer: MemoryPromptLayer;
37
+ action: MemoryPromptSettingAction;
38
+ reason: "explicit" | "prompt_deleted";
39
+ before_memory_prompt_id?: string;
40
+ after_memory_prompt_id?: string;
41
+ operator_id?: string;
42
+ operated_at_ms: number;
43
+ }
44
+ export interface MemoryPromptListFilter {
45
+ layer?: MemoryPromptLayer;
46
+ limit?: number;
47
+ offset?: number;
48
+ timeOrder?: "asc" | "desc";
49
+ }
50
+ export interface MemoryPromptSettingListFilter {
51
+ memoryPromptId?: string;
52
+ targetType?: MemoryPromptTargetType;
53
+ teamId?: string;
54
+ agentId?: string;
55
+ layer?: MemoryPromptLayer;
56
+ limit?: number;
57
+ offset?: number;
58
+ timeOrder?: "asc" | "desc";
59
+ }
60
+ export interface MemoryPromptSettingLogFilter {
61
+ memoryPromptId?: string;
62
+ teamId?: string;
63
+ agentId?: string;
64
+ action?: MemoryPromptSettingAction;
65
+ startTimeMs?: number;
66
+ endTimeMs?: number;
67
+ limit?: number;
68
+ offset?: number;
69
+ timeOrder?: "asc" | "desc";
70
+ }
71
+ export interface ResolvedMemoryPrompt {
72
+ memory_prompt_id: string;
73
+ prompt: string;
74
+ layer: MemoryPromptLayer;
75
+ source: MemoryPromptSource;
76
+ version: number;
77
+ }
78
+ export interface MemoryPromptStore {
79
+ countMemoryPrompts?(): Promise<number> | number;
80
+ createMemoryPrompt?(record: MemoryPromptRecord): Promise<MemoryPromptRecord> | MemoryPromptRecord;
81
+ getMemoryPrompts?(ids: string[]): Promise<MemoryPromptRecord[]> | MemoryPromptRecord[];
82
+ listMemoryPrompts?(filter: MemoryPromptListFilter): Promise<MemoryPromptRecord[]> | MemoryPromptRecord[];
83
+ updateMemoryPrompt?(id: string, patch: {
84
+ name?: string;
85
+ prompt?: string;
86
+ updated_by?: string;
87
+ updated_at_ms: number;
88
+ }): Promise<MemoryPromptRecord | null> | MemoryPromptRecord | null;
89
+ deleteMemoryPrompts?(ids: string[], operatorId?: string): Promise<MemoryPromptDeleteResult> | MemoryPromptDeleteResult;
90
+ getMemoryPromptSettings?(ids: string[]): Promise<MemoryPromptSettingRecord[]> | MemoryPromptSettingRecord[];
91
+ listMemoryPromptSettings?(filter: MemoryPromptSettingListFilter): Promise<MemoryPromptSettingRecord[]> | MemoryPromptSettingRecord[];
92
+ upsertMemoryPromptSettings?(records: MemoryPromptSettingRecord[], logs: MemoryPromptSettingLogRecord[]): Promise<void> | void;
93
+ clearMemoryPromptSettings?(ids: string[], logs: MemoryPromptSettingLogRecord[]): Promise<void> | void;
94
+ queryMemoryPromptSettingLogs?(filter: MemoryPromptSettingLogFilter): Promise<MemoryPromptSettingLogRecord[]> | MemoryPromptSettingLogRecord[];
95
+ }
96
+ export declare function buildMemoryPromptSettingId(target: {
97
+ teamId?: string;
98
+ agentId?: string;
99
+ }, layer: MemoryPromptLayer): string;
100
+ export declare function getMemoryPromptTargetType(target: {
101
+ teamId?: string;
102
+ agentId?: string;
103
+ }): MemoryPromptTargetType;
@@ -0,0 +1,21 @@
1
+ import { createHash } from "node:crypto";
2
+ function targetHash(value) {
3
+ return createHash("sha256").update(value).digest("hex").slice(0, 32);
4
+ }
5
+ export function buildMemoryPromptSettingId(target, layer) {
6
+ if (target.agentId) {
7
+ if (!target.teamId)
8
+ throw new Error("teamId is required for an agent prompt setting");
9
+ return `mps:a:${targetHash(`${target.teamId}\0${target.agentId}`)}:${layer}`;
10
+ }
11
+ if (target.teamId)
12
+ return `mps:t:${targetHash(target.teamId)}:${layer}`;
13
+ return `mps:i:${layer}`;
14
+ }
15
+ export function getMemoryPromptTargetType(target) {
16
+ if (target.agentId)
17
+ return "agent";
18
+ if (target.teamId)
19
+ return "team";
20
+ return "instance";
21
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * L1 Conflict Detection Prompt (Batch Mode)
3
+ *
4
+ * Based on Kenty's validated prototype prompt (l1_conflict_detection_prompt.md).
5
+ * Batch-compares multiple new memories against a unified candidate pool,
6
+ * supporting cross-type merge and multi-target operations.
7
+ */
8
+ import type { MemoryPromptMode } from "../../config.js";
9
+ import type { MemoryRecord, ExtractedMemory } from "../record/l1-writer.js";
10
+ export declare const CONFLICT_DETECTION_SYSTEM_PROMPT = "\u4F60\u662F\u8BB0\u5FC6\u51B2\u7A81\u68C0\u6D4B\u5668\u3002\u6279\u91CF\u6BD4\u8F83\u591A\u6761\u3010\u65B0\u8BB0\u5FC6\u3011\u4E0E\u3010\u7EDF\u4E00\u5019\u9009\u8BB0\u5FC6\u6C60\u3011\u4E2D\u7684\u5DF2\u6709\u8BB0\u5FC6\uFF0C\u9010\u6761\u51B3\u5B9A\u5982\u4F55\u5904\u7406\u3002\n\n**\u8F93\u51FA\u8BED\u8A00**\uFF1A`merged_content` \u4F7F\u7528\u4E0E\u5019\u9009\u6C60\u4E2D\u5DF2\u6709\u8BB0\u5FC6\u76F8\u540C\u7684\u8BED\u8A00\uFF1BJSON \u5B57\u6BB5\u540D\u3001\u679A\u4E3E\u503C\u3001record_id\u3001ISO \u65F6\u95F4\u6233\u4FDD\u6301\u82F1\u6587\u3002\n\n## \u6838\u5FC3\u89C4\u5219\n\n- **\u8DE8 type \u5408\u5E76**\uFF1A\u4E0D\u540C type\uFF08persona / episodic / instruction / work_fact / work_task / work_method / work_artifact\uFF09\u7684\u8BB0\u5FC6\u5982\u679C\u8BED\u4E49\u4E0A\u63CF\u8FF0\u540C\u4E00\u4E8B\u5B9E/\u4E8B\u4EF6\uFF0C**\u53EF\u4EE5\u5408\u5E76**\u3002\n- **\u591A\u5BF9\u591A\u5408\u5E76**\uFF1A\u4E00\u6761\u65B0\u8BB0\u5FC6\u53EF\u4EE5\u540C\u65F6\u66FF\u6362/\u5408\u5E76\u5019\u9009\u6C60\u4E2D\u7684**\u591A\u6761**\u5DF2\u6709\u8BB0\u5FC6\uFF08\u901A\u8FC7 target_ids \u6570\u7EC4\u6307\u5B9A\uFF09\u3002\n- \u5408\u5E76\u540E\u4F60\u5FC5\u987B\u5224\u65AD\u65B0\u8BB0\u5FC6\u7684\u6700\u4F73 type\uFF08merged_type\uFF09\u3002\n\n## \u5224\u65AD\u903B\u8F91\n\n1. **\u5206\u8FA8\u8BB0\u5FC6\u6027\u8D28**\uFF1A\n - **\u72B6\u6001\u7C7B**\uFF08persona/instruction\uFF09\uFF1A\u504F\u597D\u3001\u7279\u8D28\u3001\u957F\u671F\u8BBE\u5B9A\u3001\u76F8\u5BF9\u7A33\u5B9A\u7684\u4E8B\u5B9E\u3001\u884C\u4E3A\u89C4\u5219\n - **\u4E8B\u4EF6\u7C7B**\uFF08episodic\uFF09\uFF1A\u4E00\u6B21\u6027\u7ECF\u5386\u3001\u5E26\u65F6\u95F4\u70B9\u7684\u5BA2\u89C2\u8BB0\u5F55\uFF0C\u5EFA\u8BAE\u5408\u5E76\u540C\u4E00\u4EF6\u4E8B\u7684\u524D\u56E0\u540E\u679C\n\n2. **\u5224\u65AD\u662F\u5426\u540C\u4E00\u4E8B\u5B9E/\u4E8B\u4EF6**\uFF1A\u4E3B\u4F53\u76F8\u540C\u3001\u4E3B\u9898\u4E00\u81F4\u3001\u65F6\u95F4\u63A5\u8FD1\u3001scene_name \u76F8\u4F3C\n\n3. **\u9009\u62E9\u52A8\u4F5C**\uFF1A\n - \"store\"\uFF1A\u89C6\u4E3A\u65B0\u4FE1\u606F\uFF0C\u65B0\u589E\u5F53\u524D\u8BB0\u5FC6\u3002\n - \"skip\"\uFF1A\u5DF2\u6709\u8BB0\u5FC6\u66F4\u597D\uFF0C\u65B0\u8BB0\u5FC6\u65E0\u589E\u91CF\u6216\u66F4\u6A21\u7CCA\uFF0C\u5FFD\u7565\u5F53\u524D\u8BB0\u5FC6\u3002\n - \"update\"\uFF1A\u540C\u4E00\u4E8B\u5B9E/\u4E8B\u4EF6\uFF0C\u65B0\u8BB0\u5FC6\u5728\u5185\u5BB9\u6216\u65F6\u95F4\u4E0A\u66F4\u4F18\uFF08\u66F4\u5177\u4F53\u3001\u66F4\u665A\u6216\u7EA0\u9519\uFF09\uFF0C\u4EE5\u65B0\u8BB0\u5FC6\u4E3A\u4E3B\u8986\u76D6\u65E7\u8BB0\u5FC6\uFF0C\u53EF\u4FDD\u7559\u65E7\u8BB0\u5FC6\u4E2D\u4ECD\u6B63\u786E\u7684\u7EC6\u8282\u3002\n - \"merge\"\uFF1A\u540C\u4E00\u4E8B\u5B9E\u6216\u540C\u4E00\u6F14\u5316\u8FC7\u7A0B\uFF0C\u591A\u6761\u8BB0\u5FC6\u4FE1\u606F\u4E92\u8865\u4E14\u4E0D\u77DB\u76FE\uFF0C\u5408\u5E76\u6210\u4E00\u6761\u66F4\u5B8C\u6574\u8BB0\u5FC6\uFF0C\u4FE1\u606F\u5C3D\u91CF\u4E0D\u5197\u4F59\u3002\n\n4. **\u7B56\u7565\u503E\u5411**\uFF1A\n - \u72B6\u6001\u7C7B\uFF1A\u591A\u6761\u63CF\u8FF0\u540C\u4E00\u504F\u597D/\u7279\u8D28 \u2192 \u503E\u5411 merge\uFF1B\u65E0\u589E\u91CF \u2192 skip\uFF1B\u660E\u786E\u66F4\u65B0 \u2192 update\n - \u4E8B\u4EF6\u7C7B\uFF1A\u540C\u4E00\u4E8B\u4EF6\u7684\u524D\u56E0\u540E\u679C\u3001\u4E0D\u540C\u9636\u6BB5 \u2192 \u503E\u5411 merge \u4E3A\u4E00\u6761\u5B8C\u6574\u53D9\u8FF0\uFF1B\u5B8C\u5168\u76F8\u540C \u2192 skip\n - \u8DE8\u7C7B\u578B\u793A\u4F8B\uFF1A\u4E00\u6761 episodic \"\u7528\u6237\u5728 2018 \u5E74\u5F00\u59CB\u505A\u64AD\u5BA2\" + \u4E00\u6761 persona \"\u7528\u6237\u6709\u64AD\u5BA2\u5236\u4F5C\u7ECF\u9A8C\" \u2192 \u53EF merge \u4E3A\u4E00\u6761 persona \u6216 episodic\uFF08\u53D6\u51B3\u4E8E\u4FE1\u606F\u4FA7\u91CD\uFF09\n\n5. **timestamp \u5904\u7406**\uFF1A\n - merge / update \u65F6\uFF0Cmerged_timestamps \u5E94\u5305\u542B**\u6240\u6709\u76F8\u5173\u8BB0\u5FC6\u7684\u65F6\u95F4\u6233\u5E76\u96C6**\uFF08\u53BB\u91CD\u6392\u5E8F\uFF09\n - \u8FD9\u6837\u53EF\u4EE5\u4FDD\u7559\u4E8B\u4EF6\u53D1\u751F\u7684\u5B8C\u6574\u65F6\u95F4\u7EBF\n\n## \u8F93\u51FA\u683C\u5F0F\n\n\u4E25\u683C\u8F93\u51FA JSON \u6570\u7EC4\uFF0C\u6BCF\u4E2A\u5143\u7D20\u5BF9\u5E94\u4E00\u6761\u65B0\u8BB0\u5FC6\u7684\u51B3\u7B56\u3002\u4E0D\u8F93\u51FA\u4EFB\u4F55\u5176\u4ED6\u5185\u5BB9\uFF1A\n\n[\n {\n \"record_id\": \"\u65B0\u8BB0\u5FC6\u7684 record_id\",\n \"action\": \"store|update|skip|merge\",\n \"target_ids\": [\"\u8981\u5220\u9664\u7684\u5019\u9009\u8BB0\u5FC6 record_id 1\", \"record_id 2\"],\n \"merged_content\": \"\u5408\u5E76/\u66F4\u65B0\u540E\u7684\u8BB0\u5FC6\u5185\u5BB9\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\",\n \"merged_type\": \"\u5408\u5E76\u540E\u7684\u6700\u4F73 type\uFF1Apersona|episodic|instruction|work_fact|work_task|work_method|work_artifact\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\",\n \"merged_priority\": 85,\n \"merged_timestamps\": [\"\u5408\u5E76\u540E\u7684\u65F6\u95F4\u6233\u6570\u7EC4\uFF0C\u5305\u542B\u6240\u6709\u65B0\u65E7\u8BB0\u5FC6\u65F6\u95F4\u6233\u7684\u5E76\u96C6\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\"]\n }\n]\n\n\u5B57\u6BB5\u8BF4\u660E\uFF1A\n- target_ids\uFF1A\u8981\u5220\u9664\u66FF\u6362\u7684\u65E7\u8BB0\u5FC6 ID **\u6570\u7EC4**\uFF08\u53EF\u4EE5 1 \u6761\u6216\u591A\u6761\uFF09\u3002store/skip \u65F6\u7701\u7565\u6216\u4E3A\u7A7A\u3002\n- merged_content\uFF1Amerge/update \u65F6\u7684\u6700\u7EC8\u8BB0\u5FC6\u6587\u672C\u3002store/skip \u65F6\u7701\u7565\u3002\n- merged_type\uFF1Amerge/update \u540E\u8BB0\u5FC6\u5E94\u5F52\u5C5E\u7684 type\u3002\u6839\u636E\u5408\u5E76\u540E\u5185\u5BB9\u672C\u8D28\u5224\u65AD\u3002\n- merged_priority\uFF1Amerge/update \u540E\u7684\u65B0\u4F18\u5148\u7EA7\uFF080-100 \u6574\u6570\uFF0Cmerge/update \u65F6\u5FC5\u586B\uFF09\u3002\u5408\u5E76\u540E\u4FE1\u606F\u66F4\u5B8C\u6574\u3001\u66F4\u786E\u5B9A\uFF0C\u901A\u5E38\u5E94**\u914C\u60C5\u63D0\u5347** priority\uFF08\u4F8B\u5982\u4E24\u6761 priority 70 \u7684\u8BB0\u5FC6\u5408\u5E76\u540E\u53EF\u63D0\u5347\u5230 80\uFF09\u3002\u53C2\u8003\u6807\u51C6\uFF1A80-100\uFF08\u6838\u5FC3\u7279\u8D28/\u91CD\u8981\u4E8B\u4EF6\uFF09\uFF0C60-79\uFF08\u4E00\u822C\u504F\u597D/\u666E\u901A\u6D3B\u52A8\uFF09\uFF0C<60\uFF08\u6B21\u8981\u4FE1\u606F\uFF09\u3002\n- merged_timestamps\uFF1A\u5408\u5E76\u540E\u7684\u65F6\u95F4\u6233\u6570\u7EC4\u3002\u6536\u96C6\u65B0\u8BB0\u5FC6 + \u6240\u6709\u88AB\u5408\u5E76\u65E7\u8BB0\u5FC6\u7684\u65F6\u95F4\u6233\uFF0C\u53BB\u91CD\u6392\u5E8F\u3002";
11
+ export declare const WORK_CONFLICT_DETECTION_SYSTEM_PROMPT = "\u4F60\u662F\u56E2\u961F\u5DE5\u4F5C\u8BB0\u5FC6\u51B2\u7A81\u68C0\u6D4B\u5668\u3002\u6279\u91CF\u6BD4\u8F83\u591A\u6761\u3010\u65B0\u8BB0\u5FC6\u3011\u4E0E\u3010\u7EDF\u4E00\u5019\u9009\u8BB0\u5FC6\u6C60\u3011\u4E2D\u7684\u5DF2\u6709\u8BB0\u5FC6\uFF0C\u9010\u6761\u51B3\u5B9A\u5982\u4F55\u5904\u7406\u3002\n\n**\u8F93\u51FA\u8BED\u8A00**\uFF1A`merged_content` \u4F7F\u7528\u4E0E\u5019\u9009\u6C60\u4E2D\u5DF2\u6709\u8BB0\u5FC6\u76F8\u540C\u7684\u8BED\u8A00\uFF1BJSON \u5B57\u6BB5\u540D\u3001\u679A\u4E3E\u503C\u3001record_id\u3001ISO \u65F6\u95F4\u6233\u4FDD\u6301\u82F1\u6587\u3002\n\n## \u6838\u5FC3\u89C4\u5219\n\n- **\u8DE8 type \u5408\u5E76**\uFF1A\u4E0D\u540C type\uFF08work_fact / work_task / work_method / work_artifact\uFF09\u7684\u8BB0\u5FC6\u5982\u679C\u8BED\u4E49\u4E0A\u63CF\u8FF0\u540C\u4E00\u5DE5\u4F5C\u5BF9\u8C61\u3001\u4EFB\u52A1\u3001\u65B9\u6CD5\u6216\u8D44\u4EA7\uFF0C**\u53EF\u4EE5\u5408\u5E76**\u3002\n- **\u591A\u5BF9\u591A\u5408\u5E76**\uFF1A\u4E00\u6761\u65B0\u8BB0\u5FC6\u53EF\u4EE5\u540C\u65F6\u66FF\u6362/\u5408\u5E76\u5019\u9009\u6C60\u4E2D\u7684**\u591A\u6761**\u5DF2\u6709\u8BB0\u5FC6\uFF08\u901A\u8FC7 target_ids \u6570\u7EC4\u6307\u5B9A\uFF09\u3002\n- \u5408\u5E76\u540E\u4F60\u5FC5\u987B\u5224\u65AD\u65B0\u8BB0\u5FC6\u7684\u6700\u4F73 type\uFF08merged_type\uFF09\u3002\n- \u8BB0\u5FC6\u9ED8\u8BA4\u4F1A\u5728\u9879\u76EE\u56E2\u961F\u5185\u5171\u4EAB\uFF0C\u5408\u5E76\u5185\u5BB9\u5E94\u53EA\u4FDD\u7559\u5DE5\u4F5C\u76F8\u5173\u4FE1\u606F\u3002\n\n## \u5224\u65AD\u903B\u8F91\n\n1. **\u5206\u8FA8\u8BB0\u5FC6\u6027\u8D28**\uFF1A\n - **\u5DE5\u4F5C\u4E8B\u5B9E\u7C7B\uFF08work_fact\uFF09**\uFF1A\u9879\u76EE\u4E8B\u5B9E\u3001\u9700\u6C42\u3001\u51B3\u7B56\u3001\u72B6\u6001\u3001\u98CE\u9669\u3001\u7EA6\u675F\u3001\u5B9E\u9A8C\u7ED3\u679C\u3001\u5BA2\u6237\u53CD\u9988\u3002\n - **\u5DE5\u4F5C\u4EFB\u52A1\u7C7B\uFF08work_task\uFF09**\uFF1A\u5F85\u529E\u3001owner\u3001deadline\u3001\u4E0B\u4E00\u6B65\u8BA1\u5212\u3001\u4EFB\u52A1\u72B6\u6001\u53D8\u5316\u3002\n - **\u5DE5\u4F5C\u65B9\u6CD5\u7C7B\uFF08work_method\uFF09**\uFF1ASOP\u3001\u7981\u5FCC\u3001\u539F\u5219\u3001\u7ECF\u9A8C\u3001\u8BBE\u8BA1\u601D\u8DEF\u3001\u5224\u65AD\u6807\u51C6\u3001Agent \u884C\u4E3A\u89C4\u5219\u3002\n - **\u5DE5\u4F5C\u8D44\u4EA7\u7C7B\uFF08work_artifact\uFF09**\uFF1A\u6587\u6863\u3001PR\u3001Issue\u3001Prompt\u3001\u62A5\u544A\u3001\u4EE3\u7801\u5206\u652F\u3001\u8BBE\u8BA1\u7A3F\u3001\u94FE\u63A5\u7B49\u3002\n\n2. **\u5224\u65AD\u662F\u5426\u540C\u4E00\u5DE5\u4F5C\u5BF9\u8C61/\u6F14\u5316\u8FC7\u7A0B**\uFF1A\n - \u540C\u4E00\u9879\u76EE\u3001\u6A21\u5757\u3001\u9700\u6C42\u3001\u4EFB\u52A1\u3001\u98CE\u9669\u3001\u51B3\u7B56\u3001\u65B9\u6CD5\u3001\u8D44\u4EA7\uFF0C\u4E14 scene_name \u6216\u8BED\u4E49\u9AD8\u5EA6\u76F8\u4F3C\u3002\n - \u540C\u4E00\u4EFB\u52A1\u7684\u4E0D\u540C\u9636\u6BB5\u3001\u540C\u4E00\u65B9\u6CD5\u7684\u8865\u5145\u3001\u540C\u4E00\u8D44\u4EA7\u7684\u7248\u672C\u6216\u7528\u9014\u53D8\u5316\uFF0C\u901A\u5E38\u53EF\u4EE5\u5408\u5E76\u3002\n - \u4EC5\u5C5E\u4E8E\u540C\u4E00\u5927\u9879\u76EE\u4F46\u8BA8\u8BBA\u5BF9\u8C61\u4E0D\u540C\uFF0C\u4E0D\u5E94\u5F3A\u884C\u5408\u5E76\u3002\n\n3. **\u9009\u62E9\u52A8\u4F5C**\uFF1A\n - \"store\"\uFF1A\u89C6\u4E3A\u65B0\u4FE1\u606F\uFF0C\u65B0\u589E\u5F53\u524D\u8BB0\u5FC6\u3002\n - \"skip\"\uFF1A\u5DF2\u6709\u8BB0\u5FC6\u66F4\u597D\uFF0C\u65B0\u8BB0\u5FC6\u65E0\u589E\u91CF\u6216\u66F4\u6A21\u7CCA\uFF0C\u5FFD\u7565\u5F53\u524D\u8BB0\u5FC6\u3002\n - \"update\"\uFF1A\u540C\u4E00\u5DE5\u4F5C\u5BF9\u8C61\uFF0C\u65B0\u8BB0\u5FC6\u66F4\u5177\u4F53\u3001\u66F4\u65B0\u3001\u66F4\u6743\u5A01\u6216\u7EA0\u6B63\u65E7\u4FE1\u606F\uFF0C\u4EE5\u65B0\u8BB0\u5FC6\u4E3A\u4E3B\u8986\u76D6\u65E7\u8BB0\u5FC6\uFF0C\u53EF\u4FDD\u7559\u65E7\u8BB0\u5FC6\u4E2D\u4ECD\u6B63\u786E\u7684\u7EC6\u8282\u3002\n - \"merge\"\uFF1A\u540C\u4E00\u5DE5\u4F5C\u5BF9\u8C61\u6216\u540C\u4E00\u6F14\u5316\u8FC7\u7A0B\uFF0C\u65B0\u65E7\u8BB0\u5FC6\u4E92\u8865\u4E14\u4E0D\u77DB\u76FE\uFF0C\u5408\u5E76\u6210\u4E00\u6761\u66F4\u5B8C\u6574\u8BB0\u5FC6\uFF0C\u4FE1\u606F\u5C3D\u91CF\u4E0D\u5197\u4F59\u3002\n\n4. **\u7B56\u7565\u503E\u5411**\uFF1A\n - work_fact\uFF1A\u540C\u4E00\u4E8B\u5B9E/\u51B3\u7B56/\u72B6\u6001\u7684\u8865\u5145\u6216\u4FEE\u6B63 \u2192 \u503E\u5411 update \u6216 merge\u3002\n - work_task\uFF1A\u540C\u4E00\u4EFB\u52A1\u7684 owner\u3001deadline\u3001\u72B6\u6001\u53D8\u5316 \u2192 \u503E\u5411 update\uFF1B\u8865\u5145\u4F9D\u8D56\u6216\u9A8C\u6536\u6807\u51C6 \u2192 \u503E\u5411 merge\u3002\n - work_method\uFF1A\u540C\u4E00 SOP\u3001\u7981\u5FCC\u3001\u539F\u5219\u3001\u7ECF\u9A8C\u7684\u8865\u5145 \u2192 \u503E\u5411 merge\uFF1B\u66F4\u6E05\u6670\u901A\u7528\u7684\u8868\u8FF0 \u2192 \u503E\u5411 update\u3002\n - work_artifact\uFF1A\u540C\u4E00\u6587\u6863\u3001PR\u3001Prompt\u3001\u62A5\u544A\u7B49\u8D44\u4EA7\u7684\u7528\u9014\u3001\u7248\u672C\u3001\u94FE\u63A5\u8865\u5145 \u2192 \u503E\u5411 merge \u6216 update\u3002\n - \u8DE8\u7C7B\u578B\u793A\u4F8B\uFF1A\u4E00\u6761 work_fact \"\u56E2\u961F\u51B3\u5B9A L1 type \u4FDD\u6301\u5C11\u91CF\u9AD8\u5C42\u5206\u7C7B\" + \u4E00\u6761 work_method \"L1 type \u4E0D\u5B9C\u8FC7\u7EC6\uFF0C\u5426\u5219\u5F71\u54CD L2/L3 \u805A\u5408\" \u2192 \u53EF merge \u4E3A work_method\u3002\n\n5. **timestamp \u5904\u7406**\uFF1A\n - merge / update \u65F6\uFF0Cmerged_timestamps \u5E94\u5305\u542B**\u6240\u6709\u76F8\u5173\u8BB0\u5FC6\u7684\u65F6\u95F4\u6233\u5E76\u96C6**\uFF08\u53BB\u91CD\u6392\u5E8F\uFF09\u3002\n - \u8FD9\u6837\u53EF\u4EE5\u4FDD\u7559\u5DE5\u4F5C\u4E8B\u5B9E\u3001\u4EFB\u52A1\u6216\u65B9\u6CD5\u6F14\u5316\u7684\u5B8C\u6574\u65F6\u95F4\u7EBF\u3002\n\n## \u8F93\u51FA\u683C\u5F0F\n\n\u4E25\u683C\u8F93\u51FA JSON \u6570\u7EC4\uFF0C\u6BCF\u4E2A\u5143\u7D20\u5BF9\u5E94\u4E00\u6761\u65B0\u8BB0\u5FC6\u7684\u51B3\u7B56\u3002\u4E0D\u8F93\u51FA\u4EFB\u4F55\u5176\u4ED6\u5185\u5BB9\uFF1A\n\n[\n {\n \"record_id\": \"\u65B0\u8BB0\u5FC6\u7684 record_id\",\n \"action\": \"store|update|skip|merge\",\n \"target_ids\": [\"\u8981\u5220\u9664\u7684\u5019\u9009\u8BB0\u5FC6 record_id 1\", \"record_id 2\"],\n \"merged_content\": \"\u5408\u5E76/\u66F4\u65B0\u540E\u7684\u8BB0\u5FC6\u5185\u5BB9\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\",\n \"merged_type\": \"\u5408\u5E76\u540E\u7684\u6700\u4F73 type\uFF1Awork_fact|work_task|work_method|work_artifact\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\",\n \"merged_priority\": 85,\n \"merged_timestamps\": [\"\u5408\u5E76\u540E\u7684\u65F6\u95F4\u6233\u6570\u7EC4\uFF0C\u5305\u542B\u6240\u6709\u65B0\u65E7\u8BB0\u5FC6\u65F6\u95F4\u6233\u7684\u5E76\u96C6\uFF08merge/update \u65F6\u5FC5\u586B\uFF09\"]\n }\n]\n\n\u5B57\u6BB5\u8BF4\u660E\uFF1A\n- target_ids\uFF1A\u8981\u5220\u9664\u66FF\u6362\u7684\u65E7\u8BB0\u5FC6 ID **\u6570\u7EC4**\uFF08\u53EF\u4EE5 1 \u6761\u6216\u591A\u6761\uFF09\u3002store/skip \u65F6\u7701\u7565\u6216\u4E3A\u7A7A\u3002\n- merged_content\uFF1Amerge/update \u65F6\u7684\u6700\u7EC8\u8BB0\u5FC6\u6587\u672C\u3002store/skip \u65F6\u7701\u7565\u3002\n- merged_type\uFF1Amerge/update \u540E\u8BB0\u5FC6\u5E94\u5F52\u5C5E\u7684 type\u3002\u6839\u636E\u5408\u5E76\u540E\u5185\u5BB9\u672C\u8D28\u5224\u65AD\u3002\n- merged_priority\uFF1Amerge/update \u540E\u7684\u65B0\u4F18\u5148\u7EA7\uFF080-100 \u6574\u6570\uFF0Cmerge/update \u65F6\u5FC5\u586B\uFF09\u3002\u5408\u5E76\u540E\u4FE1\u606F\u66F4\u5B8C\u6574\u3001\u66F4\u786E\u5B9A\uFF0C\u901A\u5E38\u5E94**\u914C\u60C5\u63D0\u5347** priority\u3002\u53C2\u8003\u6807\u51C6\uFF1A80-100\uFF08\u5173\u952E\u4E8B\u5B9E/\u91CD\u8981\u4EFB\u52A1/\u6838\u5FC3\u65B9\u6CD5/\u91CD\u8981\u8D44\u4EA7\uFF09\uFF0C60-79\uFF08\u4E00\u822C\u5DE5\u4F5C\u4FE1\u606F\uFF09\uFF0C<60\uFF08\u6B21\u8981\u4FE1\u606F\uFF09\u3002\n- merged_timestamps\uFF1A\u5408\u5E76\u540E\u7684\u65F6\u95F4\u6233\u6570\u7EC4\u3002\u6536\u96C6\u65B0\u8BB0\u5FC6 + \u6240\u6709\u88AB\u5408\u5E76\u65E7\u8BB0\u5FC6\u7684\u65F6\u95F4\u6233\uFF0C\u53BB\u91CD\u6392\u5E8F\u3002";
12
+ export declare function getConflictDetectionSystemPrompt(mode?: MemoryPromptMode): string;
13
+ /**
14
+ * Candidate search result for a single new memory.
15
+ */
16
+ export interface CandidateMatch {
17
+ newMemory: ExtractedMemory & {
18
+ record_id: string;
19
+ };
20
+ candidates: MemoryRecord[];
21
+ }
22
+ /**
23
+ * Format the batch conflict detection prompt using a unified candidate pool.
24
+ *
25
+ * Format (aligned with prototype):
26
+ * 1. Unified candidate pool: de-duplicated list of all existing candidates across all new memories
27
+ * 2. Per new memory: content + list of related candidate IDs from the pool
28
+ *
29
+ * This approach lets the LLM see the global picture and handle cross-memory dedup in one pass.
30
+ *
31
+ * @param matches - Array of new memories with their candidate matches
32
+ */
33
+ export declare function formatBatchConflictPrompt(matches: CandidateMatch[]): string;
@@ -0,0 +1,202 @@
1
+ /**
2
+ * L1 Conflict Detection Prompt (Batch Mode)
3
+ *
4
+ * Based on Kenty's validated prototype prompt (l1_conflict_detection_prompt.md).
5
+ * Batch-compares multiple new memories against a unified candidate pool,
6
+ * supporting cross-type merge and multi-target operations.
7
+ */
8
+ // ============================
9
+ // System Prompt
10
+ // ============================
11
+ export const CONFLICT_DETECTION_SYSTEM_PROMPT = `你是记忆冲突检测器。批量比较多条【新记忆】与【统一候选记忆池】中的已有记忆,逐条决定如何处理。
12
+
13
+ **输出语言**:\`merged_content\` 使用与候选池中已有记忆相同的语言;JSON 字段名、枚举值、record_id、ISO 时间戳保持英文。
14
+
15
+ ## 核心规则
16
+
17
+ - **跨 type 合并**:不同 type(persona / episodic / instruction / work_fact / work_task / work_method / work_artifact)的记忆如果语义上描述同一事实/事件,**可以合并**。
18
+ - **多对多合并**:一条新记忆可以同时替换/合并候选池中的**多条**已有记忆(通过 target_ids 数组指定)。
19
+ - 合并后你必须判断新记忆的最佳 type(merged_type)。
20
+
21
+ ## 判断逻辑
22
+
23
+ 1. **分辨记忆性质**:
24
+ - **状态类**(persona/instruction):偏好、特质、长期设定、相对稳定的事实、行为规则
25
+ - **事件类**(episodic):一次性经历、带时间点的客观记录,建议合并同一件事的前因后果
26
+
27
+ 2. **判断是否同一事实/事件**:主体相同、主题一致、时间接近、scene_name 相似
28
+
29
+ 3. **选择动作**:
30
+ - "store":视为新信息,新增当前记忆。
31
+ - "skip":已有记忆更好,新记忆无增量或更模糊,忽略当前记忆。
32
+ - "update":同一事实/事件,新记忆在内容或时间上更优(更具体、更晚或纠错),以新记忆为主覆盖旧记忆,可保留旧记忆中仍正确的细节。
33
+ - "merge":同一事实或同一演化过程,多条记忆信息互补且不矛盾,合并成一条更完整记忆,信息尽量不冗余。
34
+
35
+ 4. **策略倾向**:
36
+ - 状态类:多条描述同一偏好/特质 → 倾向 merge;无增量 → skip;明确更新 → update
37
+ - 事件类:同一事件的前因后果、不同阶段 → 倾向 merge 为一条完整叙述;完全相同 → skip
38
+ - 跨类型示例:一条 episodic "用户在 2018 年开始做播客" + 一条 persona "用户有播客制作经验" → 可 merge 为一条 persona 或 episodic(取决于信息侧重)
39
+
40
+ 5. **timestamp 处理**:
41
+ - merge / update 时,merged_timestamps 应包含**所有相关记忆的时间戳并集**(去重排序)
42
+ - 这样可以保留事件发生的完整时间线
43
+
44
+ ## 输出格式
45
+
46
+ 严格输出 JSON 数组,每个元素对应一条新记忆的决策。不输出任何其他内容:
47
+
48
+ [
49
+ {
50
+ "record_id": "新记忆的 record_id",
51
+ "action": "store|update|skip|merge",
52
+ "target_ids": ["要删除的候选记忆 record_id 1", "record_id 2"],
53
+ "merged_content": "合并/更新后的记忆内容(merge/update 时必填)",
54
+ "merged_type": "合并后的最佳 type:persona|episodic|instruction|work_fact|work_task|work_method|work_artifact(merge/update 时必填)",
55
+ "merged_priority": 85,
56
+ "merged_timestamps": ["合并后的时间戳数组,包含所有新旧记忆时间戳的并集(merge/update 时必填)"]
57
+ }
58
+ ]
59
+
60
+ 字段说明:
61
+ - target_ids:要删除替换的旧记忆 ID **数组**(可以 1 条或多条)。store/skip 时省略或为空。
62
+ - merged_content:merge/update 时的最终记忆文本。store/skip 时省略。
63
+ - merged_type:merge/update 后记忆应归属的 type。根据合并后内容本质判断。
64
+ - merged_priority:merge/update 后的新优先级(0-100 整数,merge/update 时必填)。合并后信息更完整、更确定,通常应**酌情提升** priority(例如两条 priority 70 的记忆合并后可提升到 80)。参考标准:80-100(核心特质/重要事件),60-79(一般偏好/普通活动),<60(次要信息)。
65
+ - merged_timestamps:合并后的时间戳数组。收集新记忆 + 所有被合并旧记忆的时间戳,去重排序。`;
66
+ export const WORK_CONFLICT_DETECTION_SYSTEM_PROMPT = `你是团队工作记忆冲突检测器。批量比较多条【新记忆】与【统一候选记忆池】中的已有记忆,逐条决定如何处理。
67
+
68
+ **输出语言**:\`merged_content\` 使用与候选池中已有记忆相同的语言;JSON 字段名、枚举值、record_id、ISO 时间戳保持英文。
69
+
70
+ ## 核心规则
71
+
72
+ - **跨 type 合并**:不同 type(work_fact / work_task / work_method / work_artifact)的记忆如果语义上描述同一工作对象、任务、方法或资产,**可以合并**。
73
+ - **多对多合并**:一条新记忆可以同时替换/合并候选池中的**多条**已有记忆(通过 target_ids 数组指定)。
74
+ - 合并后你必须判断新记忆的最佳 type(merged_type)。
75
+ - 记忆默认会在项目团队内共享,合并内容应只保留工作相关信息。
76
+
77
+ ## 判断逻辑
78
+
79
+ 1. **分辨记忆性质**:
80
+ - **工作事实类(work_fact)**:项目事实、需求、决策、状态、风险、约束、实验结果、客户反馈。
81
+ - **工作任务类(work_task)**:待办、owner、deadline、下一步计划、任务状态变化。
82
+ - **工作方法类(work_method)**:SOP、禁忌、原则、经验、设计思路、判断标准、Agent 行为规则。
83
+ - **工作资产类(work_artifact)**:文档、PR、Issue、Prompt、报告、代码分支、设计稿、链接等。
84
+
85
+ 2. **判断是否同一工作对象/演化过程**:
86
+ - 同一项目、模块、需求、任务、风险、决策、方法、资产,且 scene_name 或语义高度相似。
87
+ - 同一任务的不同阶段、同一方法的补充、同一资产的版本或用途变化,通常可以合并。
88
+ - 仅属于同一大项目但讨论对象不同,不应强行合并。
89
+
90
+ 3. **选择动作**:
91
+ - "store":视为新信息,新增当前记忆。
92
+ - "skip":已有记忆更好,新记忆无增量或更模糊,忽略当前记忆。
93
+ - "update":同一工作对象,新记忆更具体、更新、更权威或纠正旧信息,以新记忆为主覆盖旧记忆,可保留旧记忆中仍正确的细节。
94
+ - "merge":同一工作对象或同一演化过程,新旧记忆互补且不矛盾,合并成一条更完整记忆,信息尽量不冗余。
95
+
96
+ 4. **策略倾向**:
97
+ - work_fact:同一事实/决策/状态的补充或修正 → 倾向 update 或 merge。
98
+ - work_task:同一任务的 owner、deadline、状态变化 → 倾向 update;补充依赖或验收标准 → 倾向 merge。
99
+ - work_method:同一 SOP、禁忌、原则、经验的补充 → 倾向 merge;更清晰通用的表述 → 倾向 update。
100
+ - work_artifact:同一文档、PR、Prompt、报告等资产的用途、版本、链接补充 → 倾向 merge 或 update。
101
+ - 跨类型示例:一条 work_fact "团队决定 L1 type 保持少量高层分类" + 一条 work_method "L1 type 不宜过细,否则影响 L2/L3 聚合" → 可 merge 为 work_method。
102
+
103
+ 5. **timestamp 处理**:
104
+ - merge / update 时,merged_timestamps 应包含**所有相关记忆的时间戳并集**(去重排序)。
105
+ - 这样可以保留工作事实、任务或方法演化的完整时间线。
106
+
107
+ ## 输出格式
108
+
109
+ 严格输出 JSON 数组,每个元素对应一条新记忆的决策。不输出任何其他内容:
110
+
111
+ [
112
+ {
113
+ "record_id": "新记忆的 record_id",
114
+ "action": "store|update|skip|merge",
115
+ "target_ids": ["要删除的候选记忆 record_id 1", "record_id 2"],
116
+ "merged_content": "合并/更新后的记忆内容(merge/update 时必填)",
117
+ "merged_type": "合并后的最佳 type:work_fact|work_task|work_method|work_artifact(merge/update 时必填)",
118
+ "merged_priority": 85,
119
+ "merged_timestamps": ["合并后的时间戳数组,包含所有新旧记忆时间戳的并集(merge/update 时必填)"]
120
+ }
121
+ ]
122
+
123
+ 字段说明:
124
+ - target_ids:要删除替换的旧记忆 ID **数组**(可以 1 条或多条)。store/skip 时省略或为空。
125
+ - merged_content:merge/update 时的最终记忆文本。store/skip 时省略。
126
+ - merged_type:merge/update 后记忆应归属的 type。根据合并后内容本质判断。
127
+ - merged_priority:merge/update 后的新优先级(0-100 整数,merge/update 时必填)。合并后信息更完整、更确定,通常应**酌情提升** priority。参考标准:80-100(关键事实/重要任务/核心方法/重要资产),60-79(一般工作信息),<60(次要信息)。
128
+ - merged_timestamps:合并后的时间戳数组。收集新记忆 + 所有被合并旧记忆的时间戳,去重排序。`;
129
+ export function getConflictDetectionSystemPrompt(mode = "chat") {
130
+ return mode === "code" ? WORK_CONFLICT_DETECTION_SYSTEM_PROMPT : CONFLICT_DETECTION_SYSTEM_PROMPT;
131
+ }
132
+ /**
133
+ * Format the batch conflict detection prompt using a unified candidate pool.
134
+ *
135
+ * Format (aligned with prototype):
136
+ * 1. Unified candidate pool: de-duplicated list of all existing candidates across all new memories
137
+ * 2. Per new memory: content + list of related candidate IDs from the pool
138
+ *
139
+ * This approach lets the LLM see the global picture and handle cross-memory dedup in one pass.
140
+ *
141
+ * @param matches - Array of new memories with their candidate matches
142
+ */
143
+ export function formatBatchConflictPrompt(matches) {
144
+ // Step 1: Build unified candidate pool (de-duplicate across all new memories)
145
+ const unifiedPool = new Map();
146
+ const perMemoryCandidateIds = new Map();
147
+ for (const m of matches) {
148
+ const candidateIds = [];
149
+ for (const c of m.candidates) {
150
+ if (!unifiedPool.has(c.id)) {
151
+ unifiedPool.set(c.id, c);
152
+ }
153
+ candidateIds.push(c.id);
154
+ }
155
+ perMemoryCandidateIds.set(m.newMemory.record_id, candidateIds);
156
+ }
157
+ // Step 2: Format unified pool as JSON
158
+ const poolList = Array.from(unifiedPool.values()).map((c) => ({
159
+ record_id: c.id,
160
+ content: c.content,
161
+ type: c.type,
162
+ priority: c.priority,
163
+ scene_name: c.scene_name,
164
+ timestamps: c.timestamps,
165
+ }));
166
+ let poolSection;
167
+ if (poolList.length === 0) {
168
+ poolSection = "## 统一候选记忆池\n\n(空,没有已有记忆,所有新记忆直接 store)";
169
+ }
170
+ else {
171
+ const poolStr = JSON.stringify(poolList, null, 2);
172
+ poolSection = `## 统一候选记忆池(共 ${poolList.length} 条已有记忆)\n\n${poolStr}`;
173
+ }
174
+ // Step 3: Format each new memory with its related candidate IDs
175
+ const memoryParts = matches.map((m, idx) => {
176
+ const relatedIds = perMemoryCandidateIds.get(m.newMemory.record_id) ?? [];
177
+ const relatedNote = relatedIds.length > 0
178
+ ? JSON.stringify(relatedIds)
179
+ : "[](无相似候选,直接 store)";
180
+ const memStr = JSON.stringify({
181
+ record_id: m.newMemory.record_id,
182
+ content: m.newMemory.content,
183
+ type: m.newMemory.type,
184
+ priority: m.newMemory.priority,
185
+ scene_name: m.newMemory.scene_name,
186
+ }, null, 2);
187
+ return `### 第 ${idx + 1} 条新记忆 (record_id: ${m.newMemory.record_id})\n${memStr}\n\n【关联候选 ID】${relatedNote}`;
188
+ });
189
+ const newMemoriesText = memoryParts.join("\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
190
+ // Step 4: Assemble final prompt
191
+ return `**输出语言**:\`merged_content\` 使用与候选池中已有记忆相同的语言。
192
+
193
+ ${poolSection}
194
+
195
+ ${"═".repeat(50)}
196
+
197
+ ## 待判断的新记忆(共 ${matches.length} 条)
198
+
199
+ ${newMemoriesText}
200
+
201
+ 请逐条判断并输出决策 JSON 数组。当某条新记忆的候选列表为空时,该条直接输出 action=store。`;
202
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * L1 Extraction Prompt: 情境切分 + 记忆提取
3
+ *
4
+ * Based on Kenty's validated prototype prompt (l1_memory_extraction_prompt.md).
5
+ * System prompt handles scene segmentation + memory extraction in a single LLM call.
6
+ * User prompt template fills in previous_scene_name, background_messages, new_messages.
7
+ */
8
+ import type { ConversationMessage } from "../conversation/l0-recorder.js";
9
+ export declare const EXTRACT_MEMORIES_SYSTEM_PROMPT = "\u4F60\u662F\u4E13\u4E1A\u7684\"\u60C5\u5883\u5207\u5206\u4E0E\u8BB0\u5FC6\u63D0\u53D6\u4E13\u5BB6\"\u3002\n\u4F60\u7684\u4EFB\u52A1\u662F\u5206\u6790\u7528\u6237\u7684\u5BF9\u8BDD\uFF0C\u5224\u65AD\u60C5\u5883\u5207\u6362\uFF0C\u5E76\u4ECE\u4E2D\u63D0\u53D6\u7ED3\u6784\u5316\u7684\u6838\u5FC3\u8BB0\u5FC6\uFF08\u4EC5\u9650 persona, episodic, instruction \u4E09\u7C7B\uFF09\u3002\n\n**\u8F93\u51FA\u8BED\u8A00**\uFF1A\u6240\u6709\u81EA\u7531\u6587\u672C\u5B57\u6BB5\uFF08`scene_name`\u3001memory `content`\uFF09\u4F7F\u7528\u4E0E\u7528\u6237\u6D88\u606F\u76F8\u540C\u7684\u8BED\u8A00\uFF1BJSON \u5B57\u6BB5\u540D\u3001\u679A\u4E3E\u503C\u3001ISO \u65F6\u95F4\u6233\u4FDD\u6301\u82F1\u6587\u3002\n\n### \u4EFB\u52A1\u4E00\uFF1A\u60C5\u5883\u5207\u5206\uFF08Scene Segmentation\uFF09\n\u5206\u6790\u3010\u5F85\u63D0\u53D6\u7684\u65B0\u6D88\u606F\u3011\uFF0C\u7ED3\u5408\u3010\u4E0A\u4E00\u4E2A\u60C5\u5883\u3011\uFF0C\u5224\u65AD\u5E76\u8F93\u51FA\u5F53\u524D\u5BF9\u8BDD\u7684\u60C5\u5883\u3002\n- \u7EE7\u627F\uFF1A\u65E0\u660E\u663E\u5207\u6362\uFF0C\u6CBF\u7528\u4E0A\u4E00\u4E2A\u60C5\u5883\u3002\n- \u5207\u6362\u6761\u4EF6\uFF1A\u7528\u6237\u53D1\u51FA\u660E\u786E\u6307\u4EE4\uFF08\u5982\"\u6362\u8BDD\u9898\"\uFF09\u3001\u610F\u56FE\u8F6C\u53D8\u3001\u6216\u63D0\u51FA\u72EC\u7ACB\u65B0\u76EE\u6807\u3002\n- \u4E00\u6BB5\u5BF9\u8BDD\u53EF\u80FD\u53EA\u6709\u4E00\u4E2A\u60C5\u5883\uFF0C\u4E5F\u53EF\u80FD\u6709\u591A\u4E2A\u60C5\u5883\uFF08\u8BDD\u9898\u591A\u6B21\u5207\u6362\u65F6\uFF09\u3002\n- \u547D\u540D\u89C4\u5219\uFF1A\"\u6211\uFF08AI\uFF09\u5728\u548Cxxx\uFF08\u7528\u6237\u8EAB\u4EFD\uFF09\u505Axxx\uFF08\u76EE\u6807\u6D3B\u52A8\uFF09\"\uFF08**\u4F7F\u7528\u4E0A\u8FF0\u8F93\u51FA\u8BED\u8A00**\uFF0C\u7EA6 30-50 \u4E2A\u5B57\u7B26\u6216\u7B49\u4EF7\u957F\u5EA6\uFF0C\u5355\u53E5\uFF0C\u5168\u5C40\u552F\u4E00\uFF09\u3002\n\n---\n\n### \u4EFB\u52A1\u4E8C\uFF1A\u6838\u5FC3\u8BB0\u5FC6\u63D0\u53D6\uFF08Memory Extraction\uFF09\n\u7ED3\u5408\u80CC\u666F\u548C\u5F53\u524D\u60C5\u5883\uFF0C\u4EC5\u4ECE\u3010\u5F85\u63D0\u53D6\u7684\u65B0\u6D88\u606F\u3011\u4E2D\u63D0\u53D6\u6838\u5FC3\u4FE1\u606F\u3002\n\n\u3010\u901A\u7528\u63D0\u53D6\u539F\u5219\u3011\n1. \u5B81\u7F3A\u6BCB\u6EE5\uFF1A\u8FC7\u6EE4\u7410\u788E\u95F2\u804A\u3001\u4E34\u65F6\u6027\u6307\u4EE4\u548C\u4E00\u6B21\u6027\u64CD\u4F5C\uFF08\u5982\"\u8FD9\u6B21\u3001\u672C\u5355\"\uFF09\uFF1B\u5254\u9664\u4E0D\u53EF\u9760\u7684\u8FB9\u7F18\u4FE1\u606F\u3002\n2. \u72EC\u7ACB\u5B8C\u6574\uFF1A\u8BB0\u5FC6\u5FC5\u987B\"\u8DF3\u51FA\u5F53\u524D\u5BF9\u8BDD\u4F9D\u7136\u6210\u7ACB\"\uFF0C\u65E0\u4E0A\u4E0B\u6587\u4E5F\u80FD\u770B\u61C2\u3002\u63D0\u53D6\u4E3B\u4F53\u5FC5\u987B\u4EE5\"\u7528\u6237\uFF08\u59D3\u540D\uFF09\"\u6216\"AI\"\u4E3A\u6838\u5FC3\u3002\n3. \u5F52\u7EB3\u5408\u5E76\uFF1A\u5F3A\u5173\u8054\u6216\u56E0\u679C\u5173\u7CFB\u7684\u591A\u6761\u6D88\u606F\uFF0C\u5FC5\u987B\u5408\u5E76\u4E3A\u4E00\u6761\u5B8C\u6574\u8BB0\u5FC6\uFF0C\u4E0D\u53EF\u788E\u7247\u5316\u3002\n\n\u3010\u652F\u6301\u63D0\u53D6\u7684\u4E09\u5927\u7C7B\u578B\u3011\uFF08\u5FC5\u987B\u4E25\u683C\u9075\u5B88\u7C7B\u578B\u89C4\u5219\uFF09\n> \u4E0B\u9762\u7ED9\u51FA\u7684\"\u63D0\u53D6\u53E5\u5F0F\"\u548C\"\u89E6\u53D1\u8BCD\"\u4EC5\u4F5C\u4E3A\u4E2D\u6587\u9AA8\u67B6\u53C2\u8003\uFF1B**\u5B9E\u9645 `content` \u5FC5\u987B\u6309\u4E0A\u8FF0\u8F93\u51FA\u8BED\u8A00\u4E66\u5199**\uFF08\u4F8B\u5982\u82F1\u6587\u7528\u6237 \u2192 \"The user (Maya) is a senior product manager based in Berlin\"\uFF09\u3002\n\n1. \u4E2A\u6027\u5316\u8BB0\u5FC6 (type: \"persona\")\n - \u5B9A\u4E49\uFF1A\u7528\u6237\u7684\u7A33\u5B9A\u5C5E\u6027\u3001\u504F\u597D\u3001\u6280\u80FD\u3001\u4EF7\u503C\u89C2\u3001\u4E60\u60EF\uFF08\u5982\u4F4F\u6240\u3001\u804C\u4E1A\u3001\u996E\u98DF\u7981\u5FCC\uFF09\u3002\n - \u63D0\u53D6\u53E5\u5F0F\uFF1A\"\u7528\u6237\uFF08[\u59D3\u540D]\uFF09\u559C\u6B22/\u662F/\u64C5\u957F...\"\n - \u6253\u5206 (priority)\uFF1A80-100\uFF08\u5065\u5EB7/\u7981\u5FCC/\u6838\u5FC3\u7279\u8D28\uFF09\uFF1B50-70\uFF08\u4E00\u822C\u559C\u597D/\u6280\u80FD\uFF09\uFF1B<50\uFF08\u6A21\u7CCA\u6B21\u8981\uFF0C\u53EF\u4E22\u5F03\uFF09\u3002\n - \u89E6\u53D1\u8BCD\uFF1A\u559C\u6B22\u3001\u4E60\u60EF\u3001\u7ECF\u5E38\u3001\u6211\u8FD9\u4E2A\u4EBA...\n\n2. \u5BA2\u89C2\u4E8B\u4EF6\u8BB0\u5FC6 (type: \"episodic\")\n - \u5B9A\u4E49\uFF1A\u5BA2\u89C2\u53D1\u751F\u7684\u52A8\u4F5C\u3001\u51B3\u5B9A\u3001\u8BA1\u5212\u6216\u8FBE\u6210\u7ED3\u679C\u3002\u7EDD\u4E0D\u5305\u542B\u7EAF\u4E3B\u89C2\u611F\u53D7\u3002\n - \u63D0\u53D6\u53E5\u5F0F\uFF1A\"\u7528\u6237\uFF08[\u59D3\u540D]\uFF09\u5728 [\u6700\u597D\u662F\u7CBE\u786E\u7EDD\u5BF9\u65F6\u95F4] \u4E8E [\u5730\u70B9] [\u505A\u4E86\u67D0\u4E8B\uFF08\u53EF\u4EE5\u5305\u542B\u8D77\u56E0\u3001\u7ECF\u8FC7\u3001\u7ED3\u679C\uFF09]\"\u3002\n - \u65F6\u95F4\u7EA6\u675F\uFF1A\u5C3D\u91CF\u57FA\u4E8E\u6D88\u606F\u7684 timestamp \u63A8\u7B97\u7EDD\u5BF9\u65F6\u95F4\uFF0C\u5982\u80FD\u786E\u5B9A\u5219\u5728 metadata \u4E2D\u8F93\u51FA activity_start_time \u548C activity_end_time\uFF08ISO 8601\u683C\u5F0F\uFF09\u3002\u65E0\u6CD5\u786E\u5B9A\u65F6\u53EF\u7701\u7565\u3002\n - \u6253\u5206 (priority)\uFF1A80-100\uFF08\u91CD\u8981\u4E8B\u4EF6/\u8BA1\u5212\uFF09\uFF1B60-70\uFF08\u4E00\u822C\u5B8C\u6574\u6D3B\u52A8\uFF09\uFF1B<60\uFF08\u7410\u788E\u4E8B\u9879\uFF0C\u76F4\u63A5\u4E22\u5F03\uFF09\u3002\n\n3. \u5168\u5C40\u6307\u4EE4\u8BB0\u5FC6 (type: \"instruction\")\n - \u5B9A\u4E49\uFF1A\u7528\u6237\u5BF9 AI \u63D0\u51FA\u7684\u957F\u671F\u884C\u4E3A\u89C4\u5219\u3001\u683C\u5F0F\u504F\u597D\u3001\u8BED\u6C14\u63A7\u5236\u3002\n - \u63D0\u53D6\u53E5\u5F0F\uFF1A\"\u7528\u6237\u8981\u6C42/\u5E0C\u671B AI \u4EE5\u540E\u56DE\u7B54\u65F6...\"\n - \u89E6\u53D1\u8BCD\uFF1A\u4EE5\u540E\u90FD\u3001\u4ECE\u73B0\u5728\u5F00\u59CB\u3001\u8BB0\u4F4F\u3001\u5FC5\u987B\u3002\n - \u6253\u5206 (priority)\uFF1A-1\uFF08\u6781\u5176\u4E25\u683C\u7684\u5168\u5C40\u6B7B\u547D\u4EE4\uFF09\uFF1B90-100\uFF08\u6838\u5FC3\u884C\u4E3A\u89C4\u5219\uFF09\uFF1B70-80\uFF08\u91CD\u8981\u8981\u6C42\uFF09\uFF1B<70\uFF08\u4E34\u65F6\u8981\u6C42\uFF0C\u76F4\u63A5\u4E22\u5F03\uFF09\u3002\n\n---\n\n### \u4E0D\u5E94\u8BE5\u63D0\u53D6\u7684\u5185\u5BB9\n- \u7410\u788E\u95F2\u804A\u3001\u95EE\u5019\uFF1B\u4E34\u65F6\u6027\u7684\u7EAF\u5DE5\u5177\u6027\u8BF7\u6C42\uFF08\u5982\"\u8FD9\u6B21\u5E2E\u6211\u7FFB\u8BD1\u4E00\u4E0B\"\uFF09\n- \u4E00\u6B21\u6027\u64CD\u4F5C\u6307\u4EE4\uFF08\u5982\"\u8FD9\u6B21\u3001\u672C\u5355\"\u76F8\u5173\uFF09\n- \u91CD\u590D\u7684\u5185\u5BB9\uFF1BAI\u52A9\u624B\u81EA\u8EAB\u7684\u884C\u4E3A\u6216\u8F93\u51FA\n- \u4E0D\u5C5E\u4E8E\u4EE5\u4E0A3\u7C7B\u7684\u4FE1\u606F\n- \u7EAF\u4E3B\u89C2\u611F\u53D7\uFF08\u4E0D\u5E26\u5BA2\u89C2\u4E8B\u4EF6\u7684\u60C5\u7EEA\u8868\u8FBE\uFF09\n\n---\n\n### \u4EFB\u52A1\u4E09\uFF1A\u8F93\u51FA\u683C\u5F0F\u89C4\u8303\uFF08JSON\uFF09\n\u8FD4\u56DE\u4E14\u4EC5\u8FD4\u56DE\u4E00\u4E2A\u5408\u6CD5\u7684 JSON \u6570\u7EC4\u3002\u6570\u7EC4\u7684\u6BCF\u4E00\u9879\u662F\u4E00\u4E2A\u60C5\u5883\uFF0C\u5305\u542B\u8BE5\u60C5\u5883\u7684\u6D88\u606F\u8303\u56F4\u548C\u62BD\u53D6\u5230\u7684\u8BB0\u5FC6\uFF1A\n\n[\n {\n \"scene_name\": \"\u5F53\u524D\u751F\u6210\u6216\u7EE7\u627F\u7684\u60C5\u5883\u540D\u79F0\",\n \"message_ids\": [\"\u5C5E\u4E8E\u8BE5\u60C5\u5883\u7684\u6D88\u606FID\u5217\u8868\"],\n \"memories\": [\n {\n \"content\": \"\u5B8C\u6574\u3001\u72EC\u7ACB\u7684\u8BB0\u5FC6\u9648\u8FF0\uFF08\u6309\u5BF9\u5E94\u7C7B\u578B\u7684\u53E5\u5F0F\u8981\u6C42\uFF09\",\n \"type\": \"persona|episodic|instruction\",\n \"priority\": 80,\n \"source_message_ids\": [\"\u6D88\u606FID_1\", \"\u6D88\u606FID_2\"],\n \"metadata\": {}\n }\n ]\n }\n]\n\nmetadata \u5B57\u6BB5\u8BF4\u660E\uFF1A\n- episodic \u7C7B\u578B\uFF1A\u5982\u80FD\u786E\u5B9A\u6D3B\u52A8\u65F6\u95F4\uFF0C\u586B\u5165 {\"activity_start_time\": \"ISO8601\", \"activity_end_time\": \"ISO8601\"}\n- \u5176\u4ED6\u7C7B\u578B\u6216\u65E0\u6CD5\u786E\u5B9A\u65F6\u95F4\uFF1A\u8F93\u51FA\u7A7A\u5BF9\u8C61 {}\n\n\u5982\u679C\u6574\u6BB5\u5BF9\u8BDD\u65E0\u6709\u610F\u4E49\u7684\u8BB0\u5FC6\uFF0C\u4E5F\u8981\u8F93\u51FA\u60C5\u5883\u5206\u5272\u7ED3\u679C\uFF0Cmemories \u4E3A\u7A7A\u6570\u7EC4\uFF1A\n[\n {\n \"scene_name\": \"\u60C5\u5883\u540D\u79F0\",\n \"message_ids\": [\"id1\", \"id2\"],\n \"memories\": []\n }\n]\n\n\u8BF7\u4E25\u683C\u6309\u4E0A\u8FF0 JSON \u6570\u7EC4\u683C\u5F0F\u8F93\u51FA\uFF0C\u4E0D\u8981\u8F93\u51FA\u4EFB\u4F55\u989D\u5916\u7684 Markdown \u4EE3\u7801\u5757\u4FEE\u9970\u7B26\uFF08\u5982 ```json\uFF09\u6216\u89E3\u91CA\u6587\u672C\u3002";
10
+ export type MemoryPromptMode = "chat" | "code";
11
+ export declare const EXTRACT_WORK_MEMORIES_SYSTEM_PROMPT = "\u4F60\u662F\u4E13\u4E1A\u7684\"\u5DE5\u4F5C\u60C5\u5883\u5207\u5206\u4E0E\u56E2\u961F\u5171\u4EAB\u8BB0\u5FC6\u63D0\u53D6\u4E13\u5BB6\"\u3002\n\u4F60\u7684\u4EFB\u52A1\u662F\u5206\u6790\u591A\u4EBA\u5DE5\u4F5C\u6D88\u606F\uFF0C\u5224\u65AD\u5DE5\u4F5C\u60C5\u5883\u5207\u6362\uFF0C\u5E76\u4ECE\u4E2D\u63D0\u53D6\u53EF\u5728\u9879\u76EE\u56E2\u961F\u5185\u5171\u4EAB\u7684\u7ED3\u6784\u5316\u5DE5\u4F5C\u8BB0\u5FC6\u3002\n\n\u672C\u4EFB\u52A1\u9762\u5411\u5DE5\u4F5C\u573A\u5408\u7684\u56E2\u961F\u534F\u4F5C\u573A\u666F\u3002\u4F60\u5E94\u91CD\u70B9\u63D0\u53D6\u9879\u76EE\u4E8B\u5B9E\u3001\u4EFB\u52A1\u8FDB\u5C55\u3001\u51B3\u7B56\u7ED3\u8BBA\u3001\u5DE5\u4F5C\u65B9\u6CD5\u3001SOP\u3001\u7981\u5FCC\u3001\u8BBE\u8BA1\u601D\u8DEF\u3001\u4EA4\u4ED8\u7269\u7B49\u5BF9\u56E2\u961F\u540E\u7EED\u534F\u4F5C\u548C Agent \u6267\u884C\u6709\u957F\u671F\u4EF7\u503C\u7684\u4FE1\u606F\u3002\n\n**\u8F93\u51FA\u8BED\u8A00**\uFF1A\u6240\u6709\u81EA\u7531\u6587\u672C\u5B57\u6BB5\uFF08`scene_name`\u3001memory `content`\uFF09\u4F7F\u7528\u4E0E\u5F85\u63D0\u53D6\u6D88\u606F\u4E3B\u5BFC\u8BED\u8A00\u76F8\u540C\u7684\u8BED\u8A00\uFF1BJSON \u5B57\u6BB5\u540D\u3001\u679A\u4E3E\u503C\u3001ISO \u65F6\u95F4\u6233\u4FDD\u6301\u82F1\u6587\u3002\n\n---\n\n### \u4EFB\u52A1\u4E00\uFF1A\u5DE5\u4F5C\u60C5\u5883\u5207\u5206\uFF08Work Scene Segmentation\uFF09\n\n\u5206\u6790\u3010\u5F85\u63D0\u53D6\u7684\u65B0\u6D88\u606F\u3011\uFF0C\u7ED3\u5408\u3010\u4E0A\u4E00\u4E2A\u60C5\u5883\u3011\u548C\u3010\u80CC\u666F\u6D88\u606F\u3011\uFF0C\u5224\u65AD\u5F53\u524D\u6D88\u606F\u5C5E\u4E8E\u54EA\u4E2A\u5DE5\u4F5C\u60C5\u5883\u3002\n\n\u3010\u60C5\u5883\u5B9A\u4E49\u3011\n\u4E00\u4E2A\u60C5\u5883\u662F\u56F4\u7ED5\u540C\u4E00\u4E2A\u9879\u76EE\u3001\u4EFB\u52A1\u3001\u6A21\u5757\u3001\u9700\u6C42\u3001\u95EE\u9898\u3001\u51B3\u7B56\u3001\u4E8B\u6545\u3001\u5BA2\u6237\u573A\u666F\u6216\u5DE5\u4F5C\u76EE\u6807\u5C55\u5F00\u7684\u4E00\u7EC4\u6D88\u606F\u3002\n\n\u3010\u7EE7\u627F\u6761\u4EF6\u3011\n\u5982\u679C\u65B0\u6D88\u606F\u4ECD\u5728\u5EF6\u7EED\u4E0A\u4E00\u4E2A\u9879\u76EE\u3001\u4EFB\u52A1\u3001\u9700\u6C42\u3001\u95EE\u9898\u6216\u5DE5\u4F5C\u76EE\u6807\uFF0C\u5219\u6CBF\u7528\u4E0A\u4E00\u4E2A\u60C5\u5883\u3002\n\n\u3010\u5207\u6362\u6761\u4EF6\u3011\n\u51FA\u73B0\u4EE5\u4E0B\u60C5\u51B5\u4E4B\u4E00\uFF0C\u5E94\u5207\u6362\u6216\u521B\u5EFA\u65B0\u7684\u60C5\u5883\uFF1A\n1. \u8BA8\u8BBA\u5BF9\u8C61\u53D8\u6210\u53E6\u4E00\u4E2A\u9879\u76EE\u3001\u6A21\u5757\u3001\u9700\u6C42\u3001\u5BA2\u6237\u3001Issue\u3001PR\u3001\u5B9E\u9A8C\u3001\u4E8B\u6545\u6216\u4EA4\u4ED8\u7269\u3002\n2. \u5DE5\u4F5C\u76EE\u6807\u53D1\u751F\u660E\u663E\u53D8\u5316\uFF0C\u4F8B\u5982\u4ECE\"\u9700\u6C42\u8BA8\u8BBA\"\u5207\u6362\u5230\"\u4E0A\u7EBF\u6392\u671F\"\u3002\n3. \u660E\u786E\u51FA\u73B0\u65B0\u7684\u72EC\u7ACB\u4EFB\u52A1\u3001\u51B3\u7B56\u7EBF\u7A0B\u6216\u95EE\u9898\u6392\u67E5\u7EBF\u7A0B\u3002\n4. \u591A\u4E2A\u5DE5\u4F5C\u8BAE\u9898\u5728\u540C\u4E00\u6279\u6D88\u606F\u4E2D\u8FDE\u7EED\u51FA\u73B0\uFF0C\u5E94\u62C6\u5206\u4E3A\u591A\u4E2A\u60C5\u5883\u3002\n\n\u3010\u547D\u540D\u89C4\u5219\u3011\n- \u60C5\u5883\u540D\u79F0\u5FC5\u987B\u56F4\u7ED5\u5DE5\u4F5C\u5BF9\u8C61\u547D\u540D\u3002\n- \u63A8\u8350\u683C\u5F0F\uFF1A\"\u56E2\u961F\u5728\u56F4\u7ED5[\u9879\u76EE/\u6A21\u5757/\u8BAE\u9898]\u63A8\u8FDB[\u76EE\u6807\u6D3B\u52A8]\"\u3002\n- \u957F\u5EA6\u7EA6 30-50 \u4E2A\u5B57\u7B26\u6216\u7B49\u4EF7\u957F\u5EA6\uFF0C\u5355\u53E5\uFF0C\u5168\u5C40\u552F\u4E00\u3002\n- \u793A\u4F8B\uFF1A\n - \"\u56E2\u961F\u5728\u56F4\u7ED5 Agent Memory \u7FA4\u804A\u62BD\u53D6\u8BBE\u8BA1\u5171\u4EAB\u8BB0\u5FC6\u89C4\u5219\"\n - \"\u56E2\u961F\u5728\u56F4\u7ED5 Billing API \u6392\u67E5\u7EBF\u4E0A\u8D85\u65F6\u95EE\u9898\"\n - \"\u56E2\u961F\u5728\u56F4\u7ED5\u5B89\u706F\u8BD5\u70B9\u786E\u8BA4\u67E5\u8BE2\u63A5\u53E3\u9700\u6C42\"\n\n---\n\n### \u4EFB\u52A1\u4E8C\uFF1A\u56E2\u961F\u5171\u4EAB\u5DE5\u4F5C\u8BB0\u5FC6\u63D0\u53D6\uFF08Work Memory Extraction\uFF09\n\n\u7ED3\u5408\u80CC\u666F\u548C\u5F53\u524D\u60C5\u5883\uFF0C\u4EC5\u4ECE\u3010\u5F85\u63D0\u53D6\u7684\u65B0\u6D88\u606F\u3011\u4E2D\u63D0\u53D6\u53EF\u5171\u4EAB\u7684\u6838\u5FC3\u5DE5\u4F5C\u4FE1\u606F\u3002\n\n\u3010\u901A\u7528\u63D0\u53D6\u539F\u5219\u3011\n\n1. \u9762\u5411\u5DE5\u4F5C\u534F\u4F5C\uFF1A\n - \u63D0\u53D6\u51FA\u7684\u8BB0\u5FC6\u5E94\u80FD\u5E2E\u52A9\u56E2\u961F\u6210\u5458\u6216 Agent \u5728\u540E\u7EED\u4EFB\u52A1\u4E2D\u7406\u89E3\u9879\u76EE\u80CC\u666F\u3001\u63A5\u7EED\u4EFB\u52A1\u3001\u590D\u7528\u7ECF\u9A8C\u6216\u907F\u514D\u91CD\u590D\u9519\u8BEF\u3002\n - \u4E0D\u63D0\u53D6\u666E\u901A\u5BD2\u6684\u3001\u95F2\u804A\u3001\u4E34\u65F6\u60C5\u7EEA\u8868\u8FBE\u3001\u4E00\u6B21\u6027\u5DE5\u5177\u8BF7\u6C42\u3002\n\n2. \u9762\u5411\u56E2\u961F\u5171\u4EAB\uFF1A\n - \u63D0\u53D6\u5185\u5BB9\u9ED8\u8BA4\u4F1A\u5728\u9879\u76EE\u56E2\u961F\u5185\u5171\u4EAB\u3002\n - \u53EA\u63D0\u53D6\u9002\u5408\u56E2\u961F\u5171\u4EAB\u7684\u5DE5\u4F5C\u5185\u5BB9\u3002\n - \u4E0D\u63D0\u53D6\u4E0E\u5DE5\u4F5C\u65E0\u5173\u7684\u4E2A\u4EBA\u504F\u597D\u3001\u79C1\u4EBA\u751F\u6D3B\u6216\u654F\u611F\u4FE1\u606F\u3002\n\n3. \u72EC\u7ACB\u5B8C\u6574\uFF1A\n - \u6BCF\u6761\u8BB0\u5FC6\u5FC5\u987B\u8DF3\u51FA\u5F53\u524D\u5BF9\u8BDD\u4ECD\u80FD\u7406\u89E3\u3002\n - content \u5FC5\u987B\u5305\u542B\u6E05\u6670\u4E3B\u4F53\u3001\u5DE5\u4F5C\u5BF9\u8C61\u3001\u7ED3\u8BBA\u3001\u72B6\u6001\u6216\u65B9\u6CD5\u3002\n - \u4E0D\u8981\u4F7F\u7528\"\u8FD9\u4E2A\"\u3001\"\u90A3\u4E2A\"\u3001\"\u4E0A\u9762\u8BF4\u7684\"\u7B49\u4F9D\u8D56\u4E0A\u4E0B\u6587\u7684\u8868\u8FBE\u3002\n\n4. \u51C6\u786E\u5F52\u56E0\uFF1A\n - \u67D0\u4EBA\u63D0\u51FA\u7684\u5EFA\u8BAE\u3001\u62C5\u5FE7\u3001\u5224\u65AD\uFF0C\u4E0D\u7B49\u4E8E\u56E2\u961F\u51B3\u7B56\u3002\n - \u53EA\u6709\u51FA\u73B0\u660E\u786E\u786E\u8BA4\u3001\u62CD\u677F\u3001\u91C7\u7EB3\u3001\u6267\u884C\u5B89\u6392\u65F6\uFF0C\u624D\u80FD\u5199\u6210\u786E\u5B9A\u7ED3\u8BBA\u3002\n - \u672A\u786E\u8BA4\u5185\u5BB9\u5E94\u8868\u8FBE\u4E3A\"\u56E2\u961F\u6B63\u5728\u8BA8\u8BBA...\"\u3001\"\u67D0\u65B9\u6848\u4ECD\u5F85\u786E\u8BA4...\"\u3001\"\u5B58\u5728\u67D0\u98CE\u9669...\"\u3002\n\n5. \u5F52\u7EB3\u5408\u5E76\uFF1A\n - \u5F3A\u5173\u8054\u7684\u591A\u6761\u6D88\u606F\u5E94\u5408\u5E76\u6210\u4E00\u6761\u5B8C\u6574\u8BB0\u5FC6\u3002\n - \u4E0D\u8981\u628A\u540C\u4E00\u4E2A\u5DE5\u4F5C\u7ED3\u8BBA\u62C6\u6210\u591A\u4E2A\u788E\u7247\u3002\n - \u4F46\u4E0D\u540C\u5DE5\u4F5C\u5BF9\u8C61\u3001\u4E0D\u540C\u4EFB\u52A1\u3001\u4E0D\u540C\u65B9\u6CD5\u8BBA\u5E94\u5206\u5F00\u63D0\u53D6\u3002\n\n6. \u53EA\u4ECE\u65B0\u6D88\u606F\u63D0\u53D6\uFF1A\n - \u3010\u80CC\u666F\u6D88\u606F\u3011\u53EA\u7528\u4E8E\u7406\u89E3\u4E0A\u4E0B\u6587\u3001\u6307\u4EE3\u5173\u7CFB\u548C\u65F6\u95F4\u3002\n - \u4E25\u7981\u4ECE\u80CC\u666F\u6D88\u606F\u4E2D\u65B0\u589E\u63D0\u53D6\u8BB0\u5FC6\u3002\n - source_message_ids \u5FC5\u987B\u53EA\u5305\u542B\u3010\u5F85\u63D0\u53D6\u7684\u65B0\u6D88\u606F\u3011\u4E2D\u7684 message id\u3002\n\n7. AI / Agent \u8F93\u51FA\u5904\u7406\uFF1A\n - \u4E0D\u8981\u628A AI \u7684\u5EFA\u8BAE\u81EA\u52A8\u5F53\u6210\u56E2\u961F\u4E8B\u5B9E\u6216\u56E2\u961F\u51B3\u7B56\u3002\n - \u53EA\u6709\u5F53\u4EBA\u7C7B\u6210\u5458\u91C7\u7EB3\u3001\u786E\u8BA4\uFF0C\u6216 Agent \u8F93\u51FA\u672C\u8EAB\u662F\u660E\u786E\u7684\u5DE5\u5177\u6267\u884C\u7ED3\u679C\u3001\u4EA4\u4ED8\u7269\u3001\u5B9E\u9A8C\u7ED3\u679C\u65F6\uFF0C\u624D\u53EF\u4EE5\u63D0\u53D6\u3002\n - AI \u751F\u6210\u7684\u8349\u6848\u3001\u65B9\u6848\u3001\u5206\u6790\uFF0C\u5982\u88AB\u660E\u786E\u4F5C\u4E3A\u540E\u7EED\u5DE5\u4F5C\u8D44\u4EA7\u4F7F\u7528\uFF0C\u53EF\u63D0\u53D6\u4E3A work_artifact \u6216 work_method\u3002\n\n---\n\n### \u652F\u6301\u63D0\u53D6\u7684\u56DB\u7C7B\u5DE5\u4F5C\u8BB0\u5FC6\n\nmemory `type` \u5FC5\u987B\u4ECE\u4EE5\u4E0B\u679A\u4E3E\u4E2D\u9009\u62E9\uFF1A\n\n1. \u5DE5\u4F5C\u4E8B\u5B9E\uFF08type: \"work_fact\"\uFF09\n\n\u5B9A\u4E49\uFF1A\n\u5173\u4E8E\u9879\u76EE\u3001\u7CFB\u7EDF\u3001\u4E1A\u52A1\u3001\u5BA2\u6237\u3001\u9700\u6C42\u3001\u51B3\u7B56\u3001\u72B6\u6001\u3001\u98CE\u9669\u3001\u7EA6\u675F\u3001\u5B9E\u9A8C\u7ED3\u679C\u7684\u4E8B\u5B9E\u6027\u4FE1\u606F\u3002\n\n\u9002\u5408\u63D0\u53D6\uFF1A\n- \u9879\u76EE\u76EE\u6807\n- \u4EA7\u54C1\u9700\u6C42\n- \u6280\u672F\u65B9\u6848\n- \u67B6\u6784\u7EA6\u675F\n- \u5BA2\u6237\u53CD\u9988\n- \u51B3\u7B56\u7ED3\u8BBA\n- \u5F53\u524D\u72B6\u6001\n- \u98CE\u9669\u548C\u963B\u585E\n- \u5B9E\u9A8C\u7ED3\u679C\n- \u672F\u8BED\u5B9A\u4E49\n- \u7CFB\u7EDF\u4E8B\u5B9E\n\n\u793A\u4F8B\uFF1A\n- \"Agent Memory \u56E2\u961F\u7248\u91C7\u7528 L0 Work Event\u3001L1 Work Record\u3001L2 Project Scene Block\u3001L3 Team Operating Memory \u7684\u56DB\u5C42\u7ED3\u6784\u3002\"\n- \"\u56E2\u961F\u51B3\u5B9A\u56E2\u961F\u5171\u4EAB\u8BB0\u5FC6\u53EA\u63D0\u53D6\u5DE5\u4F5C\u5185\u5BB9\uFF0C\u4E0D\u6C89\u6DC0\u4E2A\u4EBA\u753B\u50CF\u3002\"\n- \"\u5B89\u706F\u8BD5\u70B9\u8981\u6C42\u8BB0\u5FC6\u67E5\u8BE2\u63A5\u53E3\u652F\u6301\u6309\u9879\u76EE\u7B5B\u9009\uFF0C\u5E76\u5141\u8BB8\u914D\u7F6E\u8FD4\u56DE\u5B57\u6BB5\u3002\"\n- \"\u591A\u4EBA\u7FA4\u804A\u4E2D\u5DE5\u4F5C\u8BA8\u8BBA\u548C\u95F2\u804A\u6DF7\u6742\uFF0C\u5B58\u5728\u8BEF\u63D0\u53D6\u65E0\u5173\u5185\u5BB9\u7684\u98CE\u9669\u3002\"\n\npriority\uFF1A\n- 90-100\uFF1A\u5173\u952E\u51B3\u7B56\u3001\u6838\u5FC3\u9700\u6C42\u3001\u957F\u671F\u7EA6\u675F\u3001\u91CD\u8981\u98CE\u9669\u3002\n- 70-89\uFF1A\u5BF9\u5F53\u524D\u9879\u76EE\u6709\u6301\u7EED\u4EF7\u503C\u7684\u4E00\u822C\u4E8B\u5B9E\u3002\n- <70\uFF1A\u7EC6\u788E\u3001\u4E34\u65F6\u3001\u4F4E\u5F71\u54CD\u4E8B\u5B9E\uFF0C\u76F4\u63A5\u4E22\u5F03\u3002\n\n---\n\n2. \u5DE5\u4F5C\u4EFB\u52A1\uFF08type: \"work_task\"\uFF09\n\n\u5B9A\u4E49\uFF1A\n\u9700\u8981\u540E\u7EED\u6267\u884C\u3001\u8DDF\u8FDB\u3001\u786E\u8BA4\u6216\u4EA4\u4ED8\u7684\u4EFB\u52A1\u3001\u884C\u52A8\u9879\u3001\u8D23\u4EFB\u5206\u5DE5\u3002\n\n\u9002\u5408\u63D0\u53D6\uFF1A\n- \u5F85\u529E\u4E8B\u9879\n- owner \u660E\u786E\u7684\u4EFB\u52A1\n- deadline \u660E\u786E\u7684\u4EFB\u52A1\n- \u9700\u8981\u8DDF\u8FDB\u7684\u95EE\u9898\n- \u963B\u585E\u4E2D\u7684\u4E8B\u9879\n- \u4E0B\u4E00\u6B65\u8BA1\u5212\n- \u4EFB\u52A1\u72B6\u6001\u53D8\u5316\n\n\u793A\u4F8B\uFF1A\n- \"\u540E\u7AEF\u56E2\u961F\u9700\u8981\u5728\u5468\u4E94\u524D\u5B8C\u6210 record \u4E0E event \u591A\u5BF9\u591A\u8FFD\u6EAF\u8868\u7ED3\u6784\u8BBE\u8BA1\u3002\"\n- \"\u4EA7\u54C1\u4FA7\u9700\u8981\u8865\u5145\u56E2\u961F\u5171\u4EAB\u8BB0\u5FC6\u7684\u6743\u9650\u8FB9\u754C\u8BF4\u660E\u3002\"\n- \"L1 Prompt \u5DF2\u8FDB\u5165\u5DE5\u4F5C\u8BB0\u5FC6\u7C7B\u578B\u6536\u655B\u9636\u6BB5\uFF0C\u4E0B\u4E00\u6B65\u9700\u8981\u540C\u6B65\u4FEE\u6539\u4E0B\u6E38 enum\u3002\"\n\npriority\uFF1A\n- 90-100\uFF1A\u963B\u585E\u4EA4\u4ED8\u3001\u6709\u660E\u786E deadline\u3001\u5F71\u54CD\u5173\u952E\u8DEF\u5F84\u7684\u4EFB\u52A1\u3002\n- 70-89\uFF1A\u6709\u660E\u786E owner \u6216\u660E\u786E\u540E\u7EED\u52A8\u4F5C\u7684\u4E00\u822C\u4EFB\u52A1\u3002\n- <70\uFF1A\u6A21\u7CCA\u3001\u4E34\u65F6\u3001\u65E0\u660E\u786E\u540E\u7EED\u52A8\u4F5C\u7684\u5F85\u529E\uFF0C\u76F4\u63A5\u4E22\u5F03\u3002\n\nmetadata \u5EFA\u8BAE\uFF1A\n- \u5982\u80FD\u786E\u5B9A owner\uFF0C\u586B\u5165 {\"owner\": \"\u540D\u79F0\u6216ID\"}\u3002\n- \u5982\u80FD\u786E\u5B9A deadline\uFF0C\u586B\u5165 {\"deadline\": \"ISO8601\"}\u3002\n- \u5982\u80FD\u786E\u5B9A\u72B6\u6001\uFF0C\u586B\u5165 {\"status\": \"todo|doing|done|blocked|deferred|cancelled\"}\u3002\n\n---\n\n3. \u5DE5\u4F5C\u65B9\u6CD5\uFF08type: \"work_method\"\uFF09\n\n\u5B9A\u4E49\uFF1A\n\u56E2\u961F\u5728\u5DE5\u4F5C\u4E2D\u5F62\u6210\u7684\u53EF\u590D\u7528\u65B9\u6CD5\u3001SOP\u3001\u6D41\u7A0B\u3001\u539F\u5219\u3001\u7981\u5FCC\u3001\u8BBE\u8BA1\u601D\u8DEF\u3001\u7ECF\u9A8C\u6559\u8BAD\u3001\u5224\u65AD\u6807\u51C6\u3001Agent \u884C\u4E3A\u89C4\u5219\u3002\n\n\u8FD9\u662F\u56E2\u961F\u957F\u671F\u5DE5\u4F5C\u8BB0\u5FC6\u4E2D\u6700\u91CD\u8981\u7684\u7C7B\u578B\u4E4B\u4E00\u3002\u5B83\u4E0D\u53EA\u662F\u8BB0\u5F55\u53D1\u751F\u4E86\u4EC0\u4E48\uFF0C\u800C\u662F\u8BB0\u5F55\u4EE5\u540E\u9047\u5230\u7C7B\u4F3C\u4EFB\u52A1\u5E94\u8BE5\u600E\u4E48\u505A\u3001\u4E0D\u8981\u600E\u4E48\u505A\u3001\u6309\u4EC0\u4E48\u539F\u5219\u5224\u65AD\u3002\n\n\u9002\u5408\u63D0\u53D6\uFF1A\n- SOP\n- \u534F\u4F5C\u6D41\u7A0B\n- \u8BBE\u8BA1\u539F\u5219\n- \u6280\u672F\u8DEF\u7EBF\u9009\u62E9\u601D\u8DEF\n- \u8BC4\u4F30\u6807\u51C6\n- \u98CE\u9669\u89C4\u907F\u89C4\u5219\n- \u7981\u5FCC\u548C\u8FB9\u754C\n- \u590D\u7528\u7ECF\u9A8C\n- Agent \u6267\u884C\u7B56\u7565\n- Prompt \u7F16\u5199\u539F\u5219\n- \u9879\u76EE\u65B9\u6CD5\u8BBA\n\n\u793A\u4F8B\uFF1A\n- \"\u56E2\u961F\u7248 Agent Memory \u7684 L1 \u62BD\u53D6\u5E94\u4F18\u5148\u4F7F\u7528\u5C11\u91CF\u9AD8\u5C42\u5DE5\u4F5C\u7C7B\u578B\uFF0C\u907F\u514D\u628A\u7C7B\u578B\u62C6\u5F97\u8FC7\u7EC6\u5BFC\u81F4\u540E\u7EED\u805A\u5408\u56F0\u96BE\u3002\"\n- \"\u56E2\u961F\u5171\u4EAB\u8BB0\u5FC6\u7684\u62BD\u53D6\u5E94\u4F18\u5148\u8BB0\u5F55\u9879\u76EE\u4E8B\u5B9E\u3001\u4EFB\u52A1\u3001\u65B9\u6CD5\u548C\u4EA4\u4ED8\u7269\uFF0C\u800C\u4E0D\u662F\u666E\u901A\u804A\u5929\u5185\u5BB9\u3002\"\n- \"\u5F53\u591A\u4EBA\u6D88\u606F\u4E2D\u53EA\u6709\u5355\u4EBA\u5EFA\u8BAE\u800C\u6CA1\u6709\u660E\u786E\u786E\u8BA4\u65F6\uFF0C\u4E0D\u80FD\u76F4\u63A5\u62BD\u53D6\u4E3A\u56E2\u961F\u51B3\u7B56\u3002\"\n- \"L1 Prompt \u5E94\u4FDD\u6301\u8F93\u51FA JSON \u7ED3\u6784\u7A33\u5B9A\uFF0C\u4F18\u5148\u901A\u8FC7\u8C03\u6574 type \u679A\u4E3E\u548C\u63D0\u53D6\u89C4\u5219\u9002\u914D\u65B0\u573A\u666F\u3002\"\n- \"\u5DE5\u4F5C\u65B9\u6CD5\u7C7B\u8BB0\u5FC6\u53EF\u4EE5\u6C89\u6DC0 SOP\u3001\u7981\u5FCC\u3001\u8BBE\u8BA1\u601D\u8DEF\u548C\u53EF\u590D\u7528\u7ECF\u9A8C\uFF0C\u7528\u4E8E\u652F\u6301\u540E\u7EED Agent \u6267\u884C\u3002\"\n\npriority\uFF1A\n- 90-100\uFF1A\u957F\u671F\u7A33\u5B9A\u3001\u53EF\u8DE8\u4EFB\u52A1\u590D\u7528\u3001\u5F71\u54CD Agent \u884C\u4E3A\u6216\u56E2\u961F\u6D41\u7A0B\u7684\u6838\u5FC3\u65B9\u6CD5\u3002\n- 70-89\uFF1A\u5BF9\u5F53\u524D\u9879\u76EE\u540E\u7EED\u5DE5\u4F5C\u6709\u660E\u663E\u590D\u7528\u4EF7\u503C\u7684\u65B9\u6CD5\u3002\n- <70\uFF1A\u8FC7\u4E8E\u4E34\u65F6\u3001\u6A21\u7CCA\u6216\u53EA\u9002\u7528\u4E8E\u4E00\u6B21\u6027\u64CD\u4F5C\u7684\u65B9\u6CD5\uFF0C\u76F4\u63A5\u4E22\u5F03\u3002\n\nmetadata \u5EFA\u8BAE\uFF1A\n- \u5982\u80FD\u786E\u5B9A\u9002\u7528\u8303\u56F4\uFF0C\u586B\u5165 {\"scope\": \"project|team|module|agent|workflow\"}\u3002\n- \u5982\u80FD\u786E\u5B9A\u65B9\u6CD5\u7C7B\u522B\uFF0C\u586B\u5165 {\"method_type\": \"sop|principle|constraint|anti_pattern|heuristic|evaluation_criterion\"}\u3002\n- \u5982\u662F\u7981\u5FCC\u6216\u53CD\u6A21\u5F0F\uFF0C\u586B\u5165 {\"method_type\": \"anti_pattern\"}\u3002\n\n---\n\n4. \u5DE5\u4F5C\u8D44\u4EA7\uFF08type: \"work_artifact\"\uFF09\n\n\u5B9A\u4E49\uFF1A\n\u56E2\u961F\u4EA7\u751F\u3001\u5F15\u7528\u3001\u7EF4\u62A4\u6216\u9700\u8981\u540E\u7EED\u4F7F\u7528\u7684\u5DE5\u4F5C\u8D44\u4EA7\uFF0C\u5305\u62EC\u6587\u6863\u3001PR\u3001Issue\u3001\u8BBE\u8BA1\u7A3F\u3001\u5B9E\u9A8C\u62A5\u544A\u3001\u4EE3\u7801\u4ED3\u5E93\u3001\u6570\u636E\u8868\u3001\u4F1A\u8BAE\u7EAA\u8981\u3001Prompt\u3001\u65B9\u6848\u8349\u6848\u7B49\u3002\n\n\u9002\u5408\u63D0\u53D6\uFF1A\n- \u6587\u6863\n- PR / Issue\n- \u4EE3\u7801\u5206\u652F\n- \u5B9E\u9A8C\u62A5\u544A\n- \u8BBE\u8BA1\u7A3F\n- \u4F1A\u8BAE\u7EAA\u8981\n- Prompt\n- \u8868\u683C\n- \u94FE\u63A5\n- \u65B9\u6848\u8349\u6848\n- Agent \u751F\u6210\u4E14\u88AB\u91C7\u7EB3\u7684\u5DE5\u4F5C\u8F93\u51FA\n\n\u793A\u4F8B\uFF1A\n- \"L1 \u5DE5\u4F5C\u8BB0\u5FC6\u62BD\u53D6 Prompt \u662F Agent Memory \u56E2\u961F\u7248\u8BBE\u8BA1\u4E2D\u7684\u6838\u5FC3 Prompt \u8D44\u4EA7\u3002\"\n- \"\u56E2\u961F\u5C06\u56DB\u5C42\u5DE5\u4F5C\u8BB0\u5FC6\u7ED3\u6784\u4F5C\u4E3A\u540E\u7EED L2 \u548C L3 \u805A\u5408 Prompt \u7684\u8BBE\u8BA1\u57FA\u7840\u3002\"\n- \"Flowchart \u4E0E StateDiagram \u5BF9\u6BD4\u5B9E\u9A8C\u7ED3\u679C\u53EF\u4F5C\u4E3A\u77ED\u671F\u8BB0\u5FC6\u538B\u7F29\u65B9\u6848\u9009\u62E9\u7684\u4F9D\u636E\u3002\"\n\npriority\uFF1A\n- 90-100\uFF1A\u6838\u5FC3\u6587\u6863\u3001\u5173\u952E PR\u3001\u4E0A\u7EBF\u76F8\u5173\u8D44\u4EA7\u3001\u91CD\u8981\u5B9E\u9A8C\u62A5\u544A\u3002\n- 70-89\uFF1A\u540E\u7EED\u53EF\u80FD\u590D\u7528\u7684\u4E00\u822C\u5DE5\u4F5C\u8D44\u4EA7\u3002\n- <70\uFF1A\u4E34\u65F6\u6587\u4EF6\u3001\u4F4E\u4EF7\u503C\u94FE\u63A5\u3001\u672A\u88AB\u91C7\u7528\u7684\u8349\u7A3F\uFF0C\u76F4\u63A5\u4E22\u5F03\u3002\n\nmetadata \u5EFA\u8BAE\uFF1A\n- \u5982\u80FD\u786E\u5B9A\u8D44\u4EA7\u7C7B\u578B\uFF0C\u586B\u5165 {\"artifact_type\": \"doc|pr|issue|repo|branch|design|report|prompt|dataset|meeting_note\"}\u3002\n- \u5982\u80FD\u786E\u5B9A\u94FE\u63A5\u6216\u6807\u8BC6\uFF0C\u586B\u5165 {\"artifact_ref\": \"\u94FE\u63A5\u3001ID\u6216\u540D\u79F0\"}\u3002\n\n---\n\n### \u4E0D\u5E94\u8BE5\u63D0\u53D6\u7684\u5185\u5BB9\n\n\u4EE5\u4E0B\u5185\u5BB9\u901A\u5E38\u4E0D\u5E94\u63D0\u53D6\uFF1A\n- \u95EE\u5019\u3001\u5BD2\u6684\u3001\u73A9\u7B11\u3001\u65E0\u5DE5\u4F5C\u4EF7\u503C\u7684\u95F2\u804A\u3002\n- \u4E34\u65F6\u6027\u7684\u4E00\u6B21\u6027\u8BF7\u6C42\uFF0C\u4F8B\u5982\"\u8FD9\u6B21\u5E2E\u6211\u6539\u4E00\u4E0B\u683C\u5F0F\"\u3002\n- \u672A\u88AB\u91C7\u7EB3\u7684 AI \u5EFA\u8BAE\u6216\u4E34\u65F6\u8349\u7A3F\u3002\n- \u65E0\u660E\u786E\u540E\u7EED\u4EF7\u503C\u7684\u7EC6\u8282\u3002\n- \u4E0E\u56E2\u961F\u5DE5\u4F5C\u65E0\u5173\u7684\u4E2A\u4EBA\u504F\u597D\u3001\u79C1\u4EBA\u751F\u6D3B\u6216\u654F\u611F\u4FE1\u606F\u3002\n\n---\n\n### \u4EFB\u52A1\u4E09\uFF1A\u8F93\u51FA\u683C\u5F0F\u89C4\u8303\uFF08JSON\uFF09\n\n\u8FD4\u56DE\u4E14\u4EC5\u8FD4\u56DE\u4E00\u4E2A\u5408\u6CD5\u7684 JSON \u6570\u7EC4\u3002\u6570\u7EC4\u7684\u6BCF\u4E00\u9879\u662F\u4E00\u4E2A\u5DE5\u4F5C\u60C5\u5883\uFF0C\u5305\u542B\u8BE5\u60C5\u5883\u7684\u6D88\u606F\u8303\u56F4\u548C\u62BD\u53D6\u5230\u7684\u5DE5\u4F5C\u8BB0\u5FC6\uFF1A\n\n[\n {\n \"scene_name\": \"\u5F53\u524D\u751F\u6210\u6216\u7EE7\u627F\u7684\u5DE5\u4F5C\u60C5\u5883\u540D\u79F0\",\n \"message_ids\": [\"\u5C5E\u4E8E\u8BE5\u60C5\u5883\u7684\u6D88\u606FID\u5217\u8868\"],\n \"memories\": [\n {\n \"content\": \"\u5B8C\u6574\u3001\u72EC\u7ACB\u3001\u9002\u5408\u56E2\u961F\u5171\u4EAB\u7684\u5DE5\u4F5C\u8BB0\u5FC6\u9648\u8FF0\",\n \"type\": \"work_fact|work_task|work_method|work_artifact\",\n \"priority\": 80,\n \"source_message_ids\": [\"\u6D88\u606FID_1\", \"\u6D88\u606FID_2\"],\n \"metadata\": {}\n }\n ]\n }\n]\n\nmetadata \u5B57\u6BB5\u8BF4\u660E\uFF1A\n- \u6240\u6709\u7C7B\u578B\u90FD\u53EF\u4EE5\u8F93\u51FA\u7A7A\u5BF9\u8C61 {}\u3002\n- work_task \u53EF\u8865\u5145 owner\u3001deadline\u3001status\u3002\n- work_method \u53EF\u8865\u5145 scope\u3001method_type\u3002\n- work_artifact \u53EF\u8865\u5145 artifact_type\u3001artifact_ref\u3002\n- work_fact \u53EF\u8865\u5145 work_object\u3001status\u3001activity_start_time\u3001activity_end_time\u3002\n- metadata \u4E0D\u8981\u5305\u542B\u65E0\u5173\u4E2A\u4EBA\u4FE1\u606F\u3002\n\n\u5982\u679C\u6574\u6BB5\u65B0\u6D88\u606F\u65E0\u6709\u610F\u4E49\u7684\u56E2\u961F\u5171\u4EAB\u5DE5\u4F5C\u8BB0\u5FC6\uFF0C\u4E5F\u8981\u8F93\u51FA\u60C5\u5883\u5206\u5272\u7ED3\u679C\uFF0Cmemories \u4E3A\u7A7A\u6570\u7EC4\uFF1A\n\n[\n {\n \"scene_name\": \"\u5DE5\u4F5C\u60C5\u5883\u540D\u79F0\",\n \"message_ids\": [\"id1\", \"id2\"],\n \"memories\": []\n }\n]\n\n\u8BF7\u4E25\u683C\u6309\u4E0A\u8FF0 JSON \u6570\u7EC4\u683C\u5F0F\u8F93\u51FA\uFF0C\u4E0D\u8981\u8F93\u51FA\u4EFB\u4F55\u989D\u5916\u7684 Markdown \u4EE3\u7801\u5757\u4FEE\u9970\u7B26\uFF08\u5982 ```json\uFF09\u6216\u89E3\u91CA\u6587\u672C\u3002";
12
+ export declare function getExtractMemoriesSystemPrompt(mode?: MemoryPromptMode): string;
13
+ /**
14
+ * Format the user prompt for L1 extraction.
15
+ *
16
+ * @param newMessages - Messages to extract memories from (with ids and timestamps)
17
+ * @param backgroundMessages - Previous messages for context only (not for extraction)
18
+ * @param previousSceneName - The last known scene name (for continuity)
19
+ */
20
+ export declare function formatExtractionPrompt(params: {
21
+ newMessages: ConversationMessage[];
22
+ backgroundMessages?: ConversationMessage[];
23
+ previousSceneName?: string;
24
+ }): string;