You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,7 +37,7 @@ Born from a production setup where [OpenClaw](https://github.com/openclaw/opencl
37
37
### What Was New in v2.2
38
38
39
39
-**Noise-Free Entity Extraction** — v2.2 filters out CSS properties, code identifiers, shell commands, sentence fragments, French prose, and generic phrases. Pattern-based filtering with 50+ generic noun/adjective blocklists. Includes a retroactive cleanup script (`scripts/cleanup-garbage-entities.js`) to purge existing noise.
40
-
-**Per-Client Knowledge Base** — Fingerprint-based client identification with accent normalization. One tool call (`brain_client`) returns everything known about a client: brand, strategy, meetings, content, technical details, relationships. Fuzzy name resolution ("JL" resolves to "jetloans").
40
+
-**Per-Client Knowledge Base** — Fingerprint-based client identification with accent normalization. One tool call (`brain_client`) returns everything known about a client: brand, strategy, meetings, content, technical details, relationships. Fuzzy name resolution ("AL" resolves to "acme-loans").
41
41
-**Gemini Embedding 2** — Task-type-aware embeddings at 3072 dimensions. Uses `RETRIEVAL_DOCUMENT` for storage, `RETRIEVAL_QUERY` for search. Matryoshka support for flexible dimensionality (3072/1536/768).
42
42
-**Import/Export** — Full backup and migration support. Export all memories as JSON, import with automatic deduplication. Never lose data when switching embedding providers again.
43
43
-**Webhook Notifications** — Real-time dispatch when memories are stored, superseded, or deleted. Fire-and-forget to any HTTP endpoint.
//Brandon alone is ambiguous (both jetloans + credit-instant), needs 2nd signal
105
-
assert.strictEqual(resolver.resolve('Brandon called about Granby store'), 'jetloans');
104
+
//Alex alone is ambiguous (both acme-loans + quickcredit), needs 2nd signal
105
+
assert.strictEqual(resolver.resolve('Alex called about Springfield store'), 'acme-loans');
106
106
});
107
107
108
108
it('should return null when below threshold', () => {
109
109
assert.strictEqual(resolver.resolve('Had a meeting today about loans'), null);
110
110
});
111
111
112
112
it('should return array for multi-client content', () => {
113
-
constresult=resolver.resolve('Discussed jetloans.ca redesign and Biolistix supplement strategy');
113
+
constresult=resolver.resolve('Discussed acme-loans.ca redesign and GreenLife supplement strategy');
114
114
assert.ok(Array.isArray(result));
115
-
assert.ok(result.includes('jetloans'));
116
-
assert.ok(result.includes('biolistix'));
115
+
assert.ok(result.includes('acme-loans'));
116
+
assert.ok(result.includes('greenlife'));
117
117
});
118
118
119
119
it('should be case-insensitive', () => {
120
-
assert.strictEqual(resolver.resolve('JETLOANS website is down'), 'jetloans');
120
+
assert.strictEqual(resolver.resolve('ACME-LOANS website is down'), 'acme-loans');
121
121
});
122
122
123
123
it('should handle accented characters', () => {
124
-
assert.strictEqual(resolver.resolve('Crédit Instant needs new landing page for Québec City'), 'credit-instant');
124
+
assert.strictEqual(resolver.resolve('QuickCrédit needs new landing page for Riverside'), 'quickcredit');
125
125
});
126
126
});
127
127
```
@@ -320,8 +320,8 @@ import assert from 'node:assert';
320
320
describe('client route response format', () => {
321
321
it('should structure briefing with profile and knowledge sections', () => {
322
322
constresponse= {
323
-
client_id:'jetloans',
324
-
profile: { name:'Jetloans', industry:'loans' },
323
+
client_id:'acme-loans',
324
+
profile: { name:'Acme Loans', industry:'loans' },
325
325
knowledge: {
326
326
brand: [], strategy: [], meeting: [],
327
327
content: [], technical: [], relationship: [],
@@ -472,7 +472,7 @@ In `mcp-server/src/index.js`, add to the tools array:
472
472
```javascript
473
473
{
474
474
name:'brain_client',
475
-
description:'Get everything known about a client — profile, brand, strategy, meetings, content, technical details, relationships. Can also do semantic search within a client\'s memories. Accepts fuzzy names (e.g. "JL" resolves to "jetloans").',
475
+
description:'Get everything known about a client — profile, brand, strategy, meetings, content, technical details, relationships. Can also do semantic search within a client\'s memories. Accepts fuzzy names (e.g. "AL" resolves to "acme-loans").',
476
476
inputSchema: {
477
477
type:'object',
478
478
properties: {
@@ -668,7 +668,7 @@ import { buildNotificationPayload } from '../src/services/notifications.js';
Open `http://192.168.18.40:8084/graph/Jetloans/html` in browser and verify the visualization renders.
905
+
Open `http://localhost:8084/graph/Acme Loans/html` in browser and verify the visualization renders.
906
906
907
907
-[ ]**Step 4: Commit**
908
908
@@ -936,7 +936,7 @@ Import `getClientResolver` from `'../services/client-resolver.js'`.
936
936
937
937
-[ ]**Step 2: Test by storing a memory without client_id that mentions a client**
938
938
939
-
Use curl or MCP to store a fact with content "Updated Jetloans homepage meta tags for Granby SEO" without providing client_id. Verify it auto-resolves to `jetloans`.
939
+
Use curl or MCP to store a fact with content "Updated Acme Loans homepage meta tags for Springfield SEO" without providing client_id. Verify it auto-resolves to `acme-loans`.
**A. Fingerprint injection**: Before the LLM extraction node, add a step that fetches fingerprints from the Shared Brain API (new endpoint: `GET /clients/fingerprints`) and formats them into the extraction prompt:
description: 'Get everything known about a client — brand, strategy, meetings, content, technical details, relationships. Can also do semantic search within a client\'s memories. Accepts fuzzy names (e.g. "JL" resolves to "jetloans").',
289
+
description: 'Get everything known about a client — brand, strategy, meetings, content, technical details, relationships. Can also do semantic search within a client\'s memories. Accepts fuzzy names (e.g. "AL" resolves to "acme-loans").',
0 commit comments