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
@@ -0,0 +1,100 @@
1
+ import type { StorageBackend } from '../db/types/repository';
2
+ export type ClaudeStreamEvent = {
3
+ type: 'system';
4
+ subtype: string;
5
+ session_id?: string;
6
+ [key: string]: unknown;
7
+ } | {
8
+ type: 'assistant';
9
+ message: {
10
+ content: Array<{
11
+ type: 'text';
12
+ text: string;
13
+ } | {
14
+ type: 'tool_use';
15
+ id: string;
16
+ name: string;
17
+ input: Record<string, unknown>;
18
+ }>;
19
+ [key: string]: unknown;
20
+ };
21
+ [key: string]: unknown;
22
+ } | {
23
+ type: 'result';
24
+ subtype: string;
25
+ result?: string;
26
+ duration_ms?: number;
27
+ [key: string]: unknown;
28
+ } | {
29
+ type: string;
30
+ [key: string]: unknown;
31
+ };
32
+ export type OutputEvent = {
33
+ kind: 'text';
34
+ text: string;
35
+ } | {
36
+ kind: 'tool_use';
37
+ name: string;
38
+ input: Record<string, unknown>;
39
+ } | {
40
+ kind: 'done';
41
+ exitCode: number;
42
+ } | {
43
+ kind: 'error';
44
+ message: string;
45
+ };
46
+ export type SubscribeCallback = (event: OutputEvent) => void;
47
+ export interface RunLog {
48
+ id: number;
49
+ task_id: number;
50
+ started_at: string;
51
+ finished_at: string | null;
52
+ exit_code: number | null;
53
+ session_id: string | null;
54
+ events: OutputEvent[];
55
+ }
56
+ /**
57
+ * ClaudeProcessService
58
+ * Manages claude CLI processes running in stream-json mode.
59
+ * Keyed by taskId, supports start/stop/subscribe/list operations.
60
+ */
61
+ export declare class ClaudeProcessService {
62
+ private processes;
63
+ private db;
64
+ constructor(db?: StorageBackend | null);
65
+ /**
66
+ * Start a claude process for the given taskId and prompt.
67
+ * Prevents duplicate processes for the same taskId.
68
+ */
69
+ startProcess(taskId: number, prompt: string, command?: string): void;
70
+ /**
71
+ * Stop the process for the given taskId.
72
+ * Returns true if the process was found and signalled, false otherwise.
73
+ */
74
+ stopProcess(taskId: number): boolean;
75
+ /**
76
+ * List all currently running tasks with their command type.
77
+ */
78
+ listRunningTasks(): {
79
+ taskId: number;
80
+ command: string;
81
+ }[];
82
+ /**
83
+ * Subscribe to output events for a given taskId.
84
+ * If process is running: replay past events and subscribe to future events.
85
+ * If no process but DB available: replay last saved log from DB.
86
+ * Returns an unsubscribe function.
87
+ */
88
+ subscribeOutput(taskId: number, callback: SubscribeCallback): () => void;
89
+ /**
90
+ * Get the buffered output events for a taskId.
91
+ * Useful for late subscribers who missed earlier events.
92
+ */
93
+ getOutputBuffer(taskId: number): ClaudeStreamEvent[];
94
+ /**
95
+ * Get saved run logs for a task from DB (most recent first, up to 5).
96
+ */
97
+ getRunLogs(taskId: number): RunLog[];
98
+ private _notifySubscribers;
99
+ }
100
+ //# sourceMappingURL=ClaudeProcessService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProcessService.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeProcessService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeProcessService = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const logger_1 = require("../utils/logger");
6
+ const errors_1 = require("../errors");
7
+ function resolveClaudePath() {
8
+ try {
9
+ const path = (0, child_process_1.execSync)('which claude', { env: process.env }).toString().trim();
10
+ if (path)
11
+ return path;
12
+ }
13
+ catch {
14
+ // which failed, fall through
15
+ }
16
+ return 'claude';
17
+ }
18
+ const CLAUDE_BIN = resolveClaudePath();
19
+ // ---- ClaudeProcessService ----
20
+ /**
21
+ * ClaudeProcessService
22
+ * Manages claude CLI processes running in stream-json mode.
23
+ * Keyed by taskId, supports start/stop/subscribe/list operations.
24
+ */
25
+ class ClaudeProcessService {
26
+ processes = new Map();
27
+ db;
28
+ constructor(db) {
29
+ this.db = db ?? null;
30
+ }
31
+ /**
32
+ * Start a claude process for the given taskId and prompt.
33
+ * Prevents duplicate processes for the same taskId.
34
+ */
35
+ startProcess(taskId, prompt, command = 'run') {
36
+ if (this.processes.has(taskId)) {
37
+ const existing = this.processes.get(taskId);
38
+ const pid = existing.process.pid;
39
+ const killed = existing.process.killed;
40
+ const exitCode = existing.process.exitCode;
41
+ const signalCode = existing.process.signalCode;
42
+ const aliveMs = Date.now() - existing.startedAt.getTime();
43
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] startProcess DUPLICATE taskId=${taskId} existing pid=${pid} killed=${killed} exitCode=${exitCode} signalCode=${signalCode} aliveMs=${aliveMs} command=${existing.command}`);
44
+ throw new errors_1.ConflictError(`Process for taskId ${taskId} is already running`);
45
+ }
46
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] startProcess taskId=${taskId} command=${command}`);
47
+ const child = (0, child_process_1.spawn)(CLAUDE_BIN, ['--output-format', 'stream-json', '--verbose', '--dangerously-skip-permissions', '-p', prompt], {
48
+ cwd: process.cwd(),
49
+ env: process.env,
50
+ stdio: ['ignore', 'pipe', 'pipe'],
51
+ });
52
+ const info = {
53
+ taskId,
54
+ command,
55
+ process: child,
56
+ startedAt: new Date(),
57
+ status: 'running',
58
+ outputBuffer: [],
59
+ processedEvents: [],
60
+ subscribers: new Set(),
61
+ runLogId: null,
62
+ sessionId: null,
63
+ };
64
+ this.processes.set(taskId, info);
65
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process added to map taskId=${taskId} total=${this.processes.size}`);
66
+ if (this.db) {
67
+ info.runLogId = this.db.runLogs.create(info.taskId, info.startedAt.toISOString());
68
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] run log created id=${info.runLogId} taskId=${taskId}`);
69
+ }
70
+ let lineBuffer = '';
71
+ let spawnError = false;
72
+ child.on('error', (err) => {
73
+ spawnError = true;
74
+ const message = err.code === 'ENOENT' ? 'claude CLI not found in PATH' : err.message;
75
+ console.error(`[ClaudeProcessService] spawn error for taskId=${taskId}: ${message}`, err);
76
+ const errorEvent = { kind: 'error', message };
77
+ info.processedEvents.push(errorEvent);
78
+ info.subscribers.forEach((cb) => cb(errorEvent));
79
+ const doneEvent = { kind: 'done', exitCode: 1 };
80
+ info.subscribers.forEach((cb) => cb(doneEvent));
81
+ if (this.db && info.runLogId) {
82
+ const finishedAt = new Date().toISOString();
83
+ this.db.runLogs.updateFinished(info.runLogId, finishedAt, 1, JSON.stringify(info.processedEvents));
84
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] run log updated (error) id=${info.runLogId} taskId=${taskId}`);
85
+ }
86
+ if (this.processes.get(taskId) === info) {
87
+ this.processes.delete(taskId);
88
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (error) taskId=${taskId} total=${this.processes.size}`);
89
+ }
90
+ else {
91
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process error skipped map delete (stale entry) taskId=${taskId}`);
92
+ }
93
+ });
94
+ child.stdout?.on('data', (chunk) => {
95
+ lineBuffer += chunk.toString();
96
+ const lines = lineBuffer.split('\n');
97
+ // Keep the last (potentially incomplete) line in the buffer
98
+ lineBuffer = lines.pop() ?? '';
99
+ for (const line of lines) {
100
+ const trimmed = line.trim();
101
+ if (!trimmed)
102
+ continue;
103
+ let parsed;
104
+ try {
105
+ parsed = JSON.parse(trimmed);
106
+ }
107
+ catch {
108
+ // Skip non-JSON lines
109
+ continue;
110
+ }
111
+ info.outputBuffer.push(parsed);
112
+ this._notifySubscribers(info, parsed);
113
+ }
114
+ });
115
+ let stderrBuffer = '';
116
+ child.stderr?.on('data', (chunk) => {
117
+ stderrBuffer += chunk.toString();
118
+ });
119
+ child.on('close', (code) => {
120
+ if (spawnError)
121
+ return;
122
+ // Process any remaining buffered line
123
+ const remaining = lineBuffer.trim();
124
+ if (remaining) {
125
+ try {
126
+ const parsed = JSON.parse(remaining);
127
+ info.outputBuffer.push(parsed);
128
+ this._notifySubscribers(info, parsed);
129
+ }
130
+ catch {
131
+ // Ignore
132
+ }
133
+ }
134
+ if (stderrBuffer) {
135
+ console.error(`[ClaudeProcessService] stderr for taskId=${taskId}:\n${stderrBuffer}`);
136
+ const errorEvent = { kind: 'error', message: stderrBuffer };
137
+ info.processedEvents.push(errorEvent);
138
+ info.subscribers.forEach((cb) => cb(errorEvent));
139
+ }
140
+ const exitCode = code ?? 0;
141
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process close taskId=${taskId} exitCode=${exitCode}`);
142
+ if (exitCode !== 0) {
143
+ console.error(`[ClaudeProcessService] process exited with code ${exitCode} for taskId=${taskId}`);
144
+ }
145
+ const doneEvent = { kind: 'done', exitCode };
146
+ info.subscribers.forEach((cb) => cb(doneEvent));
147
+ // Finalize log in DB before removing process
148
+ if (this.db && info.runLogId) {
149
+ const finishedAt = new Date().toISOString();
150
+ this.db.runLogs.updateFinished(info.runLogId, finishedAt, exitCode, JSON.stringify(info.processedEvents));
151
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] run log finalized id=${info.runLogId} taskId=${taskId} exitCode=${exitCode}`);
152
+ // Rotate: keep only latest 5 per task
153
+ const ids = this.db.runLogs.findIdsByTaskId(info.taskId);
154
+ if (ids.length > 5) {
155
+ const toDelete = ids.slice(5);
156
+ this.db.runLogs.deleteMany(toDelete);
157
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] rotated run logs taskId=${taskId} deleted=${toDelete.length}`);
158
+ }
159
+ }
160
+ if (this.processes.get(taskId) === info) {
161
+ this.processes.delete(taskId);
162
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (close) taskId=${taskId} total=${this.processes.size}`);
163
+ }
164
+ else {
165
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process close skipped map delete (stale entry) taskId=${taskId}`);
166
+ }
167
+ });
168
+ }
169
+ /**
170
+ * Stop the process for the given taskId.
171
+ * Returns true if the process was found and signalled, false otherwise.
172
+ */
173
+ stopProcess(taskId) {
174
+ const info = this.processes.get(taskId);
175
+ if (!info) {
176
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] stopProcess taskId=${taskId} not found`);
177
+ return false;
178
+ }
179
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] stopProcess taskId=${taskId} sending SIGTERM`);
180
+ info.process.kill('SIGTERM');
181
+ this.processes.delete(taskId);
182
+ (0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (stop) taskId=${taskId} total=${this.processes.size}`);
183
+ return true;
184
+ }
185
+ /**
186
+ * List all currently running tasks with their command type.
187
+ */
188
+ listRunningTasks() {
189
+ return Array.from(this.processes.values()).map((info) => ({ taskId: info.taskId, command: info.command }));
190
+ }
191
+ /**
192
+ * Subscribe to output events for a given taskId.
193
+ * If process is running: replay past events and subscribe to future events.
194
+ * If no process but DB available: replay last saved log from DB.
195
+ * Returns an unsubscribe function.
196
+ */
197
+ subscribeOutput(taskId, callback) {
198
+ const info = this.processes.get(taskId);
199
+ if (!info) {
200
+ // Try to replay from DB
201
+ if (this.db) {
202
+ const row = this.db.runLogs.findLatestByTaskId(taskId);
203
+ if (row) {
204
+ const events = JSON.parse(row.events);
205
+ events.forEach((evt) => callback(evt));
206
+ callback({ kind: 'done', exitCode: row.exit_code ?? 0 });
207
+ return () => { };
208
+ }
209
+ }
210
+ // No process and no log found — emit error
211
+ callback({ kind: 'error', message: `No running process for taskId ${taskId}` });
212
+ return () => { };
213
+ }
214
+ // Replay past events to the new subscriber before registering
215
+ info.processedEvents.forEach((evt) => callback(evt));
216
+ info.subscribers.add(callback);
217
+ return () => {
218
+ info.subscribers.delete(callback);
219
+ };
220
+ }
221
+ /**
222
+ * Get the buffered output events for a taskId.
223
+ * Useful for late subscribers who missed earlier events.
224
+ */
225
+ getOutputBuffer(taskId) {
226
+ return this.processes.get(taskId)?.outputBuffer ?? [];
227
+ }
228
+ /**
229
+ * Get saved run logs for a task from DB (most recent first, up to 5).
230
+ */
231
+ getRunLogs(taskId) {
232
+ if (!this.db)
233
+ return [];
234
+ const rows = this.db.runLogs.findByTaskId(taskId, 5);
235
+ return rows.map((r) => ({
236
+ id: r.id,
237
+ task_id: r.task_id,
238
+ started_at: r.started_at,
239
+ finished_at: r.finished_at,
240
+ exit_code: r.exit_code,
241
+ session_id: r.session_id,
242
+ events: JSON.parse(r.events),
243
+ }));
244
+ }
245
+ // ---- Private helpers ----
246
+ _notifySubscribers(info, event) {
247
+ if (event.type === 'system' && event.session_id && !info.sessionId) {
248
+ info.sessionId = event.session_id;
249
+ if (this.db && info.runLogId) {
250
+ this.db.runLogs.updateSessionId(info.runLogId, info.sessionId);
251
+ }
252
+ }
253
+ if (event.type === 'assistant') {
254
+ const assistantEvent = event;
255
+ let added = false;
256
+ for (const content of assistantEvent.message.content) {
257
+ if (content.type === 'text') {
258
+ const outputEvent = { kind: 'text', text: content.text };
259
+ info.processedEvents.push(outputEvent);
260
+ info.subscribers.forEach((cb) => cb(outputEvent));
261
+ added = true;
262
+ }
263
+ else if (content.type === 'tool_use') {
264
+ const outputEvent = { kind: 'tool_use', name: content.name, input: content.input };
265
+ info.processedEvents.push(outputEvent);
266
+ info.subscribers.forEach((cb) => cb(outputEvent));
267
+ added = true;
268
+ }
269
+ }
270
+ if (added && this.db && info.runLogId) {
271
+ this.db.runLogs.updateEvents(info.runLogId, JSON.stringify(info.processedEvents));
272
+ }
273
+ }
274
+ // 'result' and 'system' events are buffered but not forwarded as OutputEvents
275
+ // (done/error are sent on process close)
276
+ }
277
+ }
278
+ exports.ClaudeProcessService = ClaudeProcessService;
279
+ //# sourceMappingURL=ClaudeProcessService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProcessService.js","sourceRoot":"","sources":["../../src/services/ClaudeProcessService.ts"],"names":[],"mappings":";;;AAAA,iDAA8D;AAG9D,4CAA6C;AAC7C,sCAA0C;AAE1C,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAC9E,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;AAmDvC,iCAAiC;AAEjC;;;;GAIG;AACH,MAAa,oBAAoB;IACvB,SAAS,GAA6B,IAAI,GAAG,EAAE,CAAC;IAChD,EAAE,CAAwB;IAElC,YAAY,EAA0B;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,UAAkB,KAAK;QAClE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAA,mBAAU,EACR,wDAAwD,MAAM,iBAAiB,GAAG,WAAW,MAAM,aAAa,QAAQ,eAAe,UAAU,YAAY,OAAO,YAAY,QAAQ,CAAC,OAAO,EAAE,CACnM,CAAC;YACF,MAAM,IAAI,sBAAa,CAAC,sBAAsB,MAAM,qBAAqB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAA,mBAAU,EAAC,8CAA8C,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QAEtF,MAAM,KAAK,GAAG,IAAA,qBAAK,EACjB,UAAU,EACV,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,MAAM,CAAC,EAC/F;YACE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CACF,CAAC;QAEF,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO;YACP,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,WAAW,EAAE,IAAI,GAAG,EAAE;YACtB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjC,IAAA,mBAAU,EAAC,sDAAsD,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAClF,IAAA,mBAAU,EAAC,6CAA6C,IAAI,CAAC,QAAQ,WAAW,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,iDAAiD,MAAM,KAAK,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1F,MAAM,UAAU,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAC3D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAEjD,MAAM,SAAS,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACnG,IAAA,mBAAU,EAAC,qDAAqD,IAAI,CAAC,QAAQ,WAAW,MAAM,EAAE,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAA,mBAAU,EACR,kEAAkE,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CACxG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAA,mBAAU,EAAC,gFAAgF,MAAM,EAAE,CAAC,CAAC;YACvG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,4DAA4D;YAC5D,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,IAAI,MAAyB,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;gBACpD,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;oBACtB,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,UAAU;gBAAE,OAAO;YACvB,sCAAsC;YACtC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAsB,CAAC;oBAC1D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,4CAA4C,MAAM,MAAM,YAAY,EAAE,CAAC,CAAC;gBACtF,MAAM,UAAU,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;gBACzE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;YAC3B,IAAA,mBAAU,EAAC,+CAA+C,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAC;YACzF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,mDAAmD,QAAQ,eAAe,MAAM,EAAE,CAAC,CAAC;YACpG,CAAC;YACD,MAAM,SAAS,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAEhD,6CAA6C;YAC7C,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC1G,IAAA,mBAAU,EACR,+CAA+C,IAAI,CAAC,QAAQ,WAAW,MAAM,aAAa,QAAQ,EAAE,CACrG,CAAC;gBACF,sCAAsC;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACrC,IAAA,mBAAU,EAAC,kDAAkD,MAAM,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAA,mBAAU,EACR,kEAAkE,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CACxG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAA,mBAAU,EAAC,gFAAgF,MAAM,EAAE,CAAC,CAAC;YACvG,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAc;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAA,mBAAU,EAAC,6CAA6C,MAAM,YAAY,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAA,mBAAU,EAAC,6CAA6C,MAAM,kBAAkB,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAA,mBAAU,EAAC,iEAAiE,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACnH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7G,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,MAAc,EAAE,QAA2B;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,wBAAwB;YACxB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAEvD,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;oBACvD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;oBACvC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;oBACzD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,2CAA2C;YAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iCAAiC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChF,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;QAED,8DAA8D;QAC9D,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAkB;SAC9C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,4BAA4B;IAEpB,kBAAkB,CAAC,IAAiB,EAAE,KAAwB;QACpE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,UAAoB,CAAC;YAC5C,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,KAA0D,CAAC;YAClF,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;oBACtE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACvC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;oBAClD,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACvC,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACvC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;oBAClD,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,8EAA8E;QAC9E,yCAAyC;IAC3C,CAAC;CACF;AAjSD,oDAiSC"}
@@ -1,12 +1,12 @@
1
1
  import { TaskComment, CreateTaskCommentInput } from '../models';
2
- import { StorageProvider } from '../db/types/storage';
2
+ import { StorageBackend } from '../db/types/repository';
3
3
  /**
4
4
  * Comment Service
5
5
  * Manages creation, retrieval, and deletion of task comments
6
6
  */
7
7
  export declare class CommentService {
8
- private db;
9
- constructor(db?: StorageProvider);
8
+ private backend;
9
+ constructor(backend?: StorageBackend);
10
10
  /**
11
11
  * Add a comment to a task
12
12
  * @param input - Comment creation input
@@ -1 +1 @@
1
- {"version":3,"file":"CommentService.d.ts","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkB;gBAEhB,EAAE,CAAC,EAAE,eAAe;IAIhC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW;IAoBtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAa1C;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAc3C;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAalC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAwB9D;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAazC;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;CA2BnE"}
1
+ {"version":3,"file":"CommentService.d.ts","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE,cAAc;IAIpC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW;IAUtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI1C;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAI3C;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAU9D;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzC;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;CAGnE"}
@@ -3,14 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CommentService = void 0;
4
4
  const connection_1 = require("../db/connection");
5
5
  const input_validators_1 = require("../utils/input-validators");
6
+ const errors_1 = require("../errors");
6
7
  /**
7
8
  * Comment Service
8
9
  * Manages creation, retrieval, and deletion of task comments
9
10
  */
10
11
  class CommentService {
11
- db;
12
- constructor(db) {
13
- this.db = db || (0, connection_1.getDatabase)();
12
+ backend;
13
+ constructor(backend) {
14
+ this.backend = backend ?? (0, connection_1.getStorageBackend)();
14
15
  }
15
16
  /**
16
17
  * Add a comment to a task
@@ -18,18 +19,12 @@ class CommentService {
18
19
  * @returns Created comment object
19
20
  */
20
21
  addComment(input) {
21
- const db = this.db;
22
22
  const errors = (0, input_validators_1.validateCommentInput)(input);
23
23
  if (errors.length > 0) {
24
- throw new Error(errors[0].message);
24
+ throw new errors_1.ValidationError(errors[0].message);
25
25
  }
26
26
  const now = new Date().toISOString();
27
- const stmt = db.prepare(`
28
- INSERT INTO task_comments (task_id, author, content, created_at, updated_at)
29
- VALUES (?, ?, ?, ?, ?)
30
- `);
31
- const result = stmt.run(input.task_id, input.author ?? null, input.content, now, now);
32
- return this.getComment(result.lastInsertRowid);
27
+ return this.backend.comments.create({ ...input, created_at: now, updated_at: now });
33
28
  }
34
29
  /**
35
30
  * Get a comment by ID
@@ -37,13 +32,7 @@ class CommentService {
37
32
  * @returns Comment object or null if not found
38
33
  */
39
34
  getComment(id) {
40
- const db = this.db;
41
- const stmt = db.prepare(`
42
- SELECT * FROM task_comments
43
- WHERE id = ?
44
- `);
45
- const result = stmt.get(id);
46
- return result ? result : null;
35
+ return this.backend.comments.findById(id);
47
36
  }
48
37
  /**
49
38
  * List comments for a task
@@ -51,14 +40,7 @@ class CommentService {
51
40
  * @returns Array of comment objects ordered by created_at ASC
52
41
  */
53
42
  listComments(taskId) {
54
- const db = this.db;
55
- const stmt = db.prepare(`
56
- SELECT * FROM task_comments
57
- WHERE task_id = ?
58
- ORDER BY created_at ASC
59
- `);
60
- const results = stmt.all(taskId);
61
- return results;
43
+ return this.backend.comments.findByTaskId(taskId);
62
44
  }
63
45
  /**
64
46
  * Delete a comment by ID
@@ -66,13 +48,7 @@ class CommentService {
66
48
  * @returns True if deletion succeeded, false if comment not found
67
49
  */
68
50
  deleteComment(id) {
69
- const db = this.db;
70
- const stmt = db.prepare(`
71
- DELETE FROM task_comments
72
- WHERE id = ?
73
- `);
74
- const result = stmt.run(id);
75
- return result.changes > 0;
51
+ return this.backend.comments.delete(id);
76
52
  }
77
53
  /**
78
54
  * Update a comment's content
@@ -83,20 +59,10 @@ class CommentService {
83
59
  updateComment(id, content) {
84
60
  const errors = (0, input_validators_1.validateCommentInput)({ task_id: 0, content });
85
61
  if (errors.length > 0) {
86
- throw new Error(errors[0].message);
62
+ throw new errors_1.ValidationError(errors[0].message);
87
63
  }
88
- const db = this.db;
89
64
  const now = new Date().toISOString();
90
- const stmt = db.prepare(`
91
- UPDATE task_comments
92
- SET content = ?, updated_at = ?
93
- WHERE id = ?
94
- `);
95
- const result = stmt.run(content, now, id);
96
- if (result.changes === 0) {
97
- return null;
98
- }
99
- return this.getComment(id);
65
+ return this.backend.comments.update(id, content, now);
100
66
  }
101
67
  /**
102
68
  * Delete all comments for a task
@@ -104,13 +70,7 @@ class CommentService {
104
70
  * @returns Number of deleted comments
105
71
  */
106
72
  deleteAllComments(taskId) {
107
- const db = this.db;
108
- const stmt = db.prepare(`
109
- DELETE FROM task_comments
110
- WHERE task_id = ?
111
- `);
112
- const result = stmt.run(taskId);
113
- return result.changes;
73
+ return this.backend.comments.deleteAllForTask(taskId);
114
74
  }
115
75
  /**
116
76
  * Get all comments for multiple tasks at once
@@ -119,26 +79,7 @@ class CommentService {
119
79
  * @returns Map<task_id, TaskComment[]>
120
80
  */
121
81
  getCommentsForTasks(taskIds) {
122
- const db = this.db;
123
- if (taskIds.length === 0) {
124
- return new Map();
125
- }
126
- const placeholders = taskIds.map(() => '?').join(', ');
127
- const stmt = db.prepare(`
128
- SELECT * FROM task_comments
129
- WHERE task_id IN (${placeholders})
130
- ORDER BY task_id, created_at ASC
131
- `);
132
- const results = stmt.all(...taskIds);
133
- const commentsMap = new Map();
134
- for (const row of results) {
135
- const taskId = row.task_id;
136
- if (!commentsMap.has(taskId)) {
137
- commentsMap.set(taskId, []);
138
- }
139
- commentsMap.get(taskId).push(row);
140
- }
141
- return commentsMap;
82
+ return this.backend.comments.findByTaskIds(taskIds);
142
83
  }
143
84
  }
144
85
  exports.CommentService = CommentService;
@@ -1 +1 @@
1
- {"version":3,"file":"CommentService.js","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommentService.js","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":";;;AACA,iDAAqD;AAErD,gEAAiE;AACjE,sCAA4C;AAE5C;;;GAGG;AACH,MAAa,cAAc;IACjB,OAAO,CAAiB;IAEhC,YAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAA,8BAAiB,GAAE,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAA6B;QACtC,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAU,EAAE,OAAe;QACvC,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,OAAiB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAnFD,wCAmFC"}
@@ -1,4 +1,4 @@
1
- import { StorageProvider } from '../db/types/storage';
1
+ import { StorageBackend } from '../db/types/repository';
2
2
  export interface ExportedComment {
3
3
  author: string | null;
4
4
  content: string;
@@ -34,14 +34,14 @@ export interface ImportResult {
34
34
  * Handles JSON bulk export and import of tasks with all related data
35
35
  */
36
36
  export declare class ExportImportService {
37
- private db;
37
+ private backend;
38
38
  private taskService;
39
39
  private tagService;
40
40
  private taskTagService;
41
41
  private metadataService;
42
42
  private commentService;
43
43
  private taskBlockService;
44
- constructor(db?: StorageProvider);
44
+ constructor(backend?: StorageBackend);
45
45
  /**
46
46
  * Build a map from task_id to list of blocker task IDs
47
47
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportService.d.ts","sourceRoot":"","sources":["../../src/services/ExportImportService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQtD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,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,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,EAAE,CAAC,EAAE,eAAe;IAUhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;;OAGG;IACH,UAAU,IAAI,UAAU;IA8CxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;;;;;;OAOG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IAyB1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA2B1B"}
1
+ {"version":3,"file":"ExportImportService.d.ts","sourceRoot":"","sources":["../../src/services/ExportImportService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQxD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,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,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,CAAC,EAAE,cAAc;IAUpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;;OAGG;IACH,UAAU,IAAI,UAAU;IA8CxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;;;;;;OAOG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IA2B1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA2B1B"}