@withpica/mcp-server 2.6.2 → 2.7.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 (256) hide show
  1. package/dist/config.d.ts +25 -4
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +12 -36
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/pica-sdk.d.ts +1231 -0
  9. package/dist/pica-sdk.d.ts.map +1 -0
  10. package/dist/pica-sdk.js +1403 -0
  11. package/dist/pica-sdk.js.map +1 -0
  12. package/dist/prompts/index.d.ts +64 -64
  13. package/dist/prompts/index.js +24 -24
  14. package/dist/prompts/index.js.map +1 -1
  15. package/dist/resources/index.d.ts +53 -55
  16. package/dist/resources/index.d.ts.map +1 -1
  17. package/dist/resources/index.js +54 -133
  18. package/dist/resources/index.js.map +1 -1
  19. package/dist/server.d.ts +32 -49
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +14 -103
  22. package/dist/server.js.map +1 -1
  23. package/dist/tools/index.d.ts +37 -83
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +84 -442
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/people.d.ts +47 -39
  28. package/dist/tools/people.d.ts.map +1 -1
  29. package/dist/tools/people.js +109 -148
  30. package/dist/tools/people.js.map +1 -1
  31. package/dist/tools/recordings.d.ts +9 -9
  32. package/dist/tools/recordings.d.ts.map +1 -1
  33. package/dist/tools/recordings.js +48 -121
  34. package/dist/tools/recordings.js.map +1 -1
  35. package/dist/tools/search.d.ts +21 -21
  36. package/dist/tools/search.d.ts.map +1 -1
  37. package/dist/tools/search.js +3 -3
  38. package/dist/tools/search.js.map +1 -1
  39. package/dist/tools/works.d.ts +47 -39
  40. package/dist/tools/works.d.ts.map +1 -1
  41. package/dist/tools/works.js +116 -201
  42. package/dist/tools/works.js.map +1 -1
  43. package/dist/utils/errors.d.ts +29 -0
  44. package/dist/utils/errors.d.ts.map +1 -0
  45. package/dist/utils/errors.js +115 -0
  46. package/dist/utils/errors.js.map +1 -0
  47. package/dist/utils/formatting.d.ts +82 -0
  48. package/dist/utils/formatting.d.ts.map +1 -0
  49. package/dist/utils/formatting.js +125 -0
  50. package/dist/utils/formatting.js.map +1 -0
  51. package/package.json +1 -1
  52. package/server.json +1 -1
  53. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts +0 -6
  54. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts.map +0 -1
  55. package/dist/__mocks__/mppx-mcp-sdk-server.js +0 -6
  56. package/dist/__mocks__/mppx-mcp-sdk-server.js.map +0 -1
  57. package/dist/__mocks__/mppx-server.d.ts +0 -12
  58. package/dist/__mocks__/mppx-server.d.ts.map +0 -1
  59. package/dist/__mocks__/mppx-server.js +0 -12
  60. package/dist/__mocks__/mppx-server.js.map +0 -1
  61. package/dist/apps/download.d.ts +0 -2
  62. package/dist/apps/download.d.ts.map +0 -1
  63. package/dist/apps/download.js +0 -125
  64. package/dist/apps/download.js.map +0 -1
  65. package/dist/apps/generated/shared-bundle.d.ts +0 -5
  66. package/dist/apps/generated/shared-bundle.d.ts.map +0 -1
  67. package/dist/apps/generated/shared-bundle.js +0 -7
  68. package/dist/apps/generated/shared-bundle.js.map +0 -1
  69. package/dist/apps/shared.d.ts +0 -15
  70. package/dist/apps/shared.d.ts.map +0 -1
  71. package/dist/apps/shared.js +0 -480
  72. package/dist/apps/shared.js.map +0 -1
  73. package/dist/apps/upload.d.ts +0 -2
  74. package/dist/apps/upload.d.ts.map +0 -1
  75. package/dist/apps/upload.js +0 -280
  76. package/dist/apps/upload.js.map +0 -1
  77. package/dist/resources/llms-primer.d.ts +0 -2
  78. package/dist/resources/llms-primer.d.ts.map +0 -1
  79. package/dist/resources/llms-primer.js +0 -68
  80. package/dist/resources/llms-primer.js.map +0 -1
  81. package/dist/server-instructions.d.ts +0 -9
  82. package/dist/server-instructions.d.ts.map +0 -1
  83. package/dist/server-instructions.js +0 -34
  84. package/dist/server-instructions.js.map +0 -1
  85. package/dist/tools/agreement-types.d.ts +0 -27
  86. package/dist/tools/agreement-types.d.ts.map +0 -1
  87. package/dist/tools/agreement-types.js +0 -387
  88. package/dist/tools/agreement-types.js.map +0 -1
  89. package/dist/tools/agreements.d.ts +0 -20
  90. package/dist/tools/agreements.d.ts.map +0 -1
  91. package/dist/tools/agreements.js +0 -363
  92. package/dist/tools/agreements.js.map +0 -1
  93. package/dist/tools/analytics.d.ts +0 -20
  94. package/dist/tools/analytics.d.ts.map +0 -1
  95. package/dist/tools/analytics.js +0 -124
  96. package/dist/tools/analytics.js.map +0 -1
  97. package/dist/tools/app-tools.d.ts +0 -21
  98. package/dist/tools/app-tools.d.ts.map +0 -1
  99. package/dist/tools/app-tools.js +0 -248
  100. package/dist/tools/app-tools.js.map +0 -1
  101. package/dist/tools/assets.d.ts +0 -21
  102. package/dist/tools/assets.d.ts.map +0 -1
  103. package/dist/tools/assets.js +0 -441
  104. package/dist/tools/assets.js.map +0 -1
  105. package/dist/tools/audio-files.d.ts +0 -20
  106. package/dist/tools/audio-files.d.ts.map +0 -1
  107. package/dist/tools/audio-files.js +0 -384
  108. package/dist/tools/audio-files.js.map +0 -1
  109. package/dist/tools/auth.d.ts +0 -22
  110. package/dist/tools/auth.d.ts.map +0 -1
  111. package/dist/tools/auth.js +0 -210
  112. package/dist/tools/auth.js.map +0 -1
  113. package/dist/tools/bulk.d.ts +0 -16
  114. package/dist/tools/bulk.d.ts.map +0 -1
  115. package/dist/tools/bulk.js +0 -85
  116. package/dist/tools/bulk.js.map +0 -1
  117. package/dist/tools/calendar.d.ts +0 -15
  118. package/dist/tools/calendar.d.ts.map +0 -1
  119. package/dist/tools/calendar.js +0 -67
  120. package/dist/tools/calendar.js.map +0 -1
  121. package/dist/tools/collaborators.d.ts +0 -17
  122. package/dist/tools/collaborators.d.ts.map +0 -1
  123. package/dist/tools/collaborators.js +0 -131
  124. package/dist/tools/collaborators.js.map +0 -1
  125. package/dist/tools/comparisons.d.ts +0 -22
  126. package/dist/tools/comparisons.d.ts.map +0 -1
  127. package/dist/tools/comparisons.js +0 -78
  128. package/dist/tools/comparisons.js.map +0 -1
  129. package/dist/tools/credits.d.ts +0 -17
  130. package/dist/tools/credits.d.ts.map +0 -1
  131. package/dist/tools/credits.js +0 -312
  132. package/dist/tools/credits.js.map +0 -1
  133. package/dist/tools/dashboard.d.ts +0 -19
  134. package/dist/tools/dashboard.d.ts.map +0 -1
  135. package/dist/tools/dashboard.js +0 -146
  136. package/dist/tools/dashboard.js.map +0 -1
  137. package/dist/tools/directory.d.ts +0 -15
  138. package/dist/tools/directory.d.ts.map +0 -1
  139. package/dist/tools/directory.js +0 -106
  140. package/dist/tools/directory.js.map +0 -1
  141. package/dist/tools/discovery.d.ts +0 -28
  142. package/dist/tools/discovery.d.ts.map +0 -1
  143. package/dist/tools/discovery.js +0 -560
  144. package/dist/tools/discovery.js.map +0 -1
  145. package/dist/tools/disputes.d.ts +0 -18
  146. package/dist/tools/disputes.d.ts.map +0 -1
  147. package/dist/tools/disputes.js +0 -61
  148. package/dist/tools/disputes.js.map +0 -1
  149. package/dist/tools/documents.d.ts +0 -15
  150. package/dist/tools/documents.d.ts.map +0 -1
  151. package/dist/tools/documents.js +0 -36
  152. package/dist/tools/documents.js.map +0 -1
  153. package/dist/tools/duplicates.d.ts +0 -16
  154. package/dist/tools/duplicates.d.ts.map +0 -1
  155. package/dist/tools/duplicates.js +0 -87
  156. package/dist/tools/duplicates.js.map +0 -1
  157. package/dist/tools/enrichment.d.ts +0 -20
  158. package/dist/tools/enrichment.d.ts.map +0 -1
  159. package/dist/tools/enrichment.js +0 -154
  160. package/dist/tools/enrichment.js.map +0 -1
  161. package/dist/tools/exports.d.ts +0 -19
  162. package/dist/tools/exports.d.ts.map +0 -1
  163. package/dist/tools/exports.js +0 -175
  164. package/dist/tools/exports.js.map +0 -1
  165. package/dist/tools/import-documents.d.ts +0 -21
  166. package/dist/tools/import-documents.d.ts.map +0 -1
  167. package/dist/tools/import-documents.js +0 -203
  168. package/dist/tools/import-documents.js.map +0 -1
  169. package/dist/tools/import.d.ts +0 -30
  170. package/dist/tools/import.d.ts.map +0 -1
  171. package/dist/tools/import.js +0 -455
  172. package/dist/tools/import.js.map +0 -1
  173. package/dist/tools/integrations.d.ts +0 -15
  174. package/dist/tools/integrations.d.ts.map +0 -1
  175. package/dist/tools/integrations.js +0 -100
  176. package/dist/tools/integrations.js.map +0 -1
  177. package/dist/tools/licensing.d.ts +0 -40
  178. package/dist/tools/licensing.d.ts.map +0 -1
  179. package/dist/tools/licensing.js +0 -431
  180. package/dist/tools/licensing.js.map +0 -1
  181. package/dist/tools/memory.d.ts +0 -21
  182. package/dist/tools/memory.d.ts.map +0 -1
  183. package/dist/tools/memory.js +0 -116
  184. package/dist/tools/memory.js.map +0 -1
  185. package/dist/tools/metadata.d.ts +0 -15
  186. package/dist/tools/metadata.d.ts.map +0 -1
  187. package/dist/tools/metadata.js +0 -1069
  188. package/dist/tools/metadata.js.map +0 -1
  189. package/dist/tools/multimedia.d.ts +0 -19
  190. package/dist/tools/multimedia.d.ts.map +0 -1
  191. package/dist/tools/multimedia.js +0 -291
  192. package/dist/tools/multimedia.js.map +0 -1
  193. package/dist/tools/notes.d.ts +0 -21
  194. package/dist/tools/notes.d.ts.map +0 -1
  195. package/dist/tools/notes.js +0 -108
  196. package/dist/tools/notes.js.map +0 -1
  197. package/dist/tools/notifications.d.ts +0 -17
  198. package/dist/tools/notifications.d.ts.map +0 -1
  199. package/dist/tools/notifications.js +0 -117
  200. package/dist/tools/notifications.js.map +0 -1
  201. package/dist/tools/projects.d.ts +0 -19
  202. package/dist/tools/projects.d.ts.map +0 -1
  203. package/dist/tools/projects.js +0 -140
  204. package/dist/tools/projects.js.map +0 -1
  205. package/dist/tools/publishers.d.ts +0 -16
  206. package/dist/tools/publishers.d.ts.map +0 -1
  207. package/dist/tools/publishers.js +0 -69
  208. package/dist/tools/publishers.js.map +0 -1
  209. package/dist/tools/purchases.d.ts +0 -15
  210. package/dist/tools/purchases.d.ts.map +0 -1
  211. package/dist/tools/purchases.js +0 -63
  212. package/dist/tools/purchases.js.map +0 -1
  213. package/dist/tools/recovery-hints.d.ts +0 -14
  214. package/dist/tools/recovery-hints.d.ts.map +0 -1
  215. package/dist/tools/recovery-hints.js +0 -277
  216. package/dist/tools/recovery-hints.js.map +0 -1
  217. package/dist/tools/releases.d.ts +0 -18
  218. package/dist/tools/releases.d.ts.map +0 -1
  219. package/dist/tools/releases.js +0 -128
  220. package/dist/tools/releases.js.map +0 -1
  221. package/dist/tools/royalties.d.ts +0 -23
  222. package/dist/tools/royalties.d.ts.map +0 -1
  223. package/dist/tools/royalties.js +0 -257
  224. package/dist/tools/royalties.js.map +0 -1
  225. package/dist/tools/send.d.ts +0 -17
  226. package/dist/tools/send.d.ts.map +0 -1
  227. package/dist/tools/send.js +0 -185
  228. package/dist/tools/send.js.map +0 -1
  229. package/dist/tools/sessions.d.ts +0 -18
  230. package/dist/tools/sessions.d.ts.map +0 -1
  231. package/dist/tools/sessions.js +0 -115
  232. package/dist/tools/sessions.js.map +0 -1
  233. package/dist/tools/settings.d.ts +0 -18
  234. package/dist/tools/settings.d.ts.map +0 -1
  235. package/dist/tools/settings.js +0 -96
  236. package/dist/tools/settings.js.map +0 -1
  237. package/dist/tools/share-links.d.ts +0 -19
  238. package/dist/tools/share-links.d.ts.map +0 -1
  239. package/dist/tools/share-links.js +0 -121
  240. package/dist/tools/share-links.js.map +0 -1
  241. package/dist/tools/split-sheets.d.ts +0 -25
  242. package/dist/tools/split-sheets.d.ts.map +0 -1
  243. package/dist/tools/split-sheets.js +0 -307
  244. package/dist/tools/split-sheets.js.map +0 -1
  245. package/dist/tools/team.d.ts +0 -22
  246. package/dist/tools/team.d.ts.map +0 -1
  247. package/dist/tools/team.js +0 -134
  248. package/dist/tools/team.js.map +0 -1
  249. package/dist/tools/telegram.d.ts +0 -20
  250. package/dist/tools/telegram.d.ts.map +0 -1
  251. package/dist/tools/telegram.js +0 -88
  252. package/dist/tools/telegram.js.map +0 -1
  253. package/dist/tools/uploads.d.ts +0 -17
  254. package/dist/tools/uploads.d.ts.map +0 -1
  255. package/dist/tools/uploads.js +0 -156
  256. package/dist/tools/uploads.js.map +0 -1
@@ -1,480 +0,0 @@
1
- // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
- import { INSTRUMENT_SERIF_REGULAR_BASE64, INSTRUMENT_SERIF_ITALIC_BASE64, GEIST_SANS_LIGHT_BASE64, APP_BRIDGE_JS, } from "./generated/shared-bundle.js";
3
- // ---------------------------------------------------------------------------
4
- // Design system CSS — embedded fonts + full PICA dark/light theme
5
- // ---------------------------------------------------------------------------
6
- export const PICA_APP_CSS = `
7
- /* ---- Fonts ---- */
8
- @font-face {
9
- font-family: 'Instrument Serif';
10
- font-style: normal;
11
- font-weight: 400;
12
- src: url('data:font/woff2;base64,${INSTRUMENT_SERIF_REGULAR_BASE64}') format('woff2');
13
- }
14
- @font-face {
15
- font-family: 'Instrument Serif';
16
- font-style: italic;
17
- font-weight: 400;
18
- src: url('data:font/woff2;base64,${INSTRUMENT_SERIF_ITALIC_BASE64}') format('woff2');
19
- }
20
- @font-face {
21
- font-family: 'Geist Sans';
22
- font-style: normal;
23
- font-weight: 300;
24
- src: url('data:font/woff2;base64,${GEIST_SANS_LIGHT_BASE64}') format('woff2');
25
- }
26
-
27
- /* ---- Reset ---- */
28
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
29
- html { font-size: 16px; -webkit-font-smoothing: antialiased; }
30
- body { font-family: 'Geist Sans', system-ui, sans-serif; font-weight: 300; }
31
- a { color: inherit; text-decoration: none; }
32
- button { cursor: pointer; border: none; background: none; font-family: inherit; }
33
- ul, ol { list-style: none; }
34
- img, svg { display: block; max-width: 100%; }
35
-
36
- /* ---- CSS Custom Properties: dark theme (default) ---- */
37
- [data-theme="dark"], :root {
38
- --bg: #0A0A0A;
39
- --card-bg: rgba(255, 255, 255, 0.05);
40
- --card-border: rgba(255, 255, 255, 0.10);
41
- --text-primary: rgba(255, 255, 255, 1);
42
- --text-secondary: rgba(255, 255, 255, 0.40);
43
- --text-tertiary: rgba(255, 255, 255, 0.25);
44
- --accent: #B87333;
45
- --ghost-bg: rgba(255, 255, 255, 0.05);
46
- --ghost-border: rgba(255, 255, 255, 0.07);
47
- }
48
-
49
- /* ---- CSS Custom Properties: light theme ---- */
50
- [data-theme="light"] {
51
- --bg: #F5F4F1;
52
- --card-bg: rgba(0, 0, 0, 0.04);
53
- --card-border: rgba(0, 0, 0, 0.10);
54
- --text-primary: rgba(0, 0, 0, 0.90);
55
- --text-secondary: rgba(0, 0, 0, 0.50);
56
- --text-tertiary: rgba(0, 0, 0, 0.35);
57
- --accent: #B87333;
58
- --ghost-bg: rgba(0, 0, 0, 0.04);
59
- --ghost-border: rgba(0, 0, 0, 0.07);
60
- }
61
-
62
- /* ---- Base ---- */
63
- body {
64
- background: var(--bg);
65
- color: var(--text-primary);
66
- min-height: 100vh;
67
- }
68
-
69
- /* ---- Typography ---- */
70
- .heading, .heading-lg, .heading-md, .heading-sm {
71
- font-family: 'Instrument Serif', Georgia, serif;
72
- font-weight: 400;
73
- color: var(--text-primary);
74
- letter-spacing: 0;
75
- }
76
- .heading-lg { font-size: 2rem; line-height: 1.15; }
77
- .heading-md { font-size: 1.5rem; line-height: 1.2; }
78
- .heading-sm { font-size: 1.125rem; line-height: 1.3; }
79
- .heading { font-size: 1.75rem; line-height: 1.2; }
80
-
81
- .text-secondary { color: var(--text-secondary); }
82
- .text-tertiary { color: var(--text-tertiary); }
83
- .text-accent { color: var(--accent); }
84
- .label {
85
- font-family: 'Geist Sans', system-ui, sans-serif;
86
- font-size: 0.6875rem;
87
- font-weight: 300;
88
- text-transform: uppercase;
89
- letter-spacing: 0.08em;
90
- color: var(--text-tertiary);
91
- }
92
-
93
- /* ---- Card ---- */
94
- .card {
95
- background: var(--card-bg);
96
- border: 1px solid var(--card-border);
97
- border-radius: 12px;
98
- padding: 24px;
99
- backdrop-filter: blur(16px);
100
- }
101
- .card-flat {
102
- background: var(--card-bg);
103
- border: 1px solid var(--card-border);
104
- border-radius: 12px;
105
- padding: 24px;
106
- }
107
-
108
- /* ---- Ghost pill button ---- */
109
- .btn-ghost {
110
- display: inline-flex;
111
- align-items: center;
112
- gap: 6px;
113
- background: var(--ghost-bg);
114
- border: 1px solid var(--ghost-border);
115
- border-radius: 9999px;
116
- padding: 8px 20px;
117
- font-size: 0.9375rem;
118
- font-weight: 300;
119
- color: var(--text-secondary);
120
- transition: background 0.15s, border-color 0.15s, color 0.15s;
121
- }
122
- .btn-ghost:hover {
123
- background: rgba(184, 115, 51, 0.10);
124
- border-color: rgba(184, 115, 51, 0.30);
125
- color: var(--accent);
126
- }
127
- .btn-copper {
128
- display: inline-flex;
129
- align-items: center;
130
- gap: 6px;
131
- background: var(--accent);
132
- border: 1px solid transparent;
133
- border-radius: 9999px;
134
- padding: 8px 20px;
135
- font-size: 0.9375rem;
136
- font-weight: 300;
137
- color: #0A0A0A;
138
- transition: opacity 0.15s;
139
- }
140
- .btn-copper:hover { opacity: 0.85; }
141
-
142
- /* ---- Badge ---- */
143
- .badge {
144
- display: inline-flex;
145
- align-items: center;
146
- padding: 3px 10px;
147
- border-radius: 9999px;
148
- font-size: 0.75rem;
149
- font-weight: 300;
150
- background: var(--card-bg);
151
- border: 1px solid var(--card-border);
152
- color: var(--text-secondary);
153
- }
154
- .badge-copper {
155
- background: rgba(184, 115, 51, 0.15);
156
- border-color: rgba(184, 115, 51, 0.30);
157
- color: var(--accent);
158
- }
159
-
160
- /* ---- Health bar ---- */
161
- .health-bar {
162
- display: flex;
163
- height: 6px;
164
- border-radius: 9999px;
165
- overflow: hidden;
166
- gap: 2px;
167
- }
168
- .health-bar__complete { background: #87A96B; }
169
- .health-bar__attention { background: var(--accent); }
170
- .health-bar__incomplete { background: var(--card-border); flex: 1; }
171
-
172
- /* ---- Layout helpers ---- */
173
- .stack { display: flex; flex-direction: column; }
174
- .gap-4 { gap: 1rem; }
175
- .gap-6 { gap: 1.5rem; }
176
- .gap-8 { gap: 2rem; }
177
- .row { display: flex; flex-direction: row; align-items: center; }
178
- .between { justify-content: space-between; }
179
- .section { padding: 24px 0; border-top: 1px solid var(--card-border); }
180
- .section:first-child { border-top: none; }
181
-
182
- /* ---- Clickable / collapsible ---- */
183
- .clickable {
184
- cursor: pointer;
185
- transition: opacity 0.15s;
186
- user-select: none;
187
- }
188
- .clickable:hover { opacity: 0.80; }
189
- [data-collapsed] .collapsible-content { display: none; }
190
-
191
- /* ---- Responsive ---- */
192
- @media (max-width: 500px) {
193
- .heading-lg { font-size: 1.5rem; }
194
- .heading { font-size: 1.375rem; }
195
- .card, .card-flat { padding: 16px; }
196
- }
197
- `;
198
- // ---------------------------------------------------------------------------
199
- // Shared JS foundation — runs inside every iframe
200
- // ---------------------------------------------------------------------------
201
- export const PICA_APP_JS = `
202
- (function () {
203
- 'use strict';
204
-
205
- // Initialise bridge from injected ext-apps runtime
206
- var app = (window.__mcpExtApps && window.__mcpExtApps.getInstance)
207
- ? window.__mcpExtApps.getInstance()
208
- : null;
209
-
210
- // Keep theme in sync with host
211
- window.addEventListener('hostcontextchanged', function (e) {
212
- var detail = e.detail || {};
213
- if (detail.theme) {
214
- document.documentElement.setAttribute('data-theme', detail.theme);
215
- }
216
- });
217
-
218
- // Dispatch tool results to card handlers via ontoolresult callback
219
- window.addEventListener('toolresult', function (e) {
220
- var raw = (e.detail && e.detail.result) ? e.detail.result : null;
221
- if (!raw) return;
222
- var data;
223
- try { data = (typeof raw === 'string') ? JSON.parse(raw) : raw; }
224
- catch (_) { data = raw; }
225
- if (typeof window.onPicaToolResult === 'function') {
226
- window.onPicaToolResult(data);
227
- }
228
- });
229
-
230
- // Public API: send a message to the host agent via sendMessage
231
- window.picaAgentAction = function (message) {
232
- if (app && typeof app.sendMessage === 'function') {
233
- return app.sendMessage(message);
234
- }
235
- console.warn('[pica] bridge not available — message not sent:', message);
236
- };
237
-
238
- // Parse ADR-149 error envelope
239
- window.picaParseError = function (err) {
240
- if (!err) return null;
241
- if (err && typeof err === 'object' && 'code' in err) {
242
- return { code: err.code, message: err.message || 'unknown error', data: err.data || null };
243
- }
244
- return { code: -32603, message: String(err), data: null };
245
- };
246
- })();
247
- `;
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
- // ---------------------------------------------------------------------------
417
- // HTML builder — assembles a complete iframe document
418
- // ---------------------------------------------------------------------------
419
- export function buildAppHtml(title, bodyHtml, appJs) {
420
- return `<!DOCTYPE html>
421
- <html data-theme="dark">
422
- <head>
423
- <meta charset="utf-8">
424
- <meta name="viewport" content="width=device-width, initial-scale=1">
425
- <title>${title}</title>
426
- <style>${PICA_APP_CSS}</style>
427
- </head>
428
- <body>
429
- ${bodyHtml}
430
- <script>${APP_BRIDGE_JS}</script>
431
- <script>${PICA_APP_JS}</script>
432
- <script>${PICA_UPLOAD_MANAGER_JS}</script>
433
- <script>${appJs}</script>
434
- </body>
435
- </html>`;
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
- ];
480
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- export declare const UPLOAD_HTML: string;
2
- //# sourceMappingURL=upload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/apps/upload.ts"],"names":[],"mappings":"AA2RA,eAAO,MAAM,WAAW,QAIvB,CAAC"}