@withpica/mcp-server 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +305 -0
  2. package/dist/config.d.ts +34 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +33 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +7 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +34 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/pica-sdk.d.ts +1162 -0
  11. package/dist/pica-sdk.d.ts.map +1 -0
  12. package/dist/pica-sdk.js +1371 -0
  13. package/dist/pica-sdk.js.map +1 -0
  14. package/dist/prompts/index.d.ts +78 -0
  15. package/dist/prompts/index.d.ts.map +1 -0
  16. package/dist/prompts/index.js +513 -0
  17. package/dist/prompts/index.js.map +1 -0
  18. package/dist/resources/index.d.ts +64 -0
  19. package/dist/resources/index.d.ts.map +1 -0
  20. package/dist/resources/index.js +310 -0
  21. package/dist/resources/index.js.map +1 -0
  22. package/dist/resources/llms-primer.d.ts +2 -0
  23. package/dist/resources/llms-primer.d.ts.map +1 -0
  24. package/dist/resources/llms-primer.js +67 -0
  25. package/dist/resources/llms-primer.js.map +1 -0
  26. package/dist/server.d.ts +27 -0
  27. package/dist/server.d.ts.map +1 -0
  28. package/dist/server.js +140 -0
  29. package/dist/server.js.map +1 -0
  30. package/dist/tools/agreement-types.d.ts +37 -0
  31. package/dist/tools/agreement-types.d.ts.map +1 -0
  32. package/dist/tools/agreement-types.js +579 -0
  33. package/dist/tools/agreement-types.js.map +1 -0
  34. package/dist/tools/agreements.d.ts +21 -0
  35. package/dist/tools/agreements.d.ts.map +1 -0
  36. package/dist/tools/agreements.js +328 -0
  37. package/dist/tools/agreements.js.map +1 -0
  38. package/dist/tools/analytics.d.ts +20 -0
  39. package/dist/tools/analytics.d.ts.map +1 -0
  40. package/dist/tools/analytics.js +126 -0
  41. package/dist/tools/analytics.js.map +1 -0
  42. package/dist/tools/assets.d.ts +23 -0
  43. package/dist/tools/assets.d.ts.map +1 -0
  44. package/dist/tools/assets.js +220 -0
  45. package/dist/tools/assets.js.map +1 -0
  46. package/dist/tools/audio-files.d.ts +21 -0
  47. package/dist/tools/audio-files.d.ts.map +1 -0
  48. package/dist/tools/audio-files.js +358 -0
  49. package/dist/tools/audio-files.js.map +1 -0
  50. package/dist/tools/bulk.d.ts +16 -0
  51. package/dist/tools/bulk.d.ts.map +1 -0
  52. package/dist/tools/bulk.js +82 -0
  53. package/dist/tools/bulk.js.map +1 -0
  54. package/dist/tools/calendar.d.ts +15 -0
  55. package/dist/tools/calendar.d.ts.map +1 -0
  56. package/dist/tools/calendar.js +69 -0
  57. package/dist/tools/calendar.js.map +1 -0
  58. package/dist/tools/collaborators.d.ts +17 -0
  59. package/dist/tools/collaborators.d.ts.map +1 -0
  60. package/dist/tools/collaborators.js +133 -0
  61. package/dist/tools/collaborators.js.map +1 -0
  62. package/dist/tools/comparisons.d.ts +22 -0
  63. package/dist/tools/comparisons.d.ts.map +1 -0
  64. package/dist/tools/comparisons.js +86 -0
  65. package/dist/tools/comparisons.js.map +1 -0
  66. package/dist/tools/credits.d.ts +17 -0
  67. package/dist/tools/credits.d.ts.map +1 -0
  68. package/dist/tools/credits.js +136 -0
  69. package/dist/tools/credits.js.map +1 -0
  70. package/dist/tools/dashboard.d.ts +20 -0
  71. package/dist/tools/dashboard.d.ts.map +1 -0
  72. package/dist/tools/dashboard.js +156 -0
  73. package/dist/tools/dashboard.js.map +1 -0
  74. package/dist/tools/directory.d.ts +15 -0
  75. package/dist/tools/directory.d.ts.map +1 -0
  76. package/dist/tools/directory.js +108 -0
  77. package/dist/tools/directory.js.map +1 -0
  78. package/dist/tools/disputes.d.ts +18 -0
  79. package/dist/tools/disputes.d.ts.map +1 -0
  80. package/dist/tools/disputes.js +66 -0
  81. package/dist/tools/disputes.js.map +1 -0
  82. package/dist/tools/documents.d.ts +15 -0
  83. package/dist/tools/documents.d.ts.map +1 -0
  84. package/dist/tools/documents.js +38 -0
  85. package/dist/tools/documents.js.map +1 -0
  86. package/dist/tools/duplicates.d.ts +16 -0
  87. package/dist/tools/duplicates.d.ts.map +1 -0
  88. package/dist/tools/duplicates.js +72 -0
  89. package/dist/tools/duplicates.js.map +1 -0
  90. package/dist/tools/enrichment.d.ts +23 -0
  91. package/dist/tools/enrichment.d.ts.map +1 -0
  92. package/dist/tools/enrichment.js +207 -0
  93. package/dist/tools/enrichment.js.map +1 -0
  94. package/dist/tools/exports.d.ts +19 -0
  95. package/dist/tools/exports.d.ts.map +1 -0
  96. package/dist/tools/exports.js +155 -0
  97. package/dist/tools/exports.js.map +1 -0
  98. package/dist/tools/health.d.ts +17 -0
  99. package/dist/tools/health.d.ts.map +1 -0
  100. package/dist/tools/health.js +69 -0
  101. package/dist/tools/health.js.map +1 -0
  102. package/dist/tools/import-documents.d.ts +21 -0
  103. package/dist/tools/import-documents.d.ts.map +1 -0
  104. package/dist/tools/import-documents.js +191 -0
  105. package/dist/tools/import-documents.js.map +1 -0
  106. package/dist/tools/import.d.ts +29 -0
  107. package/dist/tools/import.d.ts.map +1 -0
  108. package/dist/tools/import.js +404 -0
  109. package/dist/tools/import.js.map +1 -0
  110. package/dist/tools/index.d.ts +48 -0
  111. package/dist/tools/index.d.ts.map +1 -0
  112. package/dist/tools/index.js +394 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/integrations.d.ts +15 -0
  115. package/dist/tools/integrations.d.ts.map +1 -0
  116. package/dist/tools/integrations.js +102 -0
  117. package/dist/tools/integrations.js.map +1 -0
  118. package/dist/tools/licensing.d.ts +40 -0
  119. package/dist/tools/licensing.d.ts.map +1 -0
  120. package/dist/tools/licensing.js +436 -0
  121. package/dist/tools/licensing.js.map +1 -0
  122. package/dist/tools/memory.d.ts +21 -0
  123. package/dist/tools/memory.d.ts.map +1 -0
  124. package/dist/tools/memory.js +121 -0
  125. package/dist/tools/memory.js.map +1 -0
  126. package/dist/tools/multimedia.d.ts +19 -0
  127. package/dist/tools/multimedia.d.ts.map +1 -0
  128. package/dist/tools/multimedia.js +293 -0
  129. package/dist/tools/multimedia.js.map +1 -0
  130. package/dist/tools/notes.d.ts +21 -0
  131. package/dist/tools/notes.d.ts.map +1 -0
  132. package/dist/tools/notes.js +126 -0
  133. package/dist/tools/notes.js.map +1 -0
  134. package/dist/tools/notifications.d.ts +17 -0
  135. package/dist/tools/notifications.d.ts.map +1 -0
  136. package/dist/tools/notifications.js +117 -0
  137. package/dist/tools/notifications.js.map +1 -0
  138. package/dist/tools/people.d.ts +53 -0
  139. package/dist/tools/people.d.ts.map +1 -0
  140. package/dist/tools/people.js +534 -0
  141. package/dist/tools/people.js.map +1 -0
  142. package/dist/tools/pica-score.d.ts +15 -0
  143. package/dist/tools/pica-score.d.ts.map +1 -0
  144. package/dist/tools/pica-score.js +30 -0
  145. package/dist/tools/pica-score.js.map +1 -0
  146. package/dist/tools/projects.d.ts +19 -0
  147. package/dist/tools/projects.d.ts.map +1 -0
  148. package/dist/tools/projects.js +142 -0
  149. package/dist/tools/projects.js.map +1 -0
  150. package/dist/tools/purchases.d.ts +15 -0
  151. package/dist/tools/purchases.d.ts.map +1 -0
  152. package/dist/tools/purchases.js +65 -0
  153. package/dist/tools/purchases.js.map +1 -0
  154. package/dist/tools/recordings.d.ts +41 -0
  155. package/dist/tools/recordings.d.ts.map +1 -0
  156. package/dist/tools/recordings.js +293 -0
  157. package/dist/tools/recordings.js.map +1 -0
  158. package/dist/tools/registration.d.ts +16 -0
  159. package/dist/tools/registration.d.ts.map +1 -0
  160. package/dist/tools/registration.js +52 -0
  161. package/dist/tools/registration.js.map +1 -0
  162. package/dist/tools/releases.d.ts +18 -0
  163. package/dist/tools/releases.d.ts.map +1 -0
  164. package/dist/tools/releases.js +138 -0
  165. package/dist/tools/releases.js.map +1 -0
  166. package/dist/tools/royalties.d.ts +23 -0
  167. package/dist/tools/royalties.d.ts.map +1 -0
  168. package/dist/tools/royalties.js +263 -0
  169. package/dist/tools/royalties.js.map +1 -0
  170. package/dist/tools/search.d.ts +30 -0
  171. package/dist/tools/search.d.ts.map +1 -0
  172. package/dist/tools/search.js +117 -0
  173. package/dist/tools/search.js.map +1 -0
  174. package/dist/tools/send.d.ts +18 -0
  175. package/dist/tools/send.d.ts.map +1 -0
  176. package/dist/tools/send.js +189 -0
  177. package/dist/tools/send.js.map +1 -0
  178. package/dist/tools/sessions.d.ts +18 -0
  179. package/dist/tools/sessions.d.ts.map +1 -0
  180. package/dist/tools/sessions.js +107 -0
  181. package/dist/tools/sessions.js.map +1 -0
  182. package/dist/tools/settings.d.ts +18 -0
  183. package/dist/tools/settings.d.ts.map +1 -0
  184. package/dist/tools/settings.js +98 -0
  185. package/dist/tools/settings.js.map +1 -0
  186. package/dist/tools/share-links.d.ts +19 -0
  187. package/dist/tools/share-links.d.ts.map +1 -0
  188. package/dist/tools/share-links.js +126 -0
  189. package/dist/tools/share-links.js.map +1 -0
  190. package/dist/tools/split-sheets.d.ts +24 -0
  191. package/dist/tools/split-sheets.d.ts.map +1 -0
  192. package/dist/tools/split-sheets.js +189 -0
  193. package/dist/tools/split-sheets.js.map +1 -0
  194. package/dist/tools/team.d.ts +22 -0
  195. package/dist/tools/team.d.ts.map +1 -0
  196. package/dist/tools/team.js +139 -0
  197. package/dist/tools/team.js.map +1 -0
  198. package/dist/tools/telegram.d.ts +20 -0
  199. package/dist/tools/telegram.d.ts.map +1 -0
  200. package/dist/tools/telegram.js +94 -0
  201. package/dist/tools/telegram.js.map +1 -0
  202. package/dist/tools/uploads.d.ts +17 -0
  203. package/dist/tools/uploads.d.ts.map +1 -0
  204. package/dist/tools/uploads.js +159 -0
  205. package/dist/tools/uploads.js.map +1 -0
  206. package/dist/tools/works.d.ts +53 -0
  207. package/dist/tools/works.d.ts.map +1 -0
  208. package/dist/tools/works.js +517 -0
  209. package/dist/tools/works.js.map +1 -0
  210. package/dist/utils/credit-gate.d.ts +17 -0
  211. package/dist/utils/credit-gate.d.ts.map +1 -0
  212. package/dist/utils/credit-gate.js +111 -0
  213. package/dist/utils/credit-gate.js.map +1 -0
  214. package/dist/utils/errors.d.ts +29 -0
  215. package/dist/utils/errors.d.ts.map +1 -0
  216. package/dist/utils/errors.js +114 -0
  217. package/dist/utils/errors.js.map +1 -0
  218. package/dist/utils/formatting.d.ts +63 -0
  219. package/dist/utils/formatting.d.ts.map +1 -0
  220. package/dist/utils/formatting.js +130 -0
  221. package/dist/utils/formatting.js.map +1 -0
  222. package/dist/utils/mpp.d.ts +78 -0
  223. package/dist/utils/mpp.d.ts.map +1 -0
  224. package/dist/utils/mpp.js +136 -0
  225. package/dist/utils/mpp.js.map +1 -0
  226. package/package.json +44 -0
@@ -0,0 +1,1371 @@
1
+ /**
2
+ * Lightweight PICA SDK client for MCP server
3
+ * Uses the PICA API directly without external dependencies
4
+ */
5
+ // --- Request infrastructure ---
6
+ const DEFAULT_TIMEOUT_MS = 30_000;
7
+ const LONG_TIMEOUT_MS = 120_000;
8
+ const MAX_RETRIES = 2;
9
+ const RETRY_BASE_MS = 500;
10
+ /** Paths that get extended timeouts (exports, enrichment, heavy ops) */
11
+ const LONG_TIMEOUT_PATTERNS = [
12
+ "/exports/",
13
+ "/enrichment/",
14
+ "/enrich",
15
+ "/industry-ready",
16
+ "/catalog-asset-report",
17
+ "/analyze",
18
+ "/identify",
19
+ "/pica-score",
20
+ "/briefing",
21
+ "/pulse",
22
+ "/duplicates",
23
+ ];
24
+ class ApiError extends Error {
25
+ status;
26
+ retryable;
27
+ retryAfterMs;
28
+ constructor(message, status, retryable, retryAfterMs) {
29
+ super(message);
30
+ this.status = status;
31
+ this.retryable = retryable;
32
+ this.retryAfterMs = retryAfterMs;
33
+ this.name = "ApiError";
34
+ }
35
+ }
36
+ function isRetryableStatus(status) {
37
+ return status === 429 || status === 502 || status === 503 || status === 504;
38
+ }
39
+ function getTimeoutForPath(path) {
40
+ return LONG_TIMEOUT_PATTERNS.some((p) => path.includes(p))
41
+ ? LONG_TIMEOUT_MS
42
+ : DEFAULT_TIMEOUT_MS;
43
+ }
44
+ function sleep(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ class BaseResource {
48
+ baseUrl;
49
+ apiKey;
50
+ debug;
51
+ constructor(baseUrl, apiKey, debug) {
52
+ this.baseUrl = baseUrl;
53
+ this.apiKey = apiKey;
54
+ this.debug = debug;
55
+ }
56
+ async fetchWithTimeout(url, init, timeoutMs) {
57
+ const controller = new AbortController();
58
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
59
+ try {
60
+ return await fetch(url, { ...init, signal: controller.signal });
61
+ }
62
+ catch (err) {
63
+ if (err.name === "AbortError") {
64
+ throw new ApiError(`Request timed out after ${timeoutMs}ms: ${init.method} ${url}`, 0, true);
65
+ }
66
+ throw err;
67
+ }
68
+ finally {
69
+ clearTimeout(timer);
70
+ }
71
+ }
72
+ async fetchWithRetry(url, init, timeoutMs) {
73
+ let lastError;
74
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
75
+ try {
76
+ const response = await this.fetchWithTimeout(url, init, timeoutMs);
77
+ if (response.ok)
78
+ return response;
79
+ const errorText = await response.text();
80
+ // Auth errors — fail fast, never retry
81
+ if (response.status === 401 || response.status === 403) {
82
+ throw new ApiError(`Authentication failed: ${response.status} ${errorText}`, response.status, false);
83
+ }
84
+ // Retryable errors — retry with backoff
85
+ if (isRetryableStatus(response.status) && attempt < MAX_RETRIES) {
86
+ const retryAfter = response.headers.get("retry-after");
87
+ const parsed = retryAfter ? parseInt(retryAfter, 10) : NaN;
88
+ const delayMs = !isNaN(parsed)
89
+ ? parsed * 1000
90
+ : RETRY_BASE_MS * Math.pow(2, attempt);
91
+ if (this.debug) {
92
+ console.error(`[PICA SDK] ${response.status} on attempt ${attempt + 1}, retrying in ${delayMs}ms`);
93
+ }
94
+ await sleep(delayMs);
95
+ continue;
96
+ }
97
+ // Non-retryable client/server error
98
+ throw new ApiError(`API request failed: ${response.status} ${errorText}`, response.status, false);
99
+ }
100
+ catch (err) {
101
+ if (err instanceof ApiError && !err.retryable)
102
+ throw err;
103
+ lastError = err;
104
+ if (attempt < MAX_RETRIES) {
105
+ const delayMs = RETRY_BASE_MS * Math.pow(2, attempt);
106
+ if (this.debug) {
107
+ console.error(`[PICA SDK] ${err.message} on attempt ${attempt + 1}, retrying in ${delayMs}ms`);
108
+ }
109
+ await sleep(delayMs);
110
+ continue;
111
+ }
112
+ }
113
+ }
114
+ throw lastError || new Error("Request failed after retries");
115
+ }
116
+ async request(method, path, body) {
117
+ const url = `${this.baseUrl}${path}`;
118
+ const timeoutMs = getTimeoutForPath(path);
119
+ if (this.debug) {
120
+ console.error(`[PICA SDK] ${method} ${url} (timeout: ${timeoutMs}ms)`);
121
+ }
122
+ const response = await this.fetchWithRetry(url, {
123
+ method,
124
+ headers: {
125
+ Authorization: `Bearer ${this.apiKey}`,
126
+ "Content-Type": "application/json",
127
+ },
128
+ body: body ? JSON.stringify(body) : undefined,
129
+ }, timeoutMs);
130
+ const data = await response.json();
131
+ return (data.data || data);
132
+ }
133
+ /**
134
+ * Make a request and return paginated result with metadata
135
+ */
136
+ async requestPaginated(method, path, body) {
137
+ const url = `${this.baseUrl}${path}`;
138
+ const timeoutMs = getTimeoutForPath(path);
139
+ if (this.debug) {
140
+ console.error(`[PICA SDK] ${method} ${url} (timeout: ${timeoutMs}ms)`);
141
+ }
142
+ const response = await this.fetchWithRetry(url, {
143
+ method,
144
+ headers: {
145
+ Authorization: `Bearer ${this.apiKey}`,
146
+ "Content-Type": "application/json",
147
+ },
148
+ body: body ? JSON.stringify(body) : undefined,
149
+ }, timeoutMs);
150
+ const json = await response.json();
151
+ const items = (json.data || []);
152
+ const total = json.pagination?.total ?? json.count ?? items.length;
153
+ const hasMore = json.pagination?.hasMore ?? total > items.length;
154
+ return { data: items, total, hasMore };
155
+ }
156
+ }
157
+ export { ApiError };
158
+ class WorksResource extends BaseResource {
159
+ async list(params) {
160
+ const limit = params?.limit || 50;
161
+ return this.request("GET", `/admin/works?limit=${limit}`);
162
+ }
163
+ async search(params) {
164
+ const qp = new URLSearchParams();
165
+ if (params.query)
166
+ qp.set("query", params.query);
167
+ if (params.limit !== undefined)
168
+ qp.set("limit", String(params.limit));
169
+ if (params.offset !== undefined)
170
+ qp.set("offset", String(params.offset));
171
+ if (params.status)
172
+ qp.set("status", params.status);
173
+ if (params.type)
174
+ qp.set("type", params.type);
175
+ const qs = qp.toString();
176
+ return this.requestPaginated("GET", `/admin/works${qs ? `?${qs}` : ""}`);
177
+ }
178
+ async get(id) {
179
+ return this.request("GET", `/admin/works/${id}`);
180
+ }
181
+ async create(data) {
182
+ return this.request("POST", "/admin/works", data);
183
+ }
184
+ async update(id, updates) {
185
+ return this.request("PATCH", `/admin/works/${id}`, updates);
186
+ }
187
+ async delete(id) {
188
+ await this.request("DELETE", `/admin/works/${id}`);
189
+ }
190
+ async verify(id) {
191
+ return this.request("POST", `/admin/works/${id}/verify`);
192
+ }
193
+ async bulkDelete(ids) {
194
+ await this.request("POST", "/admin/works/bulk-delete", { ids });
195
+ }
196
+ }
197
+ class PeopleResource extends BaseResource {
198
+ async list(params) {
199
+ const limit = params?.limit || 50;
200
+ return this.request("GET", `/admin/people?limit=${limit}`);
201
+ }
202
+ async search(params) {
203
+ const qp = new URLSearchParams();
204
+ if (params.query)
205
+ qp.set("query", params.query);
206
+ if (params.limit !== undefined)
207
+ qp.set("limit", String(params.limit));
208
+ if (params.offset !== undefined)
209
+ qp.set("offset", String(params.offset));
210
+ const qs = qp.toString();
211
+ return this.requestPaginated("GET", `/admin/people${qs ? `?${qs}` : ""}`);
212
+ }
213
+ async get(id) {
214
+ return this.request("GET", `/admin/people/${id}`);
215
+ }
216
+ async create(data) {
217
+ return this.request("POST", "/admin/people", data);
218
+ }
219
+ async update(id, updates) {
220
+ return this.request("PATCH", `/admin/people/${id}`, updates);
221
+ }
222
+ async delete(id) {
223
+ await this.request("DELETE", `/admin/people/${id}`);
224
+ }
225
+ async enrichFromISNI(id, isni) {
226
+ return this.request("POST", `/admin/people/${id}/enrich/isni`, {
227
+ isni,
228
+ });
229
+ }
230
+ async enrichFromMusicBrainz(id, musicbrainz_id) {
231
+ return this.request("POST", `/admin/people/${id}/enrich/musicbrainz`, { musicbrainz_id });
232
+ }
233
+ }
234
+ class LicensingResource extends BaseResource {
235
+ /**
236
+ * Search for sync-licensable tracks by audio characteristics
237
+ */
238
+ async searchForSync(params = {}) {
239
+ const queryParams = new URLSearchParams();
240
+ if (params.mood)
241
+ queryParams.set("mood", params.mood);
242
+ if (params.genre)
243
+ queryParams.set("genre", params.genre);
244
+ if (params.min_bpm !== undefined)
245
+ queryParams.set("min_bpm", String(params.min_bpm));
246
+ if (params.max_bpm !== undefined)
247
+ queryParams.set("max_bpm", String(params.max_bpm));
248
+ if (params.key)
249
+ queryParams.set("key", params.key);
250
+ if (params.min_energy !== undefined)
251
+ queryParams.set("min_energy", String(params.min_energy));
252
+ if (params.max_energy !== undefined)
253
+ queryParams.set("max_energy", String(params.max_energy));
254
+ if (params.min_valence !== undefined)
255
+ queryParams.set("min_valence", String(params.min_valence));
256
+ if (params.max_valence !== undefined)
257
+ queryParams.set("max_valence", String(params.max_valence));
258
+ if (params.min_duration !== undefined)
259
+ queryParams.set("min_duration", String(params.min_duration));
260
+ if (params.max_duration !== undefined)
261
+ queryParams.set("max_duration", String(params.max_duration));
262
+ if (params.instrumental_only)
263
+ queryParams.set("instrumental_only", "true");
264
+ if (params.available_for_sync)
265
+ queryParams.set("available_for_sync", "true");
266
+ if (params.limit !== undefined)
267
+ queryParams.set("limit", String(params.limit));
268
+ const query = queryParams.toString();
269
+ const path = `/admin/audio-files/search-for-sync${query ? `?${query}` : ""}`;
270
+ return this.request("GET", path);
271
+ }
272
+ /**
273
+ * Submit a license enquiry for a track
274
+ */
275
+ async submitEnquiry(enquiry) {
276
+ return this.request("POST", "/admin/license-enquiries", enquiry);
277
+ }
278
+ /**
279
+ * List license enquiries with optional filters
280
+ */
281
+ async listEnquiries(params) {
282
+ const queryParams = new URLSearchParams();
283
+ if (params?.work_id)
284
+ queryParams.set("work_id", params.work_id);
285
+ if (params?.status)
286
+ queryParams.set("status", params.status);
287
+ if (params?.project_type)
288
+ queryParams.set("project_type", params.project_type);
289
+ if (params?.territory)
290
+ queryParams.set("territory", params.territory);
291
+ if (params?.limit !== undefined)
292
+ queryParams.set("limit", String(params.limit));
293
+ if (params?.offset !== undefined)
294
+ queryParams.set("offset", String(params.offset));
295
+ const query = queryParams.toString();
296
+ const path = `/admin/license-enquiries${query ? `?${query}` : ""}`;
297
+ return this.request("GET", path);
298
+ }
299
+ /**
300
+ * Get a specific license enquiry by ID
301
+ */
302
+ async getEnquiry(id) {
303
+ return this.request("GET", `/admin/license-enquiries/${id}`);
304
+ }
305
+ /**
306
+ * Update a license enquiry status
307
+ */
308
+ async updateEnquiryStatus(id, status, notes) {
309
+ return this.request("PATCH", `/admin/license-enquiries/${id}`, { status, your_notes: notes });
310
+ }
311
+ }
312
+ class CreditsResource extends BaseResource {
313
+ async listForWork(workId) {
314
+ return this.request("GET", `/admin/works/${workId}/credits`);
315
+ }
316
+ async updateForWork(workId, credits) {
317
+ return this.request("POST", `/admin/works/${workId}/credits`, credits);
318
+ }
319
+ }
320
+ class CreditsBalanceResource extends BaseResource {
321
+ async getBalance() {
322
+ return this.request("GET", "/admin/credits/balance");
323
+ }
324
+ async purchase(params) {
325
+ return this.request("POST", "/admin/credits/purchase", params);
326
+ }
327
+ }
328
+ class PicaScoreResource extends BaseResource {
329
+ async get() {
330
+ return this.request("GET", "/admin/pica-score");
331
+ }
332
+ }
333
+ class AudioFilesResource extends BaseResource {
334
+ async list(params) {
335
+ const queryParams = new URLSearchParams();
336
+ if (params?.work_id)
337
+ queryParams.set("work_id", params.work_id);
338
+ if (params?.file_type)
339
+ queryParams.set("file_type", params.file_type);
340
+ if (params?.unprocessed)
341
+ queryParams.set("unprocessed", "true");
342
+ if (params?.limit !== undefined)
343
+ queryParams.set("limit", String(params.limit));
344
+ const query = queryParams.toString();
345
+ return this.request("GET", `/admin/audio-files${query ? `?${query}` : ""}`);
346
+ }
347
+ async get(id) {
348
+ return this.request("GET", `/admin/audio-files/${id}`);
349
+ }
350
+ async analyze(id, options) {
351
+ return this.request("POST", `/admin/audio-files/${id}/analyze`, options);
352
+ }
353
+ async getStatus(id) {
354
+ return this.request("GET", `/admin/audio-files/${id}/status`);
355
+ }
356
+ async presignedUpload(params) {
357
+ return this.request("POST", "/admin/audio-files/presigned-upload", {
358
+ filename: params.filename,
359
+ contentType: params.contentType,
360
+ fileSize: params.fileSize,
361
+ workId: params.workId,
362
+ title: params.title,
363
+ fileType: params.fileType,
364
+ });
365
+ }
366
+ async completeUpload(params) {
367
+ return this.request("POST", "/admin/audio-files/complete-upload", params);
368
+ }
369
+ async identify(id, options) {
370
+ return this.request("POST", `/admin/audio-files/${id}/identify`, options);
371
+ }
372
+ }
373
+ class MultimediaResource extends BaseResource {
374
+ async search(params) {
375
+ const queryParams = new URLSearchParams();
376
+ if (params?.query)
377
+ queryParams.set("query", params.query);
378
+ if (params?.content_type)
379
+ queryParams.set("content_type", params.content_type);
380
+ if (params?.classification)
381
+ queryParams.set("classification", params.classification);
382
+ if (params?.is_published !== undefined)
383
+ queryParams.set("is_published", String(params.is_published));
384
+ if (params?.work_id)
385
+ queryParams.set("work_id", params.work_id);
386
+ if (params?.person_id)
387
+ queryParams.set("person_id", params.person_id);
388
+ if (params?.limit !== undefined)
389
+ queryParams.set("limit", String(params.limit));
390
+ if (params?.offset !== undefined)
391
+ queryParams.set("offset", String(params.offset));
392
+ const query = queryParams.toString();
393
+ return this.request("GET", `/admin/multimedia${query ? `?${query}` : ""}`);
394
+ }
395
+ async create(data) {
396
+ return this.request("POST", "/admin/multimedia", data);
397
+ }
398
+ async importFromUrl(params) {
399
+ return this.request("POST", "/admin/multimedia/import-from-url", params);
400
+ }
401
+ async linkYoutube(params) {
402
+ return this.request("POST", "/admin/multimedia/link-youtube", params);
403
+ }
404
+ async linkWork(id, workId, relationshipType, notes) {
405
+ return this.request("POST", `/admin/multimedia/${id}/link-work`, {
406
+ work_id: workId,
407
+ relationship_type: relationshipType,
408
+ notes,
409
+ });
410
+ }
411
+ }
412
+ class AgreementsResource extends BaseResource {
413
+ async list(params) {
414
+ const queryParams = new URLSearchParams();
415
+ if (params?.query)
416
+ queryParams.set("query", params.query);
417
+ if (params?.agreement_type)
418
+ queryParams.set("agreement_type", params.agreement_type);
419
+ if (params?.status)
420
+ queryParams.set("status", params.status);
421
+ if (params?.party_name)
422
+ queryParams.set("party_name", params.party_name);
423
+ if (params?.includeWorkCounts)
424
+ queryParams.set("includeWorkCounts", "true");
425
+ if (params?.limit !== undefined)
426
+ queryParams.set("limit", String(params.limit));
427
+ if (params?.offset !== undefined)
428
+ queryParams.set("offset", String(params.offset));
429
+ const query = queryParams.toString();
430
+ return this.request("GET", `/admin/agreements${query ? `?${query}` : ""}`);
431
+ }
432
+ async get(id) {
433
+ return this.request("GET", `/admin/agreements/${id}`);
434
+ }
435
+ async create(data) {
436
+ return this.request("POST", "/admin/agreements", data);
437
+ }
438
+ async update(id, updates) {
439
+ return this.request("PATCH", `/admin/agreements/${id}`, updates);
440
+ }
441
+ async delete(id) {
442
+ await this.request("DELETE", `/admin/agreements/${id}`);
443
+ }
444
+ async getWorks(id) {
445
+ return this.request("GET", `/admin/agreements/${id}/works`);
446
+ }
447
+ async linkWork(id, data) {
448
+ return this.request("POST", `/admin/agreements/${id}/works`, data);
449
+ }
450
+ }
451
+ class WorkspaceResource extends BaseResource {
452
+ async getContext() {
453
+ return this.request("GET", "/admin/workspace/context");
454
+ }
455
+ async getRecentEvents(limit) {
456
+ return this.request("GET", `/admin/events?limit=${limit || 20}`);
457
+ }
458
+ }
459
+ class MemoryResource extends BaseResource {
460
+ async list() {
461
+ return this.request("GET", "/admin/memory");
462
+ }
463
+ async search(query) {
464
+ return this.request("GET", `/admin/memory/search?q=${encodeURIComponent(query)}`);
465
+ }
466
+ async save(params) {
467
+ return this.request("POST", "/admin/memory", params);
468
+ }
469
+ async delete(id) {
470
+ await this.request("DELETE", `/admin/memory/${id}`);
471
+ }
472
+ }
473
+ class NotesResource extends BaseResource {
474
+ async list(params) {
475
+ const query = new URLSearchParams();
476
+ if (params?.q)
477
+ query.set("q", params.q);
478
+ if (params?.work)
479
+ query.set("work", params.work);
480
+ if (params?.person)
481
+ query.set("person", params.person);
482
+ if (params?.limit)
483
+ query.set("limit", String(params.limit));
484
+ const qs = query.toString();
485
+ return this.request("GET", `/admin/notes${qs ? `?${qs}` : ""}`);
486
+ }
487
+ async get(id) {
488
+ return this.request("GET", `/admin/notes/${id}`);
489
+ }
490
+ async create(content, metadata) {
491
+ return this.request("POST", "/admin/notes", { content, ...metadata });
492
+ }
493
+ async delete(id) {
494
+ await this.request("DELETE", `/admin/notes/${id}`);
495
+ }
496
+ }
497
+ class TeamResource extends BaseResource {
498
+ async list() {
499
+ return this.request("GET", "/admin/team");
500
+ }
501
+ async get(id) {
502
+ return this.request("GET", `/admin/team/${id}`);
503
+ }
504
+ async invite(data) {
505
+ return this.request("POST", "/admin/team", data);
506
+ }
507
+ async update(id, data) {
508
+ return this.request("PATCH", `/admin/team/${id}`, data);
509
+ }
510
+ async remove(id) {
511
+ return this.request("DELETE", `/admin/team/${id}`);
512
+ }
513
+ }
514
+ class RecordingsResource extends BaseResource {
515
+ async list(params) {
516
+ const limit = params?.limit || 50;
517
+ return this.request("GET", `/admin/recordings?limit=${limit}`);
518
+ }
519
+ /**
520
+ * Search recordings. The recordings API doesn't support text search,
521
+ * so we fetch all and filter client-side for text queries.
522
+ */
523
+ async search(params) {
524
+ // Best-effort ceiling: recordings API has no text search, so we fetch up to 200
525
+ // and filter client-side. Will need server-side search when recordings exceed this.
526
+ const fetchLimit = params.query ? 200 : params.limit || 50;
527
+ const qp = new URLSearchParams();
528
+ qp.set("limit", String(fetchLimit));
529
+ if (params.offset !== undefined && !params.query)
530
+ qp.set("offset", String(params.offset));
531
+ const qs = qp.toString();
532
+ const result = await this.requestPaginated("GET", `/admin/recordings?${qs}`);
533
+ if (params.query) {
534
+ const q = params.query.toLowerCase();
535
+ const filtered = result.data.filter((r) => (r.title && r.title.toLowerCase().includes(q)) ||
536
+ (r.isrc && r.isrc.toLowerCase().includes(q)));
537
+ const limit = params.limit || 20;
538
+ const start = params.offset || 0;
539
+ return {
540
+ data: filtered.slice(start, start + limit),
541
+ total: filtered.length,
542
+ hasMore: start + limit < filtered.length,
543
+ };
544
+ }
545
+ return result;
546
+ }
547
+ async get(id) {
548
+ return this.request("GET", `/admin/recordings/${id}`);
549
+ }
550
+ async create(data) {
551
+ return this.request("POST", "/admin/recordings", data);
552
+ }
553
+ async update(id, updates) {
554
+ return this.request("PATCH", `/admin/recordings/${id}`, updates);
555
+ }
556
+ async delete(id) {
557
+ await this.request("DELETE", `/admin/recordings/${id}`);
558
+ }
559
+ async getByWork(workId) {
560
+ return this.request("GET", `/admin/works/${workId}/recordings`);
561
+ }
562
+ async prefixLookup(isrc) {
563
+ const prefix = isrc
564
+ .toUpperCase()
565
+ .replace(/[^A-Z0-9]/g, "")
566
+ .slice(0, 5);
567
+ if (prefix.length < 5)
568
+ return null;
569
+ try {
570
+ const result = await this.request("GET", `/admin/isrc/prefix/${prefix}`);
571
+ return result.data ?? null;
572
+ }
573
+ catch {
574
+ return null;
575
+ }
576
+ }
577
+ }
578
+ // --- Enrichment Resource ---
579
+ class EnrichmentResource extends BaseResource {
580
+ async enrichWork(workId) {
581
+ return this.request("POST", `/admin/works/${workId}/enrich`);
582
+ }
583
+ async enrichPerson(personId) {
584
+ return this.request("POST", `/admin/people/${personId}/enrich`);
585
+ }
586
+ async getWorkEnrichmentStatus(workId) {
587
+ return this.request("GET", `/admin/works/${workId}/enrichment-status`);
588
+ }
589
+ async getCandidates() {
590
+ return this.request("POST", "/admin/enrichment-candidates/refresh");
591
+ }
592
+ async enrichWorkMlc(workId) {
593
+ return this.request("POST", `/admin/works/${workId}/enrich-mlc`);
594
+ }
595
+ async enrichWorkMusicBrainz(workId) {
596
+ return this.request("GET", `/admin/works/${workId}/musicbrainz-preview`);
597
+ }
598
+ async enrichWorkDiscogs(workId) {
599
+ return this.request("GET", `/admin/works/${workId}/discogs-preview`);
600
+ }
601
+ async enrichWorkSpotify(workId) {
602
+ return this.request("POST", `/admin/spotify/enrich/${workId}`);
603
+ }
604
+ async enrichWorkYouTube(workId) {
605
+ return this.request("POST", `/admin/youtube/enrich/${workId}`);
606
+ }
607
+ }
608
+ // --- Registration Resource ---
609
+ class RegistrationResource extends BaseResource {
610
+ async getCoverage() {
611
+ return this.request("GET", "/admin/analytics/enrichment-coverage");
612
+ }
613
+ async getWorkCascadeStatus(workId) {
614
+ return this.request("GET", `/admin/works/${workId}/cascade-status`);
615
+ }
616
+ }
617
+ // --- Health Resource ---
618
+ class HealthResource extends BaseResource {
619
+ async getWorksHealth() {
620
+ return this.request("GET", "/admin/quality/works-health");
621
+ }
622
+ async getLowScoreWorks() {
623
+ return this.request("GET", "/admin/quality/completeness/low-score");
624
+ }
625
+ async getWorkCompleteness(workId) {
626
+ return this.request("GET", `/admin/quality/completeness/${workId}`);
627
+ }
628
+ }
629
+ // --- Dashboard & Discoveries Resource ---
630
+ class DashboardResource extends BaseResource {
631
+ async discoveries(params) {
632
+ const query = new URLSearchParams();
633
+ if (params?.unread)
634
+ query.set("unread", "true");
635
+ if (params?.limit)
636
+ query.set("limit", String(params.limit));
637
+ const qs = query.toString();
638
+ return this.request("GET", `/admin/discoveries${qs ? `?${qs}` : ""}`);
639
+ }
640
+ async pendingDiscoveries() {
641
+ return this.request("GET", "/admin/discoveries/pending");
642
+ }
643
+ async reviewDiscovery(discoveryId, status) {
644
+ return this.request("POST", "/admin/discoveries/review", {
645
+ discoveryId,
646
+ status,
647
+ });
648
+ }
649
+ async attentionItems(params) {
650
+ const query = new URLSearchParams();
651
+ if (params?.door)
652
+ query.set("door", params.door);
653
+ if (params?.limit)
654
+ query.set("limit", String(params.limit));
655
+ const qs = query.toString();
656
+ return this.request("GET", `/admin/dashboard/attention-items${qs ? `?${qs}` : ""}`);
657
+ }
658
+ async briefing() {
659
+ return this.request("GET", "/admin/dashboard/briefing");
660
+ }
661
+ async pulse() {
662
+ return this.request("GET", "/admin/dashboard/pulse");
663
+ }
664
+ }
665
+ // --- Integrations Resource ---
666
+ class IntegrationsResource extends BaseResource {
667
+ async oauthConnections() {
668
+ return this.request("GET", "/admin/integrations/oauth/connections");
669
+ }
670
+ async platforms() {
671
+ return this.request("GET", "/admin/integrations/platforms");
672
+ }
673
+ }
674
+ // --- Settings Resource (credits history, storage, org profile) ---
675
+ class SettingsResource extends BaseResource {
676
+ async creditsHistory(params) {
677
+ const query = new URLSearchParams();
678
+ if (params?.type)
679
+ query.set("type", params.type);
680
+ if (params?.limit)
681
+ query.set("limit", String(params.limit));
682
+ const qs = query.toString();
683
+ return this.request("GET", `/admin/credits/history${qs ? `?${qs}` : ""}`);
684
+ }
685
+ async storageConfig() {
686
+ return this.request("GET", "/admin/settings/storage");
687
+ }
688
+ async orgProfile() {
689
+ return this.request("GET", "/admin/settings/organisation-profile");
690
+ }
691
+ async userProfile() {
692
+ return this.request("GET", "/admin/settings/user-profile");
693
+ }
694
+ }
695
+ // --- Calendar Resource ---
696
+ class CalendarResource extends BaseResource {
697
+ async getEvents(params) {
698
+ const query = new URLSearchParams();
699
+ query.set("startDate", params.startDate);
700
+ query.set("endDate", params.endDate);
701
+ if (params.types?.length) {
702
+ params.types.forEach((t) => query.append("types[]", t));
703
+ }
704
+ if (params.workId)
705
+ query.set("workId", params.workId);
706
+ if (params.search)
707
+ query.set("search", params.search);
708
+ return this.request("GET", `/admin/calendar?${query.toString()}`);
709
+ }
710
+ }
711
+ // --- Notifications Resource ---
712
+ class NotificationsResource extends BaseResource {
713
+ async list() {
714
+ return this.request("GET", "/admin/notifications");
715
+ }
716
+ async markRead(ids) {
717
+ return this.request("POST", "/admin/notifications", {
718
+ notificationIds: ids,
719
+ });
720
+ }
721
+ async sendToPerson(params) {
722
+ return this.request("POST", "/admin/notifications/send-to-person", params);
723
+ }
724
+ }
725
+ // --- Analytics Resource (carbon, provenance, diligence) ---
726
+ class AnalyticsResource extends BaseResource {
727
+ async carbonSummary() {
728
+ return this.request("GET", "/admin/carbon/summary");
729
+ }
730
+ async carbonLive() {
731
+ return this.request("GET", "/admin/carbon/live");
732
+ }
733
+ async provenanceStats() {
734
+ return this.request("GET", "/admin/provenance/stats");
735
+ }
736
+ async provenanceWork(workId) {
737
+ return this.request("GET", `/admin/quality/provenance/${workId}`);
738
+ }
739
+ async provenanceCertificate(workId) {
740
+ return this.request("GET", `/admin/works/${workId}/certificate`);
741
+ }
742
+ async catalogDiligence() {
743
+ return this.request("GET", "/admin/exports/catalog-diligence");
744
+ }
745
+ }
746
+ // --- Bulk Operations Resource ---
747
+ class BulkResource extends BaseResource {
748
+ async updateWorks(workIds, updates) {
749
+ return this.request("POST", "/admin/works/bulk-update", {
750
+ work_ids: workIds,
751
+ updates,
752
+ });
753
+ }
754
+ async updatePeopleRoles(personIds, roles) {
755
+ return this.request("POST", "/admin/people/bulk-update-roles", {
756
+ person_ids: personIds,
757
+ roles,
758
+ });
759
+ }
760
+ }
761
+ // --- Export Resource ---
762
+ class ExportResource extends BaseResource {
763
+ async catalogCsv(params) {
764
+ const query = params?.format ? `?format=${params.format}` : "";
765
+ return this.request("GET", `/admin/works/export${query}`);
766
+ }
767
+ async songRegistration() {
768
+ return this.request("GET", "/admin/exports/song-registration");
769
+ }
770
+ async industryReady() {
771
+ return this.request("GET", "/admin/exports/industry-ready");
772
+ }
773
+ async catalogAssetReport(params) {
774
+ return this.request("POST", "/admin/exports/catalog-asset-report", params);
775
+ }
776
+ async aiConsent() {
777
+ return this.request("GET", "/admin/exports/ai-consent?format=json");
778
+ }
779
+ }
780
+ // --- Duplicates Resource ---
781
+ class DuplicatesResource extends BaseResource {
782
+ async findDuplicates(entityType) {
783
+ return this.request("GET", `/admin/catalog/duplicates?entity_type=${entityType}`);
784
+ }
785
+ async merge(entityType, winnerId, loserIds) {
786
+ return this.request("POST", "/admin/catalog/merge", {
787
+ entity_type: entityType,
788
+ winner_id: winnerId,
789
+ loser_ids: loserIds,
790
+ });
791
+ }
792
+ }
793
+ // --- Entity Context Resource (ADR-116 Phase 3) ---
794
+ class EntityContextResource extends BaseResource {
795
+ async getWorkFull(workId) {
796
+ return this.request("GET", `/admin/works/${workId}/full`);
797
+ }
798
+ async getPersonFull(personId) {
799
+ return this.request("GET", `/admin/people/${personId}/full`);
800
+ }
801
+ }
802
+ // --- Comparisons Resource (ADR-116 Phase 2) ---
803
+ class ComparisonsResource extends BaseResource {
804
+ async enrichmentCompare(params) {
805
+ const base = params.entityType === "work"
806
+ ? `/admin/works/${params.entityId}/enrichment-compare`
807
+ : `/admin/people/${params.entityId}/enrichment-compare`;
808
+ return this.request("GET", base);
809
+ }
810
+ async registrationsCompare(workId) {
811
+ return this.request("GET", `/admin/works/${workId}/registration-compare`);
812
+ }
813
+ }
814
+ // --- Send Hub Resource ---
815
+ class SendResource extends BaseResource {
816
+ async send(params) {
817
+ return this.request("POST", "/admin/send", params);
818
+ }
819
+ async list(params) {
820
+ const qp = new URLSearchParams();
821
+ if (params?.type)
822
+ qp.set("type", params.type);
823
+ if (params?.status)
824
+ qp.set("status", params.status);
825
+ if (params?.personId)
826
+ qp.set("person_id", params.personId);
827
+ if (params?.workId)
828
+ qp.set("work_id", params.workId);
829
+ if (params?.limit !== undefined)
830
+ qp.set("limit", String(params.limit));
831
+ if (params?.offset !== undefined)
832
+ qp.set("offset", String(params.offset));
833
+ const qs = qp.toString();
834
+ return this.request("GET", `/admin/send${qs ? `?${qs}` : ""}`);
835
+ }
836
+ async listPending() {
837
+ return this.request("GET", "/admin/send/pending");
838
+ }
839
+ async resend(id) {
840
+ return this.request("POST", `/admin/send/${id}/resend`);
841
+ }
842
+ }
843
+ // --- Assets Resource (physical assets: equipment, instruments, studio gear) ---
844
+ class AssetsResource extends BaseResource {
845
+ async list(params) {
846
+ const query = new URLSearchParams();
847
+ if (params?.category)
848
+ query.set("category", params.category);
849
+ if (params?.limit)
850
+ query.set("limit", String(params.limit));
851
+ const qs = query.toString();
852
+ return this.request("GET", `/admin/assets${qs ? `?${qs}` : ""}`);
853
+ }
854
+ async get(id) {
855
+ return this.request("GET", `/admin/assets/${id}`);
856
+ }
857
+ async create(data) {
858
+ return this.request("POST", "/admin/assets", data);
859
+ }
860
+ async update(id, data) {
861
+ return this.request("PATCH", `/admin/assets/${id}`, data);
862
+ }
863
+ async delete(id) {
864
+ return this.request("DELETE", `/admin/assets/${id}`);
865
+ }
866
+ async stats() {
867
+ return this.request("GET", "/admin/assets/stats");
868
+ }
869
+ async valuations(id) {
870
+ return this.request("GET", `/admin/assets/${id}/valuations`);
871
+ }
872
+ async exportAll() {
873
+ return this.request("GET", "/admin/assets/export");
874
+ }
875
+ async marketCheck(id) {
876
+ return this.request("GET", `/admin/assets/${id}/market-check`);
877
+ }
878
+ }
879
+ class StorageResource extends BaseResource {
880
+ async presignedUpload(params) {
881
+ return this.request("POST", "/admin/storage/presigned-upload", params);
882
+ }
883
+ async completeUpload(params) {
884
+ return this.request("POST", "/admin/storage/complete-upload", params);
885
+ }
886
+ }
887
+ class ImportResource extends BaseResource {
888
+ async analyze(params) {
889
+ return this.request("POST", "/admin/import/analyze", params);
890
+ }
891
+ async suggestMapping(params) {
892
+ return this.request("POST", "/admin/import/suggest-mapping", params);
893
+ }
894
+ async validate(params) {
895
+ return this.request("POST", "/admin/import/validate", params);
896
+ }
897
+ async execute(params) {
898
+ return this.request("POST", "/admin/import/execute", params);
899
+ }
900
+ async getFields(domain) {
901
+ return this.request("GET", `/admin/import/fields?domain=${domain}`);
902
+ }
903
+ async streamingLinkPreview(url) {
904
+ return this.request("POST", "/admin/import/streaming-link", { url });
905
+ }
906
+ async streamingLinkImport(url, selectedTrackIds) {
907
+ return this.request("POST", "/admin/import/streaming-link", {
908
+ url,
909
+ confirm: true,
910
+ selectedTrackIds,
911
+ });
912
+ }
913
+ async getTemplate(domain) {
914
+ // Template route returns CSV as text/csv — use raw fetch
915
+ const url = `${this.baseUrl}/admin/import/template?domain=${domain}`;
916
+ const response = await fetch(url, {
917
+ headers: { Authorization: `Bearer ${this.apiKey}` },
918
+ });
919
+ if (!response.ok)
920
+ throw new Error(`Template fetch failed: ${response.status}`);
921
+ return response.text();
922
+ }
923
+ }
924
+ // --- Documents Resource ---
925
+ class DocumentsResource extends BaseResource {
926
+ async analyse(id) {
927
+ return this.request("POST", `/admin/documents/${id}/analyse`);
928
+ }
929
+ }
930
+ class CollaboratorsResource extends BaseResource {
931
+ async invite(params) {
932
+ return this.request("POST", "/admin/collaborators/invite", params);
933
+ }
934
+ async listInvites(params) {
935
+ const qp = new URLSearchParams();
936
+ if (params?.status)
937
+ qp.set("status", params.status);
938
+ if (params?.workId)
939
+ qp.set("workId", params.workId);
940
+ if (params?.limit !== undefined)
941
+ qp.set("limit", String(params.limit));
942
+ const qs = qp.toString();
943
+ return this.request("GET", `/admin/collaborators/invites${qs ? `?${qs}` : ""}`);
944
+ }
945
+ async resendInvite(inviteId) {
946
+ return this.request("POST", `/admin/collaborators/invites/${inviteId}/resend`);
947
+ }
948
+ }
949
+ class DirectoryResource extends BaseResource {
950
+ async getSettings() {
951
+ return this.request("GET", "/admin/directory/settings");
952
+ }
953
+ async updateSettings(updates) {
954
+ return this.request("PATCH", "/admin/directory/settings", updates);
955
+ }
956
+ }
957
+ class ProjectsResource extends BaseResource {
958
+ async list(params) {
959
+ const qs = params?.limit ? `?limit=${params.limit}` : "";
960
+ return this.request("GET", `/admin/projects${qs}`);
961
+ }
962
+ async get(id) {
963
+ return this.request("GET", `/admin/projects/${id}`);
964
+ }
965
+ async create(data) {
966
+ return this.request("POST", "/admin/projects", data);
967
+ }
968
+ async update(id, data) {
969
+ return this.request("PATCH", `/admin/projects/${id}`, data);
970
+ }
971
+ async delete(id) {
972
+ return this.request("DELETE", `/admin/projects/${id}`);
973
+ }
974
+ }
975
+ class SplitSheetsResource extends BaseResource {
976
+ async listForWork(workId) {
977
+ return this.request("GET", `/admin/works/${workId}/split-sheet`);
978
+ }
979
+ async generate(workId) {
980
+ return this.request("POST", `/admin/works/${workId}/split-sheet`);
981
+ }
982
+ async get(workId, splitSheetId) {
983
+ return this.request("GET", `/admin/works/${workId}/split-sheet/${splitSheetId}`);
984
+ }
985
+ }
986
+ class RecordingSplitsResource extends BaseResource {
987
+ async list(recordingId) {
988
+ return this.request("GET", `/admin/recordings/${recordingId}/splits`);
989
+ }
990
+ async create(recordingId, data) {
991
+ return this.request("POST", `/admin/recordings/${recordingId}/splits`, data);
992
+ }
993
+ async update(recordingId, splitId, data) {
994
+ return this.request("PATCH", `/admin/recordings/${recordingId}/splits/${splitId}`, data);
995
+ }
996
+ async delete(recordingId, splitId) {
997
+ return this.request("DELETE", `/admin/recordings/${recordingId}/splits/${splitId}`);
998
+ }
999
+ async verify(recordingId, splitId) {
1000
+ return this.request("POST", `/admin/recordings/${recordingId}/splits/${splitId}/verify`);
1001
+ }
1002
+ }
1003
+ class ReleasesResource extends BaseResource {
1004
+ async list(params) {
1005
+ const qs = params?.limit ? `?limit=${params.limit}` : "";
1006
+ return this.request("GET", `/admin/releases${qs}`);
1007
+ }
1008
+ async get(id) {
1009
+ return this.request("GET", `/admin/releases/${id}`);
1010
+ }
1011
+ async create(data) {
1012
+ return this.request("POST", "/admin/releases", data);
1013
+ }
1014
+ async update(id, data) {
1015
+ return this.request("PATCH", `/admin/releases/${id}`, data);
1016
+ }
1017
+ async delete(id) {
1018
+ return this.request("DELETE", `/admin/releases/${id}`);
1019
+ }
1020
+ }
1021
+ class SessionsResource extends BaseResource {
1022
+ async list(params) {
1023
+ const qs = params?.limit ? `?limit=${params.limit}` : "";
1024
+ return this.request("GET", `/admin/sessions${qs}`);
1025
+ }
1026
+ async get(id) {
1027
+ return this.request("GET", `/admin/sessions/${id}`);
1028
+ }
1029
+ async create(data) {
1030
+ return this.request("POST", "/admin/sessions", data);
1031
+ }
1032
+ async update(id, data) {
1033
+ return this.request("PATCH", `/admin/sessions/${id}`, data);
1034
+ }
1035
+ async getTypes() {
1036
+ return this.request("GET", "/admin/sessions/types");
1037
+ }
1038
+ }
1039
+ class AgreementTemplatesResource extends BaseResource {
1040
+ async list() {
1041
+ return this.request("GET", "/admin/agreement-templates");
1042
+ }
1043
+ async get(id) {
1044
+ return this.request("GET", `/admin/agreement-templates/${id}`);
1045
+ }
1046
+ async create(data) {
1047
+ return this.request("POST", "/admin/agreement-templates", data);
1048
+ }
1049
+ async update(id, data) {
1050
+ return this.request("PATCH", `/admin/agreement-templates/${id}`, data);
1051
+ }
1052
+ async delete(id) {
1053
+ await this.request("DELETE", `/admin/agreement-templates/${id}`);
1054
+ }
1055
+ async render(id, data) {
1056
+ return this.request("POST", `/admin/agreement-templates/${id}/render`, data);
1057
+ }
1058
+ async duplicate(id) {
1059
+ return this.request("POST", `/admin/agreement-templates/${id}/duplicate`);
1060
+ }
1061
+ async setDefault(id) {
1062
+ return this.request("POST", `/admin/agreement-templates/${id}/set-default`);
1063
+ }
1064
+ }
1065
+ class ProducerAgreementsResource extends BaseResource {
1066
+ async list() {
1067
+ return this.request("GET", "/admin/producer-agreements");
1068
+ }
1069
+ async get(id) {
1070
+ return this.request("GET", `/admin/producer-agreements/${id}`);
1071
+ }
1072
+ async create(data) {
1073
+ return this.request("POST", "/admin/producer-agreements", data);
1074
+ }
1075
+ async update(id, data) {
1076
+ return this.request("PATCH", `/admin/producer-agreements/${id}`, data);
1077
+ }
1078
+ async delete(id) {
1079
+ await this.request("DELETE", `/admin/producer-agreements/${id}`);
1080
+ }
1081
+ }
1082
+ class WorkForHireResource extends BaseResource {
1083
+ async list() {
1084
+ return this.request("GET", "/admin/work-for-hire");
1085
+ }
1086
+ async get(id) {
1087
+ return this.request("GET", `/admin/work-for-hire/${id}`);
1088
+ }
1089
+ async create(data) {
1090
+ return this.request("POST", "/admin/work-for-hire", data);
1091
+ }
1092
+ async update(id, data) {
1093
+ return this.request("PATCH", `/admin/work-for-hire/${id}`, data);
1094
+ }
1095
+ async delete(id) {
1096
+ await this.request("DELETE", `/admin/work-for-hire/${id}`);
1097
+ }
1098
+ }
1099
+ class RoyaltiesResource extends BaseResource {
1100
+ async payments(params) {
1101
+ const qp = new URLSearchParams();
1102
+ if (params?.source)
1103
+ qp.set("source", params.source);
1104
+ if (params?.workId)
1105
+ qp.set("workId", params.workId);
1106
+ if (params?.fromDate)
1107
+ qp.set("fromDate", params.fromDate);
1108
+ if (params?.toDate)
1109
+ qp.set("toDate", params.toDate);
1110
+ if (params?.limit)
1111
+ qp.set("limit", String(params.limit));
1112
+ if (params?.offset)
1113
+ qp.set("offset", String(params.offset));
1114
+ const qs = qp.toString();
1115
+ return this.request("GET", `/admin/royalties/payments${qs ? `?${qs}` : ""}`);
1116
+ }
1117
+ async earnings(params) {
1118
+ const qp = new URLSearchParams();
1119
+ if (params?.start_date)
1120
+ qp.set("start_date", params.start_date);
1121
+ if (params?.end_date)
1122
+ qp.set("end_date", params.end_date);
1123
+ if (params?.source)
1124
+ qp.set("source", params.source);
1125
+ if (params?.limit)
1126
+ qp.set("limit", String(params.limit));
1127
+ if (params?.offset)
1128
+ qp.set("offset", String(params.offset));
1129
+ const qs = qp.toString();
1130
+ return this.request("GET", `/admin/royalties/earnings${qs ? `?${qs}` : ""}`);
1131
+ }
1132
+ async gaps(params) {
1133
+ const qp = new URLSearchParams();
1134
+ if (params?.priority)
1135
+ qp.set("priority", params.priority);
1136
+ if (params?.gapType)
1137
+ qp.set("gapType", params.gapType);
1138
+ if (params?.workId)
1139
+ qp.set("workId", params.workId);
1140
+ if (params?.limit)
1141
+ qp.set("limit", String(params.limit));
1142
+ const qs = qp.toString();
1143
+ return this.request("GET", `/admin/royalties/gaps${qs ? `?${qs}` : ""}`);
1144
+ }
1145
+ async stats() {
1146
+ return this.request("GET", "/admin/royalties/stats");
1147
+ }
1148
+ }
1149
+ class StatementsResource extends BaseResource {
1150
+ async history(params) {
1151
+ const qp = new URLSearchParams();
1152
+ if (params?.source)
1153
+ qp.set("source", params.source);
1154
+ if (params?.dateFrom)
1155
+ qp.set("dateFrom", params.dateFrom);
1156
+ if (params?.dateTo)
1157
+ qp.set("dateTo", params.dateTo);
1158
+ if (params?.search)
1159
+ qp.set("search", params.search);
1160
+ if (params?.limit)
1161
+ qp.set("limit", String(params.limit));
1162
+ if (params?.offset)
1163
+ qp.set("offset", String(params.offset));
1164
+ if (params?.sort)
1165
+ qp.set("sort", params.sort);
1166
+ const qs = qp.toString();
1167
+ return this.request("GET", `/admin/statements/history${qs ? `?${qs}` : ""}`);
1168
+ }
1169
+ async get(batchId) {
1170
+ return this.request("GET", `/admin/statements/${batchId}`);
1171
+ }
1172
+ }
1173
+ class ShareLinksResource extends BaseResource {
1174
+ async list(params) {
1175
+ const qp = new URLSearchParams();
1176
+ if (params?.work_id)
1177
+ qp.set("work_id", params.work_id);
1178
+ const qs = qp.toString();
1179
+ return this.request("GET", `/admin/share-links${qs ? `?${qs}` : ""}`);
1180
+ }
1181
+ async create(data) {
1182
+ return this.request("POST", "/admin/share-links", data);
1183
+ }
1184
+ }
1185
+ class DisputesResource extends BaseResource {
1186
+ async list(params) {
1187
+ const qp = new URLSearchParams();
1188
+ if (params?.status)
1189
+ qp.set("status", params.status);
1190
+ const qs = qp.toString();
1191
+ return this.request("GET", `/admin/disputes${qs ? `?${qs}` : ""}`);
1192
+ }
1193
+ }
1194
+ class ChainResource extends BaseResource {
1195
+ async search(params) {
1196
+ const qp = new URLSearchParams();
1197
+ qp.set("q", params.q);
1198
+ if (params.limit)
1199
+ qp.set("limit", String(params.limit));
1200
+ if (params.expand_first !== undefined)
1201
+ qp.set("expand_first", String(params.expand_first));
1202
+ return this.request("GET", `/admin/chain?${qp.toString()}`);
1203
+ }
1204
+ async getById(type, id) {
1205
+ return this.request("GET", `/admin/chain?type=${type}&id=${id}`);
1206
+ }
1207
+ async traverse(identifier) {
1208
+ return this.request("GET", `/admin/chain?identifier=${encodeURIComponent(identifier)}`);
1209
+ }
1210
+ }
1211
+ class TelegramResource extends BaseResource {
1212
+ async getStatus() {
1213
+ return this.request("GET", "/admin/settings/telegram");
1214
+ }
1215
+ async sendNotification(message) {
1216
+ return this.request("POST", "/admin/settings/telegram/test", {
1217
+ message,
1218
+ });
1219
+ }
1220
+ async getPreferences() {
1221
+ return this.request("GET", "/admin/settings/telegram/notifications");
1222
+ }
1223
+ }
1224
+ class ImportDocumentsResource extends BaseResource {
1225
+ async list(options) {
1226
+ const params = new URLSearchParams();
1227
+ if (options?.source)
1228
+ params.set("source", options.source);
1229
+ if (options?.period)
1230
+ params.set("period", options.period);
1231
+ if (options?.document_type)
1232
+ params.set("document_type", options.document_type);
1233
+ if (options?.limit)
1234
+ params.set("limit", String(options.limit));
1235
+ const qs = params.toString();
1236
+ return this.request("GET", `/admin/import-documents${qs ? `?${qs}` : ""}`);
1237
+ }
1238
+ async get(id) {
1239
+ return this.request("GET", `/admin/import-documents/${id}`);
1240
+ }
1241
+ async ingest(content) {
1242
+ return this.request("POST", "/admin/import-documents", { content });
1243
+ }
1244
+ }
1245
+ export class PicaClient {
1246
+ works;
1247
+ people;
1248
+ recordings;
1249
+ licensing;
1250
+ credits;
1251
+ creditsBalance;
1252
+ picaScore;
1253
+ audioFiles;
1254
+ multimedia;
1255
+ agreements;
1256
+ workspace;
1257
+ memory;
1258
+ enrichment;
1259
+ registration;
1260
+ health;
1261
+ bulk;
1262
+ exports;
1263
+ duplicates;
1264
+ collaborators;
1265
+ entityContext;
1266
+ comparisons;
1267
+ send;
1268
+ imports;
1269
+ storage;
1270
+ documents;
1271
+ analytics;
1272
+ notifications;
1273
+ calendar;
1274
+ dashboard;
1275
+ integrations;
1276
+ settings;
1277
+ directory;
1278
+ importDocuments;
1279
+ sessions;
1280
+ assets;
1281
+ notes;
1282
+ team;
1283
+ projects;
1284
+ releases;
1285
+ splitSheets;
1286
+ recordingSplits;
1287
+ agreementTemplates;
1288
+ producerAgreements;
1289
+ workForHire;
1290
+ royalties;
1291
+ statements;
1292
+ shareLinks;
1293
+ disputes;
1294
+ chain;
1295
+ telegram;
1296
+ /**
1297
+ * Get accurate catalog stats via SQL counts (no pagination limits)
1298
+ */
1299
+ async catalogStats() {
1300
+ const baseUrl = this.works["baseUrl"];
1301
+ const apiKey = this.works["apiKey"];
1302
+ const res = await fetch(`${baseUrl}/admin/catalog/stats`, {
1303
+ headers: {
1304
+ Authorization: `Bearer ${apiKey}`,
1305
+ "Content-Type": "application/json",
1306
+ },
1307
+ });
1308
+ if (!res.ok)
1309
+ throw new Error(`Catalog stats failed: ${res.status}`);
1310
+ const json = (await res.json());
1311
+ return (json.data || json);
1312
+ }
1313
+ constructor(config) {
1314
+ if (!config.apiKey) {
1315
+ throw new Error("API key is required");
1316
+ }
1317
+ const baseUrl = config.baseUrl || "https://withpica.com/api";
1318
+ const debug = config.debug || false;
1319
+ this.works = new WorksResource(baseUrl, config.apiKey, debug);
1320
+ this.people = new PeopleResource(baseUrl, config.apiKey, debug);
1321
+ this.recordings = new RecordingsResource(baseUrl, config.apiKey, debug);
1322
+ this.licensing = new LicensingResource(baseUrl, config.apiKey, debug);
1323
+ this.credits = new CreditsResource(baseUrl, config.apiKey, debug);
1324
+ this.creditsBalance = new CreditsBalanceResource(baseUrl, config.apiKey, debug);
1325
+ this.picaScore = new PicaScoreResource(baseUrl, config.apiKey, debug);
1326
+ this.audioFiles = new AudioFilesResource(baseUrl, config.apiKey, debug);
1327
+ this.multimedia = new MultimediaResource(baseUrl, config.apiKey, debug);
1328
+ this.agreements = new AgreementsResource(baseUrl, config.apiKey, debug);
1329
+ this.workspace = new WorkspaceResource(baseUrl, config.apiKey, debug);
1330
+ this.memory = new MemoryResource(baseUrl, config.apiKey, debug);
1331
+ this.enrichment = new EnrichmentResource(baseUrl, config.apiKey, debug);
1332
+ this.registration = new RegistrationResource(baseUrl, config.apiKey, debug);
1333
+ this.health = new HealthResource(baseUrl, config.apiKey, debug);
1334
+ this.bulk = new BulkResource(baseUrl, config.apiKey, debug);
1335
+ this.exports = new ExportResource(baseUrl, config.apiKey, debug);
1336
+ this.duplicates = new DuplicatesResource(baseUrl, config.apiKey, debug);
1337
+ this.collaborators = new CollaboratorsResource(baseUrl, config.apiKey, debug);
1338
+ this.entityContext = new EntityContextResource(baseUrl, config.apiKey, debug);
1339
+ this.comparisons = new ComparisonsResource(baseUrl, config.apiKey, debug);
1340
+ this.send = new SendResource(baseUrl, config.apiKey, debug);
1341
+ this.imports = new ImportResource(baseUrl, config.apiKey, debug);
1342
+ this.storage = new StorageResource(baseUrl, config.apiKey, debug);
1343
+ this.documents = new DocumentsResource(baseUrl, config.apiKey, debug);
1344
+ this.analytics = new AnalyticsResource(baseUrl, config.apiKey, debug);
1345
+ this.notifications = new NotificationsResource(baseUrl, config.apiKey, debug);
1346
+ this.calendar = new CalendarResource(baseUrl, config.apiKey, debug);
1347
+ this.dashboard = new DashboardResource(baseUrl, config.apiKey, debug);
1348
+ this.integrations = new IntegrationsResource(baseUrl, config.apiKey, debug);
1349
+ this.settings = new SettingsResource(baseUrl, config.apiKey, debug);
1350
+ this.directory = new DirectoryResource(baseUrl, config.apiKey, debug);
1351
+ this.importDocuments = new ImportDocumentsResource(baseUrl, config.apiKey, debug);
1352
+ this.sessions = new SessionsResource(baseUrl, config.apiKey, debug);
1353
+ this.assets = new AssetsResource(baseUrl, config.apiKey, debug);
1354
+ this.notes = new NotesResource(baseUrl, config.apiKey, debug);
1355
+ this.team = new TeamResource(baseUrl, config.apiKey, debug);
1356
+ this.projects = new ProjectsResource(baseUrl, config.apiKey, debug);
1357
+ this.releases = new ReleasesResource(baseUrl, config.apiKey, debug);
1358
+ this.splitSheets = new SplitSheetsResource(baseUrl, config.apiKey, debug);
1359
+ this.recordingSplits = new RecordingSplitsResource(baseUrl, config.apiKey, debug);
1360
+ this.agreementTemplates = new AgreementTemplatesResource(baseUrl, config.apiKey, debug);
1361
+ this.producerAgreements = new ProducerAgreementsResource(baseUrl, config.apiKey, debug);
1362
+ this.workForHire = new WorkForHireResource(baseUrl, config.apiKey, debug);
1363
+ this.royalties = new RoyaltiesResource(baseUrl, config.apiKey, debug);
1364
+ this.statements = new StatementsResource(baseUrl, config.apiKey, debug);
1365
+ this.shareLinks = new ShareLinksResource(baseUrl, config.apiKey, debug);
1366
+ this.disputes = new DisputesResource(baseUrl, config.apiKey, debug);
1367
+ this.chain = new ChainResource(baseUrl, config.apiKey, debug);
1368
+ this.telegram = new TelegramResource(baseUrl, config.apiKey, debug);
1369
+ }
1370
+ }
1371
+ //# sourceMappingURL=pica-sdk.js.map