@contextgit/store 0.0.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.
Files changed (45) hide show
  1. package/dist/branch-merge.test.d.ts +2 -0
  2. package/dist/branch-merge.test.d.ts.map +1 -0
  3. package/dist/branch-merge.test.js +101 -0
  4. package/dist/branch-merge.test.js.map +1 -0
  5. package/dist/engine-integration.test.d.ts +2 -0
  6. package/dist/engine-integration.test.d.ts.map +1 -0
  7. package/dist/engine-integration.test.js +77 -0
  8. package/dist/engine-integration.test.js.map +1 -0
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interface.d.ts +30 -0
  14. package/dist/interface.d.ts.map +1 -0
  15. package/dist/interface.js +2 -0
  16. package/dist/interface.js.map +1 -0
  17. package/dist/local/claims.test.d.ts +2 -0
  18. package/dist/local/claims.test.d.ts.map +1 -0
  19. package/dist/local/claims.test.js +151 -0
  20. package/dist/local/claims.test.js.map +1 -0
  21. package/dist/local/index.d.ts +39 -0
  22. package/dist/local/index.d.ts.map +1 -0
  23. package/dist/local/index.js +319 -0
  24. package/dist/local/index.js.map +1 -0
  25. package/dist/local/local-store.test.d.ts +2 -0
  26. package/dist/local/local-store.test.d.ts.map +1 -0
  27. package/dist/local/local-store.test.js +141 -0
  28. package/dist/local/local-store.test.js.map +1 -0
  29. package/dist/local/migrations.d.ts +3 -0
  30. package/dist/local/migrations.d.ts.map +1 -0
  31. package/dist/local/migrations.js +78 -0
  32. package/dist/local/migrations.js.map +1 -0
  33. package/dist/local/queries.d.ts +44 -0
  34. package/dist/local/queries.d.ts.map +1 -0
  35. package/dist/local/queries.js +527 -0
  36. package/dist/local/queries.js.map +1 -0
  37. package/dist/local/schema.d.ts +15 -0
  38. package/dist/local/schema.d.ts.map +1 -0
  39. package/dist/local/schema.js +144 -0
  40. package/dist/local/schema.js.map +1 -0
  41. package/dist/remote/index.d.ts +39 -0
  42. package/dist/remote/index.d.ts.map +1 -0
  43. package/dist/remote/index.js +216 -0
  44. package/dist/remote/index.js.map +1 -0
  45. package/package.json +31 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=branch-merge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-merge.test.d.ts","sourceRoot":"","sources":["../src/branch-merge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ // Days 12–13 integration test: engine.branch() + engine.merge()
2
+ //
3
+ // Scenario: main → commit + thread → branch('feature') → 2 commits + thread
4
+ // → merge back to main → snapshot shows merged state + all threads.
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { ContextEngine } from '@contextgit/core';
7
+ import { LocalStore } from './local/index.js';
8
+ describe('engine.branch() + engine.merge()', () => {
9
+ let store;
10
+ let mainEngine;
11
+ let featureEngine;
12
+ beforeEach(() => {
13
+ store = new LocalStore(':memory:');
14
+ mainEngine = new ContextEngine(store, 'agent-main', 'orchestrator', 'claude-code', 'interactive');
15
+ featureEngine = new ContextEngine(store, 'agent-feat', 'dev', 'claude-code', 'interactive');
16
+ });
17
+ afterEach(() => {
18
+ store.close();
19
+ });
20
+ it('branch → 2 commits → merge → snapshot shows merged state and all threads', async () => {
21
+ // 1. Setup: project + main branch
22
+ const project = await store.createProject({ name: 'contextgit' });
23
+ const mainBranch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
24
+ await mainEngine.init(project.id, mainBranch.id);
25
+ // 2. Commit on main with an open thread
26
+ await mainEngine.commit({
27
+ message: 'Initial main commit',
28
+ content: 'Set up project foundation.',
29
+ threads: { open: ['Choose DB migration strategy'] },
30
+ });
31
+ // 3. Branch off main
32
+ const featureBranch = await mainEngine.branch('feature/auth', 'auth feature');
33
+ expect(featureBranch.gitBranch).toBe('feature/auth');
34
+ expect(featureBranch.name).toBe('auth feature');
35
+ expect(featureBranch.parentBranchId).toBe(mainBranch.id);
36
+ expect(featureBranch.status).toBe('active');
37
+ // feature branch should have a branch-init commit with main's summary
38
+ const featureCommits = await store.listCommits(featureBranch.id, { limit: 10, offset: 0 });
39
+ expect(featureCommits).toHaveLength(1);
40
+ expect(featureCommits[0].commitType).toBe('branch-init');
41
+ expect(featureCommits[0].summary).toBeTruthy(); // carried parent summary
42
+ // 4. Two commits on feature branch (one with its own thread)
43
+ await featureEngine.init(project.id, featureBranch.id);
44
+ await featureEngine.commit({
45
+ message: 'Add auth middleware',
46
+ content: 'Implemented JWT middleware and route guards.',
47
+ threads: { open: ['Token expiry policy TBD'] },
48
+ });
49
+ const lastFeatureCommit = await featureEngine.commit({
50
+ message: 'Add login endpoint',
51
+ content: 'POST /auth/login with bcrypt password verification.',
52
+ });
53
+ expect(lastFeatureCommit.summary).toContain('bcrypt');
54
+ // 5. Merge feature → main
55
+ const mergeCommit = await mainEngine.merge(featureBranch.id);
56
+ expect(mergeCommit.commitType).toBe('merge');
57
+ expect(mergeCommit.branchId).toBe(mainBranch.id);
58
+ expect(mergeCommit.mergeSourceBranchId).toBe(featureBranch.id);
59
+ // 6. Source branch should be marked merged
60
+ const mergedBranch = await store.getBranch(featureBranch.id);
61
+ expect(mergedBranch?.status).toBe('merged');
62
+ expect(mergedBranch?.mergedAt).toBeTruthy();
63
+ // 7. Snapshot on main should show merged state
64
+ const snapshot = await mainEngine.context('global');
65
+ expect(snapshot.branchName).toBe('main');
66
+ // recent commits: merge commit is the newest
67
+ expect(snapshot.recentCommits[0].commitType).toBe('merge');
68
+ // open threads: both the main thread and the feature thread carried forward
69
+ const threadDescriptions = snapshot.openThreads.map(t => t.description);
70
+ expect(threadDescriptions).toContain('Choose DB migration strategy');
71
+ expect(threadDescriptions).toContain('Token expiry policy TBD');
72
+ });
73
+ it('branch-init commit carries parent HEAD summary into new branch', async () => {
74
+ const project = await store.createProject({ name: 'p' });
75
+ const mainBranch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
76
+ await mainEngine.init(project.id, mainBranch.id);
77
+ await mainEngine.commit({ message: 'setup', content: 'foundation work done' });
78
+ const feat = await mainEngine.branch('feature/x');
79
+ // branch-init summary should match main's HEAD summary
80
+ const mainHead = await store.getBranch(mainBranch.id);
81
+ const mainHeadCommit = mainHead?.headCommitId
82
+ ? await store.getCommit(mainHead.headCommitId)
83
+ : null;
84
+ const featCommits = await store.listCommits(feat.id, { limit: 1, offset: 0 });
85
+ expect(featCommits[0].summary).toBe(mainHeadCommit?.summary);
86
+ });
87
+ it('merge summary incorporates source branch content', async () => {
88
+ const project = await store.createProject({ name: 'p' });
89
+ const mainBranch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
90
+ await mainEngine.init(project.id, mainBranch.id);
91
+ await mainEngine.commit({ message: 'base', content: 'base content' });
92
+ const feat = await mainEngine.branch('feature/y');
93
+ await featureEngine.init(project.id, feat.id);
94
+ await featureEngine.commit({ message: 'feature work', content: 'feature specific content' });
95
+ const mergeCommit = await mainEngine.merge(feat.id);
96
+ // merge commit summary should reference feature content
97
+ expect(mergeCommit.summary).toBeTruthy();
98
+ expect(mergeCommit.content).toContain('feature specific content');
99
+ });
100
+ });
101
+ //# sourceMappingURL=branch-merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-merge.test.js","sourceRoot":"","sources":["../src/branch-merge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=engine-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-integration.test.d.ts","sourceRoot":"","sources":["../src/engine-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ // Week 1 validation: ContextEngine + LocalStore end-to-end.
2
+ //
3
+ // Scenario: create project → 2 commits (one with open thread) →
4
+ // context('global') → snapshot shows thread + both commits.
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { ContextEngine } from '@contextgit/core';
7
+ import { LocalStore } from './local/index.js';
8
+ describe('ContextEngine + LocalStore integration', () => {
9
+ let store;
10
+ let engine;
11
+ beforeEach(() => {
12
+ store = new LocalStore(':memory:');
13
+ engine = new ContextEngine(store, 'agent-1', 'dev', 'claude-code', 'interactive');
14
+ });
15
+ afterEach(() => {
16
+ store.close();
17
+ });
18
+ it('Week 1 validation: project → 2 commits → context("global") shows thread + both commits', async () => {
19
+ // Setup: project + branch
20
+ const project = await store.createProject({ name: 'contextgit', description: 'Persistent memory layer' });
21
+ const branch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
22
+ await engine.init(project.id, branch.id);
23
+ // Commit 1 — opens a thread
24
+ const c1 = await engine.commit({
25
+ message: 'Set up monorepo structure',
26
+ content: 'Created pnpm workspaces, tsconfig.base.json, core and store packages.',
27
+ threads: { open: ['Database migration strategy not decided'] },
28
+ });
29
+ expect(c1.id).toBeTruthy();
30
+ expect(c1.summary).toBeTruthy();
31
+ expect(c1.agentRole).toBe('dev');
32
+ // Commit 2 — no thread changes; summary should roll forward
33
+ const c2 = await engine.commit({
34
+ message: 'Add LocalStore implementation',
35
+ content: 'Implemented LocalStore with better-sqlite3, schema, migrations, queries.',
36
+ });
37
+ expect(c2.id).toBeTruthy();
38
+ // Rolling summary must include the new content
39
+ expect(c2.summary).toContain('LocalStore');
40
+ // context('global') → SessionSnapshot
41
+ const snapshot = await engine.context('global');
42
+ expect(snapshot.branchName).toBe('main');
43
+ expect(snapshot.recentCommits).toHaveLength(2);
44
+ expect(snapshot.recentCommits[0].message).toBe('Add LocalStore implementation');
45
+ expect(snapshot.recentCommits[1].message).toBe('Set up monorepo structure');
46
+ // Open thread from commit 1 must survive commit 2
47
+ expect(snapshot.openThreads).toHaveLength(1);
48
+ expect(snapshot.openThreads[0].description).toBe('Database migration strategy not decided');
49
+ });
50
+ it('summarizer rolls content into previous summary', async () => {
51
+ const project = await store.createProject({ name: 'p' });
52
+ const branch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
53
+ await engine.init(project.id, branch.id);
54
+ const c1 = await engine.commit({ message: 'first', content: 'alpha content' });
55
+ const c2 = await engine.commit({ message: 'second', content: 'beta content' });
56
+ // c2 summary must contain both pieces (budget large enough for test data)
57
+ expect(c2.summary).toContain('alpha content');
58
+ expect(c2.summary).toContain('beta content');
59
+ // c1 summary should be just the first content
60
+ expect(c1.summary).toBe('alpha content');
61
+ });
62
+ it('context("branch") returns the same snapshot as context("global")', async () => {
63
+ const project = await store.createProject({ name: 'p' });
64
+ const branch = await store.createBranch({ projectId: project.id, name: 'main', gitBranch: 'main' });
65
+ await engine.init(project.id, branch.id);
66
+ await engine.commit({ message: 'm', content: 'c' });
67
+ const global = await engine.context('global');
68
+ const branchCtx = await engine.context('branch');
69
+ expect(branchCtx.branchName).toBe(global.branchName);
70
+ expect(branchCtx.recentCommits).toHaveLength(global.recentCommits.length);
71
+ });
72
+ it('throws if context() called before init()', async () => {
73
+ const uninitEngine = new ContextEngine(store, 'a', 'solo', 'cli', 'interactive');
74
+ await expect(uninitEngine.context('global')).rejects.toThrow('not initialized');
75
+ });
76
+ });
77
+ //# sourceMappingURL=engine-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-integration.test.js","sourceRoot":"","sources":["../src/engine-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { ContextStore } from './interface.js';
2
+ export { LocalStore } from './local/index.js';
3
+ export { RemoteStore } from './remote/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { LocalStore } from './local/index.js';
2
+ export { RemoteStore } from './remote/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,30 @@
1
+ import type { Agent, AgentInput, AgentRole, Branch, BranchInput, Claim, ClaimInput, Commit, CommitInput, Pagination, Project, ProjectInput, SearchResult, SessionSnapshot, SnapshotFormat, Thread } from '@contextgit/core';
2
+ export interface ContextStore {
3
+ createProject(project: ProjectInput): Promise<Project>;
4
+ getProject(id: string): Promise<Project | null>;
5
+ createBranch(branch: BranchInput): Promise<Branch>;
6
+ getBranch(id: string): Promise<Branch | null>;
7
+ getBranchByGitName(projectId: string, gitBranch: string): Promise<Branch | null>;
8
+ listBranches(projectId: string): Promise<Branch[]>;
9
+ updateBranchHead(branchId: string, commitId: string): Promise<void>;
10
+ mergeBranch(sourceBranchId: string, targetBranchId: string, summary: string): Promise<Commit>;
11
+ createCommit(commit: CommitInput): Promise<Commit>;
12
+ getCommit(id: string): Promise<Commit | null>;
13
+ listCommits(branchId: string, pagination: Pagination): Promise<Commit[]>;
14
+ getSessionSnapshot(projectId: string, branchId: string, options?: {
15
+ agentRole?: AgentRole;
16
+ }): Promise<SessionSnapshot>;
17
+ getFormattedSnapshot(projectId: string, branchId: string, format: SnapshotFormat): Promise<string>;
18
+ listOpenThreads(projectId: string): Promise<Thread[]>;
19
+ listOpenThreadsByBranch(branchId: string): Promise<Thread[]>;
20
+ syncThread(thread: Thread): Promise<Thread>;
21
+ indexEmbedding(commitId: string, vector: Float32Array): Promise<void>;
22
+ semanticSearch(vector: Float32Array, projectId: string, limit: number): Promise<SearchResult[]>;
23
+ fullTextSearch(query: string, projectId: string): Promise<SearchResult[]>;
24
+ upsertAgent(agent: AgentInput): Promise<Agent>;
25
+ listAgents(projectId: string): Promise<Agent[]>;
26
+ claimTask(projectId: string, branchId: string, input: ClaimInput): Promise<Claim>;
27
+ unclaimTask(claimId: string): Promise<void>;
28
+ listActiveClaims(projectId: string): Promise<Claim[]>;
29
+ }
30
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claims.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.test.d.ts","sourceRoot":"","sources":["../../src/local/claims.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { LocalStore } from './index.js';
3
+ // Helpers to set up a minimal project + branch
4
+ async function setupStore() {
5
+ const store = new LocalStore(':memory:');
6
+ const project = await store.createProject({ name: 'test-project' });
7
+ const branch = await store.createBranch({
8
+ projectId: project.id,
9
+ name: 'main',
10
+ gitBranch: 'main',
11
+ });
12
+ return { store, project, branch };
13
+ }
14
+ describe('claimTask', () => {
15
+ afterEach(() => {
16
+ // stores are :memory: — closed per test via store.close()
17
+ });
18
+ it('creates a claim with correct fields', async () => {
19
+ const { store, project, branch } = await setupStore();
20
+ const claim = await store.claimTask(project.id, branch.id, {
21
+ task: 'build auth module',
22
+ agentId: 'agent-1',
23
+ role: 'dev',
24
+ });
25
+ expect(claim.id).toBeTruthy();
26
+ expect(claim.projectId).toBe(project.id);
27
+ expect(claim.branchId).toBe(branch.id);
28
+ expect(claim.task).toBe('build auth module');
29
+ expect(claim.agentId).toBe('agent-1');
30
+ expect(claim.role).toBe('dev');
31
+ expect(claim.status).toBe('proposed');
32
+ expect(claim.ttl).toBe(7_200_000);
33
+ expect(claim.claimedAt).toBeInstanceOf(Date);
34
+ expect(claim.releasedAt).toBeUndefined();
35
+ store.close();
36
+ });
37
+ it('respects custom status and ttl', async () => {
38
+ const { store, project, branch } = await setupStore();
39
+ const claim = await store.claimTask(project.id, branch.id, {
40
+ task: 'write tests',
41
+ agentId: 'agent-2',
42
+ role: 'test',
43
+ status: 'active',
44
+ ttl: 3_600_000, // 1h
45
+ });
46
+ expect(claim.status).toBe('active');
47
+ expect(claim.ttl).toBe(3_600_000);
48
+ store.close();
49
+ });
50
+ });
51
+ describe('listActiveClaims', () => {
52
+ it('returns proposed and active claims', async () => {
53
+ const { store, project, branch } = await setupStore();
54
+ await store.claimTask(project.id, branch.id, { task: 'task-a', agentId: 'agent-1', role: 'dev', status: 'proposed' });
55
+ await store.claimTask(project.id, branch.id, { task: 'task-b', agentId: 'agent-2', role: 'test', status: 'active' });
56
+ const claims = await store.listActiveClaims(project.id);
57
+ expect(claims).toHaveLength(2);
58
+ store.close();
59
+ });
60
+ it('excludes released claims', async () => {
61
+ const { store, project, branch } = await setupStore();
62
+ const c1 = await store.claimTask(project.id, branch.id, { task: 'task-a', agentId: 'agent-1', role: 'dev' });
63
+ await store.claimTask(project.id, branch.id, { task: 'task-b', agentId: 'agent-2', role: 'dev' });
64
+ await store.unclaimTask(c1.id);
65
+ const claims = await store.listActiveClaims(project.id);
66
+ expect(claims).toHaveLength(1);
67
+ expect(claims[0].task).toBe('task-b');
68
+ store.close();
69
+ });
70
+ it('excludes TTL-expired claims', async () => {
71
+ const { store, project, branch } = await setupStore();
72
+ // Create a claim with 1ms TTL (already expired)
73
+ await store.claimTask(project.id, branch.id, { task: 'expired', agentId: 'agent-1', role: 'dev', ttl: 1 });
74
+ // Wait a tick to ensure the TTL has elapsed
75
+ await new Promise((r) => setTimeout(r, 10));
76
+ await store.claimTask(project.id, branch.id, { task: 'active', agentId: 'agent-2', role: 'dev', ttl: 7_200_000 });
77
+ const claims = await store.listActiveClaims(project.id);
78
+ expect(claims).toHaveLength(1);
79
+ expect(claims[0].task).toBe('active');
80
+ store.close();
81
+ });
82
+ });
83
+ describe('unclaimTask', () => {
84
+ it('sets status to released and sets releasedAt', async () => {
85
+ const { store, project, branch } = await setupStore();
86
+ const claim = await store.claimTask(project.id, branch.id, { task: 'do work', agentId: 'agent-1', role: 'solo' });
87
+ await store.unclaimTask(claim.id);
88
+ const active = await store.listActiveClaims(project.id);
89
+ expect(active).toHaveLength(0);
90
+ store.close();
91
+ });
92
+ });
93
+ describe('createCommit auto-release', () => {
94
+ it('releases this agent\'s claims on this branch after commit', async () => {
95
+ const { store, project, branch } = await setupStore();
96
+ await store.claimTask(project.id, branch.id, { task: 'my task', agentId: 'agent-1', role: 'dev' });
97
+ // Second agent's claim should NOT be released
98
+ await store.claimTask(project.id, branch.id, { task: 'other task', agentId: 'agent-2', role: 'dev' });
99
+ await store.createCommit({
100
+ branchId: branch.id,
101
+ agentId: 'agent-1',
102
+ agentRole: 'dev',
103
+ tool: 'test',
104
+ workflowType: 'interactive',
105
+ message: 'done',
106
+ content: 'finished',
107
+ summary: 'finished',
108
+ commitType: 'manual',
109
+ });
110
+ const remaining = await store.listActiveClaims(project.id);
111
+ expect(remaining).toHaveLength(1);
112
+ expect(remaining[0].agentId).toBe('agent-2');
113
+ store.close();
114
+ });
115
+ it('does not release claims on other branches', async () => {
116
+ const { store, project, branch } = await setupStore();
117
+ const otherBranch = await store.createBranch({
118
+ projectId: project.id,
119
+ name: 'feature',
120
+ gitBranch: 'feature/x',
121
+ });
122
+ // agent-1 has a claim on the other branch
123
+ await store.claimTask(project.id, otherBranch.id, { task: 'other branch task', agentId: 'agent-1', role: 'dev' });
124
+ await store.createCommit({
125
+ branchId: branch.id,
126
+ agentId: 'agent-1',
127
+ agentRole: 'dev',
128
+ tool: 'test',
129
+ workflowType: 'interactive',
130
+ message: 'commit on main',
131
+ content: 'work',
132
+ summary: 'work',
133
+ commitType: 'manual',
134
+ });
135
+ const remaining = await store.listActiveClaims(project.id);
136
+ expect(remaining).toHaveLength(1);
137
+ expect(remaining[0].task).toBe('other branch task');
138
+ store.close();
139
+ });
140
+ });
141
+ describe('snapshot activeClaims', () => {
142
+ it('includes active claims in session snapshot', async () => {
143
+ const { store, project, branch } = await setupStore();
144
+ await store.claimTask(project.id, branch.id, { task: 'build feature', agentId: 'agent-1', role: 'dev' });
145
+ const snapshot = await store.getSessionSnapshot(project.id, branch.id);
146
+ expect(snapshot.activeClaims).toHaveLength(1);
147
+ expect(snapshot.activeClaims[0].task).toBe('build feature');
148
+ store.close();
149
+ });
150
+ });
151
+ //# sourceMappingURL=claims.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.test.js","sourceRoot":"","sources":["../../src/local/claims.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,+CAA+C;AAC/C,KAAK,UAAU,UAAU;IACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;QACtC,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACnC,CAAC;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,0DAA0D;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzD,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAA;QAExC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzD,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,SAAS,EAAE,KAAK;SACtB,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEjC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACrH,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEpH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAE9B,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5G,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACjG,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAErC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,gDAAgD;QAChD,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1G,4CAA4C;QAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC3C,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;QAEjH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAErC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QACjH,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAEjC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAE9B,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAClG,8CAA8C;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAErG,MAAM,KAAK,CAAC,YAAY,CAAC;YACvB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QACrD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;YAC3C,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,WAAW;SACvB,CAAC,CAAA;QAEF,0CAA0C;QAC1C,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAEjH,MAAM,KAAK,CAAC,YAAY,CAAC;YACvB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAEnD,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAExG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACtE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAE3D,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { Agent, AgentInput, Branch, BranchInput, Claim, ClaimInput, Commit, CommitInput, Pagination, Project, ProjectInput, SearchResult, SessionSnapshot, SnapshotFormat, Thread } from '@contextgit/core';
2
+ import type { ContextStore } from '../interface.js';
3
+ export declare class LocalStore implements ContextStore {
4
+ private readonly db;
5
+ private readonly q;
6
+ /**
7
+ * @param projectId Used to derive the DB file path.
8
+ * Pass ':memory:' for tests.
9
+ */
10
+ constructor(projectId: string);
11
+ createProject(project: ProjectInput): Promise<Project>;
12
+ getProject(id: string): Promise<Project | null>;
13
+ createBranch(branch: BranchInput): Promise<Branch>;
14
+ getBranch(id: string): Promise<Branch | null>;
15
+ getBranchByGitName(projectId: string, gitBranch: string): Promise<Branch | null>;
16
+ listBranches(projectId: string): Promise<Branch[]>;
17
+ updateBranchHead(branchId: string, commitId: string): Promise<void>;
18
+ mergeBranch(sourceBranchId: string, targetBranchId: string, summary: string): Promise<Commit>;
19
+ createCommit(input: CommitInput): Promise<Commit>;
20
+ getCommit(id: string): Promise<Commit | null>;
21
+ listCommits(branchId: string, pagination: Pagination): Promise<Commit[]>;
22
+ getSessionSnapshot(projectId: string, branchId: string, options?: {
23
+ agentRole?: import('@contextgit/core').AgentRole;
24
+ }): Promise<SessionSnapshot>;
25
+ getFormattedSnapshot(projectId: string, branchId: string, format: SnapshotFormat): Promise<string>;
26
+ listOpenThreads(projectId: string): Promise<Thread[]>;
27
+ listOpenThreadsByBranch(branchId: string): Promise<Thread[]>;
28
+ syncThread(thread: Thread): Promise<Thread>;
29
+ indexEmbedding(commitId: string, vector: Float32Array): Promise<void>;
30
+ semanticSearch(vector: Float32Array, projectId: string, limit: number): Promise<SearchResult[]>;
31
+ fullTextSearch(query: string, projectId: string): Promise<SearchResult[]>;
32
+ upsertAgent(agent: AgentInput): Promise<Agent>;
33
+ listAgents(projectId: string): Promise<Agent[]>;
34
+ claimTask(projectId: string, branchId: string, input: ClaimInput): Promise<Claim>;
35
+ unclaimTask(claimId: string): Promise<void>;
36
+ listActiveClaims(projectId: string): Promise<Claim[]>;
37
+ close(): void;
38
+ }
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local/index.ts"],"names":[],"mappings":"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"}