@sogni-ai/expo-client 1.0.0-alpha.10

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 (262) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +411 -0
  3. package/dist/cjs/Account/index.d.ts +60 -0
  4. package/dist/cjs/Account/index.d.ts.map +1 -0
  5. package/dist/cjs/Account/index.js +188 -0
  6. package/dist/cjs/Account/index.js.map +1 -0
  7. package/dist/cjs/Account/types.d.ts +43 -0
  8. package/dist/cjs/Account/types.d.ts.map +1 -0
  9. package/dist/cjs/Account/types.js +18 -0
  10. package/dist/cjs/Account/types.js.map +1 -0
  11. package/dist/cjs/ApiClient/WebSocketClient/events.d.ts +139 -0
  12. package/dist/cjs/ApiClient/WebSocketClient/events.d.ts.map +1 -0
  13. package/dist/cjs/ApiClient/WebSocketClient/events.js +3 -0
  14. package/dist/cjs/ApiClient/WebSocketClient/events.js.map +1 -0
  15. package/dist/cjs/ApiClient/WebSocketClient/index.d.ts +45 -0
  16. package/dist/cjs/ApiClient/WebSocketClient/index.d.ts.map +1 -0
  17. package/dist/cjs/ApiClient/WebSocketClient/index.js +283 -0
  18. package/dist/cjs/ApiClient/WebSocketClient/index.js.map +1 -0
  19. package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts +45 -0
  20. package/dist/cjs/ApiClient/WebSocketClient/normalize.d.ts.map +1 -0
  21. package/dist/cjs/ApiClient/WebSocketClient/normalize.js +245 -0
  22. package/dist/cjs/ApiClient/WebSocketClient/normalize.js.map +1 -0
  23. package/dist/cjs/ApiClient/WebSocketClient/types.d.ts +9 -0
  24. package/dist/cjs/ApiClient/WebSocketClient/types.d.ts.map +1 -0
  25. package/dist/cjs/ApiClient/WebSocketClient/types.js +3 -0
  26. package/dist/cjs/ApiClient/WebSocketClient/types.js.map +1 -0
  27. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts +161 -0
  28. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.d.ts.map +1 -0
  29. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js +11 -0
  30. package/dist/cjs/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
  31. package/dist/cjs/ApiClient/index.d.ts +60 -0
  32. package/dist/cjs/ApiClient/index.d.ts.map +1 -0
  33. package/dist/cjs/ApiClient/index.js +87 -0
  34. package/dist/cjs/ApiClient/index.js.map +1 -0
  35. package/dist/cjs/Chat/ChatStream.d.ts +42 -0
  36. package/dist/cjs/Chat/ChatStream.d.ts.map +1 -0
  37. package/dist/cjs/Chat/ChatStream.js +146 -0
  38. package/dist/cjs/Chat/ChatStream.js.map +1 -0
  39. package/dist/cjs/Chat/index.d.ts +61 -0
  40. package/dist/cjs/Chat/index.d.ts.map +1 -0
  41. package/dist/cjs/Chat/index.js +179 -0
  42. package/dist/cjs/Chat/index.js.map +1 -0
  43. package/dist/cjs/Chat/tools.d.ts +13 -0
  44. package/dist/cjs/Chat/tools.d.ts.map +1 -0
  45. package/dist/cjs/Chat/tools.js +22 -0
  46. package/dist/cjs/Chat/tools.js.map +1 -0
  47. package/dist/cjs/Chat/types.d.ts +153 -0
  48. package/dist/cjs/Chat/types.d.ts.map +1 -0
  49. package/dist/cjs/Chat/types.js +3 -0
  50. package/dist/cjs/Chat/types.js.map +1 -0
  51. package/dist/cjs/Projects/ControlNet.d.ts +30 -0
  52. package/dist/cjs/Projects/ControlNet.d.ts.map +1 -0
  53. package/dist/cjs/Projects/ControlNet.js +45 -0
  54. package/dist/cjs/Projects/ControlNet.js.map +1 -0
  55. package/dist/cjs/Projects/createJobRequestMessage.d.ts +11 -0
  56. package/dist/cjs/Projects/createJobRequestMessage.d.ts.map +1 -0
  57. package/dist/cjs/Projects/createJobRequestMessage.js +239 -0
  58. package/dist/cjs/Projects/createJobRequestMessage.js.map +1 -0
  59. package/dist/cjs/Projects/index.d.ts +96 -0
  60. package/dist/cjs/Projects/index.d.ts.map +1 -0
  61. package/dist/cjs/Projects/index.js +536 -0
  62. package/dist/cjs/Projects/index.js.map +1 -0
  63. package/dist/cjs/Projects/restNormalize.d.ts +60 -0
  64. package/dist/cjs/Projects/restNormalize.d.ts.map +1 -0
  65. package/dist/cjs/Projects/restNormalize.js +89 -0
  66. package/dist/cjs/Projects/restNormalize.js.map +1 -0
  67. package/dist/cjs/Projects/types.d.ts +233 -0
  68. package/dist/cjs/Projects/types.d.ts.map +1 -0
  69. package/dist/cjs/Projects/types.js +3 -0
  70. package/dist/cjs/Projects/types.js.map +1 -0
  71. package/dist/cjs/Projects/utils.d.ts +23 -0
  72. package/dist/cjs/Projects/utils.d.ts.map +1 -0
  73. package/dist/cjs/Projects/utils.js +65 -0
  74. package/dist/cjs/Projects/utils.js.map +1 -0
  75. package/dist/cjs/index.d.ts +63 -0
  76. package/dist/cjs/index.d.ts.map +1 -0
  77. package/dist/cjs/index.js +116 -0
  78. package/dist/cjs/index.js.map +1 -0
  79. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts +15 -0
  80. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.d.ts.map +1 -0
  81. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js +47 -0
  82. package/dist/cjs/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
  83. package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts +23 -0
  84. package/dist/cjs/lib/AuthManager/AuthManagerBase.d.ts.map +1 -0
  85. package/dist/cjs/lib/AuthManager/AuthManagerBase.js +14 -0
  86. package/dist/cjs/lib/AuthManager/AuthManagerBase.js.map +1 -0
  87. package/dist/cjs/lib/AuthManager/AuthStorage.d.ts +11 -0
  88. package/dist/cjs/lib/AuthManager/AuthStorage.d.ts.map +1 -0
  89. package/dist/cjs/lib/AuthManager/AuthStorage.js +50 -0
  90. package/dist/cjs/lib/AuthManager/AuthStorage.js.map +1 -0
  91. package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts +35 -0
  92. package/dist/cjs/lib/AuthManager/TokenAuthManager.d.ts.map +1 -0
  93. package/dist/cjs/lib/AuthManager/TokenAuthManager.js +164 -0
  94. package/dist/cjs/lib/AuthManager/TokenAuthManager.js.map +1 -0
  95. package/dist/cjs/lib/AuthManager/index.d.ts +7 -0
  96. package/dist/cjs/lib/AuthManager/index.d.ts.map +1 -0
  97. package/dist/cjs/lib/AuthManager/index.js +13 -0
  98. package/dist/cjs/lib/AuthManager/index.js.map +1 -0
  99. package/dist/cjs/lib/Cache.d.ts +12 -0
  100. package/dist/cjs/lib/Cache.d.ts.map +1 -0
  101. package/dist/cjs/lib/Cache.js +36 -0
  102. package/dist/cjs/lib/Cache.js.map +1 -0
  103. package/dist/cjs/lib/DefaultLogger.d.ts +17 -0
  104. package/dist/cjs/lib/DefaultLogger.d.ts.map +1 -0
  105. package/dist/cjs/lib/DefaultLogger.js +36 -0
  106. package/dist/cjs/lib/DefaultLogger.js.map +1 -0
  107. package/dist/cjs/lib/RestClient.d.ts +18 -0
  108. package/dist/cjs/lib/RestClient.d.ts.map +1 -0
  109. package/dist/cjs/lib/RestClient.js +67 -0
  110. package/dist/cjs/lib/RestClient.js.map +1 -0
  111. package/dist/cjs/lib/TypedEventEmitter.d.ts +16 -0
  112. package/dist/cjs/lib/TypedEventEmitter.d.ts.map +1 -0
  113. package/dist/cjs/lib/TypedEventEmitter.js +46 -0
  114. package/dist/cjs/lib/TypedEventEmitter.js.map +1 -0
  115. package/dist/cjs/lib/base64.d.ts +3 -0
  116. package/dist/cjs/lib/base64.d.ts.map +1 -0
  117. package/dist/cjs/lib/base64.js +21 -0
  118. package/dist/cjs/lib/base64.js.map +1 -0
  119. package/dist/cjs/lib/getUUID.d.ts +12 -0
  120. package/dist/cjs/lib/getUUID.d.ts.map +1 -0
  121. package/dist/cjs/lib/getUUID.js +29 -0
  122. package/dist/cjs/lib/getUUID.js.map +1 -0
  123. package/dist/cjs/lib/mediaInput.d.ts +33 -0
  124. package/dist/cjs/lib/mediaInput.d.ts.map +1 -0
  125. package/dist/cjs/lib/mediaInput.js +32 -0
  126. package/dist/cjs/lib/mediaInput.js.map +1 -0
  127. package/dist/cjs/lib/utils.d.ts +10 -0
  128. package/dist/cjs/lib/utils.d.ts.map +1 -0
  129. package/dist/cjs/lib/utils.js +24 -0
  130. package/dist/cjs/lib/utils.js.map +1 -0
  131. package/dist/cjs/types/ErrorData.d.ts +7 -0
  132. package/dist/cjs/types/ErrorData.d.ts.map +1 -0
  133. package/dist/cjs/types/ErrorData.js +3 -0
  134. package/dist/cjs/types/ErrorData.js.map +1 -0
  135. package/dist/cjs/types/json.d.ts +6 -0
  136. package/dist/cjs/types/json.d.ts.map +1 -0
  137. package/dist/cjs/types/json.js +3 -0
  138. package/dist/cjs/types/json.js.map +1 -0
  139. package/dist/cjs/types/token.d.ts +2 -0
  140. package/dist/cjs/types/token.d.ts.map +1 -0
  141. package/dist/cjs/types/token.js +3 -0
  142. package/dist/cjs/types/token.js.map +1 -0
  143. package/dist/cjs/version.d.ts +2 -0
  144. package/dist/cjs/version.d.ts.map +1 -0
  145. package/dist/cjs/version.js +5 -0
  146. package/dist/cjs/version.js.map +1 -0
  147. package/dist/cjs/wallet.d.ts +59 -0
  148. package/dist/cjs/wallet.d.ts.map +1 -0
  149. package/dist/cjs/wallet.js +125 -0
  150. package/dist/cjs/wallet.js.map +1 -0
  151. package/dist/esm/Account/index.js +183 -0
  152. package/dist/esm/Account/index.js.map +1 -0
  153. package/dist/esm/Account/types.js +15 -0
  154. package/dist/esm/Account/types.js.map +1 -0
  155. package/dist/esm/ApiClient/WebSocketClient/events.js +2 -0
  156. package/dist/esm/ApiClient/WebSocketClient/events.js.map +1 -0
  157. package/dist/esm/ApiClient/WebSocketClient/index.js +278 -0
  158. package/dist/esm/ApiClient/WebSocketClient/index.js.map +1 -0
  159. package/dist/esm/ApiClient/WebSocketClient/normalize.js +229 -0
  160. package/dist/esm/ApiClient/WebSocketClient/normalize.js.map +1 -0
  161. package/dist/esm/ApiClient/WebSocketClient/types.js +2 -0
  162. package/dist/esm/ApiClient/WebSocketClient/types.js.map +1 -0
  163. package/dist/esm/ApiClient/WebSocketClient/wireTypes.js +10 -0
  164. package/dist/esm/ApiClient/WebSocketClient/wireTypes.js.map +1 -0
  165. package/dist/esm/ApiClient/index.js +80 -0
  166. package/dist/esm/ApiClient/index.js.map +1 -0
  167. package/dist/esm/Chat/ChatStream.js +144 -0
  168. package/dist/esm/Chat/ChatStream.js.map +1 -0
  169. package/dist/esm/Chat/index.js +174 -0
  170. package/dist/esm/Chat/index.js.map +1 -0
  171. package/dist/esm/Chat/tools.js +19 -0
  172. package/dist/esm/Chat/tools.js.map +1 -0
  173. package/dist/esm/Chat/types.js +2 -0
  174. package/dist/esm/Chat/types.js.map +1 -0
  175. package/dist/esm/Projects/ControlNet.js +41 -0
  176. package/dist/esm/Projects/ControlNet.js.map +1 -0
  177. package/dist/esm/Projects/createJobRequestMessage.js +236 -0
  178. package/dist/esm/Projects/createJobRequestMessage.js.map +1 -0
  179. package/dist/esm/Projects/index.js +531 -0
  180. package/dist/esm/Projects/index.js.map +1 -0
  181. package/dist/esm/Projects/restNormalize.js +86 -0
  182. package/dist/esm/Projects/restNormalize.js.map +1 -0
  183. package/dist/esm/Projects/types.js +2 -0
  184. package/dist/esm/Projects/types.js.map +1 -0
  185. package/dist/esm/Projects/utils.js +55 -0
  186. package/dist/esm/Projects/utils.js.map +1 -0
  187. package/dist/esm/index.js +72 -0
  188. package/dist/esm/index.js.map +1 -0
  189. package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js +42 -0
  190. package/dist/esm/lib/AuthManager/ApiKeyAuthManager.js.map +1 -0
  191. package/dist/esm/lib/AuthManager/AuthManagerBase.js +9 -0
  192. package/dist/esm/lib/AuthManager/AuthManagerBase.js.map +1 -0
  193. package/dist/esm/lib/AuthManager/AuthStorage.js +13 -0
  194. package/dist/esm/lib/AuthManager/AuthStorage.js.map +1 -0
  195. package/dist/esm/lib/AuthManager/TokenAuthManager.js +159 -0
  196. package/dist/esm/lib/AuthManager/TokenAuthManager.js.map +1 -0
  197. package/dist/esm/lib/AuthManager/index.js +5 -0
  198. package/dist/esm/lib/AuthManager/index.js.map +1 -0
  199. package/dist/esm/lib/Cache.js +33 -0
  200. package/dist/esm/lib/Cache.js.map +1 -0
  201. package/dist/esm/lib/DefaultLogger.js +32 -0
  202. package/dist/esm/lib/DefaultLogger.js.map +1 -0
  203. package/dist/esm/lib/RestClient.js +62 -0
  204. package/dist/esm/lib/RestClient.js.map +1 -0
  205. package/dist/esm/lib/TypedEventEmitter.js +44 -0
  206. package/dist/esm/lib/TypedEventEmitter.js.map +1 -0
  207. package/dist/esm/lib/base64.js +17 -0
  208. package/dist/esm/lib/base64.js.map +1 -0
  209. package/dist/esm/lib/getUUID.js +26 -0
  210. package/dist/esm/lib/getUUID.js.map +1 -0
  211. package/dist/esm/lib/mediaInput.js +28 -0
  212. package/dist/esm/lib/mediaInput.js.map +1 -0
  213. package/dist/esm/lib/utils.js +19 -0
  214. package/dist/esm/lib/utils.js.map +1 -0
  215. package/dist/esm/types/ErrorData.js +2 -0
  216. package/dist/esm/types/ErrorData.js.map +1 -0
  217. package/dist/esm/types/json.js +2 -0
  218. package/dist/esm/types/json.js.map +1 -0
  219. package/dist/esm/types/token.js +2 -0
  220. package/dist/esm/types/token.js.map +1 -0
  221. package/dist/esm/version.js +2 -0
  222. package/dist/esm/version.js.map +1 -0
  223. package/dist/esm/wallet.js +117 -0
  224. package/dist/esm/wallet.js.map +1 -0
  225. package/package.json +92 -0
  226. package/src/Account/index.ts +214 -0
  227. package/src/Account/types.ts +61 -0
  228. package/src/ApiClient/WebSocketClient/events.ts +168 -0
  229. package/src/ApiClient/WebSocketClient/index.ts +345 -0
  230. package/src/ApiClient/WebSocketClient/normalize.ts +287 -0
  231. package/src/ApiClient/WebSocketClient/types.ts +10 -0
  232. package/src/ApiClient/WebSocketClient/wireTypes.ts +183 -0
  233. package/src/ApiClient/index.ts +147 -0
  234. package/src/Chat/ChatStream.ts +164 -0
  235. package/src/Chat/index.ts +224 -0
  236. package/src/Chat/tools.ts +23 -0
  237. package/src/Chat/types.ts +165 -0
  238. package/src/Projects/ControlNet.ts +84 -0
  239. package/src/Projects/createJobRequestMessage.ts +241 -0
  240. package/src/Projects/index.ts +608 -0
  241. package/src/Projects/restNormalize.ts +154 -0
  242. package/src/Projects/types.ts +266 -0
  243. package/src/Projects/utils.ts +60 -0
  244. package/src/index.ts +217 -0
  245. package/src/lib/AuthManager/ApiKeyAuthManager.ts +52 -0
  246. package/src/lib/AuthManager/AuthManagerBase.ts +35 -0
  247. package/src/lib/AuthManager/AuthStorage.ts +21 -0
  248. package/src/lib/AuthManager/TokenAuthManager.ts +179 -0
  249. package/src/lib/AuthManager/index.ts +8 -0
  250. package/src/lib/Cache.ts +45 -0
  251. package/src/lib/DefaultLogger.ts +47 -0
  252. package/src/lib/RestClient.ts +77 -0
  253. package/src/lib/TypedEventEmitter.ts +52 -0
  254. package/src/lib/base64.ts +17 -0
  255. package/src/lib/getUUID.ts +27 -0
  256. package/src/lib/mediaInput.ts +54 -0
  257. package/src/lib/utils.ts +21 -0
  258. package/src/types/ErrorData.ts +7 -0
  259. package/src/types/json.ts +5 -0
  260. package/src/types/token.ts +1 -0
  261. package/src/version.ts +1 -0
  262. package/src/wallet.ts +158 -0
@@ -0,0 +1,531 @@
1
+ import { ApiError } from '../ApiClient';
2
+ import TypedEventEmitter from '../lib/TypedEventEmitter';
3
+ import getUUID from '../lib/getUUID';
4
+ import { toFetchBody } from '../lib/mediaInput';
5
+ import createJobRequestMessage from './createJobRequestMessage';
6
+ import { getMaxContextImages } from './ControlNet';
7
+ import { rawProjectToProject } from './restNormalize';
8
+ const TERMINAL_PROJECT_STATUSES = ['completed', 'failed', 'canceled'];
9
+ const TERMINAL_JOB_STATUSES = ['completed', 'failed', 'canceled'];
10
+ const GC_DELAY_MS = 30000;
11
+ class ProjectsApi extends TypedEventEmitter {
12
+ constructor(client) {
13
+ super();
14
+ this._projects = new Map();
15
+ this._subscribers = new Map();
16
+ this._gcTimers = new Map();
17
+ this._client = client;
18
+ this._wireSocketHandlers();
19
+ }
20
+ /** List models available on the given network. Defaults to the client's current network. */
21
+ async getAvailableModels(network) {
22
+ const net = network ?? this._client.socket.supernetType;
23
+ const res = await this._client.socketRest.get(`/api/v1/status/network/${net}/models`);
24
+ // The endpoint returns either an array of models directly or wrapped in
25
+ // { models: [...] }. Accept either shape.
26
+ const data = res.data;
27
+ if (Array.isArray(data))
28
+ return data;
29
+ if (data && Array.isArray(data.models))
30
+ return data.models;
31
+ return [];
32
+ }
33
+ /**
34
+ * Create a generation project (image, video, or audio).
35
+ *
36
+ * Returns the initial Project snapshot immediately; subscribe via
37
+ * `subscribe(id, cb)` or `waitForCompletion(id)` to observe state changes as
38
+ * the server processes it.
39
+ *
40
+ * For image projects, `startingImage`, `contextImages[]`, and
41
+ * `controlNet.image` are uploaded first. For video projects, `referenceImage`,
42
+ * `referenceImageEnd`, `referenceAudio`, and `referenceVideo` are uploaded
43
+ * first. Reference uploads happen in parallel; the WS `jobRequest` is sent
44
+ * once all uploads complete.
45
+ */
46
+ async create(params) {
47
+ if (!this._client.socket.isConnected) {
48
+ throw new Error('Cannot create project: WebSocket is not connected. Authenticate first and wait for `connected` event.');
49
+ }
50
+ const id = getUUID();
51
+ const project = {
52
+ id,
53
+ params,
54
+ status: 'pending',
55
+ progress: 0,
56
+ eta: null,
57
+ jobs: [],
58
+ resultUrls: [],
59
+ error: null,
60
+ createdAt: Date.now(),
61
+ updatedAt: Date.now()
62
+ };
63
+ this._projects.set(id, project);
64
+ const type = params.type ?? 'image';
65
+ if (type === 'image') {
66
+ await this._uploadImageRefs(id, params);
67
+ }
68
+ else if (type === 'video') {
69
+ await this._uploadVideoRefs(id, params);
70
+ }
71
+ const message = createJobRequestMessage(id, params);
72
+ await this._client.socket.send('jobRequest', message);
73
+ this._notifyChanged(project);
74
+ return project;
75
+ }
76
+ async _uploadImageRefs(projectId, params) {
77
+ if (params.startingImage) {
78
+ await this._uploadMedia(projectId, 'startingImage', params.startingImage);
79
+ }
80
+ if (params.contextImages && params.contextImages.length) {
81
+ const max = getMaxContextImages(params.modelId);
82
+ if (params.contextImages.length > max) {
83
+ throw new Error(`Model ${params.modelId} accepts at most ${max} context images (got ${params.contextImages.length})`);
84
+ }
85
+ await Promise.all(params.contextImages.map((img, idx) => this._uploadMedia(projectId, `contextImage${idx + 1}`, img)));
86
+ }
87
+ if (params.controlNet?.image) {
88
+ await this._uploadMedia(projectId, 'cnImage', params.controlNet.image);
89
+ }
90
+ }
91
+ async _uploadVideoRefs(projectId, params) {
92
+ const uploads = [];
93
+ if (params.referenceImage) {
94
+ uploads.push(this._uploadMedia(projectId, 'referenceImage', params.referenceImage));
95
+ }
96
+ if (params.referenceImageEnd) {
97
+ uploads.push(this._uploadMedia(projectId, 'referenceImageEnd', params.referenceImageEnd));
98
+ }
99
+ if (params.referenceAudio) {
100
+ uploads.push(this._uploadMedia(projectId, 'referenceAudio', params.referenceAudio));
101
+ }
102
+ if (params.referenceVideo) {
103
+ uploads.push(this._uploadMedia(projectId, 'referenceVideo', params.referenceVideo));
104
+ }
105
+ if (uploads.length)
106
+ await Promise.all(uploads);
107
+ }
108
+ async _uploadMedia(projectId, type, media) {
109
+ const imageId = getUUID();
110
+ const { body, contentType } = await toFetchBody(media);
111
+ const presignedUrl = await this._getUploadUrl({
112
+ imageId,
113
+ jobId: projectId,
114
+ type,
115
+ ...(contentType ? { contentType } : {})
116
+ });
117
+ const headers = {};
118
+ if (contentType)
119
+ headers['Content-Type'] = contentType;
120
+ const res = await fetch(presignedUrl, {
121
+ method: 'PUT',
122
+ headers,
123
+ body
124
+ });
125
+ if (!res.ok) {
126
+ throw new ApiError(res.status, {
127
+ status: 'error',
128
+ errorCode: 0,
129
+ message: `Failed to upload ${type} (HTTP ${res.status})`
130
+ });
131
+ }
132
+ return imageId;
133
+ }
134
+ async _getUploadUrl(params) {
135
+ const res = await this._client.socketRest.get('/v1/image/uploadUrl', params);
136
+ const d = res.data;
137
+ return typeof d === 'string' ? d : d.url;
138
+ }
139
+ /** Get the cached snapshot for a project, or undefined if unknown. */
140
+ get(projectId) {
141
+ return this._projects.get(projectId.toUpperCase());
142
+ }
143
+ /**
144
+ * Fetch a project's current state from REST and cache it.
145
+ *
146
+ * Use this on cold launch when you have a persisted project ID but no
147
+ * in-memory snapshot (e.g., the app was killed mid-generation). The server
148
+ * returns the latest known state; if the project is still in flight, the
149
+ * SDK will keep updating the snapshot via socket events.
150
+ *
151
+ * @param projectId Server project ID.
152
+ * @param paramsOverride Optional. The original ProjectParams used to create
153
+ * the project. The REST response only includes a subset of generation
154
+ * settings; pass the original params if you persisted them (e.g., in MMKV)
155
+ * so the returned snapshot's `params` field is fully populated.
156
+ */
157
+ async fetch(projectId, paramsOverride) {
158
+ const id = projectId.toUpperCase();
159
+ const res = await this._client.rest.get(`/v1/projects/${id}`);
160
+ const project = rawProjectToProject(res.data, paramsOverride);
161
+ this._projects.set(project.id, project);
162
+ this._notifyChanged(project);
163
+ return project;
164
+ }
165
+ /** Subscribe to changes for a specific project. Returns an unsubscribe function. */
166
+ subscribe(projectId, listener) {
167
+ const id = projectId.toUpperCase();
168
+ let set = this._subscribers.get(id);
169
+ if (!set) {
170
+ set = new Set();
171
+ this._subscribers.set(id, set);
172
+ }
173
+ set.add(listener);
174
+ return () => {
175
+ const current = this._subscribers.get(id);
176
+ if (!current)
177
+ return;
178
+ current.delete(listener);
179
+ if (current.size === 0)
180
+ this._subscribers.delete(id);
181
+ };
182
+ }
183
+ /**
184
+ * Resolve when the project reaches a terminal state. On success, returns the
185
+ * downloadable result URLs (fetched from the server). On failure or cancel,
186
+ * rejects with an Error describing the reason.
187
+ */
188
+ async waitForCompletion(projectId) {
189
+ const id = projectId.toUpperCase();
190
+ const project = this._projects.get(id);
191
+ if (!project) {
192
+ throw new Error(`Project ${projectId} is not known to this client`);
193
+ }
194
+ if (project.status === 'completed') {
195
+ return project.resultUrls.length ? project.resultUrls : this._fetchResultUrls(project);
196
+ }
197
+ if (project.status === 'failed' || project.status === 'canceled') {
198
+ throw new Error(project.error?.message || `Project ${project.status}`);
199
+ }
200
+ return new Promise((resolve, reject) => {
201
+ const unsubscribe = this.subscribe(id, (p) => {
202
+ if (p.status === 'completed') {
203
+ unsubscribe();
204
+ if (p.resultUrls.length)
205
+ resolve(p.resultUrls);
206
+ else
207
+ this._fetchResultUrls(p).then(resolve).catch(reject);
208
+ }
209
+ else if (p.status === 'failed' || p.status === 'canceled') {
210
+ unsubscribe();
211
+ reject(new Error(p.error?.message || `Project ${p.status}`));
212
+ }
213
+ });
214
+ });
215
+ }
216
+ /** Request a download URL for a specific job's result image. */
217
+ async getResultUrl(projectId, jobId) {
218
+ const res = await this._client.socketRest.get(`/v1/image/downloadUrl`, { projectId: projectId.toUpperCase(), jobId: jobId.toUpperCase(), type: 'complete' });
219
+ const d = res.data;
220
+ return typeof d === 'string' ? d : d.url;
221
+ }
222
+ /**
223
+ * Request cancellation of a project. Server confirms via
224
+ * `artistCancelConfirmation`; the project's status flips to 'canceled' if
225
+ * accepted, otherwise stays in its current state.
226
+ */
227
+ async cancel(projectId) {
228
+ const id = projectId.toUpperCase();
229
+ await this._client.socket.send('jobError', {
230
+ jobID: id,
231
+ error: 'artistCanceled',
232
+ error_message: 'Artist Cancelled Job',
233
+ isFromWorker: false
234
+ });
235
+ }
236
+ // ===========================================================================
237
+ // Internal: event wiring
238
+ // ===========================================================================
239
+ _wireSocketHandlers() {
240
+ const s = this._client.socket;
241
+ s.on('jobStarted', (e) => this._onJobStarted(e));
242
+ s.on('jobInitiatingModel', (e) => this._onJobInitiatingModel(e));
243
+ s.on('jobLifecycleCompleted', (e) => this._onJobLifecycleCompleted(e));
244
+ s.on('jobProgress', (e) => this._onJobProgress(e));
245
+ s.on('jobResult', (e) => this._onJobResult(e));
246
+ s.on('jobError', (e) => this._onJobError(e));
247
+ s.on('jobETA', (e) => this._onJobETA(e));
248
+ s.on('artistCancelConfirmation', (e) => this._onCancelConfirmation(e));
249
+ }
250
+ _onJobStarted(e) {
251
+ const project = this._projects.get(e.projectId);
252
+ if (!project)
253
+ return;
254
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
255
+ ...job,
256
+ status: 'processing',
257
+ workerName: e.workerName
258
+ }));
259
+ this._setStatusIfPending(next, 'processing');
260
+ this._notifyChanged(next);
261
+ }
262
+ _onJobInitiatingModel(e) {
263
+ const project = this._projects.get(e.projectId);
264
+ if (!project)
265
+ return;
266
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
267
+ ...job,
268
+ status: 'initiatingModel'
269
+ }));
270
+ this._setStatusIfPending(next, 'processing');
271
+ this._notifyChanged(next);
272
+ }
273
+ _onJobLifecycleCompleted(e) {
274
+ // jobState.type === 'jobCompleted' is the lifecycle marker from server.
275
+ // The real result data arrives via jobResult; we just ensure the job is
276
+ // marked completed here if it wasn't already.
277
+ const project = this._projects.get(e.projectId);
278
+ if (!project)
279
+ return;
280
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
281
+ ...job,
282
+ status: job.status === 'failed' ? 'failed' : 'completed',
283
+ progress: 1
284
+ }));
285
+ this._maybeFinalizeProject(next);
286
+ }
287
+ _onJobProgress(e) {
288
+ const project = this._projects.get(e.projectId);
289
+ if (!project)
290
+ return;
291
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
292
+ ...job,
293
+ status: 'processing',
294
+ progress: e.progress,
295
+ step: e.step,
296
+ stepCount: e.stepCount
297
+ }));
298
+ this._setStatusIfPending(next, 'processing');
299
+ next.progress = this._computeOverallProgress(next.jobs);
300
+ this._notifyChanged(next);
301
+ this.emit('progress', { project: next, jobId: e.jobId });
302
+ }
303
+ _onJobResult(e) {
304
+ const project = this._projects.get(e.projectId);
305
+ if (!project)
306
+ return;
307
+ if (e.userCanceled) {
308
+ const error = {
309
+ code: 5004,
310
+ originalCode: 'artistCanceled',
311
+ message: 'Artist cancelled the job'
312
+ };
313
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
314
+ ...job,
315
+ status: 'canceled',
316
+ error
317
+ }));
318
+ this._maybeFinalizeProject(next);
319
+ return;
320
+ }
321
+ if (e.triggeredNSFWFilter) {
322
+ const error = {
323
+ code: 5006,
324
+ originalCode: 'sensitiveContent',
325
+ message: 'NSFW filter triggered'
326
+ };
327
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
328
+ ...job,
329
+ status: 'failed',
330
+ isNSFW: true,
331
+ seed: e.seed,
332
+ error
333
+ }));
334
+ this._maybeFinalizeProject(next);
335
+ return;
336
+ }
337
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
338
+ ...job,
339
+ status: 'completed',
340
+ progress: 1,
341
+ seed: e.seed
342
+ }));
343
+ this._maybeFinalizeProject(next);
344
+ }
345
+ _onJobError(e) {
346
+ const project = this._projects.get(e.projectId);
347
+ if (!project)
348
+ return;
349
+ const error = {
350
+ code: 5000,
351
+ originalCode: e.rawCode,
352
+ message: e.message
353
+ };
354
+ if (e.jobId) {
355
+ const next = this._withJobMutation(project, e.jobId, (job) => ({
356
+ ...job,
357
+ status: 'failed',
358
+ error
359
+ }));
360
+ this._maybeFinalizeProject(next);
361
+ return;
362
+ }
363
+ // Project-level error
364
+ const next = {
365
+ ...project,
366
+ status: 'failed',
367
+ error,
368
+ updatedAt: Date.now()
369
+ };
370
+ this._projects.set(project.id, next);
371
+ this._notifyChanged(next);
372
+ this.emit('failed', next);
373
+ this._scheduleGC(next.id);
374
+ }
375
+ _onJobETA(e) {
376
+ const project = this._projects.get(e.projectId);
377
+ if (!project)
378
+ return;
379
+ const next = { ...project, eta: e.etaSeconds, updatedAt: Date.now() };
380
+ this._projects.set(project.id, next);
381
+ this._notifyChanged(next);
382
+ }
383
+ _onCancelConfirmation(e) {
384
+ const project = this._projects.get(e.projectId);
385
+ if (!project)
386
+ return;
387
+ if (!e.didCancel) {
388
+ this._client.logger.warn(`Cancel request for ${e.projectId} was rejected: ${e.errorMessage || 'unknown reason'}`);
389
+ return;
390
+ }
391
+ const next = {
392
+ ...project,
393
+ status: 'canceled',
394
+ error: { code: 5004, originalCode: 'artistCanceled', message: 'Artist canceled project' },
395
+ updatedAt: Date.now()
396
+ };
397
+ this._projects.set(project.id, next);
398
+ this._notifyChanged(next);
399
+ this.emit('failed', next);
400
+ this._scheduleGC(next.id);
401
+ }
402
+ // ===========================================================================
403
+ // Internal: state machinery
404
+ // ===========================================================================
405
+ _withJobMutation(project, jobId, mutate) {
406
+ if (!jobId) {
407
+ // Some events (jobStarted before imgID is assigned) carry no jobId. We
408
+ // don't synthesize a job in that case; just bump the updatedAt.
409
+ const next = { ...project, updatedAt: Date.now() };
410
+ this._projects.set(project.id, next);
411
+ return next;
412
+ }
413
+ const existingIdx = project.jobs.findIndex((j) => j.id === jobId);
414
+ const existing = existingIdx >= 0 ? project.jobs[existingIdx] : this._emptyJob(project.id, jobId);
415
+ const updated = mutate(existing);
416
+ const jobs = existingIdx >= 0
417
+ ? project.jobs.map((j, i) => (i === existingIdx ? updated : j))
418
+ : [...project.jobs, updated];
419
+ const next = { ...project, jobs, updatedAt: Date.now() };
420
+ this._projects.set(project.id, next);
421
+ return next;
422
+ }
423
+ _emptyJob(projectId, jobId) {
424
+ return {
425
+ id: jobId,
426
+ projectId,
427
+ status: 'pending',
428
+ progress: 0,
429
+ step: 0,
430
+ stepCount: 0,
431
+ seed: null,
432
+ resultUrl: null,
433
+ previewUrl: null,
434
+ isNSFW: false,
435
+ workerName: null,
436
+ error: null
437
+ };
438
+ }
439
+ _setStatusIfPending(project, status) {
440
+ if (project.status !== 'pending')
441
+ return;
442
+ const next = { ...project, status, updatedAt: Date.now() };
443
+ this._projects.set(project.id, next);
444
+ }
445
+ _computeOverallProgress(jobs) {
446
+ if (!jobs.length)
447
+ return 0;
448
+ const sum = jobs.reduce((acc, j) => acc + (j.progress || 0), 0);
449
+ return sum / jobs.length;
450
+ }
451
+ _maybeFinalizeProject(project) {
452
+ const expected = Math.max(1, project.params.numberOfMedia);
453
+ const knownJobs = project.jobs.length;
454
+ const completedJobs = project.jobs.filter((j) => j.status === 'completed').length;
455
+ const allKnownTerminal = knownJobs > 0 && project.jobs.every((j) => TERMINAL_JOB_STATUSES.includes(j.status));
456
+ if (knownJobs >= expected && allKnownTerminal) {
457
+ const anyCompleted = completedJobs > 0;
458
+ const next = {
459
+ ...project,
460
+ status: anyCompleted ? 'completed' : 'failed',
461
+ progress: this._computeOverallProgress(project.jobs),
462
+ error: anyCompleted
463
+ ? null
464
+ : (project.jobs.find((j) => j.error)?.error ?? {
465
+ code: 5000,
466
+ message: 'All jobs failed'
467
+ }),
468
+ updatedAt: Date.now()
469
+ };
470
+ this._projects.set(project.id, next);
471
+ this._notifyChanged(next);
472
+ if (next.status === 'completed') {
473
+ this.emit('completed', next);
474
+ }
475
+ else {
476
+ this.emit('failed', next);
477
+ }
478
+ this._scheduleGC(next.id);
479
+ return;
480
+ }
481
+ // Not terminal yet — just notify of the in-progress change.
482
+ const nextProgress = this._computeOverallProgress(project.jobs);
483
+ const next = { ...project, progress: nextProgress, updatedAt: Date.now() };
484
+ this._projects.set(project.id, next);
485
+ this._notifyChanged(next);
486
+ }
487
+ async _fetchResultUrls(project) {
488
+ const urls = [];
489
+ for (const job of project.jobs) {
490
+ if (job.status !== 'completed')
491
+ continue;
492
+ try {
493
+ const url = await this.getResultUrl(project.id, job.id);
494
+ urls.push(url);
495
+ // Update cached snapshot with the resolved URL
496
+ const cached = this._projects.get(project.id);
497
+ if (cached) {
498
+ const jobs = cached.jobs.map((j) => (j.id === job.id ? { ...j, resultUrl: url } : j));
499
+ const next = { ...cached, jobs, resultUrls: urls.slice() };
500
+ this._projects.set(project.id, next);
501
+ this._notifyChanged(next);
502
+ }
503
+ }
504
+ catch (e) {
505
+ this._client.logger.warn(`Failed to fetch result URL for job ${job.id}:`, e);
506
+ }
507
+ }
508
+ return urls;
509
+ }
510
+ _notifyChanged(project) {
511
+ const subs = this._subscribers.get(project.id);
512
+ if (subs) {
513
+ for (const fn of subs)
514
+ fn(project);
515
+ }
516
+ this.emit('changed', project);
517
+ }
518
+ _scheduleGC(projectId) {
519
+ const existing = this._gcTimers.get(projectId);
520
+ if (existing)
521
+ clearTimeout(existing);
522
+ const timer = setTimeout(() => {
523
+ this._projects.delete(projectId);
524
+ this._subscribers.delete(projectId);
525
+ this._gcTimers.delete(projectId);
526
+ }, GC_DELAY_MS);
527
+ this._gcTimers.set(projectId, timer);
528
+ }
529
+ }
530
+ export default ProjectsApi;
531
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Projects/index.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAYhE,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AACzD,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAWhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAc,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAalE,MAAM,yBAAyB,GAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACvF,MAAM,qBAAqB,GAAgB,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC/E,MAAM,WAAW,GAAG,KAAM,CAAC;AAE3B,MAAM,WAAY,SAAQ,iBAAoC;IAM5D,YAAY,MAAiB;QAC3B,KAAK,EAAE,CAAC;QALF,cAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;QACvC,iBAAY,GAAG,IAAI,GAAG,EAAqC,CAAC;QAC5D,cAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;QAInE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,kBAAkB,CAAC,OAAsB;QAC7C,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAC3C,0BAA0B,GAAG,SAAS,CACvC,CAAC;QACF,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,IAAI,GAAQ,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAwB,CAAC;QACzD,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,MAA0B,CAAC;QAC/E,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAY;YACvB,EAAE;YACF,MAAM;YACN,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;YACX,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC;QACpC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAA4B,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAA4B,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,MAA0B;QAC1E,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,SAAS,MAAM,CAAC,OAAO,oBAAoB,GAAG,wBAAwB,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CACrG,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACpC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAC5D,CACF,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,MAA0B;QAC1E,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,IAAY,EAAE,KAAiB;QAC3E,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;YAC5C,OAAO;YACP,KAAK,EAAE,SAAS;YAChB,IAAI;YACJ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,WAAW;YAAE,OAAO,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBAC7B,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,oBAAoB,IAAI,UAAU,GAAG,CAAC,MAAM,GAAG;aACzD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAK3B;QACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAC3C,qBAAqB,EACrB,MAAM,CACP,CAAC;QACF,MAAM,CAAC,GAAQ,GAAG,CAAC,IAAI,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED,sEAAsE;IACtE,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,cAA8B;QAC3D,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAA0B,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,SAAS,CAAC,SAAiB,EAAE,QAAoC;QAC/D,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,8BAA8B,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC7B,WAAW,EAAE,CAAC;oBACd,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM;wBAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;;wBAC1C,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;qBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC5D,WAAW,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,KAAa;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAC3C,uBAAuB,EACvB,EAAE,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CACrF,CAAC;QACF,MAAM,CAAC,GAAQ,GAAG,CAAC,IAAI,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE;YACzC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,gBAAgB;YACvB,aAAa,EAAE,sBAAsB;YACrC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,yBAAyB;IACzB,8EAA8E;IAEtE,mBAAmB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAEO,aAAa,CAAC,CAAkB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG,GAAG;YACN,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,qBAAqB,CAAC,CAA0B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG,GAAG;YACN,MAAM,EAAE,iBAAiB;SAC1B,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,wBAAwB,CAAC,CAA6B;QAC5D,wEAAwE;QACxE,wEAAwE;QACxE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG,GAAG;YACN,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;YACxD,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,cAAc,CAAC,CAAmB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG,GAAG;YACN,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,YAAY,CAAC,CAAiB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,KAAK,GAAc;gBACvB,IAAI,EAAE,IAAI;gBACV,YAAY,EAAE,gBAAgB;gBAC9B,OAAO,EAAE,0BAA0B;aACpC,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7D,GAAG,GAAG;gBACN,MAAM,EAAE,UAAU;gBAClB,KAAK;aACN,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAc;gBACvB,IAAI,EAAE,IAAI;gBACV,YAAY,EAAE,kBAAkB;gBAChC,OAAO,EAAE,uBAAuB;aACjC,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7D,GAAG,GAAG;gBACN,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK;aACN,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG,GAAG;YACN,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,CAAgB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,CAAC,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC;QACF,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7D,GAAG,GAAG;gBACN,MAAM,EAAE,QAAQ;gBAChB,KAAK;aACN,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,sBAAsB;QACtB,MAAM,IAAI,GAAY;YACpB,GAAG,OAAO;YACV,MAAM,EAAE,QAAQ;YAChB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEO,SAAS,CAAC,CAAc;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAY,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,qBAAqB,CAAC,CAAgC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CACtB,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,YAAY,IAAI,gBAAgB,EAAE,CACxF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAY;YACpB,GAAG,OAAO;YACV,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,yBAAyB,EAAE;YACzF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,8EAA8E;IAC9E,4BAA4B;IAC5B,8EAA8E;IAEtE,gBAAgB,CACtB,OAAgB,EAChB,KAAoB,EACpB,MAAyB;QAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,uEAAuE;YACvE,gEAAgE;YAChE,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QAClE,MAAM,QAAQ,GACZ,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,IAAI,GACR,WAAW,IAAI,CAAC;YACd,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAY,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,SAAiB,EAAE,KAAa;QAChD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,OAAgB,EAAE,MAAqB;QACjE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACzC,MAAM,IAAI,GAAY,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAEO,uBAAuB,CAAC,IAAW;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEO,qBAAqB,CAAC,OAAgB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,gBAAgB,GACpB,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvF,IAAI,SAAS,IAAI,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC;YACvC,MAAM,IAAI,GAAY;gBACpB,GAAG,OAAO;gBACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;gBAC7C,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC;gBACpD,KAAK,EAAE,YAAY;oBACjB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI;wBAC3C,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,iBAAiB;qBAC3B,CAAC;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,4DAA4D;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,IAAI,GAAY,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACpF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAgB;QAC7C,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;gBAAE,SAAS;YACzC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACf,+CAA+C;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtF,MAAM,IAAI,GAAY,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oBACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,OAAgB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,EAAE,IAAI,IAAI;gBAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEO,WAAW,CAAC,SAAiB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ;YAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC,EAAE,WAAW,CAAC,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;CACF;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Translate RawProject / RawJob shapes returned by the /v1/projects/:id
3
+ * endpoint into our public Project / Job types.
4
+ *
5
+ * Same wire-quirk pattern as the socket normalizer: the server uses `imgID`
6
+ * to mean "job id" and its `status` enum uses different values from ours.
7
+ * Everything gets translated here so the rest of the SDK only sees clean
8
+ * public shapes.
9
+ */
10
+ /* === Mappers === */
11
+ const PROJECT_STATUS_MAP = {
12
+ pending: 'pending',
13
+ active: 'queued',
14
+ assigned: 'queued',
15
+ progress: 'processing',
16
+ errored: 'failed',
17
+ completed: 'completed',
18
+ cancelled: 'canceled'
19
+ };
20
+ const JOB_STATUS_MAP = {
21
+ pending: 'pending',
22
+ jobStarted: 'processing',
23
+ initiatingModel: 'initiatingModel',
24
+ jobProgress: 'processing',
25
+ jobCompleted: 'completed',
26
+ jobError: 'failed',
27
+ cancelled: 'canceled'
28
+ };
29
+ function rawJobToJob(projectId, raw) {
30
+ return {
31
+ // Wire quirk: imgID is the job ID. Fall back to raw.id for older payloads.
32
+ id: (raw.imgID ?? raw.id ?? '').toUpperCase(),
33
+ projectId,
34
+ status: JOB_STATUS_MAP[raw.status] ?? 'pending',
35
+ progress: raw.status === 'jobCompleted' ? 1 : 0,
36
+ step: raw.performedSteps ?? 0,
37
+ stepCount: 0,
38
+ seed: raw.seedUsed ?? null,
39
+ resultUrl: raw.resultUrl ?? null,
40
+ previewUrl: null,
41
+ isNSFW: !!raw.triggeredNSFWFilter,
42
+ workerName: raw.worker?.username ?? raw.worker?.name ?? null,
43
+ error: null
44
+ };
45
+ }
46
+ /**
47
+ * Build a Project snapshot from the REST GET /v1/projects/:id payload.
48
+ * `params` is best-effort reconstructed from the few fields the server
49
+ * returns — most generation-time settings (prompt, model options, etc.)
50
+ * are NOT in the REST response, so callers that need the full params
51
+ * should pass them in via `paramsOverride` (e.g., from local storage).
52
+ */
53
+ export function rawProjectToProject(raw, paramsOverride) {
54
+ const projectId = raw.id.toUpperCase();
55
+ const allJobs = [...(raw.workerJobs ?? []), ...(raw.completedWorkerJobs ?? [])];
56
+ const jobsById = new Map();
57
+ for (const rawJob of allJobs) {
58
+ const job = rawJobToJob(projectId, rawJob);
59
+ if (!jobsById.has(job.id) || job.status === 'completed') {
60
+ jobsById.set(job.id, job);
61
+ }
62
+ }
63
+ const jobs = Array.from(jobsById.values());
64
+ const status = PROJECT_STATUS_MAP[raw.status] ?? 'pending';
65
+ const resultUrls = jobs.map((j) => j.resultUrl).filter((u) => !!u);
66
+ const params = paramsOverride ?? {
67
+ type: 'image',
68
+ modelId: raw.model?.id ?? '',
69
+ positivePrompt: '',
70
+ numberOfMedia: raw.imageCount || 1,
71
+ ...(raw.network ? { network: raw.network } : {})
72
+ };
73
+ return {
74
+ id: projectId,
75
+ params,
76
+ status,
77
+ progress: jobs.length ? jobs.reduce((a, j) => a + j.progress, 0) / jobs.length : 0,
78
+ eta: null,
79
+ jobs,
80
+ resultUrls,
81
+ error: null,
82
+ createdAt: raw.createTime ?? Date.now(),
83
+ updatedAt: raw.updateTime ?? Date.now()
84
+ };
85
+ }
86
+ //# sourceMappingURL=restNormalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restNormalize.js","sourceRoot":"","sources":["../../../src/Projects/restNormalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Projects/types.ts"],"names":[],"mappings":""}