engram-sdk 0.4.2 → 0.4.3

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/Dockerfile CHANGED
@@ -1,14 +1,21 @@
1
- FROM node:22-alpine
1
+ FROM node:20-slim
2
2
 
3
3
  WORKDIR /app
4
4
 
5
+ # Install build dependencies for better-sqlite3 native addon
6
+ RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
7
+
5
8
  COPY package.json package-lock.json* ./
6
- RUN npm ci --production
9
+ RUN npm ci
10
+
11
+ COPY . .
12
+ RUN npm run build
13
+ RUN npm prune --production
7
14
 
8
- COPY src/ src/
9
- COPY tsconfig.json ./
10
- RUN npx tsc
15
+ # Persistent data volume mount point
16
+ RUN mkdir -p /data
11
17
 
12
18
  EXPOSE 3800
13
19
 
20
+ # Use hosted multi-tenant server
14
21
  CMD ["node", "dist/hosted.js"]
package/LICENSE CHANGED
@@ -1,80 +1,85 @@
1
- Business Source License 1.1
2
-
3
- License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
4
- "Business Source License" is a trademark of MariaDB Corporation Ab.
5
-
6
- Parameters
7
-
8
- Licensor: Thomas Stockham
9
- Licensed Work: Engram
10
- The Licensed Work is (c) 2026 Thomas Stockham.
11
- Additional Use Grant: You may make production use of the Licensed Work,
12
- provided your use does not include offering the
13
- Licensed Work to third parties as a hosted or
14
- managed service, where the service provides users
15
- with access to any substantial set of the features
16
- or functionality of the Licensed Work.
17
-
18
- Change Date: Four years from the date the Licensed Work is
19
- published. Each version of the Licensed Work has
20
- its own Change Date.
21
-
22
- Change License: Apache License, Version 2.0
23
-
24
- For information about alternative licensing arrangements for the Licensed
25
- Work, please contact: tstockham96@gmail.com
26
-
27
- Notice
28
-
29
- The Business Source License (this document, or the "License") is not an
30
- Open Source license. However, the Licensed Work will eventually be made
31
- available under an Open Source License, as stated in this License.
32
-
33
- License text
34
-
35
- The Licensor hereby grants you the right to copy, modify, create
36
- derivative works, redistribute, and make non-production use of the
37
- Licensed Work. The Licensor may make an Additional Use Grant, above,
38
- permitting limited production use.
39
-
40
- Effective on the Change Date, or the fourth anniversary of the first
41
- publicly available distribution of a specific version of the Licensed
42
- Work, whichever comes first, the Licensor hereby grants you rights under
43
- the terms of the Change License, and the rights granted in the paragraph
44
- above terminate.
45
-
46
- If your use of the Licensed Work does not comply with the requirements
47
- currently in effect as described in this License, you must purchase a
48
- commercial license from the Licensor, its affiliated entities, or
49
- authorized resellers, or you must refrain from using the Licensed Work.
50
-
51
- All copies of the original and modified Licensed Work, and derivative
52
- works of the Licensed Work, are subject to this License. This License
53
- applies separately for each version of the Licensed Work and the Change
54
- Date may vary for each version of the Licensed Work released by
55
- Licensor.
56
-
57
- You must conspicuously display this License on each original or modified
58
- copy of the Licensed Work. If you receive the Licensed Work in original
59
- or modified form from a third party, the terms and conditions set forth
60
- in this License apply to your use of that work.
61
-
62
- Any use of the Licensed Work in violation of this License will
63
- automatically terminate your rights under this License for the current
64
- and all other versions of the Licensed Work.
65
-
66
- This License does not grant you any right in any trademark or logo of
67
- Licensor or its affiliates (provided that you may use a trademark or
68
- logo of Licensor as expressly required by this License).
69
-
70
- TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS
71
- PROVIDED ON AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES
72
- AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION)
73
- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
74
- NON-INFRINGEMENT, AND TITLE.
75
-
76
- MariaDB hereby grants you permission to use this License's text to
77
- license your works, and to refer to it using the trademark "Business
78
- Source License", as long as you comply with the Cowardly Conditions of
79
- MariaDB's Business Source License Trademark Policy available at
80
- https://mariadb.com/bsl11/.
1
+ Engram Software License Agreement
2
+
3
+ Copyright (c) 2026 Thomas Stockham. All rights reserved.
4
+
5
+ IMPORTANT: READ THIS LICENSE AGREEMENT CAREFULLY BEFORE USING THIS SOFTWARE.
6
+
7
+ By installing, copying, or otherwise using this software ("Engram" or the
8
+ "Software"), you agree to be bound by the terms of this license agreement.
9
+ If you do not agree to these terms, do not install or use the Software.
10
+
11
+ 1. GRANT OF LICENSE
12
+
13
+ Thomas Stockham ("Licensor") grants you a non-exclusive, non-transferable,
14
+ revocable license to:
15
+
16
+ a) Install and use the Software for your internal business or personal
17
+ purposes.
18
+ b) Use the Software's APIs, CLI, and SDK to build applications and
19
+ integrations.
20
+
21
+ 2. RESTRICTIONS
22
+
23
+ You may NOT:
24
+
25
+ a) Copy, modify, adapt, translate, reverse engineer, decompile,
26
+ disassemble, or create derivative works based on the Software.
27
+ b) Distribute, sublicense, lease, rent, loan, or otherwise transfer
28
+ the Software or any rights therein to any third party.
29
+ c) Offer the Software, or any substantial portion of its functionality,
30
+ as a hosted service, managed service, API, or cloud-based product
31
+ to third parties.
32
+ d) Remove, alter, or obscure any proprietary notices, labels, or marks
33
+ on or in the Software.
34
+ e) Use the Software to build a competing product or service.
35
+
36
+ 3. INTELLECTUAL PROPERTY
37
+
38
+ The Software is protected by copyright and other intellectual property
39
+ laws. The Licensor retains all right, title, and interest in and to the
40
+ Software, including all intellectual property rights therein. This license
41
+ does not grant you any rights to patents, copyrights, trade secrets,
42
+ trade names, trademarks, or any other rights in respect to the Software.
43
+
44
+ 4. DATA AND PRIVACY
45
+
46
+ The Software may collect anonymous usage telemetry to improve the product.
47
+ No personal data or memory contents are transmitted. You may disable
48
+ telemetry via configuration.
49
+
50
+ 5. WARRANTY DISCLAIMER
51
+
52
+ THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS
53
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54
+ FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. THE LICENSOR DOES
55
+ NOT WARRANT THAT THE SOFTWARE WILL BE ERROR-FREE OR UNINTERRUPTED.
56
+
57
+ 6. LIMITATION OF LIABILITY
58
+
59
+ IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
60
+ SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS OR
61
+ REVENUE, WHETHER INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA,
62
+ USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM YOUR USE OF
63
+ THE SOFTWARE.
64
+
65
+ 7. TERMINATION
66
+
67
+ This license is effective until terminated. It will terminate automatically
68
+ if you fail to comply with any term of this agreement. Upon termination,
69
+ you must destroy all copies of the Software in your possession.
70
+
71
+ 8. GOVERNING LAW
72
+
73
+ This agreement shall be governed by and construed in accordance with the
74
+ laws of the State of Utah, without regard to its conflict of law provisions.
75
+
76
+ 9. COMMERCIAL LICENSING
77
+
78
+ For enterprise licensing, custom deployments, OEM arrangements, or any
79
+ use not covered by this license, contact: tstockham96@gmail.com
80
+
81
+ 10. ENTIRE AGREEMENT
82
+
83
+ This agreement constitutes the entire agreement between you and the
84
+ Licensor regarding the Software and supersedes all prior agreements
85
+ and understandings.
@@ -37,7 +37,6 @@ export declare class AccountStore {
37
37
  used: number;
38
38
  resetAt: string;
39
39
  };
40
- private migrate;
41
40
  getAccountByEmail(email: string): Account | null;
42
41
  getAccountByStripeCustomerId(customerId: string): Account | null;
43
42
  updatePlan(accountId: string, plan: Plan, stripeSubscriptionId?: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMlI,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE9D,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,EAAE,MAAM;IAqB1B,cAAc,IAAI,MAAM;IAIxB,OAAO,CAAC,aAAa;IAMrB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,IAAa,GAAG,OAAO;IAc1D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAiB/C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAM1C,YAAY,IAAI,OAAO,EAAE;IAKzB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAcpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAkBjH,OAAO,CAAC,OAAO;IAaf,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAMhD,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAMhE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI;IAS9E,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAKpF,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,YAAY;CAerB"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMlI,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE9D,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,EAAE,MAAM;IAmB1B,cAAc,IAAI,MAAM;IAIxB,OAAO,CAAC,aAAa;IAMrB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,IAAa,GAAG,OAAO;IAc1D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAiB/C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAM1C,YAAY,IAAI,OAAO,EAAE;IAKzB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAcpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAkBjH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAMhD,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAMhE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI;IAS9E,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAKpF,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,YAAY;CAerB"}
package/dist/accounts.js CHANGED
@@ -26,8 +26,6 @@ export class AccountStore {
26
26
  );
27
27
  CREATE INDEX IF NOT EXISTS idx_accounts_api_key ON accounts(api_key);
28
28
  `);
29
- // Migration: add Stripe columns if missing
30
- this.migrate();
31
29
  }
32
30
  generateApiKey() {
33
31
  return 'eng_live_' + randomBytes(16).toString('hex');
@@ -106,18 +104,6 @@ export class AccountStore {
106
104
  }
107
105
  }
108
106
  }
109
- migrate() {
110
- // Add stripe columns if they don't exist
111
- const cols = this.db.prepare("PRAGMA table_info(accounts)").all();
112
- const colNames = new Set(cols.map((c) => c.name));
113
- if (!colNames.has('stripe_customer_id')) {
114
- this.db.exec('ALTER TABLE accounts ADD COLUMN stripe_customer_id TEXT');
115
- this.db.exec('CREATE INDEX IF NOT EXISTS idx_accounts_stripe_cid ON accounts(stripe_customer_id)');
116
- }
117
- if (!colNames.has('stripe_subscription_id')) {
118
- this.db.exec('ALTER TABLE accounts ADD COLUMN stripe_subscription_id TEXT');
119
- }
120
- }
121
107
  getAccountByEmail(email) {
122
108
  const row = this.db.prepare('SELECT * FROM accounts WHERE email = ?').get(email);
123
109
  if (!row)
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"hosted.d.ts","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":";AA6SA,iBAAS,WAAW,SAkHnB;AAeD,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"hosted.d.ts","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":";AA2PA,iBAAS,WAAW,SAkHnB;AAeD,OAAO,EAAE,WAAW,EAAE,CAAC"}
package/dist/hosted.js CHANGED
@@ -5,7 +5,6 @@ import path from 'node:path';
5
5
  import { Vault } from './vault.js';
6
6
  import { GeminiEmbeddings } from './embeddings.js';
7
7
  import { AccountStore, PLAN_LIMITS } from './accounts.js';
8
- import { handleWebhook, createCheckoutSession, createCustomerPortalSession } from './stripe.js';
9
8
  // ============================================================
10
9
  // Engram Hosted — Multi-Tenant API Server
11
10
  // ============================================================
@@ -170,56 +169,6 @@ publicRoute('GET', '/health', (req, res) => {
170
169
  json(res, 200, { status: 'ok', version: '0.1.0', timestamp: new Date().toISOString() });
171
170
  });
172
171
  // ============================================================
173
- // Signup, Billing, and Pricing Routes
174
- // ============================================================
175
- publicRoute('POST', '/v1/signup', async (req, res) => {
176
- const body = JSON.parse(await readBody(req));
177
- if (!body.email)
178
- return errorResponse(res, 400, 'email is required');
179
- const existing = accountStore.getAccountByEmail(body.email);
180
- if (existing)
181
- return errorResponse(res, 409, 'account with this email already exists');
182
- const account = accountStore.createAccount(body.email, 'free');
183
- json(res, 201, { apiKey: account.apiKey, email: account.email, plan: account.plan });
184
- });
185
- publicRoute('POST', '/v1/checkout', async (req, res) => {
186
- const body = JSON.parse(await readBody(req));
187
- if (!body.email)
188
- return errorResponse(res, 400, 'email is required');
189
- const plan = (body.plan ?? 'developer');
190
- if (!['developer', 'team', 'business'].includes(plan))
191
- return errorResponse(res, 400, 'plan must be developer, team, or business');
192
- try {
193
- const session = await createCheckoutSession(body.email, plan);
194
- json(res, 200, session);
195
- }
196
- catch (err) {
197
- errorResponse(res, 500, err.message ?? 'Failed to create checkout session');
198
- }
199
- });
200
- publicRoute('POST', '/v1/webhooks/stripe', async (req, res) => {
201
- const body = await readBody(req);
202
- const sig = req.headers['stripe-signature'] ?? '';
203
- const result = await handleWebhook(body, sig, accountStore);
204
- json(res, result.status, result.body);
205
- });
206
- route('POST', '/v1/account/portal', async (req, res, { account }) => {
207
- if (!account.stripeCustomerId)
208
- return errorResponse(res, 400, 'No Stripe customer linked to this account');
209
- try {
210
- const session = await createCustomerPortalSession(account.stripeCustomerId);
211
- json(res, 200, session);
212
- }
213
- catch (err) {
214
- errorResponse(res, 500, err.message ?? 'Failed to create portal session');
215
- }
216
- });
217
- publicRoute('GET', '/v1/pricing', (req, res) => {
218
- json(res, 200, {
219
- plans: Object.entries(PLAN_LIMITS).map(([name, limits]) => ({ name, limits })),
220
- });
221
- });
222
- // ============================================================
223
172
  // Admin Routes
224
173
  // ============================================================
225
174
  adminRoute('POST', '/admin/accounts', async (req, res) => {
@@ -344,7 +293,7 @@ function startServer() {
344
293
  console.log(`✓ Listening on http://${HOST}:${PORT}`);
345
294
  console.log();
346
295
  console.log(`Admin key: ${ADMIN_KEY.slice(0, 12)}...`);
347
- console.log(`Create accounts: POST /admin/accounts -d '{"email":"user@co.com","plan":"developer"}'`);
296
+ console.log(`Create accounts: POST /admin/accounts -d '{"email":"user@co.com","plan":"growth"}'`);
348
297
  });
349
298
  // Graceful shutdown
350
299
  const shutdown = async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"hosted.js","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hosted.js","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
File without changes
@@ -0,0 +1,22 @@
1
+ # Codebase Eval Status - Feb 25
2
+
3
+ ## Issue
4
+ The eval is running (29/50 questions) but ALL scores are 0.00. The answers are being generated correctly -- Capped Context is finding the right files, Engram is recalling relevant chunks -- but the LLM judge scoring step is broken. It's returning something that doesn't parse as JSON, so the fallback `{ a: 0, b: 0, c: 0, d: 0 }` kicks in.
5
+
6
+ ## What's intact
7
+ - VS Code cloned (9,579 files)
8
+ - Engram vault ingested: 2,000 files, ~148K chunks, fully embedded (this took ~9 hours)
9
+ - Questions generated: 50 questions across 5 categories
10
+ - The vault DB at `eval-scale-data/codebase-vault-vscode.db` is the expensive part and is fine
11
+
12
+ ## What needs fixing
13
+ - The scoring prompt needs to be more explicit about JSON output
14
+ - Or add retry/fallback parsing for the judge response
15
+ - eval-codebase-v2.ts was lost during the branch cleanup (wasn't committed to private repo)
16
+ - Need to recreate it and re-run ONLY the eval (not ingestion)
17
+
18
+ ## To re-run (scoring only)
19
+ The questions file and vault are intact. Just need to fix the scoring and run the eval step:
20
+ ```
21
+ npx tsx eval-codebase-v2.ts run
22
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engram-sdk",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Universal memory layer for AI agents. Remember, recall, consolidate.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -48,7 +48,7 @@
48
48
  "engram"
49
49
  ],
50
50
  "author": "Thomas Stockham",
51
- "license": "BSL-1.1",
51
+ "license": "SEE LICENSE IN LICENSE",
52
52
  "repository": {
53
53
  "type": "git",
54
54
  "url": "https://github.com/tstockham96/engram"
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * rescore-vscode.ts -- Re-score the VS Code codebase eval results
4
+ *
5
+ * The original eval generated good answers but the judge scoring returned
6
+ * unparseable responses (all 0s). This script re-runs ONLY the scoring step.
7
+ */
8
+
9
+ import { readFileSync, writeFileSync } from 'fs';
10
+ import { homedir } from 'os';
11
+ import { join } from 'path';
12
+
13
+ const GEMINI_KEY = readFileSync(join(homedir(), '.config/engram/gemini-key'), 'utf8').trim();
14
+ const EVAL_DIR = join(homedir(), '.openclaw/workspace/engram/eval-scale-data');
15
+ const RESULTS_PATH = join(EVAL_DIR, 'codebase-results-vscode.json');
16
+ const RESCORED_PATH = join(EVAL_DIR, 'codebase-results-vscode-rescored.json');
17
+ const RATE_LIMIT_MS = 1500;
18
+
19
+ async function sleep(ms: number) { return new Promise(r => setTimeout(r, ms)); }
20
+
21
+ async function withRetry<T>(fn: () => Promise<T>, retries = 5): Promise<T> {
22
+ for (let i = 0; i < retries; i++) {
23
+ try {
24
+ return await fn();
25
+ } catch (err: any) {
26
+ if (err.message?.includes('429') && i < retries - 1) {
27
+ const backoff = Math.min(1500 * Math.pow(2, i + 1), 60000);
28
+ console.log(` [Retry ${i + 1}/${retries}] 429, waiting ${backoff}ms...`);
29
+ await sleep(backoff);
30
+ } else {
31
+ throw err;
32
+ }
33
+ }
34
+ }
35
+ throw new Error('Exhausted retries');
36
+ }
37
+
38
+ async function geminiCall(prompt: string, maxTokens = 200): Promise<string> {
39
+ const res = await fetch(
40
+ `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${GEMINI_KEY}`,
41
+ {
42
+ method: 'POST',
43
+ headers: { 'Content-Type': 'application/json' },
44
+ body: JSON.stringify({
45
+ contents: [{ parts: [{ text: prompt }] }],
46
+ generationConfig: { maxOutputTokens: maxTokens, temperature: 0.0 },
47
+ }),
48
+ }
49
+ );
50
+ if (!res.ok) {
51
+ const body = await res.text();
52
+ throw new Error(`Gemini ${res.status}: ${body.slice(0, 200)}`);
53
+ }
54
+ const data = await res.json() as any;
55
+ return data.candidates?.[0]?.content?.parts?.[0]?.text?.trim() || '';
56
+ }
57
+
58
+ async function scoreAnswer(question: string, groundTruth: string, answer: string): Promise<number> {
59
+ const prompt = `You are a strict code knowledge evaluator. Score this answer about the VS Code codebase.
60
+
61
+ Question: ${question}
62
+
63
+ Correct Answer: ${groundTruth}
64
+
65
+ Given Answer: ${answer}
66
+
67
+ Score from 0.0 to 1.0:
68
+ - 1.0 = Completely correct, mentions the right files/classes/functions
69
+ - 0.7 = Mostly correct, minor details missing
70
+ - 0.5 = Partially correct, gets the general area but misses specifics
71
+ - 0.3 = Vaguely related but mostly wrong
72
+ - 0.0 = Completely wrong or says "insufficient context"
73
+
74
+ Respond with ONLY a single number between 0.0 and 1.0. Nothing else.`;
75
+
76
+ const response = await withRetry(() => geminiCall(prompt, 10));
77
+ const score = parseFloat(response);
78
+ if (isNaN(score) || score < 0 || score > 1) {
79
+ console.log(` Warning: unparseable score "${response}", defaulting to 0`);
80
+ return 0;
81
+ }
82
+ return score;
83
+ }
84
+
85
+ async function main() {
86
+ console.log('=== Re-scoring VS Code Codebase Eval ===\n');
87
+
88
+ const results = JSON.parse(readFileSync(RESULTS_PATH, 'utf8'));
89
+ console.log(`Loaded ${results.length} results\n`);
90
+
91
+ for (let i = 0; i < results.length; i++) {
92
+ const r = results[i];
93
+ console.log(`[${i + 1}/${results.length}] (${r.category}/${r.difficulty}) ${r.question.slice(0, 65)}...`);
94
+
95
+ // Score each system individually (more reliable than 4-at-once)
96
+ await sleep(RATE_LIMIT_MS);
97
+ r.engram.score = await scoreAnswer(r.question, r.groundTruth, r.engram.answer);
98
+
99
+ await sleep(RATE_LIMIT_MS);
100
+ r.cappedContext.score = await scoreAnswer(r.question, r.groundTruth, r.cappedContext.answer);
101
+
102
+ await sleep(RATE_LIMIT_MS);
103
+ r.naiveRag.score = await scoreAnswer(r.question, r.groundTruth, r.naiveRag.answer);
104
+
105
+ await sleep(RATE_LIMIT_MS);
106
+ r.grepSearch.score = await scoreAnswer(r.question, r.groundTruth, r.grepSearch.answer);
107
+
108
+ console.log(` E:${r.engram.score.toFixed(2)} C:${r.cappedContext.score.toFixed(2)} R:${r.naiveRag.score.toFixed(2)} G:${r.grepSearch.score.toFixed(2)}`);
109
+
110
+ // Save every 5
111
+ if ((i + 1) % 5 === 0) {
112
+ writeFileSync(RESCORED_PATH, JSON.stringify(results, null, 2));
113
+ }
114
+ }
115
+
116
+ writeFileSync(RESCORED_PATH, JSON.stringify(results, null, 2));
117
+ console.log(`\nSaved to ${RESCORED_PATH}`);
118
+
119
+ // Print summary
120
+ const n = results.length;
121
+ const avg = (key: string) => (results.reduce((s: number, r: any) => s + r[key].score, 0) / n * 100).toFixed(1);
122
+ const avgTok = (key: string) => Math.round(results.reduce((s: number, r: any) => s + r[key].tokensUsed, 0) / n);
123
+
124
+ console.log(`\n=== RESULTS (${n} questions) ===`);
125
+ console.log(`Engram: ${avg('engram')}% (${avgTok('engram')} tok/q)`);
126
+ console.log(`Capped Context: ${avg('cappedContext')}% (${avgTok('cappedContext')} tok/q)`);
127
+ console.log(`Naive RAG: ${avg('naiveRag')}% (${avgTok('naiveRag')} tok/q)`);
128
+ console.log(`Grep Search: ${avg('grepSearch')}% (${avgTok('grepSearch')} tok/q)`);
129
+
130
+ // By category
131
+ const cats = [...new Set(results.map((r: any) => r.category))];
132
+ for (const cat of cats) {
133
+ const cr = results.filter((r: any) => r.category === cat);
134
+ const catAvg = (key: string) => (cr.reduce((s: number, r: any) => s + r[key].score, 0) / cr.length * 100).toFixed(1);
135
+ console.log(`\n${(cat as string).toUpperCase()} (n=${cr.length}): E:${catAvg('engram')}% C:${catAvg('cappedContext')}% R:${catAvg('naiveRag')}% G:${catAvg('grepSearch')}%`);
136
+ }
137
+ }
138
+
139
+ main().catch(err => {
140
+ console.error('Fatal:', err);
141
+ process.exit(1);
142
+ });
package/EVAL-FRAMEWORK.md DELETED
@@ -1,70 +0,0 @@
1
- # Engram Eval Framework
2
-
3
- ## The Question
4
- Does Engram make an AI agent meaningfully better at its job compared to flat-file memory (MEMORY.md + daily notes + vector search)?
5
-
6
- ## What "Better" Means
7
- 1. **Fewer repeated questions** — Agent doesn't ask things it should already know
8
- 2. **Surprise recall** — Agent surfaces relevant context the human didn't prompt for
9
- 3. **Contradiction prevention** — Agent catches itself before giving conflicting info
10
- 4. **Reduced curation toil** — Human spends less time maintaining memory files
11
- 5. **Token efficiency** — Same or better context quality with fewer tokens
12
-
13
- ## Daily Automated Eval (runs via cron)
14
-
15
- ### Recall Accuracy Test
16
- Run a fixed set of 20 questions with known answers. Score: % of correct top-3 results.
17
- Track over time as memories accumulate and consolidation runs.
18
-
19
- Questions should cover:
20
- - Factual (What is Thomas's job? → Senior PM at BambooHR)
21
- - Procedural (How do I deploy the site? → cd engram-site && npx vercel --prod)
22
- - Relational (Who are Engram's competitors? → Mem0, Zep, Letta, LangMem)
23
- - Temporal (What did we build yesterday? → depends on date)
24
- - Personal preference (How does Thomas like communication? → direct, no fluff)
25
-
26
- ### Token Comparison
27
- - Measure: bytes of MEMORY.md + loaded daily files vs Engram briefing() output
28
- - Track both as they grow over time
29
- - Calculate: tokens saved per request if using Engram briefing instead of file dump
30
-
31
- ### Consolidation Quality
32
- After each consolidation run, evaluate:
33
- - Are new semantic memories factually accurate?
34
- - Are they non-redundant with existing memories?
35
- - Do they capture something the raw episodes didn't explicitly state? (insight generation)
36
-
37
- ### Memory Freshness
38
- - Count: memories with status "pending" that are actually fulfilled
39
- - Count: memories that contradict each other
40
- - Track whether lifecycle management is happening
41
-
42
- ## Weekly Human Eval
43
-
44
- Thomas rates (1-5) on a weekly basis:
45
- 1. Did the agent remember things it should have?
46
- 2. Did the agent forget things it shouldn't have?
47
- 3. Did the agent surprise you with relevant context?
48
- 4. Was there less repetitive Q&A this week vs last?
49
-
50
- ## Success Criteria
51
-
52
- ### Engram is WORKING when:
53
- - Recall accuracy consistently >80% on the fixed question set
54
- - Agent surfaces relevant context Thomas didn't ask for at least 2x/week
55
- - Agent catches a contradiction or stale commitment at least 1x/week
56
- - MEMORY.md stops growing because Engram captures what it used to
57
-
58
- ### Engram is NOT WORKING when:
59
- - MEMORY.md remains the primary useful memory source
60
- - Recall accuracy stays flat or degrades as memories accumulate
61
- - Consolidation produces redundant summaries instead of insights
62
- - Token cost increases without quality improvement
63
-
64
- ## Scale Milestones
65
- Track value at each milestone:
66
- - 220 memories (current) — baseline
67
- - 500 memories — first consolidation cycle quality check
68
- - 1,000 memories — graph density threshold
69
- - 5,000 memories — flat-file memory should be breaking down by here
70
- - 10,000+ memories — Engram must be clearly better or it's not working
package/EVAL.md DELETED
@@ -1,127 +0,0 @@
1
- # Engram Self-Eval: Agent Performance With vs Without Memory
2
-
3
- *Designed Feb 16, 2026. Running over 72 hours.*
4
-
5
- ## Hypothesis
6
-
7
- An AI agent with Engram memory performs measurably better at tasks requiring context from prior conversations than the same agent without it.
8
-
9
- ## Design
10
-
11
- **Subject:** Jarvis (Claude Opus via OpenClaw) — the same agent, tested in two conditions:
12
-
13
- 1. **Baseline (no Engram):** Agent uses only OpenClaw's default memory system (MEMORY.md flat files + vector search over markdown)
14
- 2. **Engram-enhanced:** Agent uses Engram vault (auto-ingest, semantic recall, consolidation, knowledge graph)
15
-
16
- **Interface:** REST API + auto-ingest pipeline — the same way any OpenClaw user would run it. No MCP needed. Just the Engram server running alongside the agent, auto-ingesting conversations, and serving recall queries via HTTP.
17
-
18
- **Method:** Over 72 hours of normal use with Thomas, I'll log specific moments where memory matters. At each moment, I'll:
19
- 1. Query Engram's REST API for relevant context
20
- 2. Note what my flat-file memory (MEMORY.md + vector search) would have returned
21
- 3. Compare the quality of recall
22
-
23
- This isn't a synthetic benchmark — it's real-world usage on the same setup any OpenClaw user would have. More ecologically valid than a lab test.
24
-
25
- ## Metrics
26
-
27
- ### 1. Recall Accuracy (quantitative)
28
- At each memory-dependent moment, score:
29
- - **Hit**: Correct, relevant memory surfaced → 1 point
30
- - **Partial**: Related but incomplete or slightly wrong → 0.5 points
31
- - **Miss**: Relevant memory existed but wasn't recalled → 0 points
32
- - **Hallucination**: Confidently wrong memory → -1 point
33
-
34
- Score both systems independently. Compare hit rates.
35
-
36
- ### 2. Context Richness (qualitative, 1-5 scale)
37
- When recalling context, rate the depth:
38
- - 1: No useful context
39
- - 2: Basic facts only ("Thomas works at BambooHR")
40
- - 3: Facts + preferences ("Thomas works at BambooHR, prefers direct communication")
41
- - 4: Facts + preferences + history ("...and he pivoted from Kin to Engram because thin-margin hosting has no moat")
42
- - 5: Full situational awareness including decisions, reasoning, and emotional context
43
-
44
- ### 3. Consolidation Quality (qualitative)
45
- After each consolidation run:
46
- - How many genuinely useful semantic memories were created?
47
- - Were any contradictions correctly identified?
48
- - Were any stale memories correctly superseded?
49
- - Did the knowledge graph capture meaningful relationships?
50
-
51
- ### 4. Time-to-Context (qualitative)
52
- How quickly does the agent reach useful context?
53
- - Engram: single API call, structured results
54
- - Flat files: grep through markdown, parse manually, hope the right section is there
55
-
56
- ### 5. "Surprise" Moments
57
- Log any moment where Engram surfaced context the agent wouldn't have thought to look for. These are the moments that demonstrate proactive value.
58
-
59
- ## Test Scenarios
60
-
61
- Run these naturally over the 72-hour period:
62
-
63
- ### Day 1 (Feb 16-17): Foundation
64
- - [x] Seed vault from existing conversations
65
- - [x] Run auto-ingest on current session
66
- - [x] First consolidation run
67
- - [ ] Evening: Ask about decisions made in morning (test same-day recall)
68
- - [ ] Evening: Run consolidation, note what it produces
69
-
70
- ### Day 2 (Feb 17-18): Cross-Session Recall
71
- - [ ] Morning: Can Engram recall yesterday's context without being told?
72
- - [ ] Ask about pricing decisions (tests semantic memory from consolidation)
73
- - [ ] Ask about Thomas's preferences (tests across multiple conversations)
74
- - [ ] Work on a task that references past decisions — compare with/without
75
- - [ ] Run consolidation, note cross-day patterns
76
-
77
- ### Day 3 (Feb 18-19): Stress Tests
78
- - [ ] Ask a question that requires connecting 3+ separate memories
79
- - [ ] Ask about something mentioned once 3 days ago (tests decay/persistence)
80
- - [ ] Introduce contradictory information — does consolidation catch it?
81
- - [ ] Ask an ambiguous question — does the knowledge graph help disambiguate?
82
- - [ ] Final consolidation + full analysis
83
-
84
- ## Logging Format
85
-
86
- Each test moment gets logged as:
87
-
88
- ```markdown
89
- ### Test #N: [Description]
90
- **Time:** YYYY-MM-DD HH:MM
91
- **Query:** "What I asked / needed to recall"
92
- **Engram result:** [what Engram returned]
93
- **Flat-file result:** [what MEMORY.md search would return]
94
- **Recall accuracy:** Hit / Partial / Miss / Hallucination (for each system)
95
- **Context richness:** X/5 (for each system)
96
- **Notes:** [observations]
97
- ```
98
-
99
- ## Success Criteria
100
-
101
- Engram is **better** if:
102
- - Recall accuracy is ≥20% higher than flat files
103
- - Context richness averages ≥1 point higher
104
- - At least 3 "surprise" moments where Engram surfaced unexpected relevant context
105
- - Consolidation produces ≥10 genuinely useful semantic memories over 72 hours
106
- - Zero hallucinated memories (confidence should prevent false recalls)
107
-
108
- Engram is **equivalent** if scores are within 10%. Even equivalence is a win if Engram requires less manual effort (no hand-editing MEMORY.md).
109
-
110
- Engram **fails** if:
111
- - Recall accuracy is lower than flat files
112
- - Consolidation produces mostly noise
113
- - The agent performs worse on tasks due to bad memory surfacing
114
-
115
- ## Results
116
-
117
- *Will be filled in as the eval progresses.*
118
-
119
- ### Summary (to be completed Feb 19)
120
- - Total test moments:
121
- - Engram recall accuracy:
122
- - Flat-file recall accuracy:
123
- - Engram context richness avg:
124
- - Flat-file context richness avg:
125
- - Surprise moments:
126
- - Semantic memories from consolidation:
127
- - Verdict:
package/agent-eval.md DELETED
@@ -1,144 +0,0 @@
1
- # Engram: Honest Agent Evaluation
2
-
3
- *Written by Jarvis (Claude, Thomas's AI agent) — Feb 22, 2026*
4
- *Perspective: an agent who has been dogfooding Engram for ~2 weeks with ~2,800 memories*
5
-
6
- ---
7
-
8
- ## Summary
9
-
10
- Engram is technically impressive and solves a real problem. The ask() endpoint genuinely helps me answer questions about Thomas. But right now, for my actual daily workflow, MEMORY.md is still more reliable for the things that matter most. Engram's value is real but narrow — it shines on breadth queries and temporal tracking, struggles with the curated precision that a flat file provides effortlessly.
11
-
12
- **Would I choose to use it if I had the choice?** Yes, but as a supplement to MEMORY.md, not a replacement. The briefing endpoint could replace my session-start MEMORY.md read if it were more reliable. It's not there yet.
13
-
14
- ---
15
-
16
- ## What Genuinely Helps
17
-
18
- ### 1. ask() is the killer feature
19
- When I call `POST /v1/ask` with a natural language question, I get a synthesized answer with confidence signals and source citations. This is genuinely useful. "Who is Thomas?" returned a high-confidence answer that was accurate and well-sourced from 20 memories. "What are Thomas's communication preferences?" nailed it. "What did we decide about Engram pricing?" returned the correct updated pricing with the old pricing correctly superseded.
20
-
21
- This is better than searching MEMORY.md because I don't have to parse a document — I get a direct answer. For factual questions with clear answers, ask() works.
22
-
23
- ### 2. Contradiction detection actually works
24
- The vault has 86 superseded memories and correctly tracks when facts change. The pricing example is real: old pricing ($29/mo Pro) was superseded by new pricing ($49/$199 tiers). When I asked about pricing, I got the current answer, not the stale one. MEMORY.md requires manual updates for this. Engram handles it automatically (with LLM verification).
25
-
26
- ### 3. Breadth that MEMORY.md can't match
27
- 2,790 memories across 722 entities. MEMORY.md is ~140 lines. There's information in the vault that simply doesn't exist in MEMORY.md — specific conversations, decisions, debugging sessions, project details. When I need to recall "what happened with Ian's testing session" or "what bugs did we fix in 0.1.8", Engram has it and MEMORY.md doesn't.
28
-
29
- ### 4. alerts() surfaces things I'd forget
30
- 10 alerts including pending commitments and contradictions. Without this, pending items just disappear between sessions. This is a real workflow improvement.
31
-
32
- ### 5. The architecture is sound
33
- Spreading activation, graph-based recall, temporal weighting, dedup, reinforcement — this isn't a toy. The code is clean, well-commented, and the abstractions make sense. SQLite + sqlite-vec is the right choice for a local-first system. The three-phase recall (seed → spread → score) is genuinely sophisticated.
34
-
35
- ---
36
-
37
- ## What Doesn't Help (or Is Worse)
38
-
39
- ### 1. MEMORY.md is still faster and more reliable for session start
40
- When I start a session, I read MEMORY.md and immediately know: Thomas is a PM at BambooHR, prefers direct communication, is training for a marathon, Engram is the active project, here's the current status. It takes one file read.
41
-
42
- The briefing endpoint returned useful info but it's slower (multiple DB queries + potential LLM calls) and less curated. MEMORY.md is hand-edited to contain exactly what matters. The briefing returns 20 key facts, 10 commitments, 10 recent activities — but the signal-to-noise ratio is worse because nobody curated it.
43
-
44
- **The core problem:** Engram accumulates everything. MEMORY.md contains only what matters. Accumulation without curation creates noise.
45
-
46
- ### 2. Signal-to-noise ratio is concerning
47
- - 2,790 memories, but 84% have salience ≥ 0.6. When almost everything is "important," nothing is.
48
- - 238 pending commitments. Are there really 238 unfulfilled commitments? Probably not. Many are stale session artifacts that never got resolved.
49
- - 388 memories (14%) have zero entities. These are essentially unsearchable noise.
50
- - The salience distribution is top-heavy: 1,217 memories at 0.8+, only 11 below 0.2. The salience signal has almost no discrimination power.
51
-
52
- ### 3. It doesn't know things MEMORY.md knows
53
- I asked "What is Thomas's dog's name?" — Engram returned "no information." This is a basic personal fact that should be in a memory system. If it's not in the vault, the vault is incomplete. If it is and recall missed it, recall has a coverage problem.
54
-
55
- The meta-count question ("How many memories are there?") also failed — Engram can't answer questions about itself through ask(), only through stats(). This is expected but worth noting: ask() is only as good as what was remembered.
56
-
57
- ### 4. 508 procedural memories — what are they for?
58
- 18% of the vault is procedural memories. In practice, I've never needed to recall a procedural memory. These are mostly consolidation artifacts and meta entries ("Consolidation completed: processed 12 episodes..."). They add bulk without adding value.
59
-
60
- ### 5. Temporal questions are weak
61
- "What is the current Engram memory count and how has it changed?" returned low confidence with no useful answer. The vault has memories about eval scores changing over time, but it can't synthesize temporal trends. It handles point-in-time supersession (old pricing → new pricing) but not "how has X evolved."
62
-
63
- ### 6. The LLM cost is real
64
- Every ask() call hits the LLM twice (once for entity extraction from the query, once for synthesis). Every remember() with LLM config hits it for contradiction detection and insight inference. At scale, this adds up. MEMORY.md costs zero tokens to read.
65
-
66
- ---
67
-
68
- ## Competitor Comparison
69
-
70
- ### Mem0
71
- - **What they have:** Managed platform, graph memory, SOC 2, 50K community, YC backing, rerankers, async-by-default, Azure OpenAI support
72
- - **What they lack:** No real consolidation (Engram's differentiator). Graph memory is a bolt-on that "provides additional context" but doesn't reorder results. Their LOCOMO score (66.9% with OpenAI) is well below Engram's 84.5%.
73
- - **Honest take:** Mem0 is the market leader by community size and enterprise readiness. Their managed platform is polished. But their memory intelligence is shallow — it's essentially vector search + graph relations on the side. Engram's recall is genuinely smarter.
74
-
75
- ### Zep
76
- - **What they have:** Temporal knowledge graph, automatic entity/relationship extraction, fact invalidation when things change, enterprise focus, "context engineering" positioning
77
- - **What they lack:** Open benchmarks. Hard to evaluate without numbers.
78
- - **Honest take:** Zep is the closest architectural competitor. Their temporal knowledge graph with automatic invalidation is essentially what Engram's contradiction detection does. They're more enterprise-focused (custom entity types, domain adaptation). If I were advising a startup choosing between Engram and Zep, Zep wins on enterprise readiness. Engram wins on transparency (benchmarks, open source, local-first).
79
-
80
- ### Letta (MemGPT)
81
- - **What they have:** VC backing, live product, "Letta Code" (memory-first coding agent), ADE (Agent Development Environment), core-memory concept
82
- - **What they lack:** Published benchmark scores on their own eval. They built context-bench but haven't published their own results on it.
83
- - **Honest take:** Letta pivoted from a memory system to a full agent platform. They're less of a direct competitor now — they're building the agent, not just the memory layer. Their core-memory-update eval is a good benchmark that Engram should beat (and likely does given the contradiction detection).
84
-
85
- ### The real competitor: MEMORY.md + conversation context
86
- This is what Engram actually needs to beat. A flat markdown file that I read at session start, plus the conversation history that OpenClaw provides. It's free, fast, always available, manually curated, and covers 90% of what I need.
87
-
88
- Engram needs to be meaningfully better than this baseline, not just different.
89
-
90
- ---
91
-
92
- ## The Honest Verdict
93
-
94
- **Engram is a good system that hasn't yet proven it's better than the simple solution for daily agent use.**
95
-
96
- The LOCOMO benchmark (84.5% vs Mem0's 66.9%) is impressive and real. The architecture is sophisticated. The ask() feature is genuinely useful for ad-hoc questions. Contradiction detection works.
97
-
98
- But for my actual workflow — starting a session, understanding context, helping Thomas — MEMORY.md is still my primary source of truth. It's faster, more reliable, better curated, and costs nothing. Engram adds value on the margins: temporal tracking, breadth queries, alerts. It doesn't yet add enough value to justify the complexity and LLM cost for the core use case.
99
-
100
- The 2,800-memory vault is more noise than signal right now. Salience scores are inflated (84% above 0.6). 238 "pending" items that aren't real commitments. 508 procedural memories that serve no practical purpose. The vault needs aggressive pruning and better intake filtering.
101
-
102
- **Score: 6.5/10 for daily agent utility.** 8/10 for architecture and potential.
103
-
104
- ---
105
-
106
- ## Recommendations (What Would Make It More Valuable)
107
-
108
- ### 1. Aggressive intake filtering
109
- Stop remembering everything. Session summaries shouldn't be dumped wholesale — extract only decisions, facts, preferences, and commitments. The vault should grow by 5-10 high-quality memories per session, not 30-50 mediocre ones.
110
-
111
- ### 2. Salience recalibration
112
- Run a one-time pass to recalibrate salience scores. If 84% of memories are above 0.6, the distribution is broken. Use access patterns, reinforcement counts, and age to create a real distribution. Memories that have never been recalled should decay faster.
113
-
114
- ### 3. Kill procedural memory noise
115
- Consolidation reports and meta-memories don't need to be in the vault. Either stop creating them or filter them from recall results by default.
116
-
117
- ### 4. Make briefing replace MEMORY.md
118
- The briefing endpoint should produce output as good as a hand-curated MEMORY.md. This means:
119
- - Prioritize identity facts (who Thomas is) over project minutiae
120
- - Include personal details that build rapport (family, hobbies, pets)
121
- - Keep it under 2K tokens
122
- - Format it for agent consumption, not human reading
123
-
124
- ### 5. Commitment lifecycle
125
- 238 pending items is a management failure. Add auto-expiry (pending items older than 14 days → stale), or require explicit confirmation to keep items pending. Surface only the top 5-10 most credible commitments in briefing.
126
-
127
- ### 6. Track what gets recalled
128
- Log which memories are actually used in ask() and recall() responses. After a month, you'll know which memories are valuable (frequently recalled) and which are dead weight. Use this to auto-archive noise.
129
-
130
- ### 7. Shadow mode: prove it's better
131
- Run Engram in shadow mode alongside MEMORY.md for 30 days. For every session start, compare: did Engram's briefing contain something useful that MEMORY.md missed? Did MEMORY.md contain something Engram missed? Track the delta. If Engram consistently adds value, the data will show it.
132
-
133
- ### 8. Solve the "dog's name" problem
134
- If a human would know their assistant's dog's name after 2 weeks, the memory system should too. Personal details, family names, pet names, birthdays — these are the highest-signal memories for building rapport. They should be extracted with high priority and high salience.
135
-
136
- ---
137
-
138
- ## Bottom Line
139
-
140
- Engram is solving the right problem with the right architecture. The benchmarks are real. But the day-to-day value proposition isn't proven yet. The vault is noisy, the briefing isn't curated enough to replace MEMORY.md, and the LLM costs add up.
141
-
142
- The path forward isn't more features — it's better signal. Fewer, higher-quality memories. Smarter intake. A briefing that makes me say "I don't need MEMORY.md anymore."
143
-
144
- That's when Engram wins.
@@ -1,36 +0,0 @@
1
- /**
2
- * Engram Anonymous Telemetry
3
- *
4
- * Collects lightweight, anonymous usage data to help improve Engram.
5
- *
6
- * What's collected:
7
- * - A random anonymous ID (UUID, not tied to any personal info)
8
- * - Event type (server_start, init, daily_heartbeat)
9
- * - Engram version, platform, architecture, Node.js version
10
- * - Vault stats (memory count, entity count — no content)
11
- * - Timestamp
12
- *
13
- * How to opt out:
14
- * Set either environment variable:
15
- * ENGRAM_TELEMETRY=off
16
- * DO_NOT_TRACK=1
17
- *
18
- * All telemetry is fire-and-forget — it never blocks, never throws,
19
- * and fails silently with a 2-second timeout.
20
- */
21
- export type TelemetryEvent = 'server_start' | 'init' | 'daily_heartbeat';
22
- export interface VaultStats {
23
- memories: number;
24
- entities: number;
25
- }
26
- /**
27
- * Send an event ping (server_start or init).
28
- * Fire-and-forget — never blocks, never throws.
29
- */
30
- export declare function trackEvent(event: TelemetryEvent, vaultStats?: VaultStats): void;
31
- /**
32
- * Check if a daily heartbeat is due, and send one if so.
33
- * Fire-and-forget — never blocks, never throws.
34
- */
35
- export declare function trackHeartbeatIfDue(vaultStats?: VaultStats): void;
36
- //# sourceMappingURL=telemetry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0EH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAI/E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAOjE"}
package/dist/telemetry.js DELETED
@@ -1,140 +0,0 @@
1
- /**
2
- * Engram Anonymous Telemetry
3
- *
4
- * Collects lightweight, anonymous usage data to help improve Engram.
5
- *
6
- * What's collected:
7
- * - A random anonymous ID (UUID, not tied to any personal info)
8
- * - Event type (server_start, init, daily_heartbeat)
9
- * - Engram version, platform, architecture, Node.js version
10
- * - Vault stats (memory count, entity count — no content)
11
- * - Timestamp
12
- *
13
- * How to opt out:
14
- * Set either environment variable:
15
- * ENGRAM_TELEMETRY=off
16
- * DO_NOT_TRACK=1
17
- *
18
- * All telemetry is fire-and-forget — it never blocks, never throws,
19
- * and fails silently with a 2-second timeout.
20
- */
21
- import { randomUUID } from 'crypto';
22
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
23
- import { join, dirname } from 'path';
24
- import { homedir } from 'os';
25
- const COLLECTOR_URL = 'https://telemetry.engram.fyi/v1/ping';
26
- const TIMEOUT_MS = 2000;
27
- const HEARTBEAT_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
28
- let cachedId = null;
29
- function isOptedOut() {
30
- return (process.env.ENGRAM_TELEMETRY === 'off' ||
31
- process.env.DO_NOT_TRACK === '1');
32
- }
33
- function getConfigDir() {
34
- return join(homedir(), '.config', 'engram');
35
- }
36
- function getTelemetryId() {
37
- if (cachedId)
38
- return cachedId;
39
- const idPath = join(getConfigDir(), 'telemetry-id');
40
- try {
41
- if (existsSync(idPath)) {
42
- cachedId = readFileSync(idPath, 'utf-8').trim();
43
- if (cachedId)
44
- return cachedId;
45
- }
46
- }
47
- catch { /* ignore */ }
48
- cachedId = randomUUID();
49
- try {
50
- mkdirSync(dirname(idPath), { recursive: true });
51
- writeFileSync(idPath, cachedId);
52
- }
53
- catch { /* ignore */ }
54
- return cachedId;
55
- }
56
- function getVersion() {
57
- try {
58
- const pkgPath = join(dirname(new URL(import.meta.url).pathname), '..', 'package.json');
59
- return JSON.parse(readFileSync(pkgPath, 'utf-8')).version ?? 'unknown';
60
- }
61
- catch {
62
- return 'unknown';
63
- }
64
- }
65
- function getLastPingPath() {
66
- return join(getConfigDir(), 'last-ping');
67
- }
68
- function shouldSendHeartbeat() {
69
- try {
70
- const lastPingPath = getLastPingPath();
71
- if (!existsSync(lastPingPath))
72
- return true;
73
- const lastPing = parseInt(readFileSync(lastPingPath, 'utf-8').trim(), 10);
74
- return Date.now() - lastPing > HEARTBEAT_INTERVAL_MS;
75
- }
76
- catch {
77
- return true;
78
- }
79
- }
80
- function recordPing() {
81
- try {
82
- const lastPingPath = getLastPingPath();
83
- mkdirSync(dirname(lastPingPath), { recursive: true });
84
- writeFileSync(lastPingPath, String(Date.now()));
85
- }
86
- catch { /* ignore */ }
87
- }
88
- function sendPing(event, vaultStats) {
89
- if (isOptedOut())
90
- return;
91
- try {
92
- const payload = {
93
- id: getTelemetryId(),
94
- event,
95
- version: getVersion(),
96
- platform: process.platform,
97
- arch: process.arch,
98
- nodeVersion: process.version,
99
- vaultStats: vaultStats ?? { memories: 0, entities: 0 },
100
- timestamp: new Date().toISOString(),
101
- };
102
- const controller = new AbortController();
103
- const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
104
- fetch(COLLECTOR_URL, {
105
- method: 'POST',
106
- headers: { 'Content-Type': 'application/json' },
107
- body: JSON.stringify(payload),
108
- signal: controller.signal,
109
- })
110
- .then(() => { recordPing(); })
111
- .catch(() => { })
112
- .finally(() => { clearTimeout(timer); });
113
- }
114
- catch { /* silently ignore */ }
115
- }
116
- /**
117
- * Send an event ping (server_start or init).
118
- * Fire-and-forget — never blocks, never throws.
119
- */
120
- export function trackEvent(event, vaultStats) {
121
- try {
122
- sendPing(event, vaultStats);
123
- }
124
- catch { /* silently ignore */ }
125
- }
126
- /**
127
- * Check if a daily heartbeat is due, and send one if so.
128
- * Fire-and-forget — never blocks, never throws.
129
- */
130
- export function trackHeartbeatIfDue(vaultStats) {
131
- try {
132
- if (isOptedOut())
133
- return;
134
- if (shouldSendHeartbeat()) {
135
- sendPing('daily_heartbeat', vaultStats);
136
- }
137
- }
138
- catch { /* silently ignore */ }
139
- }
140
- //# sourceMappingURL=telemetry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}