@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.
- package/CHANGELOG.md +83 -0
- package/LICENSE +21 -0
- package/README.md +172 -0
- package/dist/capture/classification.d.ts +37 -0
- package/dist/capture/classification.d.ts.map +1 -0
- package/dist/capture/classification.js +181 -0
- package/dist/capture/classification.js.map +1 -0
- package/dist/capture/filtering.d.ts +63 -0
- package/dist/capture/filtering.d.ts.map +1 -0
- package/dist/capture/filtering.js +195 -0
- package/dist/capture/filtering.js.map +1 -0
- package/dist/capture/observation.d.ts +28 -0
- package/dist/capture/observation.d.ts.map +1 -0
- package/dist/capture/observation.js +188 -0
- package/dist/capture/observation.js.map +1 -0
- package/dist/commands/index.d.ts +38 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +375 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/context/builder.d.ts +19 -0
- package/dist/context/builder.d.ts.map +1 -0
- package/dist/context/builder.js +209 -0
- package/dist/context/builder.js.map +1 -0
- package/dist/context/format.d.ts +32 -0
- package/dist/context/format.d.ts.map +1 -0
- package/dist/context/format.js +211 -0
- package/dist/context/format.js.map +1 -0
- package/dist/embedding/index.d.ts +3 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +3 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/provider.d.ts +15 -0
- package/dist/embedding/provider.d.ts.map +1 -0
- package/dist/embedding/provider.js +19 -0
- package/dist/embedding/provider.js.map +1 -0
- package/dist/embedding/transformers.d.ts +14 -0
- package/dist/embedding/transformers.d.ts.map +1 -0
- package/dist/embedding/transformers.js +55 -0
- package/dist/embedding/transformers.js.map +1 -0
- package/dist/extract/confidence.d.ts +48 -0
- package/dist/extract/confidence.d.ts.map +1 -0
- package/dist/extract/confidence.js +230 -0
- package/dist/extract/confidence.js.map +1 -0
- package/dist/extract/llm-extractor.d.ts +35 -0
- package/dist/extract/llm-extractor.d.ts.map +1 -0
- package/dist/extract/llm-extractor.js +204 -0
- package/dist/extract/llm-extractor.js.map +1 -0
- package/dist/extract/pipeline.d.ts +44 -0
- package/dist/extract/pipeline.d.ts.map +1 -0
- package/dist/extract/pipeline.js +171 -0
- package/dist/extract/pipeline.js.map +1 -0
- package/dist/extract/rules-engine.d.ts +14 -0
- package/dist/extract/rules-engine.d.ts.map +1 -0
- package/dist/extract/rules-engine.js +314 -0
- package/dist/extract/rules-engine.js.map +1 -0
- package/dist/extract/summarizer.d.ts +27 -0
- package/dist/extract/summarizer.d.ts.map +1 -0
- package/dist/extract/summarizer.js +148 -0
- package/dist/extract/summarizer.js.map +1 -0
- package/dist/hooks/session-idle.d.ts +38 -0
- package/dist/hooks/session-idle.d.ts.map +1 -0
- package/dist/hooks/session-idle.js +142 -0
- package/dist/hooks/session-idle.js.map +1 -0
- package/dist/hooks/system-transform.d.ts +41 -0
- package/dist/hooks/system-transform.d.ts.map +1 -0
- package/dist/hooks/system-transform.js +98 -0
- package/dist/hooks/system-transform.js.map +1 -0
- package/dist/hooks/tool-after.d.ts +66 -0
- package/dist/hooks/tool-after.d.ts.map +1 -0
- package/dist/hooks/tool-after.js +155 -0
- package/dist/hooks/tool-after.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mind.d.ts +69 -0
- package/dist/mind.d.ts.map +1 -0
- package/dist/mind.js +368 -0
- package/dist/mind.js.map +1 -0
- package/dist/procedural/index.d.ts +4 -0
- package/dist/procedural/index.d.ts.map +1 -0
- package/dist/procedural/index.js +4 -0
- package/dist/procedural/index.js.map +1 -0
- package/dist/procedural/induction.d.ts +23 -0
- package/dist/procedural/induction.d.ts.map +1 -0
- package/dist/procedural/induction.js +104 -0
- package/dist/procedural/induction.js.map +1 -0
- package/dist/procedural/miner.d.ts +45 -0
- package/dist/procedural/miner.d.ts.map +1 -0
- package/dist/procedural/miner.js +171 -0
- package/dist/procedural/miner.js.map +1 -0
- package/dist/procedural/suggester.d.ts +20 -0
- package/dist/procedural/suggester.d.ts.map +1 -0
- package/dist/procedural/suggester.js +69 -0
- package/dist/procedural/suggester.js.map +1 -0
- package/dist/store/archive.d.ts +31 -0
- package/dist/store/archive.d.ts.map +1 -0
- package/dist/store/archive.js +137 -0
- package/dist/store/archive.js.map +1 -0
- package/dist/store/backup.d.ts +36 -0
- package/dist/store/backup.d.ts.map +1 -0
- package/dist/store/backup.js +163 -0
- package/dist/store/backup.js.map +1 -0
- package/dist/store/memorycards.d.ts +31 -0
- package/dist/store/memorycards.d.ts.map +1 -0
- package/dist/store/memorycards.js +161 -0
- package/dist/store/memorycards.js.map +1 -0
- package/dist/store/mv2-adapter.d.ts +29 -0
- package/dist/store/mv2-adapter.d.ts.map +1 -0
- package/dist/store/mv2-adapter.js +359 -0
- package/dist/store/mv2-adapter.js.map +1 -0
- package/dist/store/procedures.d.ts +79 -0
- package/dist/store/procedures.d.ts.map +1 -0
- package/dist/store/procedures.js +183 -0
- package/dist/store/procedures.js.map +1 -0
- package/dist/store/tombstone.d.ts +27 -0
- package/dist/store/tombstone.d.ts.map +1 -0
- package/dist/store/tombstone.js +136 -0
- package/dist/store/tombstone.js.map +1 -0
- package/dist/tools/index.d.ts +36 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +236 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +301 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +69 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/error.d.ts +57 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +143 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/uuid.d.ts +2 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +5 -0
- package/dist/utils/uuid.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|