stratagate-dsh 0.2.30 → 0.2.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -132,14 +132,14 @@ function resultSummary(value) {
132
132
  }
133
133
  if (typeof value === "number" || typeof value === "boolean") return String(value);
134
134
  if (!value || typeof value !== "object") return "";
135
- const record = value;
136
- if (typeof record.error === "string") return `failed: ${record.error.replace(/\s+/g, " ").slice(0, 140)}`;
137
- if (typeof record.summary === "string") return record.summary.replace(/\s+/g, " ").slice(0, 160);
138
- if (typeof record.message === "string") return record.message.replace(/\s+/g, " ").slice(0, 160);
139
- const counts = Object.entries(record).filter(([key, item]) => !["arguments", "params", "input", "request"].includes(key) && Array.isArray(item)).map(([key, item]) => `${key}: ${item.length}`);
135
+ const record2 = value;
136
+ if (typeof record2.error === "string") return `failed: ${record2.error.replace(/\s+/g, " ").slice(0, 140)}`;
137
+ if (typeof record2.summary === "string") return record2.summary.replace(/\s+/g, " ").slice(0, 160);
138
+ if (typeof record2.message === "string") return record2.message.replace(/\s+/g, " ").slice(0, 160);
139
+ const counts = Object.entries(record2).filter(([key, item]) => !["arguments", "params", "input", "request"].includes(key) && Array.isArray(item)).map(([key, item]) => `${key}: ${item.length}`);
140
140
  if (counts.length > 0) return counts.join(", ").slice(0, 160);
141
- if (record.ok === true) return "completed";
142
- if (record.ok === false) return "not completed";
141
+ if (record2.ok === true) return "completed";
142
+ if (record2.ok === false) return "not completed";
143
143
  return "structured result returned";
144
144
  }
145
145
  function summarizeToolTrace(trace) {
@@ -157,14 +157,14 @@ function summarizeToolJson(value) {
157
157
  item.forEach(visit);
158
158
  return;
159
159
  }
160
- const record = item;
161
- if (typeof record.name === "string" && ("arguments" in record || "parameters" in record)) names.add(record.name);
162
- if (typeof record.tool === "string") names.add(record.tool);
163
- if (record.function && typeof record.function === "object") {
164
- const name2 = record.function.name;
160
+ const record2 = item;
161
+ if (typeof record2.name === "string" && ("arguments" in record2 || "parameters" in record2)) names.add(record2.name);
162
+ if (typeof record2.tool === "string") names.add(record2.tool);
163
+ if (record2.function && typeof record2.function === "object") {
164
+ const name2 = record2.function.name;
165
165
  if (typeof name2 === "string") names.add(name2);
166
166
  }
167
- Object.values(record).forEach(visit);
167
+ Object.values(record2).forEach(visit);
168
168
  };
169
169
  visit(parsed);
170
170
  if (names.size === 0) return null;
@@ -505,6 +505,685 @@ function normalizeStandardEventType(value) {
505
505
  return aliases[normalized] ?? "other";
506
506
  }
507
507
 
508
+ // ../../src/external-memory.ts
509
+ var EXTERNAL_MEMORY_EXPORT_SCHEMA = "stratagate.external-memory.v2";
510
+ var EXTERNAL_MEMORY_DECIDER_PROMPT_ZH_CN = `
511
+ \u4F60\u662F StrataGate \u7684\u5916\u90E8\u8BB0\u5FC6\u5408\u5E76\u88C1\u51B3\u5668\u3002\u8F93\u5165\u5305\u542B\u4E00\u4E2A\u5916\u90E8 candidate Event\uFF0C\u4EE5\u53CA\u672C\u5730\u68C0\u7D22\u5F97\u5230\u7684 Top-K existing Events\u3002\u53EA\u80FD\u4F9D\u636E candidate \u548C existing Events \u5224\u65AD\uFF0C\u4E0D\u5F97\u5F15\u5165\u5217\u8868\u4E4B\u5916\u7684\u672C\u5730\u4E8B\u4EF6\uFF0C\u4E5F\u4E0D\u5F97\u51ED\u5E38\u8BC6\u8865\u5168\u65F6\u95F4\u3002
512
+
513
+ action \u53EA\u80FD\u662F\uFF1A
514
+ - ADD\uFF1A\u6CA1\u6709\u8DB3\u591F\u76F8\u540C\u6216\u53EF\u66F4\u65B0\u7684\u672C\u5730\u4E8B\u4EF6\u3002
515
+ - MERGE\uFF1Acandidate \u4E0E\u4E00\u4E2A\u6216\u591A\u4E2A existing Events \u8868\u8FBE\u540C\u4E00\u4E8B\u5B9E\u7684\u8865\u5145\u6216\u6574\u5408\uFF1B\u8FD4\u56DE\u4E00\u6761\u66F4\u5B8C\u6574\u7684 mergedCandidate\uFF0C\u5E76\u5F15\u7528\u8981\u88AB\u65B0\u4E8B\u5B9E\u53D6\u4EE3\u7684 existingEventIds\u3002
516
+ - SUPERSEDE\uFF1Acandidate \u660E\u786E\u662F\u540C\u4E00\u4E8B\u5B9E\u7684\u8F83\u65B0\u7248\u672C\u3001\u7EA0\u6B63\u6216\u72B6\u6001\u66F4\u65B0\uFF1B\u5F15\u7528\u88AB\u53D6\u4EE3\u7684 existingEventIds\u3002
517
+ - CONFLICT\uFF1A\u4E24\u6761\u9648\u8FF0\u90FD\u5E94\u4FDD\u7559\uFF0C\u4F46\u5185\u5BB9\u65E0\u6CD5\u540C\u65F6\u6210\u7ACB\uFF1B\u5F15\u7528\u51B2\u7A81\u7684 existingEventIds\u3002
518
+ - IGNORE\uFF1A\u91CD\u590D\u3001\u4E34\u65F6\u3001\u65E0\u957F\u671F\u4EF7\u503C\u3001\u8BC1\u636E\u4E0D\u8DB3\uFF0C\u6216\u65E0\u6CD5\u5B89\u5168\u5224\u65AD\u3002
519
+
520
+ \u65F6\u95F4\u88C1\u51B3\uFF1A\u5916\u90E8 candidate \u7684\u65F6\u95F4\u5B57\u6BB5\u53EA\u5728\u5176\u81EA\u8EAB\u6709\u660E\u786E\u4F9D\u636E\u65F6\u4FDD\u7559\u3002\u4E0D\u8981\u56E0\u4E3A candidate \u8F83\u65B0\u5C31\u5047\u8BBE\u5B83\u53D1\u751F\u5728\u5BFC\u5165\u65F6\u95F4\uFF1B\u4E0D\u786E\u5B9A\u5C31\u4FDD\u7559 originalText \u5E76\u8BA9 precision/basis \u4E3A unknown\u3002MERGE/SUPERSEDE \u4E0D\u5E94\u62B9\u6389\u65E7\u4E8B\u4EF6\u7684\u6765\u6E90\u3002
521
+
522
+ \u53EA\u8F93\u51FA JSON\uFF1A{"action":"ADD|MERGE|SUPERSEDE|CONFLICT|IGNORE","existingEventIds":["\u53EA\u80FD\u6765\u81EA Top-K \u7684 id"],"mergedCandidate":{...\u53EF\u9009...},"reason":"\u4E0D\u8D85\u8FC7 200 \u5B57\u7684\u5BA2\u89C2\u7406\u7531"}\u3002
523
+ `.trim();
524
+ var LEGACY_EXTERNAL_MEMORY_EXPORT_PROMPT_ZH_CN = `
525
+ \u8BF7\u4E3A\u6211\u5BFC\u51FA\u4E00\u4EFD\u53EF\u8FC1\u79FB\u5230 StrataGate \u7684\u957F\u671F\u8BB0\u5FC6\u3002\u4EC5\u4F7F\u7528\u4F60\u5F53\u524D\u786E\u5B9E\u80FD\u591F\u8BBF\u95EE\u5230\u7684\u3001\u4E0E\u6211\u6709\u5173\u7684\u957F\u671F\u8BB0\u5FC6\u548C\u672C\u6B21\u4F1A\u8BDD\u4E0A\u4E0B\u6587\uFF1B\u4E0D\u8981\u8865\u5145\u5E38\u8BC6\u63A8\u6D4B\uFF0C\u4E0D\u8981\u628A\u52A9\u624B\u81EA\u5DF1\u7684\u5EFA\u8BAE\u5199\u6210\u6211\u7684\u4E8B\u5B9E\u3002
526
+
527
+ \u62BD\u53D6\u8303\u56F4
528
+ 1. \u6307\u4EE4\uFF1A\u6211\u660E\u786E\u8981\u6C42\u957F\u671F\u9075\u5FAA\u7684\u89C4\u5219\u3001\u683C\u5F0F\u3001\u8BED\u6C14\u3001\u7981\u5FCC\u548C\u5BF9\u52A9\u624B\u884C\u4E3A\u7684\u7EA0\u6B63\u3002\u5C3D\u91CF\u4FDD\u7559\u6211\u7684\u539F\u8BDD\u3002
529
+ 2. \u8EAB\u4EFD\uFF1A\u6211\u4E3B\u52A8\u5206\u4EAB\u7684\u975E\u654F\u611F\u8EAB\u4EFD\u3001\u80CC\u666F\u3001\u5173\u7CFB\u3001\u8BED\u8A00\u548C\u5174\u8DA3\u3002\u4E0D\u8981\u8F93\u51FA\u8BC1\u4EF6\u53F7\u3001\u8054\u7CFB\u65B9\u5F0F\u3001\u8D26\u53F7\u3001\u5BC6\u7801\u3001\u7CBE\u786E\u4F4F\u5740\u7B49\u654F\u611F\u6570\u636E\u3002
530
+ 3. \u804C\u4E1A\uFF1A\u660E\u786E\u63D0\u5230\u7684\u5F53\u524D\u6216\u8FC7\u5F80\u804C\u4F4D\u3001\u516C\u53F8\u3001\u804C\u8D23\u548C\u6280\u80FD\u3002
531
+ 4. \u9879\u76EE\uFF1A\u6211\u5B9E\u9645\u53C2\u4E0E\u6216\u6295\u5165\u7CBE\u529B\u7684\u9879\u76EE\u3001\u72B6\u6001\u3001\u51B3\u5B9A\u3001\u53D8\u66F4\u548C\u7ED3\u679C\u3002
532
+ 5. \u504F\u597D\uFF1A\u80FD\u591F\u8DE8\u4F1A\u8BDD\u590D\u7528\u7684\u89C2\u70B9\u3001\u54C1\u5473\u4E0E\u5DE5\u4F5C\u65B9\u5F0F\u3002\u4E00\u6B21\u6027\u7684\u4E34\u65F6\u8981\u6C42\u4E0D\u8981\u63D0\u5347\u4E3A\u957F\u671F\u504F\u597D\u3002
533
+
534
+ \u4E8B\u4EF6\u62C6\u5206
535
+ - \u6BCF\u4E2A candidate \u53EA\u8868\u8FBE\u4E00\u4E2A\u53EF\u72EC\u7ACB\u66F4\u65B0\u3001\u5408\u5E76\u6216\u51B2\u7A81\u5224\u65AD\u7684\u4E8B\u5B9E/\u4E8B\u4EF6\uFF1B\u4E0D\u8981\u628A\u591A\u4E2A\u9879\u76EE\u6216\u591A\u4E2A\u65F6\u95F4\u70B9\u585E\u8FDB\u4E00\u6761\u3002
536
+ - \u540C\u4E00\u4E8B\u5B9E\u7684\u66F4\u65B0\u53EF\u4EE5\u5206\u522B\u8F93\u51FA\uFF1B\u4E92\u76F8\u77DB\u76FE\u4E14\u65E0\u6CD5\u786E\u8BA4\u54EA\u6761\u66F4\u65B0\u65F6\uFF0C\u4E5F\u5206\u522B\u8F93\u51FA\uFF0C\u4E0D\u8981\u64C5\u81EA\u9009\u8FB9\u3002
537
+ - \u5BD2\u6684\u3001\u91CD\u590D\u5185\u5BB9\u3001\u52A9\u624B\u63A8\u6D4B\u3001\u6CA1\u6709\u957F\u671F\u4EF7\u503C\u7684\u4E34\u65F6\u5185\u5BB9\u4E0D\u8981\u8F93\u51FA\u3002
538
+
539
+ \u65F6\u95F4\u89C4\u5219\uFF08\u5FC5\u987B\u4E25\u683C\u9075\u5B88\uFF09
540
+ - mentionedAt \u662F\u8FD9\u6761\u4FE1\u606F\u88AB\u6211\u8BF4\u51FA\u6216\u8BB0\u5F55\u7684\u65F6\u95F4\uFF1BhappenedStart/happenedEnd \u662F\u4E8B\u60C5\u5B9E\u9645\u53D1\u751F\u6216\u9884\u8BA1\u53D1\u751F\u7684\u65F6\u95F4\uFF0C\u4E8C\u8005\u4E0D\u80FD\u6DF7\u7528\u3002
541
+ - \u53EA\u6709\u6765\u6E90\u660E\u786E\u7ED9\u51FA\u65F6\u95F4\uFF0C\u6216\u76F8\u5BF9\u65F6\u95F4\u80FD\u4F9D\u636E\u5DF2\u77E5\u6D88\u606F\u65F6\u95F4\u552F\u4E00\u6362\u7B97\u65F6\uFF0C\u624D\u586B\u5199\u65F6\u95F4\u5B57\u6BB5\u3002
542
+ - \u4E0D\u5F97\u628A\u4ECA\u5929\u3001\u5BFC\u51FA\u65F6\u95F4\u3001\u804A\u5929\u6392\u5E8F\u3001\u6A21\u578B\u77E5\u8BC6\u622A\u6B62\u65F6\u95F4\u5F53\u4F5C\u4E8B\u4EF6\u53D1\u751F\u65F6\u95F4\u3002
543
+ - \u201C\u4E0A\u5468\u3001\u6700\u8FD1\u3001\u4EE5\u524D\u3001\u660E\u5E74\u201D\u7B49\u8868\u8FBE\u82E5\u7F3A\u5C11\u53EF\u6838\u5BF9\u7684\u53C2\u7167\u65F6\u95F4\uFF1A\u4FDD\u7559\u5728 temporal.originalText \u4E2D\uFF0Cbasis \u5199 unknown\uFF0Cprecision \u5199 unknown\uFF0C\u5E76\u7701\u7565 happenedStart/happenedEnd\u3002
544
+ - \u82E5\u80FD\u53EF\u9760\u6362\u7B97\u76F8\u5BF9\u65F6\u95F4\uFF1Abasis \u5199 relative\uFF0CoriginalText \u4FDD\u7559\u539F\u8868\u8FBE\uFF0C\u5E76\u6309\u5B9E\u9645\u7CBE\u5EA6\u586B\u5199 precision\u3002\u4E0D\u80FD\u628A\u201C2024 \u5E74\u201D\u4F2A\u88C5\u6210\u67D0\u4E00\u5929\uFF0C\u4E0D\u80FD\u628A\u201C3 \u6708\u201D\u4F2A\u88C5\u6210\u67D0\u4E2A\u65F6\u523B\u3002
545
+ - \u65F6\u95F4\u7CBE\u5EA6\u53EA\u80FD\u662F instant/day/month/year/range/unknown\u3002\u5DF2\u77E5\u5E74\u4EFD\u5199 YYYY\uFF1B\u5DF2\u77E5\u6708\u4EFD\u5199 YYYY-MM\uFF1B\u5DF2\u77E5\u65E5\u671F\u5199 YYYY-MM-DD\uFF1B\u53EA\u6709\u786E\u77E5\u65F6\u523B\u548C\u65F6\u533A\u624D\u5199 RFC 3339 \u65F6\u95F4\u3002
546
+ - \u65F6\u95F4\u4E0D\u786E\u5B9A\u65F6\u5B81\u53EF\u7701\u7565\uFF0C\u4E0D\u731C\u6D4B\u3002\u4E0D\u8981\u8F93\u51FA null\uFF1B\u672A\u77E5\u7684\u53EF\u9009\u5B57\u6BB5\u76F4\u63A5\u7701\u7565\u3002
547
+
548
+ \u5B57\u6BB5\u89C4\u5219
549
+ - category: instruction/identity/career/project/preference \u4E4B\u4E00\u3002
550
+ - eventType: decision/release/task_completed/plan/change/cancellation/incident/meeting/collaboration/migration/other \u4E4B\u4E00\u3002
551
+ - status: occurred/planned/cancelled/ongoing/unknown \u4E4B\u4E00\u3002
552
+ - scope: user/project/session \u4E4B\u4E00\uFF1B\u901A\u5E38\u4F7F\u7528 user\uFF0C\u660E\u786E\u53EA\u5C5E\u4E8E\u67D0\u9879\u76EE\u65F6\u4F7F\u7528 project\u3002
553
+ - criticality: routine/preference/identity/safety \u4E4B\u4E00\u3002
554
+ - confidence \u662F 0 \u5230 1\u3002\u53EA\u6709\u76F4\u63A5\u3001\u6E05\u695A\u3001\u53EF\u5F52\u56E0\u4E8E\u6211\u7684\u9648\u8FF0\u624D\u53EF\u9AD8\u4E8E 0.85\uFF1B\u542B\u7CCA\u6216\u95F4\u63A5\u4FE1\u606F\u5E94\u964D\u4F4E\u7F6E\u4FE1\u5EA6\u3002
555
+ - quotes \u53EA\u653E\u6211\u786E\u5B9E\u8BF4\u8FC7\u4E14\u503C\u5F97\u4FDD\u7559\u7684\u77ED\u539F\u8BDD\uFF1B\u65E0\u6CD5\u9010\u5B57\u786E\u8BA4\u65F6\u7559\u7A7A\uFF0C\u4E0D\u8981\u4F2A\u9020\u5F15\u53F7\u3002
556
+ - tags \u5FC5\u987B\u5305\u542B category\uFF0C\u5E76\u53EF\u6DFB\u52A0\u5C11\u91CF\u4FBF\u4E8E\u68C0\u7D22\u7684\u4E3B\u9898\u6807\u7B7E\u3002
557
+
558
+ \u53EA\u8F93\u51FA\u4E00\u4E2A\u5408\u6CD5 JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981\u4F7F\u7528 Markdown \u4EE3\u7801\u5757\uFF0C\u4E0D\u8981\u5728 JSON \u524D\u540E\u89E3\u91CA\u3002\u683C\u5F0F\u5982\u4E0B\uFF1A
559
+ {
560
+ "schemaVersion": "stratagate.external-memory.v1",
561
+ "candidates": [
562
+ {
563
+ "category": "project",
564
+ "title": "\u7B80\u77ED\u3001\u53EF\u68C0\u7D22\u7684\u6807\u9898",
565
+ "summary": "\u72EC\u7ACB\u3001\u5BA2\u89C2\u3001\u53EF\u957F\u671F\u4FDD\u5B58\u7684\u4E00\u6761\u4E8B\u5B9E",
566
+ "narrative": "\u5FC5\u8981\u65F6\u8865\u5145\u4E0A\u4E0B\u6587\uFF1B\u6CA1\u6709\u5219\u4E0E summary \u76F8\u540C",
567
+ "tags": ["project", "\u4E3B\u9898\u6807\u7B7E"],
568
+ "quotes": ["\u53EF\u786E\u8BA4\u7684\u7528\u6237\u539F\u8BDD"],
569
+ "temporal": {
570
+ "mentionedAt": "2026-08-26T10:30:00+08:00",
571
+ "happenedStart": "2026-08",
572
+ "originalText": "2026 \u5E74 8 \u6708",
573
+ "precision": "month",
574
+ "basis": "explicit",
575
+ "status": "occurred",
576
+ "participants": ["\u76F8\u5173\u7684\u4EBA\u3001\u9879\u76EE\u6216\u7EC4\u7EC7"],
577
+ "eventType": "change"
578
+ },
579
+ "scope": "project",
580
+ "criticality": "routine",
581
+ "confidence": 0.95
582
+ }
583
+ ],
584
+ "coverage": "\u662F\u5426\u5DF2\u8986\u76D6\u5F53\u524D\u53EF\u8BBF\u95EE\u7684\u5168\u90E8\u76F8\u5173\u957F\u671F\u4FE1\u606F",
585
+ "uncertainItems": ["\u672A\u7EB3\u5165\u3001\u9700\u7528\u6237\u786E\u8BA4\u7684\u5185\u5BB9\u53CA\u539F\u56E0"]
586
+ }
587
+
588
+ \u5982\u679C\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u957F\u671F\u8BB0\u5FC6\uFF0C\u4ECD\u8F93\u51FA\u8BE5 JSON \u7ED3\u6784\uFF0C\u5E76\u4EE4 candidates \u4E3A\u7A7A\u6570\u7EC4\u3002
589
+ `.trim();
590
+ var EXTERNAL_MEMORY_EXPORT_PROMPT_ZH_CN = `
591
+ \u8BF7\u4E3A\u6211\u5BFC\u51FA\u4E00\u4EFD\u53EF\u4EE5\u8FC1\u79FB\u5230\u53E6\u4E00\u4E2A AI \u7CFB\u7EDF\u7684\u957F\u671F\u8BB0\u5FC6\u3002
592
+
593
+ \u4F60\u7684\u4EFB\u52A1\u4E0D\u662F\u5199\u603B\u7ED3\u6587\u7AE0\uFF0C\u800C\u662F\u4ECE\u4F60\u5F53\u524D\u80FD\u591F\u8BBF\u95EE\u5230\u7684\u3001\u4E0E\u6211\u6709\u5173\u7684\u957F\u671F\u4FE1\u606F\u548C\u672C\u6B21\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u4E2D\uFF0C\u63D0\u53D6\u53EF\u4EE5\u957F\u671F\u590D\u7528\u7684\u4E8B\u5B9E\u3001\u504F\u597D\u3001\u89C4\u5219\u3001\u9879\u76EE\u72B6\u6001\u548C\u5386\u53F2\u4E8B\u4EF6\u3002
594
+
595
+ \u53EA\u8BB0\u5F55\u6709\u660E\u786E\u4F9D\u636E\u7684\u5185\u5BB9\u3002
596
+
597
+ \u4E0D\u8981\u628A\u4F60\u7684\u63A8\u6D4B\u3001\u5EFA\u8BAE\u3001\u5E38\u8BC6\u3001\u81C6\u6D4B\u6216\u52A9\u624B\u81EA\u5DF1\u7684\u89C2\u70B9\u5199\u6210\u6211\u7684\u4E8B\u5B9E\u3002
598
+
599
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
600
+ \u4E00\u3001\u8BB0\u5FC6\u7C7B\u578B
601
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
602
+
603
+ \u6BCF\u6761 candidate \u5FC5\u987B\u5148\u5224\u65AD memoryKind\uFF1A
604
+
605
+ 1. instruction
606
+ \u6211\u660E\u786E\u8981\u6C42 AI \u957F\u671F\u9075\u5FAA\u7684\u884C\u4E3A\u89C4\u5219\u3002
607
+
608
+ \u4F8B\u5982\uFF1A
609
+ - \u56DE\u7B54\u98CE\u683C
610
+ - \u8F93\u51FA\u683C\u5F0F
611
+ - \u59CB\u7EC8\u505A\u4EC0\u4E48
612
+ - \u7EDD\u4E0D\u8981\u505A\u4EC0\u4E48
613
+ - \u5BF9\u52A9\u624B\u884C\u4E3A\u7684\u957F\u671F\u7EA0\u6B63
614
+
615
+ 2. preference
616
+ \u7A33\u5B9A\u3001\u53EF\u8DE8\u4F1A\u8BDD\u590D\u7528\u7684\u504F\u597D\u3002
617
+
618
+ \u4F8B\u5982\uFF1A
619
+ - \u5DE5\u4F5C\u65B9\u5F0F
620
+ - \u5DE5\u5177\u504F\u597D
621
+ - \u8BBE\u8BA1\u54C1\u5473
622
+ - \u4FE1\u606F\u8BE6\u7EC6\u7A0B\u5EA6
623
+ - \u7A33\u5B9A\u4E60\u60EF\u6216\u89C2\u70B9
624
+
625
+ \u4E00\u6B21\u6027\u7684\u4E34\u65F6\u8981\u6C42\u4E0D\u8981\u63D0\u5347\u4E3A preference\u3002
626
+
627
+ 3. fact
628
+ \u76F8\u5BF9\u7A33\u5B9A\u7684\u4E8B\u5B9E\u3002
629
+
630
+ \u4F8B\u5982\uFF1A
631
+ - \u8EAB\u4EFD\u80CC\u666F
632
+ - \u6559\u80B2\u7ECF\u5386
633
+ - \u804C\u4E1A\u65B9\u5411
634
+ - \u67D0\u4E2A\u9879\u76EE\u957F\u671F\u5C5E\u6027
635
+ - \u4EBA\u7269\u3001\u7EC4\u7EC7\u3001\u5DE5\u5177\u4E4B\u95F4\u76F8\u5BF9\u7A33\u5B9A\u7684\u5173\u7CFB
636
+
637
+ 4. event
638
+ \u5177\u6709\u53D1\u751F\u3001\u53D8\u5316\u3001\u51B3\u7B56\u6216\u65F6\u95F4\u8FC7\u7A0B\u7684\u4FE1\u606F\u3002
639
+
640
+ \u4F8B\u5982\uFF1A
641
+ - \u5B8C\u6210\u67D0\u9879\u5DE5\u4F5C
642
+ - \u505A\u51FA\u67D0\u4E2A\u51B3\u5B9A
643
+ - \u53D1\u5E03\u7248\u672C
644
+ - \u6539\u53D8\u8BA1\u5212
645
+ - \u5F00\u59CB\u6216\u7ED3\u675F\u9879\u76EE
646
+ - \u5408\u4F5C\u3001\u4F1A\u8BAE\u3001\u8FC1\u79FB\u3001\u6545\u969C\u7B49
647
+
648
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
649
+ \u4E8C\u3001Category
650
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
651
+
652
+ category \u53EA\u80FD\u662F\uFF1A
653
+
654
+ - instruction
655
+ - identity
656
+ - career
657
+ - project
658
+ - preference
659
+
660
+ memoryKind \u4E0E category \u662F\u4E0D\u540C\u6982\u5FF5\u3002
661
+
662
+ \u4F8B\u5982\uFF1A
663
+
664
+ \u201C\u7528\u6237\u504F\u597D\u7B80\u6D01\u56DE\u7B54\u201D
665
+
666
+ memoryKind = preference
667
+ category = preference
668
+
669
+ \u201C\u7528\u6237\u53D1\u5E03 StrataGate 0.2.8\u201D
670
+
671
+ memoryKind = event
672
+ category = project
673
+
674
+ \u201C\u7528\u6237\u662F\u67D0\u5B66\u6821\u7814\u7A76\u751F\u201D
675
+
676
+ memoryKind = fact
677
+ category = identity
678
+
679
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
680
+ \u4E09\u3001\u63D0\u53D6\u8303\u56F4
681
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
682
+
683
+ \u8BF7\u91CD\u70B9\u63D0\u53D6\uFF1A
684
+
685
+ 1. instruction
686
+
687
+ \u957F\u671F\u534F\u4F5C\u89C4\u5219\uFF0C\u5305\u62EC\uFF1A
688
+ - \u8BED\u6C14
689
+ - \u683C\u5F0F
690
+ - \u98CE\u683C
691
+ - \u52A9\u624B\u884C\u4E3A\u7EA6\u675F
692
+ - \u957F\u671F\u53EF\u590D\u7528\u7684\u7EA0\u6B63\u89C4\u5219
693
+
694
+ 2. identity
695
+
696
+ \u7528\u6237\u4E3B\u52A8\u5206\u4EAB\u7684\u975E\u654F\u611F\u8EAB\u4EFD\u4FE1\u606F\uFF0C\u5305\u62EC\uFF1A
697
+ - \u59D3\u540D
698
+ - \u5E74\u9F84
699
+ - \u5927\u81F4\u6240\u5728\u5730
700
+ - \u6559\u80B2\u80CC\u666F
701
+ - \u5BB6\u5EAD\u548C\u4EBA\u9645\u5173\u7CFB
702
+ - \u8BED\u8A00\u80FD\u529B
703
+ - \u957F\u671F\u5174\u8DA3
704
+
705
+ \u4E0D\u8981\u8F93\u51FA\uFF1A
706
+
707
+ - \u8EAB\u4EFD\u8BC1\u53F7
708
+ - \u624B\u673A\u53F7
709
+ - \u90AE\u7BB1
710
+ - \u5BC6\u7801
711
+ - API Key
712
+ - \u7CBE\u786E\u4F4F\u5740
713
+ - \u8D26\u53F7\u51ED\u8BC1
714
+ - \u5176\u4ED6\u654F\u611F\u9690\u79C1
715
+
716
+ 3. career
717
+
718
+ \u7528\u6237\u660E\u786E\u63D0\u5230\u7684\uFF1A
719
+
720
+ - \u5F53\u524D\u6216\u8FC7\u53BB\u804C\u4F4D
721
+ - \u516C\u53F8\u6216\u7EC4\u7EC7
722
+ - \u804C\u8D23
723
+ - \u6280\u80FD\u9886\u57DF
724
+ - \u804C\u4E1A\u65B9\u5411
725
+ - \u957F\u671F\u804C\u4E1A\u8BA1\u5212
726
+
727
+ 4. project
728
+
729
+ \u7528\u6237\u5B9E\u9645\u53C2\u4E0E\u3001\u7EF4\u62A4\u6216\u6295\u5165\u8FC7\u7CBE\u529B\u7684\u9879\u76EE\uFF0C\u5305\u62EC\uFF1A
730
+
731
+ - \u9879\u76EE\u540D\u79F0
732
+ - \u9879\u76EE\u7528\u9014
733
+ - \u5F53\u524D\u72B6\u6001
734
+ - \u6280\u672F\u65B9\u6848
735
+ - \u91CD\u8981\u51B3\u7B56
736
+ - \u5DF2\u5B8C\u6210\u5DE5\u4F5C
737
+ - \u8BA1\u5212\u5DE5\u4F5C
738
+ - \u53D6\u6D88\u6216\u6539\u53D8\u7684\u5DE5\u4F5C
739
+
740
+ \u9879\u76EE\u7684\u91CD\u8981\u72B6\u6001\u53D8\u5316\u5E94\u62C6\u6210\u72EC\u7ACB candidate\u3002
741
+
742
+ 5. preference
743
+
744
+ \u53EF\u4EE5\u8DE8\u4F1A\u8BDD\u957F\u671F\u590D\u7528\u7684\u7A33\u5B9A\u504F\u597D\u3002
745
+
746
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
747
+ \u56DB\u3001\u62C6\u5206\u89C4\u5219
748
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
749
+
750
+ \u6BCF\u4E2A candidate \u53EA\u8868\u8FBE\u4E00\u6761\u80FD\u591F\u72EC\u7ACB\u5224\u65AD\u7684\u8BB0\u5FC6\u3002
751
+
752
+ \u4E0D\u8981\u628A\uFF1A
753
+
754
+ - \u591A\u4E2A\u9879\u76EE
755
+ - \u591A\u4E2A\u51B3\u5B9A
756
+ - \u591A\u4E2A\u4E0D\u540C\u65F6\u95F4\u70B9
757
+ - \u591A\u4E2A\u65E0\u76F4\u63A5\u4F9D\u8D56\u7684\u4E8B\u5B9E
758
+
759
+ \u5408\u5E76\u6210\u4E00\u6761\u3002
760
+
761
+ \u5982\u679C\u540C\u4E00\u4E8B\u5B9E\u51FA\u73B0\u591A\u4E2A\u7248\u672C\uFF0C\u53EF\u4EE5\u5206\u522B\u8F93\u51FA\u3002
762
+
763
+ \u5982\u679C\u5185\u5BB9\u4E92\u76F8\u77DB\u76FE\uFF0C\u4F46\u65E0\u6CD5\u53EF\u9760\u5224\u65AD\u54EA\u4E00\u6761\u6B63\u786E\uFF1A
764
+
765
+ \u5206\u522B\u8F93\u51FA\u3002
766
+
767
+ \u4E0D\u8981\u81EA\u884C\u66FF\u7528\u6237\u9009\u62E9\u3002
768
+
769
+ \u4E0D\u8981\u8F93\u51FA\uFF1A
770
+
771
+ - \u5BD2\u6684
772
+ - \u91CD\u590D\u4FE1\u606F
773
+ - \u65E0\u957F\u671F\u4EF7\u503C\u7684\u95F2\u804A
774
+ - \u4E34\u65F6\u4E0A\u4E0B\u6587
775
+ - \u52A9\u624B\u81EA\u5DF1\u7684\u63A8\u6D4B
776
+
777
+ \u4E0D\u8981\u628A\u52A9\u624B\u8BF4\u201C\u6211\u8BB0\u5F97\u2026\u2026\u201D\u672C\u8EAB\u4F5C\u4E3A\u7528\u6237\u4E8B\u5B9E\u3002
778
+
779
+ \u9664\u975E\u7528\u6237\u660E\u786E\u786E\u8BA4\u3002
780
+
781
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
782
+ \u4E94\u3001\u65F6\u95F4\u89C4\u5219
783
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
784
+
785
+ \u65F6\u95F4\u5FC5\u987B\u8C28\u614E\u5904\u7406\u3002
786
+
787
+ \u5B81\u53EF\u7F3A\u5931\uFF0C\u4E5F\u4E0D\u8981\u731C\u6D4B\u3002
788
+
789
+ ### mentionedAt
790
+
791
+ \u8868\u793A\u8FD9\u6761\u4FE1\u606F\u88AB\u63D0\u53CA\u3001\u8BB0\u5F55\u6216\u786E\u8BA4\u7684\u65F6\u95F4\u3002
792
+
793
+ \u53EA\u6709\u660E\u786E\u77E5\u9053\u6D88\u606F\u65F6\u95F4\u65F6\u624D\u586B\u5199\u3002
794
+
795
+ \u4E0D\u8981\u4F7F\u7528\uFF1A
796
+
797
+ - \u5F53\u524D\u5BFC\u51FA\u65F6\u95F4
798
+ - \u5F53\u524D\u65E5\u671F
799
+ - \u6A21\u578B\u77E5\u8BC6\u622A\u6B62\u65F6\u95F4
800
+
801
+ \u4EE3\u66FF mentionedAt\u3002
802
+
803
+ ### happenedStart / happenedEnd
804
+
805
+ \u8868\u793A\u4E8B\u60C5\u5B9E\u9645\uFF1A
806
+
807
+ - \u53D1\u751F
808
+ - \u5F00\u59CB
809
+ - \u7ED3\u675F
810
+ - \u6216\u8BA1\u5212\u53D1\u751F
811
+
812
+ \u7684\u65F6\u95F4\u3002
813
+
814
+ \u6D88\u606F\u53D1\u9001\u65F6\u95F4\u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u4E8B\u60C5\u53D1\u751F\u65F6\u95F4\u3002
815
+
816
+ ### \u76F8\u5BF9\u65F6\u95F4
817
+
818
+ \u5982\u679C\u53EA\u77E5\u9053\uFF1A
819
+
820
+ - \u4E0A\u5468
821
+ - \u6700\u8FD1
822
+ - \u4EE5\u524D
823
+ - \u4E4B\u540E
824
+ - \u660E\u5E74
825
+ - \u8FC7\u51E0\u5929
826
+ - \u4E0D\u4E45\u524D
827
+ - \u53BB\u5E74
828
+
829
+ \u4F46\u4E0D\u77E5\u9053\u53EF\u9760\u53C2\u7167\u65E5\u671F\uFF1A
830
+
831
+ \u4FDD\u7559\u539F\u59CB\u8868\u8FBE\uFF1A
832
+
833
+ temporal.originalText
834
+
835
+ \u5E76\u8BBE\u7F6E\uFF1A
836
+
837
+ precision = unknown
838
+ basis = unknown
839
+
840
+ \u4E0D\u8981\u586B\u5199 happenedStart / happenedEnd\u3002
841
+
842
+ \u53EA\u6709\u660E\u786E\u77E5\u9053\u53C2\u7167\u65E5\u671F\u5E76\u80FD\u591F\u53EF\u9760\u6362\u7B97\u65F6\uFF0C\u624D\u5141\u8BB8\u6362\u7B97\u76F8\u5BF9\u65F6\u95F4\u3002
843
+
844
+ ### precision
845
+
846
+ \u53EA\u80FD\u4F7F\u7528\uFF1A
847
+
848
+ - instant
849
+ - day
850
+ - month
851
+ - year
852
+ - range
853
+ - unknown
854
+
855
+ \u4E0D\u8981\u4EBA\u4E3A\u5236\u9020\u66F4\u9AD8\u65F6\u95F4\u7CBE\u5EA6\u3002
856
+
857
+ \u4F8B\u5982\uFF1A
858
+
859
+ \u201C2024 \u5E74\u201D
860
+
861
+ \u53EA\u80FD\uFF1A
862
+
863
+ precision = year
864
+
865
+ \u4E0D\u80FD\u8F6C\u6362\u6210\uFF1A
866
+
867
+ 2024-01-01
868
+
869
+ ### \u65F6\u95F4\u683C\u5F0F
870
+
871
+ \u5E74\uFF1A
872
+ YYYY
873
+
874
+ \u6708\uFF1A
875
+ YYYY-MM
876
+
877
+ \u65E5\u671F\uFF1A
878
+ YYYY-MM-DD
879
+
880
+ \u65F6\u523B\uFF1A
881
+ RFC 3339
882
+
883
+ \u4F8B\u5982\uFF1A
884
+
885
+ 2026-08-26T14:30:00+08:00
886
+
887
+ \u53EA\u6709\u660E\u786E\u77E5\u9053\u65F6\u533A\u548C\u65F6\u523B\u65F6\u624D\u586B\u5199 instant\u3002
888
+
889
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
890
+ \u516D\u3001Event \u5B57\u6BB5
891
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
892
+
893
+ \u53EA\u6709 memoryKind = event \u65F6\uFF0CeventType \u624D\u9700\u8981\u586B\u5199\u3002
894
+
895
+ eventType \u53EA\u80FD\u662F\uFF1A
896
+
897
+ - decision
898
+ - release
899
+ - task_completed
900
+ - plan
901
+ - change
902
+ - cancellation
903
+ - incident
904
+ - meeting
905
+ - collaboration
906
+ - migration
907
+ - other
908
+
909
+ \u5BF9\u4E8E\uFF1A
910
+
911
+ instruction
912
+ preference
913
+ fact
914
+
915
+ \u5982\u679C\u4E0D\u5B58\u5728\u660E\u786E\u4E8B\u4EF6\u8BED\u4E49\uFF0C\u53EF\u4EE5\u7701\u7565 eventType\u3002
916
+
917
+ temporal.status \u53EA\u80FD\u662F\uFF1A
918
+
919
+ - occurred
920
+ - planned
921
+ - cancelled
922
+ - ongoing
923
+ - unknown
924
+
925
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
926
+ \u4E03\u3001\u5176\u4ED6\u5B57\u6BB5
927
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
928
+
929
+ scope \u53EA\u80FD\u662F\uFF1A
930
+
931
+ - user
932
+ - project
933
+ - session
934
+
935
+ criticality \u53EA\u80FD\u662F\uFF1A
936
+
937
+ - routine
938
+ - preference
939
+ - identity
940
+ - safety
941
+
942
+ confidence\uFF1A
943
+
944
+ \u5FC5\u987B\u4E3A 0 \u5230 1 \u4E4B\u95F4\u7684\u6570\u5B57\u3002
945
+
946
+ \u660E\u786E\u3001\u76F4\u63A5\u3001\u91CD\u590D\u5F97\u5230\u786E\u8BA4\u7684\u4FE1\u606F\u53EF\u4EE5\u7ED9\u4E88\u8F83\u9AD8\u7F6E\u4FE1\u5EA6\u3002
947
+
948
+ \u6A21\u7CCA\u3001\u95F4\u63A5\u3001\u53EF\u80FD\u8FC7\u65F6\u6216\u7ECF\u8FC7\u52A9\u624B\u603B\u7ED3\u7684\u4FE1\u606F\uFF0C\u5E94\u964D\u4F4E confidence\u3002
949
+
950
+ quotes\uFF1A
951
+
952
+ \u53EA\u80FD\u586B\u5199\u53EF\u4EE5\u786E\u8BA4\u662F\u7528\u6237\u8BF4\u8FC7\u7684\u539F\u8BDD\u3002
953
+
954
+ \u65E0\u6CD5\u9010\u5B57\u786E\u8BA4\u65F6\uFF0C\u4E0D\u8981\u751F\u6210\u5F15\u53F7\u5185\u5BB9\u3002
955
+
956
+ participants\uFF1A
957
+
958
+ \u586B\u5199\u4E0E\u8BE5\u8BB0\u5FC6\u76F8\u5173\u7684\uFF1A
959
+
960
+ - \u4EBA
961
+ - \u9879\u76EE
962
+ - \u7EC4\u7EC7
963
+ - \u5DE5\u5177
964
+ - \u5730\u70B9
965
+
966
+ tags\uFF1A
967
+
968
+ \u81F3\u5C11\u5305\u542B category\u3002
969
+
970
+ \u53EF\u4EE5\u589E\u52A0\u5C11\u91CF\u771F\u6B63\u6709\u5E2E\u52A9\u7684\u4E3B\u9898\u6807\u7B7E\u3002
971
+
972
+ \u4E0D\u8981\u4E3A\u4E86\u589E\u52A0 tags \u6570\u91CF\u800C\u751F\u6210\u5BBD\u6CDB\u6807\u7B7E\u3002
973
+
974
+ narrative\uFF1A
975
+
976
+ \u53EA\u6709 summary \u65E0\u6CD5\u5B8C\u6574\u8868\u8FBE\u5FC5\u8981\u4E0A\u4E0B\u6587\u65F6\u624D\u586B\u5199\u3002
977
+
978
+ \u672A\u77E5\u5B57\u6BB5\u4E0D\u8981\u8F93\u51FA null\u3002
979
+
980
+ \u76F4\u63A5\u7701\u7565\u3002
981
+
982
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
983
+ \u516B\u3001\u6765\u6E90\u4FE1\u606F
984
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
985
+
986
+ \u8FD9\u662F\u4E00\u6B21\u5916\u90E8 AI \u8BB0\u5FC6\u5BFC\u51FA\u3002
987
+
988
+ \u8BF7\u5728\u9876\u5C42\u8F93\u51FA\u6765\u6E90\u4FE1\u606F\uFF1A
989
+
990
+ sourceSystem\uFF1A
991
+ \u5F53\u524D AI \u7CFB\u7EDF\u540D\u79F0\u3002
992
+
993
+ \u5982\u679C\u65E0\u6CD5\u786E\u5B9A\uFF0C\u586B\u5199 "unknown"\u3002
994
+
995
+ sourceType\uFF1A
996
+
997
+ \u56FA\u5B9A\u4E3A\uFF1A
998
+
999
+ "external_ai_memory_export"
1000
+
1001
+ exportedAt\uFF1A
1002
+
1003
+ \u53EA\u6709\u5F53\u524D\u7CFB\u7EDF\u80FD\u591F\u53EF\u9760\u83B7\u5F97\u5F53\u524D\u65F6\u95F4\u65F6\u624D\u586B\u5199\u3002
1004
+
1005
+ \u5426\u5219\u7701\u7565\u3002
1006
+
1007
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1008
+ \u4E5D\u3001\u8F93\u51FA\u683C\u5F0F
1009
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1010
+
1011
+ \u53EA\u8F93\u51FA\u4E00\u4E2A\u5408\u6CD5 JSON \u5BF9\u8C61\u3002
1012
+
1013
+ \u4E0D\u8981\u8F93\u51FA Markdown \u4EE3\u7801\u5757\u3002
1014
+
1015
+ \u4E0D\u8981\u5728 JSON \u524D\u540E\u6DFB\u52A0\u89E3\u91CA\u3002
1016
+
1017
+ \u4E0D\u8981\u8F93\u51FA\u5206\u6790\u8FC7\u7A0B\u3002
1018
+
1019
+ \u7ED3\u6784\u5982\u4E0B\uFF1A
1020
+
1021
+ {
1022
+ "schemaVersion": "stratagate.external-memory.v2",
1023
+ "sourceType": "external_ai_memory_export",
1024
+ "sourceSystem": "ChatGPT",
1025
+ "exportedAt": "2026-08-26T21:00:00+08:00",
1026
+ "candidates": [
1027
+ {
1028
+ "memoryKind": "event",
1029
+ "category": "project",
1030
+ "title": "\u7B80\u77ED\u3001\u660E\u786E\u3001\u65B9\u4FBF\u68C0\u7D22\u7684\u6807\u9898",
1031
+ "summary": "\u4E00\u6761\u72EC\u7ACB\u3001\u5BA2\u89C2\u3001\u53EF\u4EE5\u957F\u671F\u4FDD\u5B58\u7684\u8BB0\u5FC6",
1032
+ "narrative": "\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587",
1033
+ "tags": [
1034
+ "project",
1035
+ "\u4E3B\u9898\u6807\u7B7E"
1036
+ ],
1037
+ "quotes": [
1038
+ "\u80FD\u591F\u786E\u8BA4\u7684\u7528\u6237\u539F\u8BDD"
1039
+ ],
1040
+ "temporal": {
1041
+ "mentionedAt": "\u53EA\u6709\u660E\u786E\u77E5\u9053\u65F6\u586B\u5199",
1042
+ "happenedStart": "\u53EA\u6709\u53EF\u9760\u786E\u5B9A\u65F6\u586B\u5199",
1043
+ "happenedEnd": "\u53EA\u6709\u53EF\u9760\u786E\u5B9A\u65F6\u586B\u5199",
1044
+ "originalText": "\u539F\u59CB\u65F6\u95F4\u8868\u8FBE",
1045
+ "precision": "day",
1046
+ "basis": "explicit",
1047
+ "status": "occurred",
1048
+ "participants": [
1049
+ "\u76F8\u5173\u4EBA\u7269\u3001\u9879\u76EE\u3001\u7EC4\u7EC7\u3001\u5DE5\u5177\u6216\u5730\u70B9"
1050
+ ],
1051
+ "eventType": "decision"
1052
+ },
1053
+ "scope": "project",
1054
+ "criticality": "routine",
1055
+ "confidence": 0.95
1056
+ }
1057
+ ],
1058
+ "coverage": "full",
1059
+ "coverageNote": "\u5FC5\u8981\u65F6\u7B80\u77ED\u8BF4\u660E\u8986\u76D6\u8303\u56F4",
1060
+ "uncertainItems": [
1061
+ "\u6CA1\u6709\u5BFC\u51FA\u7684\u5185\u5BB9\u4EE5\u53CA\u5177\u4F53\u539F\u56E0"
1062
+ ]
1063
+ }
1064
+
1065
+ coverage \u53EA\u80FD\u662F\uFF1A
1066
+
1067
+ - full
1068
+ - partial
1069
+ - limited
1070
+
1071
+ \u8BF7\u6309\u7167\u4EE5\u4E0B\u987A\u5E8F\u8F93\u51FA candidates\uFF1A
1072
+
1073
+ instruction
1074
+ \u2192 identity
1075
+ \u2192 career
1076
+ \u2192 project
1077
+ \u2192 preference
1078
+
1079
+ \u540C\u4E00 category \u5185\uFF0C\u53EF\u4EE5\u6309\u7167\u65F6\u95F4\u6216\u91CD\u8981\u7A0B\u5EA6\u6392\u5E8F\u3002
1080
+
1081
+ \u5982\u679C\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u957F\u671F\u8BB0\u5FC6\uFF0C\u8BF7\u8F93\u51FA\uFF1A
1082
+
1083
+ {
1084
+ "schemaVersion": "stratagate.external-memory.v2",
1085
+ "sourceType": "external_ai_memory_export",
1086
+ "sourceSystem": "unknown",
1087
+ "candidates": [],
1088
+ "coverage": "limited",
1089
+ "coverageNote": "\u6CA1\u6709\u627E\u5230\u8DB3\u591F\u660E\u786E\u4E14\u9002\u5408\u957F\u671F\u4FDD\u5B58\u7684\u8BB0\u5FC6",
1090
+ "uncertainItems": []
1091
+ }
1092
+ `.trim();
1093
+ function record(value) {
1094
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
1095
+ }
1096
+ function optionalString(value, maxLength = 2e3) {
1097
+ return typeof value === "string" && value.trim() ? value.trim().slice(0, maxLength) : void 0;
1098
+ }
1099
+ function stringArray(value, limit, maxLength = 200) {
1100
+ return Array.isArray(value) ? [...new Set(value.flatMap((item) => optionalString(item, maxLength) ?? []).slice(0, limit))] : [];
1101
+ }
1102
+ function oneOf(value, allowed) {
1103
+ return typeof value === "string" && allowed.includes(value) ? value : void 0;
1104
+ }
1105
+ function parseTemporal(value) {
1106
+ const raw = record(value);
1107
+ if (!raw) return void 0;
1108
+ const temporal = {};
1109
+ for (const key of ["mentionedAt", "happenedStart", "happenedEnd", "originalText"]) {
1110
+ const parsed = optionalString(raw[key], 200);
1111
+ if (parsed) temporal[key] = parsed;
1112
+ }
1113
+ const precision = oneOf(raw.precision, ["instant", "day", "month", "year", "range", "unknown"]);
1114
+ const basis = oneOf(raw.basis, ["explicit", "relative", "inferred", "unknown"]);
1115
+ const status = oneOf(raw.status, ["occurred", "planned", "cancelled", "ongoing", "unknown"]);
1116
+ const eventType = optionalString(raw.eventType, 80);
1117
+ const participants = stringArray(raw.participants, 24);
1118
+ if (precision) temporal.precision = precision;
1119
+ if (basis) temporal.basis = basis;
1120
+ if (status) temporal.status = status;
1121
+ if (eventType) temporal.eventType = eventType;
1122
+ if (participants.length > 0) temporal.participants = participants;
1123
+ if (precision === "unknown" || basis === "unknown") {
1124
+ delete temporal.happenedStart;
1125
+ delete temporal.happenedEnd;
1126
+ }
1127
+ return temporal;
1128
+ }
1129
+ function parseCandidate(value) {
1130
+ const raw = record(value);
1131
+ if (!raw) return null;
1132
+ const title = optionalString(raw.title, 160);
1133
+ const summary = optionalString(raw.summary, 2e3);
1134
+ if (!title || !summary) return null;
1135
+ const category = oneOf(raw.category, ["instruction", "identity", "career", "project", "preference"]);
1136
+ const memoryKind = oneOf(raw.memoryKind, ["instruction", "preference", "fact", "event"]);
1137
+ const tags = stringArray(raw.tags, 12);
1138
+ const candidate = {
1139
+ title,
1140
+ summary,
1141
+ ...memoryKind ? { memoryKind } : {},
1142
+ ...category ? { category } : {},
1143
+ tags: [.../* @__PURE__ */ new Set([...category ? [category] : [], ...tags])].slice(0, 12),
1144
+ quotes: stringArray(raw.quotes, 12, 500)
1145
+ };
1146
+ const narrative = optionalString(raw.narrative, 8e3);
1147
+ const temporal = parseTemporal(raw.temporal);
1148
+ const scope = oneOf(raw.scope, ["user", "project", "session"]);
1149
+ const criticality = oneOf(raw.criticality, ["routine", "preference", "identity", "safety"]);
1150
+ if (narrative) candidate.narrative = narrative;
1151
+ if (temporal) candidate.temporal = temporal;
1152
+ if (scope) candidate.scope = scope;
1153
+ if (criticality) candidate.criticality = criticality;
1154
+ if (typeof raw.confidence === "number" && Number.isFinite(raw.confidence)) {
1155
+ candidate.confidence = Math.max(0, Math.min(1, raw.confidence));
1156
+ }
1157
+ return candidate;
1158
+ }
1159
+ function unwrapJson(text3) {
1160
+ const trimmed = text3.trim();
1161
+ const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/iu);
1162
+ return fenced?.[1]?.trim() ?? trimmed;
1163
+ }
1164
+ function parseExternalMemoryExport(text3) {
1165
+ let parsed;
1166
+ try {
1167
+ parsed = JSON.parse(unwrapJson(text3));
1168
+ } catch (error) {
1169
+ throw new TypeError(`Invalid external memory JSON: ${error instanceof Error ? error.message : String(error)}`);
1170
+ }
1171
+ const root = record(parsed);
1172
+ if (!root) throw new TypeError("Invalid external memory JSON: expected an object");
1173
+ const schemaVersion = optionalString(root.schemaVersion, 80);
1174
+ if (schemaVersion && schemaVersion !== "stratagate.external-memory.v1" && schemaVersion !== EXTERNAL_MEMORY_EXPORT_SCHEMA) {
1175
+ throw new TypeError(`Unsupported external memory schema: ${schemaVersion}`);
1176
+ }
1177
+ const sourceType = optionalString(root.sourceType, 80);
1178
+ if (sourceType && sourceType !== "external_ai_memory_export") {
1179
+ throw new TypeError(`Invalid external memory sourceType: ${sourceType}`);
1180
+ }
1181
+ const rawCandidates = Array.isArray(root.candidates) ? root.candidates : Array.isArray(root.events) ? root.events : [];
1182
+ const candidates = rawCandidates.flatMap((value) => parseCandidate(value) ?? []).slice(0, 200);
1183
+ return { candidates, reason: `Parsed ${candidates.length} candidate events from external memory export.` };
1184
+ }
1185
+ var externalMemoryJsonExtractor = async ({ text: text3 }) => parseExternalMemoryExport(text3);
1186
+
508
1187
  // ../../src/retrieval.ts
509
1188
  var RETRIEVAL_STRATEGIES = [
510
1189
  "answer",
@@ -2185,6 +2864,95 @@ var StrataGate = class _StrataGate {
2185
2864
  return event;
2186
2865
  });
2187
2866
  }
2867
+ /**
2868
+ * Import a memory summary produced by another AI.
2869
+ *
2870
+ * The extractor turns prose into candidate Events. Each candidate is then
2871
+ * matched against the local Event index (bounded by topK) and passed to the
2872
+ * decider. Only ADD/MERGE/SUPERSEDE/CONFLICT decisions write Events; IGNORE
2873
+ * is recorded in the returned audit result. Existing Events are never
2874
+ * overwritten: MERGE and SUPERSEDE create a new canonical Event that points
2875
+ * back to the older Events.
2876
+ */
2877
+ async importExternalMemory(options) {
2878
+ const text3 = options.text.trim();
2879
+ if (!text3) throw new TypeError("External memory text must not be empty");
2880
+ if (typeof options.decider !== "function") {
2881
+ throw new TypeError("External memory decider is required");
2882
+ }
2883
+ const importedAt = toUtc8Iso(options.importedAt ?? this.now());
2884
+ const extractor = options.extractor ?? externalMemoryJsonExtractor;
2885
+ const extracted = await extractor({ text: text3, importedAt });
2886
+ const candidates = Array.isArray(extracted?.candidates) ? extracted.candidates.slice(0, 200) : [];
2887
+ const topK = Math.max(1, Math.min(20, Math.floor(options.topK ?? 5)));
2888
+ const source = await this.commitMutation(() => this.createExternalSourceBlock(text3, importedAt));
2889
+ const prepared = [];
2890
+ for (const candidate of candidates) {
2891
+ if (!candidate || typeof candidate.title !== "string" || typeof candidate.summary !== "string") continue;
2892
+ const query = `${candidate.title} ${candidate.summary} ${(candidate.tags ?? []).join(" ")}`.trim();
2893
+ const matches = await this.searchEvents(query, { limit: topK });
2894
+ const decision = await options.decider({ candidate, matches });
2895
+ const allowed = new Set(matches.map(({ event }) => event.id));
2896
+ const existingEventIds = [...new Set((decision.existingEventIds ?? []).filter((id) => allowed.has(id)))];
2897
+ prepared.push({ candidate, decision, existingEventIds });
2898
+ }
2899
+ return this.commitMutation(() => {
2900
+ const addedEvents = [];
2901
+ const changedEventIds = /* @__PURE__ */ new Set();
2902
+ const decisions = [];
2903
+ for (const item of prepared) {
2904
+ const action = this.normalizeExternalAction(item.decision.action);
2905
+ const targets = item.existingEventIds;
2906
+ const reason = typeof item.decision.reason === "string" ? item.decision.reason.trim().slice(0, 500) : void 0;
2907
+ let createdEvent;
2908
+ const proposed = item.decision.mergedCandidate;
2909
+ const candidate = proposed && typeof proposed.title === "string" && typeof proposed.summary === "string" ? proposed : item.candidate;
2910
+ if ((action === "ADD" || action === "MERGE" || action === "SUPERSEDE" || action === "CONFLICT") && (action === "ADD" || targets.length > 0)) {
2911
+ const temporal = {
2912
+ ...candidate.temporal ?? {},
2913
+ ...action === "MERGE" || action === "SUPERSEDE" ? { supersedesEventIds: targets } : {},
2914
+ ...action === "CONFLICT" ? { conflictsWithEventIds: targets } : {}
2915
+ };
2916
+ createdEvent = this.addEventInMemory({
2917
+ ...candidate,
2918
+ sourceBlockId: source.id,
2919
+ sourceMessageIds: [source.l5Raw[0].id],
2920
+ temporal
2921
+ });
2922
+ addedEvents.push(createdEvent);
2923
+ changedEventIds.add(createdEvent.id);
2924
+ if (action === "CONFLICT") {
2925
+ for (const id of targets) {
2926
+ const existing = this.events.find((event) => event.id === id);
2927
+ if (!existing) continue;
2928
+ existing.temporal.conflictsWithEventIds = [.../* @__PURE__ */ new Set([...existing.temporal.conflictsWithEventIds ?? [], createdEvent.id])];
2929
+ existing.updatedAt = importedAt;
2930
+ changedEventIds.add(existing.id);
2931
+ }
2932
+ }
2933
+ }
2934
+ const audit2 = {
2935
+ candidate: structuredClone(item.candidate),
2936
+ action,
2937
+ existingEventIds: targets,
2938
+ ...createdEvent ? { createdEventId: createdEvent.id } : {},
2939
+ ...reason ? { reason } : {}
2940
+ };
2941
+ decisions.push(audit2);
2942
+ }
2943
+ if (addedEvents.length > 0) {
2944
+ const ids = addedEvents.map(({ id }) => id);
2945
+ this.queueElementProjection(ids);
2946
+ this.queueGraphProjection(ids, 2e3);
2947
+ }
2948
+ return {
2949
+ sourceBlockId: source.id,
2950
+ decisions,
2951
+ addedEvents,
2952
+ changedEventIds: [...changedEventIds]
2953
+ };
2954
+ });
2955
+ }
2188
2956
  async searchEvents(query, options = {}) {
2189
2957
  const limit = Math.max(1, Math.min(20, options.limit ?? 6));
2190
2958
  const participants = (options.participants ?? []).map(normalizeSearchText).filter(Boolean);
@@ -2564,6 +3332,43 @@ var StrataGate = class _StrataGate {
2564
3332
  async close() {
2565
3333
  await this.storage?.close?.();
2566
3334
  }
3335
+ normalizeExternalAction(value) {
3336
+ const action = typeof value === "string" ? value.trim().toUpperCase() : "";
3337
+ return action === "ADD" || action === "MERGE" || action === "SUPERSEDE" || action === "CONFLICT" || action === "IGNORE" ? action : "IGNORE";
3338
+ }
3339
+ createExternalSourceBlock(text3, importedAt) {
3340
+ const blockId = this.idFactory("blk");
3341
+ const threadId = `external-import:${blockId}`;
3342
+ const message = {
3343
+ id: this.idFactory("msg"),
3344
+ role: "user",
3345
+ content: text3,
3346
+ createdAt: importedAt,
3347
+ threadId
3348
+ };
3349
+ const firstLine = text3.split(/\r?\n/u).map((line) => line.trim()).find(Boolean) ?? "External AI memory import";
3350
+ const block = {
3351
+ id: blockId,
3352
+ threadId,
3353
+ sequence: this.blocks.length + 1,
3354
+ startTurn: 1,
3355
+ endTurn: 1,
3356
+ createdAt: importedAt,
3357
+ l0Title: firstLine.slice(0, 80),
3358
+ l0Tags: ["external-memory-import"],
3359
+ l1Summary: text3.replace(/\s+/gu, " ").trim().slice(0, 500),
3360
+ l2Keypoints: text3.split(/\r?\n/u).map((line) => line.trim()).filter(Boolean).slice(0, 8),
3361
+ shouldExtract: false,
3362
+ ...deterministicBlockLayers([message]),
3363
+ pointerCurrentLevel: 5,
3364
+ pointerAnchorLevel: 5,
3365
+ pointerAnchorBlockPosition: 1,
3366
+ lastLiftedAt: null,
3367
+ lastLiftedBy: null
3368
+ };
3369
+ this.blocks.push(block);
3370
+ return block;
3371
+ }
2567
3372
  addEventInMemory(input) {
2568
3373
  const sourceBlock = this.blocks.find((block) => block.id === input.sourceBlockId);
2569
3374
  if (!sourceBlock) throw new Error(`Unknown source block: ${input.sourceBlockId}`);
@@ -4152,6 +4957,45 @@ var StrataGateRuntime = class {
4152
4957
  await storage.close();
4153
4958
  }
4154
4959
  }
4960
+ /** Import a v2 external-AI export from the admin UI. */
4961
+ async adminImportExternalMemory(namespace, text3) {
4962
+ const key = namespace.trim();
4963
+ if (!key) throw new TypeError("StrataGate admin namespace must not be empty");
4964
+ await this.flush();
4965
+ const active = this.spaces.get(key);
4966
+ let memory;
4967
+ let owned = false;
4968
+ if (active) {
4969
+ memory = await active;
4970
+ } else {
4971
+ if (this.config.database === ":memory:" || !existsSync(this.config.database)) {
4972
+ throw new Error(`Unknown StrataGate namespace: ${key}`);
4973
+ }
4974
+ memory = await StrataGate.open({
4975
+ database: this.config.database,
4976
+ namespace: key,
4977
+ blockTurnSize: this.config.blockTurnSize,
4978
+ blockDecayLambda: this.blockDecayLambda,
4979
+ graphProjector: this.models.graphProjector,
4980
+ disableElementProjection: true
4981
+ });
4982
+ owned = true;
4983
+ }
4984
+ try {
4985
+ const result = await memory.importExternalMemory({
4986
+ text: text3,
4987
+ decider: async () => ({ action: "ADD" })
4988
+ });
4989
+ return {
4990
+ sourceBlockId: result.sourceBlockId,
4991
+ decisions: result.decisions,
4992
+ importedCount: result.addedEvents.length,
4993
+ changedEventIds: result.changedEventIds
4994
+ };
4995
+ } finally {
4996
+ if (owned) await memory.close();
4997
+ }
4998
+ }
4155
4999
  adminWorkspaceName(namespace) {
4156
5000
  const remembered = this.workspaceNames.get(namespace);
4157
5001
  if (remembered) return remembered;
@@ -4837,7 +5681,7 @@ function clusterKnowledgeGraph(rawNodes, rawEdges) {
4837
5681
  }
4838
5682
 
4839
5683
  // src/web.ts
4840
- var STRATAGATE_DSH_VERSION = "0.2.30";
5684
+ var STRATAGATE_DSH_VERSION = "0.2.32";
4841
5685
  var LEGACY_THREAD_ID = "__legacy__";
4842
5686
  var nodeRequire = createRequire(import.meta.url);
4843
5687
  function installedPackageVersion(names) {
@@ -5033,6 +5877,40 @@ async function updateSettings(runtime, url) {
5033
5877
  }
5034
5878
  return { blockDecayLambda: await runtime.adminSetBlockDecayLambda(value) };
5035
5879
  }
5880
+ async function importExternalMemory(runtime, req) {
5881
+ let suppliedBody = req.body;
5882
+ if (suppliedBody === void 0 && typeof req[Symbol.asyncIterator] === "function") {
5883
+ const chunks = [];
5884
+ let size = 0;
5885
+ for await (const chunk of req) {
5886
+ const value = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
5887
+ size += value.length;
5888
+ if (size > 4 * 1024 * 1024) throw new AdminHttpError(413, "\u5BFC\u5165\u6570\u636E\u4E0D\u80FD\u8D85\u8FC7 4 MB");
5889
+ chunks.push(value);
5890
+ }
5891
+ suppliedBody = Buffer.concat(chunks).toString("utf8");
5892
+ }
5893
+ let body;
5894
+ if (typeof suppliedBody === "string") {
5895
+ try {
5896
+ body = JSON.parse(suppliedBody);
5897
+ } catch {
5898
+ throw new AdminHttpError(400, "\u5BFC\u5165\u6570\u636E\u5FC5\u987B\u662F\u5408\u6CD5 JSON");
5899
+ }
5900
+ } else if (suppliedBody && typeof suppliedBody === "object" && !Array.isArray(suppliedBody)) {
5901
+ body = suppliedBody;
5902
+ } else {
5903
+ throw new AdminHttpError(400, "\u5BFC\u5165\u8BF7\u6C42\u7F3A\u5C11 JSON body");
5904
+ }
5905
+ const namespace = typeof body.namespace === "string" ? body.namespace.trim() : "";
5906
+ const text3 = typeof body.text === "string" ? body.text.trim() : "";
5907
+ if (!namespace) throw new AdminHttpError(400, "namespace is required");
5908
+ if (!text3) throw new AdminHttpError(400, "text is required");
5909
+ return runtime.adminImportExternalMemory(namespace, text3);
5910
+ }
5911
+ function externalMemoryPrompt() {
5912
+ return { prompt: EXTERNAL_MEMORY_EXPORT_PROMPT_ZH_CN, schemaVersion: "stratagate.external-memory.v2" };
5913
+ }
5036
5914
  function receiptThreadId(id) {
5037
5915
  const match = /^dsh:(.+):turn:\d+$/.exec(id);
5038
5916
  return match?.[1]?.trim() || null;
@@ -5387,6 +6265,10 @@ async function handleAdminRequest(runtime, req, res) {
5387
6265
  } else if (path === "/api/stratagate/blocks/expand") {
5388
6266
  if (req.method !== "PATCH") throw new AdminHttpError(405, "StrataGate Block expansion requires PATCH");
5389
6267
  sendJson(res, 200, await expandBlock(runtime, url));
6268
+ } else if (path === "/api/stratagate/import") {
6269
+ if (req.method === "GET") sendJson(res, 200, externalMemoryPrompt());
6270
+ else if (req.method === "POST") sendJson(res, 200, await importExternalMemory(runtime, req));
6271
+ else throw new AdminHttpError(405, "External memory import requires GET or POST");
5390
6272
  } else if (req.method !== "GET") throw new AdminHttpError(405, "StrataGate memory data is read-only");
5391
6273
  else if (path === "/api/stratagate/overview") sendJson(res, 200, await overview(runtime));
5392
6274
  else if (path === "/api/stratagate/memories") sendJson(res, 200, await memories(runtime, url));