@withpica/mcp-server 2.5.4 → 2.6.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 (269) hide show
  1. package/dist/apps/download.d.ts +2 -0
  2. package/dist/apps/download.d.ts.map +1 -0
  3. package/dist/apps/download.js +125 -0
  4. package/dist/apps/download.js.map +1 -0
  5. package/dist/apps/shared.d.ts +11 -0
  6. package/dist/apps/shared.d.ts.map +1 -1
  7. package/dist/apps/shared.js +212 -0
  8. package/dist/apps/shared.js.map +1 -1
  9. package/dist/apps/upload.d.ts +2 -0
  10. package/dist/apps/upload.d.ts.map +1 -0
  11. package/dist/apps/upload.js +280 -0
  12. package/dist/apps/upload.js.map +1 -0
  13. package/dist/config.d.ts +1 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +6 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/resources/index.d.ts +1 -1
  18. package/dist/resources/index.d.ts.map +1 -1
  19. package/dist/resources/index.js +39 -8
  20. package/dist/resources/index.js.map +1 -1
  21. package/dist/server.d.ts.map +1 -1
  22. package/dist/server.js +18 -6
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/agreement-types.d.ts +1 -1
  25. package/dist/tools/agreement-types.d.ts.map +1 -1
  26. package/dist/tools/agreement-types.js +2 -2
  27. package/dist/tools/agreement-types.js.map +1 -1
  28. package/dist/tools/agreements.d.ts +1 -1
  29. package/dist/tools/agreements.d.ts.map +1 -1
  30. package/dist/tools/agreements.js +2 -2
  31. package/dist/tools/agreements.js.map +1 -1
  32. package/dist/tools/analytics.d.ts +1 -1
  33. package/dist/tools/analytics.d.ts.map +1 -1
  34. package/dist/tools/analytics.js +1 -1
  35. package/dist/tools/analytics.js.map +1 -1
  36. package/dist/tools/app-tools.d.ts +8 -5
  37. package/dist/tools/app-tools.d.ts.map +1 -1
  38. package/dist/tools/app-tools.js +215 -54
  39. package/dist/tools/app-tools.js.map +1 -1
  40. package/dist/tools/assets.d.ts +1 -1
  41. package/dist/tools/assets.d.ts.map +1 -1
  42. package/dist/tools/assets.js +215 -14
  43. package/dist/tools/assets.js.map +1 -1
  44. package/dist/tools/audio-files.d.ts +1 -1
  45. package/dist/tools/audio-files.d.ts.map +1 -1
  46. package/dist/tools/audio-files.js +2 -2
  47. package/dist/tools/audio-files.js.map +1 -1
  48. package/dist/tools/auth.d.ts.map +1 -1
  49. package/dist/tools/auth.js +8 -3
  50. package/dist/tools/auth.js.map +1 -1
  51. package/dist/tools/bulk.d.ts +1 -1
  52. package/dist/tools/bulk.d.ts.map +1 -1
  53. package/dist/tools/bulk.js +1 -1
  54. package/dist/tools/bulk.js.map +1 -1
  55. package/dist/tools/calendar.d.ts +1 -1
  56. package/dist/tools/calendar.d.ts.map +1 -1
  57. package/dist/tools/calendar.js +1 -1
  58. package/dist/tools/calendar.js.map +1 -1
  59. package/dist/tools/collaborators.d.ts +1 -1
  60. package/dist/tools/collaborators.d.ts.map +1 -1
  61. package/dist/tools/collaborators.js +1 -1
  62. package/dist/tools/collaborators.js.map +1 -1
  63. package/dist/tools/comparisons.d.ts +1 -1
  64. package/dist/tools/comparisons.d.ts.map +1 -1
  65. package/dist/tools/comparisons.js +1 -1
  66. package/dist/tools/comparisons.js.map +1 -1
  67. package/dist/tools/credits.d.ts +1 -1
  68. package/dist/tools/credits.d.ts.map +1 -1
  69. package/dist/tools/credits.js +2 -2
  70. package/dist/tools/credits.js.map +1 -1
  71. package/dist/tools/dashboard.d.ts +1 -1
  72. package/dist/tools/dashboard.d.ts.map +1 -1
  73. package/dist/tools/dashboard.js +1 -1
  74. package/dist/tools/dashboard.js.map +1 -1
  75. package/dist/tools/directory.d.ts +1 -1
  76. package/dist/tools/directory.d.ts.map +1 -1
  77. package/dist/tools/directory.js +1 -1
  78. package/dist/tools/directory.js.map +1 -1
  79. package/dist/tools/discovery.d.ts +28 -0
  80. package/dist/tools/discovery.d.ts.map +1 -0
  81. package/dist/tools/discovery.js +560 -0
  82. package/dist/tools/discovery.js.map +1 -0
  83. package/dist/tools/disputes.d.ts +1 -1
  84. package/dist/tools/disputes.d.ts.map +1 -1
  85. package/dist/tools/disputes.js +1 -1
  86. package/dist/tools/disputes.js.map +1 -1
  87. package/dist/tools/documents.d.ts +1 -1
  88. package/dist/tools/documents.d.ts.map +1 -1
  89. package/dist/tools/documents.js +1 -1
  90. package/dist/tools/documents.js.map +1 -1
  91. package/dist/tools/duplicates.d.ts +1 -1
  92. package/dist/tools/duplicates.d.ts.map +1 -1
  93. package/dist/tools/duplicates.js +5 -3
  94. package/dist/tools/duplicates.js.map +1 -1
  95. package/dist/tools/enrichment.d.ts +1 -1
  96. package/dist/tools/enrichment.d.ts.map +1 -1
  97. package/dist/tools/enrichment.js +3 -3
  98. package/dist/tools/enrichment.js.map +1 -1
  99. package/dist/tools/exports.d.ts +1 -1
  100. package/dist/tools/exports.d.ts.map +1 -1
  101. package/dist/tools/exports.js +2 -2
  102. package/dist/tools/exports.js.map +1 -1
  103. package/dist/tools/import-documents.d.ts +1 -1
  104. package/dist/tools/import-documents.d.ts.map +1 -1
  105. package/dist/tools/import-documents.js +1 -1
  106. package/dist/tools/import-documents.js.map +1 -1
  107. package/dist/tools/import.d.ts +1 -1
  108. package/dist/tools/import.d.ts.map +1 -1
  109. package/dist/tools/import.js +1 -1
  110. package/dist/tools/import.js.map +1 -1
  111. package/dist/tools/index.d.ts +8 -4
  112. package/dist/tools/index.d.ts.map +1 -1
  113. package/dist/tools/index.js +43 -16
  114. package/dist/tools/index.js.map +1 -1
  115. package/dist/tools/integrations.d.ts +1 -1
  116. package/dist/tools/integrations.d.ts.map +1 -1
  117. package/dist/tools/integrations.js +1 -1
  118. package/dist/tools/integrations.js.map +1 -1
  119. package/dist/tools/licensing.d.ts +1 -1
  120. package/dist/tools/licensing.d.ts.map +1 -1
  121. package/dist/tools/licensing.js +1 -1
  122. package/dist/tools/licensing.js.map +1 -1
  123. package/dist/tools/memory.d.ts +1 -1
  124. package/dist/tools/memory.d.ts.map +1 -1
  125. package/dist/tools/memory.js +1 -1
  126. package/dist/tools/memory.js.map +1 -1
  127. package/dist/tools/metadata.d.ts.map +1 -1
  128. package/dist/tools/metadata.js +15 -3
  129. package/dist/tools/metadata.js.map +1 -1
  130. package/dist/tools/multimedia.d.ts +1 -1
  131. package/dist/tools/multimedia.d.ts.map +1 -1
  132. package/dist/tools/multimedia.js +1 -1
  133. package/dist/tools/multimedia.js.map +1 -1
  134. package/dist/tools/notes.d.ts +1 -1
  135. package/dist/tools/notes.d.ts.map +1 -1
  136. package/dist/tools/notes.js +1 -1
  137. package/dist/tools/notes.js.map +1 -1
  138. package/dist/tools/notifications.d.ts +1 -1
  139. package/dist/tools/notifications.d.ts.map +1 -1
  140. package/dist/tools/notifications.js +1 -1
  141. package/dist/tools/notifications.js.map +1 -1
  142. package/dist/tools/people.d.ts +1 -1
  143. package/dist/tools/people.d.ts.map +1 -1
  144. package/dist/tools/people.js +2 -2
  145. package/dist/tools/people.js.map +1 -1
  146. package/dist/tools/projects.d.ts +1 -1
  147. package/dist/tools/projects.d.ts.map +1 -1
  148. package/dist/tools/projects.js +1 -1
  149. package/dist/tools/projects.js.map +1 -1
  150. package/dist/tools/publishers.d.ts +1 -1
  151. package/dist/tools/publishers.d.ts.map +1 -1
  152. package/dist/tools/publishers.js +1 -1
  153. package/dist/tools/publishers.js.map +1 -1
  154. package/dist/tools/purchases.d.ts +1 -1
  155. package/dist/tools/purchases.d.ts.map +1 -1
  156. package/dist/tools/purchases.js +1 -1
  157. package/dist/tools/purchases.js.map +1 -1
  158. package/dist/tools/recordings.d.ts +1 -1
  159. package/dist/tools/recordings.d.ts.map +1 -1
  160. package/dist/tools/recordings.js +1 -1
  161. package/dist/tools/recordings.js.map +1 -1
  162. package/dist/tools/releases.d.ts +1 -1
  163. package/dist/tools/releases.d.ts.map +1 -1
  164. package/dist/tools/releases.js +1 -1
  165. package/dist/tools/releases.js.map +1 -1
  166. package/dist/tools/royalties.d.ts +1 -1
  167. package/dist/tools/royalties.d.ts.map +1 -1
  168. package/dist/tools/royalties.js +1 -1
  169. package/dist/tools/royalties.js.map +1 -1
  170. package/dist/tools/search.d.ts +1 -1
  171. package/dist/tools/search.d.ts.map +1 -1
  172. package/dist/tools/search.js +1 -1
  173. package/dist/tools/search.js.map +1 -1
  174. package/dist/tools/send.d.ts +1 -1
  175. package/dist/tools/send.d.ts.map +1 -1
  176. package/dist/tools/send.js +1 -1
  177. package/dist/tools/send.js.map +1 -1
  178. package/dist/tools/sessions.d.ts +1 -1
  179. package/dist/tools/sessions.d.ts.map +1 -1
  180. package/dist/tools/sessions.js +1 -1
  181. package/dist/tools/sessions.js.map +1 -1
  182. package/dist/tools/settings.d.ts +1 -1
  183. package/dist/tools/settings.d.ts.map +1 -1
  184. package/dist/tools/settings.js +1 -1
  185. package/dist/tools/settings.js.map +1 -1
  186. package/dist/tools/share-links.d.ts +1 -1
  187. package/dist/tools/share-links.d.ts.map +1 -1
  188. package/dist/tools/share-links.js +1 -1
  189. package/dist/tools/share-links.js.map +1 -1
  190. package/dist/tools/split-sheets.d.ts +1 -1
  191. package/dist/tools/split-sheets.d.ts.map +1 -1
  192. package/dist/tools/split-sheets.js +1 -1
  193. package/dist/tools/split-sheets.js.map +1 -1
  194. package/dist/tools/team.d.ts +1 -1
  195. package/dist/tools/team.d.ts.map +1 -1
  196. package/dist/tools/team.js +1 -1
  197. package/dist/tools/team.js.map +1 -1
  198. package/dist/tools/telegram.d.ts +1 -1
  199. package/dist/tools/telegram.d.ts.map +1 -1
  200. package/dist/tools/telegram.js +1 -1
  201. package/dist/tools/telegram.js.map +1 -1
  202. package/dist/tools/uploads.d.ts +1 -1
  203. package/dist/tools/uploads.d.ts.map +1 -1
  204. package/dist/tools/uploads.js +1 -1
  205. package/dist/tools/uploads.js.map +1 -1
  206. package/dist/tools/works.d.ts +1 -1
  207. package/dist/tools/works.d.ts.map +1 -1
  208. package/dist/tools/works.js +1 -1
  209. package/dist/tools/works.js.map +1 -1
  210. package/package.json +3 -1
  211. package/.mcpregistry_github_token +0 -1
  212. package/.mcpregistry_registry_token +0 -1
  213. package/dist/apps/briefing.d.ts +0 -2
  214. package/dist/apps/briefing.d.ts.map +0 -1
  215. package/dist/apps/briefing.js +0 -308
  216. package/dist/apps/briefing.js.map +0 -1
  217. package/dist/pica-sdk.d.ts +0 -1181
  218. package/dist/pica-sdk.d.ts.map +0 -1
  219. package/dist/pica-sdk.js +0 -1419
  220. package/dist/pica-sdk.js.map +0 -1
  221. package/dist/tools/health.d.ts +0 -17
  222. package/dist/tools/health.d.ts.map +0 -1
  223. package/dist/tools/health.js +0 -67
  224. package/dist/tools/health.js.map +0 -1
  225. package/dist/tools/pica-score.d.ts +0 -15
  226. package/dist/tools/pica-score.d.ts.map +0 -1
  227. package/dist/tools/pica-score.js +0 -28
  228. package/dist/tools/pica-score.js.map +0 -1
  229. package/dist/tools/registration.d.ts +0 -16
  230. package/dist/tools/registration.d.ts.map +0 -1
  231. package/dist/tools/registration.js +0 -50
  232. package/dist/tools/registration.js.map +0 -1
  233. package/dist/utils/audit.d.ts +0 -28
  234. package/dist/utils/audit.d.ts.map +0 -1
  235. package/dist/utils/audit.js +0 -28
  236. package/dist/utils/audit.js.map +0 -1
  237. package/dist/utils/confirmation.d.ts +0 -12
  238. package/dist/utils/confirmation.d.ts.map +0 -1
  239. package/dist/utils/confirmation.js +0 -78
  240. package/dist/utils/confirmation.js.map +0 -1
  241. package/dist/utils/credentials.d.ts +0 -11
  242. package/dist/utils/credentials.d.ts.map +0 -1
  243. package/dist/utils/credentials.js +0 -47
  244. package/dist/utils/credentials.js.map +0 -1
  245. package/dist/utils/credit-gate.d.ts +0 -17
  246. package/dist/utils/credit-gate.d.ts.map +0 -1
  247. package/dist/utils/credit-gate.js +0 -100
  248. package/dist/utils/credit-gate.js.map +0 -1
  249. package/dist/utils/enrichment-format.d.ts +0 -31
  250. package/dist/utils/enrichment-format.d.ts.map +0 -1
  251. package/dist/utils/enrichment-format.js +0 -69
  252. package/dist/utils/enrichment-format.js.map +0 -1
  253. package/dist/utils/errors.d.ts +0 -29
  254. package/dist/utils/errors.d.ts.map +0 -1
  255. package/dist/utils/errors.js +0 -139
  256. package/dist/utils/errors.js.map +0 -1
  257. package/dist/utils/formatting.d.ts +0 -64
  258. package/dist/utils/formatting.d.ts.map +0 -1
  259. package/dist/utils/formatting.js +0 -153
  260. package/dist/utils/formatting.js.map +0 -1
  261. package/dist/utils/mpp.d.ts +0 -63
  262. package/dist/utils/mpp.d.ts.map +0 -1
  263. package/dist/utils/mpp.js +0 -137
  264. package/dist/utils/mpp.js.map +0 -1
  265. package/dist/utils/notify-parties.d.ts +0 -35
  266. package/dist/utils/notify-parties.d.ts.map +0 -1
  267. package/dist/utils/notify-parties.js +0 -59
  268. package/dist/utils/notify-parties.js.map +0 -1
  269. package/server.json +0 -30
@@ -246,6 +246,174 @@ export const PICA_APP_JS = `
246
246
  })();
247
247
  `;
248
248
  // ---------------------------------------------------------------------------
249
+ // Upload manager — reusable per-file state machine for card file uploads.
250
+ // Exposed as an ES5 JS string snippet that cards embed in their own script
251
+ // block. Instantiate with createUploadManager({ accept, onStateChange, app }).
252
+ //
253
+ // State machine per file: pending -> uploading -> uploaded | failed | network_error
254
+ // Routes audio uploads through pica_audio_presigned_upload + pica_audio_complete_upload;
255
+ // all other types go through pica_upload_file + pica_upload_complete.
256
+ //
257
+ // Methods returned: addFiles(FileList), removeFile(id), retryFile(id), getFiles()
258
+ // ---------------------------------------------------------------------------
259
+ export const PICA_UPLOAD_MANAGER_JS = `
260
+ function createUploadManager(config) {
261
+ config = config || {};
262
+ var accept = config.accept || "any";
263
+ var onStateChange = config.onStateChange || function () {};
264
+ var app = config.app;
265
+
266
+ var files = [];
267
+ var idCounter = 0;
268
+
269
+ function notify() {
270
+ try { onStateChange(files.slice()); } catch (_) {}
271
+ }
272
+
273
+ function findFile(id) {
274
+ for (var i = 0; i < files.length; i++) {
275
+ if (files[i].id === id) return files[i];
276
+ }
277
+ return null;
278
+ }
279
+
280
+ function setState(id, state, extra) {
281
+ var f = findFile(id);
282
+ if (!f) return;
283
+ f.state = state;
284
+ if (extra && extra.url) f.url = extra.url;
285
+ if (extra && extra.meta) {
286
+ f.mime_type = extra.meta.mime_type;
287
+ f.size = extra.meta.size;
288
+ f.uploaded_at = extra.meta.uploaded_at;
289
+ f.upload_id = extra.meta.upload_id;
290
+ }
291
+ if (extra && extra.error) f.error = extra.error;
292
+ notify();
293
+ }
294
+
295
+ function doUpload(fileRecord) {
296
+ var file = fileRecord.file;
297
+ var id = fileRecord.id;
298
+ var isAudio = accept === "audio";
299
+ var presignTool = isAudio ? "pica_audio_presigned_upload" : "pica_upload_file";
300
+ var completeTool = isAudio ? "pica_audio_complete_upload" : "pica_upload_complete";
301
+
302
+ app.callServerTool({
303
+ name: presignTool,
304
+ arguments: {
305
+ filename: file.name,
306
+ content_type: file.type,
307
+ file_size: file.size,
308
+ },
309
+ }).then(function (presignResult) {
310
+ if (presignResult && presignResult.isError) throw new Error("presign failed");
311
+ var presign;
312
+ try {
313
+ presign = JSON.parse(presignResult.content[0].text);
314
+ } catch (_) {
315
+ throw new Error("presign parse failed");
316
+ }
317
+ var presignData = presign.data || presign;
318
+
319
+ return fetch(presignData.upload_url, { method: "PUT", body: file })
320
+ .then(function (res) {
321
+ if (!res.ok) throw new Error("upload failed: " + res.status);
322
+ return presignData;
323
+ })
324
+ .catch(function (netErr) {
325
+ setState(id, "network_error", { error: netErr && netErr.message });
326
+ throw new Error("__network_error__");
327
+ });
328
+ }).then(function (presignData) {
329
+ return app.callServerTool({
330
+ name: completeTool,
331
+ arguments: {
332
+ upload_id: presignData.upload_id,
333
+ key: presignData.key,
334
+ bucket: presignData.bucket,
335
+ storage_category: presignData.storage_category,
336
+ filename: file.name,
337
+ content_type: file.type,
338
+ file_size: file.size,
339
+ },
340
+ });
341
+ }).then(function (completeResult) {
342
+ if (completeResult && completeResult.isError) throw new Error("complete failed");
343
+ var completed;
344
+ try {
345
+ completed = JSON.parse(completeResult.content[0].text);
346
+ } catch (_) {
347
+ throw new Error("complete parse failed");
348
+ }
349
+ var completedData = completed.data || completed;
350
+ setState(id, "uploaded", {
351
+ url: completedData.url,
352
+ meta: {
353
+ mime_type: file.type,
354
+ size: file.size,
355
+ uploaded_at: new Date().toISOString(),
356
+ upload_id: completedData.id || completedData.upload_id || null,
357
+ },
358
+ });
359
+ }).catch(function (err) {
360
+ if (err && err.message === "__network_error__") return;
361
+ setState(id, "failed", { error: err && err.message });
362
+ });
363
+ }
364
+
365
+ function addFiles(fileList) {
366
+ var added = [];
367
+ for (var i = 0; i < fileList.length; i++) {
368
+ var file = fileList[i];
369
+ var id = "f-" + (++idCounter);
370
+ var record = {
371
+ id: id,
372
+ state: "pending",
373
+ file: file,
374
+ filename: file.name,
375
+ mime_type: file.type,
376
+ size: file.size,
377
+ url: null,
378
+ };
379
+ files.push(record);
380
+ added.push(record);
381
+ }
382
+ notify();
383
+ added.forEach(function (r) {
384
+ r.state = "uploading";
385
+ notify();
386
+ doUpload(r);
387
+ });
388
+ }
389
+
390
+ function removeFile(id) {
391
+ files = files.filter(function (f) { return f.id !== id; });
392
+ notify();
393
+ }
394
+
395
+ function retryFile(id) {
396
+ var f = findFile(id);
397
+ if (!f || !f.file) return;
398
+ f.state = "uploading";
399
+ f.error = null;
400
+ notify();
401
+ doUpload(f);
402
+ }
403
+
404
+ function getFiles() {
405
+ return files.slice();
406
+ }
407
+
408
+ return {
409
+ addFiles: addFiles,
410
+ removeFile: removeFile,
411
+ retryFile: retryFile,
412
+ getFiles: getFiles,
413
+ };
414
+ }
415
+ `;
416
+ // ---------------------------------------------------------------------------
249
417
  // HTML builder — assembles a complete iframe document
250
418
  // ---------------------------------------------------------------------------
251
419
  export function buildAppHtml(title, bodyHtml, appJs) {
@@ -261,8 +429,52 @@ export function buildAppHtml(title, bodyHtml, appJs) {
261
429
  ${bodyHtml}
262
430
  <script>${APP_BRIDGE_JS}</script>
263
431
  <script>${PICA_APP_JS}</script>
432
+ <script>${PICA_UPLOAD_MANAGER_JS}</script>
264
433
  <script>${appJs}</script>
265
434
  </body>
266
435
  </html>`;
267
436
  }
437
+ /**
438
+ * CSP connect-src allowlist for MCP App cards that upload files to storage.
439
+ * Covers PICA-hosted media buckets and common BYOC (bring your own cloud)
440
+ * providers: AWS S3, Cloudflare R2, Wasabi, Backblaze B2.
441
+ *
442
+ * Hosts that honor wildcard entries get broader coverage. Hosts that don't
443
+ * still work for PICA defaults (exact entries first) and specific BYOC regions.
444
+ * Users on unlisted endpoints see a graceful "use web dashboard" fallback.
445
+ */
446
+ export const PICA_STORAGE_CONNECT_DOMAINS = [
447
+ // PICA-hosted media bucket
448
+ "https://withpica-media-production.s3.amazonaws.com",
449
+ "https://withpica-media-production.s3.us-east-1.amazonaws.com",
450
+ "https://withpica-media-production.s3.eu-north-1.amazonaws.com",
451
+ // AWS S3 BYOC — common region endpoints (virtual-hosted style)
452
+ "https://*.s3.amazonaws.com",
453
+ "https://*.s3.us-east-1.amazonaws.com",
454
+ "https://*.s3.us-east-2.amazonaws.com",
455
+ "https://*.s3.us-west-1.amazonaws.com",
456
+ "https://*.s3.us-west-2.amazonaws.com",
457
+ "https://*.s3.eu-west-1.amazonaws.com",
458
+ "https://*.s3.eu-west-2.amazonaws.com",
459
+ "https://*.s3.eu-central-1.amazonaws.com",
460
+ "https://*.s3.eu-north-1.amazonaws.com",
461
+ "https://*.s3.ap-southeast-1.amazonaws.com",
462
+ "https://*.s3.ap-southeast-2.amazonaws.com",
463
+ "https://*.s3.ap-northeast-1.amazonaws.com",
464
+ // Cloudflare R2
465
+ "https://*.r2.cloudflarestorage.com",
466
+ // Wasabi
467
+ "https://s3.wasabisys.com",
468
+ "https://s3.us-east-1.wasabisys.com",
469
+ "https://s3.us-east-2.wasabisys.com",
470
+ "https://s3.us-west-1.wasabisys.com",
471
+ "https://s3.eu-central-1.wasabisys.com",
472
+ "https://s3.ap-northeast-1.wasabisys.com",
473
+ // Backblaze B2 S3-compatible
474
+ "https://s3.us-west-000.backblazeb2.com",
475
+ "https://s3.us-west-001.backblazeb2.com",
476
+ "https://s3.us-west-002.backblazeb2.com",
477
+ "https://s3.us-west-004.backblazeb2.com",
478
+ "https://s3.eu-central-003.backblazeb2.com",
479
+ ];
268
480
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/apps/shared.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,uBAAuB,EACvB,aAAa,GACd,MAAM,8BAA8B,CAAC;AAEtC,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;qCAMS,+BAA+B;;;;;;qCAM/B,8BAA8B;;;;;;qCAM9B,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K3D,CAAC;AAEF,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C1B,CAAC;AAEF,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAAgB,EAChB,KAAa;IAEb,OAAO;;;;;WAKE,KAAK;WACL,YAAY;;;EAGrB,QAAQ;UACA,aAAa;UACb,WAAW;UACX,KAAK;;QAEP,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/apps/shared.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,uBAAuB,EACvB,aAAa,GACd,MAAM,8BAA8B,CAAC;AAEtC,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;qCAMS,+BAA+B;;;;;;qCAM/B,8BAA8B;;;;;;qCAM9B,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K3D,CAAC;AAEF,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C1B,CAAC;AAEF,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,+EAA+E;AAC/E,EAAE;AACF,oFAAoF;AACpF,yFAAyF;AACzF,sEAAsE;AACtE,EAAE;AACF,kFAAkF;AAClF,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4JrC,CAAC;AAEF,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAAgB,EAChB,KAAa;IAEb,OAAO;;;;;WAKE,KAAK;WACL,YAAY;;;EAGrB,QAAQ;UACA,aAAa;UACb,WAAW;UACX,sBAAsB;UACtB,KAAK;;QAEP,CAAC;AACT,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAa;IACpD,2BAA2B;IAC3B,oDAAoD;IACpD,8DAA8D;IAC9D,+DAA+D;IAE/D,+DAA+D;IAC/D,4BAA4B;IAC5B,sCAAsC;IACtC,sCAAsC;IACtC,sCAAsC;IACtC,sCAAsC;IACtC,sCAAsC;IACtC,sCAAsC;IACtC,yCAAyC;IACzC,uCAAuC;IACvC,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAE3C,gBAAgB;IAChB,oCAAoC;IAEpC,SAAS;IACT,0BAA0B;IAC1B,oCAAoC;IACpC,oCAAoC;IACpC,oCAAoC;IACpC,uCAAuC;IACvC,yCAAyC;IAEzC,6BAA6B;IAC7B,wCAAwC;IACxC,wCAAwC;IACxC,wCAAwC;IACxC,wCAAwC;IACxC,2CAA2C;CAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const UPLOAD_HTML: string;
2
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/apps/upload.ts"],"names":[],"mappings":"AA2RA,eAAO,MAAM,WAAW,QAIvB,CAAC"}
@@ -0,0 +1,280 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ /**
3
+ * pica_upload MCP App card — generic drop zone.
4
+ *
5
+ * Renders a drop zone + file input, instantiates createUploadManager() from
6
+ * shared.ts, and reports uploaded file metadata back to the agent via
7
+ * app.updateModelContext() once all files have settled.
8
+ *
9
+ * DOM API only — never innerHTML.
10
+ */
11
+ import { buildAppHtml } from "./shared.js";
12
+ const UPLOAD_BODY = `
13
+ <div class="stack gap-6">
14
+ <header>
15
+ <h1 class="heading heading-lg" id="up-title">upload files</h1>
16
+ <p class="text-secondary" id="up-subtitle">drop files here or click to browse</p>
17
+ </header>
18
+
19
+ <section>
20
+ <div id="up-dropzone" class="up-dropzone">
21
+ <p class="text-secondary" id="up-dropzone-label">drop files here or click to browse</p>
22
+ <input type="file" id="up-input" multiple style="display: none;" />
23
+ </div>
24
+ <div id="up-thumbnails" class="up-thumbnails"></div>
25
+ <p class="text-tertiary" id="up-max-msg" style="margin-top: 8px; display: none;"></p>
26
+ <p class="text-tertiary" id="up-status" style="margin-top: 12px; display: none;"></p>
27
+ </section>
28
+ </div>
29
+
30
+ <style>
31
+ .up-dropzone {
32
+ background: rgba(255,255,255,0.03);
33
+ border: 1px dashed rgba(255,255,255,0.15);
34
+ border-radius: 12px;
35
+ padding: 64px 24px;
36
+ text-align: center;
37
+ cursor: pointer;
38
+ transition: background 0.15s, border-color 0.15s;
39
+ }
40
+ .up-dropzone.dragover {
41
+ background: rgba(184,115,51,0.05);
42
+ border-color: var(--accent);
43
+ }
44
+ .up-thumbnails {
45
+ display: flex;
46
+ gap: 12px;
47
+ flex-wrap: wrap;
48
+ margin-top: 16px;
49
+ }
50
+ .up-thumb {
51
+ position: relative;
52
+ min-width: 120px;
53
+ max-width: 180px;
54
+ padding: 12px;
55
+ border-radius: 8px;
56
+ border: 1px solid var(--card-border);
57
+ background: rgba(255,255,255,0.03);
58
+ font-size: 12px;
59
+ }
60
+ .up-thumb-filename {
61
+ color: var(--text-primary);
62
+ word-break: break-all;
63
+ margin-bottom: 4px;
64
+ }
65
+ .up-thumb-state {
66
+ color: var(--text-tertiary);
67
+ font-size: 11px;
68
+ }
69
+ .up-thumb-state-failed { border-color: rgba(255,80,80,0.5); }
70
+ .up-thumb-state-network_error { border-color: rgba(255,165,0,0.4); }
71
+ .up-thumb-state-uploaded { border-color: rgba(135,169,107,0.5); }
72
+ .up-thumb-remove {
73
+ position: absolute; top: 4px; right: 4px;
74
+ width: 18px; height: 18px; border-radius: 50%;
75
+ background: rgba(0,0,0,0.6);
76
+ color: white; font-size: 11px; border: none; cursor: pointer;
77
+ display: flex; align-items: center; justify-content: center;
78
+ }
79
+ @media (max-width: 600px) {
80
+ .up-dropzone { padding: 40px 16px; }
81
+ }
82
+ </style>
83
+ `;
84
+ const UPLOAD_JS = `
85
+ var upState = {
86
+ config: { accept: "any", purpose: null, max_files: null },
87
+ manager: null,
88
+ reported: false,
89
+ };
90
+
91
+ function upAcceptToAttr(accept) {
92
+ switch (accept) {
93
+ case "image": return "image/*";
94
+ case "audio": return "audio/*";
95
+ case "video": return "video/*";
96
+ case "document": return ".pdf,.doc,.docx,.txt,.csv,.xls,.xlsx,.rtf,.md";
97
+ default: return "";
98
+ }
99
+ }
100
+
101
+ function upRender(files) {
102
+ var container = document.getElementById("up-thumbnails");
103
+ if (!container) return;
104
+ container.textContent = "";
105
+
106
+ files.forEach(function (f) {
107
+ var thumb = document.createElement("div");
108
+ thumb.className = "up-thumb up-thumb-state-" + f.state;
109
+
110
+ var name = document.createElement("div");
111
+ name.className = "up-thumb-filename";
112
+ name.textContent = f.filename;
113
+ thumb.appendChild(name);
114
+
115
+ var stateEl = document.createElement("div");
116
+ stateEl.className = "up-thumb-state";
117
+ if (f.state === "uploading") stateEl.textContent = "uploading...";
118
+ else if (f.state === "uploaded") stateEl.textContent = "uploaded";
119
+ else if (f.state === "failed") stateEl.textContent = "failed — click to retry";
120
+ else if (f.state === "network_error") stateEl.textContent = "network error — check connection or use web dashboard";
121
+ else stateEl.textContent = f.state;
122
+ thumb.appendChild(stateEl);
123
+
124
+ if (f.state === "failed") {
125
+ thumb.style.cursor = "pointer";
126
+ thumb.onclick = function () { upState.manager.retryFile(f.id); };
127
+ }
128
+
129
+ var removeBtn = document.createElement("button");
130
+ removeBtn.className = "up-thumb-remove";
131
+ removeBtn.textContent = "\\u00D7";
132
+ removeBtn.onclick = function (e) {
133
+ e.stopPropagation();
134
+ upState.manager.removeFile(f.id);
135
+ };
136
+ thumb.appendChild(removeBtn);
137
+
138
+ container.appendChild(thumb);
139
+ });
140
+
141
+ upMaybeReport(files);
142
+ }
143
+
144
+ function upMaybeReport(files) {
145
+ if (upState.reported) return;
146
+ if (files.length === 0) return;
147
+ var settled = files.every(function (f) {
148
+ return f.state === "uploaded" || f.state === "failed" || f.state === "network_error";
149
+ });
150
+ if (!settled) return;
151
+
152
+ var uploaded = files
153
+ .filter(function (f) { return f.state === "uploaded"; })
154
+ .map(function (f) {
155
+ return {
156
+ id: f.upload_id || null,
157
+ url: f.url,
158
+ mime_type: f.mime_type,
159
+ size: f.size,
160
+ filename: f.filename,
161
+ uploaded_at: f.uploaded_at,
162
+ };
163
+ });
164
+
165
+ upState.reported = true;
166
+
167
+ var status = document.getElementById("up-status");
168
+ if (status) {
169
+ status.style.display = "block";
170
+ status.textContent = uploaded.length + " file(s) uploaded — returning to agent";
171
+ }
172
+
173
+ if (app && typeof app.updateModelContext === "function") {
174
+ try {
175
+ app.updateModelContext({
176
+ context: [{
177
+ type: "text",
178
+ text: JSON.stringify({ uploaded: uploaded }),
179
+ }],
180
+ });
181
+ } catch (err) {
182
+ console.warn("[pica_upload] updateModelContext failed:", err);
183
+ }
184
+ }
185
+ }
186
+
187
+ function upEnforceMaxFiles(incoming) {
188
+ var maxMsgEl = document.getElementById("up-max-msg");
189
+ if (maxMsgEl) {
190
+ maxMsgEl.style.display = "none";
191
+ maxMsgEl.textContent = "";
192
+ }
193
+ var max = upState.config.max_files;
194
+ if (!max || !upState.manager) return incoming;
195
+ var currentCount = upState.manager.getFiles().length;
196
+ var remaining = max - currentCount;
197
+ if (remaining <= 0) {
198
+ if (maxMsgEl) {
199
+ maxMsgEl.textContent = "max " + max + " files — extras ignored";
200
+ maxMsgEl.style.display = "block";
201
+ }
202
+ return [];
203
+ }
204
+ if (incoming.length > remaining) {
205
+ if (maxMsgEl) {
206
+ maxMsgEl.textContent = "max " + max + " files — extras ignored";
207
+ maxMsgEl.style.display = "block";
208
+ }
209
+ return Array.prototype.slice.call(incoming, 0, remaining);
210
+ }
211
+ return incoming;
212
+ }
213
+
214
+ function upSetup() {
215
+ var dz = document.getElementById("up-dropzone");
216
+ var input = document.getElementById("up-input");
217
+ var title = document.getElementById("up-title");
218
+ var subtitle = document.getElementById("up-subtitle");
219
+ var dzLabel = document.getElementById("up-dropzone-label");
220
+
221
+ if (upState.config.purpose && title) {
222
+ title.textContent = "upload: " + upState.config.purpose;
223
+ }
224
+ if (upState.config.accept && upState.config.accept !== "any" && subtitle) {
225
+ subtitle.textContent = "drop " + upState.config.accept + " files here or click to browse";
226
+ if (dzLabel) dzLabel.textContent = "drop " + upState.config.accept + " files here";
227
+ }
228
+
229
+ if (input) {
230
+ input.accept = upAcceptToAttr(upState.config.accept);
231
+ }
232
+ if (!dz || !input) return;
233
+
234
+ dz.addEventListener("click", function () { input.click(); });
235
+ input.addEventListener("change", function (e) {
236
+ if (e.target.files && e.target.files.length) {
237
+ var allowed = upEnforceMaxFiles(e.target.files);
238
+ if (allowed.length) {
239
+ upState.reported = false;
240
+ upState.manager.addFiles(allowed);
241
+ }
242
+ }
243
+ input.value = "";
244
+ });
245
+ dz.addEventListener("dragover", function (e) {
246
+ e.preventDefault();
247
+ dz.classList.add("dragover");
248
+ });
249
+ dz.addEventListener("dragleave", function () { dz.classList.remove("dragover"); });
250
+ dz.addEventListener("drop", function (e) {
251
+ e.preventDefault();
252
+ dz.classList.remove("dragover");
253
+ if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length) {
254
+ var allowed = upEnforceMaxFiles(e.dataTransfer.files);
255
+ if (allowed.length) {
256
+ upState.reported = false;
257
+ upState.manager.addFiles(allowed);
258
+ }
259
+ }
260
+ });
261
+ }
262
+
263
+ window.onPicaToolResult = function (data) {
264
+ if (data && data.config) {
265
+ upState.config = {
266
+ accept: data.config.accept || "any",
267
+ purpose: data.config.purpose || null,
268
+ max_files: data.config.max_files || null,
269
+ };
270
+ }
271
+ upState.manager = createUploadManager({
272
+ accept: upState.config.accept,
273
+ onStateChange: upRender,
274
+ app: app,
275
+ });
276
+ upSetup();
277
+ };
278
+ `;
279
+ export const UPLOAD_HTML = buildAppHtml("pica \u2014 upload", UPLOAD_BODY, UPLOAD_JS);
280
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/apps/upload.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEnB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkMjB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CACrC,oBAAoB,EACpB,WAAW,EACX,SAAS,CACV,CAAC"}
package/dist/config.d.ts CHANGED
@@ -6,6 +6,7 @@ export interface ServerConfig {
6
6
  debug: boolean;
7
7
  lobbyMode: boolean;
8
8
  credentialsPath: string;
9
+ discoveryMode: boolean;
9
10
  }
10
11
  export declare function loadConfig(): ServerConfig;
11
12
  export declare function validateConfig(config: ServerConfig): void;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,IAAI,YAAY,CAkCzC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAWzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,UAAU,IAAI,YAAY,CAwCzC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAWzD"}
package/dist/config.js CHANGED
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * MCP Server Configuration
4
4
  */
5
- import { readCredentials, getDefaultCredentialsPath, } from "./utils/credentials.js";
5
+ import { readCredentials, getDefaultCredentialsPath, } from "@withpica/mcp-utils";
6
6
  export function loadConfig() {
7
7
  const credentialsPath = process.env.PICA_CREDENTIALS_PATH || getDefaultCredentialsPath();
8
8
  const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1";
@@ -19,9 +19,13 @@ export function loadConfig() {
19
19
  }
20
20
  }
21
21
  const lobbyMode = !picaApiKey;
22
+ const discoveryMode = process.env.MCP_LAYERED_DISCOVERY === "1";
22
23
  if (lobbyMode && debug) {
23
24
  console.error("[MCP Server] No API key found — starting in lobby mode");
24
25
  }
26
+ if (discoveryMode && debug) {
27
+ console.error("[MCP Server] Layered discovery mode enabled");
28
+ }
25
29
  return {
26
30
  picaApiKey,
27
31
  picaApiUrl: process.env.PICA_API_URL || "https://withpica.com/api",
@@ -30,6 +34,7 @@ export function loadConfig() {
30
34
  debug,
31
35
  lobbyMode,
32
36
  credentialsPath,
37
+ discoveryMode,
33
38
  };
34
39
  }
35
40
  export function validateConfig(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAYhC,MAAM,UAAU,UAAU;IACxB,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,yBAAyB,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;IAExE,sBAAsB;IACtB,IAAI,UAAU,GAAkB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAEjE,+BAA+B;IAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,uCAAuC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC;IAE9B,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B;QAClE,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,OAAO;QAChB,KAAK;QACL,SAAS;QACT,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IACE,CAAC,MAAM,CAAC,SAAS;QACjB,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAa7B,MAAM,UAAU,UAAU;IACxB,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,yBAAyB,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;IAExE,sBAAsB;IACtB,IAAI,UAAU,GAAkB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAEjE,+BAA+B;IAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,uCAAuC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC;IAEhE,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B;QAClE,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,OAAO;QAChB,KAAK;QACL,SAAS;QACT,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IACE,CAAC,MAAM,CAAC,SAAS;QACjB,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Resource Registry for MCP Server
3
3
  * Manages read-only data resources that AI assistants can access
4
4
  */
5
- import { PicaClient } from "../pica-sdk.js";
5
+ import { PicaClient } from "@withpica/mcp-sdk";
6
6
  import { ServerConfig } from "../config.js";
7
7
  export interface ResourceDefinition {
8
8
  uri: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAO5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC;AAEjC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAe;gBAElB,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;IAK1D;;OAEG;IACH,aAAa,IAAI,kBAAkB,EAAE;IAuFrC;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAqF7C;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,aAAa;IA4B3B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;YACW,eAAe;IAoD7B;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;YACW,mBAAmB;IAcjC;;OAEG;YACW,eAAe;CAa9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAO/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC;AAEjC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAe;gBAElB,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;IAK1D;;OAEG;IACH,aAAa,IAAI,kBAAkB,EAAE;IA8FrC;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA8G7C;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,aAAa;IA4B3B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;YACW,eAAe;IAoD7B;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;YACW,mBAAmB;IAcjC;;OAEG;YACW,eAAe;CAa9B"}
@@ -1,9 +1,11 @@
1
1
  // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
- import { ResourceError } from "../utils/errors.js";
2
+ import { ResourceError } from "@withpica/mcp-utils";
3
3
  import { readFileSync } from "fs";
4
4
  import { join } from "path";
5
5
  import { WITHPICA_PRIMER } from "./llms-primer.js";
6
- import { BRIEFING_HTML } from "../apps/briefing.js";
6
+ import { UPLOAD_HTML } from "../apps/upload.js";
7
+ import { DOWNLOAD_HTML } from "../apps/download.js";
8
+ import { PICA_STORAGE_CONNECT_DOMAINS } from "../apps/shared.js";
7
9
  export class ResourceRegistry {
8
10
  pica;
9
11
  config;
@@ -72,9 +74,14 @@ export class ResourceRegistry {
72
74
  description: "OpenAPI 3.1 spec for the top 20 PICA API endpoints — works, people, recordings, agreements, credits, search, health",
73
75
  mimeType: "text/yaml",
74
76
  }, {
75
- uri: "ui://pica/briefing",
76
- name: "Daily Briefing",
77
- description: "Interactive daily briefing card — catalog health, attention items, activity",
77
+ uri: "ui://pica/upload",
78
+ name: "Upload Files",
79
+ description: "Generic file upload card — drop zone for audio, photos, documents, anything",
80
+ mimeType: "text/html;profile=mcp-app",
81
+ }, {
82
+ uri: "ui://pica/download",
83
+ name: "Download File",
84
+ description: "File download card — shows file metadata and a download button",
78
85
  mimeType: "text/html;profile=mcp-app",
79
86
  });
80
87
  return resources;
@@ -138,13 +145,37 @@ export class ResourceRegistry {
138
145
  return await this.getRecentEvents();
139
146
  case "api://openapi":
140
147
  return this.getOpenAPISpec();
141
- case "ui://pica/briefing":
148
+ case "ui://pica/upload":
149
+ return {
150
+ contents: [
151
+ {
152
+ uri: "ui://pica/upload",
153
+ mimeType: "text/html;profile=mcp-app",
154
+ text: UPLOAD_HTML,
155
+ _meta: {
156
+ ui: {
157
+ csp: {
158
+ connectDomains: PICA_STORAGE_CONNECT_DOMAINS,
159
+ },
160
+ },
161
+ },
162
+ },
163
+ ],
164
+ };
165
+ case "ui://pica/download":
142
166
  return {
143
167
  contents: [
144
168
  {
145
- uri: "ui://pica/briefing",
169
+ uri: "ui://pica/download",
146
170
  mimeType: "text/html;profile=mcp-app",
147
- text: BRIEFING_HTML,
171
+ text: DOWNLOAD_HTML,
172
+ _meta: {
173
+ ui: {
174
+ csp: {
175
+ connectDomains: PICA_STORAGE_CONNECT_DOMAINS,
176
+ },
177
+ },
178
+ },
148
179
  },
149
180
  ],
150
181
  };