cadenlane-cli-2 1.0.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 (206) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -0
  4. package/bin.js +2 -0
  5. package/dist/application/config/config.manager.d.ts +62 -0
  6. package/dist/application/config/config.manager.d.ts.map +1 -0
  7. package/dist/application/config/config.manager.js +146 -0
  8. package/dist/application/config/config.manager.js.map +1 -0
  9. package/dist/application/services/application.service.d.ts +35 -0
  10. package/dist/application/services/application.service.d.ts.map +1 -0
  11. package/dist/application/services/application.service.js +174 -0
  12. package/dist/application/services/application.service.js.map +1 -0
  13. package/dist/application/services/download.service.d.ts +27 -0
  14. package/dist/application/services/download.service.d.ts.map +1 -0
  15. package/dist/application/services/download.service.js +197 -0
  16. package/dist/application/services/download.service.js.map +1 -0
  17. package/dist/application/services/file-naming.service.d.ts +34 -0
  18. package/dist/application/services/file-naming.service.d.ts.map +1 -0
  19. package/dist/application/services/file-naming.service.js +142 -0
  20. package/dist/application/services/file-naming.service.js.map +1 -0
  21. package/dist/application/services/queue.service.d.ts +53 -0
  22. package/dist/application/services/queue.service.d.ts.map +1 -0
  23. package/dist/application/services/queue.service.js +82 -0
  24. package/dist/application/services/queue.service.js.map +1 -0
  25. package/dist/cli/commands/start.command.d.ts +39 -0
  26. package/dist/cli/commands/start.command.d.ts.map +1 -0
  27. package/dist/cli/commands/start.command.js +196 -0
  28. package/dist/cli/commands/start.command.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +86 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/domain/constants/config.constants.d.ts +54 -0
  34. package/dist/domain/constants/config.constants.d.ts.map +1 -0
  35. package/dist/domain/constants/config.constants.js +142 -0
  36. package/dist/domain/constants/config.constants.js.map +1 -0
  37. package/dist/domain/dtos/index.d.ts +4 -0
  38. package/dist/domain/dtos/index.d.ts.map +1 -0
  39. package/dist/domain/dtos/index.js +10 -0
  40. package/dist/domain/dtos/index.js.map +1 -0
  41. package/dist/domain/dtos/log-entry.dto.d.ts +15 -0
  42. package/dist/domain/dtos/log-entry.dto.d.ts.map +1 -0
  43. package/dist/domain/dtos/log-entry.dto.js +64 -0
  44. package/dist/domain/dtos/log-entry.dto.js.map +1 -0
  45. package/dist/domain/dtos/message.dto.d.ts +27 -0
  46. package/dist/domain/dtos/message.dto.d.ts.map +1 -0
  47. package/dist/domain/dtos/message.dto.js +140 -0
  48. package/dist/domain/dtos/message.dto.js.map +1 -0
  49. package/dist/domain/dtos/queue-message.dto.d.ts +10 -0
  50. package/dist/domain/dtos/queue-message.dto.d.ts.map +1 -0
  51. package/dist/domain/dtos/queue-message.dto.js +39 -0
  52. package/dist/domain/dtos/queue-message.dto.js.map +1 -0
  53. package/dist/domain/entities/cli-instance.entity.d.ts +55 -0
  54. package/dist/domain/entities/cli-instance.entity.d.ts.map +1 -0
  55. package/dist/domain/entities/cli-instance.entity.js +132 -0
  56. package/dist/domain/entities/cli-instance.entity.js.map +1 -0
  57. package/dist/domain/entities/index.d.ts +3 -0
  58. package/dist/domain/entities/index.d.ts.map +1 -0
  59. package/dist/domain/entities/index.js +8 -0
  60. package/dist/domain/entities/index.js.map +1 -0
  61. package/dist/domain/entities/log-entry.entity.d.ts +60 -0
  62. package/dist/domain/entities/log-entry.entity.d.ts.map +1 -0
  63. package/dist/domain/entities/log-entry.entity.js +101 -0
  64. package/dist/domain/entities/log-entry.entity.js.map +1 -0
  65. package/dist/domain/entities/message.entity.d.ts +64 -0
  66. package/dist/domain/entities/message.entity.d.ts.map +1 -0
  67. package/dist/domain/entities/message.entity.js +110 -0
  68. package/dist/domain/entities/message.entity.js.map +1 -0
  69. package/dist/domain/enums/error-category.enum.d.ts +11 -0
  70. package/dist/domain/enums/error-category.enum.d.ts.map +1 -0
  71. package/dist/domain/enums/error-category.enum.js +15 -0
  72. package/dist/domain/enums/error-category.enum.js.map +1 -0
  73. package/dist/domain/enums/index.d.ts +4 -0
  74. package/dist/domain/enums/index.d.ts.map +1 -0
  75. package/dist/domain/enums/index.js +10 -0
  76. package/dist/domain/enums/index.js.map +1 -0
  77. package/dist/domain/enums/log-level.enum.d.ts +11 -0
  78. package/dist/domain/enums/log-level.enum.d.ts.map +1 -0
  79. package/dist/domain/enums/log-level.enum.js +15 -0
  80. package/dist/domain/enums/log-level.enum.js.map +1 -0
  81. package/dist/domain/enums/message-status.enum.d.ts +11 -0
  82. package/dist/domain/enums/message-status.enum.d.ts.map +1 -0
  83. package/dist/domain/enums/message-status.enum.js +15 -0
  84. package/dist/domain/enums/message-status.enum.js.map +1 -0
  85. package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts +34 -0
  86. package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts.map +1 -0
  87. package/dist/domain/interfaces/adapters/ifilesystem.adapter.js +3 -0
  88. package/dist/domain/interfaces/adapters/ifilesystem.adapter.js.map +1 -0
  89. package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts +22 -0
  90. package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts.map +1 -0
  91. package/dist/domain/interfaces/adapters/ihttp.adapter.js +3 -0
  92. package/dist/domain/interfaces/adapters/ihttp.adapter.js.map +1 -0
  93. package/dist/domain/interfaces/adapters/index.d.ts +4 -0
  94. package/dist/domain/interfaces/adapters/index.d.ts.map +1 -0
  95. package/dist/domain/interfaces/adapters/index.js +3 -0
  96. package/dist/domain/interfaces/adapters/index.js.map +1 -0
  97. package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts +27 -0
  98. package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts.map +1 -0
  99. package/dist/domain/interfaces/adapters/isupabase.adapter.js +3 -0
  100. package/dist/domain/interfaces/adapters/isupabase.adapter.js.map +1 -0
  101. package/dist/domain/interfaces/repositories/ilog.repository.d.ts +32 -0
  102. package/dist/domain/interfaces/repositories/ilog.repository.d.ts.map +1 -0
  103. package/dist/domain/interfaces/repositories/ilog.repository.js +3 -0
  104. package/dist/domain/interfaces/repositories/ilog.repository.js.map +1 -0
  105. package/dist/domain/interfaces/repositories/imessage.repository.d.ts +39 -0
  106. package/dist/domain/interfaces/repositories/imessage.repository.d.ts.map +1 -0
  107. package/dist/domain/interfaces/repositories/imessage.repository.js +3 -0
  108. package/dist/domain/interfaces/repositories/imessage.repository.js.map +1 -0
  109. package/dist/domain/interfaces/repositories/index.d.ts +4 -0
  110. package/dist/domain/interfaces/repositories/index.d.ts.map +1 -0
  111. package/dist/domain/interfaces/repositories/index.js +3 -0
  112. package/dist/domain/interfaces/repositories/index.js.map +1 -0
  113. package/dist/domain/interfaces/repositories/iqueue.repository.d.ts +75 -0
  114. package/dist/domain/interfaces/repositories/iqueue.repository.d.ts.map +1 -0
  115. package/dist/domain/interfaces/repositories/iqueue.repository.js +3 -0
  116. package/dist/domain/interfaces/repositories/iqueue.repository.js.map +1 -0
  117. package/dist/domain/interfaces/services/idownload.service.d.ts +28 -0
  118. package/dist/domain/interfaces/services/idownload.service.d.ts.map +1 -0
  119. package/dist/domain/interfaces/services/idownload.service.js +3 -0
  120. package/dist/domain/interfaces/services/idownload.service.js.map +1 -0
  121. package/dist/domain/interfaces/services/iqueue.service.d.ts +35 -0
  122. package/dist/domain/interfaces/services/iqueue.service.d.ts.map +1 -0
  123. package/dist/domain/interfaces/services/iqueue.service.js +3 -0
  124. package/dist/domain/interfaces/services/iqueue.service.js.map +1 -0
  125. package/dist/domain/services/path-resolver.service.d.ts +94 -0
  126. package/dist/domain/services/path-resolver.service.d.ts.map +1 -0
  127. package/dist/domain/services/path-resolver.service.js +332 -0
  128. package/dist/domain/services/path-resolver.service.js.map +1 -0
  129. package/dist/domain/validators/index.d.ts +4 -0
  130. package/dist/domain/validators/index.d.ts.map +1 -0
  131. package/dist/domain/validators/index.js +10 -0
  132. package/dist/domain/validators/index.js.map +1 -0
  133. package/dist/domain/validators/message.validator.d.ts +20 -0
  134. package/dist/domain/validators/message.validator.d.ts.map +1 -0
  135. package/dist/domain/validators/message.validator.js +31 -0
  136. package/dist/domain/validators/message.validator.js.map +1 -0
  137. package/dist/domain/validators/path.validator.d.ts +44 -0
  138. package/dist/domain/validators/path.validator.d.ts.map +1 -0
  139. package/dist/domain/validators/path.validator.js +156 -0
  140. package/dist/domain/validators/path.validator.js.map +1 -0
  141. package/dist/domain/validators/url.validator.d.ts +19 -0
  142. package/dist/domain/validators/url.validator.d.ts.map +1 -0
  143. package/dist/domain/validators/url.validator.js +46 -0
  144. package/dist/domain/validators/url.validator.js.map +1 -0
  145. package/dist/index.d.ts +11 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +27 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/infrastructure/adapters/filesystem.adapter.d.ts +35 -0
  150. package/dist/infrastructure/adapters/filesystem.adapter.d.ts.map +1 -0
  151. package/dist/infrastructure/adapters/filesystem.adapter.js +103 -0
  152. package/dist/infrastructure/adapters/filesystem.adapter.js.map +1 -0
  153. package/dist/infrastructure/adapters/http.adapter.d.ts +15 -0
  154. package/dist/infrastructure/adapters/http.adapter.d.ts.map +1 -0
  155. package/dist/infrastructure/adapters/http.adapter.js +80 -0
  156. package/dist/infrastructure/adapters/http.adapter.js.map +1 -0
  157. package/dist/infrastructure/adapters/index.d.ts +4 -0
  158. package/dist/infrastructure/adapters/index.d.ts.map +1 -0
  159. package/dist/infrastructure/adapters/index.js +10 -0
  160. package/dist/infrastructure/adapters/index.js.map +1 -0
  161. package/dist/infrastructure/adapters/pgmq.adapter.d.ts +29 -0
  162. package/dist/infrastructure/adapters/pgmq.adapter.d.ts.map +1 -0
  163. package/dist/infrastructure/adapters/pgmq.adapter.js +84 -0
  164. package/dist/infrastructure/adapters/pgmq.adapter.js.map +1 -0
  165. package/dist/infrastructure/adapters/supabase.adapter.d.ts +79 -0
  166. package/dist/infrastructure/adapters/supabase.adapter.d.ts.map +1 -0
  167. package/dist/infrastructure/adapters/supabase.adapter.js +97 -0
  168. package/dist/infrastructure/adapters/supabase.adapter.js.map +1 -0
  169. package/dist/infrastructure/database/supabase.client.d.ts +20 -0
  170. package/dist/infrastructure/database/supabase.client.d.ts.map +1 -0
  171. package/dist/infrastructure/database/supabase.client.js +36 -0
  172. package/dist/infrastructure/database/supabase.client.js.map +1 -0
  173. package/dist/infrastructure/di/container.d.ts +18 -0
  174. package/dist/infrastructure/di/container.d.ts.map +1 -0
  175. package/dist/infrastructure/di/container.js +103 -0
  176. package/dist/infrastructure/di/container.js.map +1 -0
  177. package/dist/infrastructure/repositories/cli-instance.repository.d.ts +64 -0
  178. package/dist/infrastructure/repositories/cli-instance.repository.d.ts.map +1 -0
  179. package/dist/infrastructure/repositories/cli-instance.repository.js +154 -0
  180. package/dist/infrastructure/repositories/cli-instance.repository.js.map +1 -0
  181. package/dist/infrastructure/repositories/config.repository.d.ts +52 -0
  182. package/dist/infrastructure/repositories/config.repository.d.ts.map +1 -0
  183. package/dist/infrastructure/repositories/config.repository.js +130 -0
  184. package/dist/infrastructure/repositories/config.repository.js.map +1 -0
  185. package/dist/infrastructure/repositories/index.d.ts +4 -0
  186. package/dist/infrastructure/repositories/index.d.ts.map +1 -0
  187. package/dist/infrastructure/repositories/index.js +10 -0
  188. package/dist/infrastructure/repositories/index.js.map +1 -0
  189. package/dist/infrastructure/repositories/log.repository.d.ts +44 -0
  190. package/dist/infrastructure/repositories/log.repository.d.ts.map +1 -0
  191. package/dist/infrastructure/repositories/log.repository.js +108 -0
  192. package/dist/infrastructure/repositories/log.repository.js.map +1 -0
  193. package/dist/infrastructure/repositories/message.repository.d.ts +51 -0
  194. package/dist/infrastructure/repositories/message.repository.d.ts.map +1 -0
  195. package/dist/infrastructure/repositories/message.repository.js +161 -0
  196. package/dist/infrastructure/repositories/message.repository.js.map +1 -0
  197. package/dist/infrastructure/repositories/queue.repository.d.ts +69 -0
  198. package/dist/infrastructure/repositories/queue.repository.d.ts.map +1 -0
  199. package/dist/infrastructure/repositories/queue.repository.js +130 -0
  200. package/dist/infrastructure/repositories/queue.repository.js.map +1 -0
  201. package/dist/infrastructure/utils/connection-health.util.d.ts +23 -0
  202. package/dist/infrastructure/utils/connection-health.util.d.ts.map +1 -0
  203. package/dist/infrastructure/utils/connection-health.util.js +64 -0
  204. package/dist/infrastructure/utils/connection-health.util.js.map +1 -0
  205. package/package.json +105 -0
  206. package/pm2.config.js +104 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * File System Adapter Interface
3
+ * Abstracts file system operations
4
+ */
5
+ export interface IFileSystemAdapter {
6
+ /**
7
+ * Writes a file to the file system
8
+ * @param filePath - Full path where to write the file
9
+ * @param data - Data to write (Buffer or string)
10
+ * @returns Promise that resolves when write is complete
11
+ */
12
+ writeFile(filePath: string, data: Buffer | string): Promise<void>;
13
+ /**
14
+ * Checks if a file exists
15
+ * @param filePath - Path to check
16
+ * @returns true if file exists, false otherwise
17
+ */
18
+ fileExists(filePath: string): Promise<boolean>;
19
+ /**
20
+ * Creates a directory (and parent directories if needed)
21
+ * @param dirPath - Directory path to create
22
+ * @returns Promise that resolves when directory is created
23
+ */
24
+ ensureDir(dirPath: string): Promise<void>;
25
+ /**
26
+ * Gets file stats
27
+ * @param filePath - Path to the file
28
+ * @returns File stats including size
29
+ */
30
+ getFileStats(filePath: string): Promise<{
31
+ size: number;
32
+ }>;
33
+ }
34
+ //# sourceMappingURL=ifilesystem.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifilesystem.adapter.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/ifilesystem.adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ifilesystem.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifilesystem.adapter.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/ifilesystem.adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * HTTP Download Result
3
+ */
4
+ export interface HttpDownloadResult {
5
+ buffer: Buffer;
6
+ contentType?: string;
7
+ contentLength?: number;
8
+ }
9
+ /**
10
+ * HTTP Adapter Interface
11
+ * Abstracts HTTP operations for downloading files
12
+ */
13
+ export interface IHttpAdapter {
14
+ /**
15
+ * Downloads a file from a URL
16
+ * @param url - URL to download from
17
+ * @param timeoutMs - Timeout in milliseconds
18
+ * @returns Download result with buffer and metadata
19
+ */
20
+ download(url: string, timeoutMs?: number): Promise<HttpDownloadResult>;
21
+ }
22
+ //# sourceMappingURL=ihttp.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ihttp.adapter.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/ihttp.adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ihttp.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ihttp.adapter.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/ihttp.adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { ISupabaseAdapter } from './isupabase.adapter';
2
+ export { IHttpAdapter, HttpDownloadResult } from './ihttp.adapter';
3
+ export { IFileSystemAdapter } from './ifilesystem.adapter';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ /**
3
+ * Supabase Adapter Interface
4
+ * Abstracts Supabase client operations
5
+ */
6
+ export interface ISupabaseAdapter {
7
+ /**
8
+ * Gets the Supabase client instance
9
+ * @returns SupabaseClient
10
+ */
11
+ getClient(): SupabaseClient;
12
+ /**
13
+ * Executes a raw SQL query
14
+ * @param query - SQL query to execute
15
+ * @param params - Query parameters
16
+ * @returns Query result
17
+ */
18
+ executeQuery<T = any>(query: string, params?: any[]): Promise<T[]>;
19
+ /**
20
+ * Calls a Supabase RPC function
21
+ * @param functionName - Name of the RPC function
22
+ * @param params - Function parameters
23
+ * @returns Function result
24
+ */
25
+ rpc<T = any>(functionName: string, params?: Record<string, any>): Promise<T>;
26
+ }
27
+ //# sourceMappingURL=isupabase.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isupabase.adapter.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/isupabase.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,IAAI,cAAc,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnE;;;;;OAKG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9E"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=isupabase.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isupabase.adapter.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/adapters/isupabase.adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { LogEntryEntity } from '../../../domain/entities';
2
+ /**
3
+ * Log Repository Interface
4
+ * Defines operations for log persistence
5
+ */
6
+ export interface ILogRepository {
7
+ /**
8
+ * Creates a new log entry
9
+ * @param logEntry - Log entry entity to create
10
+ * @returns Created log entry entity
11
+ */
12
+ create(logEntry: LogEntryEntity): Promise<LogEntryEntity>;
13
+ /**
14
+ * Creates multiple log entries in batch
15
+ * @param logEntries - Array of log entry entities
16
+ * @returns Array of created log entry entities
17
+ */
18
+ createBatch(logEntries: LogEntryEntity[]): Promise<LogEntryEntity[]>;
19
+ /**
20
+ * Finds all logs for a specific message
21
+ * @param messageId - Message ID
22
+ * @returns Array of log entry entities
23
+ */
24
+ findByMessageId(messageId: string): Promise<LogEntryEntity[]>;
25
+ /**
26
+ * Finds error logs for a specific message
27
+ * @param messageId - Message ID
28
+ * @returns Array of error log entry entities
29
+ */
30
+ findErrorsByMessageId(messageId: string): Promise<LogEntryEntity[]>;
31
+ }
32
+ //# sourceMappingURL=ilog.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ilog.repository.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/ilog.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE1D;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAErE;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE9D;;;;OAIG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CACrE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ilog.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ilog.repository.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/ilog.repository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { MessageEntity } from '../../../domain/entities';
2
+ /**
3
+ * Message Repository Interface
4
+ * Defines operations for message persistence
5
+ */
6
+ export interface IMessageRepository {
7
+ /**
8
+ * Creates a new message record
9
+ * @param message - Message entity to create
10
+ * @returns Created message entity
11
+ */
12
+ create(message: MessageEntity): Promise<MessageEntity>;
13
+ /**
14
+ * Updates an existing message
15
+ * @param message - Message entity with updated data
16
+ * @returns Updated message entity
17
+ */
18
+ update(message: MessageEntity): Promise<MessageEntity>;
19
+ /**
20
+ * Finds a message by ID
21
+ * @param id - Message ID
22
+ * @returns Message entity or null if not found
23
+ */
24
+ findById(id: string): Promise<MessageEntity | null>;
25
+ /**
26
+ * Finds a message by PGMQ message ID
27
+ * @param pgmqMessageId - PGMQ message ID
28
+ * @returns Message entity or null if not found
29
+ */
30
+ findByPgmqMessageId(pgmqMessageId: number): Promise<MessageEntity | null>;
31
+ /**
32
+ * Finds messages by status
33
+ * @param status - Message status
34
+ * @param limit - Maximum number of results
35
+ * @returns Array of message entities
36
+ */
37
+ findByStatus(status: string, limit?: number): Promise<MessageEntity[]>;
38
+ }
39
+ //# sourceMappingURL=imessage.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imessage.repository.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/imessage.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvD;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEpD;;;;OAIG;IACH,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAE1E;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CACxE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=imessage.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imessage.repository.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/imessage.repository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { IMessageRepository } from './imessage.repository';
2
+ export { ILogRepository } from './ilog.repository';
3
+ export { IQueueRepository, PgmqMessage } from './iqueue.repository';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ import { QueueMessageDto } from '../../../domain/dtos';
2
+ /**
3
+ * PGMQ Message with metadata
4
+ */
5
+ export interface PgmqMessage {
6
+ msg_id: number;
7
+ read_ct: number;
8
+ enqueued_at: string;
9
+ vt: string;
10
+ message: QueueMessageDto;
11
+ }
12
+ /**
13
+ * Queue Repository Interface
14
+ * Defines operations for PGMQ queue management
15
+ */
16
+ export interface IQueueRepository {
17
+ /**
18
+ * Reads a message from the queue (non-blocking)
19
+ * @param queueName - Name of the queue
20
+ * @param visibilityTimeoutSeconds - Visibility timeout in seconds
21
+ * @returns PGMQ message or null if queue is empty
22
+ */
23
+ readMessage(queueName: string, visibilityTimeoutSeconds: number): Promise<PgmqMessage | null>;
24
+ /**
25
+ * Reads a message from the queue with blocking poll (event-driven)
26
+ * Waits up to pollTimeoutSeconds for a message to arrive
27
+ * @param queueName - Name of the queue
28
+ * @param visibilityTimeoutSeconds - Visibility timeout in seconds
29
+ * @param pollTimeoutSeconds - How long to wait for a message (default: 5s)
30
+ * @param pollIntervalMs - Internal polling interval (default: 250ms)
31
+ * @returns PGMQ message or null if timeout reached
32
+ */
33
+ readMessageWithPoll(queueName: string, visibilityTimeoutSeconds: number, pollTimeoutSeconds?: number, pollIntervalMs?: number): Promise<PgmqMessage | null>;
34
+ /**
35
+ * Deletes a message from the queue
36
+ * @param queueName - Name of the queue
37
+ * @param messageId - PGMQ message ID
38
+ * @returns true if deleted, false otherwise
39
+ */
40
+ deleteMessage(queueName: string, messageId: number): Promise<boolean>;
41
+ /**
42
+ * Sends a message to the queue
43
+ * @param queueName - Name of the queue
44
+ * @param message - Message to send
45
+ * @returns PGMQ message ID
46
+ */
47
+ sendMessage(queueName: string, message: QueueMessageDto): Promise<number>;
48
+ /**
49
+ * Gets queue metrics
50
+ * @param queueName - Name of the queue
51
+ * @returns Queue metrics
52
+ */
53
+ getMetrics(queueName: string): Promise<{
54
+ queue_name: string;
55
+ queue_length: number;
56
+ newest_msg_age_sec: number | null;
57
+ oldest_msg_age_sec: number | null;
58
+ total_messages: number;
59
+ }>;
60
+ /**
61
+ * Creates a new queue (idempotent - safe to call if queue exists)
62
+ * @param queueName - Name of the queue to create
63
+ * @returns true if created or already exists
64
+ */
65
+ createQueue(queueName: string): Promise<boolean>;
66
+ /**
67
+ * Sends a message to a specific CLI instance queue
68
+ * @param baseQueueName - Base queue name (e.g., 'image_downloads')
69
+ * @param targetInstanceId - Target CLI instance ID
70
+ * @param message - Message to send
71
+ * @returns PGMQ message ID
72
+ */
73
+ sendMessageToInstance(baseQueueName: string, targetInstanceId: string, message: QueueMessageDto): Promise<number>;
74
+ }
75
+ //# sourceMappingURL=iqueue.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iqueue.repository.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/iqueue.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE9F;;;;;;;;OAQG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,wBAAwB,EAAE,MAAM,EAChC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE/B;;;;;OAKG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1E;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH;;;;OAIG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,qBAAqB,CACnB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=iqueue.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iqueue.repository.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/repositories/iqueue.repository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { MessageEntity } from '../../../domain/entities';
2
+ /**
3
+ * Download Result
4
+ */
5
+ export interface DownloadResult {
6
+ success: boolean;
7
+ fileName?: string;
8
+ filePath?: string;
9
+ fileSizeBytes?: number;
10
+ durationMs?: number;
11
+ error?: {
12
+ message: string;
13
+ category: string;
14
+ };
15
+ }
16
+ /**
17
+ * Download Service Interface
18
+ * Handles image download operations
19
+ */
20
+ export interface IDownloadService {
21
+ /**
22
+ * Downloads an image from URL and saves to target folder
23
+ * @param message - Message entity containing download details
24
+ * @returns Download result
25
+ */
26
+ downloadImage(message: MessageEntity): Promise<DownloadResult>;
27
+ }
28
+ //# sourceMappingURL=idownload.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idownload.service.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/services/idownload.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=idownload.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idownload.service.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/services/idownload.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { PgmqMessage } from '../../../domain/interfaces/repositories';
2
+ /**
3
+ * Queue Service Interface
4
+ * Handles queue operations and message lifecycle
5
+ */
6
+ export interface IQueueService {
7
+ /**
8
+ * Polls the queue for a new message
9
+ * @returns PGMQ message or null if queue is empty
10
+ */
11
+ pollMessage(): Promise<PgmqMessage | null>;
12
+ /**
13
+ * Acknowledges successful message processing by deleting from queue
14
+ * @param messageId - PGMQ message ID
15
+ * @returns true if deleted, false otherwise
16
+ */
17
+ acknowledgeMessage(messageId: number): Promise<boolean>;
18
+ /**
19
+ * Gets queue metrics
20
+ * @returns Queue metrics
21
+ */
22
+ getQueueMetrics(): Promise<{
23
+ queue_name: string;
24
+ queue_length: number;
25
+ newest_msg_age_sec: number | null;
26
+ oldest_msg_age_sec: number | null;
27
+ total_messages: number;
28
+ }>;
29
+ /**
30
+ * Creates the queue for this CLI instance (idempotent)
31
+ * @returns true if created or already exists
32
+ */
33
+ createQueue(): Promise<boolean>;
34
+ }
35
+ //# sourceMappingURL=iqueue.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iqueue.service.d.ts","sourceRoot":"","sources":["../../../../src/domain/interfaces/services/iqueue.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE3C;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD;;;OAGG;IACH,eAAe,IAAI,OAAO,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=iqueue.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iqueue.service.js","sourceRoot":"","sources":["../../../../src/domain/interfaces/services/iqueue.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Platform information
3
+ */
4
+ export interface PlatformInfo {
5
+ platform: 'win32' | 'darwin' | 'linux';
6
+ isWindows: boolean;
7
+ isMac: boolean;
8
+ isLinux: boolean;
9
+ homeDir: string;
10
+ separator: string;
11
+ }
12
+ /**
13
+ * Path resolution result
14
+ */
15
+ export interface PathResolutionResult {
16
+ absolutePath: string;
17
+ isValid: boolean;
18
+ error?: string;
19
+ platform: string;
20
+ }
21
+ /**
22
+ * PathResolver Service
23
+ * Handles cross-platform path resolution and validation
24
+ *
25
+ * Design Principles:
26
+ * - All paths must be absolute
27
+ * - Platform-specific validation (Windows drive letters, Unix root)
28
+ * - Home directory expansion support (~)
29
+ * - Environment variable expansion (%VAR% on Windows, $VAR on Unix)
30
+ */
31
+ export declare class PathResolverService {
32
+ private readonly platformInfo;
33
+ constructor();
34
+ /**
35
+ * Get current platform information
36
+ */
37
+ getPlatformInfo(): PlatformInfo;
38
+ /**
39
+ * Resolve a path to an absolute path with platform-specific handling
40
+ * @param inputPath - The path to resolve (can include ~ or env vars)
41
+ * @param fallbackPath - Optional fallback if resolution fails
42
+ * @returns Resolution result with absolute path or error
43
+ */
44
+ resolve(inputPath: string, fallbackPath?: string): PathResolutionResult;
45
+ /**
46
+ * Get default download path for current platform
47
+ * @returns Platform-specific default download directory
48
+ */
49
+ getDefaultDownloadPath(): string;
50
+ /**
51
+ * Expand home directory shorthand (~)
52
+ * Works on all platforms
53
+ */
54
+ private expandHomeDirectory;
55
+ /**
56
+ * Expand environment variables
57
+ * - Windows: %VAR%
58
+ * - Unix: $VAR or ${VAR}
59
+ */
60
+ private expandEnvironmentVariables;
61
+ /**
62
+ * Normalize path separators for current platform
63
+ */
64
+ private normalizeSeparators;
65
+ /**
66
+ * Check if path is absolute (platform-aware)
67
+ * This is more reliable than path.isAbsolute() for cross-platform testing
68
+ */
69
+ private isPathAbsolute;
70
+ /**
71
+ * Validate path for current platform
72
+ * @returns Error message if invalid, undefined if valid
73
+ */
74
+ private validatePlatformPath;
75
+ /**
76
+ * Validate Windows-specific path requirements
77
+ */
78
+ private validateWindowsPath;
79
+ /**
80
+ * Validate Unix-specific path requirements (Mac/Linux)
81
+ */
82
+ private validateUnixPath;
83
+ /**
84
+ * Format a path example for current platform
85
+ * Useful for error messages and UI placeholders
86
+ */
87
+ getPathExample(type: 'downloads' | 'documents' | 'desktop' | 'custom'): string;
88
+ /**
89
+ * Check if a path is safe (no directory traversal)
90
+ * This is a secondary check after resolution
91
+ */
92
+ isSafePath(absolutePath: string): boolean;
93
+ }
94
+ //# sourceMappingURL=path-resolver.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.service.d.ts","sourceRoot":"","sources":["../../../src/domain/services/path-resolver.service.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;;IAc5C;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,oBAAoB;IAuEvE;;;OAGG;IACH,sBAAsB,IAAI,MAAM;IAUhC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAkBlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAYtB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM;IAsC9E;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;CAS1C"}