emdash 0.40.0 → 0.40.1

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 (200) hide show
  1. package/dist/api/route-utils.mjs +6 -6
  2. package/dist/api/schemas/index.d.mts +1 -1
  3. package/dist/{api-cFFZpyS0.mjs → api-CuyNEHZG.mjs} +3 -3
  4. package/dist/{api-cFFZpyS0.mjs.map → api-CuyNEHZG.mjs.map} +1 -1
  5. package/dist/{apply-CoT603H3.mjs → apply-npY1TAhG.mjs} +237 -34
  6. package/dist/apply-npY1TAhG.mjs.map +1 -0
  7. package/dist/astro/index.d.mts +3 -3
  8. package/dist/astro/index.mjs +9 -9
  9. package/dist/astro/index.mjs.map +1 -1
  10. package/dist/astro/middleware/auth.d.mts +3 -3
  11. package/dist/astro/middleware/redirect.mjs +1 -1
  12. package/dist/astro/middleware.d.mts +3 -3
  13. package/dist/astro/middleware.d.mts.map +1 -1
  14. package/dist/astro/middleware.mjs +19 -18
  15. package/dist/astro/middleware.mjs.map +1 -1
  16. package/dist/astro/routes/api/admin/media-usage/progress.mjs +2 -2
  17. package/dist/astro/routes/api/admin/media-usage/repair.mjs +2 -2
  18. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +8 -8
  19. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +8 -8
  20. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +8 -8
  21. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +11 -11
  22. package/dist/astro/routes/api/admin/plugins/index.mjs +8 -8
  23. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +8 -8
  24. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +11 -11
  25. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +8 -8
  26. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +8 -8
  27. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +12 -12
  28. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +9 -9
  29. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +9 -9
  30. package/dist/astro/routes/api/admin/plugins/updates.mjs +8 -8
  31. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +8 -8
  32. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +8 -8
  33. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +3 -3
  34. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +3 -3
  35. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +3 -3
  36. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +3 -3
  37. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +3 -3
  38. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +3 -3
  39. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +3 -3
  40. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +3 -3
  41. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +3 -3
  42. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +3 -3
  43. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +3 -3
  44. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +3 -3
  45. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +3 -3
  46. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +3 -3
  47. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +3 -3
  48. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +3 -3
  49. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +3 -3
  50. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +3 -3
  51. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +3 -3
  52. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +3 -3
  53. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +3 -3
  54. package/dist/astro/routes/api/dashboard.mjs +2 -2
  55. package/dist/astro/routes/api/health.mjs +1 -1
  56. package/dist/astro/routes/api/import/probe.mjs +3 -3
  57. package/dist/astro/routes/api/import/wordpress/execute.d.mts +3 -3
  58. package/dist/astro/routes/api/import/wordpress/media.d.mts +3 -3
  59. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +3 -3
  60. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +3 -3
  61. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +3 -3
  62. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +3 -3
  63. package/dist/astro/routes/api/manifest.mjs +1 -1
  64. package/dist/astro/routes/api/mcp.mjs +13 -33
  65. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  66. package/dist/astro/routes/api/media/_id_/confirm.mjs +1 -1
  67. package/dist/astro/routes/api/media/_id_/upload.mjs +1 -1
  68. package/dist/astro/routes/api/media/_id_/usage.mjs +2 -2
  69. package/dist/astro/routes/api/media/_id_.mjs +2 -2
  70. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +1 -1
  71. package/dist/astro/routes/api/media/upload-url.mjs +1 -1
  72. package/dist/astro/routes/api/media.mjs +2 -2
  73. package/dist/astro/routes/api/redirects/404s/index.mjs +2 -2
  74. package/dist/astro/routes/api/redirects/404s/summary.mjs +2 -2
  75. package/dist/astro/routes/api/redirects/_id_.mjs +2 -2
  76. package/dist/astro/routes/api/redirects/index.mjs +2 -2
  77. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +8 -8
  78. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +8 -8
  79. package/dist/astro/routes/api/schema/block-types/index.mjs +8 -8
  80. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +8 -8
  81. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +8 -8
  82. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +8 -8
  83. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +8 -8
  84. package/dist/astro/routes/api/schema/collections/index.mjs +8 -8
  85. package/dist/astro/routes/api/schema/collections/reorder.mjs +8 -8
  86. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +8 -8
  87. package/dist/astro/routes/api/schema/orphans/index.mjs +8 -8
  88. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +2 -2
  89. package/dist/astro/routes/api/settings/backups/archives/index.mjs +2 -2
  90. package/dist/astro/routes/api/settings/backups/export.mjs +2 -2
  91. package/dist/astro/routes/api/settings/backups/index.mjs +2 -2
  92. package/dist/astro/routes/api/settings.mjs +3 -3
  93. package/dist/astro/routes/api/setup/dev-bypass.mjs +4 -4
  94. package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
  95. package/dist/astro/routes/api/setup/index.mjs +35 -10
  96. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  97. package/dist/astro/routes/api/snapshot.mjs +2 -2
  98. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  99. package/dist/astro/routes/robots.txt.mjs +2 -2
  100. package/dist/astro/routes/sitemap-_collection_.xml.mjs +2 -2
  101. package/dist/astro/routes/sitemap.xml.mjs +2 -2
  102. package/dist/astro/types.d.mts +7 -3
  103. package/dist/astro/types.d.mts.map +1 -1
  104. package/dist/{backup-CBu0LrXf.mjs → backup-BQRj3afm.mjs} +3 -3
  105. package/dist/{backup-CBu0LrXf.mjs.map → backup-BQRj3afm.mjs.map} +1 -1
  106. package/dist/cli/index.mjs +6 -6
  107. package/dist/client/index.d.mts +14 -14
  108. package/dist/{config-5ii2haYu.d.mts → config-BjEm_3xL.d.mts} +25 -16
  109. package/dist/config-BjEm_3xL.d.mts.map +1 -0
  110. package/dist/{context-BeGccdUX.mjs → context-BV_7t-Ua.mjs} +6 -6
  111. package/dist/{context-BeGccdUX.mjs.map → context-BV_7t-Ua.mjs.map} +1 -1
  112. package/dist/{dashboard-DjrB-xxZ.mjs → dashboard-BP-iJqpd.mjs} +2 -2
  113. package/dist/{dashboard-DjrB-xxZ.mjs.map → dashboard-BP-iJqpd.mjs.map} +1 -1
  114. package/dist/db/libsql-migrations.mjs +2 -2
  115. package/dist/db/postgres-migrations.mjs +2 -2
  116. package/dist/db/sqlite-migrations.mjs +2 -2
  117. package/dist/{direct-executor-BmuFJJZV.mjs → direct-executor-D2lNadwo.mjs} +2 -2
  118. package/dist/{direct-executor-BmuFJJZV.mjs.map → direct-executor-D2lNadwo.mjs.map} +1 -1
  119. package/dist/{emdash-runtime-DAjghyEG.mjs → emdash-runtime-CtfnZmPi.mjs} +56 -56
  120. package/dist/emdash-runtime-CtfnZmPi.mjs.map +1 -0
  121. package/dist/{entry-lock-DVhCt49A.d.mts → entry-lock-Cf5OoIgN.d.mts} +18 -18
  122. package/dist/{entry-lock-DVhCt49A.d.mts.map → entry-lock-Cf5OoIgN.d.mts.map} +1 -1
  123. package/dist/{hreflang-DMFBL2eb.mjs → hreflang-CbVI4paR.mjs} +2 -2
  124. package/dist/{hreflang-DMFBL2eb.mjs.map → hreflang-CbVI4paR.mjs.map} +1 -1
  125. package/dist/{identity-IyNWwXr6.mjs → identity-Be5kzutJ.mjs} +2 -2
  126. package/dist/{identity-IyNWwXr6.mjs.map → identity-Be5kzutJ.mjs.map} +1 -1
  127. package/dist/{import-C3JZplWq.mjs → import-YzfKCaco.mjs} +2 -2
  128. package/dist/{import-C3JZplWq.mjs.map → import-YzfKCaco.mjs.map} +1 -1
  129. package/dist/index.d.mts +4 -4
  130. package/dist/index.mjs +16 -16
  131. package/dist/{manifest-builder-B8zR-73J.mjs → manifest-builder-BmSAOOEF.mjs} +2 -2
  132. package/dist/{manifest-builder-B8zR-73J.mjs.map → manifest-builder-BmSAOOEF.mjs.map} +1 -1
  133. package/dist/media/local-runtime.d.mts +3 -3
  134. package/dist/media/local-runtime.mjs +3 -3
  135. package/dist/{media-Qp5S3eH3.mjs → media-CPXTbb1R.mjs} +20 -2
  136. package/dist/media-CPXTbb1R.mjs.map +1 -0
  137. package/dist/{media-h7tOiDLj.mjs → media-JXRWDhw3.mjs} +77 -4
  138. package/dist/media-JXRWDhw3.mjs.map +1 -0
  139. package/dist/{media-usage-My-Vi-ex.mjs → media-usage-De-zeR9E.mjs} +2 -2
  140. package/dist/{media-usage-My-Vi-ex.mjs.map → media-usage-De-zeR9E.mjs.map} +1 -1
  141. package/dist/{menus-TsSGmSR4.mjs → menus-Cm68rsAq.mjs} +4 -4
  142. package/dist/{menus-TsSGmSR4.mjs.map → menus-Cm68rsAq.mjs.map} +1 -1
  143. package/dist/migrations/index.mjs +2 -2
  144. package/dist/page/index.mjs +2 -2
  145. package/dist/plugin-test-runtime.d.mts +3 -3
  146. package/dist/plugin-test-runtime.mjs +18 -18
  147. package/dist/plugin-utils.d.mts +3 -3
  148. package/dist/plugins/adapt-sandbox-entry.d.mts +3 -3
  149. package/dist/plugins/host.d.mts +1 -1
  150. package/dist/plugins/host.mjs +6 -6
  151. package/dist/{redirect-iJf5fltD.mjs → redirect-B29UjdUn.mjs} +10 -14
  152. package/dist/redirect-B29UjdUn.mjs.map +1 -0
  153. package/dist/{redirects-CYu1u1aK.mjs → redirects-Ca2MPfEG.mjs} +2 -2
  154. package/dist/{redirects-CYu1u1aK.mjs.map → redirects-Ca2MPfEG.mjs.map} +1 -1
  155. package/dist/{routes-CUsM40Cc.mjs → routes-vrR95WR6.mjs} +2 -2
  156. package/dist/{routes-CUsM40Cc.mjs.map → routes-vrR95WR6.mjs.map} +1 -1
  157. package/dist/runtime.d.mts +3 -3
  158. package/dist/seed/index.mjs +4 -4
  159. package/dist/seo/index.mjs +3 -3
  160. package/dist/{settings-CgjRWGW9.mjs → settings-B4vDl1fK.mjs} +2 -2
  161. package/dist/{settings-CgjRWGW9.mjs.map → settings-B4vDl1fK.mjs.map} +1 -1
  162. package/dist/{settings-2xNYr90o.mjs → settings-Dyj6v8C4.mjs} +2 -2
  163. package/dist/{settings-2xNYr90o.mjs.map → settings-Dyj6v8C4.mjs.map} +1 -1
  164. package/dist/{snapshot-CugwUqKQ.mjs → snapshot-PawoX-WG.mjs} +180 -3
  165. package/dist/snapshot-PawoX-WG.mjs.map +1 -0
  166. package/dist/{storage-query-Bdv7A62k.d.mts → storage-query-FXJH5pI8.d.mts} +6 -1
  167. package/dist/storage-query-FXJH5pI8.d.mts.map +1 -0
  168. package/dist/{transfer-BhUCrgDc.mjs → transfer-DgeCvHnj.mjs} +4 -4
  169. package/dist/{transfer-BhUCrgDc.mjs.map → transfer-DgeCvHnj.mjs.map} +1 -1
  170. package/dist/validate-CM79QXYE.d.mts.map +1 -1
  171. package/dist/version-DXsxRrob.mjs +7 -0
  172. package/dist/{version-DUQDHgrf.mjs.map → version-DXsxRrob.mjs.map} +1 -1
  173. package/package.json +5 -5
  174. package/src/api/handlers/index.ts +1 -0
  175. package/src/api/handlers/media-upload.ts +17 -71
  176. package/src/api/handlers/media.ts +97 -3
  177. package/src/api/handlers/snapshot.ts +257 -3
  178. package/src/astro/integration/vite-config.ts +10 -4
  179. package/src/astro/middleware.ts +1 -0
  180. package/src/astro/routes/api/setup/index.ts +66 -23
  181. package/src/astro/routes/api/snapshot.ts +2 -1
  182. package/src/astro/types.ts +5 -0
  183. package/src/cleanup.ts +10 -0
  184. package/src/components/Columns.astro +3 -1
  185. package/src/components/Cover.astro +3 -1
  186. package/src/database/repositories/media.ts +40 -1
  187. package/src/database/repositories/redirect.ts +17 -34
  188. package/src/emdash-runtime.ts +28 -0
  189. package/src/index.ts +1 -0
  190. package/src/mcp/server.ts +13 -48
  191. package/src/seed/apply.ts +322 -41
  192. package/dist/apply-CoT603H3.mjs.map +0 -1
  193. package/dist/config-5ii2haYu.d.mts.map +0 -1
  194. package/dist/emdash-runtime-DAjghyEG.mjs.map +0 -1
  195. package/dist/media-Qp5S3eH3.mjs.map +0 -1
  196. package/dist/media-h7tOiDLj.mjs.map +0 -1
  197. package/dist/redirect-iJf5fltD.mjs.map +0 -1
  198. package/dist/snapshot-CugwUqKQ.mjs.map +0 -1
  199. package/dist/storage-query-Bdv7A62k.d.mts.map +0 -1
  200. package/dist/version-DUQDHgrf.mjs +0 -7
@@ -6,7 +6,7 @@ import { i as encodeBase64, t as decodeBase64 } from "../../../base64-DvnNgP7e.m
6
6
  import "../../../secrets-CIi0nFiR.mjs";
7
7
  import "../../../object-cache-CqWNY5uP.mjs";
8
8
  import { i as InvalidCursorError, o as decodeCursor } from "../../../types-BkUg2yHx.mjs";
9
- import "../../../media-Qp5S3eH3.mjs";
9
+ import "../../../media-CPXTbb1R.mjs";
10
10
  import "../../../audit-RfCugiSB.mjs";
11
11
  import "../../../request-cache-DzLYKm_x.mjs";
12
12
  import "../../../byline-registry-gnKscbQX.mjs";
@@ -29,7 +29,7 @@ import "../../../collection-deletion-processor-Br6rxs3u.mjs";
29
29
  import "../../../settings-DYidIB26.mjs";
30
30
  import "../../../site-settings-DOgRUoFX.mjs";
31
31
  import "../../../errors-BF0_LFhW.mjs";
32
- import "../../../settings-CgjRWGW9.mjs";
32
+ import "../../../settings-B4vDl1fK.mjs";
33
33
  import { t as apiError } from "../../../error-CfvOHP0M.mjs";
34
34
  import "../../../redirects-Cv9apQKj.mjs";
35
35
  import { Ct as updateCollectionBody, I as createTaxonomyDefBody, St as updateBlockTypeBody, Yt as bylineCreateBody, Z as updateTaxonomyDefBody, dt as createBlockTypeBody, ft as createCollectionBody, rn as contentBylineInputSchema, tn as bylineUpdateBody, wt as updateFieldBody, zt as contentSeoInput } from "../../../entry-lock-BJYdBfXb.mjs";
@@ -51,7 +51,7 @@ import "../../../receipt-B4wJj5Jq.mjs";
51
51
  import { S as TRANSFER_SCOPES, n as TransferApprovalRepository } from "../../../approvals-CqMfNxak.mjs";
52
52
  import { a as siteImportDecisionsInputSchema, t as isPlanExecutable } from "../../../plan-xjcWrAah.mjs";
53
53
  import { i as TransferOperationRepository } from "../../../stage-DgrBz_du.mjs";
54
- import { C as requestTransferApproval, E as analysisTargetContext, S as handleTransferCapabilities, T as loadImportPlan, _ as handleImportGet, c as handleExportGet, d as handleImportAdvance, f as handleImportAnalyze, h as handleImportExecute, i as handleExportAdvance, o as handleExportCreate, t as exportParamsDigest, w as openExportPackage, x as handleImportReceipt } from "../../../transfer-BhUCrgDc.mjs";
54
+ import { C as requestTransferApproval, E as analysisTargetContext, S as handleTransferCapabilities, T as loadImportPlan, _ as handleImportGet, c as handleExportGet, d as handleImportAdvance, f as handleImportAnalyze, h as handleImportExecute, i as handleExportAdvance, o as handleExportCreate, t as exportParamsDigest, w as openExportPackage, x as handleImportReceipt } from "../../../transfer-DgeCvHnj.mjs";
55
55
  import "../../../keys-yxLm5l35.mjs";
56
56
  import { z } from "zod";
57
57
  import { Permissions, Role, canActOnOwn, hasPermission } from "@emdash-cms/auth";
@@ -1796,44 +1796,25 @@ function createMcpServer(pluginTools = [], request) {
1796
1796
  }));
1797
1797
  });
1798
1798
  server.registerTool("media_create", {
1799
- title: "Register Uploaded Media",
1800
- description: "Register a media file that has already been uploaded to storage. The caller is responsible for placing the file at `storageKey` (typically using a signed upload URL obtained from the admin UI or a separate API). This tool persists the metadata record so the file is discoverable via media_list / media_get and can be referenced by content. To upload the file itself, use media_upload (base64 data or a public URL) instead.",
1801
- inputSchema: z.object({
1802
- filename: z.string().describe("Original filename (e.g. 'logo.png')"),
1803
- mimeType: z.string().describe("MIME type (e.g. 'image/png')"),
1804
- storageKey: z.string().describe("Storage path/key the file was uploaded to"),
1805
- size: z.number().int().nonnegative().optional().describe("File size in bytes"),
1806
- width: z.number().int().positive().optional().describe("Image width in pixels"),
1807
- height: z.number().int().positive().optional().describe("Image height in pixels"),
1808
- contentHash: z.string().optional().describe("Hash of the file contents (for dedupe)"),
1809
- blurhash: z.string().optional().describe("Blurhash for image placeholders"),
1810
- dominantColor: z.string().optional().describe("Hex color string for the image's dominant color")
1811
- })
1799
+ title: "Confirm Signed Media Upload",
1800
+ description: "Confirm a file after uploading it with a signed URL obtained from POST /_emdash/api/media/upload-url. `storageKey` must be the key returned for the same user. Confirmation checks that the stored file exists and matches the size fixed when the URL was issued, then makes it available through media_list / media_get. To upload through MCP, use media_upload instead.",
1801
+ inputSchema: z.object({ storageKey: z.string().describe("Storage key returned by the signed upload URL request") })
1812
1802
  }, async (args, extra) => {
1813
1803
  requireScope(extra, "media:write");
1814
1804
  requireRole(extra, Role.AUTHOR);
1815
1805
  const { emdash, userId } = getExtra(extra);
1816
- return unwrap(await emdash.handleMediaCreate({
1817
- filename: args.filename,
1818
- mimeType: args.mimeType,
1806
+ return unwrap(await emdash.handleMediaRegisterUpload({
1819
1807
  storageKey: args.storageKey,
1820
- size: args.size,
1821
- width: args.width,
1822
- height: args.height,
1823
- contentHash: args.contentHash,
1824
- blurhash: args.blurhash,
1825
- dominantColor: args.dominantColor,
1826
1808
  authorId: userId
1827
1809
  }));
1828
1810
  });
1829
1811
  server.registerTool("media_upload", {
1830
1812
  title: "Upload Media",
1831
- description: "Upload a media file from base64-encoded data or an external URL and register it in the media library. Returns the media item with id, storageKey, and url — ready to reference from content fields (e.g. featured_image) via content_create / content_update. Uploads are deduplicated by content hash: re-uploading identical bytes returns the existing item with deduplicated: true. URL fetches must resolve to a public http(s) host (SSRF-guarded). Subject to the global upload MIME allowlist and the configured maximum upload size.",
1813
+ description: "Upload a media file from base64-encoded data and register it in the media library. Returns the media item with id, storageKey, and url — ready to reference from content fields (e.g. featured_image) via content_create / content_update. Uploads are deduplicated by content hash: re-uploading identical bytes returns the existing item with deduplicated: true. Subject to the global upload MIME allowlist and the configured maximum upload size.",
1832
1814
  inputSchema: z.object({
1833
1815
  filename: z.string().min(1).describe("Filename including extension (e.g. 'cover.png')"),
1834
- base64: z.string().optional().describe("Base64-encoded file contents. Provide exactly one of base64 / url."),
1835
- url: z.url().optional().describe("Public http(s) URL to fetch the file from. Provide exactly one of base64 / url."),
1836
- contentType: z.string().regex(CONTENT_TYPE_RE, "Invalid content type").optional().describe("MIME type (e.g. 'image/png'). Required with base64; with url it defaults to the response's Content-Type header."),
1816
+ base64: z.string().describe("Base64-encoded file contents."),
1817
+ contentType: z.string().regex(CONTENT_TYPE_RE, "Invalid content type").describe("MIME type (e.g. 'image/png')."),
1837
1818
  alt: z.string().optional().describe("Alt text for accessibility")
1838
1819
  }),
1839
1820
  annotations: { destructiveHint: false }
@@ -1846,7 +1827,6 @@ function createMcpServer(pluginTools = [], request) {
1846
1827
  return unwrap(await emdash.handleMediaUpload({
1847
1828
  filename: args.filename,
1848
1829
  base64: args.base64,
1849
- url: args.url,
1850
1830
  contentType: args.contentType,
1851
1831
  alt: args.alt,
1852
1832
  authorId: userId,
@@ -1922,7 +1902,7 @@ function createMcpServer(pluginTools = [], request) {
1922
1902
  };
1923
1903
  } else input = { scope: "all" };
1924
1904
  try {
1925
- const { handleMediaUsageRepair } = await import("../../../media-usage-My-Vi-ex.mjs").then((n) => n.o);
1905
+ const { handleMediaUsageRepair } = await import("../../../media-usage-De-zeR9E.mjs").then((n) => n.o);
1926
1906
  return unwrap(await handleMediaUsageRepair(ec.db, input));
1927
1907
  } catch (error) {
1928
1908
  return respondHandlerError(error, "MEDIA_USAGE_REPAIR_ERROR");
@@ -2407,7 +2387,7 @@ function createMcpServer(pluginTools = [], request) {
2407
2387
  requireRole(extra, Role.EDITOR);
2408
2388
  const ec = getEmDash(extra);
2409
2389
  try {
2410
- const { handleSettingsGet } = await import("../../../settings-2xNYr90o.mjs").then((n) => n.r);
2390
+ const { handleSettingsGet } = await import("../../../settings-Dyj6v8C4.mjs").then((n) => n.r);
2411
2391
  return unwrap(await handleSettingsGet(ec.db, ec.storage));
2412
2392
  } catch (error) {
2413
2393
  return respondHandlerError(error, "SETTINGS_READ_ERROR");
@@ -2433,7 +2413,7 @@ function createMcpServer(pluginTools = [], request) {
2433
2413
  requireRole(extra, Role.ADMIN);
2434
2414
  const ec = getEmDash(extra);
2435
2415
  try {
2436
- const { handleSettingsUpdate } = await import("../../../settings-2xNYr90o.mjs").then((n) => n.r);
2416
+ const { handleSettingsUpdate } = await import("../../../settings-Dyj6v8C4.mjs").then((n) => n.r);
2437
2417
  return unwrapAndInvalidate(extra, await handleSettingsUpdate(ec.db, ec.storage, args), [siteSettingsTag()]);
2438
2418
  } catch (error) {
2439
2419
  return respondHandlerError(error, "SETTINGS_UPDATE_ERROR");