hzl-core 0.1.0

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 (177) hide show
  1. package/dist/__tests__/backup/backup-restore.test.d.ts +2 -0
  2. package/dist/__tests__/backup/backup-restore.test.d.ts.map +1 -0
  3. package/dist/__tests__/backup/backup-restore.test.js +200 -0
  4. package/dist/__tests__/backup/backup-restore.test.js.map +1 -0
  5. package/dist/__tests__/backup/import-export.test.d.ts +2 -0
  6. package/dist/__tests__/backup/import-export.test.d.ts.map +1 -0
  7. package/dist/__tests__/backup/import-export.test.js +341 -0
  8. package/dist/__tests__/backup/import-export.test.js.map +1 -0
  9. package/dist/__tests__/concurrency/stress.test.d.ts +2 -0
  10. package/dist/__tests__/concurrency/stress.test.d.ts.map +1 -0
  11. package/dist/__tests__/concurrency/stress.test.js +274 -0
  12. package/dist/__tests__/concurrency/stress.test.js.map +1 -0
  13. package/dist/__tests__/concurrency/worker.d.ts +2 -0
  14. package/dist/__tests__/concurrency/worker.d.ts.map +1 -0
  15. package/dist/__tests__/concurrency/worker.js +84 -0
  16. package/dist/__tests__/concurrency/worker.js.map +1 -0
  17. package/dist/__tests__/migrations/upgrade.test.d.ts +2 -0
  18. package/dist/__tests__/migrations/upgrade.test.d.ts.map +1 -0
  19. package/dist/__tests__/migrations/upgrade.test.js +203 -0
  20. package/dist/__tests__/migrations/upgrade.test.js.map +1 -0
  21. package/dist/__tests__/projections/rebuild-equivalence.test.d.ts +2 -0
  22. package/dist/__tests__/projections/rebuild-equivalence.test.d.ts.map +1 -0
  23. package/dist/__tests__/projections/rebuild-equivalence.test.js +276 -0
  24. package/dist/__tests__/projections/rebuild-equivalence.test.js.map +1 -0
  25. package/dist/__tests__/properties/invariants.test.d.ts +2 -0
  26. package/dist/__tests__/properties/invariants.test.d.ts.map +1 -0
  27. package/dist/__tests__/properties/invariants.test.js +314 -0
  28. package/dist/__tests__/properties/invariants.test.js.map +1 -0
  29. package/dist/db/connection.d.ts +13 -0
  30. package/dist/db/connection.d.ts.map +1 -0
  31. package/dist/db/connection.js +52 -0
  32. package/dist/db/connection.js.map +1 -0
  33. package/dist/db/connection.test.d.ts +2 -0
  34. package/dist/db/connection.test.d.ts.map +1 -0
  35. package/dist/db/connection.test.js +63 -0
  36. package/dist/db/connection.test.js.map +1 -0
  37. package/dist/db/migrations/v2.d.ts +2 -0
  38. package/dist/db/migrations/v2.d.ts.map +1 -0
  39. package/dist/db/migrations/v2.js +4 -0
  40. package/dist/db/migrations/v2.js.map +1 -0
  41. package/dist/db/migrations.d.ts +4 -0
  42. package/dist/db/migrations.d.ts.map +1 -0
  43. package/dist/db/migrations.js +45 -0
  44. package/dist/db/migrations.js.map +1 -0
  45. package/dist/db/migrations.test.d.ts +2 -0
  46. package/dist/db/migrations.test.d.ts.map +1 -0
  47. package/dist/db/migrations.test.js +75 -0
  48. package/dist/db/migrations.test.js.map +1 -0
  49. package/dist/db/schema.d.ts +3 -0
  50. package/dist/db/schema.d.ts.map +1 -0
  51. package/dist/db/schema.js +114 -0
  52. package/dist/db/schema.js.map +1 -0
  53. package/dist/events/store.d.ts +33 -0
  54. package/dist/events/store.d.ts.map +1 -0
  55. package/dist/events/store.js +81 -0
  56. package/dist/events/store.js.map +1 -0
  57. package/dist/events/store.test.d.ts +2 -0
  58. package/dist/events/store.test.d.ts.map +1 -0
  59. package/dist/events/store.test.js +138 -0
  60. package/dist/events/store.test.js.map +1 -0
  61. package/dist/events/types.d.ts +106 -0
  62. package/dist/events/types.d.ts.map +1 -0
  63. package/dist/events/types.js +87 -0
  64. package/dist/events/types.js.map +1 -0
  65. package/dist/events/validation.test.d.ts +2 -0
  66. package/dist/events/validation.test.d.ts.map +1 -0
  67. package/dist/events/validation.test.js +83 -0
  68. package/dist/events/validation.test.js.map +1 -0
  69. package/dist/fixtures/sample-data.d.ts +16 -0
  70. package/dist/fixtures/sample-data.d.ts.map +1 -0
  71. package/dist/fixtures/sample-data.js +148 -0
  72. package/dist/fixtures/sample-data.js.map +1 -0
  73. package/dist/index.d.ts +27 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +44 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/index.test.d.ts +2 -0
  78. package/dist/index.test.d.ts.map +1 -0
  79. package/dist/index.test.js +102 -0
  80. package/dist/index.test.js.map +1 -0
  81. package/dist/projections/comments-checkpoints.d.ts +11 -0
  82. package/dist/projections/comments-checkpoints.d.ts.map +1 -0
  83. package/dist/projections/comments-checkpoints.js +33 -0
  84. package/dist/projections/comments-checkpoints.js.map +1 -0
  85. package/dist/projections/comments-checkpoints.test.d.ts +2 -0
  86. package/dist/projections/comments-checkpoints.test.d.ts.map +1 -0
  87. package/dist/projections/comments-checkpoints.test.js +72 -0
  88. package/dist/projections/comments-checkpoints.test.js.map +1 -0
  89. package/dist/projections/dependencies.d.ts +12 -0
  90. package/dist/projections/dependencies.d.ts.map +1 -0
  91. package/dist/projections/dependencies.js +39 -0
  92. package/dist/projections/dependencies.js.map +1 -0
  93. package/dist/projections/dependencies.test.d.ts +2 -0
  94. package/dist/projections/dependencies.test.d.ts.map +1 -0
  95. package/dist/projections/dependencies.test.js +97 -0
  96. package/dist/projections/dependencies.test.js.map +1 -0
  97. package/dist/projections/engine.d.ts +18 -0
  98. package/dist/projections/engine.d.ts.map +1 -0
  99. package/dist/projections/engine.js +56 -0
  100. package/dist/projections/engine.js.map +1 -0
  101. package/dist/projections/engine.test.d.ts +2 -0
  102. package/dist/projections/engine.test.d.ts.map +1 -0
  103. package/dist/projections/engine.test.js +92 -0
  104. package/dist/projections/engine.test.js.map +1 -0
  105. package/dist/projections/rebuild.d.ts +4 -0
  106. package/dist/projections/rebuild.d.ts.map +1 -0
  107. package/dist/projections/rebuild.js +26 -0
  108. package/dist/projections/rebuild.js.map +1 -0
  109. package/dist/projections/rebuild.test.d.ts +2 -0
  110. package/dist/projections/rebuild.test.d.ts.map +1 -0
  111. package/dist/projections/rebuild.test.js +59 -0
  112. package/dist/projections/rebuild.test.js.map +1 -0
  113. package/dist/projections/search.d.ts +11 -0
  114. package/dist/projections/search.d.ts.map +1 -0
  115. package/dist/projections/search.js +39 -0
  116. package/dist/projections/search.js.map +1 -0
  117. package/dist/projections/search.test.d.ts +2 -0
  118. package/dist/projections/search.test.d.ts.map +1 -0
  119. package/dist/projections/search.test.js +78 -0
  120. package/dist/projections/search.test.js.map +1 -0
  121. package/dist/projections/tags.d.ts +12 -0
  122. package/dist/projections/tags.d.ts.map +1 -0
  123. package/dist/projections/tags.js +41 -0
  124. package/dist/projections/tags.js.map +1 -0
  125. package/dist/projections/tags.test.d.ts +2 -0
  126. package/dist/projections/tags.test.d.ts.map +1 -0
  127. package/dist/projections/tags.test.js +69 -0
  128. package/dist/projections/tags.test.js.map +1 -0
  129. package/dist/projections/tasks-current.d.ts +14 -0
  130. package/dist/projections/tasks-current.d.ts.map +1 -0
  131. package/dist/projections/tasks-current.js +110 -0
  132. package/dist/projections/tasks-current.js.map +1 -0
  133. package/dist/projections/tasks-current.test.d.ts +2 -0
  134. package/dist/projections/tasks-current.test.d.ts.map +1 -0
  135. package/dist/projections/tasks-current.test.js +215 -0
  136. package/dist/projections/tasks-current.test.js.map +1 -0
  137. package/dist/projections/types.d.ts +13 -0
  138. package/dist/projections/types.d.ts.map +1 -0
  139. package/dist/projections/types.js +2 -0
  140. package/dist/projections/types.js.map +1 -0
  141. package/dist/services/backup-service.d.ts +16 -0
  142. package/dist/services/backup-service.d.ts.map +1 -0
  143. package/dist/services/backup-service.js +114 -0
  144. package/dist/services/backup-service.js.map +1 -0
  145. package/dist/services/search-service.d.ts +27 -0
  146. package/dist/services/search-service.d.ts.map +1 -0
  147. package/dist/services/search-service.js +33 -0
  148. package/dist/services/search-service.js.map +1 -0
  149. package/dist/services/search-service.test.d.ts +2 -0
  150. package/dist/services/search-service.test.d.ts.map +1 -0
  151. package/dist/services/search-service.test.js +66 -0
  152. package/dist/services/search-service.test.js.map +1 -0
  153. package/dist/services/task-service.d.ts +147 -0
  154. package/dist/services/task-service.d.ts.map +1 -0
  155. package/dist/services/task-service.js +442 -0
  156. package/dist/services/task-service.js.map +1 -0
  157. package/dist/services/task-service.test.d.ts +2 -0
  158. package/dist/services/task-service.test.d.ts.map +1 -0
  159. package/dist/services/task-service.test.js +399 -0
  160. package/dist/services/task-service.test.js.map +1 -0
  161. package/dist/services/validation-service.d.ts +29 -0
  162. package/dist/services/validation-service.d.ts.map +1 -0
  163. package/dist/services/validation-service.js +74 -0
  164. package/dist/services/validation-service.js.map +1 -0
  165. package/dist/services/validation-service.test.d.ts +2 -0
  166. package/dist/services/validation-service.test.d.ts.map +1 -0
  167. package/dist/services/validation-service.test.js +67 -0
  168. package/dist/services/validation-service.test.js.map +1 -0
  169. package/dist/utils/id.d.ts +3 -0
  170. package/dist/utils/id.d.ts.map +1 -0
  171. package/dist/utils/id.js +12 -0
  172. package/dist/utils/id.js.map +1 -0
  173. package/dist/utils/id.test.d.ts +2 -0
  174. package/dist/utils/id.test.d.ts.map +1 -0
  175. package/dist/utils/id.test.js +24 -0
  176. package/dist/utils/id.test.js.map +1 -0
  177. package/package.json +83 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backup-restore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-restore.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/backup/backup-restore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,200 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { createConnection } from '../../db/connection.js';
6
+ import { EventStore } from '../../events/store.js';
7
+ import { ProjectionEngine } from '../../projections/engine.js';
8
+ import { TasksCurrentProjector } from '../../projections/tasks-current.js';
9
+ import { DependenciesProjector } from '../../projections/dependencies.js';
10
+ import { TagsProjector } from '../../projections/tags.js';
11
+ import { SearchProjector } from '../../projections/search.js';
12
+ import { CommentsCheckpointsProjector } from '../../projections/comments-checkpoints.js';
13
+ import { TaskService } from '../../services/task-service.js';
14
+ import { BackupService } from '../../services/backup-service.js';
15
+ import { TaskStatus } from '../../events/types.js';
16
+ import Database from 'better-sqlite3';
17
+ describe('Backup/Restore Round-Trip Tests', () => {
18
+ let tempDir;
19
+ let dbPath;
20
+ let backupPath;
21
+ let db;
22
+ let taskService;
23
+ let backupService;
24
+ function setupServices(database) {
25
+ const eventStore = new EventStore(database);
26
+ const engine = new ProjectionEngine(database);
27
+ engine.register(new TasksCurrentProjector());
28
+ engine.register(new DependenciesProjector());
29
+ engine.register(new TagsProjector());
30
+ engine.register(new SearchProjector());
31
+ engine.register(new CommentsCheckpointsProjector());
32
+ return {
33
+ taskService: new TaskService(database, eventStore, engine),
34
+ backupService: new BackupService(database),
35
+ };
36
+ }
37
+ beforeEach(() => {
38
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hzl-backup-'));
39
+ dbPath = path.join(tempDir, 'test.db');
40
+ backupPath = path.join(tempDir, 'backup.db');
41
+ db = createConnection(dbPath);
42
+ const services = setupServices(db);
43
+ taskService = services.taskService;
44
+ backupService = services.backupService;
45
+ });
46
+ afterEach(() => {
47
+ db.close();
48
+ fs.rmSync(tempDir, { recursive: true, force: true });
49
+ });
50
+ describe('backup', () => {
51
+ it('creates a complete backup of the database', async () => {
52
+ const task1 = taskService.createTask({ title: 'Task 1', project: 'inbox', tags: ['urgent'] });
53
+ const task2 = taskService.createTask({
54
+ title: 'Task 2',
55
+ project: 'inbox',
56
+ depends_on: [task1.task_id],
57
+ });
58
+ taskService.setStatus(task1.task_id, TaskStatus.Ready);
59
+ taskService.claimTask(task1.task_id, { author: 'agent-1' });
60
+ taskService.addComment(task1.task_id, 'Working on it');
61
+ taskService.addCheckpoint(task1.task_id, 'step1', { progress: 50 });
62
+ await backupService.backup(backupPath);
63
+ expect(fs.existsSync(backupPath)).toBe(true);
64
+ const backupDb = new Database(backupPath, { readonly: true });
65
+ const tables = backupDb
66
+ .prepare("SELECT name FROM sqlite_master WHERE type='table'")
67
+ .all();
68
+ expect(tables.map((t) => t.name)).toContain('events');
69
+ expect(tables.map((t) => t.name)).toContain('tasks_current');
70
+ backupDb.close();
71
+ });
72
+ it('backup is consistent (no partial writes)', async () => {
73
+ for (let i = 0; i < 100; i++) {
74
+ taskService.createTask({ title: `Task ${i}`, project: 'inbox' });
75
+ }
76
+ await backupService.backup(backupPath);
77
+ const backupDb = new Database(backupPath, { readonly: true });
78
+ const eventCount = backupDb
79
+ .prepare('SELECT COUNT(*) as count FROM events')
80
+ .get();
81
+ const taskCount = backupDb
82
+ .prepare('SELECT COUNT(*) as count FROM tasks_current')
83
+ .get();
84
+ expect(eventCount.count).toBe(100);
85
+ expect(taskCount.count).toBe(100);
86
+ backupDb.close();
87
+ });
88
+ });
89
+ describe('restore', () => {
90
+ it('restores database to exact state from backup', async () => {
91
+ const task1 = taskService.createTask({ title: 'Original task', project: 'inbox' });
92
+ taskService.setStatus(task1.task_id, TaskStatus.Ready);
93
+ taskService.addComment(task1.task_id, 'Original comment');
94
+ await backupService.backup(backupPath);
95
+ taskService.createTask({ title: 'New task after backup', project: 'inbox' });
96
+ taskService.claimTask(task1.task_id, { author: 'agent-1' });
97
+ taskService.completeTask(task1.task_id);
98
+ db.close();
99
+ fs.unlinkSync(dbPath);
100
+ await backupService.restore(backupPath, dbPath);
101
+ const restoredDb = createConnection(dbPath);
102
+ const tasks = restoredDb.prepare('SELECT * FROM tasks_current').all();
103
+ expect(tasks).toHaveLength(1);
104
+ expect(tasks[0].title).toBe('Original task');
105
+ expect(tasks[0].status).toBe('ready');
106
+ const newTaskCount = restoredDb
107
+ .prepare("SELECT COUNT(*) as count FROM tasks_current WHERE title = 'New task after backup'")
108
+ .get();
109
+ expect(newTaskCount.count).toBe(0);
110
+ restoredDb.close();
111
+ });
112
+ it('restore fails gracefully with invalid backup file', async () => {
113
+ const invalidBackupPath = path.join(tempDir, 'invalid.db');
114
+ fs.writeFileSync(invalidBackupPath, 'not a valid sqlite database');
115
+ await expect(backupService.restore(invalidBackupPath, dbPath)).rejects.toThrow();
116
+ });
117
+ it('restore fails gracefully with non-existent backup file', async () => {
118
+ const nonExistentPath = path.join(tempDir, 'does-not-exist.db');
119
+ await expect(backupService.restore(nonExistentPath, dbPath)).rejects.toThrow();
120
+ });
121
+ });
122
+ describe('round-trip integrity', () => {
123
+ it('preserves all data types through backup/restore cycle', async () => {
124
+ const task = taskService.createTask({
125
+ title: 'Complex task',
126
+ project: 'test-project',
127
+ description: 'A detailed description with special chars: "quotes" & <brackets>',
128
+ tags: ['tag1', 'tag2', 'tag-with-dash'],
129
+ priority: 3,
130
+ due_at: '2026-12-31T23:59:59Z',
131
+ metadata: { key1: 'value1', nested: { a: 1, b: [1, 2, 3] } },
132
+ links: ['https://example.com', '/path/to/file.md'],
133
+ });
134
+ const dep = taskService.createTask({ title: 'Dependency', project: 'test-project' });
135
+ taskService.setStatus(dep.task_id, TaskStatus.Ready);
136
+ taskService.claimTask(dep.task_id, { author: 'agent', lease_until: '2026-02-01T00:00:00Z' });
137
+ taskService.addComment(task.task_id, 'Comment with unicode: 你好世界 🎉');
138
+ taskService.addCheckpoint(task.task_id, 'checkpoint1', { data: { complex: true } });
139
+ await backupService.backup(backupPath);
140
+ db.close();
141
+ const restorePath = path.join(tempDir, 'restored.db');
142
+ await backupService.restore(backupPath, restorePath);
143
+ const restoredDb = createConnection(restorePath);
144
+ const restoredTask = restoredDb
145
+ .prepare('SELECT * FROM tasks_current WHERE task_id = ?')
146
+ .get(task.task_id);
147
+ expect(restoredTask.title).toBe('Complex task');
148
+ expect(restoredTask.description).toBe('A detailed description with special chars: "quotes" & <brackets>');
149
+ expect(JSON.parse(restoredTask.tags)).toEqual(['tag1', 'tag2', 'tag-with-dash']);
150
+ expect(restoredTask.priority).toBe(3);
151
+ expect(restoredTask.due_at).toBe('2026-12-31T23:59:59Z');
152
+ expect(JSON.parse(restoredTask.metadata)).toEqual({
153
+ key1: 'value1',
154
+ nested: { a: 1, b: [1, 2, 3] },
155
+ });
156
+ expect(JSON.parse(restoredTask.links)).toEqual([
157
+ 'https://example.com',
158
+ '/path/to/file.md',
159
+ ]);
160
+ const claimedTask = restoredDb
161
+ .prepare('SELECT * FROM tasks_current WHERE task_id = ?')
162
+ .get(dep.task_id);
163
+ expect(claimedTask.claimed_by_author).toBe('agent');
164
+ expect(claimedTask.lease_until).toBe('2026-02-01T00:00:00Z');
165
+ const comment = restoredDb
166
+ .prepare('SELECT * FROM task_comments WHERE task_id = ?')
167
+ .get(task.task_id);
168
+ expect(comment.text).toBe('Comment with unicode: 你好世界 🎉');
169
+ const checkpoint = restoredDb
170
+ .prepare('SELECT * FROM task_checkpoints WHERE task_id = ?')
171
+ .get(task.task_id);
172
+ expect(checkpoint.name).toBe('checkpoint1');
173
+ expect(JSON.parse(checkpoint.data)).toEqual({ data: { complex: true } });
174
+ restoredDb.close();
175
+ });
176
+ it('preserves event ordering through backup/restore', async () => {
177
+ const task = taskService.createTask({ title: 'Task', project: 'inbox' });
178
+ taskService.setStatus(task.task_id, TaskStatus.Ready);
179
+ taskService.claimTask(task.task_id, { author: 'agent-1' });
180
+ taskService.addComment(task.task_id, 'Comment 1');
181
+ taskService.addComment(task.task_id, 'Comment 2');
182
+ taskService.addCheckpoint(task.task_id, 'step1');
183
+ taskService.completeTask(task.task_id);
184
+ const originalEvents = db
185
+ .prepare('SELECT event_id, type FROM events ORDER BY id')
186
+ .all();
187
+ await backupService.backup(backupPath);
188
+ db.close();
189
+ const restorePath = path.join(tempDir, 'restored.db');
190
+ await backupService.restore(backupPath, restorePath);
191
+ const restoredDb = createConnection(restorePath);
192
+ const restoredEvents = restoredDb
193
+ .prepare('SELECT event_id, type FROM events ORDER BY id')
194
+ .all();
195
+ expect(restoredEvents).toEqual(originalEvents);
196
+ restoredDb.close();
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=backup-restore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-restore.test.js","sourceRoot":"","sources":["../../../src/__tests__/backup/backup-restore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=import-export.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-export.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/backup/import-export.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,341 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import readline from 'readline';
6
+ import { createConnection } from '../../db/connection.js';
7
+ import { EventStore } from '../../events/store.js';
8
+ import { ProjectionEngine } from '../../projections/engine.js';
9
+ import { TasksCurrentProjector } from '../../projections/tasks-current.js';
10
+ import { DependenciesProjector } from '../../projections/dependencies.js';
11
+ import { TagsProjector } from '../../projections/tags.js';
12
+ import { SearchProjector } from '../../projections/search.js';
13
+ import { CommentsCheckpointsProjector } from '../../projections/comments-checkpoints.js';
14
+ import { TaskService } from '../../services/task-service.js';
15
+ import { BackupService } from '../../services/backup-service.js';
16
+ import { TaskStatus } from '../../events/types.js';
17
+ async function readJsonlFile(filePath) {
18
+ const lines = [];
19
+ const fileStream = fs.createReadStream(filePath);
20
+ const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
21
+ for await (const line of rl) {
22
+ if (line.trim()) {
23
+ lines.push(JSON.parse(line));
24
+ }
25
+ }
26
+ return lines;
27
+ }
28
+ describe('Import/Export Idempotency Tests', () => {
29
+ let tempDir;
30
+ let dbPath;
31
+ let exportPath;
32
+ let db;
33
+ let eventStore;
34
+ let taskService;
35
+ let backupService;
36
+ function setupServices(database) {
37
+ const eventStore = new EventStore(database);
38
+ const engine = new ProjectionEngine(database);
39
+ engine.register(new TasksCurrentProjector());
40
+ engine.register(new DependenciesProjector());
41
+ engine.register(new TagsProjector());
42
+ engine.register(new SearchProjector());
43
+ engine.register(new CommentsCheckpointsProjector());
44
+ return {
45
+ eventStore,
46
+ taskService: new TaskService(database, eventStore, engine),
47
+ backupService: new BackupService(database),
48
+ };
49
+ }
50
+ beforeEach(() => {
51
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hzl-export-'));
52
+ dbPath = path.join(tempDir, 'test.db');
53
+ exportPath = path.join(tempDir, 'events.jsonl');
54
+ db = createConnection(dbPath);
55
+ const services = setupServices(db);
56
+ eventStore = services.eventStore;
57
+ taskService = services.taskService;
58
+ backupService = services.backupService;
59
+ });
60
+ afterEach(() => {
61
+ db.close();
62
+ fs.rmSync(tempDir, { recursive: true, force: true });
63
+ });
64
+ describe('export', () => {
65
+ it('exports all events to JSONL format', async () => {
66
+ const task1 = taskService.createTask({ title: 'Task 1', project: 'inbox' });
67
+ taskService.setStatus(task1.task_id, TaskStatus.Ready);
68
+ taskService.addComment(task1.task_id, 'A comment');
69
+ await backupService.exportEvents(exportPath);
70
+ expect(fs.existsSync(exportPath)).toBe(true);
71
+ const events = await readJsonlFile(exportPath);
72
+ expect(events.length).toBe(3);
73
+ expect(events[0].type).toBe('task_created');
74
+ expect(events[1].type).toBe('status_changed');
75
+ expect(events[2].type).toBe('comment_added');
76
+ });
77
+ it('exports events with all fields preserved', async () => {
78
+ const task = taskService.createTask({
79
+ title: 'Full task',
80
+ project: 'test',
81
+ description: 'Description',
82
+ tags: ['tag1'],
83
+ }, {
84
+ author: 'user-1',
85
+ agent_id: 'AGENT001',
86
+ session_id: 'SESSION001',
87
+ correlation_id: 'CORR001',
88
+ });
89
+ await backupService.exportEvents(exportPath);
90
+ const events = await readJsonlFile(exportPath);
91
+ const taskCreatedEvent = events[0];
92
+ expect(taskCreatedEvent.event_id).toBeDefined();
93
+ expect(taskCreatedEvent.task_id).toBe(task.task_id);
94
+ expect(taskCreatedEvent.type).toBe('task_created');
95
+ expect(taskCreatedEvent.data.title).toBe('Full task');
96
+ expect(taskCreatedEvent.author).toBe('user-1');
97
+ expect(taskCreatedEvent.agent_id).toBe('AGENT001');
98
+ expect(taskCreatedEvent.session_id).toBe('SESSION001');
99
+ expect(taskCreatedEvent.correlation_id).toBe('CORR001');
100
+ expect(taskCreatedEvent.timestamp).toBeDefined();
101
+ });
102
+ it('exports events in chronological order', async () => {
103
+ const task = taskService.createTask({ title: 'Task', project: 'inbox' });
104
+ taskService.setStatus(task.task_id, TaskStatus.Ready);
105
+ taskService.claimTask(task.task_id, { author: 'agent' });
106
+ taskService.completeTask(task.task_id);
107
+ await backupService.exportEvents(exportPath);
108
+ const events = await readJsonlFile(exportPath);
109
+ expect(events[0].type).toBe('task_created');
110
+ expect(events[1].type).toBe('status_changed');
111
+ expect(events[1].data.to).toBe('ready');
112
+ expect(events[2].type).toBe('status_changed');
113
+ expect(events[2].data.to).toBe('in_progress');
114
+ expect(events[3].type).toBe('status_changed');
115
+ expect(events[3].data.to).toBe('done');
116
+ for (let i = 1; i < events.length; i++) {
117
+ expect(new Date(events[i].timestamp).getTime()).toBeGreaterThanOrEqual(new Date(events[i - 1].timestamp).getTime());
118
+ }
119
+ });
120
+ });
121
+ describe('import', () => {
122
+ it('imports events to empty database', async () => {
123
+ const task = taskService.createTask({ title: 'Task', project: 'inbox' });
124
+ taskService.setStatus(task.task_id, TaskStatus.Ready);
125
+ await backupService.exportEvents(exportPath);
126
+ db.close();
127
+ const newDbPath = path.join(tempDir, 'new.db');
128
+ const newDb = createConnection(newDbPath);
129
+ const newServices = setupServices(newDb);
130
+ const result = await newServices.backupService.importEvents(exportPath);
131
+ expect(result.imported).toBe(2);
132
+ expect(result.skipped).toBe(0);
133
+ const events = newDb.prepare('SELECT * FROM events ORDER BY id').all();
134
+ expect(events).toHaveLength(2);
135
+ expect(events[0].type).toBe('task_created');
136
+ expect(events[1].type).toBe('status_changed');
137
+ const tasks = newDb.prepare('SELECT * FROM tasks_current').all();
138
+ expect(tasks).toHaveLength(1);
139
+ expect(tasks[0].status).toBe('ready');
140
+ newDb.close();
141
+ });
142
+ it('is idempotent - duplicate imports are skipped', async () => {
143
+ const task = taskService.createTask({ title: 'Task', project: 'inbox' });
144
+ taskService.setStatus(task.task_id, TaskStatus.Ready);
145
+ await backupService.exportEvents(exportPath);
146
+ db.close();
147
+ const newDbPath = path.join(tempDir, 'new.db');
148
+ const newDb = createConnection(newDbPath);
149
+ const newServices = setupServices(newDb);
150
+ const result1 = await newServices.backupService.importEvents(exportPath);
151
+ expect(result1.imported).toBe(2);
152
+ expect(result1.skipped).toBe(0);
153
+ const result2 = await newServices.backupService.importEvents(exportPath);
154
+ expect(result2.imported).toBe(0);
155
+ expect(result2.skipped).toBe(2);
156
+ const result3 = await newServices.backupService.importEvents(exportPath);
157
+ expect(result3.imported).toBe(0);
158
+ expect(result3.skipped).toBe(2);
159
+ const eventCount = newDb
160
+ .prepare('SELECT COUNT(*) as count FROM events')
161
+ .get();
162
+ expect(eventCount.count).toBe(2);
163
+ newDb.close();
164
+ });
165
+ it('handles partial imports (some events already exist)', async () => {
166
+ const task1 = taskService.createTask({ title: 'Task 1', project: 'inbox' });
167
+ await backupService.exportEvents(exportPath);
168
+ const task2 = taskService.createTask({ title: 'Task 2', project: 'inbox' });
169
+ const exportPath2 = path.join(tempDir, 'events2.jsonl');
170
+ await backupService.exportEvents(exportPath2);
171
+ db.close();
172
+ const newDbPath = path.join(tempDir, 'new.db');
173
+ const newDb = createConnection(newDbPath);
174
+ const newServices = setupServices(newDb);
175
+ await newServices.backupService.importEvents(exportPath);
176
+ const result = await newServices.backupService.importEvents(exportPath2);
177
+ expect(result.imported).toBe(1);
178
+ expect(result.skipped).toBe(1);
179
+ newDb.close();
180
+ });
181
+ it('handles malformed JSONL gracefully', async () => {
182
+ const malformedPath = path.join(tempDir, 'malformed.jsonl');
183
+ fs.writeFileSync(malformedPath, `
184
+ {"event_id":"EVT1","task_id":"TASK1","type":"task_created","data":{"title":"Valid","project":"inbox"},"timestamp":"2026-01-01T00:00:00Z"}
185
+ not valid json
186
+ {"event_id":"EVT2","task_id":"TASK2","type":"task_created","data":{"title":"Also valid","project":"inbox"},"timestamp":"2026-01-01T00:01:00Z"}
187
+ `);
188
+ const result = await backupService.importEvents(malformedPath);
189
+ expect(result.imported).toBe(2);
190
+ expect(result.errors).toBe(1);
191
+ });
192
+ });
193
+ describe('round-trip integrity', () => {
194
+ it('export then import produces identical event store', async () => {
195
+ const task1 = taskService.createTask({
196
+ title: 'Complex task',
197
+ project: 'test',
198
+ description: 'Description with unicode: 日本語',
199
+ tags: ['tag1', 'tag2'],
200
+ priority: 2,
201
+ metadata: { key: 'value' },
202
+ });
203
+ const task2 = taskService.createTask({
204
+ title: 'Dependent task',
205
+ project: 'test',
206
+ depends_on: [task1.task_id],
207
+ });
208
+ taskService.setStatus(task1.task_id, TaskStatus.Ready);
209
+ taskService.claimTask(task1.task_id, {
210
+ author: 'agent-1',
211
+ lease_until: '2026-02-01T00:00:00Z',
212
+ });
213
+ taskService.addComment(task1.task_id, 'Comment with emoji 🎉');
214
+ taskService.addCheckpoint(task1.task_id, 'step1', { progress: 50 });
215
+ taskService.completeTask(task1.task_id);
216
+ await backupService.exportEvents(exportPath);
217
+ const originalEvents = db
218
+ .prepare('SELECT event_id, task_id, type, data, author, agent_id, timestamp FROM events ORDER BY id')
219
+ .all();
220
+ db.close();
221
+ const newDbPath = path.join(tempDir, 'new.db');
222
+ const newDb = createConnection(newDbPath);
223
+ const newServices = setupServices(newDb);
224
+ await newServices.backupService.importEvents(exportPath);
225
+ const importedEvents = newDb
226
+ .prepare('SELECT event_id, task_id, type, data, author, agent_id, timestamp FROM events ORDER BY id')
227
+ .all();
228
+ expect(importedEvents.length).toBe(originalEvents.length);
229
+ for (let i = 0; i < originalEvents.length; i++) {
230
+ expect(importedEvents[i].event_id).toBe(originalEvents[i].event_id);
231
+ expect(importedEvents[i].task_id).toBe(originalEvents[i].task_id);
232
+ expect(importedEvents[i].type).toBe(originalEvents[i].type);
233
+ expect(importedEvents[i].data).toBe(originalEvents[i].data);
234
+ expect(importedEvents[i].author).toBe(originalEvents[i].author);
235
+ expect(importedEvents[i].timestamp).toBe(originalEvents[i].timestamp);
236
+ }
237
+ newDb.close();
238
+ });
239
+ it('rebuilding projections after import produces consistent state', async () => {
240
+ const task1 = taskService.createTask({ title: 'Task 1', project: 'inbox', tags: ['urgent'] });
241
+ const task2 = taskService.createTask({ title: 'Task 2', project: 'inbox', depends_on: [task1.task_id] });
242
+ taskService.setStatus(task1.task_id, TaskStatus.Ready);
243
+ taskService.claimTask(task1.task_id, { author: 'agent' });
244
+ taskService.addComment(task1.task_id, 'Comment');
245
+ taskService.completeTask(task1.task_id);
246
+ const originalTasks = db
247
+ .prepare('SELECT * FROM tasks_current ORDER BY task_id')
248
+ .all();
249
+ const originalDeps = db
250
+ .prepare('SELECT * FROM task_dependencies ORDER BY task_id')
251
+ .all();
252
+ const originalTags = db
253
+ .prepare('SELECT * FROM task_tags ORDER BY task_id, tag')
254
+ .all();
255
+ const originalComments = db
256
+ .prepare('SELECT * FROM task_comments ORDER BY event_rowid')
257
+ .all();
258
+ await backupService.exportEvents(exportPath);
259
+ db.close();
260
+ const newDbPath = path.join(tempDir, 'new.db');
261
+ const newDb = createConnection(newDbPath);
262
+ const newServices = setupServices(newDb);
263
+ await newServices.backupService.importEvents(exportPath);
264
+ const importedTasks = newDb
265
+ .prepare('SELECT * FROM tasks_current ORDER BY task_id')
266
+ .all();
267
+ const importedDeps = newDb
268
+ .prepare('SELECT * FROM task_dependencies ORDER BY task_id')
269
+ .all();
270
+ const importedTags = newDb
271
+ .prepare('SELECT * FROM task_tags ORDER BY task_id, tag')
272
+ .all();
273
+ const importedComments = newDb
274
+ .prepare('SELECT * FROM task_comments ORDER BY event_rowid')
275
+ .all();
276
+ expect(importedTasks.length).toBe(originalTasks.length);
277
+ expect(importedDeps.length).toBe(originalDeps.length);
278
+ expect(importedTags.length).toBe(originalTags.length);
279
+ expect(importedComments.length).toBe(originalComments.length);
280
+ for (let i = 0; i < originalTasks.length; i++) {
281
+ expect(importedTasks[i].task_id).toBe(originalTasks[i].task_id);
282
+ expect(importedTasks[i].title).toBe(originalTasks[i].title);
283
+ expect(importedTasks[i].status).toBe(originalTasks[i].status);
284
+ expect(importedTasks[i].tags).toBe(originalTasks[i].tags);
285
+ }
286
+ newDb.close();
287
+ });
288
+ });
289
+ describe('edge cases', () => {
290
+ it('handles empty database export', async () => {
291
+ await backupService.exportEvents(exportPath);
292
+ const events = await readJsonlFile(exportPath);
293
+ expect(events).toHaveLength(0);
294
+ });
295
+ it('handles very large event data', async () => {
296
+ const largeMetadata = {};
297
+ for (let i = 0; i < 1000; i++) {
298
+ largeMetadata[`key${i}`] = 'x'.repeat(100);
299
+ }
300
+ const task = taskService.createTask({
301
+ title: 'Large task',
302
+ project: 'inbox',
303
+ metadata: largeMetadata,
304
+ });
305
+ await backupService.exportEvents(exportPath);
306
+ db.close();
307
+ const newDbPath = path.join(tempDir, 'new.db');
308
+ const newDb = createConnection(newDbPath);
309
+ const newServices = setupServices(newDb);
310
+ const result = await newServices.backupService.importEvents(exportPath);
311
+ expect(result.imported).toBe(1);
312
+ const importedTask = newDb
313
+ .prepare('SELECT * FROM tasks_current WHERE task_id = ?')
314
+ .get(task.task_id);
315
+ const importedMetadata = JSON.parse(importedTask.metadata);
316
+ expect(Object.keys(importedMetadata).length).toBe(1000);
317
+ newDb.close();
318
+ });
319
+ it('handles special characters in event data', async () => {
320
+ const task = taskService.createTask({
321
+ title: 'Task with "quotes" and \\backslashes\\ and \nnewlines',
322
+ project: 'inbox',
323
+ description: 'Unicode: 你好 🌍 العربية',
324
+ });
325
+ taskService.addComment(task.task_id, 'Comment with\ttabs\nand\r\nwindows newlines');
326
+ await backupService.exportEvents(exportPath);
327
+ db.close();
328
+ const newDbPath = path.join(tempDir, 'new.db');
329
+ const newDb = createConnection(newDbPath);
330
+ const newServices = setupServices(newDb);
331
+ await newServices.backupService.importEvents(exportPath);
332
+ const importedTask = newDb
333
+ .prepare('SELECT * FROM tasks_current WHERE task_id = ?')
334
+ .get(task.task_id);
335
+ expect(importedTask.title).toBe('Task with "quotes" and \\backslashes\\ and \nnewlines');
336
+ expect(importedTask.description).toBe('Unicode: 你好 🌍 العربية');
337
+ newDb.close();
338
+ });
339
+ });
340
+ });
341
+ //# sourceMappingURL=import-export.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-export.test.js","sourceRoot":"","sources":["../../../src/__tests__/backup/import-export.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stress.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/concurrency/stress.test.ts"],"names":[],"mappings":""}