@kybernesis/brain-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/claude-call.d.ts +37 -0
  2. package/dist/claude-call.d.ts.map +1 -0
  3. package/dist/claude-call.js +55 -0
  4. package/dist/claude-call.js.map +1 -0
  5. package/dist/entity-graph.d.ts +79 -0
  6. package/dist/entity-graph.d.ts.map +1 -0
  7. package/dist/entity-graph.js +611 -0
  8. package/dist/entity-graph.js.map +1 -0
  9. package/dist/fact-contradiction.d.ts +25 -0
  10. package/dist/fact-contradiction.d.ts.map +1 -0
  11. package/dist/fact-contradiction.js +109 -0
  12. package/dist/fact-contradiction.js.map +1 -0
  13. package/dist/fact-extractor.d.ts +26 -0
  14. package/dist/fact-extractor.d.ts.map +1 -0
  15. package/dist/fact-extractor.js +98 -0
  16. package/dist/fact-extractor.js.map +1 -0
  17. package/dist/fact-retrieval.d.ts +51 -0
  18. package/dist/fact-retrieval.d.ts.map +1 -0
  19. package/dist/fact-retrieval.js +401 -0
  20. package/dist/fact-retrieval.js.map +1 -0
  21. package/dist/fact-store.d.ts +26 -0
  22. package/dist/fact-store.d.ts.map +1 -0
  23. package/dist/fact-store.js +181 -0
  24. package/dist/fact-store.js.map +1 -0
  25. package/dist/fact-temporal.d.ts +20 -0
  26. package/dist/fact-temporal.d.ts.map +1 -0
  27. package/dist/fact-temporal.js +79 -0
  28. package/dist/fact-temporal.js.map +1 -0
  29. package/dist/fts-sanitizer.d.ts +32 -0
  30. package/dist/fts-sanitizer.d.ts.map +1 -0
  31. package/dist/fts-sanitizer.js +61 -0
  32. package/dist/fts-sanitizer.js.map +1 -0
  33. package/dist/hybrid-search.d.ts +44 -0
  34. package/dist/hybrid-search.d.ts.map +1 -0
  35. package/dist/hybrid-search.js +410 -0
  36. package/dist/hybrid-search.js.map +1 -0
  37. package/dist/index.d.ts +33 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +19 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/ops.d.ts +28 -0
  42. package/dist/ops.d.ts.map +1 -0
  43. package/dist/ops.js +307 -0
  44. package/dist/ops.js.map +1 -0
  45. package/dist/queue.d.ts +13 -0
  46. package/dist/queue.d.ts.map +1 -0
  47. package/dist/queue.js +28 -0
  48. package/dist/queue.js.map +1 -0
  49. package/dist/relationship-extractor.d.ts +38 -0
  50. package/dist/relationship-extractor.d.ts.map +1 -0
  51. package/dist/relationship-extractor.js +119 -0
  52. package/dist/relationship-extractor.js.map +1 -0
  53. package/dist/sleep/config.d.ts +47 -0
  54. package/dist/sleep/config.d.ts.map +1 -0
  55. package/dist/sleep/config.js +46 -0
  56. package/dist/sleep/config.js.map +1 -0
  57. package/dist/sleep/db.d.ts +16 -0
  58. package/dist/sleep/db.d.ts.map +1 -0
  59. package/dist/sleep/db.js +114 -0
  60. package/dist/sleep/db.js.map +1 -0
  61. package/dist/sleep/index.d.ts +69 -0
  62. package/dist/sleep/index.d.ts.map +1 -0
  63. package/dist/sleep/index.js +99 -0
  64. package/dist/sleep/index.js.map +1 -0
  65. package/dist/sleep/steps/consolidate.d.ts +19 -0
  66. package/dist/sleep/steps/consolidate.d.ts.map +1 -0
  67. package/dist/sleep/steps/consolidate.js +74 -0
  68. package/dist/sleep/steps/consolidate.js.map +1 -0
  69. package/dist/sleep/steps/decay.d.ts +19 -0
  70. package/dist/sleep/steps/decay.d.ts.map +1 -0
  71. package/dist/sleep/steps/decay.js +121 -0
  72. package/dist/sleep/steps/decay.js.map +1 -0
  73. package/dist/sleep/steps/entity-hygiene.d.ts +29 -0
  74. package/dist/sleep/steps/entity-hygiene.d.ts.map +1 -0
  75. package/dist/sleep/steps/entity-hygiene.js +452 -0
  76. package/dist/sleep/steps/entity-hygiene.js.map +1 -0
  77. package/dist/sleep/steps/link.d.ts +20 -0
  78. package/dist/sleep/steps/link.d.ts.map +1 -0
  79. package/dist/sleep/steps/link.js +216 -0
  80. package/dist/sleep/steps/link.js.map +1 -0
  81. package/dist/sleep/steps/observe.d.ts +17 -0
  82. package/dist/sleep/steps/observe.d.ts.map +1 -0
  83. package/dist/sleep/steps/observe.js +192 -0
  84. package/dist/sleep/steps/observe.js.map +1 -0
  85. package/dist/sleep/steps/profile.d.ts +15 -0
  86. package/dist/sleep/steps/profile.d.ts.map +1 -0
  87. package/dist/sleep/steps/profile.js +26 -0
  88. package/dist/sleep/steps/profile.js.map +1 -0
  89. package/dist/sleep/steps/reasoning.d.ts +19 -0
  90. package/dist/sleep/steps/reasoning.d.ts.map +1 -0
  91. package/dist/sleep/steps/reasoning.js +173 -0
  92. package/dist/sleep/steps/reasoning.js.map +1 -0
  93. package/dist/sleep/steps/summarize.d.ts +21 -0
  94. package/dist/sleep/steps/summarize.d.ts.map +1 -0
  95. package/dist/sleep/steps/summarize.js +206 -0
  96. package/dist/sleep/steps/summarize.js.map +1 -0
  97. package/dist/sleep/steps/tag.d.ts +16 -0
  98. package/dist/sleep/steps/tag.d.ts.map +1 -0
  99. package/dist/sleep/steps/tag.js +84 -0
  100. package/dist/sleep/steps/tag.js.map +1 -0
  101. package/dist/sleep/steps/tier.d.ts +18 -0
  102. package/dist/sleep/steps/tier.d.ts.map +1 -0
  103. package/dist/sleep/steps/tier.js +112 -0
  104. package/dist/sleep/steps/tier.js.map +1 -0
  105. package/dist/sleep/utils/checkpoint.d.ts +11 -0
  106. package/dist/sleep/utils/checkpoint.d.ts.map +1 -0
  107. package/dist/sleep/utils/checkpoint.js +26 -0
  108. package/dist/sleep/utils/checkpoint.js.map +1 -0
  109. package/dist/sleep/utils/jaccard.d.ts +7 -0
  110. package/dist/sleep/utils/jaccard.d.ts.map +1 -0
  111. package/dist/sleep/utils/jaccard.js +19 -0
  112. package/dist/sleep/utils/jaccard.js.map +1 -0
  113. package/dist/store-conversation.d.ts +29 -0
  114. package/dist/store-conversation.d.ts.map +1 -0
  115. package/dist/store-conversation.js +227 -0
  116. package/dist/store-conversation.js.map +1 -0
  117. package/dist/timeline.d.ts +50 -0
  118. package/dist/timeline.d.ts.map +1 -0
  119. package/dist/timeline.js +389 -0
  120. package/dist/timeline.js.map +1 -0
  121. package/dist/user-profile.d.ts +30 -0
  122. package/dist/user-profile.d.ts.map +1 -0
  123. package/dist/user-profile.js +147 -0
  124. package/dist/user-profile.js.map +1 -0
  125. package/dist/vectors.d.ts +56 -0
  126. package/dist/vectors.d.ts.map +1 -0
  127. package/dist/vectors.js +132 -0
  128. package/dist/vectors.js.map +1 -0
  129. package/package.json +53 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Tier step — port of KAD's sleep/steps/tier.ts.
3
+ *
4
+ * Promotes/demotes timeline events between hot/warm/archive tiers.
5
+ *
6
+ * Bug B11A regression-watchpoint: hot promotion uses **OR across 5 signals**
7
+ * (priority threshold OR low decay OR recent access OR relationshipScore OR
8
+ * edgeCount). A v1 port had AND across these signals, which dropped most
9
+ * promotions — the port-faithful library carries KAD's OR shape verbatim.
10
+ */
11
+ import { getDb } from '@kybernesis/brain-storage-sqlite';
12
+ import { ensureSleepSchema } from '../db.js';
13
+ export async function runTierStep(t, config) {
14
+ const timeline = getDb(t, 'timeline');
15
+ const sleep = ensureSleepSchema(t);
16
+ const now = Date.now();
17
+ const DAY_MS = 24 * 60 * 60 * 1000;
18
+ let changed = 0;
19
+ const errors = [];
20
+ try {
21
+ const items = timeline.prepare(`
22
+ SELECT id, source_path, priority, decay_score, tier, last_accessed, access_count, is_pinned
23
+ FROM timeline_events
24
+ LIMIT ?
25
+ `).all(config.batchSize);
26
+ for (const item of items) {
27
+ try {
28
+ if (item.is_pinned) {
29
+ if (item.tier !== 'hot') {
30
+ updateTier(timeline, sleep, item.id, 'hot', item.tier, 'pinned');
31
+ changed++;
32
+ }
33
+ continue;
34
+ }
35
+ const edgeData = sleep.prepare(`
36
+ SELECT COUNT(*) as count, COALESCE(SUM(confidence), 0) as totalConfidence
37
+ FROM memory_edges
38
+ WHERE from_path = ? OR to_path = ?
39
+ `).get(item.source_path, item.source_path);
40
+ const relationshipScore = edgeData.totalConfidence;
41
+ const edgeCount = edgeData.count;
42
+ const daysSinceAccess = item.last_accessed
43
+ ? (now - new Date(item.last_accessed + 'Z').getTime()) / DAY_MS
44
+ : 30;
45
+ let newTier;
46
+ const priority = item.priority ?? 0.5;
47
+ const decayScore = item.decay_score ?? 0;
48
+ // Bug B11A: OR across 5 signals (NOT AND). Each signal alone is
49
+ // sufficient to promote to hot. KAD's contract.
50
+ if (priority >= config.hotPriorityThreshold ||
51
+ decayScore <= config.hotDecayThreshold ||
52
+ daysSinceAccess <= config.hotAccessDays ||
53
+ relationshipScore >= config.hotEdgeCount ||
54
+ edgeCount >= 4) {
55
+ newTier = 'hot';
56
+ }
57
+ else if (priority >= config.warmPriorityThreshold ||
58
+ daysSinceAccess <= config.warmAccessDays ||
59
+ relationshipScore >= config.warmEdgeCount) {
60
+ newTier = 'warm';
61
+ }
62
+ else {
63
+ newTier = 'archive';
64
+ }
65
+ if (newTier !== (item.tier || 'warm')) {
66
+ let reason = 'threshold';
67
+ if (newTier === 'hot') {
68
+ if (priority >= config.hotPriorityThreshold)
69
+ reason = 'high_priority';
70
+ else if (decayScore <= config.hotDecayThreshold)
71
+ reason = 'low_decay';
72
+ else if (daysSinceAccess <= config.hotAccessDays)
73
+ reason = 'recent_access';
74
+ else if (relationshipScore >= config.hotEdgeCount)
75
+ reason = 'high_relationships';
76
+ }
77
+ else if (newTier === 'archive') {
78
+ reason = 'low_activity';
79
+ }
80
+ updateTier(timeline, sleep, item.id, newTier, (item.tier || 'warm'), reason);
81
+ changed++;
82
+ }
83
+ }
84
+ catch (err) {
85
+ errors.push(`tier item ${item.id}: ${String(err)}`);
86
+ }
87
+ }
88
+ }
89
+ catch (err) {
90
+ console.warn('[brain-core/sleep/tier] step failed', { err: String(err) });
91
+ errors.push(`tier step: ${String(err)}`);
92
+ }
93
+ return { count: changed, errors: errors.length > 0 ? errors : undefined };
94
+ }
95
+ function updateTier(timeline, sleep, itemId, newTier, oldTier, reason) {
96
+ timeline.prepare(`
97
+ UPDATE timeline_events SET tier = ? WHERE id = ?
98
+ `).run(newTier, itemId);
99
+ sleep.prepare(`
100
+ INSERT OR REPLACE INTO maintenance_queue
101
+ (item_type, item_id, task, priority, created_at)
102
+ VALUES ('timeline', ?, 'resummarize', ?, datetime('now'))
103
+ `).run(itemId.toString(), newTier === 'hot' ? 2 : newTier === 'warm' ? 1 : 0);
104
+ try {
105
+ sleep.prepare(`
106
+ INSERT INTO tier_transitions (item_id, from_tier, to_tier, reason)
107
+ VALUES (?, ?, ?, ?)
108
+ `).run(itemId, oldTier, newTier, reason || 'threshold');
109
+ }
110
+ catch { /* non-critical */ }
111
+ }
112
+ //# sourceMappingURL=tier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier.js","sourceRoot":"","sources":["../../../src/sleep/steps/tier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sleep checkpoint helpers — port of KAD's sleep/utils/checkpoint.ts.
3
+ * Tracks which step is in progress so we can see where a crashed run died.
4
+ */
5
+ import type Database from 'better-sqlite3';
6
+ export declare function saveCheckpoint(db: Database.Database, runId: number, step: string, data?: Record<string, unknown>): void;
7
+ export declare function getLastCheckpoint(db: Database.Database, runId: number): {
8
+ step: string;
9
+ data: Record<string, unknown>;
10
+ } | null;
11
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../src/sleep/utils/checkpoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAON;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAYxD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Sleep checkpoint helpers — port of KAD's sleep/utils/checkpoint.ts.
3
+ * Tracks which step is in progress so we can see where a crashed run died.
4
+ */
5
+ export function saveCheckpoint(db, runId, step, data) {
6
+ db.prepare(`
7
+ UPDATE sleep_runs
8
+ SET checkpoint_step = ?,
9
+ checkpoint_data = ?
10
+ WHERE id = ?
11
+ `).run(step, JSON.stringify({ timestamp: new Date().toISOString(), ...data }), runId);
12
+ }
13
+ export function getLastCheckpoint(db, runId) {
14
+ const row = db.prepare(`
15
+ SELECT checkpoint_step, checkpoint_data
16
+ FROM sleep_runs
17
+ WHERE id = ?
18
+ `).get(runId);
19
+ if (!row || !row.checkpoint_step)
20
+ return null;
21
+ return {
22
+ step: row.checkpoint_step,
23
+ data: row.checkpoint_data ? JSON.parse(row.checkpoint_data) : {},
24
+ };
25
+ }
26
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/sleep/utils/checkpoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,KAAa,EACb,IAAY,EACZ,IAA8B;IAE9B,EAAE,CAAC,OAAO,CAAC;;;;;GAKV,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,KAAa;IAEb,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAItB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAmF,CAAC;IAEhG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,eAAe;QACzB,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE;KACjE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Jaccard similarity — port of KAD's sleep/utils/jaccard.ts.
3
+ * |intersection| / |union|. 0 = disjoint, 1 = identical.
4
+ */
5
+ export declare function jaccardSimilarity(setA: Set<string>, setB: Set<string>): number;
6
+ export declare function jaccardSimilarityArrays(arrA: string[], arrB: string[]): number;
7
+ //# sourceMappingURL=jaccard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jaccard.d.ts","sourceRoot":"","sources":["../../../src/sleep/utils/jaccard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAQ9E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Jaccard similarity — port of KAD's sleep/utils/jaccard.ts.
3
+ * |intersection| / |union|. 0 = disjoint, 1 = identical.
4
+ */
5
+ export function jaccardSimilarity(setA, setB) {
6
+ if (setA.size === 0 && setB.size === 0)
7
+ return 0;
8
+ let intersectionSize = 0;
9
+ for (const item of setA) {
10
+ if (setB.has(item))
11
+ intersectionSize++;
12
+ }
13
+ const unionSize = setA.size + setB.size - intersectionSize;
14
+ return intersectionSize / unionSize;
15
+ }
16
+ export function jaccardSimilarityArrays(arrA, arrB) {
17
+ return jaccardSimilarity(new Set(arrA), new Set(arrB));
18
+ }
19
+ //# sourceMappingURL=jaccard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jaccard.js","sourceRoot":"","sources":["../../../src/sleep/utils/jaccard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAiB;IACpE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,gBAAgB,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC3D,OAAO,gBAAgB,GAAG,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAc,EAAE,IAAc;IACpE,OAAO,iBAAiB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Conversation memory storage — port of KAD's store-conversation.ts.
3
+ *
4
+ * Orchestrates storage across timeline, entity-graph, vectors, and fact
5
+ * extraction. Call fire-and-forget after a reply is sent.
6
+ */
7
+ import type { TenantContext } from '@kybernesis/brain-contracts';
8
+ export declare function filterNoiseEntities(entities: Array<{
9
+ name: string;
10
+ type: string;
11
+ }>, agentStoplist?: string[]): Array<{
12
+ name: string;
13
+ type: string;
14
+ }>;
15
+ export interface ConversationInput {
16
+ prompt: string;
17
+ response: string;
18
+ channel: string;
19
+ timestamp?: string;
20
+ metadata?: Record<string, unknown>;
21
+ eventType?: 'conversation' | 'idea' | 'file' | 'transcript' | 'note' | 'intake';
22
+ }
23
+ /** Returns true if a storeConversation call is in progress for this tenant. */
24
+ export declare function isStoreActive(t: TenantContext): boolean;
25
+ export declare function storeConversation(t: TenantContext, input: ConversationInput, options?: {
26
+ entityStoplist?: string[];
27
+ skipEmbeddings?: boolean;
28
+ }): Promise<void>;
29
+ //# sourceMappingURL=store-conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-conversation.d.ts","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAoCjE,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,aAAa,GAAE,MAAM,EAAO,GAC3B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUvC;AA+BD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjF;AAWD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAEvD;AAID,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACpE,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Conversation memory storage — port of KAD's store-conversation.ts.
3
+ *
4
+ * Orchestrates storage across timeline, entity-graph, vectors, and fact
5
+ * extraction. Call fire-and-forget after a reply is sent.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { SOURCE_CONFIDENCE } from '@kybernesis/brain-contracts';
9
+ import { enqueueWrite, queueDepth } from './queue.js';
10
+ import { addConversationToTimeline, findRecentDuplicate, incrementTimelineEventCount } from './timeline.js';
11
+ import { findOrCreateEntity, addEntityMention, linkEntitiesWithType } from './entity-graph.js';
12
+ import { extractRelationships } from './relationship-extractor.js';
13
+ import { indexChunk } from './vectors.js';
14
+ import { extractFactsRealtime } from './fact-extractor.js';
15
+ // ─── Noise entity filtering ────────────────────────────────────────────────────
16
+ const NOISE_ENTITY_PATTERNS = [
17
+ /^(curl|wget|bash|sh|zsh|npm|pnpm|yarn|pip|git|docker|node|python|make|gcc)$/i,
18
+ /^(BLOCKED|ERROR|FAIL|OK|SUCCESS|null|undefined|true|false|none|N\/A)$/i,
19
+ /^(max\s+turns?\s+limit|rate\s+limit|timeout|sandbox|retry|fallback|skip)$/i,
20
+ /^(settings|config|permissions?|terminal|shell|command|script)$/i,
21
+ /^(stdout|stderr|stdin|exit code|error|warning)$/i,
22
+ /\.(json|yaml|yml|md|ts|js|py|sh|env|toml|lock|log|txt|csv|db)$/i,
23
+ /^[./~].*\//,
24
+ /^\d+$/,
25
+ /^.{1,2}$/,
26
+ /^(the|this|that|it|they|we|i|you|he|she|my|our)$/i,
27
+ /^[a-f0-9-]{36}$/i,
28
+ /^(http|https|localhost|127\.0\.0\.1|0\.0\.0\.0)/i,
29
+ /^speaker\s*\d+$/i,
30
+ ];
31
+ const NOISE_WORDS = new Set([
32
+ 'speaker', 'user', 'assistant', 'narrator', 'host',
33
+ 'ok', 'okay', 'yes', 'no', 'yeah', 'nah', 'yep', 'nope',
34
+ 'hey', 'hi', 'hello', 'bye', 'goodbye', 'thanks', 'thank',
35
+ 'the', 'this', 'that', 'thing', 'stuff', 'someone', 'something',
36
+ 'everyone', 'anybody', 'nothing', 'everything',
37
+ 'person', 'unknown', 'other', 'another',
38
+ ]);
39
+ export function filterNoiseEntities(entities, agentStoplist = []) {
40
+ const stopSet = new Set(agentStoplist.map(s => s.toLowerCase()));
41
+ return entities.filter(e => {
42
+ const name = e.name.trim();
43
+ const lower = name.toLowerCase();
44
+ if (stopSet.has(lower))
45
+ return false;
46
+ if (NOISE_WORDS.has(lower))
47
+ return false;
48
+ if (NOISE_ENTITY_PATTERNS.some(p => p.test(name)))
49
+ return false;
50
+ return true;
51
+ });
52
+ }
53
+ // ─── Segment splitting ────────────────────────────────────────────────────────
54
+ function segmentText(text, segmentSize = 250, overlap = 50) {
55
+ if (text.length <= segmentSize)
56
+ return [{ text, index: 0 }];
57
+ const segs = [];
58
+ let start = 0;
59
+ let index = 0;
60
+ while (start < text.length) {
61
+ let end = start + segmentSize;
62
+ if (end < text.length) {
63
+ const slice = text.slice(start, end + 50);
64
+ const bp = slice.lastIndexOf('\n');
65
+ const sp = slice.search(/[.!?]\s+[A-Z]/);
66
+ if (bp > segmentSize * 0.6)
67
+ end = start + bp + 1;
68
+ else if (sp > segmentSize * 0.6)
69
+ end = start + sp + 2;
70
+ }
71
+ else {
72
+ end = text.length;
73
+ }
74
+ segs.push({ text: text.slice(start, end).trim(), index });
75
+ index++;
76
+ const next = end - overlap;
77
+ start = next <= start ? end : next;
78
+ if (start >= text.length || index > 100)
79
+ break;
80
+ }
81
+ return segs;
82
+ }
83
+ function channelToSourceType(channel) {
84
+ switch (channel) {
85
+ case 'terminal': return 'user-direct';
86
+ case 'heartbeat': return 'heartbeat';
87
+ case 'watched-folder': return 'watched-folder';
88
+ default: return 'chat';
89
+ }
90
+ }
91
+ /** Returns true if a storeConversation call is in progress for this tenant. */
92
+ export function isStoreActive(t) {
93
+ return queueDepth(t.slug) > 0;
94
+ }
95
+ // ─── Main ─────────────────────────────────────────────────────────────────────
96
+ export function storeConversation(t, input, options = {}) {
97
+ return enqueueWrite(t.slug, () => storeConversationImpl(t, input, options));
98
+ }
99
+ async function storeConversationImpl(t, input, options) {
100
+ const conversationId = randomUUID();
101
+ const timestamp = input.timestamp || new Date().toISOString();
102
+ const sourcePath = `channel://${input.channel}/${conversationId}`;
103
+ const fullText = `User: ${input.prompt}\n\nAssistant: ${input.response}`;
104
+ const timelineSummary = input.response.slice(0, 2000);
105
+ const sourceType = channelToSourceType(input.channel);
106
+ const sourceConfidence = SOURCE_CONFIDENCE[sourceType] ?? 0.85;
107
+ const meta = (input.metadata ?? {});
108
+ const arpMetadata = {
109
+ project_id: typeof meta['project_id'] === 'string' ? meta['project_id'] : undefined,
110
+ tags: Array.isArray(meta['tags']) ? meta['tags'].filter((t) => typeof t === 'string') : undefined,
111
+ classification: typeof meta['classification'] === 'string'
112
+ ? meta['classification']
113
+ : undefined,
114
+ connection_id: typeof meta['connection_id'] === 'string' ? meta['connection_id'] : undefined,
115
+ source_did: typeof meta['source_did'] === 'string' ? meta['source_did'] : undefined,
116
+ };
117
+ // Step 1: Extract entities + relationships
118
+ let entities = [];
119
+ let relationships = [];
120
+ try {
121
+ const extraction = await extractRelationships(t, fullText);
122
+ entities = extraction.entities;
123
+ relationships = extraction.relationships;
124
+ }
125
+ catch (err) {
126
+ console.warn('[brain-core/store-conversation] entity extraction failed', { err: String(err) });
127
+ }
128
+ // Step 1b: Filter noise
129
+ entities = filterNoiseEntities(entities, options.entityStoplist);
130
+ const entityNameSet = new Set(entities.map(e => e.name.toLowerCase()));
131
+ relationships = relationships.filter(r => entityNameSet.has(r.source.name.toLowerCase()) && entityNameSet.has(r.target.name.toLowerCase()));
132
+ const entityNames = entities.map(e => e.name);
133
+ const topicNames = entities.filter(e => e.type === 'topic').map(e => e.name);
134
+ // Step 2: Timeline
135
+ const title = input.prompt.length > 100 ? input.prompt.slice(0, 97) + '...' : input.prompt;
136
+ const dateMatch = input.prompt.match(/^DATE:\s*(.+?)$/m);
137
+ const sessionDate = dateMatch ? dateMatch[1].trim() : '';
138
+ const fullTitle = sessionDate ? `[${input.channel}] ${sessionDate} — ${title}` : `[${input.channel}] ${title}`;
139
+ const recentHours = input.channel === 'heartbeat' ? 24 : 0.033;
140
+ try {
141
+ const existing = await findRecentDuplicate(t, fullTitle, recentHours);
142
+ if (existing) {
143
+ await incrementTimelineEventCount(t, existing.id);
144
+ }
145
+ else {
146
+ await addConversationToTimeline(t, conversationId, sourcePath, timestamp, undefined, fullTitle, timelineSummary, entityNames, topicNames, arpMetadata, input.eventType);
147
+ }
148
+ }
149
+ catch (err) {
150
+ console.warn('[brain-core/store-conversation] timeline failed', { err: String(err) });
151
+ }
152
+ // Step 2b: Segment-level vector indexing (best-effort)
153
+ if (!options.skipEmbeddings) {
154
+ try {
155
+ const segs = segmentText(fullText, 250, 50);
156
+ if (segs.length > 1) {
157
+ for (const seg of segs) {
158
+ try {
159
+ await indexChunk(t, seg.text, {
160
+ ts: timestamp,
161
+ source: `${sourcePath}/seg_${seg.index}`,
162
+ origin_id: `${conversationId}_seg_${seg.index}`,
163
+ });
164
+ }
165
+ catch { /* best-effort */ }
166
+ }
167
+ }
168
+ }
169
+ catch (err) {
170
+ console.warn('[brain-core/store-conversation] segment indexing failed', { err: String(err) });
171
+ }
172
+ }
173
+ // Step 3: Entity graph
174
+ try {
175
+ const entityMap = new Map();
176
+ for (const entity of entities) {
177
+ try {
178
+ const dbEntity = await findOrCreateEntity(t, entity.name, entity.type, timestamp);
179
+ entityMap.set(entity.name, dbEntity.id);
180
+ await addEntityMention(t, dbEntity.id, conversationId, sourcePath, input.prompt.slice(0, 200), timestamp, sourceType, sourceConfidence);
181
+ }
182
+ catch (err) {
183
+ console.warn(`[brain-core/store-conversation] entity ${entity.name} failed`, { err: String(err) });
184
+ }
185
+ }
186
+ for (const rel of relationships) {
187
+ try {
188
+ const srcId = entityMap.get(rel.source.name);
189
+ const tgtId = entityMap.get(rel.target.name);
190
+ if (srcId && tgtId && srcId !== tgtId) {
191
+ await linkEntitiesWithType(t, srcId, tgtId, {
192
+ relationship: rel.relationship,
193
+ confidence: rel.confidence,
194
+ rationale: rel.rationale,
195
+ });
196
+ }
197
+ }
198
+ catch (err) {
199
+ console.warn('[brain-core/store-conversation] entity link failed', { err: String(err) });
200
+ }
201
+ }
202
+ }
203
+ catch (err) {
204
+ console.warn('[brain-core/store-conversation] entity graph failed', { err: String(err) });
205
+ }
206
+ // Step 3b: Real-time fact extraction (best-effort)
207
+ try {
208
+ await extractFactsRealtime(t, conversationId, fullText, {
209
+ entities: entityNames,
210
+ sourcePath,
211
+ timestamp,
212
+ sourceType,
213
+ arpMetadata,
214
+ });
215
+ }
216
+ catch { /* fact extraction is best-effort */ }
217
+ // Step 4: Parent-level embedding (only if no segments)
218
+ if (!options.skipEmbeddings && fullText.length <= 250) {
219
+ try {
220
+ await indexChunk(t, fullText, { ts: timestamp, source: sourcePath, origin_id: conversationId });
221
+ }
222
+ catch (err) {
223
+ console.warn('[brain-core/store-conversation] embedding failed', { err: String(err) });
224
+ }
225
+ }
226
+ }
227
+ //# sourceMappingURL=store-conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-conversation.js","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { TenantContext } from '@kybernesis/brain-contracts';
2
+ import type { EventType, TimelineEvent, TimelineEventInput } from '@kybernesis/brain-contracts';
3
+ export declare function resetTimelineDb(t?: TenantContext): void;
4
+ export declare function addToTimeline(t: TenantContext, event: TimelineEventInput): Promise<number>;
5
+ export declare function removeFromTimeline(t: TenantContext, sourcePath: string): Promise<boolean>;
6
+ export declare function updateTimelineEvent(t: TenantContext, id: number, updates: Partial<Omit<TimelineEventInput, 'sourcePath'>>): Promise<void>;
7
+ export declare function deleteTimelineEventById(t: TenantContext, id: number): Promise<boolean>;
8
+ export declare function getEventById(t: TenantContext, id: number): Promise<TimelineEvent | null>;
9
+ export declare function getEventByPath(t: TenantContext, sourcePath: string): Promise<TimelineEvent | null>;
10
+ export interface TimelineQuery {
11
+ start?: string;
12
+ end?: string;
13
+ type?: EventType;
14
+ search?: string;
15
+ entities?: string[];
16
+ topics?: string[];
17
+ limit?: number;
18
+ offset?: number;
19
+ }
20
+ export declare function queryTimeline(t: TenantContext, query?: TimelineQuery): Promise<TimelineEvent[]>;
21
+ export declare function getRecentActivity(t: TenantContext, limit?: number): Promise<TimelineEvent[]>;
22
+ export declare function getActivityOnDate(t: TenantContext, date: string): Promise<TimelineEvent[]>;
23
+ export declare function getActivityInRange(t: TenantContext, start: string, end: string): Promise<TimelineEvent[]>;
24
+ export declare function searchTimeline(t: TenantContext, searchQuery: string, options?: {
25
+ limit?: number;
26
+ type?: EventType;
27
+ }): Promise<TimelineEvent[]>;
28
+ export declare function findRecentDuplicate(t: TenantContext, title: string, withinHours: number): Promise<{
29
+ id: number;
30
+ title: string;
31
+ } | null>;
32
+ export declare function incrementTimelineEventCount(t: TenantContext, eventId: number): Promise<void>;
33
+ export interface TimelineStats {
34
+ totalEvents: number;
35
+ byType: Record<EventType, number>;
36
+ dateRange: {
37
+ earliest: string | null;
38
+ latest: string | null;
39
+ };
40
+ }
41
+ export declare function getTimelineStats(t: TenantContext): Promise<TimelineStats>;
42
+ export declare function addConversationToTimeline(t: TenantContext, _conversationId: string, sourcePath: string, startedAt: string, finishedAt: string | undefined, title: string, summary: string, entities: string[], topics: string[], arpMetadata?: {
43
+ projectId?: string;
44
+ tags?: string[];
45
+ classification?: string;
46
+ connectionId?: string;
47
+ sourceDid?: string;
48
+ }, eventType?: EventType): Promise<number>;
49
+ export declare function addIdeaToTimeline(t: TenantContext, _ideaId: string, sourcePath: string, createdAt: string, title: string, description: string, tags: string[]): Promise<number>;
50
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}