engram-sdk 0.5.4 → 0.5.6

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/BADGE.md ADDED
@@ -0,0 +1,47 @@
1
+ # "Made with Engram" Badge
2
+
3
+ ## Badge URLs (via shields.io)
4
+
5
+ ### Dark badge (recommended)
6
+ ![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJ3aGl0ZSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiIG9wYWNpdHk9IjAuMyIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjYiIG9wYWNpdHk9IjAuNiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjIuNSIvPjwvc3ZnPg==)
7
+
8
+ ### Flat badge
9
+ ![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat-square)
10
+
11
+ ### For-the-badge (large)
12
+ ![Made with Engram](https://img.shields.io/badge/MEMORY-ENGRAM-8B5CF6?style=for-the-badge)
13
+
14
+ ## Markdown (copy-paste for READMEs)
15
+
16
+ ### Recommended (links to repo)
17
+ ```markdown
18
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJ3aGl0ZSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiIG9wYWNpdHk9IjAuMyIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjYiIG9wYWNpdHk9IjAuNiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjIuNSIvPjwvc3ZnPg==)](https://github.com/tstockham96/engram)
19
+ ```
20
+
21
+ ### Simple (no custom icon)
22
+ ```markdown
23
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat)](https://github.com/tstockham96/engram)
24
+ ```
25
+
26
+ ### HTML (for websites)
27
+ ```html
28
+ <a href="https://github.com/tstockham96/engram">
29
+ <img src="https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJ3aGl0ZSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiIG9wYWNpdHk9IjAuMyIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjYiIG9wYWNpdHk9IjAuNiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjIuNSIvPjwvc3ZnPg==" alt="Made with Engram" />
30
+ </a>
31
+ ```
32
+
33
+ ## Adding to Engram's README
34
+
35
+ Add this section to the README:
36
+
37
+ ```markdown
38
+ ## Badge
39
+
40
+ Using Engram in your project? Add the badge to your README:
41
+
42
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat)](https://github.com/tstockham96/engram)
43
+
44
+ ```markdown
45
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat)](https://github.com/tstockham96/engram)
46
+ `` `
47
+ ```
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  **Universal memory layer for AI agents**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/engram-sdk)](https://www.npmjs.com/package/engram-sdk)
6
- [![License: BSL 1.1](https://img.shields.io/badge/License-BSL--1.1-blue.svg)](./LICENSE)
6
+ [![License: Proprietary](https://img.shields.io/badge/License-EULA-blue.svg)](./LICENSE)
7
7
  [![GitHub stars](https://img.shields.io/github/stars/tstockham96/engram)](https://github.com/tstockham96/engram)
8
8
 
9
9
  Engram gives AI agents knowledge graphs, consolidation, and spreading activation. Not storage. Understanding.
@@ -336,6 +336,18 @@ If you're making heavy use of Engram (frequent remembers + recalls in quick succ
336
336
 
337
337
  ---
338
338
 
339
+ ## Badge
340
+
341
+ Using Engram in your project? Add the badge to your README:
342
+
343
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat)](https://github.com/tstockham96/engram)
344
+
345
+ ```markdown
346
+ [![Made with Engram](https://img.shields.io/badge/memory-Engram-8B5CF6?style=flat)](https://github.com/tstockham96/engram)
347
+ ```
348
+
349
+ ---
350
+
339
351
  ## License
340
352
 
341
353
  [Business Source License 1.1](./LICENSE)
@@ -0,0 +1,39 @@
1
+ # "Made with Engram" Badge
2
+
3
+ Add this to your README to show your agent uses Engram for memory.
4
+
5
+ ## Markdown
6
+
7
+ ```markdown
8
+ [![Memory: Engram](https://img.shields.io/badge/🧠_memory-engram-7c3aed?style=for-the-badge)](https://github.com/tstockham96/engram)
9
+ ```
10
+
11
+ ## Shields.io (recommended — no hosted SVG needed)
12
+
13
+ ```markdown
14
+ [![Memory: Engram](https://img.shields.io/badge/memory-engram-7c3aed?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiBmaWxsPSJub25lIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNMTIgNnY2bDQgMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+&style=flat)](https://github.com/tstockham96/engram)
15
+ ```
16
+
17
+ ## HTML
18
+
19
+ ```html
20
+ <a href="https://github.com/tstockham96/engram">
21
+ <img src="https://img.shields.io/badge/🧠_memory-engram-7c3aed?style=for-the-badge" alt="Memory: Engram" />
22
+ </a>
23
+ ```
24
+
25
+ ## Preview
26
+
27
+ The badge renders as a purple shield badge: `🧠 memory | engram`
28
+
29
+ ## Variations
30
+
31
+ **Flat style:**
32
+ ```markdown
33
+ [![Memory: Engram](https://img.shields.io/badge/🧠_memory-engram-7c3aed)](https://github.com/tstockham96/engram)
34
+ ```
35
+
36
+ **For-the-badge (larger):**
37
+ ```markdown
38
+ [![Memory: Engram](https://img.shields.io/badge/🧠_memory-engram-7c3aed?style=for-the-badge)](https://github.com/tstockham96/engram)
39
+ ```
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="180" height="28" role="img" aria-label="memory: engram">
2
+ <title>memory: engram</title>
3
+ <linearGradient id="s" x2="0" y2="100%">
4
+ <stop offset="0" stop-color="#fff" stop-opacity=".7"/>
5
+ <stop offset=".1" stop-color="#aaa" stop-opacity=".1"/>
6
+ <stop offset=".9" stop-color="#000" stop-opacity=".3"/>
7
+ <stop offset="1" stop-color="#000" stop-opacity=".5"/>
8
+ </linearGradient>
9
+ <clipPath id="r">
10
+ <rect width="180" height="28" rx="5" fill="#fff"/>
11
+ </clipPath>
12
+ <g clip-path="url(#r)">
13
+ <rect width="90" height="28" fill="#555"/>
14
+ <rect x="90" width="90" height="28" fill="#7c3aed"/>
15
+ <rect width="180" height="28" fill="url(#s)"/>
16
+ </g>
17
+ <g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="11">
18
+ <text x="45" y="19.5" fill="#010101" fill-opacity=".3">🧠 memory</text>
19
+ <text x="45" y="19">🧠 memory</text>
20
+ <text x="135" y="19.5" fill="#010101" fill-opacity=".3">engram</text>
21
+ <text x="135" y="19">engram</text>
22
+ </g>
23
+ </svg>
@@ -1,4 +1,5 @@
1
- export type Plan = 'free' | 'developer' | 'team' | 'business' | 'enterprise';
1
+ export type Plan = 'free' | 'developer' | 'team' | 'business' | 'enterprise' | 'enterprise_trial';
2
+ export type OrgRole = 'admin' | 'member' | 'readonly';
2
3
  export interface Account {
3
4
  id: string;
4
5
  email: string;
@@ -11,18 +12,33 @@ export interface Account {
11
12
  usageResetAt: string;
12
13
  stripeCustomerId: string | null;
13
14
  stripeSubscriptionId: string | null;
15
+ orgId?: string;
16
+ role?: OrgRole;
17
+ }
18
+ export interface Organization {
19
+ id: string;
20
+ name: string;
21
+ plan: Plan;
22
+ createdAt: string;
23
+ trialExpiresAt: string | null;
24
+ allowedDomain: string | null;
25
+ }
26
+ export interface CreateOrgOptions {
27
+ trialDays?: number;
28
+ allowedDomain?: string;
14
29
  }
15
30
  export declare const PLAN_LIMITS: Record<Plan, {
16
31
  memories: number;
17
32
  recalls: number;
18
33
  consolidations: number;
19
- agents: number;
20
34
  price: number;
21
35
  }>;
22
36
  export type UsageType = 'memory' | 'recall' | 'consolidation';
37
+ export declare function isValidEmail(email: string): boolean;
23
38
  export declare class AccountStore {
24
39
  private db;
25
40
  constructor(dbPath: string);
41
+ private migrate;
26
42
  generateApiKey(): string;
27
43
  private nextResetDate;
28
44
  createAccount(email: string, plan?: Plan): Account;
@@ -41,6 +57,20 @@ export declare class AccountStore {
41
57
  getAccountByStripeCustomerId(customerId: string): Account | null;
42
58
  updatePlan(accountId: string, plan: Plan, stripeSubscriptionId?: string): void;
43
59
  updateStripeIds(accountId: string, customerId: string, subscriptionId: string): void;
60
+ createOrg(name: string, adminEmail: string, plan: Plan, options?: CreateOrgOptions): {
61
+ org: Organization;
62
+ owner: Account;
63
+ };
64
+ addOrgMember(orgId: string, email: string, role?: OrgRole): Account;
65
+ getOrgById(orgId: string): Organization | null;
66
+ getOrgByAccount(accountId: string): Organization | null;
67
+ getOrgMembers(orgId: string): Account[];
68
+ getVaultId(accountId: string): string;
69
+ isTrialExpired(orgId: string): boolean;
70
+ setTrialExpiry(orgId: string, expiresAt: string): void;
71
+ extendTrial(orgId: string, additionalDays: number): void;
72
+ listOrgs(): Organization[];
73
+ private rowToOrg;
44
74
  close(): void;
45
75
  private rowToAccount;
46
76
  }
@@ -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;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"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
package/dist/accounts.js CHANGED
@@ -1,17 +1,24 @@
1
1
  import { DatabaseSync } from 'node:sqlite';
2
2
  import { randomBytes, randomUUID } from 'node:crypto';
3
3
  export const PLAN_LIMITS = {
4
- free: { memories: 1000, recalls: 500, consolidations: 5, agents: 1, price: 0 },
5
- developer: { memories: 10000, recalls: 5000, consolidations: 20, agents: 1, price: 29 },
6
- team: { memories: 50000, recalls: 25000, consolidations: 100, agents: 5, price: 99 },
7
- business: { memories: -1, recalls: -1, consolidations: -1, agents: -1, price: 499 },
8
- enterprise: { memories: -1, recalls: -1, consolidations: -1, agents: -1, price: -1 },
4
+ free: { memories: 1000, recalls: 500, consolidations: 5, price: 0 },
5
+ developer: { memories: 10000, recalls: 5000, consolidations: 20, price: 29 },
6
+ team: { memories: 50000, recalls: 25000, consolidations: 100, price: 99 },
7
+ business: { memories: -1, recalls: -1, consolidations: -1, price: 499 },
8
+ enterprise: { memories: -1, recalls: -1, consolidations: -1, price: -1 },
9
+ enterprise_trial: { memories: -1, recalls: -1, consolidations: -1, price: 0 },
9
10
  };
11
+ // Basic email format validation (not exhaustive, but catches obvious junk)
12
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
13
+ export function isValidEmail(email) {
14
+ return typeof email === 'string' && email.length <= 254 && EMAIL_RE.test(email);
15
+ }
10
16
  export class AccountStore {
11
17
  db;
12
18
  constructor(dbPath) {
13
19
  this.db = new DatabaseSync(dbPath);
14
20
  this.db.exec('PRAGMA journal_mode = WAL');
21
+ // Create base table (without Stripe columns for compat with existing DBs)
15
22
  this.db.exec(`
16
23
  CREATE TABLE IF NOT EXISTS accounts (
17
24
  id TEXT PRIMARY KEY,
@@ -25,6 +32,39 @@ export class AccountStore {
25
32
  usage_reset_at TEXT NOT NULL
26
33
  );
27
34
  CREATE INDEX IF NOT EXISTS idx_accounts_api_key ON accounts(api_key);
35
+ `);
36
+ // Migration: add Stripe columns if missing, then create index
37
+ this.migrate();
38
+ }
39
+ migrate() {
40
+ const cols = this.db.prepare(`PRAGMA table_info(accounts)`).all();
41
+ const colNames = new Set(cols.map((c) => c.name));
42
+ if (!colNames.has('stripe_customer_id')) {
43
+ this.db.exec(`ALTER TABLE accounts ADD COLUMN stripe_customer_id TEXT`);
44
+ }
45
+ if (!colNames.has('stripe_subscription_id')) {
46
+ this.db.exec(`ALTER TABLE accounts ADD COLUMN stripe_subscription_id TEXT`);
47
+ }
48
+ // Org membership columns
49
+ if (!colNames.has('org_id')) {
50
+ this.db.exec(`ALTER TABLE accounts ADD COLUMN org_id TEXT`);
51
+ }
52
+ if (!colNames.has('role')) {
53
+ this.db.exec(`ALTER TABLE accounts ADD COLUMN role TEXT`);
54
+ }
55
+ // Index on stripe_customer_id (only safe after column exists)
56
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_accounts_stripe_customer ON accounts(stripe_customer_id)`);
57
+ this.db.exec(`CREATE INDEX IF NOT EXISTS idx_accounts_org_id ON accounts(org_id)`);
58
+ // Organizations table
59
+ this.db.exec(`
60
+ CREATE TABLE IF NOT EXISTS organizations (
61
+ id TEXT PRIMARY KEY,
62
+ name TEXT NOT NULL,
63
+ plan TEXT NOT NULL DEFAULT 'enterprise',
64
+ created_at TEXT NOT NULL,
65
+ trial_expires_at TEXT,
66
+ allowed_domain TEXT
67
+ )
28
68
  `);
29
69
  }
30
70
  generateApiKey() {
@@ -129,11 +169,117 @@ export class AccountStore {
129
169
  this.db.prepare('UPDATE accounts SET stripe_customer_id = ?, stripe_subscription_id = ? WHERE id = ?')
130
170
  .run(customerId, subscriptionId, accountId);
131
171
  }
172
+ // ============================================================
173
+ // Organization Management
174
+ // ============================================================
175
+ createOrg(name, adminEmail, plan, options = {}) {
176
+ const orgId = randomUUID();
177
+ const now = new Date().toISOString();
178
+ let trialExpiresAt = null;
179
+ if (plan === 'enterprise_trial' && options.trialDays !== undefined) {
180
+ const expiry = new Date(Date.now() + options.trialDays * 24 * 60 * 60 * 1000);
181
+ trialExpiresAt = expiry.toISOString();
182
+ }
183
+ const allowedDomain = options.allowedDomain ?? null;
184
+ // Create the org
185
+ this.db.prepare(`
186
+ INSERT INTO organizations (id, name, plan, created_at, trial_expires_at, allowed_domain)
187
+ VALUES (?, ?, ?, ?, ?, ?)
188
+ `).run(orgId, name, plan, now, trialExpiresAt, allowedDomain);
189
+ // Create the admin account linked to this org
190
+ const owner = this.createAccount(adminEmail, plan);
191
+ // Link account to org
192
+ this.db.prepare('UPDATE accounts SET org_id = ?, role = ? WHERE id = ?')
193
+ .run(orgId, 'admin', owner.id);
194
+ const org = {
195
+ id: orgId,
196
+ name,
197
+ plan,
198
+ createdAt: now,
199
+ trialExpiresAt,
200
+ allowedDomain,
201
+ };
202
+ return { org, owner: { ...owner, orgId, role: 'admin' } };
203
+ }
204
+ addOrgMember(orgId, email, role = 'member') {
205
+ // Verify org exists
206
+ const org = this.getOrgById(orgId);
207
+ if (!org)
208
+ throw new Error(`Organization ${orgId} not found`);
209
+ // Check domain restriction
210
+ if (org.allowedDomain) {
211
+ const emailDomain = email.split('@')[1]?.toLowerCase();
212
+ if (emailDomain !== org.allowedDomain.toLowerCase()) {
213
+ throw new Error(`Email domain must be @${org.allowedDomain}`);
214
+ }
215
+ }
216
+ // Create account with org's plan
217
+ const account = this.createAccount(email, org.plan);
218
+ // Link to org
219
+ this.db.prepare('UPDATE accounts SET org_id = ?, role = ? WHERE id = ?')
220
+ .run(orgId, role, account.id);
221
+ return { ...account, orgId, role };
222
+ }
223
+ getOrgById(orgId) {
224
+ const row = this.db.prepare('SELECT * FROM organizations WHERE id = ?').get(orgId);
225
+ if (!row)
226
+ return null;
227
+ return this.rowToOrg(row);
228
+ }
229
+ getOrgByAccount(accountId) {
230
+ const account = this.getAccountById(accountId);
231
+ if (!account?.orgId)
232
+ return null;
233
+ return this.getOrgById(account.orgId);
234
+ }
235
+ getOrgMembers(orgId) {
236
+ const rows = this.db.prepare('SELECT * FROM accounts WHERE org_id = ? ORDER BY created_at').all(orgId);
237
+ return rows.map(r => this.rowToAccount(r));
238
+ }
239
+ getVaultId(accountId) {
240
+ const row = this.db.prepare('SELECT org_id FROM accounts WHERE id = ?').get(accountId);
241
+ // If account belongs to an org, use org ID as vault key; otherwise use account ID
242
+ return row?.org_id ?? accountId;
243
+ }
244
+ isTrialExpired(orgId) {
245
+ const org = this.getOrgById(orgId);
246
+ if (!org)
247
+ return false;
248
+ if (!org.trialExpiresAt)
249
+ return false; // Paid plans never expire
250
+ return new Date(org.trialExpiresAt) < new Date();
251
+ }
252
+ setTrialExpiry(orgId, expiresAt) {
253
+ this.db.prepare('UPDATE organizations SET trial_expires_at = ? WHERE id = ?')
254
+ .run(expiresAt, orgId);
255
+ }
256
+ extendTrial(orgId, additionalDays) {
257
+ const org = this.getOrgById(orgId);
258
+ if (!org)
259
+ throw new Error(`Organization ${orgId} not found`);
260
+ const currentExpiry = org.trialExpiresAt ? new Date(org.trialExpiresAt) : new Date();
261
+ const newExpiry = new Date(currentExpiry.getTime() + additionalDays * 24 * 60 * 60 * 1000);
262
+ this.setTrialExpiry(orgId, newExpiry.toISOString());
263
+ }
264
+ listOrgs() {
265
+ const rows = this.db.prepare('SELECT * FROM organizations ORDER BY created_at DESC').all();
266
+ return rows.map(r => this.rowToOrg(r));
267
+ }
268
+ rowToOrg(row) {
269
+ return {
270
+ id: row.id,
271
+ name: row.name,
272
+ plan: row.plan,
273
+ createdAt: row.created_at,
274
+ trialExpiresAt: row.trial_expires_at ?? null,
275
+ allowedDomain: row.allowed_domain ?? null,
276
+ };
277
+ }
132
278
  close() {
133
279
  this.db.close();
134
280
  }
135
281
  rowToAccount(row) {
136
- return {
282
+ const account = {
137
283
  id: row.id,
138
284
  email: row.email,
139
285
  apiKey: row.api_key,
@@ -146,6 +292,11 @@ export class AccountStore {
146
292
  stripeCustomerId: row.stripe_customer_id ?? null,
147
293
  stripeSubscriptionId: row.stripe_subscription_id ?? null,
148
294
  };
295
+ if (row.org_id)
296
+ account.orgId = row.org_id;
297
+ if (row.role)
298
+ account.role = row.role;
299
+ return account;
149
300
  }
150
301
  }
151
302
  //# sourceMappingURL=accounts.js.map
@@ -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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"}