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 +12 -5
- package/LICENSE +85 -80
- package/dist/accounts.d.ts +0 -1
- package/dist/accounts.d.ts.map +1 -1
- package/dist/accounts.js +0 -14
- package/dist/accounts.js.map +1 -1
- package/dist/cli.js +0 -0
- package/dist/hosted.d.ts.map +1 -1
- package/dist/hosted.js +1 -52
- package/dist/hosted.js.map +1 -1
- package/dist/server.js +0 -0
- package/eval-codebase-v2-NOTE.md +22 -0
- package/package.json +2 -2
- package/rescore-vscode.ts +142 -0
- package/EVAL-FRAMEWORK.md +0 -70
- package/EVAL.md +0 -127
- package/agent-eval.md +0 -144
- package/dist/telemetry.d.ts +0 -36
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -140
- package/dist/telemetry.js.map +0 -1
package/Dockerfile
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
FROM node:
|
|
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
|
|
9
|
+
RUN npm ci
|
|
10
|
+
|
|
11
|
+
COPY . .
|
|
12
|
+
RUN npm run build
|
|
13
|
+
RUN npm prune --production
|
|
7
14
|
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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.
|
package/dist/accounts.d.ts
CHANGED
|
@@ -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;
|
package/dist/accounts.d.ts.map
CHANGED
|
@@ -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;
|
|
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)
|
package/dist/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBtD,MAAM,CAAC,MAAM,WAAW,GAA+G;IACrI,IAAI,EAAQ,EAAE,QAAQ,EAAE,IAAI,EAAI,OAAO,EAAE,GAAG,EAAK,cAAc,EAAE,CAAC,EAAK,MAAM,EAAE,CAAC,EAAG,KAAK,EAAE,CAAC,EAAE;IAC7F,SAAS,EAAG,EAAE,QAAQ,EAAE,KAAK,EAAG,OAAO,EAAE,IAAI,EAAI,cAAc,EAAE,EAAE,EAAI,MAAM,EAAE,CAAC,EAAG,KAAK,EAAE,EAAE,EAAE;IAC9F,IAAI,EAAQ,EAAE,QAAQ,EAAE,KAAK,EAAG,OAAO,EAAE,KAAK,EAAG,cAAc,EAAE,GAAG,EAAG,MAAM,EAAE,CAAC,EAAG,KAAK,EAAE,EAAE,EAAE;IAC9F,QAAQ,EAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAM,OAAO,EAAE,CAAC,CAAC,EAAM,cAAc,EAAE,CAAC,CAAC,EAAI,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;IAC/F,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAM,OAAO,EAAE,CAAC,CAAC,EAAM,cAAc,EAAE,CAAC,CAAC,EAAI,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE;CAC/F,CAAC;AAIF,MAAM,OAAO,YAAY;IACf,EAAE,CAAe;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;KAaZ,CAAC,CAAC;
|
|
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
|
package/dist/hosted.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted.d.ts","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":";
|
|
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":"
|
|
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 () => {
|
package/dist/hosted.js.map
CHANGED
|
@@ -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.
|
|
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": "
|
|
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.
|
package/dist/telemetry.d.ts
DELETED
|
@@ -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
|
package/dist/telemetry.d.ts.map
DELETED
|
@@ -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
|
package/dist/telemetry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|