agkan 2.14.3 → 3.0.1

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 (197) hide show
  1. package/README.ja.md +62 -238
  2. package/README.md +48 -241
  3. package/dist/board/boardFavicon.d.ts +2 -0
  4. package/dist/board/boardFavicon.d.ts.map +1 -0
  5. package/dist/board/boardFavicon.js +5 -0
  6. package/dist/board/boardFavicon.js.map +1 -0
  7. package/dist/board/boardRenderer.d.ts +22 -6
  8. package/dist/board/boardRenderer.d.ts.map +1 -1
  9. package/dist/board/boardRenderer.js +67 -26
  10. package/dist/board/boardRenderer.js.map +1 -1
  11. package/dist/board/boardRoutes.d.ts +4 -2
  12. package/dist/board/boardRoutes.d.ts.map +1 -1
  13. package/dist/board/boardRoutes.js +140 -13
  14. package/dist/board/boardRoutes.js.map +1 -1
  15. package/dist/board/boardStyles.d.ts +1 -1
  16. package/dist/board/boardStyles.d.ts.map +1 -1
  17. package/dist/board/boardStyles.js +62 -8
  18. package/dist/board/boardStyles.js.map +1 -1
  19. package/dist/board/client/board.js +1007 -29
  20. package/dist/board/server.d.ts +3 -2
  21. package/dist/board/server.d.ts.map +1 -1
  22. package/dist/board/server.js +9 -7
  23. package/dist/board/server.js.map +1 -1
  24. package/dist/cli/commands/agent-guide.d.ts.map +1 -1
  25. package/dist/cli/commands/agent-guide.js +6 -0
  26. package/dist/cli/commands/agent-guide.js.map +1 -1
  27. package/dist/cli/commands/board.d.ts.map +1 -1
  28. package/dist/cli/commands/board.js +202 -15
  29. package/dist/cli/commands/board.js.map +1 -1
  30. package/dist/cli/commands/ps.d.ts +7 -0
  31. package/dist/cli/commands/ps.d.ts.map +1 -0
  32. package/dist/cli/commands/ps.js +83 -0
  33. package/dist/cli/commands/ps.js.map +1 -0
  34. package/dist/cli/commands/tag/add.d.ts.map +1 -1
  35. package/dist/cli/commands/tag/add.js +10 -11
  36. package/dist/cli/commands/tag/add.js.map +1 -1
  37. package/dist/cli/commands/tag/attach.d.ts.map +1 -1
  38. package/dist/cli/commands/tag/attach.js +10 -11
  39. package/dist/cli/commands/tag/attach.js.map +1 -1
  40. package/dist/cli/commands/tag/rename.d.ts.map +1 -1
  41. package/dist/cli/commands/tag/rename.js +10 -11
  42. package/dist/cli/commands/tag/rename.js.map +1 -1
  43. package/dist/cli/commands/task/add.js +1 -1
  44. package/dist/cli/commands/task/add.js.map +1 -1
  45. package/dist/cli/commands/task/copy.d.ts +6 -0
  46. package/dist/cli/commands/task/copy.d.ts.map +1 -0
  47. package/dist/cli/commands/task/copy.js +118 -0
  48. package/dist/cli/commands/task/copy.js.map +1 -0
  49. package/dist/cli/commands/task/list.d.ts.map +1 -1
  50. package/dist/cli/commands/task/list.js +37 -17
  51. package/dist/cli/commands/task/list.js.map +1 -1
  52. package/dist/cli/commands/task/update-parent.d.ts.map +1 -1
  53. package/dist/cli/commands/task/update-parent.js +10 -11
  54. package/dist/cli/commands/task/update-parent.js.map +1 -1
  55. package/dist/cli/index.js +6 -0
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/cli/utils/board-daemon.d.ts +7 -0
  58. package/dist/cli/utils/board-daemon.d.ts.map +1 -0
  59. package/dist/cli/utils/board-daemon.js +83 -0
  60. package/dist/cli/utils/board-daemon.js.map +1 -0
  61. package/dist/db/adapters/sqlite-storage-backend.d.ts +27 -0
  62. package/dist/db/adapters/sqlite-storage-backend.d.ts.map +1 -0
  63. package/dist/db/adapters/sqlite-storage-backend.js +498 -0
  64. package/dist/db/adapters/sqlite-storage-backend.js.map +1 -0
  65. package/dist/db/connection.d.ts +19 -0
  66. package/dist/db/connection.d.ts.map +1 -1
  67. package/dist/db/connection.js +37 -2
  68. package/dist/db/connection.js.map +1 -1
  69. package/dist/db/migrations/20260328000000_initial_schema.d.ts +3 -0
  70. package/dist/db/migrations/20260328000000_initial_schema.d.ts.map +1 -0
  71. package/dist/db/migrations/20260328000000_initial_schema.js +218 -0
  72. package/dist/db/migrations/20260328000000_initial_schema.js.map +1 -0
  73. package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts +3 -0
  74. package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts.map +1 -0
  75. package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js +7 -0
  76. package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js.map +1 -0
  77. package/dist/db/migrations/index.d.ts +4 -0
  78. package/dist/db/migrations/index.d.ts.map +1 -0
  79. package/dist/db/migrations/index.js +18 -0
  80. package/dist/db/migrations/index.js.map +1 -0
  81. package/dist/db/migrations/types.d.ts +17 -0
  82. package/dist/db/migrations/types.d.ts.map +1 -0
  83. package/dist/{board/client → db/migrations}/types.js +0 -1
  84. package/dist/db/migrations/types.js.map +1 -0
  85. package/dist/db/reset.d.ts.map +1 -1
  86. package/dist/db/reset.js +8 -3
  87. package/dist/db/reset.js.map +1 -1
  88. package/dist/db/schema.d.ts +4 -4
  89. package/dist/db/schema.d.ts.map +1 -1
  90. package/dist/db/schema.js +22 -207
  91. package/dist/db/schema.js.map +1 -1
  92. package/dist/db/types/repository.d.ts +226 -0
  93. package/dist/db/types/repository.d.ts.map +1 -0
  94. package/dist/db/types/repository.js +15 -0
  95. package/dist/db/types/repository.js.map +1 -0
  96. package/dist/errors.d.ts +27 -0
  97. package/dist/errors.d.ts.map +1 -0
  98. package/dist/errors.js +51 -0
  99. package/dist/errors.js.map +1 -0
  100. package/dist/models/Task.d.ts +2 -0
  101. package/dist/models/Task.d.ts.map +1 -1
  102. package/dist/services/ClaudeProcessService.d.ts +100 -0
  103. package/dist/services/ClaudeProcessService.d.ts.map +1 -0
  104. package/dist/services/ClaudeProcessService.js +279 -0
  105. package/dist/services/ClaudeProcessService.js.map +1 -0
  106. package/dist/services/CommentService.d.ts +3 -3
  107. package/dist/services/CommentService.d.ts.map +1 -1
  108. package/dist/services/CommentService.js +13 -72
  109. package/dist/services/CommentService.js.map +1 -1
  110. package/dist/services/ExportImportService.d.ts +3 -3
  111. package/dist/services/ExportImportService.d.ts.map +1 -1
  112. package/dist/services/ExportImportService.js +29 -31
  113. package/dist/services/ExportImportService.js.map +1 -1
  114. package/dist/services/MetadataService.d.ts +3 -3
  115. package/dist/services/MetadataService.d.ts.map +1 -1
  116. package/dist/services/MetadataService.js +9 -69
  117. package/dist/services/MetadataService.js.map +1 -1
  118. package/dist/services/ProcessService.d.ts +54 -0
  119. package/dist/services/ProcessService.d.ts.map +1 -0
  120. package/dist/services/ProcessService.js +147 -0
  121. package/dist/services/ProcessService.js.map +1 -0
  122. package/dist/services/TagService.d.ts +3 -3
  123. package/dist/services/TagService.d.ts.map +1 -1
  124. package/dist/services/TagService.js +16 -41
  125. package/dist/services/TagService.js.map +1 -1
  126. package/dist/services/TaskBlockService.d.ts +3 -3
  127. package/dist/services/TaskBlockService.d.ts.map +1 -1
  128. package/dist/services/TaskBlockService.js +14 -40
  129. package/dist/services/TaskBlockService.js.map +1 -1
  130. package/dist/services/TaskService.d.ts +5 -23
  131. package/dist/services/TaskService.d.ts.map +1 -1
  132. package/dist/services/TaskService.js +57 -191
  133. package/dist/services/TaskService.js.map +1 -1
  134. package/dist/services/TaskTagService.d.ts +3 -3
  135. package/dist/services/TaskTagService.d.ts.map +1 -1
  136. package/dist/services/TaskTagService.js +23 -86
  137. package/dist/services/TaskTagService.js.map +1 -1
  138. package/dist/services/TmuxService.d.ts +2 -0
  139. package/dist/services/TmuxService.d.ts.map +1 -0
  140. package/dist/services/TmuxService.js +7 -0
  141. package/dist/services/TmuxService.js.map +1 -0
  142. package/dist/services/index.d.ts +2 -0
  143. package/dist/services/index.d.ts.map +1 -1
  144. package/dist/services/index.js +3 -1
  145. package/dist/services/index.js.map +1 -1
  146. package/dist/utils/logger.d.ts +7 -0
  147. package/dist/utils/logger.d.ts.map +1 -0
  148. package/dist/utils/logger.js +18 -0
  149. package/dist/utils/logger.js.map +1 -0
  150. package/package.json +12 -5
  151. package/dist/board/client/addTaskModal.d.ts +0 -2
  152. package/dist/board/client/addTaskModal.d.ts.map +0 -1
  153. package/dist/board/client/addTaskModal.js +0 -64
  154. package/dist/board/client/addTaskModal.js.map +0 -1
  155. package/dist/board/client/autoScroll.d.ts +0 -4
  156. package/dist/board/client/autoScroll.d.ts.map +0 -1
  157. package/dist/board/client/autoScroll.js +0 -59
  158. package/dist/board/client/autoScroll.js.map +0 -1
  159. package/dist/board/client/boardPolling.d.ts +0 -15
  160. package/dist/board/client/boardPolling.d.ts.map +0 -1
  161. package/dist/board/client/boardPolling.js +0 -144
  162. package/dist/board/client/boardPolling.js.map +0 -1
  163. package/dist/board/client/burgerMenu.d.ts +0 -2
  164. package/dist/board/client/burgerMenu.d.ts.map +0 -1
  165. package/dist/board/client/burgerMenu.js +0 -80
  166. package/dist/board/client/burgerMenu.js.map +0 -1
  167. package/dist/board/client/contextMenu.d.ts +0 -2
  168. package/dist/board/client/contextMenu.d.ts.map +0 -1
  169. package/dist/board/client/contextMenu.js +0 -52
  170. package/dist/board/client/contextMenu.js.map +0 -1
  171. package/dist/board/client/detailPanel.d.ts +0 -8
  172. package/dist/board/client/detailPanel.d.ts.map +0 -1
  173. package/dist/board/client/detailPanel.js +0 -565
  174. package/dist/board/client/detailPanel.js.map +0 -1
  175. package/dist/board/client/dragDrop.d.ts +0 -6
  176. package/dist/board/client/dragDrop.d.ts.map +0 -1
  177. package/dist/board/client/dragDrop.js +0 -82
  178. package/dist/board/client/dragDrop.js.map +0 -1
  179. package/dist/board/client/filters.d.ts +0 -6
  180. package/dist/board/client/filters.d.ts.map +0 -1
  181. package/dist/board/client/filters.js +0 -167
  182. package/dist/board/client/filters.js.map +0 -1
  183. package/dist/board/client/main.d.ts +0 -2
  184. package/dist/board/client/main.d.ts.map +0 -1
  185. package/dist/board/client/main.js +0 -20
  186. package/dist/board/client/main.js.map +0 -1
  187. package/dist/board/client/tags.d.ts +0 -6
  188. package/dist/board/client/tags.d.ts.map +0 -1
  189. package/dist/board/client/tags.js +0 -198
  190. package/dist/board/client/tags.js.map +0 -1
  191. package/dist/board/client/types.d.ts +0 -48
  192. package/dist/board/client/types.d.ts.map +0 -1
  193. package/dist/board/client/types.js.map +0 -1
  194. package/dist/board/client/utils.d.ts +0 -4
  195. package/dist/board/client/utils.d.ts.map +0 -1
  196. package/dist/board/client/utils.js +0 -44
  197. package/dist/board/client/utils.js.map +0 -1
package/dist/db/schema.js CHANGED
@@ -1,219 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runMigrations = runMigrations;
4
+ const index_1 = require("./migrations/index");
4
5
  /**
5
6
  * Create database schema and run migrations
6
7
  *
7
- * Note: This function receives a raw better-sqlite3 Database instance
8
- * because it needs to execute migrations before the StorageProvider is created.
8
+ * Note: This function receives a database instance that satisfies MigratableDatabase.
9
+ * It is called before the StorageProvider is created.
9
10
  */
10
11
  function runMigrations(db) {
11
- // Create tasks table
12
12
  db.exec(`
13
- CREATE TABLE IF NOT EXISTS tasks (
14
- id INTEGER PRIMARY KEY AUTOINCREMENT,
15
- title TEXT NOT NULL,
16
- body TEXT,
17
- author TEXT,
18
- status TEXT NOT NULL DEFAULT 'backlog' CHECK(status IN ('icebox', 'backlog', 'ready', 'in_progress', 'review', 'done', 'closed')),
19
- created_at TEXT NOT NULL,
20
- updated_at TEXT NOT NULL
21
- );
22
- `);
23
- // Create index on tasks table
24
- db.exec(`
25
- CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
26
- `);
27
- db.exec(`
28
- CREATE INDEX IF NOT EXISTS idx_tasks_author ON tasks(author);
29
- `);
30
- // Migrate tasks table to add 'review' status to CHECK constraint
31
- const taskTableDef = db.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='tasks'`).get();
32
- if (taskTableDef && !taskTableDef.sql.includes("'review'")) {
33
- db.exec(`
34
- CREATE TABLE tasks_new (
35
- id INTEGER PRIMARY KEY AUTOINCREMENT,
36
- title TEXT NOT NULL,
37
- body TEXT,
38
- author TEXT,
39
- status TEXT NOT NULL DEFAULT 'backlog' CHECK(status IN ('icebox', 'backlog', 'ready', 'in_progress', 'review', 'done', 'closed')),
40
- created_at TEXT NOT NULL,
41
- updated_at TEXT NOT NULL,
42
- parent_id INTEGER DEFAULT NULL REFERENCES tasks_new(id) ON DELETE SET NULL
43
- );
44
- `);
45
- db.exec(`INSERT INTO tasks_new SELECT id, title, body, author, status, created_at, updated_at, parent_id FROM tasks`);
46
- db.exec(`DROP TABLE tasks`);
47
- db.exec(`ALTER TABLE tasks_new RENAME TO tasks`);
48
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)`);
49
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_author ON tasks(author)`);
50
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_parent_id ON tasks(parent_id)`);
51
- }
52
- // Migrate tasks table to add 'icebox' status to CHECK constraint
53
- const taskTableDefForIcebox = db
54
- .prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='tasks'`)
55
- .get();
56
- if (taskTableDefForIcebox && !taskTableDefForIcebox.sql.includes("'icebox'")) {
57
- db.exec(`
58
- CREATE TABLE tasks_new (
59
- id INTEGER PRIMARY KEY AUTOINCREMENT,
60
- title TEXT NOT NULL,
61
- body TEXT,
62
- author TEXT,
63
- status TEXT NOT NULL DEFAULT 'backlog' CHECK(status IN ('icebox', 'backlog', 'ready', 'in_progress', 'review', 'done', 'closed')),
64
- created_at TEXT NOT NULL,
65
- updated_at TEXT NOT NULL,
66
- parent_id INTEGER DEFAULT NULL REFERENCES tasks_new(id) ON DELETE SET NULL
67
- );
68
- `);
69
- db.exec(`INSERT INTO tasks_new SELECT id, title, body, author, status, created_at, updated_at, parent_id FROM tasks`);
70
- db.exec(`DROP TABLE tasks`);
71
- db.exec(`ALTER TABLE tasks_new RENAME TO tasks`);
72
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)`);
73
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_author ON tasks(author)`);
74
- db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_parent_id ON tasks(parent_id)`);
75
- }
76
- // Add parent_id column to tasks table (migration)
77
- const columnExists = db
78
- .prepare(`
79
- SELECT COUNT(*) as count FROM pragma_table_info('tasks')
80
- WHERE name = 'parent_id'
81
- `)
82
- .get();
83
- if (columnExists.count === 0) {
84
- db.exec(`
85
- ALTER TABLE tasks ADD COLUMN parent_id INTEGER DEFAULT NULL
86
- REFERENCES tasks(id) ON DELETE SET NULL
87
- `);
88
- db.exec(`
89
- CREATE INDEX IF NOT EXISTS idx_tasks_parent_id ON tasks(parent_id)
90
- `);
91
- }
92
- // Add assignees column to tasks table (migration)
93
- const assigneesColumnExists = db
94
- .prepare(`
95
- SELECT COUNT(*) as count FROM pragma_table_info('tasks')
96
- WHERE name = 'assignees'
97
- `)
98
- .get();
99
- if (assigneesColumnExists.count === 0) {
100
- db.exec(`
101
- ALTER TABLE tasks ADD COLUMN assignees TEXT DEFAULT NULL
102
- `);
103
- }
104
- // Create task_blocks table
105
- db.exec(`
106
- CREATE TABLE IF NOT EXISTS task_blocks (
107
- id INTEGER PRIMARY KEY AUTOINCREMENT,
108
- blocker_task_id INTEGER NOT NULL,
109
- blocked_task_id INTEGER NOT NULL,
110
- created_at TEXT NOT NULL,
111
- FOREIGN KEY (blocker_task_id) REFERENCES tasks(id) ON DELETE CASCADE,
112
- FOREIGN KEY (blocked_task_id) REFERENCES tasks(id) ON DELETE CASCADE,
113
- UNIQUE(blocker_task_id, blocked_task_id),
114
- CHECK(blocker_task_id != blocked_task_id)
115
- );
116
- `);
117
- // Create index on task_blocks table
118
- db.exec(`
119
- CREATE INDEX IF NOT EXISTS idx_task_blocks_blocker ON task_blocks(blocker_task_id);
120
- `);
121
- db.exec(`
122
- CREATE INDEX IF NOT EXISTS idx_task_blocks_blocked ON task_blocks(blocked_task_id);
123
- `);
124
- // Create tags table
125
- db.exec(`
126
- CREATE TABLE IF NOT EXISTS tags (
127
- id INTEGER PRIMARY KEY AUTOINCREMENT,
128
- name TEXT NOT NULL UNIQUE,
129
- created_at TEXT NOT NULL
130
- );
131
- `);
132
- // Create index on tags table
133
- db.exec(`
134
- CREATE UNIQUE INDEX IF NOT EXISTS idx_tags_name ON tags(name);
135
- `);
136
- // Create task_tags table
137
- db.exec(`
138
- CREATE TABLE IF NOT EXISTS task_tags (
139
- id INTEGER PRIMARY KEY AUTOINCREMENT,
140
- task_id INTEGER NOT NULL,
141
- tag_id INTEGER NOT NULL,
142
- created_at TEXT NOT NULL,
143
- FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
144
- FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE,
145
- UNIQUE(task_id, tag_id)
146
- );
147
- `);
148
- // Create index on task_tags table
149
- db.exec(`
150
- CREATE INDEX IF NOT EXISTS idx_task_tags_task_id ON task_tags(task_id);
151
- `);
152
- db.exec(`
153
- CREATE INDEX IF NOT EXISTS idx_task_tags_tag_id ON task_tags(tag_id);
154
- `);
155
- // Create task_metadata table
156
- db.exec(`
157
- CREATE TABLE IF NOT EXISTS task_metadata (
158
- id INTEGER PRIMARY KEY AUTOINCREMENT,
159
- task_id INTEGER NOT NULL,
160
- key TEXT NOT NULL,
161
- value TEXT NOT NULL,
162
- created_at TEXT NOT NULL,
163
- updated_at TEXT NOT NULL,
164
- FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
165
- UNIQUE(task_id, key)
166
- );
167
- `);
168
- // Create index on task_metadata table
169
- db.exec(`
170
- CREATE INDEX IF NOT EXISTS idx_task_metadata_task_id ON task_metadata(task_id);
171
- `);
172
- // Create task_comments table
173
- db.exec(`
174
- CREATE TABLE IF NOT EXISTS task_comments (
175
- id INTEGER PRIMARY KEY AUTOINCREMENT,
176
- task_id INTEGER NOT NULL,
177
- author TEXT,
178
- content TEXT NOT NULL,
179
- created_at TEXT NOT NULL,
180
- updated_at TEXT NOT NULL,
181
- FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
182
- );
183
- `);
184
- // Create index on task_comments table
185
- db.exec(`
186
- CREATE INDEX IF NOT EXISTS idx_task_comments_task_id ON task_comments(task_id);
187
- `);
188
- db.exec(`
189
- CREATE INDEX IF NOT EXISTS idx_task_comments_created_at ON task_comments(created_at);
190
- `);
191
- // Add priority column to tasks table (migration)
192
- const priorityColumnExists = db
193
- .prepare(`
194
- SELECT COUNT(*) as count FROM pragma_table_info('tasks')
195
- WHERE name = 'priority'
196
- `)
197
- .get();
198
- if (priorityColumnExists.count === 0) {
199
- db.exec(`
200
- ALTER TABLE tasks ADD COLUMN priority TEXT DEFAULT NULL
201
- CHECK(priority IS NULL OR priority IN ('critical', 'high', 'medium', 'low'))
202
- `);
203
- }
204
- // Migrate priority from task_metadata to tasks.priority
205
- const priorityMetadata = db
206
- .prepare(`SELECT task_id, value FROM task_metadata WHERE key = 'priority'`)
207
- .all();
208
- if (priorityMetadata.length > 0) {
209
- const updateStmt = db.prepare(`UPDATE tasks SET priority = ? WHERE id = ? AND priority IS NULL`);
210
- const deleteStmt = db.prepare(`DELETE FROM task_metadata WHERE task_id = ? AND key = 'priority'`);
211
- for (const row of priorityMetadata) {
212
- const validPriorities = ['critical', 'high', 'medium', 'low'];
213
- if (validPriorities.includes(row.value)) {
214
- updateStmt.run(row.value, row.task_id);
215
- }
216
- deleteStmt.run(row.task_id);
13
+ CREATE TABLE IF NOT EXISTS schema_migrations (
14
+ version TEXT PRIMARY KEY,
15
+ applied_at TEXT NOT NULL
16
+ )
17
+ `);
18
+ const appliedRows = db.prepare(`SELECT version FROM schema_migrations`).all();
19
+ const appliedSet = new Set(appliedRows.map((r) => r.version));
20
+ const pending = index_1.migrations
21
+ .filter((m) => !appliedSet.has(m.version))
22
+ .sort((a, b) => a.version.localeCompare(b.version));
23
+ for (const migration of pending) {
24
+ try {
25
+ db.transaction(() => {
26
+ migration.up(db);
27
+ db.prepare(`INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)`).run(migration.version, new Date().toISOString());
28
+ })();
29
+ }
30
+ catch (err) {
31
+ throw new Error(`Migration ${migration.version} failed: ${err instanceof Error ? err.message : String(err)}`);
217
32
  }
218
33
  }
219
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":";;AASA,sCA4BC;AApCD,8CAAgD;AAEhD;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,EAAsB;IAClD,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAgC,CAAC;IAC5G,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,kBAAU;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAClB,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjB,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CACjF,SAAS,CAAC,OAAO,EACjB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CACzB,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,CAAC,OAAO,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Repository Interface Definitions
3
+ *
4
+ * Defines entity-specific repository interfaces as part of the Repository pattern.
5
+ * Each repository encapsulates data access logic for a specific entity.
6
+ * StorageBackend is the collection of all repositories.
7
+ *
8
+ * ## Design Pattern: Repository Pattern
9
+ * - Thin repositories: data access / SQL only
10
+ * - Business logic remains in the service layer
11
+ * - Sync implementation (async can be reconsidered when non-SQL backends are added)
12
+ */
13
+ import type { Task, CreateTaskInput, UpdateTaskInput, TaskStatus, Tag, CreateTagInput, UpdateTagInput, TaskBlock, CreateTaskBlockInput, TaskTag, CreateTaskTagInput, TaskMetadata, CreateTaskMetadataInput, TaskComment, CreateTaskCommentInput } from '../../models';
14
+ import type { Priority } from '../../models/Priority';
15
+ /** Filter options for task listing */
16
+ export interface TaskFilter {
17
+ status?: TaskStatus | TaskStatus[];
18
+ author?: string;
19
+ assignees?: string;
20
+ tagIds?: number[];
21
+ priority?: Priority | Priority[];
22
+ search?: string;
23
+ }
24
+ /** Sort options for task listing */
25
+ export interface TaskSortOptions {
26
+ field: 'id' | 'title' | 'status' | 'created_at' | 'updated_at' | 'priority';
27
+ order: 'asc' | 'desc';
28
+ }
29
+ /**
30
+ * Repository for Task entity data access
31
+ */
32
+ export interface TaskRepository {
33
+ /** Find a task by its ID */
34
+ findById(id: number): Task | null;
35
+ /** Find all tasks matching the filter, with optional sort */
36
+ findAll(filter?: TaskFilter, sort?: TaskSortOptions): Task[];
37
+ /** Create a new task */
38
+ create(input: CreateTaskInput & {
39
+ status: TaskStatus;
40
+ created_at: string;
41
+ updated_at: string;
42
+ }): Task;
43
+ /** Update fields of an existing task */
44
+ update(id: number, input: Partial<UpdateTaskInput & {
45
+ updated_at: string;
46
+ }>): Task | null;
47
+ /** Delete a task by ID */
48
+ delete(id: number): boolean;
49
+ /** Find direct child tasks */
50
+ findChildren(parentId: number): Task[];
51
+ /** Count tasks grouped by status */
52
+ countByStatus(): Record<TaskStatus, number>;
53
+ /** Find tasks updated before a given date with specific statuses */
54
+ findForPurge(beforeDate: string, statuses: TaskStatus[]): Task[];
55
+ /** Delete multiple tasks by IDs */
56
+ deleteMany(ids: number[]): number;
57
+ }
58
+ /**
59
+ * Repository for Tag entity data access
60
+ */
61
+ export interface TagRepository {
62
+ /** Find a tag by its ID */
63
+ findById(id: number): Tag | null;
64
+ /** Find a tag by its name */
65
+ findByName(name: string): Tag | null;
66
+ /** Find all tags */
67
+ findAll(): Tag[];
68
+ /** Create a new tag */
69
+ create(input: CreateTagInput & {
70
+ created_at: string;
71
+ }): Tag;
72
+ /** Update a tag */
73
+ update(id: number, input: UpdateTagInput): Tag | null;
74
+ /** Delete a tag by ID */
75
+ delete(id: number): boolean;
76
+ }
77
+ /**
78
+ * Repository for TaskBlock (blocking relationships) data access
79
+ */
80
+ export interface TaskBlockRepository {
81
+ /** Create a new block relationship */
82
+ create(input: CreateTaskBlockInput & {
83
+ created_at: string;
84
+ }): TaskBlock;
85
+ /** Remove a block relationship */
86
+ delete(blockerId: number, blockedId: number): boolean;
87
+ /** Get all task IDs blocked by a given task */
88
+ findBlockedTaskIds(blockerId: number): number[];
89
+ /** Get all task IDs that block a given task */
90
+ findBlockerTaskIds(blockedId: number): number[];
91
+ /** Get all block relationships */
92
+ findAll(): Array<{
93
+ blocker_task_id: number;
94
+ blocked_task_id: number;
95
+ }>;
96
+ }
97
+ /**
98
+ * Repository for TaskTag (task-tag associations) data access
99
+ */
100
+ export interface TaskTagRepository {
101
+ /** Create a task-tag association */
102
+ create(input: CreateTaskTagInput & {
103
+ created_at: string;
104
+ }): TaskTag;
105
+ /** Remove a task-tag association */
106
+ delete(taskId: number, tagId: number): boolean;
107
+ /** Check if a task has a specific tag */
108
+ exists(taskId: number, tagId: number): boolean;
109
+ /** Get tag IDs for a task */
110
+ findTagIdsByTaskId(taskId: number): number[];
111
+ /** Get tags for a task */
112
+ findTagsByTaskId(taskId: number): Tag[];
113
+ /** Get task IDs for a tag */
114
+ findTaskIdsByTagId(tagId: number): number[];
115
+ /** Get tasks for a tag */
116
+ findTasksByTagId(tagId: number): Task[];
117
+ /** Get all task tags as a map (task_id -> Tag[]) */
118
+ findAllGroupedByTaskId(): Map<number, Tag[]>;
119
+ }
120
+ /**
121
+ * Repository for TaskMetadata data access
122
+ */
123
+ export interface MetadataRepository {
124
+ /** Set metadata for a task (create or update) */
125
+ set(input: CreateTaskMetadataInput & {
126
+ created_at: string;
127
+ updated_at: string;
128
+ }): TaskMetadata;
129
+ /** Get metadata by task ID and key */
130
+ findByKey(taskId: number, key: string): TaskMetadata | null;
131
+ /** List all metadata for a task */
132
+ findByTaskId(taskId: number): TaskMetadata[];
133
+ /** Delete metadata by task ID and key */
134
+ delete(taskId: number, key: string): boolean;
135
+ /** Delete all metadata for a task */
136
+ deleteAllForTask(taskId: number): number;
137
+ /** Get all metadata grouped by task ID */
138
+ findAllGroupedByTaskId(): Map<number, TaskMetadata[]>;
139
+ /** Update an existing metadata entry */
140
+ update(taskId: number, key: string, value: string, updatedAt: string): TaskMetadata | null;
141
+ }
142
+ /**
143
+ * Repository for TaskComment data access
144
+ */
145
+ export interface CommentRepository {
146
+ /** Create a new comment */
147
+ create(input: CreateTaskCommentInput & {
148
+ created_at: string;
149
+ updated_at: string;
150
+ }): TaskComment;
151
+ /** Find a comment by ID */
152
+ findById(id: number): TaskComment | null;
153
+ /** List comments for a task */
154
+ findByTaskId(taskId: number): TaskComment[];
155
+ /** Delete a comment by ID */
156
+ delete(id: number): boolean;
157
+ /** Delete all comments for a task */
158
+ deleteAllForTask(taskId: number): number;
159
+ /** Update comment content */
160
+ update(id: number, content: string, updatedAt: string): TaskComment | null;
161
+ /** Get all comments for multiple tasks */
162
+ findByTaskIds(taskIds: number[]): Map<number, TaskComment[]>;
163
+ /** Update comment timestamps (used during import) */
164
+ updateTimestamps(id: number, createdAt: string, updatedAt: string): void;
165
+ }
166
+ /**
167
+ * Raw DB row shape for task_run_logs table
168
+ */
169
+ export interface RunLogRow {
170
+ id: number;
171
+ task_id: number;
172
+ started_at: string;
173
+ finished_at: string | null;
174
+ exit_code: number | null;
175
+ session_id: string | null;
176
+ events: string;
177
+ }
178
+ /**
179
+ * Repository for task run log data access
180
+ */
181
+ export interface RunLogRepository {
182
+ /** Create a new run log entry and return its ID */
183
+ create(taskId: number, startedAt: string): number;
184
+ /** Update a run log with final status (on process close or error) */
185
+ updateFinished(id: number, finishedAt: string, exitCode: number, events: string): void;
186
+ /** Update the session_id of a run log */
187
+ updateSessionId(id: number, sessionId: string): void;
188
+ /** Update the events of a run log (incremental update) */
189
+ updateEvents(id: number, events: string): void;
190
+ /** Find the most recent run log for a task */
191
+ findLatestByTaskId(taskId: number): RunLogRow | null;
192
+ /** Find run logs for a task, ordered by started_at DESC, up to limit */
193
+ findByTaskId(taskId: number, limit: number): RunLogRow[];
194
+ /** Find all run log IDs for a task, ordered by started_at DESC */
195
+ findIdsByTaskId(taskId: number): number[];
196
+ /** Delete run logs by IDs */
197
+ deleteMany(ids: number[]): void;
198
+ }
199
+ /**
200
+ * StorageBackend - collection of all entity repositories
201
+ *
202
+ * This is the main interface that replaces StorageProvider for use in services.
203
+ * Each service receives the specific repository it needs via constructor injection.
204
+ */
205
+ export interface StorageBackend {
206
+ tasks: TaskRepository;
207
+ tags: TagRepository;
208
+ blocks: TaskBlockRepository;
209
+ taskTags: TaskTagRepository;
210
+ metadata: MetadataRepository;
211
+ comments: CommentRepository;
212
+ runLogs: RunLogRepository;
213
+ /** Execute a function within a database transaction */
214
+ transaction<T>(fn: () => T): T;
215
+ /** Update task timestamps directly (used during import) */
216
+ updateTaskTimestamps(id: number, createdAt: string, updatedAt: string): void;
217
+ /**
218
+ * Get a signature representing the latest update across tasks, metadata, and task_tags.
219
+ * Used by the board to detect data changes for polling.
220
+ * Returns null if there is no data yet.
221
+ */
222
+ getBoardUpdatedAtSignature(): string | null;
223
+ /** Close the storage connection */
224
+ close(): void;
225
+ }
226
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/db/types/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Repository Interface Definitions
4
+ *
5
+ * Defines entity-specific repository interfaces as part of the Repository pattern.
6
+ * Each repository encapsulates data access logic for a specific entity.
7
+ * StorageBackend is the collection of all repositories.
8
+ *
9
+ * ## Design Pattern: Repository Pattern
10
+ * - Thin repositories: data access / SQL only
11
+ * - Business logic remains in the service layer
12
+ * - Sync implementation (async can be reconsidered when non-SQL backends are added)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/db/types/repository.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Base error class for all Agkan errors.
3
+ * Extend this class to create domain-specific errors that support instanceof checks.
4
+ */
5
+ export declare class AgkanError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ /**
9
+ * Thrown when a requested entity (task, tag, comment, etc.) cannot be found.
10
+ */
11
+ export declare class NotFoundError extends AgkanError {
12
+ constructor(message: string);
13
+ }
14
+ /**
15
+ * Thrown when input data fails validation (missing required fields, invalid values, etc.).
16
+ */
17
+ export declare class ValidationError extends AgkanError {
18
+ constructor(message: string);
19
+ }
20
+ /**
21
+ * Thrown when an operation conflicts with existing data
22
+ * (duplicate names, circular references, self-referencing, already-exists relationships).
23
+ */
24
+ export declare class ConflictError extends AgkanError {
25
+ constructor(message: string);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAM5B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,OAAO,EAAE,MAAM;CAK5B;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,OAAO,EAAE,MAAM;CAK5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConflictError = exports.ValidationError = exports.NotFoundError = exports.AgkanError = void 0;
4
+ /**
5
+ * Base error class for all Agkan errors.
6
+ * Extend this class to create domain-specific errors that support instanceof checks.
7
+ */
8
+ class AgkanError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = 'AgkanError';
12
+ // Restore prototype chain for correct instanceof behavior in transpiled output
13
+ Object.setPrototypeOf(this, new.target.prototype);
14
+ }
15
+ }
16
+ exports.AgkanError = AgkanError;
17
+ /**
18
+ * Thrown when a requested entity (task, tag, comment, etc.) cannot be found.
19
+ */
20
+ class NotFoundError extends AgkanError {
21
+ constructor(message) {
22
+ super(message);
23
+ this.name = 'NotFoundError';
24
+ Object.setPrototypeOf(this, new.target.prototype);
25
+ }
26
+ }
27
+ exports.NotFoundError = NotFoundError;
28
+ /**
29
+ * Thrown when input data fails validation (missing required fields, invalid values, etc.).
30
+ */
31
+ class ValidationError extends AgkanError {
32
+ constructor(message) {
33
+ super(message);
34
+ this.name = 'ValidationError';
35
+ Object.setPrototypeOf(this, new.target.prototype);
36
+ }
37
+ }
38
+ exports.ValidationError = ValidationError;
39
+ /**
40
+ * Thrown when an operation conflicts with existing data
41
+ * (duplicate names, circular references, self-referencing, already-exists relationships).
42
+ */
43
+ class ConflictError extends AgkanError {
44
+ constructor(message) {
45
+ super(message);
46
+ this.name = 'ConflictError';
47
+ Object.setPrototypeOf(this, new.target.prototype);
48
+ }
49
+ }
50
+ exports.ConflictError = ConflictError;
51
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,+EAA+E;QAC/E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAPD,gCAOC;AAED;;GAEG;AACH,MAAa,aAAc,SAAQ,UAAU;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,sCAMC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,0CAMC;AAED;;;GAGG;AACH,MAAa,aAAc,SAAQ,UAAU;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,sCAMC"}
@@ -41,6 +41,8 @@ export interface CreateTaskInput {
41
41
  status?: TaskStatus;
42
42
  priority?: Priority | null;
43
43
  parent_id?: number | null;
44
+ /** Optional tag IDs to attach atomically with task creation */
45
+ tagIds?: number[];
44
46
  }
45
47
  /**
46
48
  * Task update input type
@@ -1 +1 @@
1
- {"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/models/Task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvG;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
1
+ {"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/models/Task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvG;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}