@strapi/upload 5.52.3 → 5.54.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 (220) hide show
  1. package/dist/admin/future/components/Drawer.js +6 -3
  2. package/dist/admin/future/components/Drawer.js.map +1 -1
  3. package/dist/admin/future/components/Drawer.mjs +6 -3
  4. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  5. package/dist/admin/future/components/UploadProgressDialog.js +9 -8
  6. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  7. package/dist/admin/future/components/UploadProgressDialog.mjs +9 -8
  8. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  9. package/dist/admin/future/pages/Assets/AssetsPage.js +16 -4
  10. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/AssetsPage.mjs +16 -4
  12. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +5 -0
  14. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  15. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +5 -0
  16. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  17. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +19 -4
  18. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  19. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +19 -4
  20. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  21. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +35 -1
  22. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +35 -1
  24. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +10 -0
  26. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +10 -0
  28. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetsTable.js +9 -0
  30. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +10 -1
  32. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  33. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +132 -88
  34. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  35. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +135 -91
  36. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  37. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +7 -0
  38. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +7 -0
  40. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +4 -1
  42. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +4 -1
  44. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js +181 -0
  46. package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs +179 -0
  48. package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/constants.js +22 -0
  50. package/dist/admin/future/pages/Assets/constants.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/constants.mjs +19 -1
  52. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +65 -10
  54. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +66 -11
  56. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js +111 -0
  58. package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs +109 -0
  60. package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs.map +1 -0
  61. package/dist/admin/future/services/api.js +17 -0
  62. package/dist/admin/future/services/api.js.map +1 -1
  63. package/dist/admin/future/services/api.mjs +18 -1
  64. package/dist/admin/future/services/api.mjs.map +1 -1
  65. package/dist/admin/future/store/uploadProgress.js +31 -22
  66. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  67. package/dist/admin/future/store/uploadProgress.mjs +31 -22
  68. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  69. package/dist/admin/index.js +11 -10
  70. package/dist/admin/index.js.map +1 -1
  71. package/dist/admin/index.mjs +11 -10
  72. package/dist/admin/index.mjs.map +1 -1
  73. package/dist/admin/src/future/components/Drawer.d.ts +10 -0
  74. package/dist/admin/src/future/pages/Assets/components/MainAreaContextMenu.d.ts +28 -0
  75. package/dist/admin/src/future/pages/Assets/constants.d.ts +20 -0
  76. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +4 -0
  77. package/dist/admin/src/future/pages/Assets/hooks/useListScrollRestoration.d.ts +15 -0
  78. package/dist/admin/src/future/store/uploadProgress.d.ts +14 -20
  79. package/dist/admin/translations/en.json.js +1 -3
  80. package/dist/admin/translations/en.json.js.map +1 -1
  81. package/dist/admin/translations/en.json.mjs +1 -3
  82. package/dist/admin/translations/en.json.mjs.map +1 -1
  83. package/dist/server/bootstrap.js +11 -0
  84. package/dist/server/bootstrap.js.map +1 -1
  85. package/dist/server/bootstrap.mjs +11 -0
  86. package/dist/server/bootstrap.mjs.map +1 -1
  87. package/dist/server/controllers/admin-upload.js +31 -1
  88. package/dist/server/controllers/admin-upload.js.map +1 -1
  89. package/dist/server/controllers/admin-upload.mjs +31 -1
  90. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  91. package/dist/server/controllers/utils/find-entity-and-check-permissions.js +15 -4
  92. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
  93. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs +15 -4
  94. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
  95. package/dist/server/controllers/utils/folders.js +1 -1
  96. package/dist/server/controllers/utils/folders.js.map +1 -1
  97. package/dist/server/controllers/utils/folders.mjs +1 -1
  98. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  99. package/dist/server/mcp/ambient-instance.js +46 -0
  100. package/dist/server/mcp/ambient-instance.js.map +1 -0
  101. package/dist/server/mcp/ambient-instance.mjs +43 -0
  102. package/dist/server/mcp/ambient-instance.mjs.map +1 -0
  103. package/dist/server/mcp/handlers/constants.js +60 -0
  104. package/dist/server/mcp/handlers/constants.js.map +1 -0
  105. package/dist/server/mcp/handlers/constants.mjs +45 -0
  106. package/dist/server/mcp/handlers/constants.mjs.map +1 -0
  107. package/dist/server/mcp/handlers/folder-handlers.js +308 -0
  108. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -0
  109. package/dist/server/mcp/handlers/folder-handlers.mjs +303 -0
  110. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -0
  111. package/dist/server/mcp/handlers/read-handlers.js +134 -0
  112. package/dist/server/mcp/handlers/read-handlers.js.map +1 -0
  113. package/dist/server/mcp/handlers/read-handlers.mjs +130 -0
  114. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -0
  115. package/dist/server/mcp/handlers/write-handlers.js +315 -0
  116. package/dist/server/mcp/handlers/write-handlers.js.map +1 -0
  117. package/dist/server/mcp/handlers/write-handlers.mjs +311 -0
  118. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -0
  119. package/dist/server/mcp/permissions.js +36 -0
  120. package/dist/server/mcp/permissions.js.map +1 -0
  121. package/dist/server/mcp/permissions.mjs +33 -0
  122. package/dist/server/mcp/permissions.mjs.map +1 -0
  123. package/dist/server/mcp/register-upload-mcp-tools.js +235 -0
  124. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -0
  125. package/dist/server/mcp/register-upload-mcp-tools.mjs +232 -0
  126. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -0
  127. package/dist/server/mcp/sanitizers/sanitize-media.js +97 -0
  128. package/dist/server/mcp/sanitizers/sanitize-media.js.map +1 -0
  129. package/dist/server/mcp/sanitizers/sanitize-media.mjs +93 -0
  130. package/dist/server/mcp/sanitizers/sanitize-media.mjs.map +1 -0
  131. package/dist/server/mcp/schemas/input-schemas.js +206 -0
  132. package/dist/server/mcp/schemas/input-schemas.js.map +1 -0
  133. package/dist/server/mcp/schemas/input-schemas.mjs +190 -0
  134. package/dist/server/mcp/schemas/input-schemas.mjs.map +1 -0
  135. package/dist/server/mcp/schemas/output-schemas.js +158 -0
  136. package/dist/server/mcp/schemas/output-schemas.js.map +1 -0
  137. package/dist/server/mcp/schemas/output-schemas.mjs +142 -0
  138. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -0
  139. package/dist/server/mcp/utils.js +14 -0
  140. package/dist/server/mcp/utils.js.map +1 -0
  141. package/dist/server/mcp/utils.mjs +12 -0
  142. package/dist/server/mcp/utils.mjs.map +1 -0
  143. package/dist/server/media-library-default-notice.js +42 -0
  144. package/dist/server/media-library-default-notice.js.map +1 -0
  145. package/dist/server/media-library-default-notice.mjs +40 -0
  146. package/dist/server/media-library-default-notice.mjs.map +1 -0
  147. package/dist/server/register.js +5 -0
  148. package/dist/server/register.js.map +1 -1
  149. package/dist/server/register.mjs +5 -0
  150. package/dist/server/register.mjs.map +1 -1
  151. package/dist/server/services/folder.js.map +1 -1
  152. package/dist/server/services/folder.mjs.map +1 -1
  153. package/dist/server/services/upload.js +34 -10
  154. package/dist/server/services/upload.js.map +1 -1
  155. package/dist/server/services/upload.mjs +34 -10
  156. package/dist/server/services/upload.mjs.map +1 -1
  157. package/dist/server/src/bootstrap.d.ts.map +1 -1
  158. package/dist/server/src/controllers/admin-upload.d.ts +1 -0
  159. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  160. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts +14 -1
  161. package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts.map +1 -1
  162. package/dist/server/src/controllers/utils/folders.d.ts +2 -1
  163. package/dist/server/src/controllers/utils/folders.d.ts.map +1 -1
  164. package/dist/server/src/index.d.ts +10 -2
  165. package/dist/server/src/index.d.ts.map +1 -1
  166. package/dist/server/src/mcp/ambient-instance.d.ts +65 -0
  167. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -0
  168. package/dist/server/src/mcp/handlers/constants.d.ts +48 -0
  169. package/dist/server/src/mcp/handlers/constants.d.ts.map +1 -0
  170. package/dist/server/src/mcp/handlers/folder-handlers.d.ts +49 -0
  171. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -0
  172. package/dist/server/src/mcp/handlers/index.d.ts +5 -0
  173. package/dist/server/src/mcp/handlers/index.d.ts.map +1 -0
  174. package/dist/server/src/mcp/handlers/read-handlers.d.ts +35 -0
  175. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -0
  176. package/dist/server/src/mcp/handlers/write-handlers.d.ts +66 -0
  177. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -0
  178. package/dist/server/src/mcp/index.d.ts +3 -0
  179. package/dist/server/src/mcp/index.d.ts.map +1 -0
  180. package/dist/server/src/mcp/permissions.d.ts +22 -0
  181. package/dist/server/src/mcp/permissions.d.ts.map +1 -0
  182. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +29 -0
  183. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -0
  184. package/dist/server/src/mcp/sanitizers/sanitize-media.d.ts +63 -0
  185. package/dist/server/src/mcp/sanitizers/sanitize-media.d.ts.map +1 -0
  186. package/dist/server/src/mcp/schemas/index.d.ts +3 -0
  187. package/dist/server/src/mcp/schemas/index.d.ts.map +1 -0
  188. package/dist/server/src/mcp/schemas/input-schemas.d.ts +148 -0
  189. package/dist/server/src/mcp/schemas/input-schemas.d.ts.map +1 -0
  190. package/dist/server/src/mcp/schemas/output-schemas.d.ts +276 -0
  191. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -0
  192. package/dist/server/src/mcp/types.d.ts +19 -0
  193. package/dist/server/src/mcp/types.d.ts.map +1 -0
  194. package/dist/server/src/mcp/utils.d.ts +4 -0
  195. package/dist/server/src/mcp/utils.d.ts.map +1 -0
  196. package/dist/server/src/media-library-default-notice.d.ts +19 -0
  197. package/dist/server/src/media-library-default-notice.d.ts.map +1 -0
  198. package/dist/server/src/register.d.ts.map +1 -1
  199. package/dist/server/src/services/folder.d.ts +6 -2
  200. package/dist/server/src/services/folder.d.ts.map +1 -1
  201. package/dist/server/src/services/index.d.ts +10 -2
  202. package/dist/server/src/services/index.d.ts.map +1 -1
  203. package/dist/server/src/services/upload.d.ts +10 -1
  204. package/dist/server/src/services/upload.d.ts.map +1 -1
  205. package/dist/server/src/types.d.ts +2 -2
  206. package/dist/server/src/types.d.ts.map +1 -1
  207. package/dist/server/src/utils/index.d.ts +2 -1
  208. package/dist/server/src/utils/index.d.ts.map +1 -1
  209. package/dist/server/utils/index.js +2 -2
  210. package/dist/server/utils/index.js.map +1 -1
  211. package/dist/server/utils/index.mjs +2 -2
  212. package/dist/server/utils/index.mjs.map +1 -1
  213. package/dist/shared/contracts/files.d.ts +22 -0
  214. package/dist/shared/contracts/files.d.ts.map +1 -1
  215. package/package.json +7 -6
  216. package/dist/admin/future/components/BetaNotice.js +0 -72
  217. package/dist/admin/future/components/BetaNotice.js.map +0 -1
  218. package/dist/admin/future/components/BetaNotice.mjs +0 -70
  219. package/dist/admin/future/components/BetaNotice.mjs.map +0 -1
  220. package/dist/admin/src/future/components/BetaNotice.d.ts +0 -11
@@ -0,0 +1,66 @@
1
+ import type { Core, Modules } from '@strapi/types';
2
+ /**
3
+ * `media_update_asset` — edits the writable metadata of one asset.
4
+ *
5
+ * Gated on `plugin::upload.assets.update` and mirrors `PUT /upload/files/:id`: the same
6
+ * `findEntityAndCheckPermissions` row-level check, the same `updateFileInfo` service call, and
7
+ * the same `updatedBy` attribution from the session user.
8
+ *
9
+ * The response carries the updated asset through the read sanitizer, so a client can confirm
10
+ * the write without a second `media_get_asset` round-trip — and so provider fields stay
11
+ * invisible on the write path too.
12
+ */
13
+ export declare const createMediaUpdateAssetHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
14
+ args: Record<string, unknown>;
15
+ }) => Promise<Modules.MCP.McpToolHandlerReturn>;
16
+ /**
17
+ * `media_move_assets` — moves assets between folders in bulk.
18
+ *
19
+ * Bulk with a per-id report, rather than all-or-nothing: an agent reorganising a library moves
20
+ * many assets at once, and one bad id among good ones must not discard the valid moves. Each
21
+ * asset is moved on its own, so a failure is confined to its own id and the response says exactly
22
+ * which ids to retry.
23
+ *
24
+ * That is why this does not reuse the admin `/actions/bulk-move` controller path, whose single
25
+ * transaction is all-or-nothing by construction (and which also handles folders, out of scope
26
+ * here). It goes through `updateFileInfo` instead — the same service `media_update_asset` and
27
+ * `PUT /upload/files/:id` use — which sets the `folder` relation, recomputes the private
28
+ * `folderPath`, attributes `updatedBy`, and emits `media.update` per asset. Replicating the
29
+ * controller's raw join-table writes would skip all four.
30
+ *
31
+ * The moves are sequential on purpose. Each one writes the join table and `folderPath` for its
32
+ * asset, and a bounded reorganisation (100 ids max, per the input schema) is not worth the
33
+ * connection-pool contention of firing them in parallel.
34
+ */
35
+ export declare const createMediaMoveAssetsHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
36
+ args: Record<string, unknown>;
37
+ }) => Promise<Modules.MCP.McpToolHandlerReturn>;
38
+ /**
39
+ * `media_delete_assets` — previews or performs the permanent deletion of assets, in bulk.
40
+ *
41
+ * Two branches behind one tool, for the same reason as `media_delete_folder`: the preview and the
42
+ * deletion must agree on what would be destroyed, and splitting them across tools would both let
43
+ * the two drift apart and let an agent reach the destructive one without ever seeing a preview.
44
+ * `dryRun` defaults to true (see the input schema), so omitting the flag previews and deleting
45
+ * takes an explicit `dryRun: false`.
46
+ *
47
+ * Per-id, not all-or-nothing — the opposite of `media_delete_folder`, on purpose. A folder delete
48
+ * cascades, so a mixed id list there is refused outright rather than half-applied over an unknown
49
+ * amount of content. Here each id is exactly one asset, the blast radius of a bad one is nil, and
50
+ * the requirement is explicit: a bad id among good ones must not discard the valid deletions.
51
+ * The dry run reports the same per-id split, so an agent sees which ids will not resolve *before*
52
+ * anything is destroyed rather than after.
53
+ *
54
+ * This does not reuse `file.deleteByIds` (the admin `/actions/bulk-delete` path). That helper
55
+ * fires `upload.remove` under a single `Promise.all`, so the first rejection discards the report
56
+ * of everything already deleted — unrecoverable for an operation with no undo. The removals are
57
+ * driven one at a time here instead, through the same `upload.remove` service, which deletes the
58
+ * provider file and every generated format, emits `media.delete`, and then deletes the row.
59
+ *
60
+ * The deletions are sequential on purpose: each one performs provider I/O, and a bounded batch
61
+ * (100 ids max, per the input schema) is not worth firing at a provider in parallel.
62
+ */
63
+ export declare const createMediaDeleteAssetsHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
64
+ args: Record<string, unknown>;
65
+ }) => Promise<Modules.MCP.McpToolHandlerReturn>;
66
+ //# sourceMappingURL=write-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/write-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAiEnD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,GACxC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CA4C7C,CAAC;AA8BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,GACvC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAgF7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,8BAA8B,GACzC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAmF7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { registerUploadMcpTools, buildUploadMcpToolDefinitions } from './register-upload-mcp-tools';
2
+ export type { UploadMcpTool } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACpG,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Core, Modules } from '@strapi/types';
2
+ /**
3
+ * Builds an admin permissions manager for a media model bound to the MCP session's ability.
4
+ *
5
+ * MCP tool handlers have no Koa context, so they cannot rely on route policies: each handler must
6
+ * re-check permissions itself, exactly as the admin controllers do via `ctx.state.userAbility`.
7
+ * The declarative `auth.policies` on a tool definition already gates registration and invocation;
8
+ * this second check is what keeps a handler safe if it is ever called from another entry point.
9
+ *
10
+ * It is also the only check bound to a model. `plugin::upload.read` is registered in the
11
+ * `plugins` section with no subject (see the upload plugin bootstrap), so a tool's policies
12
+ * carry an action only — a subject-less grant registers as CASL `subject: 'all'`. Passing a
13
+ * model UID as the policy subject is rejected by the admin-token validation, so the file /
14
+ * folder distinction is enforced here, where the permissions manager is bound to the UID.
15
+ */
16
+ export declare const createMediaPermissionsManager: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext, action: string, model: string) => any;
17
+ /**
18
+ * Throws `ForbiddenError` unless the session's ability permits `action` on `model`.
19
+ * Mirrors the `if (!pm.isAllowed) return ctx.forbidden()` guard in the admin controllers.
20
+ */
21
+ export declare const assertMediaPermission: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext, action: string, model: string) => any;
22
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,GACxC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,EACtC,QAAQ,MAAM,EACd,OAAO,MAAM,QAMX,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,EACtC,QAAQ,MAAM,EACd,OAAO,MAAM,QASd,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Core } from '@strapi/types';
2
+ import type { UploadMcpTool } from './types';
3
+ /**
4
+ * The Media Library MCP tools.
5
+ *
6
+ * Folder writes inherit the same `plugin::upload.assets.update` action rather than introducing a
7
+ * folder-specific one, matching what the admin UI enforces today. MCP-specific folder RBAC is
8
+ * out of scope.
9
+ *
10
+ * Renaming and moving are separate tools for both objects — rename/update changes attributes,
11
+ * move changes location — so an agent selects by intent instead of assembling a combined patch.
12
+ *
13
+ * The asset and folder tools stay separate for both move and delete, even though
14
+ * `/actions/bulk-move` accepts both id lists at once and `/actions/bulk-delete` accepts `fileIds`
15
+ * and `folderIds` together. Asset ids and folder ids are indistinguishable integers from separate
16
+ * namespaces, and both `media_list_assets` and `media_list_folders` return a plain `id`, so a
17
+ * combined tool would let an agent pass folder ids where assets were meant with nothing to
18
+ * object. On the delete side that mistake is unrecoverable, and two tools also let each
19
+ * description carry the warning matched to its own blast radius.
20
+ */
21
+ export declare const buildUploadMcpToolDefinitions: () => UploadMcpTool[];
22
+ /**
23
+ * Registers the Media Library MCP tools via `strapi.ai.mcp.registerTool()`.
24
+ * Must be called from the plugin register phase, before the MCP HTTP server starts.
25
+ */
26
+ export declare const registerUploadMcpTools: ({ strapi }: {
27
+ strapi: Core.Strapi;
28
+ }) => void;
29
+ //# sourceMappingURL=register-upload-mcp-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-upload-mcp-tools.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/register-upload-mcp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmC7C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,6BAA6B,QAAO,aAAa,EAiH7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAAG,IAO5E,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { MediaFolderNode } from '../schemas';
2
+ type RawFolder = {
3
+ id?: unknown;
4
+ name?: unknown;
5
+ children?: unknown;
6
+ };
7
+ type RawAsset = Record<string, unknown> & {
8
+ folder?: RawFolder | null;
9
+ };
10
+ /**
11
+ * Projects a raw file row onto the MCP asset shape.
12
+ *
13
+ * This is an allowlist: every exposed key is named explicitly, so `provider`,
14
+ * `provider_metadata` (which can carry provider credentials), `hash`, `formats`, `related`,
15
+ * and the private `folderPath` never reach an MCP client — including after new fields are
16
+ * added to the file content-type.
17
+ */
18
+ export declare const sanitizeMediaAsset: (asset: RawAsset) => {
19
+ id: number;
20
+ name: string;
21
+ alternativeText: string | null;
22
+ caption: string | null;
23
+ url: string;
24
+ mime: string;
25
+ size: number;
26
+ width: number | null;
27
+ height: number | null;
28
+ ext: string | null;
29
+ folder: {
30
+ id: number;
31
+ name: string;
32
+ } | null;
33
+ createdAt: string | null;
34
+ updatedAt: string | null;
35
+ };
36
+ /**
37
+ * Projects the recursive output of `folder.getStructure()` onto `{ id, name, children }`,
38
+ * dropping `path` and `pathId` (internal materialized-path bookkeeping).
39
+ */
40
+ export declare const sanitizeMediaFolderTree: (nodes: unknown) => MediaFolderNode[];
41
+ /**
42
+ * Projects a raw folder row onto the MCP folder shape.
43
+ *
44
+ * An allowlist for the same reason as `sanitizeMediaAsset`: `path` and `pathId` are the internal
45
+ * materialized-path bookkeeping the folder service uses to cascade moves and deletes. Exposing
46
+ * them would invite an agent to treat them as addressable, and any field added to the folder
47
+ * content-type later stays invisible until it is named here on purpose.
48
+ */
49
+ export declare const sanitizeMediaFolder: (folder: (RawFolder & Record<string, unknown>) | null | undefined) => {
50
+ createdAt: string | null;
51
+ updatedAt: string | null;
52
+ parent?: {
53
+ id: number;
54
+ name?: undefined;
55
+ } | {
56
+ id: number;
57
+ name: string;
58
+ } | null | undefined;
59
+ id: number;
60
+ name: string;
61
+ } | null;
62
+ export {};
63
+ //# sourceMappingURL=sanitize-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-media.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/sanitizers/sanitize-media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxC,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B,CAAC;AAeF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,QAAQ;;;;;;;;;;;;;;;;;CAqBjD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,eAAe,EAQvE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;;;QA+BjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { mediaIdSchema, folderIdSchema, folderNameSchema, pageSchema, pageSizeSchema, sortSchema, mediaListAssetsInputSchema, mediaGetAssetInputSchema, mediaListFoldersInputSchema, mediaUpdateAssetInputSchema, mediaCreateFolderInputSchema, mediaRenameFolderInputSchema, mediaMoveFolderInputSchema, mediaDeleteFolderInputSchema, mediaMoveAssetsInputSchema, mediaDeleteAssetsInputSchema, } from './input-schemas';
2
+ export { mediaAssetOutputSchema, mediaGetAssetOutputSchema, mediaListAssetsOutputSchema, mediaFolderNodeSchema, mediaListFoldersOutputSchema, mediaUpdateAssetOutputSchema, mediaFolderOutputSchema, mediaCreateFolderOutputSchema, mediaRenameFolderOutputSchema, mediaMoveFolderOutputSchema, mediaDeleteFolderOutputSchema, mediaMoveAssetsFailureSchema, mediaMoveAssetsOutputSchema, mediaDeleteAssetsFailureSchema, mediaDeleteAssetsOutputSchema, type MediaFolderNode, } from './output-schemas';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,UAAU,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { z } from '@strapi/utils';
2
+ /**
3
+ * Media files and folders are NOT documents: they are plain entities keyed by a numeric `id`,
4
+ * so there is no `documentId` and no draft/published pair. Every media identifier in the MCP
5
+ * surface is this numeric id.
6
+ */
7
+ export declare const mediaIdSchema: z.ZodNumber;
8
+ export declare const folderIdSchema: z.ZodNumber;
9
+ export declare const pageSchema: z.ZodOptional<z.ZodNumber>;
10
+ export declare const pageSizeSchema: z.ZodOptional<z.ZodNumber>;
11
+ /**
12
+ * Sort is constrained to the same whitelist the Media Library admin uses, so MCP callers
13
+ * cannot sort by private columns such as `folderPath`.
14
+ */
15
+ export declare const sortSchema: z.ZodOptional<z.ZodEnum<{
16
+ [x: string]: string;
17
+ }>>;
18
+ export declare const mediaListAssetsInputSchema: z.ZodObject<{
19
+ folderId: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
20
+ mime: z.ZodOptional<z.ZodString>;
21
+ name: z.ZodOptional<z.ZodString>;
22
+ page: z.ZodOptional<z.ZodNumber>;
23
+ pageSize: z.ZodOptional<z.ZodNumber>;
24
+ sort: z.ZodOptional<z.ZodEnum<{
25
+ [x: string]: string;
26
+ }>>;
27
+ }, z.core.$strip>;
28
+ export declare const mediaGetAssetInputSchema: z.ZodObject<{
29
+ id: z.ZodNumber;
30
+ }, z.core.$strip>;
31
+ export declare const mediaListFoldersInputSchema: z.ZodObject<{}, z.core.$strip>;
32
+ /**
33
+ * `media_update_asset` input — the only writable asset metadata.
34
+ *
35
+ * `.strict()` turns an out-of-scope field into an error rather than a silent no-op. The custom
36
+ * object error directs folder-shaped inputs to `media_move_assets`; other unknown keys are named by
37
+ * Zod's default error, so the agent can correct the call without a round-trip.
38
+ *
39
+ * The "at least one field" rule is enforced in the handler, not here: a `.refine()` would turn
40
+ * this into a `ZodEffects`, which the MCP tool registry cannot expose as an input schema.
41
+ */
42
+ export declare const mediaUpdateAssetInputSchema: z.ZodObject<{
43
+ id: z.ZodNumber;
44
+ name: z.ZodOptional<z.ZodString>;
45
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
46
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
47
+ }, z.core.$strict>;
48
+ /**
49
+ * Folder name, validated to the same rules as the admin folder controller
50
+ * (`controllers/validation/admin/folder.ts`): non-empty, no slashes, no surrounding whitespace.
51
+ *
52
+ * Enforcing the shape here rather than only in the handler means the agent is corrected by the
53
+ * tool schema — before a call is made — instead of by a service-level error afterwards. The
54
+ * uniqueness rule cannot live here: it needs a DB read, so it stays in the handler.
55
+ */
56
+ export declare const folderNameSchema: z.ZodString;
57
+ export declare const mediaCreateFolderInputSchema: z.ZodObject<{
58
+ name: z.ZodString;
59
+ parent: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
60
+ }, z.core.$strict>;
61
+ /**
62
+ * `media_rename_folder` deliberately takes no `parent`: renaming and moving are separate tools, so an
63
+ * agent picks by intent. A `parent` here is a sign the caller wanted `media_move_folder`, and the
64
+ * custom object error says so rather than letting Zod's generic "unrecognized key" stand.
65
+ */
66
+ export declare const mediaRenameFolderInputSchema: z.ZodObject<{
67
+ id: z.ZodNumber;
68
+ name: z.ZodString;
69
+ }, z.core.$strict>;
70
+ /**
71
+ * `media_move_folder` requires `parent` — including an explicit null for the root. Making it required
72
+ * is what keeps a mistyped move from silently becoming a no-op update.
73
+ */
74
+ export declare const mediaMoveFolderInputSchema: z.ZodObject<{
75
+ id: z.ZodNumber;
76
+ parent: z.ZodNullable<z.ZodNumber>;
77
+ }, z.core.$strict>;
78
+ /**
79
+ * `media_delete_folder` input.
80
+ *
81
+ * `dryRun` defaults to true: the safe branch is the one an agent gets when it omits the flag, so
82
+ * a destructive cascade is never the path of least resistance (the initiative card's mitigation
83
+ * for irreversible MCP operations). Deleting requires saying `dryRun: false` on purpose.
84
+ *
85
+ * That default lives in the handler (`folder-handlers.ts`, `dryRun = true`), NOT in this schema:
86
+ * `.default(true)` here is deliberately avoided so an omitted flag is a preview no matter how a
87
+ * client serialises the advertised schema. The `.describe()` text below is what tells an agent
88
+ * the default, so the two must be kept in step — do not "fix" this to `.default(true)`.
89
+ */
90
+ export declare const mediaDeleteFolderInputSchema: z.ZodObject<{
91
+ ids: z.ZodArray<z.ZodNumber>;
92
+ dryRun: z.ZodOptional<z.ZodBoolean>;
93
+ }, z.core.$strict>;
94
+ /**
95
+ * `media_move_assets` input.
96
+ *
97
+ * Bulk by design: an agent reorganising a library moves many assets at once, and one call with a
98
+ * per-id report is cheaper and easier to recover from than N sequential calls. There is no
99
+ * single-asset variant — the array length is the only difference, and a second tool would add a
100
+ * choice without removing a mistake. The admin REST API agrees: `/actions/bulk-move` is the only
101
+ * move route.
102
+ *
103
+ * `folder` is required, including an explicit null for the root, for the same reason `media_move_folder`
104
+ * requires `parent`: a move needs a destination, and an omitted key would silently become a no-op.
105
+ *
106
+ * ASSET ids only, and the schema CANNOT enforce it. Asset ids and folder ids are independently
107
+ * numbered, so the same integer routinely names both; the handler resolves ids in the file table,
108
+ * which means a folder id whose number collides with an asset moves that asset — and reports it
109
+ * as a success. Only an id matching no asset at all is reported as failed.
110
+ *
111
+ * This is an accepted risk, not an oversight: with a bare `ids: number[]` there is no way for the
112
+ * caller to say which namespace it meant, and refusing every colliding id would make those assets
113
+ * permanently unmovable over MCP. The mitigation is the tool description. The durable fix is
114
+ * namespaced handles (`asset:1` / `folder:1`) across the whole media surface, which is a breaking
115
+ * change to the read tools and belongs to its own ticket.
116
+ */
117
+ export declare const mediaMoveAssetsInputSchema: z.ZodObject<{
118
+ ids: z.ZodArray<z.ZodNumber>;
119
+ folder: z.ZodNullable<z.ZodNumber>;
120
+ }, z.core.$strict>;
121
+ /**
122
+ * `media_delete_assets` input.
123
+ *
124
+ * Bulk-only, like `media_move_assets`: the admin REST API has no single-asset delete route either
125
+ * (`/actions/bulk-delete` is the only one), and single-vs-bulk is an array length rather than a
126
+ * distinction an agent can get wrong.
127
+ *
128
+ * `dryRun` defaults to true in the handler, not here — same reasoning as `media_delete_folder`: the
129
+ * safe branch is what an agent gets when it omits the flag, so an irreversible delete is never
130
+ * the path of least resistance. A schema-level `.default(true)` would publish as a JSON Schema
131
+ * default a client could serialise away.
132
+ *
133
+ * ASSET ids only, and the schema CANNOT enforce it. Asset ids and folder ids are independently
134
+ * numbered, so the same integer routinely names both; the handler resolves ids in the file table,
135
+ * which means a folder id whose number collides with an asset deletes that asset. Only an id
136
+ * matching no asset at all is reported as failed.
137
+ *
138
+ * This is an accepted risk, not an oversight: with a bare `ids: number[]` there is no way for the
139
+ * caller to say which namespace it meant, and refusing every colliding id would make those assets
140
+ * permanently undeletable over MCP. The mitigations are the dry run and the tool description. The
141
+ * durable fix is namespaced handles (`asset:1` / `folder:1`) across the whole media surface, which
142
+ * is a breaking change to the read tools and belongs to its own ticket.
143
+ */
144
+ export declare const mediaDeleteAssetsInputSchema: z.ZodObject<{
145
+ ids: z.ZodArray<z.ZodNumber>;
146
+ dryRun: z.ZodOptional<z.ZodBoolean>;
147
+ }, z.core.$strict>;
148
+ //# sourceMappingURL=input-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/input-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAIlC;;;;GAIG;AACH,eAAO,MAAM,aAAa,aAMvB,CAAC;AAEJ,eAAO,MAAM,cAAc,aAIuE,CAAC;AAEnG,eAAO,MAAM,UAAU,4BAK4B,CAAC;AAEpD,eAAO,MAAM,cAAc,4BAM2B,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,UAAU;;GAKpB,CAAC;AAEJ,eAAO,MAAM,0BAA0B;;;;;;;;;iBAsBrC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;iBAEnC,CAAC;AAEH,eAAO,MAAM,2BAA2B,gCAAe,CAAC;AAIxD;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;kBAuC7B,CAAC;AAEZ;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,aAO1B,CAAC;AAaJ,eAAO,MAAM,4BAA4B;;;kBAS9B,CAAC;AAEZ;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;kBAgB9B,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;kBAgB5B,CAAC;AAEZ;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B;;;kBAgB9B,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,0BAA0B;;;kBAiC5B,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,4BAA4B;;;kBAkC9B,CAAC"}
@@ -0,0 +1,276 @@
1
+ import { z } from '@strapi/utils';
2
+ /**
3
+ * The exhaustive set of asset fields the MCP surface may expose — an allowlist, for the reasons
4
+ * in `sanitizeMediaAsset`. A field added to the file content-type stays invisible to MCP until
5
+ * it is added both here and there.
6
+ */
7
+ export declare const mediaAssetOutputSchema: z.ZodObject<{
8
+ id: z.ZodNumber;
9
+ name: z.ZodString;
10
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
11
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12
+ url: z.ZodString;
13
+ mime: z.ZodString;
14
+ size: z.ZodNumber;
15
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
16
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
17
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
19
+ id: z.ZodNumber;
20
+ name: z.ZodString;
21
+ }, z.core.$strip>>>;
22
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
+ }, z.core.$strip>;
25
+ export declare const mediaGetAssetOutputSchema: z.ZodObject<{
26
+ data: z.ZodNullable<z.ZodObject<{
27
+ id: z.ZodNumber;
28
+ name: z.ZodString;
29
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
31
+ url: z.ZodString;
32
+ mime: z.ZodString;
33
+ size: z.ZodNumber;
34
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
35
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
36
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
37
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
38
+ id: z.ZodNumber;
39
+ name: z.ZodString;
40
+ }, z.core.$strip>>>;
41
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
43
+ }, z.core.$strip>>;
44
+ }, z.core.$strip>;
45
+ export declare const mediaListAssetsOutputSchema: z.ZodObject<{
46
+ results: z.ZodArray<z.ZodObject<{
47
+ id: z.ZodNumber;
48
+ name: z.ZodString;
49
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
50
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
+ url: z.ZodString;
52
+ mime: z.ZodString;
53
+ size: z.ZodNumber;
54
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
55
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
56
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
57
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
58
+ id: z.ZodNumber;
59
+ name: z.ZodString;
60
+ }, z.core.$strip>>>;
61
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
62
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
+ }, z.core.$strip>>;
64
+ pagination: z.ZodObject<{
65
+ page: z.ZodNumber;
66
+ pageSize: z.ZodNumber;
67
+ pageCount: z.ZodNumber;
68
+ total: z.ZodNumber;
69
+ }, z.core.$strip>;
70
+ }, z.core.$strip>;
71
+ /**
72
+ * Folder tree node. `children` is recursive and unbounded in depth, so it is typed lazily.
73
+ */
74
+ export type MediaFolderNode = {
75
+ id: number;
76
+ name: string;
77
+ children: MediaFolderNode[];
78
+ };
79
+ export declare const mediaFolderNodeSchema: z.ZodType<MediaFolderNode>;
80
+ export declare const mediaListFoldersOutputSchema: z.ZodObject<{
81
+ data: z.ZodArray<z.ZodType<MediaFolderNode, unknown, z.core.$ZodTypeInternals<MediaFolderNode, unknown>>>;
82
+ }, z.core.$strip>;
83
+ /**
84
+ * `media_update_asset` output — the updated asset in the same shape the read tools return,
85
+ * so an agent can confirm the write without a follow-up `media_get_asset` call.
86
+ */
87
+ export declare const mediaUpdateAssetOutputSchema: z.ZodObject<{
88
+ data: z.ZodObject<{
89
+ id: z.ZodNumber;
90
+ name: z.ZodString;
91
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
92
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
93
+ url: z.ZodString;
94
+ mime: z.ZodString;
95
+ size: z.ZodNumber;
96
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
97
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
98
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
99
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
100
+ id: z.ZodNumber;
101
+ name: z.ZodString;
102
+ }, z.core.$strip>>>;
103
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
104
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
+ }, z.core.$strip>;
106
+ }, z.core.$strip>;
107
+ /**
108
+ * A folder as returned by the write tools.
109
+ *
110
+ * Like the asset schema this is an ALLOWLIST: `path` and `pathId` are internal materialized-path
111
+ * bookkeeping and stay invisible to MCP clients, matching what `media_list_folders` already exposes.
112
+ */
113
+ export declare const mediaFolderOutputSchema: z.ZodObject<{
114
+ id: z.ZodNumber;
115
+ name: z.ZodString;
116
+ parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
117
+ id: z.ZodNumber;
118
+ name: z.ZodOptional<z.ZodString>;
119
+ }, z.core.$strip>>>;
120
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
121
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
122
+ }, z.core.$strip>;
123
+ export declare const mediaCreateFolderOutputSchema: z.ZodObject<{
124
+ data: z.ZodObject<{
125
+ id: z.ZodNumber;
126
+ name: z.ZodString;
127
+ parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
128
+ id: z.ZodNumber;
129
+ name: z.ZodOptional<z.ZodString>;
130
+ }, z.core.$strip>>>;
131
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
132
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
133
+ }, z.core.$strip>;
134
+ }, z.core.$strip>;
135
+ export declare const mediaRenameFolderOutputSchema: z.ZodObject<{
136
+ data: z.ZodObject<{
137
+ id: z.ZodNumber;
138
+ name: z.ZodString;
139
+ parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
140
+ id: z.ZodNumber;
141
+ name: z.ZodOptional<z.ZodString>;
142
+ }, z.core.$strip>>>;
143
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
144
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
145
+ }, z.core.$strip>;
146
+ }, z.core.$strip>;
147
+ export declare const mediaMoveFolderOutputSchema: z.ZodObject<{
148
+ data: z.ZodObject<{
149
+ id: z.ZodNumber;
150
+ name: z.ZodString;
151
+ parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
152
+ id: z.ZodNumber;
153
+ name: z.ZodOptional<z.ZodString>;
154
+ }, z.core.$strip>>>;
155
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
156
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
157
+ }, z.core.$strip>;
158
+ }, z.core.$strip>;
159
+ /**
160
+ * `media_delete_folder` output — the same shape for both branches, so an agent reads one contract.
161
+ *
162
+ * `dryRun` echoes which branch ran: on true the counts are what *would* be removed and nothing
163
+ * was touched; on false they are what actually was. Echoing it back means the agent can tell a
164
+ * preview from a completed deletion without tracking what it sent.
165
+ *
166
+ * There is no "skipped ids" field: an id that does not resolve to a folder rejects the whole
167
+ * call, so every id in the request is accounted for by `folders` on any successful response.
168
+ */
169
+ export declare const mediaDeleteFolderOutputSchema: z.ZodObject<{
170
+ dryRun: z.ZodBoolean;
171
+ folders: z.ZodArray<z.ZodObject<{
172
+ id: z.ZodNumber;
173
+ name: z.ZodString;
174
+ parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
175
+ id: z.ZodNumber;
176
+ name: z.ZodOptional<z.ZodString>;
177
+ }, z.core.$strip>>>;
178
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
179
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
180
+ }, z.core.$strip>>;
181
+ totalFolderNumber: z.ZodNumber;
182
+ totalFileNumber: z.ZodNumber;
183
+ }, z.core.$strip>;
184
+ /**
185
+ * `media_move_assets` output — a per-id report rather than a single verdict.
186
+ *
187
+ * A bad id among good ones does not roll back the valid moves (see the handler), so the response
188
+ * has to say which ids moved and which did not: an agent that only learned "the call failed"
189
+ * would either retry moves that already happened or abandon ones that did. `moved` and `failed`
190
+ * together account for every id in the request, on every successful response — including one
191
+ * where `moved` is empty because no id resolved.
192
+ *
193
+ * `moved` carries the full asset in the same shape the read tools return, so the new folder can
194
+ * be confirmed without a follow-up `media_get_asset`.
195
+ */
196
+ export declare const mediaMoveAssetsFailureSchema: z.ZodObject<{
197
+ id: z.ZodNumber;
198
+ reason: z.ZodString;
199
+ }, z.core.$strip>;
200
+ export declare const mediaMoveAssetsOutputSchema: z.ZodObject<{
201
+ destinationFolder: z.ZodNullable<z.ZodObject<{
202
+ id: z.ZodNumber;
203
+ name: z.ZodOptional<z.ZodString>;
204
+ }, z.core.$strip>>;
205
+ moved: z.ZodArray<z.ZodObject<{
206
+ id: z.ZodNumber;
207
+ name: z.ZodString;
208
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
209
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
210
+ url: z.ZodString;
211
+ mime: z.ZodString;
212
+ size: z.ZodNumber;
213
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
214
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
215
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
216
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
217
+ id: z.ZodNumber;
218
+ name: z.ZodString;
219
+ }, z.core.$strip>>>;
220
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
221
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
222
+ }, z.core.$strip>>;
223
+ failed: z.ZodArray<z.ZodObject<{
224
+ id: z.ZodNumber;
225
+ reason: z.ZodString;
226
+ }, z.core.$strip>>;
227
+ }, z.core.$strip>;
228
+ /**
229
+ * `media_delete_assets` output — one contract for both branches, with a per-id account of every
230
+ * requested id.
231
+ *
232
+ * `dryRun` echoes which branch ran: on true `deleted` is what *would* be removed and nothing was
233
+ * touched; on false it is what actually was. Echoing it back means an agent can tell a preview
234
+ * from a completed deletion without tracking what it sent — the difference matters more here
235
+ * than anywhere else in this surface, because one branch is irreversible.
236
+ *
237
+ * `deleted` carries the full asset rather than a bare id, so the agent can report what it
238
+ * destroyed after the row is gone and no read can recover it. On a dry run it is the same shape,
239
+ * which is exactly what makes the preview a confirmation an agent can act on.
240
+ *
241
+ * Unlike `media_delete_folder`, an unresolvable id does NOT reject the call: deletions are performed
242
+ * per asset and reported per id, so a bad id among good ones neither rolls back the valid
243
+ * deletions nor stops them from happening. `deleted` and `failed` together account for every id
244
+ * in the request, on every successful response.
245
+ */
246
+ export declare const mediaDeleteAssetsFailureSchema: z.ZodObject<{
247
+ id: z.ZodNumber;
248
+ reason: z.ZodString;
249
+ }, z.core.$strip>;
250
+ export declare const mediaDeleteAssetsOutputSchema: z.ZodObject<{
251
+ dryRun: z.ZodBoolean;
252
+ deleted: z.ZodArray<z.ZodObject<{
253
+ id: z.ZodNumber;
254
+ name: z.ZodString;
255
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
256
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
257
+ url: z.ZodString;
258
+ mime: z.ZodString;
259
+ size: z.ZodNumber;
260
+ width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
261
+ height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
262
+ ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
263
+ folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
264
+ id: z.ZodNumber;
265
+ name: z.ZodString;
266
+ }, z.core.$strip>>>;
267
+ createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
268
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
269
+ }, z.core.$strip>>;
270
+ failed: z.ZodArray<z.ZodObject<{
271
+ id: z.ZodNumber;
272
+ reason: z.ZodString;
273
+ }, z.core.$strip>>;
274
+ totalFileNumber: z.ZodNumber;
275
+ }, z.core.$strip>;
276
+ //# sourceMappingURL=output-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/output-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;iBAqBjC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;iBAEpC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;iBAQtC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAM5D,CAAC;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;iBAEvC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;iBAelC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAExC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAExC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;iBAEtC,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;iBAexC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B;;;iBAKvC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBtC,CAAC;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,8BAA8B;;;iBAOzC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBxC,CAAC"}