engram-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CONTRIBUTING.md +65 -0
  2. package/Dockerfile +21 -0
  3. package/EVAL-FRAMEWORK.md +70 -0
  4. package/EVAL.md +127 -0
  5. package/LICENSE +17 -0
  6. package/README.md +309 -0
  7. package/ROADMAP.md +113 -0
  8. package/deploy/fly.toml +26 -0
  9. package/dist/auto-ingest.d.ts +3 -0
  10. package/dist/auto-ingest.d.ts.map +1 -0
  11. package/dist/auto-ingest.js +334 -0
  12. package/dist/auto-ingest.js.map +1 -0
  13. package/dist/brief.d.ts +45 -0
  14. package/dist/brief.d.ts.map +1 -0
  15. package/dist/brief.js +183 -0
  16. package/dist/brief.js.map +1 -0
  17. package/dist/claude-watcher.d.ts +3 -0
  18. package/dist/claude-watcher.d.ts.map +1 -0
  19. package/dist/claude-watcher.js +385 -0
  20. package/dist/claude-watcher.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +764 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/embeddings.d.ts +42 -0
  26. package/dist/embeddings.d.ts.map +1 -0
  27. package/dist/embeddings.js +145 -0
  28. package/dist/embeddings.js.map +1 -0
  29. package/dist/eval.d.ts +2 -0
  30. package/dist/eval.d.ts.map +1 -0
  31. package/dist/eval.js +281 -0
  32. package/dist/eval.js.map +1 -0
  33. package/dist/extract.d.ts +11 -0
  34. package/dist/extract.d.ts.map +1 -0
  35. package/dist/extract.js +139 -0
  36. package/dist/extract.js.map +1 -0
  37. package/dist/hosted.d.ts +3 -0
  38. package/dist/hosted.d.ts.map +1 -0
  39. package/dist/hosted.js +144 -0
  40. package/dist/hosted.js.map +1 -0
  41. package/dist/index.d.ts +11 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +7 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/ingest.d.ts +28 -0
  46. package/dist/ingest.d.ts.map +1 -0
  47. package/dist/ingest.js +192 -0
  48. package/dist/ingest.js.map +1 -0
  49. package/dist/mcp.d.ts +3 -0
  50. package/dist/mcp.d.ts.map +1 -0
  51. package/dist/mcp.js +349 -0
  52. package/dist/mcp.js.map +1 -0
  53. package/dist/server.d.ts +17 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +515 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/store.d.ts +87 -0
  58. package/dist/store.d.ts.map +1 -0
  59. package/dist/store.js +548 -0
  60. package/dist/store.js.map +1 -0
  61. package/dist/types.d.ts +204 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +77 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/vault.d.ts +116 -0
  66. package/dist/vault.d.ts.map +1 -0
  67. package/dist/vault.js +1234 -0
  68. package/dist/vault.js.map +1 -0
  69. package/package.json +61 -0
package/dist/brief.js ADDED
@@ -0,0 +1,183 @@
1
+ // ============================================================
2
+ // Session Briefing — Proactive context injection
3
+ // ============================================================
4
+ //
5
+ // Instead of reading flat files at session start, generate a
6
+ // structured, context-aware briefing that gives the agent exactly
7
+ // what it needs for the current interaction.
8
+ //
9
+ // Usage:
10
+ // const briefing = await vault.brief({ who: 'Thomas', context: 'work' })
11
+ /**
12
+ * Generate a context-aware session briefing.
13
+ *
14
+ * This replaces "read all the markdown files" with intelligent,
15
+ * targeted memory retrieval that gives the agent exactly what
16
+ * it needs for the current interaction.
17
+ */
18
+ export async function brief(vault, options = {}) {
19
+ const { who, when = new Date(), recentTopics = [], recentEntities = [], maxMemories = 30, includePatterns = true, } = options;
20
+ const allMemories = new Map();
21
+ // 1. Person context — who are we talking to?
22
+ const personContext = [];
23
+ if (who) {
24
+ const personMemories = await vault.recall({
25
+ context: `About ${who}`,
26
+ entities: [who],
27
+ limit: 10,
28
+ minSalience: 0.3,
29
+ });
30
+ for (const m of personMemories) {
31
+ personContext.push(m);
32
+ allMemories.set(m.id, m);
33
+ }
34
+ }
35
+ // 2. Recent interactions
36
+ const recentInteractions = await vault.recall({
37
+ context: 'recent conversations and interactions',
38
+ temporalFocus: 'recent',
39
+ limit: 8,
40
+ minSalience: 0.3,
41
+ });
42
+ for (const m of recentInteractions) {
43
+ allMemories.set(m.id, m);
44
+ }
45
+ // 3. Active topics
46
+ const activeProjects = [];
47
+ for (const topic of recentTopics) {
48
+ const topicMemories = await vault.recall({
49
+ context: topic,
50
+ topics: [topic],
51
+ limit: 5,
52
+ minSalience: 0.4,
53
+ });
54
+ for (const m of topicMemories) {
55
+ activeProjects.push(m);
56
+ allMemories.set(m.id, m);
57
+ }
58
+ }
59
+ // 4. Recent entities
60
+ for (const entity of recentEntities) {
61
+ const entityMemories = await vault.recall({
62
+ context: entity,
63
+ entities: [entity],
64
+ limit: 5,
65
+ minSalience: 0.3,
66
+ });
67
+ for (const m of entityMemories) {
68
+ allMemories.set(m.id, m);
69
+ }
70
+ }
71
+ // 5. Behavioral patterns (semantic memories from consolidation)
72
+ const patterns = [];
73
+ if (includePatterns) {
74
+ const patternMemories = await vault.recall({
75
+ context: 'patterns preferences behavioral insights',
76
+ types: ['semantic'],
77
+ limit: 8,
78
+ minSalience: 0.5,
79
+ });
80
+ for (const m of patternMemories) {
81
+ patterns.push(m);
82
+ allMemories.set(m.id, m);
83
+ }
84
+ }
85
+ // 6. Pending items / commitments
86
+ const pendingItems = [];
87
+ const commitmentMemories = await vault.recall({
88
+ context: 'commitments pending todo action items promises',
89
+ topics: ['commitment'],
90
+ limit: 5,
91
+ minSalience: 0.4,
92
+ });
93
+ for (const m of commitmentMemories) {
94
+ pendingItems.push(m);
95
+ allMemories.set(m.id, m);
96
+ }
97
+ // 7. Procedural memories
98
+ const procedures = [];
99
+ const proceduralMemories = await vault.recall({
100
+ context: 'how to handle procedures lessons learned',
101
+ types: ['procedural'],
102
+ limit: 5,
103
+ minSalience: 0.3,
104
+ });
105
+ for (const m of proceduralMemories) {
106
+ procedures.push(m);
107
+ allMemories.set(m.id, m);
108
+ }
109
+ // Build the summary text
110
+ const summaryParts = [];
111
+ summaryParts.push(`# Session Briefing — ${when.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}`);
112
+ summaryParts.push('');
113
+ if (personContext.length > 0 && who) {
114
+ summaryParts.push(`## About ${who}`);
115
+ for (const m of personContext.slice(0, 5)) {
116
+ summaryParts.push(`- ${m.content}`);
117
+ }
118
+ summaryParts.push('');
119
+ }
120
+ if (recentInteractions.length > 0) {
121
+ summaryParts.push('## Recent Context');
122
+ for (const m of recentInteractions.slice(0, 5)) {
123
+ const age = timeSince(m.createdAt);
124
+ summaryParts.push(`- (${age}) ${m.summary || m.content.slice(0, 120)}`);
125
+ }
126
+ summaryParts.push('');
127
+ }
128
+ if (activeProjects.length > 0) {
129
+ summaryParts.push('## Active Topics');
130
+ for (const m of activeProjects.slice(0, 5)) {
131
+ summaryParts.push(`- ${m.content}`);
132
+ }
133
+ summaryParts.push('');
134
+ }
135
+ if (patterns.length > 0) {
136
+ summaryParts.push('## Patterns & Preferences');
137
+ for (const m of patterns.slice(0, 5)) {
138
+ summaryParts.push(`- ${m.content}`);
139
+ }
140
+ summaryParts.push('');
141
+ }
142
+ if (pendingItems.length > 0) {
143
+ summaryParts.push('## Pending Items');
144
+ for (const m of pendingItems) {
145
+ summaryParts.push(`- ${m.content}`);
146
+ }
147
+ summaryParts.push('');
148
+ }
149
+ if (procedures.length > 0) {
150
+ summaryParts.push('## Lessons & Procedures');
151
+ for (const m of procedures) {
152
+ summaryParts.push(`- ${m.content}`);
153
+ }
154
+ summaryParts.push('');
155
+ }
156
+ return {
157
+ summary: summaryParts.join('\n'),
158
+ personContext,
159
+ activeProjects: [...new Map(activeProjects.map(m => [m.id, m])).values()],
160
+ recentInteractions,
161
+ patterns,
162
+ pendingItems,
163
+ procedures,
164
+ allMemories: [...allMemories.values()].slice(0, maxMemories),
165
+ generatedAt: when.toISOString(),
166
+ };
167
+ }
168
+ function timeSince(iso) {
169
+ const ms = Date.now() - new Date(iso).getTime();
170
+ const mins = Math.floor(ms / 60000);
171
+ if (mins < 1)
172
+ return 'just now';
173
+ if (mins < 60)
174
+ return `${mins}m ago`;
175
+ const hours = Math.floor(mins / 60);
176
+ if (hours < 24)
177
+ return `${hours}h ago`;
178
+ const days = Math.floor(hours / 24);
179
+ if (days === 1)
180
+ return 'yesterday';
181
+ return `${days}d ago`;
182
+ }
183
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iDAAiD;AACjD,+DAA+D;AAC/D,EAAE;AACF,6DAA6D;AAC7D,kEAAkE;AAClE,6CAA6C;AAC7C,EAAE;AACF,SAAS;AACT,2EAA2E;AAyC3E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAY,EAAE,UAAwB,EAAE;IAClE,MAAM,EACJ,GAAG,EACH,IAAI,GAAG,IAAI,IAAI,EAAE,EACjB,YAAY,GAAG,EAAE,EACjB,cAAc,GAAG,EAAE,EACnB,WAAW,GAAG,EAAE,EAChB,eAAe,GAAG,IAAI,GACvB,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEnD,6CAA6C;IAC7C,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YACxC,OAAO,EAAE,SAAS,GAAG,EAAE;YACvB,QAAQ,EAAE,CAAC,GAAG,CAAC;YACf,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC5C,OAAO,EAAE,uCAAuC;QAChD,aAAa,EAAE,QAAQ;QACvB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,mBAAmB;IACnB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YACvC,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC,KAAK,CAAC;YACf,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YACxC,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,CAAC,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YACzC,OAAO,EAAE,0CAA0C;YACnD,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC5C,OAAO,EAAE,gDAAgD;QACzD,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC5C,OAAO,EAAE,0CAA0C;QACnD,KAAK,EAAE,CAAC,YAAY,CAAC;QACrB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,yBAAyB;IACzB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,YAAY,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACnJ,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEtB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACpC,YAAY,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,YAAY,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,aAAa;QACb,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACzE,kBAAkB;QAClB,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;QAC5D,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAChC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACnC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=claude-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-watcher.d.ts","sourceRoot":"","sources":["../src/claude-watcher.ts"],"names":[],"mappings":""}
@@ -0,0 +1,385 @@
1
+ #!/usr/bin/env node
2
+ // ============================================================
3
+ // Engram Claude Code Watcher — Passive memory ingestion
4
+ // ============================================================
5
+ //
6
+ // Watches Claude Code session transcripts and silently extracts
7
+ // memories into an Engram vault. No changes to the user's
8
+ // workflow — Engram learns in the background.
9
+ //
10
+ // Usage:
11
+ // node dist/claude-watcher.js # One-shot
12
+ // node dist/claude-watcher.js --watch # Watch mode
13
+ // ENGRAM_API=http://localhost:3800/v1 node dist/claude-watcher.js --watch
14
+ //
15
+ // State tracked in: ~/.config/engram/claude-watcher-state.json
16
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'fs';
17
+ import { join } from 'path';
18
+ import { homedir } from 'os';
19
+ // ============================================================
20
+ // Config
21
+ // ============================================================
22
+ const ENGRAM_API = process.env.ENGRAM_API ?? 'http://127.0.0.1:3800/v1';
23
+ const ENGRAM_AUTH = process.env.ENGRAM_AUTH_TOKEN ? `Bearer ${process.env.ENGRAM_AUTH_TOKEN}` : '';
24
+ const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
25
+ const CLAUDE_PROJECTS_DIR = join(homedir(), '.claude', 'projects');
26
+ const STATE_PATH = join(homedir(), '.config', 'engram', 'claude-watcher-state.json');
27
+ const MIN_CHUNK_SIZE = 200;
28
+ const MAX_CHUNK_SIZE = 4000;
29
+ const INTERVAL_MS = parseInt(process.env.ENGRAM_INGEST_INTERVAL_MS ?? '300000', 10); // 5 min default
30
+ function loadState() {
31
+ if (!existsSync(STATE_PATH))
32
+ return { lastLine: {}, lastRunAt: '' };
33
+ try {
34
+ return JSON.parse(readFileSync(STATE_PATH, 'utf-8'));
35
+ }
36
+ catch {
37
+ return { lastLine: {}, lastRunAt: '' };
38
+ }
39
+ }
40
+ function saveState(state) {
41
+ const dir = join(homedir(), '.config', 'engram');
42
+ if (!existsSync(dir)) {
43
+ const { mkdirSync } = require('fs');
44
+ mkdirSync(dir, { recursive: true });
45
+ }
46
+ writeFileSync(STATE_PATH, JSON.stringify(state, null, 2));
47
+ }
48
+ function findSessionFiles() {
49
+ if (!existsSync(CLAUDE_PROJECTS_DIR)) {
50
+ console.log('No Claude Code projects found at', CLAUDE_PROJECTS_DIR);
51
+ return [];
52
+ }
53
+ const files = [];
54
+ const projects = readdirSync(CLAUDE_PROJECTS_DIR);
55
+ for (const project of projects) {
56
+ const projectDir = join(CLAUDE_PROJECTS_DIR, project);
57
+ if (!statSync(projectDir).isDirectory())
58
+ continue;
59
+ const entries = readdirSync(projectDir);
60
+ for (const entry of entries) {
61
+ if (!entry.endsWith('.jsonl'))
62
+ continue;
63
+ // Skip subagent files
64
+ if (entry.includes('subagent') || entry.includes('compact'))
65
+ continue;
66
+ const fullPath = join(projectDir, entry);
67
+ const stat = statSync(fullPath);
68
+ const sessionId = entry.replace('.jsonl', '');
69
+ files.push({
70
+ path: fullPath,
71
+ project: project.replace(/-/g, '/').replace(/^\//, ''),
72
+ sessionId,
73
+ modifiedAt: stat.mtimeMs,
74
+ });
75
+ }
76
+ }
77
+ // Sort by modification time, newest first
78
+ return files.sort((a, b) => b.modifiedAt - a.modifiedAt);
79
+ }
80
+ function parseSessionFile(filePath, startLine) {
81
+ const content = readFileSync(filePath, 'utf-8');
82
+ const lines = content.split('\n').filter(l => l.trim());
83
+ const turns = [];
84
+ for (let i = startLine; i < lines.length; i++) {
85
+ try {
86
+ const entry = JSON.parse(lines[i]);
87
+ // Skip non-message entries
88
+ if (entry.type !== 'user' && entry.type !== 'assistant')
89
+ continue;
90
+ let text = '';
91
+ if (entry.type === 'user') {
92
+ // User messages: extract content from the message field
93
+ try {
94
+ const msg = typeof entry.message === 'string' ? JSON.parse(entry.message.replace(/'/g, '"')) : entry.message;
95
+ if (typeof msg.content === 'string') {
96
+ text = msg.content;
97
+ }
98
+ else if (Array.isArray(msg.content)) {
99
+ text = msg.content.filter((c) => c.type === 'text').map((c) => c.text).join('\n');
100
+ }
101
+ }
102
+ catch {
103
+ // If parsing fails, try to extract text directly
104
+ if (typeof entry.message === 'string') {
105
+ // Try to extract from the raw string
106
+ const match = entry.message.match(/'content':\s*'([^']*)'/);
107
+ if (match)
108
+ text = match[1];
109
+ }
110
+ }
111
+ }
112
+ else if (entry.type === 'assistant') {
113
+ // Assistant messages: extract text content
114
+ try {
115
+ const msg = typeof entry.message === 'string' ? JSON.parse(entry.message.replace(/'/g, '"')) : entry.message;
116
+ if (msg.content) {
117
+ const contents = Array.isArray(msg.content) ? msg.content : [msg.content];
118
+ text = contents
119
+ .filter((c) => c.type === 'text')
120
+ .map((c) => c.text)
121
+ .join('\n');
122
+ }
123
+ }
124
+ catch {
125
+ // Skip unparseable assistant messages
126
+ }
127
+ }
128
+ if (text.length > 20) {
129
+ turns.push({
130
+ role: entry.type,
131
+ content: text.slice(0, 2000), // Cap individual message length
132
+ project: '',
133
+ timestamp: entry.timestamp ?? new Date().toISOString(),
134
+ lineNumber: i,
135
+ });
136
+ }
137
+ }
138
+ catch {
139
+ // Skip malformed lines
140
+ }
141
+ }
142
+ return turns;
143
+ }
144
+ // ============================================================
145
+ // Chunk turns into conversation segments
146
+ // ============================================================
147
+ function chunkTurns(turns) {
148
+ const chunks = [];
149
+ let current = '';
150
+ for (const turn of turns) {
151
+ const line = `${turn.role === 'user' ? 'User' : 'Assistant'}: ${turn.content}\n`;
152
+ if (current.length + line.length > MAX_CHUNK_SIZE && current.length >= MIN_CHUNK_SIZE) {
153
+ chunks.push(current);
154
+ current = '';
155
+ }
156
+ current += line;
157
+ }
158
+ if (current.length >= MIN_CHUNK_SIZE) {
159
+ chunks.push(current);
160
+ }
161
+ return chunks;
162
+ }
163
+ // ============================================================
164
+ // Ingest via Engram API
165
+ // ============================================================
166
+ async function ingestChunk(chunk, project) {
167
+ // Try the realtime ingest endpoint first
168
+ const headers = { 'Content-Type': 'application/json' };
169
+ if (ENGRAM_AUTH)
170
+ headers['Authorization'] = ENGRAM_AUTH;
171
+ try {
172
+ const res = await fetch(`${ENGRAM_API}/ingest/realtime`, {
173
+ method: 'POST',
174
+ headers,
175
+ body: JSON.stringify({
176
+ text: `[Project: ${project}]\n${chunk}`,
177
+ }),
178
+ });
179
+ if (res.ok) {
180
+ const data = await res.json();
181
+ return data.created ?? 0;
182
+ }
183
+ // If realtime endpoint doesn't exist, fall back to direct remember
184
+ if (res.status === 404) {
185
+ const memRes = await fetch(`${ENGRAM_API}/memories`, {
186
+ method: 'POST',
187
+ headers,
188
+ body: JSON.stringify({
189
+ content: chunk.slice(0, 500),
190
+ type: 'episodic',
191
+ topics: ['claude-code', project],
192
+ source: { type: 'conversation' },
193
+ }),
194
+ });
195
+ return memRes.ok ? 1 : 0;
196
+ }
197
+ return 0;
198
+ }
199
+ catch (err) {
200
+ console.error('Ingest error:', err);
201
+ return 0;
202
+ }
203
+ }
204
+ // ============================================================
205
+ // Smart session summary extraction
206
+ // ============================================================
207
+ async function ingestSessionSummary(turns, project) {
208
+ // Build a condensed transcript (cap at 6000 chars to save tokens)
209
+ let transcript = '';
210
+ for (const turn of turns) {
211
+ const prefix = turn.role === 'user' ? 'User' : 'Assistant';
212
+ const content = turn.content.slice(0, 500);
213
+ transcript += `${prefix}: ${content}\n`;
214
+ if (transcript.length > 6000)
215
+ break;
216
+ }
217
+ const prompt = `You are a memory extraction engine. Analyze this Claude Code session and extract the 3-7 most important things worth remembering long-term.
218
+
219
+ PROJECT: ${project}
220
+
221
+ SESSION TRANSCRIPT:
222
+ ${transcript}
223
+
224
+ Focus on:
225
+ - Decisions made (architecture, tools, approaches chosen)
226
+ - Facts learned about the user's preferences or workflow
227
+ - Project-specific patterns or conventions
228
+ - Problems solved and how
229
+ - Commitments or next steps mentioned
230
+
231
+ Skip: trivial commands, routine file edits, debugging noise, generic code generation.
232
+
233
+ For each memory, provide:
234
+ - content: A clear, standalone statement (should make sense weeks later without context)
235
+ - type: "semantic" (facts/patterns), "episodic" (specific events/decisions), or "procedural" (how-to/lessons)
236
+ - entities: People, projects, tools mentioned
237
+ - topics: Relevant tags
238
+ - salience: 0.3-1.0 (how important?)
239
+
240
+ Respond as JSON:
241
+ {"memories": [{"content": "...", "type": "...", "entities": ["..."], "topics": ["..."], "salience": 0.5}]}
242
+
243
+ If the session is trivial (just fixing typos, running commands), respond: {"memories": []}`;
244
+ try {
245
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}`, {
246
+ method: 'POST',
247
+ headers: { 'Content-Type': 'application/json' },
248
+ body: JSON.stringify({
249
+ contents: [{ parts: [{ text: prompt }] }],
250
+ generationConfig: { responseMimeType: 'application/json', maxOutputTokens: 2048 },
251
+ }),
252
+ });
253
+ if (!response.ok) {
254
+ if (response.status === 429) {
255
+ console.warn(` Rate limited, waiting 15s...`);
256
+ await new Promise(r => setTimeout(r, 15000));
257
+ // Don't retry — will pick up on next cycle
258
+ }
259
+ else {
260
+ console.error(` Gemini API error: ${response.status}`);
261
+ }
262
+ return 0;
263
+ }
264
+ const data = await response.json();
265
+ const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? '{}';
266
+ const parsed = JSON.parse(text);
267
+ const headers = { 'Content-Type': 'application/json' };
268
+ if (ENGRAM_AUTH)
269
+ headers['Authorization'] = ENGRAM_AUTH;
270
+ let created = 0;
271
+ for (const mem of parsed.memories ?? []) {
272
+ if (mem.salience < 0.2)
273
+ continue;
274
+ // Security filter
275
+ if (/(?:sk-|api[_-]?key|password|token|secret)[:\s=]+\S{10,}/i.test(mem.content))
276
+ continue;
277
+ if (/AIza[a-zA-Z0-9_-]{30,}/.test(mem.content))
278
+ continue;
279
+ const res = await fetch(`${ENGRAM_API}/memories`, {
280
+ method: 'POST',
281
+ headers,
282
+ body: JSON.stringify({
283
+ content: mem.content,
284
+ type: mem.type ?? 'episodic',
285
+ entities: mem.entities ?? [],
286
+ topics: [...(mem.topics ?? []), 'claude-code', project.split('/').pop() ?? project],
287
+ salience: mem.salience ?? 0.5,
288
+ status: 'active',
289
+ source: { type: 'conversation' },
290
+ }),
291
+ });
292
+ if (res.ok)
293
+ created++;
294
+ }
295
+ console.log(` → ${created} memories (summary mode)`);
296
+ return created;
297
+ }
298
+ catch (err) {
299
+ console.error('Session summary error:', err);
300
+ return 0;
301
+ }
302
+ }
303
+ // ============================================================
304
+ // Main
305
+ // ============================================================
306
+ async function run() {
307
+ const state = loadState();
308
+ const sessions = findSessionFiles();
309
+ // Only process sessions modified in the last 7 days
310
+ const recentCutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
311
+ const recent = sessions.filter(s => s.modifiedAt > recentCutoff);
312
+ let totalCreated = 0;
313
+ let sessionsProcessed = 0;
314
+ for (const session of recent) {
315
+ const startLine = state.lastLine[session.path] ?? 0;
316
+ const turns = parseSessionFile(session.path, startLine);
317
+ if (turns.length === 0)
318
+ continue;
319
+ console.log(`Processing ${session.project} (${turns.length} new turns)...`);
320
+ sessionsProcessed++;
321
+ // Smart mode: if we have Gemini, send the whole session as one summary request
322
+ // instead of chunking raw text. Much better signal-to-noise.
323
+ if (GEMINI_API_KEY && turns.length >= 3) {
324
+ const created = await ingestSessionSummary(turns, session.project);
325
+ totalCreated += created;
326
+ // Update state
327
+ const lastLine = turns[turns.length - 1].lineNumber + 1;
328
+ state.lastLine[session.path] = lastLine;
329
+ await new Promise(r => setTimeout(r, 5000)); // rate limit between sessions
330
+ continue;
331
+ }
332
+ // Fallback: chunk-based ingestion
333
+ const chunks = chunkTurns(turns);
334
+ for (let i = 0; i < chunks.length; i++) {
335
+ const created = await ingestChunk(chunks[i], session.project);
336
+ totalCreated += created;
337
+ // Rate limit between chunks
338
+ if (i < chunks.length - 1) {
339
+ await new Promise(r => setTimeout(r, 5000));
340
+ }
341
+ }
342
+ // Update state
343
+ const lastLine = turns[turns.length - 1].lineNumber + 1;
344
+ state.lastLine[session.path] = lastLine;
345
+ }
346
+ state.lastRunAt = new Date().toISOString();
347
+ saveState(state);
348
+ return { memoriesCreated: totalCreated, sessions: sessionsProcessed };
349
+ }
350
+ // ============================================================
351
+ // Entry point
352
+ // ============================================================
353
+ const isWatch = process.argv.includes('--watch');
354
+ if (isWatch) {
355
+ const mins = Math.round(INTERVAL_MS / 60000);
356
+ console.log(`🧠 Engram Claude Code watcher (every ${mins} min)`);
357
+ console.log(` Watching: ${CLAUDE_PROJECTS_DIR}`);
358
+ console.log(` API: ${ENGRAM_API}`);
359
+ let running = false;
360
+ const tick = async () => {
361
+ if (running)
362
+ return;
363
+ running = true;
364
+ try {
365
+ const result = await run();
366
+ if (result.memoriesCreated > 0) {
367
+ console.log(` ✓ ${result.memoriesCreated} memories from ${result.sessions} sessions at ${new Date().toLocaleTimeString()}`);
368
+ }
369
+ }
370
+ catch (err) {
371
+ console.error('Watcher error:', err);
372
+ }
373
+ finally {
374
+ running = false;
375
+ }
376
+ };
377
+ tick();
378
+ setInterval(tick, INTERVAL_MS);
379
+ }
380
+ else {
381
+ run().then(result => {
382
+ console.log(`Done. ${result.memoriesCreated} memories from ${result.sessions} sessions.`);
383
+ }).catch(console.error);
384
+ }
385
+ //# sourceMappingURL=claude-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-watcher.js","sourceRoot":"","sources":["../src/claude-watcher.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}