@unclick/mcp-server 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +139 -153
  2. package/dist/airtable-tool.d.ts +2 -0
  3. package/dist/airtable-tool.d.ts.map +1 -0
  4. package/dist/airtable-tool.js +154 -0
  5. package/dist/airtable-tool.js.map +1 -0
  6. package/dist/anthropic-tool.d.ts +3 -0
  7. package/dist/anthropic-tool.d.ts.map +1 -0
  8. package/dist/anthropic-tool.js +123 -0
  9. package/dist/anthropic-tool.js.map +1 -0
  10. package/dist/asana-tool.d.ts +8 -0
  11. package/dist/asana-tool.d.ts.map +1 -0
  12. package/dist/asana-tool.js +218 -0
  13. package/dist/asana-tool.js.map +1 -0
  14. package/dist/calendly-tool.d.ts +6 -0
  15. package/dist/calendly-tool.d.ts.map +1 -0
  16. package/dist/calendly-tool.js +182 -0
  17. package/dist/calendly-tool.js.map +1 -0
  18. package/dist/clickup-tool.d.ts +2 -0
  19. package/dist/clickup-tool.d.ts.map +1 -0
  20. package/dist/clickup-tool.js +153 -0
  21. package/dist/clickup-tool.js.map +1 -0
  22. package/dist/connectors/figma.d.ts +3 -0
  23. package/dist/connectors/figma.d.ts.map +1 -0
  24. package/dist/connectors/figma.js +18 -0
  25. package/dist/connectors/figma.js.map +1 -0
  26. package/dist/connectors/index.d.ts +3 -1
  27. package/dist/connectors/index.d.ts.map +1 -1
  28. package/dist/connectors/index.js +5 -1
  29. package/dist/connectors/index.js.map +1 -1
  30. package/dist/connectors/line.d.ts +3 -0
  31. package/dist/connectors/line.d.ts.map +1 -0
  32. package/dist/connectors/line.js +18 -0
  33. package/dist/connectors/line.js.map +1 -0
  34. package/dist/ebay-tool.d.ts +5 -0
  35. package/dist/ebay-tool.d.ts.map +1 -0
  36. package/dist/ebay-tool.js +179 -0
  37. package/dist/ebay-tool.js.map +1 -0
  38. package/dist/elevenlabs-tool.d.ts +6 -0
  39. package/dist/elevenlabs-tool.d.ts.map +1 -0
  40. package/dist/elevenlabs-tool.js +166 -0
  41. package/dist/elevenlabs-tool.js.map +1 -0
  42. package/dist/etsy-tool.d.ts +6 -0
  43. package/dist/etsy-tool.d.ts.map +1 -0
  44. package/dist/etsy-tool.js +125 -0
  45. package/dist/etsy-tool.js.map +1 -0
  46. package/dist/exchangerate-tool.d.ts +5 -0
  47. package/dist/exchangerate-tool.d.ts.map +1 -0
  48. package/dist/exchangerate-tool.js +139 -0
  49. package/dist/exchangerate-tool.js.map +1 -0
  50. package/dist/figma-tool.d.ts +8 -0
  51. package/dist/figma-tool.d.ts.map +1 -0
  52. package/dist/figma-tool.js +231 -0
  53. package/dist/figma-tool.js.map +1 -0
  54. package/dist/gdelt-tool.d.ts +5 -0
  55. package/dist/gdelt-tool.d.ts.map +1 -0
  56. package/dist/gdelt-tool.js +177 -0
  57. package/dist/gdelt-tool.js.map +1 -0
  58. package/dist/github-tool.d.ts +2 -0
  59. package/dist/github-tool.d.ts.map +1 -0
  60. package/dist/github-tool.js +165 -0
  61. package/dist/github-tool.js.map +1 -0
  62. package/dist/gitlab-tool.d.ts +2 -0
  63. package/dist/gitlab-tool.d.ts.map +1 -0
  64. package/dist/gitlab-tool.js +127 -0
  65. package/dist/gitlab-tool.js.map +1 -0
  66. package/dist/igdb-tool.d.ts +6 -0
  67. package/dist/igdb-tool.d.ts.map +1 -0
  68. package/dist/igdb-tool.js +140 -0
  69. package/dist/igdb-tool.js.map +1 -0
  70. package/dist/line-tool.d.ts +7 -0
  71. package/dist/line-tool.d.ts.map +1 -0
  72. package/dist/line-tool.js +188 -0
  73. package/dist/line-tool.js.map +1 -0
  74. package/dist/linear-tool.d.ts +2 -0
  75. package/dist/linear-tool.d.ts.map +1 -0
  76. package/dist/linear-tool.js +186 -0
  77. package/dist/linear-tool.js.map +1 -0
  78. package/dist/monday-tool.d.ts +7 -0
  79. package/dist/monday-tool.d.ts.map +1 -0
  80. package/dist/monday-tool.js +206 -0
  81. package/dist/monday-tool.js.map +1 -0
  82. package/dist/openai-tool.d.ts +6 -0
  83. package/dist/openai-tool.d.ts.map +1 -0
  84. package/dist/openai-tool.js +227 -0
  85. package/dist/openai-tool.js.map +1 -0
  86. package/dist/paypal-tool.d.ts +3 -0
  87. package/dist/paypal-tool.d.ts.map +1 -0
  88. package/dist/paypal-tool.js +157 -0
  89. package/dist/paypal-tool.js.map +1 -0
  90. package/dist/pinterest-tool.d.ts +7 -0
  91. package/dist/pinterest-tool.d.ts.map +1 -0
  92. package/dist/pinterest-tool.js +219 -0
  93. package/dist/pinterest-tool.js.map +1 -0
  94. package/dist/plaid-tool.d.ts +6 -0
  95. package/dist/plaid-tool.d.ts.map +1 -0
  96. package/dist/plaid-tool.js +149 -0
  97. package/dist/plaid-tool.js.map +1 -0
  98. package/dist/postman-tool.d.ts +2 -0
  99. package/dist/postman-tool.d.ts.map +1 -0
  100. package/dist/postman-tool.js +92 -0
  101. package/dist/postman-tool.js.map +1 -0
  102. package/dist/pushover-tool.d.ts +6 -0
  103. package/dist/pushover-tool.d.ts.map +1 -0
  104. package/dist/pushover-tool.js +146 -0
  105. package/dist/pushover-tool.js.map +1 -0
  106. package/dist/quickbooks-tool.d.ts +5 -0
  107. package/dist/quickbooks-tool.d.ts.map +1 -0
  108. package/dist/quickbooks-tool.js +160 -0
  109. package/dist/quickbooks-tool.js.map +1 -0
  110. package/dist/replicate-tool.d.ts +7 -0
  111. package/dist/replicate-tool.d.ts.map +1 -0
  112. package/dist/replicate-tool.js +172 -0
  113. package/dist/replicate-tool.js.map +1 -0
  114. package/dist/sentry-tool.d.ts +2 -0
  115. package/dist/sentry-tool.d.ts.map +1 -0
  116. package/dist/sentry-tool.js +123 -0
  117. package/dist/sentry-tool.js.map +1 -0
  118. package/dist/speedrun-tool.d.ts +6 -0
  119. package/dist/speedrun-tool.d.ts.map +1 -0
  120. package/dist/speedrun-tool.js +192 -0
  121. package/dist/speedrun-tool.js.map +1 -0
  122. package/dist/spotify-tool.d.ts +8 -0
  123. package/dist/spotify-tool.d.ts.map +1 -0
  124. package/dist/spotify-tool.js +274 -0
  125. package/dist/spotify-tool.js.map +1 -0
  126. package/dist/square-tool.d.ts +5 -0
  127. package/dist/square-tool.d.ts.map +1 -0
  128. package/dist/square-tool.js +133 -0
  129. package/dist/square-tool.js.map +1 -0
  130. package/dist/stability-tool.d.ts +5 -0
  131. package/dist/stability-tool.d.ts.map +1 -0
  132. package/dist/stability-tool.js +190 -0
  133. package/dist/stability-tool.js.map +1 -0
  134. package/dist/steam-tool.d.ts +6 -0
  135. package/dist/steam-tool.d.ts.map +1 -0
  136. package/dist/steam-tool.js +222 -0
  137. package/dist/steam-tool.js.map +1 -0
  138. package/dist/stripe-tool.d.ts +7 -0
  139. package/dist/stripe-tool.d.ts.map +1 -0
  140. package/dist/stripe-tool.js +181 -0
  141. package/dist/stripe-tool.js.map +1 -0
  142. package/dist/tiktok-tool.d.ts +4 -0
  143. package/dist/tiktok-tool.d.ts.map +1 -0
  144. package/dist/tiktok-tool.js +129 -0
  145. package/dist/tiktok-tool.js.map +1 -0
  146. package/dist/toilets-tool.js +2 -2
  147. package/dist/tool-wiring.d.ts +4066 -18
  148. package/dist/tool-wiring.d.ts.map +1 -1
  149. package/dist/tool-wiring.js +2601 -18
  150. package/dist/tool-wiring.js.map +1 -1
  151. package/dist/trello-tool.d.ts +2 -0
  152. package/dist/trello-tool.d.ts.map +1 -0
  153. package/dist/trello-tool.js +166 -0
  154. package/dist/trello-tool.js.map +1 -0
  155. package/dist/twilio-tool.d.ts +8 -0
  156. package/dist/twilio-tool.d.ts.map +1 -0
  157. package/dist/twilio-tool.js +243 -0
  158. package/dist/twilio-tool.js.map +1 -0
  159. package/dist/whatsapp-tool.d.ts +6 -0
  160. package/dist/whatsapp-tool.d.ts.map +1 -0
  161. package/dist/whatsapp-tool.js +200 -0
  162. package/dist/whatsapp-tool.js.map +1 -0
  163. package/dist/woocommerce-tool.d.ts +4 -0
  164. package/dist/woocommerce-tool.d.ts.map +1 -0
  165. package/dist/woocommerce-tool.js +140 -0
  166. package/dist/woocommerce-tool.js.map +1 -0
  167. package/dist/youtube-tool.d.ts +7 -0
  168. package/dist/youtube-tool.d.ts.map +1 -0
  169. package/dist/youtube-tool.js +196 -0
  170. package/dist/youtube-tool.js.map +1 -0
  171. package/package.json +1 -1
  172. package/server.json +37 -37
  173. package/LICENSE +0 -216
  174. package/dist/cloudflare-worker.d.ts +0 -12
  175. package/dist/cloudflare-worker.d.ts.map +0 -1
  176. package/dist/cloudflare-worker.js +0 -50
  177. package/dist/cloudflare-worker.js.map +0 -1
@@ -0,0 +1,274 @@
1
+ // Spotify Web API integration for the UnClick MCP server.
2
+ // Uses the Spotify Web API via fetch - no external dependencies.
3
+ // Users must supply a Bearer token (access token) from Spotify OAuth.
4
+ const SPOTIFY_API_BASE = "https://api.spotify.com/v1";
5
+ // ─── API helper ───────────────────────────────────────────────────────────────
6
+ async function spotifyGet(token, path, params = {}) {
7
+ const qs = Object.keys(params).length > 0 ? `?${new URLSearchParams(params).toString()}` : "";
8
+ const res = await fetch(`${SPOTIFY_API_BASE}${path}${qs}`, {
9
+ headers: { Authorization: `Bearer ${token}` },
10
+ });
11
+ const data = await res.json();
12
+ if (!res.ok) {
13
+ const err = data.error;
14
+ const msg = err?.message ?? `HTTP ${res.status}`;
15
+ const status = err?.status ? ` (${err.status})` : "";
16
+ throw new Error(`Spotify API error${status}: ${msg}`);
17
+ }
18
+ return data;
19
+ }
20
+ // ─── Auth validation ──────────────────────────────────────────────────────────
21
+ function requireToken(args) {
22
+ const token = String(args.bearer_token ?? "").trim();
23
+ if (!token)
24
+ throw new Error("bearer_token is required. Obtain one via Spotify OAuth at developer.spotify.com.");
25
+ return token;
26
+ }
27
+ // ─── Operations ───────────────────────────────────────────────────────────────
28
+ export async function spotifySearch(args) {
29
+ const token = requireToken(args);
30
+ const q = String(args.query ?? "").trim();
31
+ if (!q)
32
+ throw new Error("query is required.");
33
+ const type = String(args.type ?? "track");
34
+ const limit = Math.min(50, Math.max(1, Number(args.limit ?? 10)));
35
+ const offset = Math.max(0, Number(args.offset ?? 0));
36
+ const market = args.market ? String(args.market) : undefined;
37
+ const validTypes = ["track", "album", "artist", "playlist", "show", "episode"];
38
+ const requestedTypes = type.split(",").map((t) => t.trim());
39
+ const invalid = requestedTypes.filter((t) => !validTypes.includes(t));
40
+ if (invalid.length > 0) {
41
+ throw new Error(`Invalid type(s): ${invalid.join(", ")}. Valid: ${validTypes.join(", ")}.`);
42
+ }
43
+ const params = { q, type, limit: String(limit), offset: String(offset) };
44
+ if (market)
45
+ params.market = market;
46
+ const data = await spotifyGet(token, "/search", params);
47
+ const result = {};
48
+ if (data.tracks) {
49
+ result.tracks = {
50
+ total: data.tracks.total,
51
+ next: data.tracks.next,
52
+ items: data.tracks.items.map((t) => ({
53
+ id: t.id,
54
+ name: t.name,
55
+ artists: t.artists.map((a) => a.name),
56
+ album: t.album?.name,
57
+ duration_ms: t.duration_ms,
58
+ popularity: t.popularity,
59
+ preview_url: t.preview_url,
60
+ spotify_url: t.external_urls.spotify,
61
+ })),
62
+ };
63
+ }
64
+ if (data.albums) {
65
+ result.albums = {
66
+ total: data.albums.total,
67
+ next: data.albums.next,
68
+ items: data.albums.items.map((a) => ({
69
+ id: a.id,
70
+ name: a.name,
71
+ artists: a.artists.map((ar) => ar.name),
72
+ release_date: a.release_date,
73
+ total_tracks: a.total_tracks,
74
+ spotify_url: a.external_urls.spotify,
75
+ })),
76
+ };
77
+ }
78
+ if (data.artists) {
79
+ result.artists = {
80
+ total: data.artists.total,
81
+ next: data.artists.next,
82
+ items: data.artists.items.map((a) => ({
83
+ id: a.id,
84
+ name: a.name,
85
+ genres: a.genres,
86
+ popularity: a.popularity,
87
+ followers: a.followers.total,
88
+ spotify_url: a.external_urls.spotify,
89
+ })),
90
+ };
91
+ }
92
+ if (data.playlists) {
93
+ result.playlists = {
94
+ total: data.playlists.total,
95
+ next: data.playlists.next,
96
+ items: data.playlists.items.map((p) => ({
97
+ id: p.id,
98
+ name: p.name,
99
+ owner: p.owner.display_name,
100
+ tracks_total: p.tracks.total,
101
+ spotify_url: p.external_urls.spotify,
102
+ })),
103
+ };
104
+ }
105
+ return result;
106
+ }
107
+ export async function spotifyGetTrack(args) {
108
+ const token = requireToken(args);
109
+ const trackId = String(args.track_id ?? "").trim();
110
+ if (!trackId)
111
+ throw new Error("track_id is required.");
112
+ const params = {};
113
+ if (args.market)
114
+ params.market = String(args.market);
115
+ const track = await spotifyGet(token, `/tracks/${encodeURIComponent(trackId)}`, params);
116
+ return {
117
+ id: track.id,
118
+ name: track.name,
119
+ artists: track.artists.map((a) => ({ id: a.id, name: a.name })),
120
+ album: track.album ? {
121
+ id: track.album.id,
122
+ name: track.album.name,
123
+ release_date: track.album.release_date,
124
+ type: track.album.album_type,
125
+ } : null,
126
+ duration_ms: track.duration_ms,
127
+ explicit: track.explicit,
128
+ popularity: track.popularity,
129
+ preview_url: track.preview_url,
130
+ track_number: track.track_number,
131
+ spotify_url: track.external_urls.spotify,
132
+ };
133
+ }
134
+ export async function spotifyGetAlbum(args) {
135
+ const token = requireToken(args);
136
+ const albumId = String(args.album_id ?? "").trim();
137
+ if (!albumId)
138
+ throw new Error("album_id is required.");
139
+ const album = await spotifyGet(token, `/albums/${encodeURIComponent(albumId)}`);
140
+ return {
141
+ id: album.id,
142
+ name: album.name,
143
+ type: album.album_type,
144
+ release_date: album.release_date,
145
+ total_tracks: album.total_tracks,
146
+ artists: album.artists.map((a) => ({ id: a.id, name: a.name })),
147
+ label: album.label ?? null,
148
+ popularity: album.popularity ?? null,
149
+ genres: album.genres ?? [],
150
+ image: album.images[0]?.url ?? null,
151
+ spotify_url: album.external_urls.spotify,
152
+ tracks: album.tracks?.items.map((t) => ({
153
+ id: t.id,
154
+ name: t.name,
155
+ duration_ms: t.duration_ms,
156
+ track_number: t.track_number,
157
+ })) ?? [],
158
+ };
159
+ }
160
+ export async function spotifyGetArtist(args) {
161
+ const token = requireToken(args);
162
+ const artistId = String(args.artist_id ?? "").trim();
163
+ if (!artistId)
164
+ throw new Error("artist_id is required.");
165
+ const artist = await spotifyGet(token, `/artists/${encodeURIComponent(artistId)}`);
166
+ return {
167
+ id: artist.id,
168
+ name: artist.name,
169
+ genres: artist.genres,
170
+ popularity: artist.popularity,
171
+ followers: artist.followers.total,
172
+ image: artist.images[0]?.url ?? null,
173
+ spotify_url: artist.external_urls.spotify,
174
+ };
175
+ }
176
+ export async function spotifyGetPlaylist(args) {
177
+ const token = requireToken(args);
178
+ const playlistId = String(args.playlist_id ?? "").trim();
179
+ if (!playlistId)
180
+ throw new Error("playlist_id is required.");
181
+ const params = {};
182
+ if (args.market)
183
+ params.market = String(args.market);
184
+ const pl = await spotifyGet(token, `/playlists/${encodeURIComponent(playlistId)}`, params);
185
+ return {
186
+ id: pl.id,
187
+ name: pl.name,
188
+ description: pl.description,
189
+ public: pl.public,
190
+ owner: pl.owner.display_name,
191
+ followers: pl.followers.total,
192
+ total_tracks: pl.tracks.total,
193
+ image: pl.images[0]?.url ?? null,
194
+ spotify_url: pl.external_urls.spotify,
195
+ tracks: (pl.tracks.items ?? [])
196
+ .filter((item) => item.track !== null)
197
+ .map((item) => ({
198
+ id: item.track.id,
199
+ name: item.track.name,
200
+ artists: item.track.artists.map((a) => a.name),
201
+ duration_ms: item.track.duration_ms,
202
+ })),
203
+ };
204
+ }
205
+ export async function spotifyGetRecommendations(args) {
206
+ const token = requireToken(args);
207
+ const limit = Math.min(100, Math.max(1, Number(args.limit ?? 20)));
208
+ const params = { limit: String(limit) };
209
+ // At least one seed is required
210
+ const seedTracks = String(args.seed_tracks ?? "").trim();
211
+ const seedArtists = String(args.seed_artists ?? "").trim();
212
+ const seedGenres = String(args.seed_genres ?? "").trim();
213
+ if (!seedTracks && !seedArtists && !seedGenres) {
214
+ throw new Error("At least one of seed_tracks, seed_artists, or seed_genres is required.");
215
+ }
216
+ if (seedTracks)
217
+ params.seed_tracks = seedTracks;
218
+ if (seedArtists)
219
+ params.seed_artists = seedArtists;
220
+ if (seedGenres)
221
+ params.seed_genres = seedGenres;
222
+ if (args.market)
223
+ params.market = String(args.market);
224
+ if (args.min_energy !== undefined)
225
+ params.min_energy = String(args.min_energy);
226
+ if (args.max_energy !== undefined)
227
+ params.max_energy = String(args.max_energy);
228
+ if (args.min_tempo !== undefined)
229
+ params.min_tempo = String(args.min_tempo);
230
+ if (args.max_tempo !== undefined)
231
+ params.max_tempo = String(args.max_tempo);
232
+ if (args.target_valence !== undefined)
233
+ params.target_valence = String(args.target_valence);
234
+ if (args.target_danceability !== undefined)
235
+ params.target_danceability = String(args.target_danceability);
236
+ const data = await spotifyGet(token, "/recommendations", params);
237
+ return {
238
+ count: data.tracks.length,
239
+ tracks: data.tracks.map((t) => ({
240
+ id: t.id,
241
+ name: t.name,
242
+ artists: t.artists.map((a) => a.name),
243
+ album: t.album?.name ?? null,
244
+ duration_ms: t.duration_ms,
245
+ popularity: t.popularity,
246
+ preview_url: t.preview_url,
247
+ spotify_url: t.external_urls.spotify,
248
+ })),
249
+ };
250
+ }
251
+ export async function spotifyGetAudioFeatures(args) {
252
+ const token = requireToken(args);
253
+ const trackId = String(args.track_id ?? "").trim();
254
+ if (!trackId)
255
+ throw new Error("track_id is required.");
256
+ const features = await spotifyGet(token, `/audio-features/${encodeURIComponent(trackId)}`);
257
+ return {
258
+ id: features.id,
259
+ danceability: features.danceability,
260
+ energy: features.energy,
261
+ key: features.key,
262
+ loudness: features.loudness,
263
+ mode: features.mode,
264
+ speechiness: features.speechiness,
265
+ acousticness: features.acousticness,
266
+ instrumentalness: features.instrumentalness,
267
+ liveness: features.liveness,
268
+ valence: features.valence,
269
+ tempo: features.tempo,
270
+ time_signature: features.time_signature,
271
+ duration_ms: features.duration_ms,
272
+ };
273
+ }
274
+ //# sourceMappingURL=spotify-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotify-tool.js","sourceRoot":"","sources":["../src/spotify-tool.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,iEAAiE;AACjE,sEAAsE;AAEtE,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAwFtD,iFAAiF;AAEjF,KAAK,UAAU,UAAU,CAAI,KAAa,EAAE,IAAY,EAAE,SAAiC,EAAE;IAC3F,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,GAAG,IAAI,GAAG,EAAE,EAAE,EAAE;QACzD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,KAA4C,CAAC;QAC9D,MAAM,GAAG,GAAI,GAAG,EAAE,OAAkB,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CAAC,IAA6B;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IAChH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA6B;IAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACjG,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAsB,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,MAAM,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI;gBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,MAAM,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;gBACvC,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,GAAG;YACf,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK;gBAC5B,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,SAAS,GAAG;YACjB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;YAC3B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;YACzB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY;gBAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;gBAC5B,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEvD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAe,KAAK,EAAE,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACtG,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACnB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;YAClB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;YACtB,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY;YACtC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC,CAAC,IAAI;QACR,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAe,KAAK,EAAE,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9F,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI;QACnC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO;QACxC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC,CAAC,IAAI,EAAE;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA6B;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAgB,KAAK,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI;QACpC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA6B;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAE7D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAkB,KAAK,EAAE,cAAc,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5G,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY;QAC5B,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK;QAC7B,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK;QAC7B,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI;QAChC,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO;QACrC,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;aACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,EAAE,EAAE,IAAI,CAAC,KAAM,CAAC,EAAE;YAClB,IAAI,EAAE,IAAI,CAAC,KAAM,CAAC,IAAI;YACtB,OAAO,EAAE,IAAI,CAAC,KAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,WAAW,EAAE,IAAI,CAAC,KAAM,CAAC,WAAW;SACrC,CAAC,CAAC;KACN,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAA6B;IAC3E,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,MAAM,GAA2B,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAEhE,gCAAgC;IAChC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzD,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,UAAU;QAAE,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;IAChD,IAAI,WAAW;QAAE,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC;IACnD,IAAI,UAAU;QAAE,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;IAChD,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;QAAE,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAE1G,MAAM,IAAI,GAAG,MAAM,UAAU,CAA6B,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC7F,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;SACrC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IACzE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAuB,KAAK,EAAE,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjH,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function squarePayments(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function squareCustomers(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function squareCatalogList(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function squareCatalogSearch(args: Record<string, unknown>): Promise<unknown>;
5
+ //# sourceMappingURL=square-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"square-tool.d.ts","sourceRoot":"","sources":["../src/square-tool.ts"],"names":[],"mappings":"AAyEA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiCpF;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrF;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASvF;AAID,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzF"}
@@ -0,0 +1,133 @@
1
+ // ─── Square REST API Tool ────────────────────────────────────────────────────
2
+ // Covers payments, orders, customers, and catalog.
3
+ // Auth: Access token (Bearer token).
4
+ // Base URL: https://connect.squareup.com/v2
5
+ // No external dependencies - native fetch only.
6
+ const SQUARE_BASE = "https://connect.squareup.com/v2";
7
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
8
+ function requireConfig(args) {
9
+ const access_token = String(args.access_token ?? "").trim();
10
+ if (!access_token)
11
+ return { error: "access_token is required (Square access token)." };
12
+ return { access_token };
13
+ }
14
+ async function squareFetch(cfg, method, path, body, query) {
15
+ const url = new URL(`${SQUARE_BASE}${path}`);
16
+ if (method === "GET" && query) {
17
+ for (const [k, v] of Object.entries(query)) {
18
+ if (v !== undefined)
19
+ url.searchParams.set(k, String(v));
20
+ }
21
+ }
22
+ let response;
23
+ try {
24
+ response = await fetch(url.toString(), {
25
+ method,
26
+ headers: {
27
+ Authorization: `Bearer ${cfg.access_token}`,
28
+ "Square-Version": "2024-01-17",
29
+ "Content-Type": "application/json",
30
+ "Accept": "application/json",
31
+ },
32
+ body: body !== undefined ? JSON.stringify(body) : undefined,
33
+ });
34
+ }
35
+ catch (err) {
36
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
37
+ }
38
+ if (response.status === 429) {
39
+ return { error: "Square rate limit reached. Wait before retrying.", status: 429 };
40
+ }
41
+ if (response.status === 401) {
42
+ return { error: "Square auth failed: invalid or missing access token.", status: 401 };
43
+ }
44
+ let data;
45
+ try {
46
+ data = await response.json();
47
+ }
48
+ catch {
49
+ return { error: `Non-JSON response (HTTP ${response.status})`, status: response.status };
50
+ }
51
+ if (!response.ok) {
52
+ const d = data;
53
+ return { error: d["errors"] ?? d["message"] ?? "Square API error", status: response.status };
54
+ }
55
+ return data;
56
+ }
57
+ // ─── square_payments ──────────────────────────────────────────────────────────
58
+ export async function squarePayments(args) {
59
+ const cfg = requireConfig(args);
60
+ if ("error" in cfg)
61
+ return cfg;
62
+ const action = String(args.action ?? "list");
63
+ switch (action) {
64
+ case "list": {
65
+ return squareFetch(cfg, "GET", "/payments", undefined, {
66
+ begin_time: args.begin_time ? String(args.begin_time) : undefined,
67
+ end_time: args.end_time ? String(args.end_time) : undefined,
68
+ cursor: args.cursor ? String(args.cursor) : undefined,
69
+ limit: args.limit ? Number(args.limit) : 20,
70
+ });
71
+ }
72
+ case "create": {
73
+ const source_id = String(args.source_id ?? "").trim();
74
+ const idempotency_key = String(args.idempotency_key ?? crypto.randomUUID());
75
+ if (!source_id)
76
+ return { error: "source_id is required for action='create'." };
77
+ if (!args.amount_money || typeof args.amount_money !== "object") {
78
+ return { error: "amount_money object is required for action='create' (e.g. {amount: 100, currency: 'USD'})." };
79
+ }
80
+ return squareFetch(cfg, "POST", "/payments", {
81
+ source_id,
82
+ idempotency_key,
83
+ amount_money: args.amount_money,
84
+ note: args.note ? String(args.note) : undefined,
85
+ customer_id: args.customer_id ? String(args.customer_id) : undefined,
86
+ });
87
+ }
88
+ default:
89
+ return { error: `Unknown action "${action}". Valid: list, create.` };
90
+ }
91
+ }
92
+ // ─── square_customers ─────────────────────────────────────────────────────────
93
+ export async function squareCustomers(args) {
94
+ const cfg = requireConfig(args);
95
+ if ("error" in cfg)
96
+ return cfg;
97
+ return squareFetch(cfg, "GET", "/customers", undefined, {
98
+ cursor: args.cursor ? String(args.cursor) : undefined,
99
+ limit: args.limit ? Number(args.limit) : 20,
100
+ sort_field: args.sort_field ? String(args.sort_field) : undefined,
101
+ sort_order: args.sort_order ? String(args.sort_order) : undefined,
102
+ });
103
+ }
104
+ // ─── square_catalog_list ──────────────────────────────────────────────────────
105
+ export async function squareCatalogList(args) {
106
+ const cfg = requireConfig(args);
107
+ if ("error" in cfg)
108
+ return cfg;
109
+ return squareFetch(cfg, "GET", "/catalog/list", undefined, {
110
+ cursor: args.cursor ? String(args.cursor) : undefined,
111
+ types: args.types ? String(args.types) : undefined,
112
+ limit: args.limit ? Number(args.limit) : 100,
113
+ });
114
+ }
115
+ // ─── square_catalog_search ────────────────────────────────────────────────────
116
+ export async function squareCatalogSearch(args) {
117
+ const cfg = requireConfig(args);
118
+ if ("error" in cfg)
119
+ return cfg;
120
+ const text_filter = String(args.text_filter ?? "").trim();
121
+ if (!text_filter)
122
+ return { error: "text_filter (search text) is required." };
123
+ const objectTypes = args.object_types && Array.isArray(args.object_types)
124
+ ? args.object_types
125
+ : ["ITEM"];
126
+ return squareFetch(cfg, "POST", "/catalog/search", {
127
+ text_filter: { keyword: text_filter },
128
+ object_types: objectTypes,
129
+ limit: args.limit ? Number(args.limit) : 20,
130
+ cursor: args.cursor ? String(args.cursor) : undefined,
131
+ });
132
+ }
133
+ //# sourceMappingURL=square-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"square-tool.js","sourceRoot":"","sources":["../src/square-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function stabilityTextToImage(args: Record<string, unknown>): Promise<unknown>;
2
+ export declare function stabilityImageToImage(args: Record<string, unknown>): Promise<unknown>;
3
+ export declare function stabilityUpscale(args: Record<string, unknown>): Promise<unknown>;
4
+ export declare function stabilityListEngines(args: Record<string, unknown>): Promise<unknown>;
5
+ //# sourceMappingURL=stability-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stability-tool.d.ts","sourceRoot":"","sources":["../src/stability-tool.ts"],"names":[],"mappings":"AAuGA,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA2C1F;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA+C3F;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BtF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAc1F"}
@@ -0,0 +1,190 @@
1
+ // Stability AI API integration for the UnClick MCP server.
2
+ // Uses the Stability AI REST API via fetch - no external dependencies.
3
+ // Users must supply an API key from platform.stability.ai.
4
+ const STABILITY_API_BASE = "https://api.stability.ai";
5
+ // ─── Auth validation ──────────────────────────────────────────────────────────
6
+ function requireKey(args) {
7
+ const key = String(args.api_key ?? "").trim();
8
+ if (!key)
9
+ throw new Error("api_key is required. Get one at platform.stability.ai.");
10
+ return key;
11
+ }
12
+ // ─── API helpers ──────────────────────────────────────────────────────────────
13
+ async function stabilityGet(apiKey, path) {
14
+ const res = await fetch(`${STABILITY_API_BASE}${path}`, {
15
+ headers: {
16
+ Authorization: `Bearer ${apiKey}`,
17
+ Accept: "application/json",
18
+ },
19
+ });
20
+ const data = await res.json();
21
+ if (!res.ok) {
22
+ const msg = data.message ?? `HTTP ${res.status}`;
23
+ const id = data.id ? ` (id: ${data.id})` : "";
24
+ throw new Error(`Stability AI error${id}: ${msg}`);
25
+ }
26
+ return data;
27
+ }
28
+ async function stabilityPost(apiKey, path, body, acceptHeader = "application/json") {
29
+ const res = await fetch(`${STABILITY_API_BASE}${path}`, {
30
+ method: "POST",
31
+ headers: {
32
+ Authorization: `Bearer ${apiKey}`,
33
+ "Content-Type": "application/json",
34
+ Accept: acceptHeader,
35
+ },
36
+ body: JSON.stringify(body),
37
+ });
38
+ const data = await res.json();
39
+ if (!res.ok) {
40
+ const msg = data.message ?? `HTTP ${res.status}`;
41
+ const id = data.id ? ` (id: ${data.id})` : "";
42
+ throw new Error(`Stability AI error${id}: ${msg}`);
43
+ }
44
+ return data;
45
+ }
46
+ async function stabilityPostMultipart(apiKey, path, form) {
47
+ const res = await fetch(`${STABILITY_API_BASE}${path}`, {
48
+ method: "POST",
49
+ headers: {
50
+ Authorization: `Bearer ${apiKey}`,
51
+ Accept: "application/json",
52
+ },
53
+ body: form,
54
+ });
55
+ const data = await res.json();
56
+ if (!res.ok) {
57
+ const msg = data.message ?? `HTTP ${res.status}`;
58
+ throw new Error(`Stability AI error: ${msg}`);
59
+ }
60
+ return data;
61
+ }
62
+ // ─── Operations ───────────────────────────────────────────────────────────────
63
+ export async function stabilityTextToImage(args) {
64
+ const apiKey = requireKey(args);
65
+ const prompt = String(args.prompt ?? "").trim();
66
+ if (!prompt)
67
+ throw new Error("prompt is required.");
68
+ const engineId = String(args.engine_id ?? "stable-diffusion-xl-1024-v1-0");
69
+ const negativePrompt = String(args.negative_prompt ?? "").trim();
70
+ const width = Number(args.width ?? 1024);
71
+ const height = Number(args.height ?? 1024);
72
+ const steps = Math.min(150, Math.max(10, Number(args.steps ?? 30)));
73
+ const cfgScale = Math.min(35, Math.max(0, Number(args.cfg_scale ?? 7)));
74
+ const samples = Math.min(10, Math.max(1, Number(args.samples ?? 1)));
75
+ const stylePreset = args.style_preset ? String(args.style_preset) : undefined;
76
+ const textPrompts = [{ text: prompt, weight: 1 }];
77
+ if (negativePrompt)
78
+ textPrompts.push({ text: negativePrompt, weight: -1 });
79
+ const body = {
80
+ text_prompts: textPrompts,
81
+ cfg_scale: cfgScale,
82
+ height,
83
+ width,
84
+ steps,
85
+ samples,
86
+ };
87
+ if (stylePreset)
88
+ body.style_preset = stylePreset;
89
+ if (args.seed !== undefined)
90
+ body.seed = Number(args.seed);
91
+ const result = await stabilityPost(apiKey, `/v1/generation/${encodeURIComponent(engineId)}/text-to-image`, body);
92
+ return {
93
+ success: true,
94
+ engine_id: engineId,
95
+ count: result.artifacts.length,
96
+ images: result.artifacts.map((a) => ({
97
+ base64: a.base64,
98
+ seed: a.seed,
99
+ finish_reason: a.finishReason,
100
+ note: "Decode base64 and write as PNG to save the image.",
101
+ })),
102
+ };
103
+ }
104
+ export async function stabilityImageToImage(args) {
105
+ const apiKey = requireKey(args);
106
+ const prompt = String(args.prompt ?? "").trim();
107
+ const imageUrl = String(args.image_url ?? "").trim();
108
+ if (!prompt)
109
+ throw new Error("prompt is required.");
110
+ if (!imageUrl)
111
+ throw new Error("image_url is required (URL of the source image).");
112
+ const engineId = String(args.engine_id ?? "stable-diffusion-xl-1024-v1-0");
113
+ const strength = Math.min(1, Math.max(0, Number(args.strength ?? 0.35)));
114
+ const steps = Math.min(150, Math.max(10, Number(args.steps ?? 30)));
115
+ const cfgScale = Math.min(35, Math.max(0, Number(args.cfg_scale ?? 7)));
116
+ const samples = Math.min(10, Math.max(1, Number(args.samples ?? 1)));
117
+ // Fetch the source image
118
+ const imgRes = await fetch(imageUrl);
119
+ if (!imgRes.ok)
120
+ throw new Error(`Failed to fetch image_url: HTTP ${imgRes.status}`);
121
+ const imgBlob = await imgRes.blob();
122
+ const form = new FormData();
123
+ form.append("init_image", imgBlob, "init_image.png");
124
+ form.append("init_image_mode", "IMAGE_STRENGTH");
125
+ form.append("image_strength", String(strength));
126
+ form.append("text_prompts[0][text]", prompt);
127
+ form.append("text_prompts[0][weight]", "1");
128
+ const negativePrompt = String(args.negative_prompt ?? "").trim();
129
+ if (negativePrompt) {
130
+ form.append("text_prompts[1][text]", negativePrompt);
131
+ form.append("text_prompts[1][weight]", "-1");
132
+ }
133
+ form.append("cfg_scale", String(cfgScale));
134
+ form.append("steps", String(steps));
135
+ form.append("samples", String(samples));
136
+ const result = await stabilityPostMultipart(apiKey, `/v1/generation/${encodeURIComponent(engineId)}/image-to-image`, form);
137
+ return {
138
+ success: true,
139
+ engine_id: engineId,
140
+ count: result.artifacts.length,
141
+ images: result.artifacts.map((a) => ({
142
+ base64: a.base64,
143
+ seed: a.seed,
144
+ finish_reason: a.finishReason,
145
+ note: "Decode base64 and write as PNG to save the image.",
146
+ })),
147
+ };
148
+ }
149
+ export async function stabilityUpscale(args) {
150
+ const apiKey = requireKey(args);
151
+ const imageUrl = String(args.image_url ?? "").trim();
152
+ if (!imageUrl)
153
+ throw new Error("image_url is required (URL of the image to upscale).");
154
+ const width = Number(args.width ?? 2048);
155
+ const engineId = String(args.engine_id ?? "esrgan-v1-x2plus");
156
+ // Fetch source image
157
+ const imgRes = await fetch(imageUrl);
158
+ if (!imgRes.ok)
159
+ throw new Error(`Failed to fetch image_url: HTTP ${imgRes.status}`);
160
+ const imgBlob = await imgRes.blob();
161
+ const form = new FormData();
162
+ form.append("image", imgBlob, "image.png");
163
+ form.append("width", String(width));
164
+ const result = await stabilityPostMultipart(apiKey, `/v1/generation/${encodeURIComponent(engineId)}/image-to-image/upscale`, form);
165
+ return {
166
+ success: true,
167
+ engine_id: engineId,
168
+ count: result.artifacts.length,
169
+ images: result.artifacts.map((a) => ({
170
+ base64: a.base64,
171
+ seed: a.seed,
172
+ finish_reason: a.finishReason,
173
+ })),
174
+ };
175
+ }
176
+ export async function stabilityListEngines(args) {
177
+ const apiKey = requireKey(args);
178
+ const engines = await stabilityGet(apiKey, "/v1/engines/list");
179
+ return {
180
+ count: engines.length,
181
+ engines: engines.map((e) => ({
182
+ id: e.id,
183
+ name: e.name,
184
+ description: e.description,
185
+ type: e.type,
186
+ ready: e.ready,
187
+ })),
188
+ };
189
+ }
190
+ //# sourceMappingURL=stability-tool.js.map