@timmeck/brain 3.36.58 → 3.36.60
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/dist/brain.js +14 -2
- package/dist/brain.js.map +1 -1
- package/dist/init/lifecycle.js +10 -0
- package/dist/init/lifecycle.js.map +1 -1
- package/dist/ipc/router.d.ts +1 -0
- package/dist/ipc/router.js +2 -0
- package/dist/ipc/router.js.map +1 -1
- package/dist/services/doc.service.js +8 -4
- package/dist/services/doc.service.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/__tests__/borg.test.d.ts +0 -1
- package/dist/cli/commands/__tests__/borg.test.js +0 -84
- package/dist/cli/commands/__tests__/borg.test.js.map +0 -1
- package/dist/cli/commands/__tests__/plugins.test.d.ts +0 -1
- package/dist/cli/commands/__tests__/plugins.test.js +0 -69
- package/dist/cli/commands/__tests__/plugins.test.js.map +0 -1
- package/dist/cli/commands/__tests__/watchdog.test.d.ts +0 -1
- package/dist/cli/commands/__tests__/watchdog.test.js +0 -63
- package/dist/cli/commands/__tests__/watchdog.test.js.map +0 -1
- package/dist/hooks/__tests__/prompt-submit.test.d.ts +0 -1
- package/dist/hooks/__tests__/prompt-submit.test.js +0 -202
- package/dist/hooks/__tests__/prompt-submit.test.js.map +0 -1
- package/dist/ipc/__tests__/notification-bridge.test.d.ts +0 -1
- package/dist/ipc/__tests__/notification-bridge.test.js +0 -155
- package/dist/ipc/__tests__/notification-bridge.test.js.map +0 -1
- package/dist/ipc/__tests__/protocol.test.d.ts +0 -1
- package/dist/ipc/__tests__/protocol.test.js +0 -117
- package/dist/ipc/__tests__/protocol.test.js.map +0 -1
- package/dist/learning/__tests__/confidence-scorer.test.d.ts +0 -1
- package/dist/learning/__tests__/confidence-scorer.test.js +0 -75
- package/dist/learning/__tests__/confidence-scorer.test.js.map +0 -1
- package/dist/mcp/__tests__/prompts.test.d.ts +0 -1
- package/dist/mcp/__tests__/prompts.test.js +0 -419
- package/dist/mcp/__tests__/prompts.test.js.map +0 -1
- package/dist/services/__tests__/auto-resolution.service.test.d.ts +0 -1
- package/dist/services/__tests__/auto-resolution.service.test.js +0 -838
- package/dist/services/__tests__/auto-resolution.service.test.js.map +0 -1
- package/dist/services/__tests__/error.service.auto-resolution.test.d.ts +0 -1
- package/dist/services/__tests__/error.service.auto-resolution.test.js +0 -320
- package/dist/services/__tests__/error.service.auto-resolution.test.js.map +0 -1
- package/dist/signals/__tests__/fingerprint.test.d.ts +0 -1
- package/dist/signals/__tests__/fingerprint.test.js +0 -118
- package/dist/signals/__tests__/fingerprint.test.js.map +0 -1
- package/dist/utils/__tests__/hash.test.d.ts +0 -1
- package/dist/utils/__tests__/hash.test.js +0 -32
- package/dist/utils/__tests__/hash.test.js.map +0 -1
- package/dist/utils/__tests__/paths.test.d.ts +0 -1
- package/dist/utils/__tests__/paths.test.js +0 -75
- package/dist/utils/__tests__/paths.test.js.map +0 -1
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
// Minimal mock services for the IpcRouter
|
|
3
|
-
function createMockNotificationService() {
|
|
4
|
-
const store = [];
|
|
5
|
-
let nextId = 1;
|
|
6
|
-
return {
|
|
7
|
-
create(input) {
|
|
8
|
-
const id = nextId++;
|
|
9
|
-
store.push({
|
|
10
|
-
id,
|
|
11
|
-
type: input.type,
|
|
12
|
-
title: input.title,
|
|
13
|
-
message: input.message,
|
|
14
|
-
priority: input.priority ?? 0,
|
|
15
|
-
acknowledged: false,
|
|
16
|
-
});
|
|
17
|
-
return id;
|
|
18
|
-
},
|
|
19
|
-
list() {
|
|
20
|
-
return store.filter(n => !n.acknowledged);
|
|
21
|
-
},
|
|
22
|
-
acknowledge(id) {
|
|
23
|
-
const n = store.find(s => s.id === id);
|
|
24
|
-
if (n)
|
|
25
|
-
n.acknowledged = true;
|
|
26
|
-
},
|
|
27
|
-
getById(id) {
|
|
28
|
-
return store.find(s => s.id === id);
|
|
29
|
-
},
|
|
30
|
-
_store: store,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
describe('notification bridge IPC routes', () => {
|
|
34
|
-
let notificationService;
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
notificationService = createMockNotificationService();
|
|
37
|
-
});
|
|
38
|
-
describe('notification.pending', () => {
|
|
39
|
-
it('returns empty array when no notifications', () => {
|
|
40
|
-
const pending = notificationService.list();
|
|
41
|
-
expect(pending).toEqual([]);
|
|
42
|
-
});
|
|
43
|
-
it('returns unacknowledged notifications', () => {
|
|
44
|
-
notificationService.create({ type: 'selfmod', title: 'Test', message: '{}' });
|
|
45
|
-
notificationService.create({ type: 'cross-brain:trading-brain', title: 'trade', message: '{}' });
|
|
46
|
-
const pending = notificationService.list();
|
|
47
|
-
expect(pending).toHaveLength(2);
|
|
48
|
-
expect(pending[0].type).toBe('selfmod');
|
|
49
|
-
expect(pending[1].type).toBe('cross-brain:trading-brain');
|
|
50
|
-
});
|
|
51
|
-
it('does not return acknowledged notifications', () => {
|
|
52
|
-
const id = notificationService.create({ type: 'selfmod', title: 'Test', message: '{}' });
|
|
53
|
-
notificationService.acknowledge(id);
|
|
54
|
-
const pending = notificationService.list();
|
|
55
|
-
expect(pending).toHaveLength(0);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
describe('notification.ackAll', () => {
|
|
59
|
-
it('acknowledges all pending notifications', () => {
|
|
60
|
-
notificationService.create({ type: 'selfmod', title: 'A', message: '{}' });
|
|
61
|
-
notificationService.create({ type: 'selfmod', title: 'B', message: '{}' });
|
|
62
|
-
notificationService.create({ type: 'selfmod', title: 'C', message: '{}' });
|
|
63
|
-
// Simulate ackAll route logic
|
|
64
|
-
const pending = notificationService.list();
|
|
65
|
-
for (const n of pending) {
|
|
66
|
-
notificationService.acknowledge(n.id);
|
|
67
|
-
}
|
|
68
|
-
expect(notificationService.list()).toHaveLength(0);
|
|
69
|
-
expect(notificationService._store.every(n => n.acknowledged)).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
it('returns acknowledged count', () => {
|
|
72
|
-
notificationService.create({ type: 'a', title: 'A', message: '{}' });
|
|
73
|
-
notificationService.create({ type: 'b', title: 'B', message: '{}' });
|
|
74
|
-
const pending = notificationService.list();
|
|
75
|
-
for (const n of pending) {
|
|
76
|
-
notificationService.acknowledge(n.id);
|
|
77
|
-
}
|
|
78
|
-
expect(pending.length).toBe(2);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
describe('cross-brain.notify → notification storage', () => {
|
|
82
|
-
it('stores cross-brain notifications with proper type prefix', () => {
|
|
83
|
-
// Simulate cross-brain.notify handler
|
|
84
|
-
const params = {
|
|
85
|
-
source: 'trading-brain',
|
|
86
|
-
event: 'position:closed',
|
|
87
|
-
data: { pnl: 42.5, pnlPct: 2.1, symbol: 'BTC/USDT' },
|
|
88
|
-
timestamp: new Date().toISOString(),
|
|
89
|
-
};
|
|
90
|
-
notificationService.create({
|
|
91
|
-
type: `cross-brain:${params.source}`,
|
|
92
|
-
title: params.event,
|
|
93
|
-
message: JSON.stringify(params.data ?? {}),
|
|
94
|
-
priority: params.data?.priority ?? 0,
|
|
95
|
-
});
|
|
96
|
-
const pending = notificationService.list();
|
|
97
|
-
expect(pending).toHaveLength(1);
|
|
98
|
-
expect(pending[0].type).toBe('cross-brain:trading-brain');
|
|
99
|
-
expect(pending[0].title).toBe('position:closed');
|
|
100
|
-
const msg = JSON.parse(pending[0].message);
|
|
101
|
-
expect(msg.pnl).toBe(42.5);
|
|
102
|
-
expect(msg.symbol).toBe('BTC/USDT');
|
|
103
|
-
});
|
|
104
|
-
it('stores marketing-brain notifications', () => {
|
|
105
|
-
const params = {
|
|
106
|
-
source: 'marketing-brain',
|
|
107
|
-
event: 'rule:learned',
|
|
108
|
-
data: { ruleId: 5, pattern: 'post at 9am', summary: 'New marketing rule: "post at 9am"' },
|
|
109
|
-
timestamp: new Date().toISOString(),
|
|
110
|
-
};
|
|
111
|
-
notificationService.create({
|
|
112
|
-
type: `cross-brain:${params.source}`,
|
|
113
|
-
title: params.event,
|
|
114
|
-
message: JSON.stringify(params.data ?? {}),
|
|
115
|
-
});
|
|
116
|
-
const pending = notificationService.list();
|
|
117
|
-
expect(pending).toHaveLength(1);
|
|
118
|
-
expect(pending[0].type).toBe('cross-brain:marketing-brain');
|
|
119
|
-
const msg = JSON.parse(pending[0].message);
|
|
120
|
-
expect(msg.pattern).toBe('post at 9am');
|
|
121
|
-
});
|
|
122
|
-
it('handles data with priority', () => {
|
|
123
|
-
notificationService.create({
|
|
124
|
-
type: 'cross-brain:trading-brain',
|
|
125
|
-
title: 'urgent:alert',
|
|
126
|
-
message: JSON.stringify({ priority: 5, msg: 'Flash crash' }),
|
|
127
|
-
priority: 5,
|
|
128
|
-
});
|
|
129
|
-
const pending = notificationService.list();
|
|
130
|
-
expect(pending[0].priority).toBe(5);
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
describe('selfmod → notification flow', () => {
|
|
134
|
-
it('creates notifications from self-improvement suggestions', () => {
|
|
135
|
-
const suggestions = [
|
|
136
|
-
'Tell Claude: Extract common IPC patterns into shared helper',
|
|
137
|
-
'Tell Claude: Add retry logic to price fetcher',
|
|
138
|
-
];
|
|
139
|
-
// Simulate the onSuggestion callback from brain.ts
|
|
140
|
-
for (const s of suggestions) {
|
|
141
|
-
notificationService.create({
|
|
142
|
-
type: 'selfmod',
|
|
143
|
-
title: 'Self-improvement suggestion',
|
|
144
|
-
message: JSON.stringify({ summary: s }),
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
const pending = notificationService.list();
|
|
148
|
-
expect(pending).toHaveLength(2);
|
|
149
|
-
expect(pending[0].type).toBe('selfmod');
|
|
150
|
-
const msg0 = JSON.parse(pending[0].message);
|
|
151
|
-
expect(msg0.summary).toContain('Extract common IPC patterns');
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
//# sourceMappingURL=notification-bridge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notification-bridge.test.js","sourceRoot":"","sources":["../../../src/ipc/__tests__/notification-bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { Buffer } from 'node:buffer';
|
|
3
|
-
import { encodeMessage, MessageDecoder } from '../protocol.js';
|
|
4
|
-
function makeMessage(overrides = {}) {
|
|
5
|
-
return { id: '1', type: 'request', method: 'test', ...overrides };
|
|
6
|
-
}
|
|
7
|
-
describe('encodeMessage', () => {
|
|
8
|
-
it('returns a Buffer', () => {
|
|
9
|
-
const buf = encodeMessage(makeMessage());
|
|
10
|
-
expect(Buffer.isBuffer(buf)).toBe(true);
|
|
11
|
-
});
|
|
12
|
-
it('starts with a 4-byte length prefix', () => {
|
|
13
|
-
const msg = makeMessage();
|
|
14
|
-
const buf = encodeMessage(msg);
|
|
15
|
-
const payloadLength = buf.readUInt32BE(0);
|
|
16
|
-
expect(buf.length).toBe(4 + payloadLength);
|
|
17
|
-
});
|
|
18
|
-
it('payload is valid JSON matching the input message', () => {
|
|
19
|
-
const msg = makeMessage({ id: 'abc', type: 'notification', method: 'ping' });
|
|
20
|
-
const buf = encodeMessage(msg);
|
|
21
|
-
const payloadLength = buf.readUInt32BE(0);
|
|
22
|
-
const json = buf.subarray(4, 4 + payloadLength).toString('utf8');
|
|
23
|
-
const parsed = JSON.parse(json);
|
|
24
|
-
expect(parsed).toEqual(msg);
|
|
25
|
-
});
|
|
26
|
-
it('handles message with error field', () => {
|
|
27
|
-
const msg = makeMessage({
|
|
28
|
-
type: 'response',
|
|
29
|
-
error: { code: -1, message: 'fail' },
|
|
30
|
-
});
|
|
31
|
-
const buf = encodeMessage(msg);
|
|
32
|
-
const payloadLength = buf.readUInt32BE(0);
|
|
33
|
-
const json = buf.subarray(4, 4 + payloadLength).toString('utf8');
|
|
34
|
-
expect(JSON.parse(json).error.code).toBe(-1);
|
|
35
|
-
});
|
|
36
|
-
it('handles message with unicode content', () => {
|
|
37
|
-
const msg = makeMessage({ method: '\u00fc\u00f6\u00e4\u00df' });
|
|
38
|
-
const buf = encodeMessage(msg);
|
|
39
|
-
const payloadLength = buf.readUInt32BE(0);
|
|
40
|
-
const json = buf.subarray(4, 4 + payloadLength).toString('utf8');
|
|
41
|
-
expect(JSON.parse(json).method).toBe('\u00fc\u00f6\u00e4\u00df');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe('MessageDecoder', () => {
|
|
45
|
-
it('decodes a single complete message', () => {
|
|
46
|
-
const decoder = new MessageDecoder();
|
|
47
|
-
const msg = makeMessage({ id: '42' });
|
|
48
|
-
const encoded = encodeMessage(msg);
|
|
49
|
-
const messages = decoder.feed(encoded);
|
|
50
|
-
expect(messages).toHaveLength(1);
|
|
51
|
-
expect(messages[0]).toEqual(msg);
|
|
52
|
-
});
|
|
53
|
-
it('decodes multiple messages fed at once', () => {
|
|
54
|
-
const decoder = new MessageDecoder();
|
|
55
|
-
const msg1 = makeMessage({ id: '1' });
|
|
56
|
-
const msg2 = makeMessage({ id: '2' });
|
|
57
|
-
const combined = Buffer.concat([encodeMessage(msg1), encodeMessage(msg2)]);
|
|
58
|
-
const messages = decoder.feed(combined);
|
|
59
|
-
expect(messages).toHaveLength(2);
|
|
60
|
-
expect(messages[0]).toEqual(msg1);
|
|
61
|
-
expect(messages[1]).toEqual(msg2);
|
|
62
|
-
});
|
|
63
|
-
it('handles partial messages across multiple feeds', () => {
|
|
64
|
-
const decoder = new MessageDecoder();
|
|
65
|
-
const msg = makeMessage({ id: 'split' });
|
|
66
|
-
const encoded = encodeMessage(msg);
|
|
67
|
-
// Split the buffer in the middle
|
|
68
|
-
const mid = Math.floor(encoded.length / 2);
|
|
69
|
-
const part1 = encoded.subarray(0, mid);
|
|
70
|
-
const part2 = encoded.subarray(mid);
|
|
71
|
-
const result1 = decoder.feed(part1);
|
|
72
|
-
expect(result1).toHaveLength(0);
|
|
73
|
-
const result2 = decoder.feed(part2);
|
|
74
|
-
expect(result2).toHaveLength(1);
|
|
75
|
-
expect(result2[0]).toEqual(msg);
|
|
76
|
-
});
|
|
77
|
-
it('handles byte-by-byte feeding', () => {
|
|
78
|
-
const decoder = new MessageDecoder();
|
|
79
|
-
const msg = makeMessage({ id: 'byte' });
|
|
80
|
-
const encoded = encodeMessage(msg);
|
|
81
|
-
const messages = [];
|
|
82
|
-
for (let i = 0; i < encoded.length; i++) {
|
|
83
|
-
const result = decoder.feed(encoded.subarray(i, i + 1));
|
|
84
|
-
messages.push(...result);
|
|
85
|
-
}
|
|
86
|
-
expect(messages).toHaveLength(1);
|
|
87
|
-
expect(messages[0]).toEqual(msg);
|
|
88
|
-
});
|
|
89
|
-
it('handles incomplete length header', () => {
|
|
90
|
-
const decoder = new MessageDecoder();
|
|
91
|
-
// Feed only 2 bytes (less than the 4-byte header)
|
|
92
|
-
const partial = Buffer.alloc(2);
|
|
93
|
-
partial.writeUInt16BE(0, 0);
|
|
94
|
-
const result = decoder.feed(partial);
|
|
95
|
-
expect(result).toHaveLength(0);
|
|
96
|
-
});
|
|
97
|
-
it('reset clears internal buffer', () => {
|
|
98
|
-
const decoder = new MessageDecoder();
|
|
99
|
-
const msg = makeMessage({ id: 'reset-test' });
|
|
100
|
-
const encoded = encodeMessage(msg);
|
|
101
|
-
// Feed partial data
|
|
102
|
-
decoder.feed(encoded.subarray(0, 3));
|
|
103
|
-
// Reset
|
|
104
|
-
decoder.reset();
|
|
105
|
-
// Feed a complete message — should decode cleanly
|
|
106
|
-
const msg2 = makeMessage({ id: 'after-reset' });
|
|
107
|
-
const result = decoder.feed(encodeMessage(msg2));
|
|
108
|
-
expect(result).toHaveLength(1);
|
|
109
|
-
expect(result[0]).toEqual(msg2);
|
|
110
|
-
});
|
|
111
|
-
it('handles empty buffer', () => {
|
|
112
|
-
const decoder = new MessageDecoder();
|
|
113
|
-
const result = decoder.feed(Buffer.alloc(0));
|
|
114
|
-
expect(result).toHaveLength(0);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
//# sourceMappingURL=protocol.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../../src/ipc/__tests__/protocol.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { computeAdaptiveThresholds, computeConfidence, timeDecayedConfidence } from '../confidence-scorer.js';
|
|
3
|
-
describe('computeAdaptiveThresholds', () => {
|
|
4
|
-
const baseConfig = {
|
|
5
|
-
minOccurrences: 3,
|
|
6
|
-
minSuccessRate: 0.70,
|
|
7
|
-
minConfidence: 0.60,
|
|
8
|
-
pruneThreshold: 0.30,
|
|
9
|
-
};
|
|
10
|
-
it('should not scale minOccurrences above cap of 1.5x', () => {
|
|
11
|
-
// With 200 errors and 100 solutions, errorScale = min(1.5, 200/100) = 1.5
|
|
12
|
-
// solutionScale = min(1.5, 100/20) = 1.5
|
|
13
|
-
// dataScale = 1.5
|
|
14
|
-
const result = computeAdaptiveThresholds(200, 100, baseConfig);
|
|
15
|
-
// minOccurrences = round(3 * 1.5) = 5 (not 6+ with old cap of 2.0)
|
|
16
|
-
expect(result.minOccurrences).toBeLessThanOrEqual(5);
|
|
17
|
-
});
|
|
18
|
-
it('should keep minOccurrences low with small datasets', () => {
|
|
19
|
-
// With 10 errors and 5 solutions
|
|
20
|
-
const result = computeAdaptiveThresholds(10, 5, baseConfig);
|
|
21
|
-
// errorScale = min(1.5, max(0.5, 10/100)) = 0.5
|
|
22
|
-
// solutionScale = min(1.5, max(0.5, 5/20)) = 0.5
|
|
23
|
-
// dataScale = 0.5
|
|
24
|
-
// minOccurrences = max(2, round(3 * 0.5)) = 2
|
|
25
|
-
expect(result.minOccurrences).toBe(2);
|
|
26
|
-
});
|
|
27
|
-
it('should produce reasonable thresholds for moderate data', () => {
|
|
28
|
-
// 50 errors, 20 solutions → errorScale = 0.5, solutionScale = 1.0, dataScale = 0.75
|
|
29
|
-
const result = computeAdaptiveThresholds(50, 20, baseConfig);
|
|
30
|
-
expect(result.minOccurrences).toBeGreaterThanOrEqual(2);
|
|
31
|
-
expect(result.minOccurrences).toBeLessThanOrEqual(4);
|
|
32
|
-
expect(result.minSuccessRate).toBeGreaterThan(0.60);
|
|
33
|
-
expect(result.minSuccessRate).toBeLessThan(0.95);
|
|
34
|
-
expect(result.minConfidence).toBeGreaterThan(0.50);
|
|
35
|
-
expect(result.minConfidence).toBeLessThan(0.90);
|
|
36
|
-
});
|
|
37
|
-
it('should cap errorScale at 1.5 instead of 2.0', () => {
|
|
38
|
-
// Very large dataset: 500 errors
|
|
39
|
-
const result = computeAdaptiveThresholds(500, 100, baseConfig);
|
|
40
|
-
// errorScale = min(1.5, 500/100) = 1.5, not 2.0
|
|
41
|
-
// solutionScale = min(1.5, 100/20) = 1.5
|
|
42
|
-
// dataScale = 1.5
|
|
43
|
-
expect(result.minOccurrences).toBeLessThanOrEqual(5);
|
|
44
|
-
});
|
|
45
|
-
it('should use divisor of 100 for errorScale', () => {
|
|
46
|
-
// At exactly 100 errors, errorScale should be 1.0
|
|
47
|
-
const result = computeAdaptiveThresholds(100, 20, baseConfig);
|
|
48
|
-
// errorScale = min(1.5, max(0.5, 100/100)) = 1.0
|
|
49
|
-
// solutionScale = min(1.5, max(0.5, 20/20)) = 1.0
|
|
50
|
-
// dataScale = 1.0
|
|
51
|
-
// minOccurrences = round(3 * 1.0) = 3
|
|
52
|
-
expect(result.minOccurrences).toBe(3);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('computeConfidence', () => {
|
|
56
|
-
it('should return 0 with no data', () => {
|
|
57
|
-
expect(computeConfidence(0, 0, new Date().toISOString())).toBe(0);
|
|
58
|
-
});
|
|
59
|
-
it('should return higher confidence for more successes', () => {
|
|
60
|
-
const now = new Date().toISOString();
|
|
61
|
-
const low = computeConfidence(2, 8, now);
|
|
62
|
-
const high = computeConfidence(8, 2, now);
|
|
63
|
-
expect(high).toBeGreaterThan(low);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('timeDecayedConfidence', () => {
|
|
67
|
-
it('should decay confidence over time', () => {
|
|
68
|
-
const recent = new Date().toISOString();
|
|
69
|
-
const old = new Date(Date.now() - 60 * 86400000).toISOString(); // 60 days ago
|
|
70
|
-
const recentConf = timeDecayedConfidence(8, 10, recent, 30);
|
|
71
|
-
const oldConf = timeDecayedConfidence(8, 10, old, 30);
|
|
72
|
-
expect(recentConf).toBeGreaterThan(oldConf);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
//# sourceMappingURL=confidence-scorer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"confidence-scorer.test.js","sourceRoot":"","sources":["../../../src/learning/__tests__/confidence-scorer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|