@jcmrs/opencode-vmem 1.0.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 (140) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/LICENSE +21 -0
  3. package/README.md +172 -0
  4. package/dist/capture/classification.d.ts +37 -0
  5. package/dist/capture/classification.d.ts.map +1 -0
  6. package/dist/capture/classification.js +181 -0
  7. package/dist/capture/classification.js.map +1 -0
  8. package/dist/capture/filtering.d.ts +63 -0
  9. package/dist/capture/filtering.d.ts.map +1 -0
  10. package/dist/capture/filtering.js +195 -0
  11. package/dist/capture/filtering.js.map +1 -0
  12. package/dist/capture/observation.d.ts +28 -0
  13. package/dist/capture/observation.d.ts.map +1 -0
  14. package/dist/capture/observation.js +188 -0
  15. package/dist/capture/observation.js.map +1 -0
  16. package/dist/commands/index.d.ts +38 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +375 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +41 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/context/builder.d.ts +19 -0
  25. package/dist/context/builder.d.ts.map +1 -0
  26. package/dist/context/builder.js +209 -0
  27. package/dist/context/builder.js.map +1 -0
  28. package/dist/context/format.d.ts +32 -0
  29. package/dist/context/format.d.ts.map +1 -0
  30. package/dist/context/format.js +211 -0
  31. package/dist/context/format.js.map +1 -0
  32. package/dist/embedding/index.d.ts +3 -0
  33. package/dist/embedding/index.d.ts.map +1 -0
  34. package/dist/embedding/index.js +3 -0
  35. package/dist/embedding/index.js.map +1 -0
  36. package/dist/embedding/provider.d.ts +15 -0
  37. package/dist/embedding/provider.d.ts.map +1 -0
  38. package/dist/embedding/provider.js +19 -0
  39. package/dist/embedding/provider.js.map +1 -0
  40. package/dist/embedding/transformers.d.ts +14 -0
  41. package/dist/embedding/transformers.d.ts.map +1 -0
  42. package/dist/embedding/transformers.js +55 -0
  43. package/dist/embedding/transformers.js.map +1 -0
  44. package/dist/extract/confidence.d.ts +48 -0
  45. package/dist/extract/confidence.d.ts.map +1 -0
  46. package/dist/extract/confidence.js +230 -0
  47. package/dist/extract/confidence.js.map +1 -0
  48. package/dist/extract/llm-extractor.d.ts +35 -0
  49. package/dist/extract/llm-extractor.d.ts.map +1 -0
  50. package/dist/extract/llm-extractor.js +204 -0
  51. package/dist/extract/llm-extractor.js.map +1 -0
  52. package/dist/extract/pipeline.d.ts +44 -0
  53. package/dist/extract/pipeline.d.ts.map +1 -0
  54. package/dist/extract/pipeline.js +171 -0
  55. package/dist/extract/pipeline.js.map +1 -0
  56. package/dist/extract/rules-engine.d.ts +14 -0
  57. package/dist/extract/rules-engine.d.ts.map +1 -0
  58. package/dist/extract/rules-engine.js +314 -0
  59. package/dist/extract/rules-engine.js.map +1 -0
  60. package/dist/extract/summarizer.d.ts +27 -0
  61. package/dist/extract/summarizer.d.ts.map +1 -0
  62. package/dist/extract/summarizer.js +148 -0
  63. package/dist/extract/summarizer.js.map +1 -0
  64. package/dist/hooks/session-idle.d.ts +38 -0
  65. package/dist/hooks/session-idle.d.ts.map +1 -0
  66. package/dist/hooks/session-idle.js +142 -0
  67. package/dist/hooks/session-idle.js.map +1 -0
  68. package/dist/hooks/system-transform.d.ts +41 -0
  69. package/dist/hooks/system-transform.d.ts.map +1 -0
  70. package/dist/hooks/system-transform.js +98 -0
  71. package/dist/hooks/system-transform.js.map +1 -0
  72. package/dist/hooks/tool-after.d.ts +66 -0
  73. package/dist/hooks/tool-after.d.ts.map +1 -0
  74. package/dist/hooks/tool-after.js +155 -0
  75. package/dist/hooks/tool-after.js.map +1 -0
  76. package/dist/index.d.ts +10 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +10 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mind.d.ts +69 -0
  81. package/dist/mind.d.ts.map +1 -0
  82. package/dist/mind.js +368 -0
  83. package/dist/mind.js.map +1 -0
  84. package/dist/procedural/index.d.ts +4 -0
  85. package/dist/procedural/index.d.ts.map +1 -0
  86. package/dist/procedural/index.js +4 -0
  87. package/dist/procedural/index.js.map +1 -0
  88. package/dist/procedural/induction.d.ts +23 -0
  89. package/dist/procedural/induction.d.ts.map +1 -0
  90. package/dist/procedural/induction.js +104 -0
  91. package/dist/procedural/induction.js.map +1 -0
  92. package/dist/procedural/miner.d.ts +45 -0
  93. package/dist/procedural/miner.d.ts.map +1 -0
  94. package/dist/procedural/miner.js +171 -0
  95. package/dist/procedural/miner.js.map +1 -0
  96. package/dist/procedural/suggester.d.ts +20 -0
  97. package/dist/procedural/suggester.d.ts.map +1 -0
  98. package/dist/procedural/suggester.js +69 -0
  99. package/dist/procedural/suggester.js.map +1 -0
  100. package/dist/store/archive.d.ts +31 -0
  101. package/dist/store/archive.d.ts.map +1 -0
  102. package/dist/store/archive.js +137 -0
  103. package/dist/store/archive.js.map +1 -0
  104. package/dist/store/backup.d.ts +36 -0
  105. package/dist/store/backup.d.ts.map +1 -0
  106. package/dist/store/backup.js +163 -0
  107. package/dist/store/backup.js.map +1 -0
  108. package/dist/store/memorycards.d.ts +31 -0
  109. package/dist/store/memorycards.d.ts.map +1 -0
  110. package/dist/store/memorycards.js +161 -0
  111. package/dist/store/memorycards.js.map +1 -0
  112. package/dist/store/mv2-adapter.d.ts +29 -0
  113. package/dist/store/mv2-adapter.d.ts.map +1 -0
  114. package/dist/store/mv2-adapter.js +359 -0
  115. package/dist/store/mv2-adapter.js.map +1 -0
  116. package/dist/store/procedures.d.ts +79 -0
  117. package/dist/store/procedures.d.ts.map +1 -0
  118. package/dist/store/procedures.js +183 -0
  119. package/dist/store/procedures.js.map +1 -0
  120. package/dist/store/tombstone.d.ts +27 -0
  121. package/dist/store/tombstone.d.ts.map +1 -0
  122. package/dist/store/tombstone.js +136 -0
  123. package/dist/store/tombstone.js.map +1 -0
  124. package/dist/tools/index.d.ts +36 -0
  125. package/dist/tools/index.d.ts.map +1 -0
  126. package/dist/tools/index.js +236 -0
  127. package/dist/tools/index.js.map +1 -0
  128. package/dist/types.d.ts +301 -0
  129. package/dist/types.d.ts.map +1 -0
  130. package/dist/types.js +69 -0
  131. package/dist/types.js.map +1 -0
  132. package/dist/utils/error.d.ts +57 -0
  133. package/dist/utils/error.d.ts.map +1 -0
  134. package/dist/utils/error.js +143 -0
  135. package/dist/utils/error.js.map +1 -0
  136. package/dist/utils/uuid.d.ts +2 -0
  137. package/dist/utils/uuid.d.ts.map +1 -0
  138. package/dist/utils/uuid.js +5 -0
  139. package/dist/utils/uuid.js.map +1 -0
  140. package/package.json +67 -0
@@ -0,0 +1,148 @@
1
+ export class ContextSummarizer {
2
+ config;
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ getConfig() {
7
+ return this.config;
8
+ }
9
+ async summarize(input) {
10
+ if (input.observations.length === 0 && input.memoryCards.length === 0) {
11
+ return {
12
+ summary: '',
13
+ tokenCount: 0,
14
+ keyPoints: [],
15
+ entities: [],
16
+ confidence: 1
17
+ };
18
+ }
19
+ const textContent = this.buildTextContent(input);
20
+ const estimatedTokens = this.estimateTokens(textContent);
21
+ if (estimatedTokens <= input.maxTokens) {
22
+ return {
23
+ summary: textContent,
24
+ tokenCount: estimatedTokens,
25
+ keyPoints: this.extractKeyPoints(input),
26
+ entities: this.extractEntities(input),
27
+ confidence: 1
28
+ };
29
+ }
30
+ const compressionRatio = input.maxTokens / estimatedTokens;
31
+ const compressed = this.compressContent(textContent, compressionRatio, input);
32
+ return {
33
+ summary: compressed,
34
+ tokenCount: this.estimateTokens(compressed),
35
+ keyPoints: this.extractKeyPoints(input),
36
+ entities: this.extractEntities(input),
37
+ confidence: Math.min(compressionRatio + 0.3, 1)
38
+ };
39
+ }
40
+ buildTextContent(input) {
41
+ const parts = [];
42
+ if (input.memoryCards.length > 0) {
43
+ const cardsByEntity = this.groupBy(input.memoryCards, 'entity');
44
+ parts.push('## Memory Cards\n');
45
+ for (const [entity, cards] of Object.entries(cardsByEntity)) {
46
+ parts.push(`### ${entity}`);
47
+ for (const card of cards) {
48
+ parts.push(`- ${card.slot}: ${card.value}`);
49
+ }
50
+ parts.push('');
51
+ }
52
+ }
53
+ if (input.observations.length > 0) {
54
+ parts.push('## Recent Observations\n');
55
+ const byType = this.groupBy(input.observations, 'type');
56
+ for (const [type, obs] of Object.entries(byType)) {
57
+ parts.push(`### ${type}`);
58
+ for (const o of obs.slice(0, 10)) {
59
+ parts.push(`- [${new Date(o.timestamp).toLocaleDateString()}] ${o.content.slice(0, 150)}`);
60
+ }
61
+ parts.push('');
62
+ }
63
+ }
64
+ return parts.join('\n');
65
+ }
66
+ compressContent(content, ratio, _input) {
67
+ const targetLines = Math.floor(content.split('\n').length * ratio);
68
+ const lines = content.split('\n');
69
+ const sections = [];
70
+ let currentSection = [];
71
+ for (const line of lines) {
72
+ if (line.startsWith('##')) {
73
+ if (currentSection.length > 0) {
74
+ sections.push(currentSection);
75
+ }
76
+ currentSection = [line];
77
+ }
78
+ else {
79
+ currentSection.push(line);
80
+ }
81
+ }
82
+ if (currentSection.length > 0) {
83
+ sections.push(currentSection);
84
+ }
85
+ const selectedSections = [];
86
+ let currentLines = 0;
87
+ for (const section of sections) {
88
+ if (currentLines + section.length <= targetLines) {
89
+ selectedSections.push(section.join('\n'));
90
+ currentLines += section.length;
91
+ }
92
+ else {
93
+ const remaining = targetLines - currentLines;
94
+ if (remaining > 3) {
95
+ selectedSections.push(section.slice(0, remaining).join('\n'));
96
+ }
97
+ break;
98
+ }
99
+ }
100
+ return selectedSections.join('\n\n');
101
+ }
102
+ extractKeyPoints(input) {
103
+ const points = [];
104
+ for (const card of input.memoryCards) {
105
+ if (card.kind === 'fact' || card.kind === 'goal') {
106
+ points.push(`${card.entity}: ${card.slot} = ${card.value}`);
107
+ }
108
+ }
109
+ for (const obs of input.observations) {
110
+ if (obs.type === 'decision') {
111
+ points.push(obs.content.slice(0, 100));
112
+ }
113
+ }
114
+ return [...new Set(points)].slice(0, 10);
115
+ }
116
+ extractEntities(input) {
117
+ const entities = new Set();
118
+ for (const card of input.memoryCards) {
119
+ entities.add(card.entity);
120
+ }
121
+ for (const obs of input.observations) {
122
+ const words = obs.content.split(/\s+/);
123
+ for (const word of words) {
124
+ if (word.length > 3 && /^[A-Z]/.test(word)) {
125
+ entities.add(word.replace(/[^a-zA-Z]/g, ''));
126
+ }
127
+ }
128
+ }
129
+ return [...entities].filter(e => e.length > 2).slice(0, 20);
130
+ }
131
+ estimateTokens(text) {
132
+ return Math.ceil(text.length / 4);
133
+ }
134
+ groupBy(items, key) {
135
+ const result = {};
136
+ for (const item of items) {
137
+ const k = String(item[key]);
138
+ if (!result[k])
139
+ result[k] = [];
140
+ result[k].push(item);
141
+ }
142
+ return result;
143
+ }
144
+ }
145
+ export function createSummarizer(config) {
146
+ return new ContextSummarizer(config);
147
+ }
148
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/extract/summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { Mind } from '../mind.js';
2
+ export interface SessionIdleHookConfig {
3
+ enabled: boolean;
4
+ minObservations: number;
5
+ maxObservations: number;
6
+ maxProcessingTimeMs: number;
7
+ enableMining: boolean;
8
+ minMiningObservations: number;
9
+ }
10
+ export declare class SessionIdleHook {
11
+ private mind;
12
+ private pipeline;
13
+ private config;
14
+ private processedFrameIds;
15
+ private lastExtractionTime;
16
+ private lastMiningTime;
17
+ constructor(mind: Mind, config?: Partial<SessionIdleHookConfig>);
18
+ handle(): Promise<SessionIdleResult>;
19
+ private getUnprocessedObservations;
20
+ private observationToContext;
21
+ getProcessedCount(): number;
22
+ getLastExtractionTime(): number;
23
+ getLastMiningTime(): number;
24
+ reset(): void;
25
+ }
26
+ export interface SessionIdleResult {
27
+ extracted: number;
28
+ flagged: number;
29
+ minedProcedures: number;
30
+ errors: Array<{
31
+ source: string;
32
+ error: string;
33
+ }>;
34
+ processingTimeMs: number;
35
+ skipped: boolean;
36
+ }
37
+ export declare function createSessionIdleHook(mind: Mind, config?: Partial<SessionIdleHookConfig>): SessionIdleHook;
38
+ //# sourceMappingURL=session-idle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-idle.d.ts","sourceRoot":"","sources":["../../src/hooks/session-idle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIlC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAWD,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;gBAEnB,IAAI,EAAE,IAAI,EAAE,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAS7D,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC;YAgG5B,0BAA0B;IAMxC,OAAO,CAAC,oBAAoB;IAa5B,iBAAiB,IAAI,MAAM;IAI3B,qBAAqB,IAAI,MAAM;IAI/B,iBAAiB,IAAI,MAAM;IAI3B,KAAK,IAAI,IAAI;CAKd;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,eAAe,CAEjB"}
@@ -0,0 +1,142 @@
1
+ import { createPipeline } from '../extract/pipeline.js';
2
+ const DEFAULT_CONFIG = {
3
+ enabled: true,
4
+ minObservations: 3,
5
+ maxObservations: 50,
6
+ maxProcessingTimeMs: 5000,
7
+ enableMining: true,
8
+ minMiningObservations: 10
9
+ };
10
+ export class SessionIdleHook {
11
+ mind;
12
+ pipeline;
13
+ config;
14
+ processedFrameIds;
15
+ lastExtractionTime;
16
+ lastMiningTime;
17
+ constructor(mind, config = {}) {
18
+ this.mind = mind;
19
+ this.config = { ...DEFAULT_CONFIG, ...config };
20
+ this.pipeline = createPipeline(mind.getConfig());
21
+ this.processedFrameIds = new Set();
22
+ this.lastExtractionTime = 0;
23
+ this.lastMiningTime = 0;
24
+ }
25
+ async handle() {
26
+ const startTime = Date.now();
27
+ const result = {
28
+ extracted: 0,
29
+ flagged: 0,
30
+ minedProcedures: 0,
31
+ errors: [],
32
+ processingTimeMs: 0,
33
+ skipped: false
34
+ };
35
+ if (!this.config.enabled) {
36
+ result.skipped = true;
37
+ result.errors.push({ source: 'hook', error: 'Session idle hook disabled' });
38
+ return result;
39
+ }
40
+ try {
41
+ const observations = await this.getUnprocessedObservations();
42
+ if (observations.length < this.config.minObservations) {
43
+ result.skipped = true;
44
+ result.errors.push({
45
+ source: 'hook',
46
+ error: `Not enough observations (${observations.length} < ${this.config.minObservations})`
47
+ });
48
+ return result;
49
+ }
50
+ const ctxs = observations.map(obs => this.observationToContext(obs));
51
+ const pipelineResults = await this.pipeline.extractBatch(ctxs);
52
+ let totalExtracted = 0;
53
+ let totalFlagged = 0;
54
+ for (const pr of pipelineResults) {
55
+ totalExtracted += pr.cards.length;
56
+ totalFlagged += pr.stats.cardsFlagged;
57
+ for (const card of pr.cards) {
58
+ try {
59
+ await this.mind.addMemoryCard({
60
+ entity: card.entity,
61
+ slot: card.slot,
62
+ value: card.value,
63
+ kind: card.kind,
64
+ confidence: card.confidence,
65
+ sourceObservationId: card.sourceObservationId
66
+ });
67
+ }
68
+ catch (error) {
69
+ result.errors.push({
70
+ source: 'storage',
71
+ error: `Failed to store card: ${error instanceof Error ? error.message : String(error)}`
72
+ });
73
+ }
74
+ }
75
+ }
76
+ for (const obs of observations) {
77
+ this.processedFrameIds.add(obs.frameId);
78
+ }
79
+ result.extracted = totalExtracted;
80
+ result.flagged = totalFlagged;
81
+ this.lastExtractionTime = Date.now();
82
+ if (this.config.enableMining && observations.length >= this.config.minMiningObservations) {
83
+ try {
84
+ const procedureIds = await this.mind.mineProcedures();
85
+ result.minedProcedures = procedureIds.length;
86
+ this.lastMiningTime = Date.now();
87
+ }
88
+ catch (error) {
89
+ result.errors.push({
90
+ source: 'mining',
91
+ error: `Mining failed: ${error instanceof Error ? error.message : String(error)}`
92
+ });
93
+ }
94
+ }
95
+ }
96
+ catch (error) {
97
+ result.errors.push({
98
+ source: 'pipeline',
99
+ error: error instanceof Error ? error.message : String(error)
100
+ });
101
+ }
102
+ result.processingTimeMs = Date.now() - startTime;
103
+ if (result.processingTimeMs > this.config.maxProcessingTimeMs) {
104
+ console.warn(`[vmem] SessionIdleHook took ${result.processingTimeMs}ms (budget: ${this.config.maxProcessingTimeMs}ms)`);
105
+ }
106
+ return result;
107
+ }
108
+ async getUnprocessedObservations() {
109
+ const observations = await this.mind.getRecent(this.config.maxObservations);
110
+ return observations.filter(obs => !this.processedFrameIds.has(obs.frameId));
111
+ }
112
+ observationToContext(obs) {
113
+ return {
114
+ frameId: obs.frameId,
115
+ sourceUri: obs.metadata?.projectPath || '',
116
+ text: obs.content,
117
+ title: undefined,
118
+ input: obs.input,
119
+ output: obs.output,
120
+ metadata: obs.metadata,
121
+ timestamp: obs.timestamp
122
+ };
123
+ }
124
+ getProcessedCount() {
125
+ return this.processedFrameIds.size;
126
+ }
127
+ getLastExtractionTime() {
128
+ return this.lastExtractionTime;
129
+ }
130
+ getLastMiningTime() {
131
+ return this.lastMiningTime;
132
+ }
133
+ reset() {
134
+ this.processedFrameIds.clear();
135
+ this.lastExtractionTime = 0;
136
+ this.lastMiningTime = 0;
137
+ }
138
+ }
139
+ export function createSessionIdleHook(mind, config) {
140
+ return new SessionIdleHook(mind, config);
141
+ }
142
+ //# sourceMappingURL=session-idle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-idle.js","sourceRoot":"","sources":["../../src/hooks/session-idle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { Mind } from '../mind.js';
2
+ import { OutputFormat } from '../context/format.js';
3
+ export interface SystemTransformInput {
4
+ sessionId: string;
5
+ messages: Array<{
6
+ role: string;
7
+ content: string;
8
+ }>;
9
+ }
10
+ export interface SystemTransformOutput {
11
+ system?: string;
12
+ prepend?: string;
13
+ append?: string;
14
+ }
15
+ export interface SystemTransformHookConfig {
16
+ enabled: boolean;
17
+ maxTokens: number;
18
+ format: OutputFormat;
19
+ includeObservations: boolean;
20
+ includeMemoryCards: boolean;
21
+ includeSessionSummary: boolean;
22
+ prependSeparator: string;
23
+ }
24
+ export declare class SystemTransformHook {
25
+ private mind;
26
+ private config;
27
+ private formatter;
28
+ constructor(mind: Mind, config?: Partial<SystemTransformHookConfig>);
29
+ handle(_input: SystemTransformInput, output: SystemTransformOutput): Promise<void>;
30
+ private formatSessionSummary;
31
+ setEnabled(enabled: boolean): void;
32
+ isEnabled(): boolean;
33
+ setMaxTokens(maxTokens: number): void;
34
+ getMaxTokens(): number;
35
+ setFormat(format: OutputFormat): void;
36
+ getFormat(): OutputFormat;
37
+ getConfig(): SystemTransformHookConfig;
38
+ setConfig(config: Partial<SystemTransformHookConfig>): void;
39
+ }
40
+ export declare function createSystemTransformHook(mind: Mind, config?: Partial<SystemTransformHookConfig>): SystemTransformHook;
41
+ //# sourceMappingURL=system-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-transform.d.ts","sourceRoot":"","sources":["../../src/hooks/system-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAM7D,MAAM,CACV,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAgChB,OAAO,CAAC,oBAAoB;IA+B5B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,SAAS,IAAI,OAAO;IAIpB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,YAAY,IAAI,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAKrC,SAAS,IAAI,YAAY;IAIzB,SAAS,IAAI,yBAAyB;IAItC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI;CAI5D;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC1C,mBAAmB,CAErB"}
@@ -0,0 +1,98 @@
1
+ import { OutputFormatter } from '../context/format.js';
2
+ const DEFAULT_CONFIG = {
3
+ enabled: true,
4
+ maxTokens: 3000,
5
+ format: 'markdown',
6
+ includeObservations: true,
7
+ includeMemoryCards: true,
8
+ includeSessionSummary: true,
9
+ prependSeparator: '\n\n---\n\n'
10
+ };
11
+ export class SystemTransformHook {
12
+ mind;
13
+ config;
14
+ formatter;
15
+ constructor(mind, config) {
16
+ this.mind = mind;
17
+ this.config = { ...DEFAULT_CONFIG, ...config };
18
+ this.formatter = new OutputFormatter({ format: this.config.format });
19
+ }
20
+ async handle(_input, output) {
21
+ if (!this.config.enabled) {
22
+ return;
23
+ }
24
+ try {
25
+ const contextOptions = {
26
+ maxTokens: this.config.maxTokens,
27
+ includeObservations: this.config.includeObservations,
28
+ includeMemoryCards: this.config.includeMemoryCards,
29
+ format: this.config.format
30
+ };
31
+ const contextBlock = await this.mind.buildContext(contextOptions);
32
+ let contextContent = contextBlock.content;
33
+ if (this.config.includeSessionSummary) {
34
+ const session = this.mind.getSession();
35
+ if (session?.summary) {
36
+ contextContent += this.formatSessionSummary(session.summary);
37
+ }
38
+ }
39
+ output.prepend = contextContent + this.config.prependSeparator;
40
+ }
41
+ catch (error) {
42
+ console.error('[vmem] SystemTransformHook error:', error);
43
+ output.prepend = undefined;
44
+ }
45
+ }
46
+ formatSessionSummary(summary) {
47
+ const sections = ['\n\n### Session Summary\n'];
48
+ if (summary.keyDecisions.length > 0) {
49
+ sections.push('\n**Key Decisions:**');
50
+ for (const decision of summary.keyDecisions.slice(0, 5)) {
51
+ sections.push(`- ${decision}`);
52
+ }
53
+ }
54
+ if (summary.preferencesLearned.length > 0) {
55
+ sections.push('\n**Preferences Learned:**');
56
+ for (const pref of summary.preferencesLearned.slice(0, 5)) {
57
+ sections.push(`- ${pref}`);
58
+ }
59
+ }
60
+ if (summary.goalsIdentified.length > 0) {
61
+ sections.push('\n**Goals Identified:**');
62
+ for (const goal of summary.goalsIdentified.slice(0, 5)) {
63
+ sections.push(`- ${goal}`);
64
+ }
65
+ }
66
+ return sections.join('\n');
67
+ }
68
+ setEnabled(enabled) {
69
+ this.config.enabled = enabled;
70
+ }
71
+ isEnabled() {
72
+ return this.config.enabled;
73
+ }
74
+ setMaxTokens(maxTokens) {
75
+ this.config.maxTokens = maxTokens;
76
+ }
77
+ getMaxTokens() {
78
+ return this.config.maxTokens;
79
+ }
80
+ setFormat(format) {
81
+ this.config.format = format;
82
+ this.formatter.setFormat(format);
83
+ }
84
+ getFormat() {
85
+ return this.config.format;
86
+ }
87
+ getConfig() {
88
+ return { ...this.config };
89
+ }
90
+ setConfig(config) {
91
+ this.config = { ...this.config, ...config };
92
+ this.formatter = new OutputFormatter({ format: this.config.format });
93
+ }
94
+ }
95
+ export function createSystemTransformHook(mind, config) {
96
+ return new SystemTransformHook(mind, config);
97
+ }
98
+ //# sourceMappingURL=system-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-transform.js","sourceRoot":"","sources":["../../src/hooks/system-transform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAuBrE,MAAM,cAAc,GAA8B;IAChD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,UAAU;IAClB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,IAAI;IAC3B,gBAAgB,EAAE,aAAa;CAChC,CAAC;AAEF,MAAM,OAAO,mBAAmB;IACtB,IAAI,CAAO;IACX,MAAM,CAA4B;IAClC,SAAS,CAAkB;IAEnC,YAAY,IAAU,EAAE,MAA2C;QACjE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAA4B,EAC5B,MAA6B;QAE7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAA4B;gBAC9C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;gBACpD,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;gBAClD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAC3B,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAElE,IAAI,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC;YAE1C,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvC,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;oBACrB,cAAc,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,MAAM,CAAC,OAAO,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAEjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,OAI5B;QACC,MAAM,QAAQ,GAAa,CAAC,2BAA2B,CAAC,CAAC;QAEzD,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1D,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvD,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,MAAoB;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,MAA0C;QAClD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAU,EACV,MAA2C;IAE3C,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * tool.execute.after hook
3
+ *
4
+ * Captures observations after tool execution.
5
+ */
6
+ import { Mind } from '../mind.js';
7
+ export interface ToolExecuteAfterInput {
8
+ tool: string;
9
+ args: Record<string, unknown>;
10
+ context?: {
11
+ sessionId?: string;
12
+ projectPath?: string;
13
+ };
14
+ }
15
+ export interface ToolExecuteAfterOutput {
16
+ result: unknown;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ export interface ToolAfterHookConfig {
20
+ /** Tools to observe (default: read, write, edit, bash, grep, glob) */
21
+ observedTools?: string[];
22
+ /** Minimum output length to capture (default: 10) */
23
+ minOutputLength?: number;
24
+ /** Maximum processing time in ms (default: 50) */
25
+ maxProcessingTimeMs?: number;
26
+ /** Whether to classify observations (default: true) */
27
+ classifyObservations?: boolean;
28
+ /** Tools to skip entirely */
29
+ skipTools?: string[];
30
+ }
31
+ /**
32
+ * Tool execution after hook handler
33
+ */
34
+ export declare class ToolAfterHook {
35
+ private mind;
36
+ private config;
37
+ private filter;
38
+ private sessionId;
39
+ private projectPath;
40
+ constructor(mind: Mind, config?: Partial<ToolAfterHookConfig>);
41
+ /**
42
+ * Handle tool.execute.after hook
43
+ */
44
+ handle(input: ToolExecuteAfterInput, output: ToolExecuteAfterOutput): Promise<void>;
45
+ /**
46
+ * Check if tool should be observed
47
+ */
48
+ private shouldObserve;
49
+ /**
50
+ * Build capture input from hook data
51
+ */
52
+ private buildCaptureInput;
53
+ /**
54
+ * Classify an observation
55
+ */
56
+ private classifyObservation;
57
+ /**
58
+ * Update session ID (call when session changes)
59
+ */
60
+ updateSession(sessionId: string): void;
61
+ }
62
+ /**
63
+ * Create tool.after hook handler
64
+ */
65
+ export declare function createToolAfterHook(mind: Mind, config?: Partial<ToolAfterHookConfig>): ToolAfterHook;
66
+ //# sourceMappingURL=tool-after.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-after.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-after.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKlC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAUD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAG1B,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAY3C;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC;IA8DhB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGvC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,aAAa,CAEf"}