@contextgit/store 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export type { ContextStore } from './interface.js';
2
2
  export { LocalStore } from './local/index.js';
3
3
  export { RemoteStore } from './remote/index.js';
4
+ export { SupabaseStore } from './supabase/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { LocalStore } from './local/index.js';
2
2
  export { RemoteStore } from './remote/index.js';
3
+ export { SupabaseStore } from './supabase/index.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,38 @@
1
+ import type { Agent, AgentInput, AgentRole, Branch, BranchInput, Claim, ClaimInput, Commit, CommitInput, ContextDelta, Pagination, Project, ProjectInput, SearchResult, SessionSnapshot, SnapshotFormat, Thread } from '@contextgit/core';
2
+ import type { ContextStore } from '../interface.js';
3
+ export declare class SupabaseStore implements ContextStore {
4
+ private readonly db;
5
+ private readonly branchProjectCache;
6
+ constructor(url: string, serviceKey: string);
7
+ private q;
8
+ private qNull;
9
+ private resolveProjectId;
10
+ createProject(input: ProjectInput): Promise<Project>;
11
+ getProject(id: string): Promise<Project | null>;
12
+ createBranch(input: BranchInput): Promise<Branch>;
13
+ getBranch(id: string): Promise<Branch | null>;
14
+ getBranchByGitName(projectId: string, gitBranch: string): Promise<Branch | null>;
15
+ listBranches(projectId: string): Promise<Branch[]>;
16
+ updateBranchHead(branchId: string, commitId: string): Promise<void>;
17
+ mergeBranch(sourceBranchId: string, targetBranchId: string, summary: string): Promise<Commit>;
18
+ createCommit(input: CommitInput): Promise<Commit>;
19
+ getCommit(id: string): Promise<Commit | null>;
20
+ listCommits(branchId: string, pagination: Pagination): Promise<Commit[]>;
21
+ getSessionSnapshot(projectId: string, branchId: string, options?: {
22
+ agentRole?: AgentRole;
23
+ }): Promise<SessionSnapshot>;
24
+ getFormattedSnapshot(projectId: string, branchId: string, format: SnapshotFormat): Promise<string>;
25
+ listOpenThreads(projectId: string): Promise<Thread[]>;
26
+ listOpenThreadsByBranch(branchId: string): Promise<Thread[]>;
27
+ syncThread(thread: Thread): Promise<Thread>;
28
+ indexEmbedding(commitId: string, vector: Float32Array): Promise<void>;
29
+ semanticSearch(vector: Float32Array, projectId: string, limit: number): Promise<SearchResult[]>;
30
+ fullTextSearch(query: string, projectId: string): Promise<SearchResult[]>;
31
+ upsertAgent(input: AgentInput): Promise<Agent>;
32
+ listAgents(projectId: string): Promise<Agent[]>;
33
+ claimTask(projectId: string, branchId: string, input: ClaimInput): Promise<Claim>;
34
+ unclaimTask(claimId: string): Promise<void>;
35
+ listActiveClaims(projectId: string): Promise<Claim[]>;
36
+ getContextDelta(projectId: string, branchId: string, since: number): Promise<ContextDelta>;
37
+ }
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,495 @@
1
+ // SupabaseStore — ContextStore backed by Supabase (Postgres + pgvector).
2
+ //
3
+ // This store is a push/pull sync target. LocalStore remains the live primary store.
4
+ // SUPABASE_SERVICE_KEY env var provides the service role key (never written to disk).
5
+ //
6
+ // Key design notes:
7
+ // • TEXT primary keys (nanoid) — same as LocalStore, no ID translation on push/pull
8
+ // • TIMESTAMPTZ in Postgres — parsed to Date at the boundary via d()
9
+ // • branchProjectCache avoids N round-trips during batch commit pushes
10
+ // • project_id on commits is a denormalized server-side column — not in Commit domain type
11
+ // • All Supabase errors throw; no silent failures
12
+ import { createClient } from '@supabase/supabase-js';
13
+ import { nanoid } from 'nanoid';
14
+ import { SnapshotFormatter } from '@contextgit/core';
15
+ // ─── Date helper ──────────────────────────────────────────────────────────────
16
+ function d(s) {
17
+ return typeof s === 'string' ? new Date(s) : new Date(0);
18
+ }
19
+ // ─── Row → domain parsers ─────────────────────────────────────────────────────
20
+ function parseProject(row) {
21
+ return {
22
+ id: row['id'],
23
+ name: row['name'],
24
+ description: row['description'] ?? undefined,
25
+ githubUrl: row['github_url'] ?? undefined,
26
+ createdAt: d(row['created_at']),
27
+ };
28
+ }
29
+ function parseBranch(row) {
30
+ return {
31
+ id: row['id'],
32
+ projectId: row['project_id'],
33
+ name: row['name'],
34
+ gitBranch: row['git_branch'],
35
+ githubPrUrl: row['github_pr_url'] ?? undefined,
36
+ parentBranchId: row['parent_branch_id'] ?? undefined,
37
+ headCommitId: row['head_commit_id'] ?? undefined,
38
+ status: row['status'],
39
+ createdAt: d(row['created_at']),
40
+ mergedAt: row['merged_at'] ? d(row['merged_at']) : undefined,
41
+ };
42
+ }
43
+ function parseCommit(row) {
44
+ return {
45
+ id: row['id'],
46
+ branchId: row['branch_id'],
47
+ parentId: row['parent_id'] ?? undefined,
48
+ agentId: row['agent_id'],
49
+ agentRole: row['agent_role'],
50
+ tool: row['tool'],
51
+ workflowType: row['workflow_type'],
52
+ loopIteration: row['loop_iteration'] ?? undefined,
53
+ ciRunId: row['ci_run_id'] ?? undefined,
54
+ pipelineName: row['pipeline_name'] ?? undefined,
55
+ message: row['message'],
56
+ content: row['content'],
57
+ summary: row['summary'],
58
+ commitType: row['commit_type'],
59
+ gitCommitSha: row['git_commit_sha'] ?? undefined,
60
+ createdAt: d(row['created_at']),
61
+ // NOTE: project_id is a server-side denormalized column; not in Commit domain type
62
+ };
63
+ }
64
+ function parseThread(row) {
65
+ return {
66
+ id: row['id'],
67
+ projectId: row['project_id'],
68
+ branchId: row['branch_id'],
69
+ description: row['description'],
70
+ status: row['status'],
71
+ workflowType: row['workflow_type'] ?? undefined,
72
+ openedInCommit: row['opened_in_commit'],
73
+ closedInCommit: row['closed_in_commit'] ?? undefined,
74
+ closedNote: row['closed_note'] ?? undefined,
75
+ createdAt: d(row['created_at']),
76
+ updatedAt: row['updated_at'] ? d(row['updated_at']) : undefined,
77
+ };
78
+ }
79
+ function parseClaim(row) {
80
+ return {
81
+ id: row['id'],
82
+ projectId: row['project_id'],
83
+ branchId: row['branch_id'],
84
+ task: row['task'],
85
+ agentId: row['agent_id'],
86
+ role: row['role'],
87
+ claimedAt: d(row['claimed_at']),
88
+ status: row['status'],
89
+ ttl: row['ttl'],
90
+ releasedAt: row['released_at'] ? d(row['released_at']) : undefined,
91
+ threadId: row['thread_id'] ?? undefined,
92
+ };
93
+ }
94
+ function parseAgent(row) {
95
+ return {
96
+ id: row['id'],
97
+ projectId: row['project_id'],
98
+ role: row['role'],
99
+ tool: row['tool'],
100
+ workflowType: row['workflow_type'],
101
+ displayName: row['display_name'] ?? undefined,
102
+ totalCommits: row['total_commits'],
103
+ lastSeen: d(row['last_seen']),
104
+ createdAt: d(row['created_at']),
105
+ };
106
+ }
107
+ // ─── SupabaseStore ────────────────────────────────────────────────────────────
108
+ function msSince(date) {
109
+ const ms = Date.now() - date.getTime();
110
+ const minutes = Math.floor(ms / 60_000);
111
+ if (minutes < 60)
112
+ return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
113
+ const hours = Math.floor(minutes / 60);
114
+ return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
115
+ }
116
+ const snapshotFormatter = new SnapshotFormatter();
117
+ export class SupabaseStore {
118
+ db;
119
+ // Cache branchId → projectId to avoid N round-trips during batch commit pushes.
120
+ branchProjectCache = new Map();
121
+ constructor(url, serviceKey) {
122
+ this.db = createClient(url, serviceKey);
123
+ }
124
+ // Throws on Supabase error; returns T (not null).
125
+ // Accepts PromiseLike so Supabase query builder types work without explicit casts.
126
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
127
+ async q(p) {
128
+ const { data, error } = await p;
129
+ if (error)
130
+ throw new Error(error.message);
131
+ if (data === null)
132
+ throw new Error('Unexpected null response from Supabase');
133
+ return data;
134
+ }
135
+ // Like q() but returns null instead of throwing when data is null.
136
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
+ async qNull(p) {
138
+ const { data, error } = await p;
139
+ if (error)
140
+ throw new Error(error.message);
141
+ return data;
142
+ }
143
+ async resolveProjectId(branchId) {
144
+ if (this.branchProjectCache.has(branchId))
145
+ return this.branchProjectCache.get(branchId);
146
+ const branch = await this.getBranch(branchId);
147
+ if (!branch)
148
+ throw new Error(`Branch not found: ${branchId}`);
149
+ this.branchProjectCache.set(branchId, branch.projectId);
150
+ return branch.projectId;
151
+ }
152
+ // ── Projects ──────────────────────────────────────────────────────────────
153
+ async createProject(input) {
154
+ const id = input.id ?? nanoid();
155
+ const row = await this.q(this.db.from('projects').insert({
156
+ id,
157
+ name: input.name,
158
+ description: input.description ?? null,
159
+ github_url: input.githubUrl ?? null,
160
+ summary: '',
161
+ }).select().single());
162
+ return parseProject(row);
163
+ }
164
+ async getProject(id) {
165
+ const row = await this.qNull(this.db.from('projects').select('*').eq('id', id).maybeSingle());
166
+ return row ? parseProject(row) : null;
167
+ }
168
+ // ── Branches ──────────────────────────────────────────────────────────────
169
+ async createBranch(input) {
170
+ // Idempotent: if caller supplied an ID and it already exists, return existing
171
+ if (input.id) {
172
+ const existing = await this.getBranch(input.id);
173
+ if (existing)
174
+ return existing;
175
+ }
176
+ const id = input.id ?? nanoid();
177
+ const row = await this.q(this.db.from('branches').insert({
178
+ id,
179
+ project_id: input.projectId,
180
+ name: input.name,
181
+ git_branch: input.gitBranch,
182
+ summary: '',
183
+ github_pr_url: input.githubPrUrl ?? null,
184
+ parent_branch_id: input.parentBranchId ?? null,
185
+ status: 'active',
186
+ }).select().single());
187
+ return parseBranch(row);
188
+ }
189
+ async getBranch(id) {
190
+ const row = await this.qNull(this.db.from('branches').select('*').eq('id', id).maybeSingle());
191
+ return row ? parseBranch(row) : null;
192
+ }
193
+ async getBranchByGitName(projectId, gitBranch) {
194
+ const row = await this.qNull(this.db.from('branches').select('*')
195
+ .eq('project_id', projectId)
196
+ .eq('git_branch', gitBranch)
197
+ .maybeSingle());
198
+ return row ? parseBranch(row) : null;
199
+ }
200
+ async listBranches(projectId) {
201
+ const rows = await this.q(this.db.from('branches').select('*').eq('project_id', projectId));
202
+ return rows.map(parseBranch);
203
+ }
204
+ async updateBranchHead(branchId, commitId) {
205
+ const { error } = await this.db.from('branches')
206
+ .update({ head_commit_id: commitId })
207
+ .eq('id', branchId);
208
+ if (error)
209
+ throw new Error(error.message);
210
+ }
211
+ async mergeBranch(sourceBranchId, targetBranchId, summary) {
212
+ const [source, target] = await Promise.all([
213
+ this.getBranch(sourceBranchId),
214
+ this.getBranch(targetBranchId),
215
+ ]);
216
+ if (!source)
217
+ throw new Error(`Source branch not found: ${sourceBranchId}`);
218
+ if (!target)
219
+ throw new Error(`Target branch not found: ${targetBranchId}`);
220
+ const commitId = nanoid();
221
+ const row = await this.q(this.db.from('commits').insert({
222
+ id: commitId,
223
+ branch_id: targetBranchId,
224
+ project_id: target.projectId,
225
+ parent_id: target.headCommitId ?? null,
226
+ merge_source_branch_id: sourceBranchId,
227
+ agent_id: 'system',
228
+ agent_role: 'orchestrator',
229
+ tool: 'contextgit',
230
+ workflow_type: 'interactive',
231
+ message: `Merge ${source.name} into ${target.name}`,
232
+ content: summary,
233
+ summary,
234
+ commit_type: 'merge',
235
+ }).select().single());
236
+ // Update target HEAD and mark source merged (fire in parallel)
237
+ await Promise.all([
238
+ this.updateBranchHead(targetBranchId, commitId),
239
+ this.db.from('branches').update({ status: 'merged', merged_at: new Date().toISOString() }).eq('id', sourceBranchId),
240
+ // Carry open threads from source to target
241
+ this.db.from('threads').update({ branch_id: targetBranchId }).eq('branch_id', sourceBranchId).eq('status', 'open'),
242
+ ]);
243
+ return parseCommit(row);
244
+ }
245
+ // ── Commits ───────────────────────────────────────────────────────────────
246
+ async createCommit(input) {
247
+ // Idempotent: if caller supplied an ID and it already exists, return existing
248
+ if (input.id) {
249
+ const existing = await this.getCommit(input.id);
250
+ if (existing)
251
+ return existing;
252
+ }
253
+ const id = input.id ?? nanoid();
254
+ const projectId = await this.resolveProjectId(input.branchId);
255
+ const row = await this.q(this.db.from('commits').insert({
256
+ id,
257
+ branch_id: input.branchId,
258
+ project_id: projectId,
259
+ parent_id: input.parentId ?? null,
260
+ agent_id: input.agentId,
261
+ agent_role: input.agentRole,
262
+ tool: input.tool,
263
+ workflow_type: input.workflowType,
264
+ loop_iteration: input.loopIteration ?? null,
265
+ ci_run_id: input.ciRunId ?? null,
266
+ pipeline_name: input.pipelineName ?? null,
267
+ message: input.message,
268
+ content: input.content,
269
+ summary: input.summary,
270
+ commit_type: input.commitType,
271
+ git_commit_sha: input.gitCommitSha ?? null,
272
+ }).select().single());
273
+ return parseCommit(row);
274
+ }
275
+ async getCommit(id) {
276
+ const row = await this.qNull(this.db.from('commits').select('*').eq('id', id).maybeSingle());
277
+ return row ? parseCommit(row) : null;
278
+ }
279
+ async listCommits(branchId, pagination) {
280
+ const rows = await this.q(this.db.from('commits').select('*')
281
+ .eq('branch_id', branchId)
282
+ .order('created_at', { ascending: false })
283
+ .range(pagination.offset, pagination.offset + pagination.limit - 1));
284
+ return rows.map(parseCommit);
285
+ }
286
+ // ── Snapshots ─────────────────────────────────────────────────────────────
287
+ async getSessionSnapshot(projectId, branchId, options) {
288
+ const branch = await this.getBranch(branchId);
289
+ if (!branch)
290
+ throw new Error(`Branch not found: ${branchId}`);
291
+ // Project summary: from parent branch head commit (child branch)
292
+ // or from current branch head commit (main/root branch).
293
+ // branchSummary and projectSummary may be the same commit on main — fetch once.
294
+ let headCommit = null;
295
+ if (branch.headCommitId) {
296
+ headCommit = await this.getCommit(branch.headCommitId);
297
+ }
298
+ let projectSummary = headCommit?.summary ?? '';
299
+ if (branch.parentBranchId) {
300
+ // Child branch: project summary comes from parent's head commit
301
+ const parentBranch = await this.getBranch(branch.parentBranchId);
302
+ if (parentBranch?.headCommitId) {
303
+ const parentHead = await this.getCommit(parentBranch.headCommitId);
304
+ projectSummary = parentHead?.summary ?? '';
305
+ }
306
+ }
307
+ // Recent commits (role-filtered if requested)
308
+ let commitsQuery = this.db.from('commits').select('*')
309
+ .eq('branch_id', branchId)
310
+ .order('created_at', { ascending: false })
311
+ .limit(3);
312
+ if (options?.agentRole) {
313
+ commitsQuery = commitsQuery
314
+ .eq('agent_role', options.agentRole);
315
+ }
316
+ // Open threads scoped to branch (not whole project) to match LocalStore semantics
317
+ const [commitsResult, threadsResult, claimsResult] = await Promise.all([
318
+ commitsQuery,
319
+ this.db.from('threads').select('*').eq('branch_id', branchId).eq('status', 'open'),
320
+ this.db.rpc('list_active_claims', { p_project_id: projectId }),
321
+ ]);
322
+ if (commitsResult.error)
323
+ throw new Error(commitsResult.error.message);
324
+ if (threadsResult.error)
325
+ throw new Error(threadsResult.error.message);
326
+ if (claimsResult.error)
327
+ throw new Error(claimsResult.error.message);
328
+ return {
329
+ projectSummary,
330
+ branchName: branch.name,
331
+ branchSummary: headCommit?.summary ?? '', // reuses the already-fetched commit
332
+ recentCommits: (commitsResult.data ?? []).map(parseCommit),
333
+ openThreads: (threadsResult.data ?? []).map(parseThread),
334
+ activeClaims: (claimsResult.data ?? []).map(parseClaim),
335
+ };
336
+ }
337
+ async getFormattedSnapshot(projectId, branchId, format) {
338
+ const snapshot = await this.getSessionSnapshot(projectId, branchId);
339
+ return snapshotFormatter.format(snapshot, format);
340
+ }
341
+ // ── Threads ───────────────────────────────────────────────────────────────
342
+ async listOpenThreads(projectId) {
343
+ const rows = await this.q(this.db.from('threads').select('*').eq('project_id', projectId).eq('status', 'open'));
344
+ return rows.map(parseThread);
345
+ }
346
+ async listOpenThreadsByBranch(branchId) {
347
+ const rows = await this.q(this.db.from('threads').select('*').eq('branch_id', branchId).eq('status', 'open'));
348
+ return rows.map(parseThread);
349
+ }
350
+ async syncThread(thread) {
351
+ // Upsert on id conflict — thread may have been closed since first push
352
+ const row = await this.q(this.db.from('threads').upsert({
353
+ id: thread.id,
354
+ project_id: thread.projectId,
355
+ branch_id: thread.branchId,
356
+ description: thread.description,
357
+ status: thread.status,
358
+ workflow_type: thread.workflowType ?? null,
359
+ opened_in_commit: thread.openedInCommit,
360
+ closed_in_commit: thread.closedInCommit ?? null,
361
+ closed_note: thread.closedNote ?? null,
362
+ }, { onConflict: 'id' }).select().single());
363
+ return parseThread(row);
364
+ }
365
+ // ── Search ────────────────────────────────────────────────────────────────
366
+ async indexEmbedding(commitId, vector) {
367
+ const { error } = await this.db.from('commits')
368
+ .update({ embedding: Array.from(vector) })
369
+ .eq('id', commitId);
370
+ if (error)
371
+ throw new Error(error.message);
372
+ }
373
+ async semanticSearch(vector, projectId, limit) {
374
+ const { data, error } = await this.db.rpc('match_commits', {
375
+ query_embedding: Array.from(vector),
376
+ project_id: projectId,
377
+ match_count: limit,
378
+ });
379
+ if (error)
380
+ throw new Error(error.message);
381
+ if (!data || data.length === 0)
382
+ return [];
383
+ // Fetch full commit rows for the returned IDs
384
+ const ids = data.map(r => r.id);
385
+ const scoreMap = new Map(data.map(r => [r.id, r.score]));
386
+ const rows = await this.q(this.db.from('commits').select('*').in('id', ids));
387
+ return rows.map(row => ({
388
+ commit: parseCommit(row),
389
+ score: scoreMap.get(row['id']) ?? 0,
390
+ matchType: 'semantic',
391
+ }));
392
+ }
393
+ async fullTextSearch(query, projectId) {
394
+ const rows = await this.q(this.db.from('commits').select('*')
395
+ .eq('project_id', projectId)
396
+ .textSearch('fts', query, { type: 'plain', config: 'english' }));
397
+ // Supabase textSearch does not expose BM25 scores; fixed score of 1.0
398
+ return rows.map(row => ({
399
+ commit: parseCommit(row),
400
+ score: 1.0,
401
+ matchType: 'fulltext',
402
+ }));
403
+ }
404
+ // ── Agents ────────────────────────────────────────────────────────────────
405
+ async upsertAgent(input) {
406
+ // NOTE: AgentInput has no totalCommits field, so total_commits is not included
407
+ // in the upsert payload. On Supabase the column defaults to 0 on first insert.
408
+ // On subsequent upserts the column is reset to 0 — this is a known limitation.
409
+ // total_commits is authoritative in LocalStore only; Supabase reflects push-time state.
410
+ const row = await this.q(this.db.from('agents').upsert({
411
+ id: input.id,
412
+ project_id: input.projectId,
413
+ role: input.role,
414
+ tool: input.tool,
415
+ workflow_type: input.workflowType,
416
+ display_name: input.displayName ?? null,
417
+ last_seen: new Date().toISOString(),
418
+ }, { onConflict: 'id' }).select().single());
419
+ return parseAgent(row);
420
+ }
421
+ async listAgents(projectId) {
422
+ const rows = await this.q(this.db.from('agents').select('*').eq('project_id', projectId));
423
+ return rows.map(parseAgent);
424
+ }
425
+ // ── Claims ────────────────────────────────────────────────────────────────
426
+ async claimTask(projectId, branchId, input) {
427
+ // Use listActiveClaims (RPC-backed, TTL-aware) to check for conflicts.
428
+ // This reuses the already-tested TTL expiry path and avoids duplicating
429
+ // the SQL `claimed_at + (ttl || ' milliseconds')::interval > NOW()` logic.
430
+ const active = await this.listActiveClaims(projectId);
431
+ const conflict = active.find(c => c.task === input.task);
432
+ if (conflict) {
433
+ throw new Error(`Task "${input.task}" is already claimed by ${conflict.agentId} ` +
434
+ `(claimed ${msSince(conflict.claimedAt)}). ` +
435
+ `Pick a different task or wait for the claim to expire.`);
436
+ }
437
+ const id = nanoid();
438
+ const row = await this.q(this.db.from('claims').insert({
439
+ id,
440
+ project_id: projectId,
441
+ branch_id: branchId,
442
+ task: input.task,
443
+ agent_id: input.agentId,
444
+ role: input.role,
445
+ status: input.status ?? 'proposed',
446
+ ttl: input.ttl ?? 7_200_000,
447
+ thread_id: input.threadId ?? null,
448
+ }).select().single());
449
+ return parseClaim(row);
450
+ }
451
+ async unclaimTask(claimId) {
452
+ const { error } = await this.db.from('claims')
453
+ .update({ status: 'released', released_at: new Date().toISOString() })
454
+ .eq('id', claimId);
455
+ if (error)
456
+ throw new Error(error.message);
457
+ }
458
+ async listActiveClaims(projectId) {
459
+ // TTL filter applied in SQL via the list_active_claims function
460
+ const { data, error } = await this.db.rpc('list_active_claims', { p_project_id: projectId });
461
+ if (error)
462
+ throw new Error(error.message);
463
+ return (data ?? []).map(parseClaim);
464
+ }
465
+ // ── Delta ─────────────────────────────────────────────────────────────────
466
+ async getContextDelta(projectId, branchId, since) {
467
+ // Strictly greater than — matches LocalStore semantics (> datetime(since/1000, 'unixepoch'))
468
+ const sinceIso = new Date(since).toISOString();
469
+ const [commitsResult, threadsResult, claimsResult] = await Promise.all([
470
+ this.db.from('commits').select('*')
471
+ .eq('branch_id', branchId)
472
+ .gt('created_at', sinceIso)
473
+ .order('created_at', { ascending: true }),
474
+ this.db.from('threads').select('*')
475
+ .eq('project_id', projectId)
476
+ .gt('updated_at', sinceIso),
477
+ this.db.rpc('list_active_claims', { p_project_id: projectId }),
478
+ ]);
479
+ if (commitsResult.error)
480
+ throw new Error(commitsResult.error.message);
481
+ if (threadsResult.error)
482
+ throw new Error(threadsResult.error.message);
483
+ if (claimsResult.error)
484
+ throw new Error(claimsResult.error.message);
485
+ const allThreadChanges = (threadsResult.data ?? []).map(parseThread);
486
+ return {
487
+ newCommits: (commitsResult.data ?? []).map(parseCommit),
488
+ openedThreads: allThreadChanges.filter(t => t.status === 'open'),
489
+ closedThreads: allThreadChanges.filter(t => t.status === 'closed'),
490
+ activeClaims: (claimsResult.data ?? []).map(parseClaim),
491
+ checkedAt: Date.now(),
492
+ };
493
+ }
494
+ }
495
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supabase-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-store.test.d.ts","sourceRoot":"","sources":["../../src/supabase/supabase-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,341 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ // ── Mock @supabase/supabase-js before importing SupabaseStore ─────────────────
3
+ // The Supabase client uses a builder pattern. We mock createClient to return
4
+ // a fake db object. Individual tests configure mockResolvedValue on the chain.
5
+ const mockSingle = vi.fn();
6
+ const mockMaybeSingle = vi.fn();
7
+ function makeChain(resolved) {
8
+ // A chainable builder that resolves when awaited.
9
+ // Each method returns `this` so chains like .select().eq().single() work.
10
+ const chain = {};
11
+ const methods = [
12
+ 'select', 'insert', 'update', 'upsert', 'delete',
13
+ 'eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'is', 'in',
14
+ 'filter', 'order', 'limit', 'range', 'textSearch',
15
+ ];
16
+ methods.forEach(m => { chain[m] = vi.fn().mockReturnValue(chain); });
17
+ chain['single'] = vi.fn().mockResolvedValue(resolved);
18
+ chain['maybeSingle'] = vi.fn().mockResolvedValue(resolved);
19
+ // Make the chain itself thenable (for `await db.from(...).select()`)
20
+ chain['then'] = (resolve) => resolve(resolved);
21
+ return chain;
22
+ }
23
+ const mockDb = {
24
+ from: vi.fn(),
25
+ rpc: vi.fn(),
26
+ };
27
+ vi.mock('@supabase/supabase-js', () => ({
28
+ createClient: vi.fn(() => mockDb),
29
+ }));
30
+ import { SupabaseStore } from './index.js';
31
+ describe('SupabaseStore', () => {
32
+ let store;
33
+ beforeEach(() => {
34
+ vi.clearAllMocks();
35
+ store = new SupabaseStore('https://test.supabase.co', 'service-key');
36
+ });
37
+ // ── Error handling ────────────────────────────────────────────────────────
38
+ it('throws when Supabase returns an error', async () => {
39
+ mockDb.from.mockReturnValue(makeChain({ data: null, error: { message: 'db error' } }));
40
+ await expect(store.getProject('any')).rejects.toThrow('db error');
41
+ });
42
+ // ── Projects ──────────────────────────────────────────────────────────────
43
+ it('getProject returns null when not found', async () => {
44
+ mockDb.from.mockReturnValue(makeChain({ data: null, error: null }));
45
+ const result = await store.getProject('nonexistent');
46
+ expect(result).toBeNull();
47
+ });
48
+ it('getProject parses timestamps and optional fields', async () => {
49
+ const iso = '2026-03-18T10:00:00.000Z';
50
+ mockDb.from.mockReturnValue(makeChain({
51
+ data: { id: 'p1', name: 'MyProject', description: 'desc', github_url: 'https://gh.com', summary: '', created_at: iso },
52
+ error: null,
53
+ }));
54
+ const project = await store.getProject('p1');
55
+ expect(project).not.toBeNull();
56
+ expect(project.createdAt).toBeInstanceOf(Date);
57
+ expect(project.createdAt.toISOString()).toBe(iso);
58
+ expect(project.description).toBe('desc');
59
+ expect(project.githubUrl).toBe('https://gh.com');
60
+ });
61
+ it('createProject inserts and returns a Project', async () => {
62
+ const iso = '2026-03-18T10:00:00.000Z';
63
+ mockDb.from.mockReturnValue(makeChain({
64
+ data: { id: 'p1', name: 'Test', description: null, github_url: null, summary: '', created_at: iso },
65
+ error: null,
66
+ }));
67
+ const project = await store.createProject({ name: 'Test' });
68
+ expect(project.id).toBeDefined();
69
+ expect(project.name).toBe('Test');
70
+ expect(project.createdAt).toBeInstanceOf(Date);
71
+ });
72
+ // ── Branches ──────────────────────────────────────────────────────────────
73
+ it('getBranch returns null when not found', async () => {
74
+ mockDb.from.mockReturnValue(makeChain({ data: null, error: null }));
75
+ expect(await store.getBranch('missing')).toBeNull();
76
+ });
77
+ it('getBranch parses branch row correctly', async () => {
78
+ const iso = '2026-03-18T10:00:00.000Z';
79
+ mockDb.from.mockReturnValue(makeChain({
80
+ data: { id: 'br1', project_id: 'p1', name: 'main', git_branch: 'main',
81
+ summary: '', github_pr_url: null, parent_branch_id: null,
82
+ head_commit_id: 'c1', status: 'active', created_at: iso, merged_at: null },
83
+ error: null,
84
+ }));
85
+ const branch = await store.getBranch('br1');
86
+ expect(branch.projectId).toBe('p1');
87
+ expect(branch.headCommitId).toBe('c1');
88
+ expect(branch.createdAt).toBeInstanceOf(Date);
89
+ expect(branch.mergedAt).toBeUndefined();
90
+ });
91
+ it('createBranch is idempotent when ID already exists', async () => {
92
+ const iso = new Date().toISOString();
93
+ const existing = { id: 'br1', project_id: 'p1', name: 'main', git_branch: 'main',
94
+ summary: '', github_pr_url: null, parent_branch_id: null,
95
+ head_commit_id: null, status: 'active', created_at: iso, merged_at: null };
96
+ // First call (getBranch check) returns existing; second call (insert) should not be reached
97
+ mockDb.from.mockReturnValue(makeChain({ data: existing, error: null }));
98
+ const result = await store.createBranch({ id: 'br1', projectId: 'p1', name: 'main', gitBranch: 'main' });
99
+ expect(result.id).toBe('br1');
100
+ });
101
+ // ── Commits ───────────────────────────────────────────────────────────────
102
+ it('createCommit resolves projectId via getBranch and caches it', async () => {
103
+ const branchIso = new Date().toISOString();
104
+ const commitIso = new Date().toISOString();
105
+ const branchRow = { id: 'br1', project_id: 'proj1', name: 'main', git_branch: 'main',
106
+ summary: '', github_pr_url: null, parent_branch_id: null,
107
+ head_commit_id: null, status: 'active', created_at: branchIso, merged_at: null };
108
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'proj1', parent_id: null,
109
+ agent_id: 'agent1', agent_role: 'solo', tool: 'cli',
110
+ workflow_type: 'interactive', message: 'hello', content: 'c',
111
+ summary: 's', commit_type: 'manual', git_commit_sha: null,
112
+ created_at: commitIso };
113
+ // Call 1: getBranch for cache population; Call 2: insert commit
114
+ mockDb.from
115
+ .mockReturnValueOnce(makeChain({ data: branchRow, error: null })) // getBranch
116
+ .mockReturnValueOnce(makeChain({ data: commitRow, error: null })); // insert commit
117
+ const commit = await store.createCommit({
118
+ branchId: 'br1', agentId: 'agent1', agentRole: 'solo', tool: 'cli',
119
+ workflowType: 'interactive', message: 'hello', content: 'c', summary: 's', commitType: 'manual',
120
+ });
121
+ expect(commit.branchId).toBe('br1');
122
+ expect(commit.message).toBe('hello');
123
+ // projectId is NOT on the Commit domain type — verify it's absent
124
+ expect(commit['projectId']).toBeUndefined();
125
+ // Cache populated: second createCommit on same branch should NOT call getBranch again
126
+ mockDb.from.mockReturnValueOnce(makeChain({ data: commitRow, error: null })); // only insert
127
+ await store.createCommit({
128
+ branchId: 'br1', agentId: 'agent1', agentRole: 'solo', tool: 'cli',
129
+ workflowType: 'interactive', message: 'hello 2', content: 'c2', summary: 's2', commitType: 'manual',
130
+ });
131
+ // from() called 3 times total: getBranch (1) + insert commit 1 (1) + insert commit 2 (1)
132
+ expect(mockDb.from).toHaveBeenCalledTimes(3);
133
+ });
134
+ it('createCommit is idempotent when commit ID already exists', async () => {
135
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'proj1', parent_id: null,
136
+ agent_id: 'a', agent_role: 'solo', tool: 'cli',
137
+ workflow_type: 'interactive', message: 'm', content: 'c',
138
+ summary: 's', commit_type: 'manual', git_commit_sha: null,
139
+ created_at: new Date().toISOString() };
140
+ // getCommit check returns existing
141
+ mockDb.from.mockReturnValueOnce(makeChain({ data: commitRow, error: null }));
142
+ const result = await store.createCommit({
143
+ id: 'c1', branchId: 'br1', agentId: 'a', agentRole: 'solo', tool: 'cli',
144
+ workflowType: 'interactive', message: 'm', content: 'c', summary: 's', commitType: 'manual',
145
+ });
146
+ expect(result.id).toBe('c1');
147
+ // Should not have called insert
148
+ expect(mockDb.from).toHaveBeenCalledTimes(1);
149
+ });
150
+ // ── Snapshots ─────────────────────────────────────────────────────────────
151
+ it('getSessionSnapshot assembles a SessionSnapshot', async () => {
152
+ const now = new Date().toISOString();
153
+ const branchRow = { id: 'br1', project_id: 'p1', name: 'main', git_branch: 'main',
154
+ summary: '', parent_branch_id: null, head_commit_id: 'c1',
155
+ status: 'active', created_at: now, merged_at: null, github_pr_url: null };
156
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'p1', parent_id: null,
157
+ agent_id: 'a', agent_role: 'solo', tool: 'cli', workflow_type: 'interactive',
158
+ message: 'init', content: 'c', summary: 'project summary here',
159
+ commit_type: 'manual', git_commit_sha: null, created_at: now };
160
+ // Call sequence (matches the corrected implementation):
161
+ // 1. getBranch(branchId) — branch has parentBranchId=null, headCommitId='c1'
162
+ // 2. getCommit('c1') — fetched once, used for both projectSummary and branchSummary
163
+ // 3. commitsQuery (listCommits), threadsQuery (listOpenThreadsByBranch), rpc (list_active_claims) — parallel
164
+ mockDb.from
165
+ .mockReturnValueOnce(makeChain({ data: branchRow, error: null })) // getBranch
166
+ .mockReturnValueOnce(makeChain({ data: commitRow, error: null })) // getCommit (head)
167
+ .mockReturnValueOnce(makeChain({ data: [commitRow], error: null })) // listCommits (parallel)
168
+ .mockReturnValueOnce(makeChain({ data: [], error: null })); // listOpenThreadsByBranch (parallel)
169
+ mockDb.rpc.mockResolvedValueOnce({ data: [], error: null }); // list_active_claims (parallel)
170
+ const snapshot = await store.getSessionSnapshot('p1', 'br1');
171
+ expect(snapshot.projectSummary).toBe('project summary here');
172
+ expect(snapshot.branchName).toBe('main');
173
+ expect(snapshot.recentCommits).toHaveLength(1);
174
+ expect(snapshot.openThreads).toHaveLength(0);
175
+ expect(snapshot.activeClaims).toHaveLength(0);
176
+ });
177
+ // ── Threads ───────────────────────────────────────────────────────────────
178
+ it('listOpenThreads returns only open threads for the project', async () => {
179
+ const now = new Date().toISOString();
180
+ const threadRow = { id: 't1', project_id: 'p1', branch_id: 'br1', description: 'todo',
181
+ status: 'open', workflow_type: null, opened_in_commit: 'c1',
182
+ closed_in_commit: null, closed_note: null, created_at: now, updated_at: now };
183
+ mockDb.from.mockReturnValue(makeChain({ data: [threadRow], error: null }));
184
+ const threads = await store.listOpenThreads('p1');
185
+ expect(threads).toHaveLength(1);
186
+ expect(threads[0].status).toBe('open');
187
+ expect(threads[0].createdAt).toBeInstanceOf(Date);
188
+ });
189
+ it('syncThread upserts on id conflict', async () => {
190
+ const now = new Date().toISOString();
191
+ const thread = { id: 't1', projectId: 'p1', branchId: 'br1', description: 'todo',
192
+ status: 'closed', openedInCommit: 'c1', closedInCommit: 'c2',
193
+ closedNote: 'done', createdAt: new Date(), };
194
+ const threadRow = { id: 't1', project_id: 'p1', branch_id: 'br1', description: 'todo',
195
+ status: 'closed', workflow_type: null, opened_in_commit: 'c1',
196
+ closed_in_commit: 'c2', closed_note: 'done', created_at: now, updated_at: now };
197
+ mockDb.from.mockReturnValue(makeChain({ data: threadRow, error: null }));
198
+ const result = await store.syncThread(thread);
199
+ expect(result.status).toBe('closed');
200
+ expect(result.closedNote).toBe('done');
201
+ });
202
+ // ── Search ────────────────────────────────────────────────────────────────
203
+ it('indexEmbedding updates the embedding column on the commit row', async () => {
204
+ mockDb.from.mockReturnValue(makeChain({ data: null, error: null }));
205
+ await store.indexEmbedding('c1', new Float32Array([0.1, 0.2, 0.3]));
206
+ expect(mockDb.from).toHaveBeenCalledWith('commits');
207
+ });
208
+ it('semanticSearch calls match_commits RPC and maps results', async () => {
209
+ const now = new Date().toISOString();
210
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'p1', parent_id: null,
211
+ agent_id: 'a', agent_role: 'solo', tool: 'cli', workflow_type: 'interactive',
212
+ message: 'm', content: 'c', summary: 's', commit_type: 'manual',
213
+ git_commit_sha: null, created_at: now };
214
+ // RPC returns { id, score } rows; then we fetch full commit rows
215
+ mockDb.rpc.mockResolvedValueOnce({ data: [{ id: 'c1', score: 0.95 }], error: null });
216
+ mockDb.from.mockReturnValue(makeChain({ data: [commitRow], error: null }));
217
+ const results = await store.semanticSearch(new Float32Array(384), 'p1', 5);
218
+ expect(results).toHaveLength(1);
219
+ expect(results[0].score).toBe(0.95);
220
+ expect(results[0].matchType).toBe('semantic');
221
+ expect(mockDb.rpc).toHaveBeenCalledWith('match_commits', expect.objectContaining({ project_id: 'p1', match_count: 5 }));
222
+ });
223
+ it('fullTextSearch uses textSearch on fts column', async () => {
224
+ const now = new Date().toISOString();
225
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'p1', parent_id: null,
226
+ agent_id: 'a', agent_role: 'solo', tool: 'cli', workflow_type: 'interactive',
227
+ message: 'hello world', content: 'c', summary: 's', commit_type: 'manual',
228
+ git_commit_sha: null, created_at: now };
229
+ mockDb.from.mockReturnValue(makeChain({ data: [commitRow], error: null }));
230
+ const results = await store.fullTextSearch('hello', 'p1');
231
+ expect(results).toHaveLength(1);
232
+ expect(results[0].matchType).toBe('fulltext');
233
+ expect(results[0].score).toBe(1.0);
234
+ });
235
+ // ── Agents ────────────────────────────────────────────────────────────────
236
+ it('upsertAgent upserts on id conflict', async () => {
237
+ const now = new Date().toISOString();
238
+ const agentRow = { id: 'agent1', project_id: 'p1', role: 'solo', tool: 'cli',
239
+ workflow_type: 'interactive', display_name: null,
240
+ total_commits: 5, last_seen: now, created_at: now };
241
+ mockDb.from.mockReturnValue(makeChain({ data: agentRow, error: null }));
242
+ const agent = await store.upsertAgent({
243
+ id: 'agent1', projectId: 'p1', role: 'solo', tool: 'cli', workflowType: 'interactive'
244
+ });
245
+ expect(agent.id).toBe('agent1');
246
+ expect(agent.totalCommits).toBe(5);
247
+ expect(agent.lastSeen).toBeInstanceOf(Date);
248
+ });
249
+ // ── Claims ────────────────────────────────────────────────────────────────
250
+ it('listActiveClaims calls list_active_claims RPC', async () => {
251
+ mockDb.rpc.mockResolvedValueOnce({ data: [], error: null });
252
+ const claims = await store.listActiveClaims('p1');
253
+ expect(claims).toHaveLength(0);
254
+ expect(mockDb.rpc).toHaveBeenCalledWith('list_active_claims', { p_project_id: 'p1' });
255
+ });
256
+ it('unclaimTask updates status to released', async () => {
257
+ mockDb.from.mockReturnValue(makeChain({ data: null, error: null }));
258
+ await expect(store.unclaimTask('claim1')).resolves.toBeUndefined();
259
+ });
260
+ it('claimTask throws when same task is already actively claimed', async () => {
261
+ const existingClaim = {
262
+ id: 'claim-existing',
263
+ project_id: 'proj-1',
264
+ branch_id: 'branch-1',
265
+ task: 'Story 7.1',
266
+ agent_id: 'dev-a-machine',
267
+ role: 'solo',
268
+ status: 'active',
269
+ ttl: 7_200_000,
270
+ claimed_at: new Date(Date.now() - 3 * 60 * 1000).toISOString(), // 3 minutes ago
271
+ released_at: null,
272
+ thread_id: null,
273
+ };
274
+ mockDb.rpc.mockResolvedValueOnce({ data: [existingClaim], error: null });
275
+ await expect(store.claimTask('proj-1', 'branch-1', {
276
+ task: 'Story 7.1',
277
+ agentId: 'dev-b-machine',
278
+ role: 'solo',
279
+ status: 'active',
280
+ ttl: 7_200_000,
281
+ })).rejects.toThrow('already claimed by dev-a-machine');
282
+ });
283
+ it('claimTask succeeds when no active claim exists for the task', async () => {
284
+ // listActiveClaims: rpc returns empty list (no conflicts)
285
+ mockDb.rpc.mockResolvedValueOnce({ data: [], error: null });
286
+ // INSERT chain: from → insert → select → single
287
+ const newClaimRow = {
288
+ id: 'claim-new',
289
+ project_id: 'proj-1',
290
+ branch_id: 'branch-1',
291
+ task: 'Story 7.1',
292
+ agent_id: 'dev-b-machine',
293
+ role: 'solo',
294
+ status: 'active',
295
+ ttl: 7_200_000,
296
+ claimed_at: new Date().toISOString(),
297
+ released_at: null,
298
+ thread_id: null,
299
+ };
300
+ mockDb.from.mockReturnValueOnce({
301
+ insert: () => ({
302
+ select: () => ({
303
+ single: () => ({ data: newClaimRow, error: null }),
304
+ }),
305
+ }),
306
+ });
307
+ const claim = await store.claimTask('proj-1', 'branch-1', {
308
+ task: 'Story 7.1',
309
+ agentId: 'dev-b-machine',
310
+ role: 'solo',
311
+ status: 'active',
312
+ ttl: 7_200_000,
313
+ });
314
+ expect(claim.task).toBe('Story 7.1');
315
+ expect(claim.agentId).toBe('dev-b-machine');
316
+ });
317
+ // ── Delta ─────────────────────────────────────────────────────────────────
318
+ it('getContextDelta filters by since using ISO string, strictly greater than', async () => {
319
+ const since = Date.now() - 60_000; // 1 minute ago
320
+ const sinceIso = new Date(since).toISOString();
321
+ const now = new Date().toISOString();
322
+ const commitRow = { id: 'c1', branch_id: 'br1', project_id: 'p1', parent_id: null,
323
+ agent_id: 'a', agent_role: 'solo', tool: 'cli', workflow_type: 'interactive',
324
+ message: 'm', content: 'c', summary: 's', commit_type: 'manual',
325
+ git_commit_sha: null, created_at: now };
326
+ mockDb.from
327
+ .mockReturnValueOnce(makeChain({ data: [commitRow], error: null })) // commits since
328
+ .mockReturnValueOnce(makeChain({ data: [], error: null })); // threads since
329
+ mockDb.rpc.mockResolvedValueOnce({ data: [], error: null }); // active claims
330
+ const delta = await store.getContextDelta('p1', 'br1', since);
331
+ expect(delta.newCommits).toHaveLength(1);
332
+ expect(delta.openedThreads).toHaveLength(0);
333
+ expect(delta.closedThreads).toHaveLength(0);
334
+ expect(delta.checkedAt).toBeGreaterThan(since);
335
+ // Verify strictly-greater-than filter used the correct ISO string
336
+ // (guards against accidental use of gte which would include the since boundary)
337
+ const commitsChain = mockDb.from.mock.results[0]?.value;
338
+ expect(commitsChain.gt).toHaveBeenCalledWith('created_at', sinceIso);
339
+ });
340
+ });
341
+ //# sourceMappingURL=supabase-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-store.test.js","sourceRoot":"","sources":["../../src/supabase/supabase-store.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contextgit/store",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -10,14 +10,17 @@
10
10
  "types": "./dist/index.d.ts"
11
11
  }
12
12
  },
13
- "files": ["dist"],
13
+ "files": [
14
+ "dist"
15
+ ],
14
16
  "scripts": {
15
17
  "build": "tsc",
16
18
  "test": "vitest run",
17
19
  "typecheck": "tsc --noEmit"
18
20
  },
19
21
  "dependencies": {
20
- "@contextgit/core": "0.0.11",
22
+ "@contextgit/core": "0.0.12",
23
+ "@supabase/supabase-js": "^2.99.2",
21
24
  "better-sqlite3": "^9.4.0",
22
25
  "nanoid": "^5.0.0",
23
26
  "sqlite-vec": "^0.1.6"