memo-grafter 0.1.1 → 0.2.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 (130) hide show
  1. package/.env.example +1 -0
  2. package/README.md +187 -95
  3. package/USER_GUIDE.md +226 -9
  4. package/dist/MemoGrafter.d.ts +1 -1
  5. package/dist/MemoGrafter.d.ts.map +1 -1
  6. package/dist/MemoGrafter.js +16 -5
  7. package/dist/MemoGrafter.js.map +1 -1
  8. package/dist/MemoGrafterAgent.d.ts +7 -1
  9. package/dist/MemoGrafterAgent.d.ts.map +1 -1
  10. package/dist/MemoGrafterAgent.js +45 -8
  11. package/dist/MemoGrafterAgent.js.map +1 -1
  12. package/dist/adapters/AnthropicAdapter.d.ts.map +1 -1
  13. package/dist/adapters/AnthropicAdapter.js +8 -2
  14. package/dist/adapters/AnthropicAdapter.js.map +1 -1
  15. package/dist/adapters/GeminiAdapter.d.ts +15 -0
  16. package/dist/adapters/GeminiAdapter.d.ts.map +1 -0
  17. package/dist/adapters/GeminiAdapter.js +48 -0
  18. package/dist/adapters/GeminiAdapter.js.map +1 -0
  19. package/dist/fleet/FleetStore.d.ts +1 -1
  20. package/dist/fleet/FleetStore.d.ts.map +1 -1
  21. package/dist/index.d.ts +4 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/pipeline/GrafterPipeline.d.ts +1 -2
  26. package/dist/pipeline/GrafterPipeline.d.ts.map +1 -1
  27. package/dist/pipeline/GrafterPipeline.js +3 -5
  28. package/dist/pipeline/GrafterPipeline.js.map +1 -1
  29. package/dist/pipeline/IngestPipeline.d.ts +7 -3
  30. package/dist/pipeline/IngestPipeline.d.ts.map +1 -1
  31. package/dist/pipeline/IngestPipeline.js +31 -5
  32. package/dist/pipeline/IngestPipeline.js.map +1 -1
  33. package/dist/pipeline/RetrieverPipeline.d.ts +11 -0
  34. package/dist/pipeline/RetrieverPipeline.d.ts.map +1 -0
  35. package/dist/pipeline/RetrieverPipeline.js +73 -0
  36. package/dist/pipeline/RetrieverPipeline.js.map +1 -0
  37. package/dist/pipeline/SegmentProcessor.d.ts +3 -2
  38. package/dist/pipeline/SegmentProcessor.d.ts.map +1 -1
  39. package/dist/pipeline/SegmentProcessor.js +50 -18
  40. package/dist/pipeline/SegmentProcessor.js.map +1 -1
  41. package/dist/pipeline/TopicDriftDetector.d.ts +21 -3
  42. package/dist/pipeline/TopicDriftDetector.d.ts.map +1 -1
  43. package/dist/pipeline/TopicDriftDetector.js +143 -17
  44. package/dist/pipeline/TopicDriftDetector.js.map +1 -1
  45. package/dist/prompts/factRetrievalPrompt.d.ts +4 -0
  46. package/dist/prompts/factRetrievalPrompt.d.ts.map +1 -0
  47. package/dist/prompts/factRetrievalPrompt.js +25 -0
  48. package/dist/prompts/factRetrievalPrompt.js.map +1 -0
  49. package/dist/prompts/historyCompressionPrompt.d.ts +3 -0
  50. package/dist/prompts/historyCompressionPrompt.d.ts.map +1 -0
  51. package/dist/prompts/historyCompressionPrompt.js +4 -0
  52. package/dist/prompts/historyCompressionPrompt.js.map +1 -0
  53. package/dist/prompts/intentShiftPrompt.d.ts +3 -0
  54. package/dist/prompts/intentShiftPrompt.d.ts.map +1 -0
  55. package/dist/prompts/intentShiftPrompt.js +11 -0
  56. package/dist/prompts/intentShiftPrompt.js.map +1 -0
  57. package/dist/prompts/segmentExtractionPrompt.d.ts.map +1 -1
  58. package/dist/prompts/segmentExtractionPrompt.js +68 -12
  59. package/dist/prompts/segmentExtractionPrompt.js.map +1 -1
  60. package/dist/store/GraphStore.d.ts +16 -19
  61. package/dist/store/GraphStore.d.ts.map +1 -1
  62. package/dist/store/GraphStore.js +1 -576
  63. package/dist/store/GraphStore.js.map +1 -1
  64. package/dist/store/index.d.ts +3 -0
  65. package/dist/store/index.d.ts.map +1 -0
  66. package/dist/store/index.js +2 -0
  67. package/dist/store/index.js.map +1 -0
  68. package/dist/store/postgres-pgvector/GraphStore.d.ts +75 -0
  69. package/dist/store/postgres-pgvector/GraphStore.d.ts.map +1 -0
  70. package/dist/store/postgres-pgvector/GraphStore.js +782 -0
  71. package/dist/store/postgres-pgvector/GraphStore.js.map +1 -0
  72. package/dist/types.d.ts +69 -1
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/utils/drift/driftMarkers.d.ts +4 -0
  75. package/dist/utils/drift/driftMarkers.d.ts.map +1 -0
  76. package/dist/utils/drift/driftMarkers.js +31 -0
  77. package/dist/utils/drift/driftMarkers.js.map +1 -0
  78. package/dist/utils/drift/driftScore.d.ts +3 -0
  79. package/dist/utils/drift/driftScore.d.ts.map +1 -0
  80. package/dist/utils/drift/driftScore.js +11 -0
  81. package/dist/utils/drift/driftScore.js.map +1 -0
  82. package/dist/utils/drift/driftThreshold.d.ts +7 -0
  83. package/dist/utils/drift/driftThreshold.d.ts.map +1 -0
  84. package/dist/utils/drift/driftThreshold.js +21 -0
  85. package/dist/utils/drift/driftThreshold.js.map +1 -0
  86. package/dist/utils/drift/reentryMatch.d.ts +3 -0
  87. package/dist/utils/drift/reentryMatch.d.ts.map +1 -0
  88. package/dist/utils/drift/reentryMatch.js +10 -0
  89. package/dist/utils/drift/reentryMatch.js.map +1 -0
  90. package/dist/utils/extraction/segmentExtraction.d.ts +5 -0
  91. package/dist/utils/extraction/segmentExtraction.d.ts.map +1 -0
  92. package/dist/utils/extraction/segmentExtraction.js +82 -0
  93. package/dist/utils/extraction/segmentExtraction.js.map +1 -0
  94. package/dist/utils/reentry/reentryCues.d.ts +3 -0
  95. package/dist/utils/reentry/reentryCues.d.ts.map +1 -0
  96. package/dist/utils/reentry/reentryCues.js +14 -0
  97. package/dist/utils/reentry/reentryCues.js.map +1 -0
  98. package/dist/utils/reentry/reentryEdges.d.ts +16 -0
  99. package/dist/utils/reentry/reentryEdges.d.ts.map +1 -0
  100. package/dist/utils/reentry/reentryEdges.js +80 -0
  101. package/dist/utils/reentry/reentryEdges.js.map +1 -0
  102. package/dist/utils/reentry/reentrySimilarity.d.ts +5 -0
  103. package/dist/utils/reentry/reentrySimilarity.d.ts.map +1 -0
  104. package/dist/utils/reentry/reentrySimilarity.js +26 -0
  105. package/dist/utils/reentry/reentrySimilarity.js.map +1 -0
  106. package/dist/utils/reentry/reentryText.d.ts +6 -0
  107. package/dist/utils/reentry/reentryText.d.ts.map +1 -0
  108. package/dist/utils/reentry/reentryText.js +29 -0
  109. package/dist/utils/reentry/reentryText.js.map +1 -0
  110. package/dist/utils/reentry/types.d.ts +6 -0
  111. package/dist/utils/reentry/types.d.ts.map +1 -0
  112. package/dist/utils/reentry/types.js +2 -0
  113. package/dist/utils/reentry/types.js.map +1 -0
  114. package/dist/utils/text/normalizeText.d.ts +2 -0
  115. package/dist/utils/text/normalizeText.d.ts.map +1 -0
  116. package/dist/utils/text/normalizeText.js +5 -0
  117. package/dist/utils/text/normalizeText.js.map +1 -0
  118. package/dist/utils/text/terms.d.ts +3 -0
  119. package/dist/utils/text/terms.d.ts.map +1 -0
  120. package/dist/utils/text/terms.js +51 -0
  121. package/dist/utils/text/terms.js.map +1 -0
  122. package/dist/utils/text/tokenCount.d.ts +2 -0
  123. package/dist/utils/text/tokenCount.d.ts.map +1 -0
  124. package/dist/utils/text/tokenCount.js +4 -0
  125. package/dist/utils/text/tokenCount.js.map +1 -0
  126. package/dist/utils/vector/vectorLiteral.d.ts +3 -0
  127. package/dist/utils/vector/vectorLiteral.d.ts.map +1 -0
  128. package/dist/utils/vector/vectorLiteral.js +19 -0
  129. package/dist/utils/vector/vectorLiteral.js.map +1 -0
  130. package/package.json +11 -3
@@ -0,0 +1,73 @@
1
+ import { buildFactRetrievalPrompt, formatFactBlock, } from "../prompts/factRetrievalPrompt.js";
2
+ import { countApproxTokens } from "../utils/text/tokenCount.js";
3
+ export class RetrieverPipeline {
4
+ store;
5
+ embedder;
6
+ config;
7
+ constructor(store, embedder, config) {
8
+ this.store = store;
9
+ this.embedder = embedder;
10
+ this.config = config;
11
+ }
12
+ async run(query, sessionId) {
13
+ const limit = this.config.limit ?? 10;
14
+ const minSimilarity = this.config.minSimilarity ?? 0.6;
15
+ const tokenBudget = this.config.tokenBudget ?? 1200;
16
+ const embedding = await this.embedder.embed(query);
17
+ const searchedFacts = await this.store.searchMemories(embedding, sessionId, limit, minSimilarity);
18
+ const activeFacts = searchedFacts.filter((fact) => fact.decayed === false && fact.supersededBy == null);
19
+ if (activeFacts.length === 0) {
20
+ return {
21
+ facts: [],
22
+ nodes: [],
23
+ systemPrompt: buildFactRetrievalPrompt([]),
24
+ tokenCount: 0,
25
+ };
26
+ }
27
+ const rankedBlocks = (await this.buildBlocks(activeFacts, sessionId))
28
+ .sort((a, b) => b.score - a.score);
29
+ const includedBlocks = [];
30
+ const facts = [];
31
+ const nodes = [];
32
+ let tokenCount = 0;
33
+ for (const block of rankedBlocks) {
34
+ const formattedBlock = formatFactBlock(block.facts, block.parentNode);
35
+ const blockTokenCount = countApproxTokens(formattedBlock);
36
+ if (tokenCount + blockTokenCount > tokenBudget) {
37
+ break;
38
+ }
39
+ includedBlocks.push(formattedBlock);
40
+ facts.push(...block.facts);
41
+ nodes.push(block.parentNode);
42
+ tokenCount += blockTokenCount;
43
+ }
44
+ return {
45
+ facts,
46
+ nodes,
47
+ systemPrompt: buildFactRetrievalPrompt(includedBlocks),
48
+ tokenCount,
49
+ };
50
+ }
51
+ async buildBlocks(facts, sessionId) {
52
+ const factsByTopic = new Map();
53
+ for (const fact of facts) {
54
+ const topicFacts = factsByTopic.get(fact.topicNodeId) ?? [];
55
+ topicFacts.push(fact);
56
+ factsByTopic.set(fact.topicNodeId, topicFacts);
57
+ }
58
+ const blocks = [];
59
+ for (const [topicNodeId, topicFacts] of factsByTopic) {
60
+ const parentNode = await this.store.getTopicNode(topicNodeId, sessionId);
61
+ if (!parentNode) {
62
+ continue;
63
+ }
64
+ blocks.push({
65
+ facts: topicFacts,
66
+ parentNode,
67
+ score: Math.max(...topicFacts.map((fact) => fact.similarity)),
68
+ });
69
+ }
70
+ return blocks;
71
+ }
72
+ }
73
+ //# sourceMappingURL=RetrieverPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetrieverPipeline.js","sourceRoot":"","sources":["../../src/pipeline/RetrieverPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAS3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAUhE,MAAM,OAAO,iBAAiB;IAElB;IACA;IACA;IAHV,YACU,KAAiB,EACjB,QAAsB,EACtB,MAAuB;QAFvB,UAAK,GAAL,KAAK,CAAY;QACjB,aAAQ,GAAR,QAAQ,CAAc;QACtB,WAAM,GAAN,MAAM,CAAiB;IAC9B,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,SAAiB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC;QAEpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CACnD,SAAS,EACT,SAAS,EACT,KAAK,EACL,aAAa,CACd,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CACpD,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,wBAAwB,CAAC,EAAE,CAAC;gBAC1C,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;aAClE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,eAAe,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAE1D,IAAI,UAAU,GAAG,eAAe,GAAG,WAAW,EAAE,CAAC;gBAC/C,MAAM;YACR,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,UAAU,IAAI,eAAe,CAAC;QAChC,CAAC;QAED,OAAO;YACL,KAAK;YACL,KAAK;YACL,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC;YACtD,UAAU;SACX,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,KAAyB,EACzB,SAAiB;QAEjB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;QAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,YAAY,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAEzE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,UAAU;gBACV,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import type { GraphStore } from "../store/GraphStore.js";
1
+ import type { GraphStore } from "../store/index.js";
2
2
  import type { EmbedAdapter, LLMAdapter, Message, TopicNode } from "../types.js";
3
3
  import type { DriftSegment } from "./TopicDriftDetector.js";
4
4
  export declare class SegmentProcessor {
@@ -6,6 +6,7 @@ export declare class SegmentProcessor {
6
6
  private readonly llm;
7
7
  private readonly embedder;
8
8
  private readonly config;
9
+ private lastExtraction;
9
10
  constructor(store: GraphStore, llm: LLMAdapter, embedder: EmbedAdapter, config: {
10
11
  topK: number;
11
12
  semanticThreshold: number;
@@ -14,6 +15,6 @@ export declare class SegmentProcessor {
14
15
  private createSegment;
15
16
  private nodeRunner;
16
17
  private nodeProcessor;
17
- private parseExtraction;
18
+ private processMemories;
18
19
  }
19
20
  //# sourceMappingURL=SegmentProcessor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentProcessor.d.ts","sourceRoot":"","sources":["../../src/pipeline/SegmentProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHN,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAGG,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAKlF,aAAa;YAYb,UAAU;YAMV,aAAa;IAwB3B,OAAO,CAAC,eAAe;CAiBxB"}
1
+ {"version":3,"file":"SegmentProcessor.d.ts","sourceRoot":"","sources":["../../src/pipeline/SegmentProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EAEZ,UAAU,EAEV,OAAO,EAEP,SAAS,EAEV,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,qBAAa,gBAAgB;IAUzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,OAAO,CAAC,cAAc,CAMpB;gBAGiB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAGG,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAOlF,aAAa;YAYb,UAAU;YAMV,aAAa;YA0Bb,eAAe;CAwC9B"}
@@ -1,10 +1,18 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { buildSegmentExtractionPrompt } from "../prompts/segmentExtractionPrompt.js";
3
+ import { buildSegmentSummary, formatMemoryEmbeddingText, parseSegmentExtraction, } from "../utils/extraction/segmentExtraction.js";
3
4
  export class SegmentProcessor {
4
5
  store;
5
6
  llm;
6
7
  embedder;
7
8
  config;
9
+ lastExtraction = {
10
+ label: "Unknown",
11
+ userIntent: "",
12
+ outcome: "",
13
+ open: null,
14
+ memories: [],
15
+ };
8
16
  constructor(store, llm, embedder, config) {
9
17
  this.store = store;
10
18
  this.llm = llm;
@@ -13,7 +21,9 @@ export class SegmentProcessor {
13
21
  }
14
22
  async process(segment, messages, sessionId) {
15
23
  const savedSegment = await this.createSegment(segment, sessionId);
16
- return this.nodeRunner(savedSegment, messages);
24
+ const topicNode = await this.nodeRunner(savedSegment, messages);
25
+ await this.processMemories(this.lastExtraction.memories, savedSegment, topicNode);
26
+ return topicNode;
17
27
  }
18
28
  async createSegment(segment, sessionId) {
19
29
  return this.store.saveSegment({
@@ -35,14 +45,16 @@ export class SegmentProcessor {
35
45
  const segmentMessages = messages.slice(segment.startIndex, segment.endIndex + 1);
36
46
  const extractionPrompt = buildSegmentExtractionPrompt(segmentMessages);
37
47
  const raw = await this.llm.complete([{ role: "user", content: extractionPrompt }]);
38
- const extracted = this.parseExtraction(raw);
39
- const embedding = await this.embedder.embed(extracted.summary);
48
+ const extracted = parseSegmentExtraction(raw);
49
+ this.lastExtraction = extracted;
50
+ const summary = buildSegmentSummary(extracted);
51
+ const embedding = await this.embedder.embed(summary);
40
52
  return {
41
53
  id: randomUUID(),
42
54
  sessionId: segment.sessionId,
43
55
  segmentId: segment.id,
44
56
  label: extracted.label,
45
- summary: extracted.summary,
57
+ summary,
46
58
  embedding,
47
59
  messageRange: [segment.startIndex, segment.endIndex],
48
60
  topicOrder: segment.topicOrder,
@@ -53,20 +65,40 @@ export class SegmentProcessor {
53
65
  createdAt: new Date(),
54
66
  };
55
67
  }
56
- parseExtraction(raw) {
57
- const label = raw.match(/^LABEL:\s*(.+)$/im)?.[1]?.trim() ?? "Unknown";
58
- const userIntent = raw.match(/^USER_INTENT:\s*(.+)$/im)?.[1]?.trim() ?? "";
59
- const outcome = raw.match(/^OUTCOME:\s*(.+)$/im)?.[1]?.trim() ?? "";
60
- const open = raw.match(/^OPEN:\s*(.+)$/im)?.[1]?.trim() ?? "";
61
- const parts = [
62
- userIntent && `User wanted: ${userIntent}`,
63
- outcome && `Outcome: ${outcome}`,
64
- open && open.toLowerCase() !== "none" && `Still open: ${open}`,
65
- ].filter(Boolean);
66
- return {
67
- label,
68
- summary: parts.join(" "),
69
- };
68
+ async processMemories(memories, segment, topicNode) {
69
+ if (memories.length === 0)
70
+ return;
71
+ try {
72
+ const nodes = [];
73
+ for (const memory of memories) {
74
+ const embedding = await this.embedder.embed(formatMemoryEmbeddingText(memory));
75
+ nodes.push({
76
+ id: randomUUID(),
77
+ segmentId: segment.id,
78
+ topicNodeId: topicNode.id,
79
+ sessionId: segment.sessionId,
80
+ agentId: topicNode.agentId,
81
+ agentColor: topicNode.agentColor,
82
+ fleetId: topicNode.fleetId,
83
+ memoryType: memory.memoryType,
84
+ sourceType: "conversation",
85
+ subject: memory.subject,
86
+ predicate: memory.predicate,
87
+ value: memory.value,
88
+ confidence: memory.confidence,
89
+ embedding,
90
+ sourceUrl: null,
91
+ sourceTitle: null,
92
+ supersededBy: null,
93
+ decayed: false,
94
+ });
95
+ }
96
+ await this.store.insertMemories(nodes);
97
+ await this.store.buildMemoryEdges(topicNode.id, segment.sessionId, this.config.semanticThreshold);
98
+ }
99
+ catch (error) {
100
+ console.warn("SegmentProcessor memory processing warning:", error);
101
+ }
70
102
  }
71
103
  }
72
104
  //# sourceMappingURL=SegmentProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentProcessor.js","sourceRoot":"","sources":["../../src/pipeline/SegmentProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SegmentProcessor.js","sourceRoot":"","sources":["../../src/pipeline/SegmentProcessor.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,40 @@
1
- import type { DriftMode, Message } from "../types.js";
1
+ import type { DriftMode, LLMAdapter, Message, TopicNode } from "../types.js";
2
2
  export interface DriftSegment {
3
3
  start: number;
4
4
  end: number;
5
5
  topicOrder: number;
6
6
  driftScore: number;
7
7
  }
8
+ export interface DriftDetectionResult {
9
+ segments: DriftSegment[];
10
+ reentryMap: Map<number, string>;
11
+ }
8
12
  export declare class TopicDriftDetector {
9
13
  private readonly config;
14
+ private readonly llm?;
10
15
  constructor(config: {
11
16
  windowSize: number;
12
17
  threshold: number;
13
18
  mode: DriftMode;
14
19
  minSegmentMessages: number;
15
- });
20
+ llmAmbiguityDetection: boolean;
21
+ reentryDetection: boolean;
22
+ reentryThreshold: number;
23
+ }, llm?: LLMAdapter | undefined);
24
+ /**
25
+ * @deprecated Use detectSegments() instead. This sync wrapper does not run LLM
26
+ * ambiguity detection or reentry detection.
27
+ */
16
28
  detect(messages: Message[], embeddings: number[][]): number[];
17
- detectSegments(messages: Message[], embeddings: number[][]): DriftSegment[];
29
+ detectSegments(messages: Message[], embeddings: number[][], existingNodes?: TopicNode[]): Promise<DriftDetectionResult>;
18
30
  private detectBoundaries;
31
+ private detectBoundariesSync;
19
32
  private detectIntentBoundaries;
20
33
  private detectWindowBoundaries;
34
+ private detectIntentBoundariesSync;
35
+ private detectWindowBoundariesSync;
36
+ private resolveAmbiguousScore;
37
+ private classifyIntentShift;
38
+ private maybeCheckReentry;
21
39
  }
22
40
  //# sourceMappingURL=TopicDriftDetector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopicDriftDetector.d.ts","sourceRoot":"","sources":["../../src/pipeline/TopicDriftDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,SAAS,CAAC;QAChB,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAGH,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;IAI7D,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,YAAY,EAAE;IA8B3E,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,sBAAsB;CA8B/B"}
1
+ {"version":3,"file":"TopicDriftDetector.d.ts","sourceRoot":"","sources":["../../src/pipeline/TopicDriftDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAQD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IASvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBATJ,MAAM,EAAE;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,SAAS,CAAC;QAChB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,EACgB,GAAG,CAAC,EAAE,UAAU,YAAA;IAGnC;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;IAIvD,cAAc,CAClB,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EAAE,EACtB,aAAa,GAAE,SAAS,EAAO,GAC9B,OAAO,CAAC,oBAAoB,CAAC;YAuClB,gBAAgB;IAY9B,OAAO,CAAC,oBAAoB;YAQd,sBAAsB;YAmDtB,sBAAsB;IAyDpC,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,0BAA0B;YA2CpB,qBAAqB;YAerB,mBAAmB;IAWjC,OAAO,CAAC,iBAAiB;CAI1B"}
@@ -1,18 +1,28 @@
1
- import { cosineSimilarity } from "../utils/drift/cosineSimilarity.js";
1
+ import { buildIntentShiftPrompt } from "../prompts/intentShiftPrompt.js";
2
+ import { computeDriftScore } from "../utils/drift/driftScore.js";
3
+ import { findReentryNodeId } from "../utils/drift/reentryMatch.js";
2
4
  import { avg } from "../utils/drift/vectorAvg.js";
3
5
  export class TopicDriftDetector {
4
6
  config;
5
- constructor(config) {
7
+ llm;
8
+ constructor(config, llm) {
6
9
  this.config = config;
10
+ this.llm = llm;
7
11
  }
12
+ /**
13
+ * @deprecated Use detectSegments() instead. This sync wrapper does not run LLM
14
+ * ambiguity detection or reentry detection.
15
+ */
8
16
  detect(messages, embeddings) {
9
- return this.detectBoundaries(messages, embeddings).map((boundary) => boundary.index);
17
+ return this.detectBoundariesSync(messages, embeddings).map((boundary) => boundary.index);
10
18
  }
11
- detectSegments(messages, embeddings) {
12
- if (messages.length === 0)
13
- return [];
14
- const boundaries = this.detectBoundaries(messages, embeddings);
19
+ async detectSegments(messages, embeddings, existingNodes = []) {
20
+ if (messages.length === 0) {
21
+ return { segments: [], reentryMap: new Map() };
22
+ }
23
+ const boundaries = await this.detectBoundaries(messages, embeddings, existingNodes);
15
24
  const segments = [];
25
+ const reentryMap = new Map();
16
26
  let start = 0;
17
27
  for (const [index, boundary] of boundaries.entries()) {
18
28
  const end = boundary.index - 1;
@@ -24,6 +34,10 @@ export class TopicDriftDetector {
24
34
  driftScore: boundary.score,
25
35
  });
26
36
  }
37
+ const nextTopicOrder = index + 2;
38
+ if (boundary.reentryNodeId) {
39
+ reentryMap.set(nextTopicOrder, boundary.reentryNodeId);
40
+ }
27
41
  start = boundary.index;
28
42
  }
29
43
  segments.push({
@@ -32,18 +46,98 @@ export class TopicDriftDetector {
32
46
  topicOrder: segments.length + 1,
33
47
  driftScore: 0,
34
48
  });
35
- return segments;
49
+ return { segments, reentryMap };
50
+ }
51
+ async detectBoundaries(messages, embeddings, existingNodes) {
52
+ if (this.config.mode === "intent") {
53
+ return this.detectIntentBoundaries(messages, embeddings, existingNodes);
54
+ }
55
+ return this.detectWindowBoundaries(messages, embeddings, existingNodes);
36
56
  }
37
- detectBoundaries(messages, embeddings) {
57
+ detectBoundariesSync(messages, embeddings) {
38
58
  if (this.config.mode === "intent") {
39
- return this.detectIntentBoundaries(messages, embeddings);
59
+ return this.detectIntentBoundariesSync(messages, embeddings);
60
+ }
61
+ return this.detectWindowBoundariesSync(messages, embeddings);
62
+ }
63
+ async detectIntentBoundaries(messages, embeddings, existingNodes) {
64
+ const boundaries = [];
65
+ let segmentStart = 0;
66
+ let topicEmbeddings = [];
67
+ let previousUserEmbedding = null;
68
+ for (let index = 0; index < messages.length; index += 1) {
69
+ const message = messages[index];
70
+ const embedding = embeddings[index];
71
+ if (!message || !embedding || message.role !== "user")
72
+ continue;
73
+ if (topicEmbeddings.length === 0) {
74
+ topicEmbeddings = [embedding];
75
+ previousUserEmbedding = embedding;
76
+ continue;
77
+ }
78
+ let driftScore = computeDriftScore(embedding, message, avg(topicEmbeddings), previousUserEmbedding, this.config.threshold);
79
+ driftScore = await this.resolveAmbiguousScore(driftScore, messages.slice(Math.max(0, index - 3), index), message);
80
+ const segmentLength = index - segmentStart;
81
+ if (driftScore > this.config.threshold && segmentLength >= this.config.minSegmentMessages) {
82
+ const reentryNodeId = this.maybeCheckReentry(embedding, existingNodes);
83
+ boundaries.push({
84
+ index,
85
+ score: driftScore,
86
+ ...(reentryNodeId ? { reentryNodeId } : {}),
87
+ });
88
+ segmentStart = index;
89
+ topicEmbeddings = [embedding];
90
+ previousUserEmbedding = embedding;
91
+ continue;
92
+ }
93
+ topicEmbeddings.push(embedding);
94
+ previousUserEmbedding = embedding;
95
+ }
96
+ return boundaries;
97
+ }
98
+ async detectWindowBoundaries(messages, embeddings, existingNodes) {
99
+ const boundaries = [];
100
+ const halfWindowSize = Math.floor(this.config.windowSize / 2);
101
+ if (halfWindowSize < 1)
102
+ return boundaries;
103
+ let segmentStart = 0;
104
+ let window = [];
105
+ for (let index = 0; index < messages.length; index += 1) {
106
+ const embedding = embeddings[index];
107
+ if (!embedding)
108
+ continue;
109
+ window = [...window, { index, embedding }].slice(-this.config.windowSize);
110
+ if (window.length < this.config.windowSize)
111
+ continue;
112
+ const previous = window.slice(0, halfWindowSize);
113
+ const current = window.slice(-halfWindowSize);
114
+ const boundaryIndex = window.at(-halfWindowSize)?.index ?? index;
115
+ const currentMessage = messages[boundaryIndex];
116
+ const currentEmbedding = embeddings[boundaryIndex] ?? avg(current.map((item) => item.embedding));
117
+ const previousEmbedding = previous.at(-1)?.embedding ?? null;
118
+ if (!currentMessage)
119
+ continue;
120
+ let driftScore = computeDriftScore(currentEmbedding, currentMessage, avg(previous.map((item) => item.embedding)), previousEmbedding, this.config.threshold);
121
+ driftScore = await this.resolveAmbiguousScore(driftScore, messages.slice(Math.max(0, boundaryIndex - 3), boundaryIndex), currentMessage);
122
+ const segmentLength = boundaryIndex - segmentStart;
123
+ if (driftScore > this.config.threshold && segmentLength >= this.config.minSegmentMessages) {
124
+ const reentryNodeId = this.maybeCheckReentry(currentEmbedding, existingNodes);
125
+ boundaries.push({
126
+ index: boundaryIndex,
127
+ score: driftScore,
128
+ ...(reentryNodeId ? { reentryNodeId } : {}),
129
+ });
130
+ segmentStart = boundaryIndex;
131
+ window = window.filter((item) => item.index >= boundaryIndex);
132
+ }
40
133
  }
41
- return this.detectWindowBoundaries(messages, embeddings);
134
+ return boundaries;
42
135
  }
43
- detectIntentBoundaries(messages, embeddings) {
136
+ detectIntentBoundariesSync(messages, embeddings) {
44
137
  const boundaries = [];
45
138
  let segmentStart = 0;
46
139
  let topicEmbeddings = [];
140
+ let previousUserEmbedding = null;
47
141
  for (let index = 0; index < messages.length; index += 1) {
48
142
  const message = messages[index];
49
143
  const embedding = embeddings[index];
@@ -51,21 +145,24 @@ export class TopicDriftDetector {
51
145
  continue;
52
146
  if (topicEmbeddings.length === 0) {
53
147
  topicEmbeddings = [embedding];
148
+ previousUserEmbedding = embedding;
54
149
  continue;
55
150
  }
56
- const driftScore = 1 - cosineSimilarity(avg(topicEmbeddings), embedding);
151
+ const driftScore = computeDriftScore(embedding, message, avg(topicEmbeddings), previousUserEmbedding, this.config.threshold);
57
152
  const segmentLength = index - segmentStart;
58
153
  if (driftScore > this.config.threshold && segmentLength >= this.config.minSegmentMessages) {
59
154
  boundaries.push({ index, score: driftScore });
60
155
  segmentStart = index;
61
156
  topicEmbeddings = [embedding];
157
+ previousUserEmbedding = embedding;
62
158
  continue;
63
159
  }
64
160
  topicEmbeddings.push(embedding);
161
+ previousUserEmbedding = embedding;
65
162
  }
66
163
  return boundaries;
67
164
  }
68
- detectWindowBoundaries(messages, embeddings) {
165
+ detectWindowBoundariesSync(messages, embeddings) {
69
166
  const boundaries = [];
70
167
  const halfWindowSize = Math.floor(this.config.windowSize / 2);
71
168
  if (halfWindowSize < 1)
@@ -79,10 +176,15 @@ export class TopicDriftDetector {
79
176
  window = [...window, { index, embedding }].slice(-this.config.windowSize);
80
177
  if (window.length < this.config.windowSize)
81
178
  continue;
82
- const previous = window.slice(0, halfWindowSize).map((item) => item.embedding);
83
- const current = window.slice(-halfWindowSize).map((item) => item.embedding);
84
- const driftScore = 1 - cosineSimilarity(avg(previous), avg(current));
179
+ const previous = window.slice(0, halfWindowSize);
180
+ const current = window.slice(-halfWindowSize);
85
181
  const boundaryIndex = window.at(-halfWindowSize)?.index ?? index;
182
+ const currentMessage = messages[boundaryIndex];
183
+ const currentEmbedding = embeddings[boundaryIndex] ?? avg(current.map((item) => item.embedding));
184
+ const previousEmbedding = previous.at(-1)?.embedding ?? null;
185
+ if (!currentMessage)
186
+ continue;
187
+ const driftScore = computeDriftScore(currentEmbedding, currentMessage, avg(previous.map((item) => item.embedding)), previousEmbedding, this.config.threshold);
86
188
  const segmentLength = boundaryIndex - segmentStart;
87
189
  if (driftScore > this.config.threshold && segmentLength >= this.config.minSegmentMessages) {
88
190
  boundaries.push({ index: boundaryIndex, score: driftScore });
@@ -92,5 +194,29 @@ export class TopicDriftDetector {
92
194
  }
93
195
  return boundaries;
94
196
  }
197
+ async resolveAmbiguousScore(driftScore, recentMessages, currentMessage) {
198
+ const ambiguousLow = this.config.threshold * 0.6;
199
+ const ambiguousHigh = this.config.threshold * 1.2;
200
+ const isAmbiguous = driftScore >= ambiguousLow && driftScore <= ambiguousHigh;
201
+ if (!isAmbiguous || !this.config.llmAmbiguityDetection || !this.llm)
202
+ return driftScore;
203
+ const isShift = await this.classifyIntentShift(recentMessages, currentMessage);
204
+ return isShift ? this.config.threshold * 1.5 : this.config.threshold * 0.4;
205
+ }
206
+ async classifyIntentShift(recentMessages, currentMessage) {
207
+ const prompt = buildIntentShiftPrompt(recentMessages, currentMessage);
208
+ try {
209
+ const response = await this.llm?.complete([{ role: "user", content: prompt }]);
210
+ return response?.includes("NEW_TOPIC") ?? false;
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ }
216
+ maybeCheckReentry(embedding, existingNodes) {
217
+ if (!this.config.reentryDetection || existingNodes.length === 0)
218
+ return undefined;
219
+ return findReentryNodeId(embedding, existingNodes, this.config.reentryThreshold) ?? undefined;
220
+ }
95
221
  }
96
222
  //# sourceMappingURL=TopicDriftDetector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopicDriftDetector.js","sourceRoot":"","sources":["../../src/pipeline/TopicDriftDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TopicDriftDetector.js","sourceRoot":"","sources":["../../src/pipeline/TopicDriftDetector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAoBlD,MAAM,OAAO,kBAAkB;IAEV;IASA;IAVnB,YACmB,MAQhB,EACgB,GAAgB;QAThB,WAAM,GAAN,MAAM,CAQtB;QACgB,QAAG,GAAH,GAAG,CAAa;IAChC,CAAC;IAEJ;;;OAGG;IACH,MAAM,CAAC,QAAmB,EAAE,UAAsB;QAChD,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAmB,EACnB,UAAsB,EACtB,gBAA6B,EAAE;QAE/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;YAC/B,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,GAAG;oBACH,UAAU,EAAE,KAAK,GAAG,CAAC;oBACrB,UAAU,EAAE,QAAQ,CAAC,KAAK;iBAC3B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC3B,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzD,CAAC;YAED,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACzB,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK;YACL,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxB,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC/B,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,QAAmB,EACnB,UAAsB,EACtB,aAA0B;QAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC;IAEO,oBAAoB,CAAC,QAAmB,EAAE,UAAsB;QACtE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,QAAmB,EACnB,UAAsB,EACtB,aAA0B;QAE1B,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,eAAe,GAAe,EAAE,CAAC;QACrC,IAAI,qBAAqB,GAAoB,IAAI,CAAC;QAElD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAEhE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,eAAe,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,qBAAqB,GAAG,SAAS,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,UAAU,GAAG,iBAAiB,CAChC,SAAS,EACT,OAAO,EACP,GAAG,CAAC,eAAe,CAAC,EACpB,qBAAqB,EACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YACF,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAElH,MAAM,aAAa,GAAG,KAAK,GAAG,YAAY,CAAC;YAC3C,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1F,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBACvE,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK;oBACL,KAAK,EAAE,UAAU;oBACjB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C,CAAC,CAAC;gBACH,YAAY,GAAG,KAAK,CAAC;gBACrB,eAAe,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,qBAAqB,GAAG,SAAS,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,qBAAqB,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,QAAmB,EACnB,UAAsB,EACtB,aAA0B;QAE1B,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,cAAc,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QAE1C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,MAAM,GAAkD,EAAE,CAAC;QAE/D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS;YAErD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC;YACjE,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjG,MAAM,iBAAiB,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;YAE7D,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE9B,IAAI,UAAU,GAAG,iBAAiB,CAChC,gBAAgB,EAChB,cAAc,EACd,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAC3C,iBAAiB,EACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YACF,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAC3C,UAAU,EACV,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,EAC7D,cAAc,CACf,CAAC;YAEF,MAAM,aAAa,GAAG,aAAa,GAAG,YAAY,CAAC;YACnD,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1F,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;gBAC9E,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,aAAa;oBACpB,KAAK,EAAE,UAAU;oBACjB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C,CAAC,CAAC;gBACH,YAAY,GAAG,aAAa,CAAC;gBAC7B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,0BAA0B,CAAC,QAAmB,EAAE,UAAsB;QAC5E,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,eAAe,GAAe,EAAE,CAAC;QACrC,IAAI,qBAAqB,GAAoB,IAAI,CAAC;QAElD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAEhE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,eAAe,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,qBAAqB,GAAG,SAAS,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,iBAAiB,CAClC,SAAS,EACT,OAAO,EACP,GAAG,CAAC,eAAe,CAAC,EACpB,qBAAqB,EACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YACF,MAAM,aAAa,GAAG,KAAK,GAAG,YAAY,CAAC;YAE3C,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1F,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC9C,YAAY,GAAG,KAAK,CAAC;gBACrB,eAAe,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,qBAAqB,GAAG,SAAS,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,qBAAqB,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,0BAA0B,CAAC,QAAmB,EAAE,UAAsB;QAC5E,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,cAAc,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QAE1C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,MAAM,GAAkD,EAAE,CAAC;QAE/D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS;YAErD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC;YACjE,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjG,MAAM,iBAAiB,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;YAE7D,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE9B,MAAM,UAAU,GAAG,iBAAiB,CAClC,gBAAgB,EAChB,cAAc,EACd,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAC3C,iBAAiB,EACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CACtB,CAAC;YACF,MAAM,aAAa,GAAG,aAAa,GAAG,YAAY,CAAC;YAEnD,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1F,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC7D,YAAY,GAAG,aAAa,CAAC;gBAC7B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,UAAkB,EAClB,cAAyB,EACzB,cAAuB;QAEvB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QAClD,MAAM,WAAW,GAAG,UAAU,IAAI,YAAY,IAAI,UAAU,IAAI,aAAa,CAAC;QAE9E,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO,UAAU,CAAC;QAEvF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,cAAyB,EAAE,cAAuB;QAClF,MAAM,MAAM,GAAG,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,SAAmB,EAAE,aAA0B;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClF,OAAO,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;IAChG,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { MemoryNode, TopicNode } from "../types.js";
2
+ export declare function formatFactBlock(facts: MemoryNode[], parentNode: TopicNode): string;
3
+ export declare function buildFactRetrievalPrompt(blocks: string[]): string;
4
+ //# sourceMappingURL=factRetrievalPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factRetrievalPrompt.d.ts","sourceRoot":"","sources":["../../src/prompts/factRetrievalPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAezD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,GAAG,MAAM,CASlF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAOjE"}
@@ -0,0 +1,25 @@
1
+ const FACT_RETRIEVAL_SUBHEADER = "The following facts were retrieved from prior conversation memory. " +
2
+ "Use them to inform your response where relevant.";
3
+ function compactSummary(summary) {
4
+ return summary.replace(/\s+/g, " ").trim();
5
+ }
6
+ function formatFactLine(fact) {
7
+ return `[${fact.memoryType.toUpperCase()}] ${fact.subject} → ${fact.predicate}: ` +
8
+ `${fact.value} (conf: ${fact.confidence.toFixed(2)})`;
9
+ }
10
+ export function formatFactBlock(facts, parentNode) {
11
+ const header = `## ${parentNode.label} (order: ${parentNode.topicOrder})`;
12
+ const summary = `> ${compactSummary(parentNode.summary)}`;
13
+ if (facts.length === 0) {
14
+ return [header, "", summary].join("\n") + "\n";
15
+ }
16
+ return [header, ...facts.map(formatFactLine), "", summary].join("\n") + "\n";
17
+ }
18
+ export function buildFactRetrievalPrompt(blocks) {
19
+ if (blocks.length === 0) {
20
+ return ["### Retrieved Memory", FACT_RETRIEVAL_SUBHEADER].join("\n") + "\n";
21
+ }
22
+ return ["### Retrieved Memory", FACT_RETRIEVAL_SUBHEADER, "", blocks.join("\n---\n")]
23
+ .join("\n") + "\n";
24
+ }
25
+ //# sourceMappingURL=factRetrievalPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factRetrievalPrompt.js","sourceRoot":"","sources":["../../src/prompts/factRetrievalPrompt.ts"],"names":[],"mappings":"AAEA,MAAM,wBAAwB,GAC5B,qEAAqE;IACrE,kDAAkD,CAAC;AAErD,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB;IACtC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,SAAS,IAAI;QAC/E,GAAG,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,UAAqB;IACxE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,YAAY,UAAU,CAAC,UAAU,GAAG,CAAC;IAC1E,MAAM,OAAO,GAAG,KAAK,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAgB;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClF,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TopicNode } from "../types.js";
2
+ export declare function formatCompressedTopic(node: TopicNode): string;
3
+ //# sourceMappingURL=historyCompressionPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyCompressionPrompt.d.ts","sourceRoot":"","sources":["../../src/prompts/historyCompressionPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,4 @@
1
+ export function formatCompressedTopic(node) {
2
+ return `[Topic: ${node.label}] ${node.summary}`;
3
+ }
4
+ //# sourceMappingURL=historyCompressionPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyCompressionPrompt.js","sourceRoot":"","sources":["../../src/prompts/historyCompressionPrompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,OAAO,WAAW,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Message } from "../types.js";
2
+ export declare function buildIntentShiftPrompt(recentMessages: Message[], currentMessage: Message): string;
3
+ //# sourceMappingURL=intentShiftPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intentShiftPrompt.d.ts","sourceRoot":"","sources":["../../src/prompts/intentShiftPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,GAAG,MAAM,CAUjG"}
@@ -0,0 +1,11 @@
1
+ export function buildIntentShiftPrompt(recentMessages, currentMessage) {
2
+ const recent = recentMessages.map((message) => `[${message.role}]: ${message.content}`).join("\n");
3
+ return [
4
+ "You are a conversation topic classifier.",
5
+ "Given recent conversation messages and a new message, determine if the new message starts a new topic or continues the current one.",
6
+ `Recent messages: ${recent}`,
7
+ `New message: ${currentMessage.content}`,
8
+ "Reply with exactly one word: NEW_TOPIC or CONTINUATION",
9
+ ].join("\n");
10
+ }
11
+ //# sourceMappingURL=intentShiftPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intentShiftPrompt.js","sourceRoot":"","sources":["../../src/prompts/intentShiftPrompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,cAAyB,EAAE,cAAuB;IACvF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnG,OAAO;QACL,0CAA0C;QAC1C,qIAAqI;QACrI,oBAAoB,MAAM,EAAE;QAC5B,gBAAgB,cAAc,CAAC,OAAO,EAAE;QACxC,wDAAwD;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}