@directus/api 32.1.1 → 33.0.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 (336) hide show
  1. package/dist/ai/chat/constants/system-prompt.d.ts +1 -0
  2. package/dist/ai/chat/constants/system-prompt.js +51 -0
  3. package/dist/ai/chat/controllers/chat.post.d.ts +2 -0
  4. package/dist/ai/chat/controllers/chat.post.js +47 -0
  5. package/dist/ai/chat/lib/create-ui-stream.d.ts +15 -0
  6. package/dist/ai/chat/lib/create-ui-stream.js +42 -0
  7. package/dist/ai/chat/middleware/load-settings.d.ts +2 -0
  8. package/dist/ai/chat/middleware/load-settings.js +18 -0
  9. package/dist/ai/chat/models/chat-request.d.ts +34 -0
  10. package/dist/ai/chat/models/chat-request.js +26 -0
  11. package/dist/ai/chat/models/providers.d.ts +9 -0
  12. package/dist/ai/chat/models/providers.js +9 -0
  13. package/dist/ai/chat/router.d.ts +1 -0
  14. package/dist/ai/chat/router.js +5 -0
  15. package/dist/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.d.ts +9 -0
  16. package/dist/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.js +38 -0
  17. package/dist/ai/chat/utils/fix-error-tool-calls.d.ts +12 -0
  18. package/dist/ai/chat/utils/fix-error-tool-calls.js +30 -0
  19. package/dist/ai/chat/utils/parse-json-schema-7.d.ts +13 -0
  20. package/dist/ai/chat/utils/parse-json-schema-7.js +75 -0
  21. package/dist/{mcp → ai/mcp}/server.d.ts +13 -16
  22. package/dist/{mcp → ai/mcp}/server.js +4 -13
  23. package/dist/ai/mcp/types.d.ts +15 -0
  24. package/dist/{mcp/tools/assets.js → ai/tools/assets/index.js} +8 -5
  25. package/dist/{mcp/tools/collections.js → ai/tools/collections/index.js} +7 -4
  26. package/dist/{mcp/tools/fields.js → ai/tools/fields/index.js} +12 -9
  27. package/dist/{mcp/tools/files.js → ai/tools/files/index.js} +11 -5
  28. package/dist/{mcp/tools/flows.js → ai/tools/flows/index.js} +11 -5
  29. package/dist/{mcp/tools/folders.js → ai/tools/folders/index.js} +12 -5
  30. package/dist/ai/tools/index.d.ts +15 -0
  31. package/dist/ai/tools/index.js +29 -0
  32. package/dist/{mcp/tools/items.js → ai/tools/items/index.js} +13 -6
  33. package/dist/{mcp/tools/prompts/items.md → ai/tools/items/prompt.md} +19 -15
  34. package/dist/{mcp/tools/operations.d.ts → ai/tools/operations/index.d.ts} +46 -0
  35. package/dist/{mcp/tools/operations.js → ai/tools/operations/index.js} +12 -5
  36. package/dist/{mcp/tools/relations.js → ai/tools/relations/index.js} +7 -4
  37. package/dist/{mcp/tools/schema.d.ts → ai/tools/schema/index.d.ts} +1 -1
  38. package/dist/{mcp/tools/schema.js → ai/tools/schema/index.js} +9 -6
  39. package/dist/{mcp/tools/system.js → ai/tools/system/index.js} +7 -4
  40. package/dist/{mcp/tools/trigger-flow.js → ai/tools/trigger-flow/index.js} +8 -5
  41. package/dist/{mcp → ai/tools}/types.d.ts +1 -17
  42. package/dist/ai/tools/utils.d.ts +9 -0
  43. package/dist/ai/tools/utils.js +17 -0
  44. package/dist/app.js +11 -6
  45. package/dist/auth/drivers/ldap.js +2 -2
  46. package/dist/auth/drivers/local.js +1 -1
  47. package/dist/auth/drivers/oauth2.d.ts +1 -2
  48. package/dist/auth/drivers/oauth2.js +22 -17
  49. package/dist/auth/drivers/openid.d.ts +1 -2
  50. package/dist/auth/drivers/openid.js +18 -13
  51. package/dist/auth/drivers/saml.js +6 -3
  52. package/dist/auth/utils/generate-callback-url.d.ts +11 -0
  53. package/dist/auth/utils/generate-callback-url.js +40 -0
  54. package/dist/auth/utils/is-login-redirect-allowed.d.ts +7 -0
  55. package/dist/{utils → auth/utils}/is-login-redirect-allowed.js +12 -9
  56. package/dist/cache.js +2 -2
  57. package/dist/cli/commands/bootstrap/index.js +2 -2
  58. package/dist/cli/commands/database/install.js +1 -1
  59. package/dist/cli/commands/database/migrate.js +1 -1
  60. package/dist/cli/commands/init/index.js +2 -2
  61. package/dist/cli/commands/roles/create.js +4 -4
  62. package/dist/cli/commands/schema/apply.js +3 -3
  63. package/dist/cli/commands/schema/snapshot.js +1 -1
  64. package/dist/cli/utils/create-db-connection.d.ts +1 -1
  65. package/dist/cli/utils/create-db-connection.js +1 -1
  66. package/dist/cli/utils/create-env/index.js +1 -1
  67. package/dist/constants.d.ts +7 -3
  68. package/dist/constants.js +7 -3
  69. package/dist/controllers/access.js +1 -1
  70. package/dist/controllers/assets.js +40 -3
  71. package/dist/controllers/extensions.js +1 -1
  72. package/dist/controllers/fields.js +2 -2
  73. package/dist/controllers/files.js +1 -1
  74. package/dist/controllers/items.js +1 -1
  75. package/dist/controllers/mcp.js +1 -1
  76. package/dist/controllers/not-found.js +1 -1
  77. package/dist/controllers/relations.js +1 -1
  78. package/dist/database/errors/dialects/mysql.d.ts +1 -1
  79. package/dist/database/errors/dialects/postgres.d.ts +1 -1
  80. package/dist/database/errors/dialects/sqlite.d.ts +1 -1
  81. package/dist/database/errors/translate.d.ts +1 -1
  82. package/dist/database/errors/translate.js +1 -1
  83. package/dist/database/helpers/date/dialects/mssql.js +1 -1
  84. package/dist/database/helpers/date/dialects/mysql.js +1 -1
  85. package/dist/database/helpers/date/types.js +1 -1
  86. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -0
  87. package/dist/database/helpers/schema/dialects/cockroachdb.js +24 -1
  88. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  89. package/dist/database/helpers/schema/dialects/mysql.d.ts +2 -1
  90. package/dist/database/helpers/schema/dialects/mysql.js +16 -3
  91. package/dist/database/helpers/schema/dialects/postgres.d.ts +1 -1
  92. package/dist/database/helpers/schema/types.d.ts +13 -0
  93. package/dist/database/helpers/schema/types.js +24 -0
  94. package/dist/database/index.js +4 -4
  95. package/dist/database/migrations/20220429A-add-flows.js +1 -1
  96. package/dist/database/migrations/20230526A-migrate-translation-strings.js +1 -1
  97. package/dist/database/migrations/20231009A-update-csv-fields-to-text.js +1 -1
  98. package/dist/database/migrations/20240204A-marketplace.js +9 -7
  99. package/dist/database/migrations/20240311A-deprecate-webhooks.d.ts +15 -0
  100. package/dist/database/migrations/20240311A-deprecate-webhooks.js +1 -1
  101. package/dist/database/migrations/20240806A-permissions-policies.js +3 -3
  102. package/dist/database/migrations/20240924A-migrate-legacy-comments.js +1 -1
  103. package/dist/database/migrations/20251014A-add-project-owner.js +1 -1
  104. package/dist/database/migrations/20251103A-add-ai-settings.d.ts +3 -0
  105. package/dist/database/migrations/20251103A-add-ai-settings.js +14 -0
  106. package/dist/database/migrations/20251224A-remove-webhooks.d.ts +3 -0
  107. package/dist/database/migrations/20251224A-remove-webhooks.js +19 -0
  108. package/dist/database/migrations/20260113A-add-revisions-index.d.ts +3 -0
  109. package/dist/database/migrations/20260113A-add-revisions-index.js +41 -0
  110. package/dist/database/migrations/run.js +3 -3
  111. package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.d.ts +2 -2
  112. package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.js +1 -1
  113. package/dist/database/run-ast/lib/apply-query/filter/operator.js +1 -1
  114. package/dist/database/run-ast/lib/apply-query/sort.js +1 -1
  115. package/dist/database/run-ast/run-ast.js +1 -1
  116. package/dist/database/run-ast/utils/get-column-pre-processor.js +2 -2
  117. package/dist/database/run-ast/utils/get-column.js +1 -1
  118. package/dist/database/seeds/run.js +3 -3
  119. package/dist/extensions/lib/get-extensions-path.js +1 -1
  120. package/dist/extensions/lib/get-extensions-settings.js +1 -1
  121. package/dist/extensions/lib/get-extensions.js +1 -1
  122. package/dist/extensions/lib/get-shared-deps-mapping.js +3 -3
  123. package/dist/extensions/lib/installation/manager.js +8 -12
  124. package/dist/extensions/lib/sandbox/register/route.d.ts +1 -1
  125. package/dist/extensions/lib/sync/status.d.ts +11 -0
  126. package/dist/extensions/lib/sync/status.js +34 -0
  127. package/dist/extensions/lib/sync/sync.d.ts +6 -0
  128. package/dist/extensions/lib/sync/sync.js +90 -0
  129. package/dist/extensions/lib/sync/tracker.d.ts +18 -0
  130. package/dist/extensions/lib/sync/tracker.js +71 -0
  131. package/dist/extensions/lib/sync/utils.d.ts +24 -0
  132. package/dist/extensions/lib/sync/utils.js +62 -0
  133. package/dist/extensions/manager.d.ts +9 -5
  134. package/dist/extensions/manager.js +36 -19
  135. package/dist/flows.d.ts +1 -1
  136. package/dist/logger/index.js +1 -1
  137. package/dist/logger/logs-stream.d.ts +1 -1
  138. package/dist/logger/logs-stream.js +1 -1
  139. package/dist/mailer.js +1 -1
  140. package/dist/metrics/lib/create-metrics.js +2 -2
  141. package/dist/middleware/authenticate.js +3 -3
  142. package/dist/middleware/collection-exists.js +1 -1
  143. package/dist/middleware/extract-token.js +1 -1
  144. package/dist/middleware/graphql.js +2 -2
  145. package/dist/middleware/respond.js +2 -2
  146. package/dist/middleware/validate-batch.js +1 -1
  147. package/dist/operations/exec/index.js +2 -1
  148. package/dist/operations/mail/index.js +1 -1
  149. package/dist/operations/mail/rate-limiter.js +2 -2
  150. package/dist/permissions/cache.js +5 -0
  151. package/dist/permissions/lib/fetch-policies.d.ts +1 -1
  152. package/dist/permissions/lib/fetch-roles-tree.d.ts +6 -3
  153. package/dist/permissions/lib/fetch-roles-tree.js +5 -27
  154. package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.js +1 -1
  155. package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.js +1 -1
  156. package/dist/permissions/modules/fetch-global-access/fetch-global-access.d.ts +9 -7
  157. package/dist/permissions/modules/fetch-global-access/fetch-global-access.js +17 -9
  158. package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js +2 -2
  159. package/dist/permissions/modules/fetch-policies-ip-access/fetch-policies-ip-access.d.ts +1 -1
  160. package/dist/permissions/modules/process-ast/lib/inject-cases.js +1 -1
  161. package/dist/permissions/modules/process-ast/process-ast.js +1 -1
  162. package/dist/permissions/modules/process-payload/process-payload.js +1 -1
  163. package/dist/permissions/modules/validate-access/lib/validate-item-access.d.ts +13 -1
  164. package/dist/permissions/modules/validate-access/lib/validate-item-access.js +54 -6
  165. package/dist/permissions/modules/validate-access/validate-access.js +3 -2
  166. package/dist/permissions/utils/fetch-raw-permissions.d.ts +1 -1
  167. package/dist/permissions/utils/fetch-share-info.d.ts +1 -1
  168. package/dist/permissions/utils/fetch-share-info.js +1 -1
  169. package/dist/permissions/utils/filter-policies-by-ip.js +1 -1
  170. package/dist/permissions/utils/get-permissions-for-share.js +8 -8
  171. package/dist/permissions/utils/with-cache.d.ts +8 -6
  172. package/dist/permissions/utils/with-cache.js +12 -10
  173. package/dist/rate-limiter.js +1 -1
  174. package/dist/request/is-denied-ip.js +2 -2
  175. package/dist/schedules/project.js +1 -1
  176. package/dist/schedules/telemetry.js +1 -1
  177. package/dist/schedules/tus.js +1 -1
  178. package/dist/server.js +4 -4
  179. package/dist/services/assets/name-deduper.d.ts +7 -0
  180. package/dist/services/assets/name-deduper.js +23 -0
  181. package/dist/services/assets.d.ts +17 -3
  182. package/dist/services/assets.js +133 -13
  183. package/dist/services/authentication.js +6 -6
  184. package/dist/services/collections.js +1 -1
  185. package/dist/services/comments.js +2 -2
  186. package/dist/services/extensions.d.ts +1 -1
  187. package/dist/services/extensions.js +4 -0
  188. package/dist/services/files/utils/get-metadata.d.ts +1 -1
  189. package/dist/services/files/utils/get-metadata.js +1 -1
  190. package/dist/services/files.d.ts +1 -1
  191. package/dist/services/files.js +4 -4
  192. package/dist/services/folders.d.ts +27 -2
  193. package/dist/services/folders.js +75 -0
  194. package/dist/services/graphql/index.d.ts +1 -1
  195. package/dist/services/graphql/index.js +1 -1
  196. package/dist/services/graphql/resolvers/mutation.js +1 -1
  197. package/dist/services/graphql/schema/get-types.d.ts +1 -1
  198. package/dist/services/graphql/schema/read.js +1 -1
  199. package/dist/services/graphql/subscription.d.ts +1 -1
  200. package/dist/services/graphql/types/date.js +1 -1
  201. package/dist/services/graphql/types/hash.js +1 -1
  202. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -1
  203. package/dist/services/import-export.d.ts +2 -2
  204. package/dist/services/import-export.js +6 -7
  205. package/dist/services/index.d.ts +0 -1
  206. package/dist/services/index.js +0 -1
  207. package/dist/services/mail/index.js +2 -2
  208. package/dist/services/mail/rate-limiter.js +2 -2
  209. package/dist/services/notifications.js +2 -2
  210. package/dist/services/payload.js +21 -1
  211. package/dist/services/roles.js +2 -2
  212. package/dist/services/schema.js +1 -1
  213. package/dist/services/server.js +12 -4
  214. package/dist/services/settings.js +2 -2
  215. package/dist/services/tfa.js +1 -1
  216. package/dist/services/translations.js +1 -1
  217. package/dist/services/tus/data-store.d.ts +1 -3
  218. package/dist/services/tus/data-store.js +2 -5
  219. package/dist/services/tus/server.js +9 -9
  220. package/dist/services/users.js +4 -4
  221. package/dist/services/versions.js +1 -1
  222. package/dist/telemetry/lib/send-report.d.ts +1 -1
  223. package/dist/telemetry/lib/send-report.js +1 -1
  224. package/dist/telemetry/lib/track.js +1 -1
  225. package/dist/telemetry/utils/get-settings.d.ts +15 -0
  226. package/dist/telemetry/utils/get-settings.js +13 -1
  227. package/dist/test-utils/README.md +95 -24
  228. package/dist/test-utils/cache.d.ts +2 -2
  229. package/dist/test-utils/cache.js +2 -2
  230. package/dist/test-utils/knex.js +1 -1
  231. package/dist/test-utils/{fields-service.d.ts → services/fields-service.d.ts} +1 -1
  232. package/dist/test-utils/{fields-service.js → services/fields-service.js} +3 -2
  233. package/dist/test-utils/services/files-service.d.ts +28 -0
  234. package/dist/test-utils/services/files-service.js +34 -0
  235. package/dist/test-utils/services/folders-service.d.ts +28 -0
  236. package/dist/test-utils/services/folders-service.js +33 -0
  237. package/dist/types/collection.d.ts +1 -1
  238. package/dist/utils/async-handler.d.ts +1 -1
  239. package/dist/utils/calculate-field-depth.js +1 -1
  240. package/dist/utils/compress.js +1 -1
  241. package/dist/utils/deep-map-response.js +2 -2
  242. package/dist/utils/encrypt.d.ts +2 -0
  243. package/dist/utils/encrypt.js +64 -0
  244. package/dist/utils/get-accountability-for-role.js +2 -2
  245. package/dist/utils/get-accountability-for-token.js +4 -4
  246. package/dist/utils/get-cache-key.js +3 -3
  247. package/dist/utils/get-field-system-rows.js +1 -1
  248. package/dist/utils/get-ip-from-req.d.ts +1 -1
  249. package/dist/utils/get-ip-from-req.js +1 -1
  250. package/dist/utils/get-local-type.js +7 -3
  251. package/dist/utils/get-service.js +1 -3
  252. package/dist/utils/get-snapshot-diff.js +1 -1
  253. package/dist/utils/is-url-allowed.js +1 -1
  254. package/dist/utils/jwt.js +1 -1
  255. package/dist/utils/require-text.d.ts +1 -0
  256. package/dist/utils/require-text.js +4 -0
  257. package/dist/utils/require-yaml.js +2 -2
  258. package/dist/utils/sanitize-schema.d.ts +1 -1
  259. package/dist/utils/should-clear-cache.d.ts +1 -1
  260. package/dist/utils/should-skip-cache.js +2 -2
  261. package/dist/utils/validate-diff.js +1 -1
  262. package/dist/utils/validate-snapshot.js +3 -3
  263. package/dist/utils/validate-storage.js +2 -2
  264. package/dist/utils/verify-session-jwt.js +1 -1
  265. package/dist/utils/versioning/deep-map-with-schema.js +2 -2
  266. package/dist/websocket/controllers/base.d.ts +2 -2
  267. package/dist/websocket/controllers/base.js +3 -3
  268. package/dist/websocket/controllers/graphql.d.ts +1 -1
  269. package/dist/websocket/controllers/graphql.js +1 -1
  270. package/dist/websocket/controllers/logs.d.ts +1 -1
  271. package/dist/websocket/controllers/rest.d.ts +1 -1
  272. package/dist/websocket/controllers/rest.js +2 -2
  273. package/dist/websocket/handlers/heartbeat.js +1 -1
  274. package/dist/websocket/handlers/items.js +2 -2
  275. package/dist/websocket/handlers/subscribe.js +1 -1
  276. package/dist/websocket/types.d.ts +1 -1
  277. package/dist/websocket/utils/wait-for-message.js +1 -1
  278. package/package.json +34 -28
  279. package/dist/controllers/webhooks.d.ts +0 -2
  280. package/dist/controllers/webhooks.js +0 -74
  281. package/dist/extensions/lib/sync-extensions.d.ts +0 -3
  282. package/dist/extensions/lib/sync-extensions.js +0 -70
  283. package/dist/extensions/lib/sync-status.d.ts +0 -10
  284. package/dist/extensions/lib/sync-status.js +0 -27
  285. package/dist/mcp/tools/index.d.ts +0 -15
  286. package/dist/mcp/tools/index.js +0 -29
  287. package/dist/mcp/tools/prompts/index.d.ts +0 -16
  288. package/dist/mcp/tools/prompts/index.js +0 -19
  289. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.d.ts +0 -5
  290. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.js +0 -7
  291. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.d.ts +0 -5
  292. package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.js +0 -10
  293. package/dist/permissions/modules/fetch-global-access/types.d.ts +0 -4
  294. package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.d.ts +0 -4
  295. package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.js +0 -27
  296. package/dist/services/webhooks.d.ts +0 -14
  297. package/dist/services/webhooks.js +0 -32
  298. package/dist/utils/get-date-formatted.d.ts +0 -1
  299. package/dist/utils/get-date-formatted.js +0 -10
  300. package/dist/utils/ip-in-networks.d.ts +0 -6
  301. package/dist/utils/ip-in-networks.js +0 -13
  302. package/dist/utils/is-login-redirect-allowed.d.ts +0 -4
  303. /package/dist/{mcp → ai/mcp}/index.d.ts +0 -0
  304. /package/dist/{mcp → ai/mcp}/index.js +0 -0
  305. /package/dist/{mcp → ai/mcp}/transport.d.ts +0 -0
  306. /package/dist/{mcp → ai/mcp}/transport.js +0 -0
  307. /package/dist/{mcp → ai/mcp}/types.js +0 -0
  308. /package/dist/{mcp/tools/assets.d.ts → ai/tools/assets/index.d.ts} +0 -0
  309. /package/dist/{mcp/tools/prompts/assets.md → ai/tools/assets/prompt.md} +0 -0
  310. /package/dist/{mcp/tools/collections.d.ts → ai/tools/collections/index.d.ts} +0 -0
  311. /package/dist/{mcp/tools/prompts/collections.md → ai/tools/collections/prompt.md} +0 -0
  312. /package/dist/{mcp/define.d.ts → ai/tools/define-tool.d.ts} +0 -0
  313. /package/dist/{mcp/define.js → ai/tools/define-tool.js} +0 -0
  314. /package/dist/{mcp/tools/fields.d.ts → ai/tools/fields/index.d.ts} +0 -0
  315. /package/dist/{mcp/tools/prompts/fields.md → ai/tools/fields/prompt.md} +0 -0
  316. /package/dist/{mcp/tools/files.d.ts → ai/tools/files/index.d.ts} +0 -0
  317. /package/dist/{mcp/tools/prompts/files.md → ai/tools/files/prompt.md} +0 -0
  318. /package/dist/{mcp/tools/flows.d.ts → ai/tools/flows/index.d.ts} +0 -0
  319. /package/dist/{mcp/tools/prompts/flows.md → ai/tools/flows/prompt.md} +0 -0
  320. /package/dist/{mcp/tools/folders.d.ts → ai/tools/folders/index.d.ts} +0 -0
  321. /package/dist/{mcp/tools/prompts/folders.md → ai/tools/folders/prompt.md} +0 -0
  322. /package/dist/{mcp/tools/items.d.ts → ai/tools/items/index.d.ts} +0 -0
  323. /package/dist/{mcp/tools/prompts/operations.md → ai/tools/operations/prompt.md} +0 -0
  324. /package/dist/{mcp/tools/relations.d.ts → ai/tools/relations/index.d.ts} +0 -0
  325. /package/dist/{mcp/tools/prompts/relations.md → ai/tools/relations/prompt.md} +0 -0
  326. /package/dist/{mcp/tools/prompts/schema.md → ai/tools/schema/prompt.md} +0 -0
  327. /package/dist/{mcp → ai/tools}/schema.d.ts +0 -0
  328. /package/dist/{mcp → ai/tools}/schema.js +0 -0
  329. /package/dist/{mcp/tools/system.d.ts → ai/tools/system/index.d.ts} +0 -0
  330. /package/dist/{mcp/tools/prompts/system-prompt-description.md → ai/tools/system/prompt-description.md} +0 -0
  331. /package/dist/{mcp/tools/prompts/system-prompt.md → ai/tools/system/prompt.md} +0 -0
  332. /package/dist/{mcp/tools/trigger-flow.d.ts → ai/tools/trigger-flow/index.d.ts} +0 -0
  333. /package/dist/{mcp/tools/prompts/trigger-flow.md → ai/tools/trigger-flow/prompt.md} +0 -0
  334. /package/dist/{permissions/modules/fetch-global-access → ai/tools}/types.js +0 -0
  335. /package/dist/test-utils/{items-service.d.ts → services/items-service.d.ts} +0 -0
  336. /package/dist/test-utils/{items-service.js → services/items-service.js} +0 -0
@@ -1,74 +0,0 @@
1
- import { ErrorCode, createError } from '@directus/errors';
2
- import express from 'express';
3
- import { respond } from '../middleware/respond.js';
4
- import useCollection from '../middleware/use-collection.js';
5
- import { validateBatch } from '../middleware/validate-batch.js';
6
- import { MetaService } from '../services/meta.js';
7
- import { WebhooksService } from '../services/webhooks.js';
8
- import asyncHandler from '../utils/async-handler.js';
9
- import { sanitizeQuery } from '../utils/sanitize-query.js';
10
- const router = express.Router();
11
- router.use(useCollection('directus_webhooks'));
12
- router.post('/', asyncHandler(async (_req, _res, _next) => {
13
- // Disallow creation of new Webhooks as part of the deprecation, see https://github.com/directus/directus/issues/15553
14
- throw new (createError(ErrorCode.MethodNotAllowed, 'Webhooks are deprecated, use Flows instead', 405))();
15
- }), respond);
16
- const readHandler = asyncHandler(async (req, res, next) => {
17
- const service = new WebhooksService({
18
- accountability: req.accountability,
19
- schema: req.schema,
20
- });
21
- const metaService = new MetaService({
22
- accountability: req.accountability,
23
- schema: req.schema,
24
- });
25
- const records = await service.readByQuery(req.sanitizedQuery);
26
- const meta = await metaService.getMetaForQuery(req.collection, req.sanitizedQuery);
27
- res.locals['payload'] = { data: records || null, meta };
28
- return next();
29
- });
30
- router.get('/', validateBatch('read'), readHandler, respond);
31
- router.search('/', validateBatch('read'), readHandler, respond);
32
- router.get('/:pk', asyncHandler(async (req, res, next) => {
33
- const service = new WebhooksService({
34
- accountability: req.accountability,
35
- schema: req.schema,
36
- });
37
- const record = await service.readOne(req.params['pk'], req.sanitizedQuery);
38
- res.locals['payload'] = { data: record || null };
39
- return next();
40
- }), respond);
41
- router.patch('/', validateBatch('update'), asyncHandler(async (_req, _res, _next) => {
42
- // Disallow patching of Webhooks as part of the deprecation, see https://github.com/directus/directus/issues/15553
43
- throw new (createError(ErrorCode.MethodNotAllowed, 'Webhooks are deprecated, use Flows instead', 405))();
44
- }), respond);
45
- router.patch('/:pk', asyncHandler(async (_req, _res, _next) => {
46
- // Disallow patching of Webhooks as part of the deprecation, see https://github.com/directus/directus/issues/15553
47
- throw new (createError(ErrorCode.MethodNotAllowed, 'Webhooks are deprecated, use Flows instead', 405))();
48
- }), respond);
49
- router.delete('/', asyncHandler(async (req, _res, next) => {
50
- const service = new WebhooksService({
51
- accountability: req.accountability,
52
- schema: req.schema,
53
- });
54
- if (Array.isArray(req.body)) {
55
- await service.deleteMany(req.body);
56
- }
57
- else if (req.body.keys) {
58
- await service.deleteMany(req.body.keys);
59
- }
60
- else {
61
- const sanitizedQuery = await sanitizeQuery(req.body.query, req.schema, req.accountability);
62
- await service.deleteByQuery(sanitizedQuery);
63
- }
64
- return next();
65
- }), respond);
66
- router.delete('/:pk', asyncHandler(async (req, _res, next) => {
67
- const service = new WebhooksService({
68
- accountability: req.accountability,
69
- schema: req.schema,
70
- });
71
- await service.deleteOne(req.params['pk']);
72
- return next();
73
- }), respond);
74
- export default router;
@@ -1,3 +0,0 @@
1
- export declare const syncExtensions: (options?: {
2
- force: boolean;
3
- }) => Promise<void>;
@@ -1,70 +0,0 @@
1
- import { useEnv } from '@directus/env';
2
- import { exists } from 'fs-extra';
3
- import mid from 'node-machine-id';
4
- import { createWriteStream } from 'node:fs';
5
- import { mkdir, rm } from 'node:fs/promises';
6
- import { dirname, join, relative, resolve, sep } from 'node:path';
7
- import { pipeline } from 'node:stream/promises';
8
- import Queue from 'p-queue';
9
- import { useBus } from '../../bus/index.js';
10
- import { useLock } from '../../lock/index.js';
11
- import { useLogger } from '../../logger/index.js';
12
- import { getStorage } from '../../storage/index.js';
13
- import { getExtensionsPath } from './get-extensions-path.js';
14
- import { SyncStatus, getSyncStatus, setSyncStatus } from './sync-status.js';
15
- export const syncExtensions = async (options) => {
16
- const lock = useLock();
17
- const messenger = useBus();
18
- const env = useEnv();
19
- const logger = useLogger();
20
- if (!options?.force) {
21
- const isDone = (await getSyncStatus()) === SyncStatus.DONE;
22
- if (isDone)
23
- return;
24
- }
25
- const machineId = await mid.machineId();
26
- const machineKey = `extensions-sync/${machineId}`;
27
- const processId = await lock.increment(machineKey);
28
- const currentProcessShouldHandleSync = processId === 1;
29
- if (currentProcessShouldHandleSync === false) {
30
- logger.trace('Extensions already being synced to this machine from another process.');
31
- // Wait until the process that called the lock publishes a message that the syncing is complete
32
- return new Promise((resolve) => {
33
- messenger.subscribe(machineKey, () => resolve());
34
- });
35
- }
36
- try {
37
- const extensionsPath = getExtensionsPath();
38
- const storageExtensionsPath = env['EXTENSIONS_PATH'];
39
- if (await exists(extensionsPath)) {
40
- // In case the FS still contains the cached extensions from a previous invocation. We have to
41
- // clear them out to ensure the remote extensions folder remains the source of truth for all
42
- // extensions that are loaded.
43
- await rm(extensionsPath, { recursive: true, force: true });
44
- }
45
- // Ensure that the local extensions cache path exists
46
- await mkdir(extensionsPath, { recursive: true });
47
- await setSyncStatus(SyncStatus.SYNCING);
48
- logger.trace('Syncing extensions from configured storage location...');
49
- const storage = await getStorage();
50
- const disk = storage.location(env['EXTENSIONS_LOCATION']);
51
- // Make sure we don't overload the file handles
52
- const queue = new Queue({ concurrency: 1000 });
53
- for await (const filepath of disk.list(storageExtensionsPath)) {
54
- const readStream = await disk.read(filepath);
55
- // We want files to be stored in the root of `$TEMP_PATH/extensions`, so gotta remove the
56
- // extensions path on disk from the start of the file path
57
- const destPath = join(extensionsPath, relative(resolve(sep, storageExtensionsPath), resolve(sep, filepath)));
58
- // Ensure that the directory path exists
59
- await mkdir(dirname(destPath), { recursive: true });
60
- const writeStream = createWriteStream(destPath);
61
- queue.add(() => pipeline(readStream, writeStream));
62
- }
63
- await queue.onIdle();
64
- await setSyncStatus(SyncStatus.DONE);
65
- messenger.publish(machineKey, { ready: true });
66
- }
67
- finally {
68
- await lock.delete(machineKey);
69
- }
70
- };
@@ -1,10 +0,0 @@
1
- export declare enum SyncStatus {
2
- UNKNOWN = "UNKNOWN",
3
- SYNCING = "SYNCING",
4
- DONE = "DONE"
5
- }
6
- /**
7
- * Retrieves the sync status from the `.status` file in the local extensions folder
8
- */
9
- export declare const getSyncStatus: () => Promise<string>;
10
- export declare const setSyncStatus: (status: SyncStatus) => Promise<void>;
@@ -1,27 +0,0 @@
1
- import { exists } from 'fs-extra';
2
- import { readFile, writeFile } from 'node:fs/promises';
3
- import { join } from 'node:path';
4
- import { getExtensionsPath } from './get-extensions-path.js';
5
- export var SyncStatus;
6
- (function (SyncStatus) {
7
- SyncStatus["UNKNOWN"] = "UNKNOWN";
8
- SyncStatus["SYNCING"] = "SYNCING";
9
- SyncStatus["DONE"] = "DONE";
10
- })(SyncStatus || (SyncStatus = {}));
11
- /**
12
- * Retrieves the sync status from the `.status` file in the local extensions folder
13
- */
14
- export const getSyncStatus = async () => {
15
- const statusFilePath = join(getExtensionsPath(), '.status');
16
- if (await exists(statusFilePath)) {
17
- const status = await readFile(statusFilePath, 'utf8');
18
- return status;
19
- }
20
- else {
21
- return SyncStatus.UNKNOWN;
22
- }
23
- };
24
- export const setSyncStatus = async (status) => {
25
- const statusFilePath = join(getExtensionsPath(), '.status');
26
- await writeFile(statusFilePath, status);
27
- };
@@ -1,15 +0,0 @@
1
- import type { ToolConfig } from '../types.js';
2
- import { collections } from './collections.js';
3
- import { fields } from './fields.js';
4
- import { files } from './files.js';
5
- import { flows } from './flows.js';
6
- import { items } from './items.js';
7
- import { operations } from './operations.js';
8
- import { relations } from './relations.js';
9
- import { schema } from './schema.js';
10
- import { system } from './system.js';
11
- import { triggerFlow } from './trigger-flow.js';
12
- export declare const ALL_TOOLS: ToolConfig<any>[];
13
- export declare const getAllMcpTools: () => ToolConfig<any>[];
14
- export declare const findMcpTool: (name: string) => ToolConfig<any> | undefined;
15
- export { collections, fields, files, flows, items, operations, relations, schema, system, triggerFlow };
@@ -1,29 +0,0 @@
1
- import { assets } from './assets.js';
2
- import { collections } from './collections.js';
3
- import { fields } from './fields.js';
4
- import { files } from './files.js';
5
- import { flows } from './flows.js';
6
- import { folders } from './folders.js';
7
- import { items } from './items.js';
8
- import { operations } from './operations.js';
9
- import { relations } from './relations.js';
10
- import { schema } from './schema.js';
11
- import { system } from './system.js';
12
- import { triggerFlow } from './trigger-flow.js';
13
- export const ALL_TOOLS = [
14
- system,
15
- items,
16
- files,
17
- folders,
18
- assets,
19
- flows,
20
- triggerFlow,
21
- operations,
22
- schema,
23
- collections,
24
- fields,
25
- relations,
26
- ];
27
- export const getAllMcpTools = () => ALL_TOOLS;
28
- export const findMcpTool = (name) => ALL_TOOLS.find((tool) => tool.name === name);
29
- export { collections, fields, files, flows, items, operations, relations, schema, system, triggerFlow };
@@ -1,16 +0,0 @@
1
- declare const _default: {
2
- assets: string;
3
- collections: string;
4
- fields: string;
5
- files: string;
6
- folders: string;
7
- flows: string;
8
- items: string;
9
- operations: string;
10
- relations: string;
11
- schema: string;
12
- systemPrompt: string;
13
- systemPromptDescription: string;
14
- triggerFlow: string;
15
- };
16
- export default _default;
@@ -1,19 +0,0 @@
1
- import fse from 'fs-extra';
2
- import { dirname, join } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- const __dirname = dirname(fileURLToPath(import.meta.url));
5
- export default {
6
- assets: fse.readFileSync(join(__dirname, 'assets.md'), 'utf8'),
7
- collections: fse.readFileSync(join(__dirname, 'collections.md'), 'utf8'),
8
- fields: fse.readFileSync(join(__dirname, 'fields.md'), 'utf8'),
9
- files: fse.readFileSync(join(__dirname, 'files.md'), 'utf8'),
10
- folders: fse.readFileSync(join(__dirname, 'folders.md'), 'utf8'),
11
- flows: fse.readFileSync(join(__dirname, 'flows.md'), 'utf8'),
12
- items: fse.readFileSync(join(__dirname, 'items.md'), 'utf8'),
13
- operations: fse.readFileSync(join(__dirname, 'operations.md'), 'utf8'),
14
- relations: fse.readFileSync(join(__dirname, 'relations.md'), 'utf8'),
15
- schema: fse.readFileSync(join(__dirname, 'schema.md'), 'utf8'),
16
- systemPrompt: fse.readFileSync(join(__dirname, 'system-prompt.md'), 'utf8'),
17
- systemPromptDescription: fse.readFileSync(join(__dirname, 'system-prompt-description.md'), 'utf8'),
18
- triggerFlow: fse.readFileSync(join(__dirname, 'trigger-flow.md'), 'utf8'),
19
- };
@@ -1,5 +0,0 @@
1
- import type { Accountability } from '@directus/types';
2
- import type { Knex } from 'knex';
3
- import type { GlobalAccess } from '../types.js';
4
- export declare const fetchGlobalAccessForRoles: typeof _fetchGlobalAccessForRoles;
5
- export declare function _fetchGlobalAccessForRoles(accountability: Pick<Accountability, 'roles' | 'ip'>, knex: Knex): Promise<GlobalAccess>;
@@ -1,7 +0,0 @@
1
- import { withCache } from '../../../utils/with-cache.js';
2
- import { fetchGlobalAccessForQuery } from '../utils/fetch-global-access-for-query.js';
3
- export const fetchGlobalAccessForRoles = withCache('global-access-role', _fetchGlobalAccessForRoles, ({ roles, ip }) => ({ roles, ip }));
4
- export async function _fetchGlobalAccessForRoles(accountability, knex) {
5
- const query = knex.where('role', 'in', accountability.roles);
6
- return await fetchGlobalAccessForQuery(query, accountability);
7
- }
@@ -1,5 +0,0 @@
1
- import type { Accountability } from '@directus/types';
2
- import type { Knex } from 'knex';
3
- import type { GlobalAccess } from '../types.js';
4
- export declare const fetchGlobalAccessForUser: typeof _fetchGlobalAccessForUser;
5
- export declare function _fetchGlobalAccessForUser(accountability: Pick<Accountability, 'user' | 'ip'>, knex: Knex): Promise<GlobalAccess>;
@@ -1,10 +0,0 @@
1
- import { withCache } from '../../../utils/with-cache.js';
2
- import { fetchGlobalAccessForQuery } from '../utils/fetch-global-access-for-query.js';
3
- export const fetchGlobalAccessForUser = withCache('global-access-user', _fetchGlobalAccessForUser, ({ user, ip }) => ({
4
- user,
5
- ip,
6
- }));
7
- export async function _fetchGlobalAccessForUser(accountability, knex) {
8
- const query = knex.where('user', '=', accountability.user);
9
- return await fetchGlobalAccessForQuery(query, accountability);
10
- }
@@ -1,4 +0,0 @@
1
- export interface GlobalAccess {
2
- app: boolean;
3
- admin: boolean;
4
- }
@@ -1,4 +0,0 @@
1
- import type { Accountability } from '@directus/types';
2
- import type { Knex } from 'knex';
3
- import type { GlobalAccess } from '../types.js';
4
- export declare function fetchGlobalAccessForQuery(query: Knex.QueryBuilder<any, any[]>, accountability: Pick<Accountability, 'ip'>): Promise<GlobalAccess>;
@@ -1,27 +0,0 @@
1
- import { toBoolean, toArray } from '@directus/utils';
2
- import { ipInNetworks } from '../../../../utils/ip-in-networks.js';
3
- export async function fetchGlobalAccessForQuery(query, accountability) {
4
- const globalAccess = {
5
- app: false,
6
- admin: false,
7
- };
8
- const accessRows = await query
9
- .select('directus_policies.admin_access', 'directus_policies.app_access', 'directus_policies.ip_access')
10
- .from('directus_access')
11
- // @NOTE: `where` clause comes from the caller
12
- .leftJoin('directus_policies', 'directus_policies.id', 'directus_access.policy');
13
- // Additively merge access permissions
14
- for (const { admin_access, app_access, ip_access } of accessRows) {
15
- if (accountability.ip && ip_access) {
16
- // Skip row if IP is not in the allowed networks
17
- const networks = toArray(ip_access);
18
- if (!ipInNetworks(accountability.ip, networks))
19
- continue;
20
- }
21
- globalAccess.admin ||= toBoolean(admin_access);
22
- globalAccess.app ||= globalAccess.admin || toBoolean(app_access);
23
- if (globalAccess.admin)
24
- break;
25
- }
26
- return globalAccess;
27
- }
@@ -1,14 +0,0 @@
1
- import { type DirectusError } from '@directus/errors';
2
- import type { Bus } from '@directus/memory';
3
- import type { AbstractServiceOptions, MutationOptions, PrimaryKey, Webhook } from '@directus/types';
4
- import { ItemsService } from './items.js';
5
- export declare class WebhooksService extends ItemsService<Webhook> {
6
- messenger: Bus;
7
- errorDeprecation: DirectusError;
8
- constructor(options: AbstractServiceOptions);
9
- createOne(): Promise<PrimaryKey>;
10
- createMany(): Promise<PrimaryKey[]>;
11
- updateBatch(): Promise<PrimaryKey[]>;
12
- updateMany(): Promise<PrimaryKey[]>;
13
- deleteMany(keys: PrimaryKey[], opts?: MutationOptions): Promise<PrimaryKey[]>;
14
- }
@@ -1,32 +0,0 @@
1
- import { ErrorCode, createError } from '@directus/errors';
2
- import { useBus } from '../bus/index.js';
3
- import { useLogger } from '../logger/index.js';
4
- import { ItemsService } from './items.js';
5
- const logger = useLogger();
6
- export class WebhooksService extends ItemsService {
7
- messenger;
8
- errorDeprecation;
9
- constructor(options) {
10
- super('directus_webhooks', options);
11
- this.messenger = useBus();
12
- this.errorDeprecation = new (createError(ErrorCode.MethodNotAllowed, 'Webhooks are deprecated, use Flows instead', 405))();
13
- logger.warn('Webhooks are deprecated and the WebhooksService will be removed in an upcoming release. Creating/Updating Webhooks is disabled, use Flows instead');
14
- }
15
- async createOne() {
16
- throw this.errorDeprecation;
17
- }
18
- async createMany() {
19
- throw this.errorDeprecation;
20
- }
21
- async updateBatch() {
22
- throw this.errorDeprecation;
23
- }
24
- async updateMany() {
25
- throw this.errorDeprecation;
26
- }
27
- async deleteMany(keys, opts) {
28
- const result = await super.deleteMany(keys, opts);
29
- this.messenger.publish('webhooks', { type: 'reload' });
30
- return result;
31
- }
32
- }
@@ -1 +0,0 @@
1
- export declare function getDateFormatted(): string;
@@ -1,10 +0,0 @@
1
- export function getDateFormatted() {
2
- const date = new Date();
3
- let month = String(date.getMonth() + 1);
4
- if (month.length === 1)
5
- month = '0' + month;
6
- let day = String(date.getDate());
7
- if (day.length === 1)
8
- day = '0' + day;
9
- return `${date.getFullYear()}${month}${day}-${date.getHours()}${date.getMinutes()}${date.getSeconds()}`;
10
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Checks if an IP address is contained in a list of networks
3
- * @param networks List of IP addresses (192.168.0.1), CIDR notations (192.168.0.0/24) or IP ranges (192-168.0.0-192.168.2.0)
4
- * @throws Will throw if list contains invalid network definitions
5
- */
6
- export declare function ipInNetworks(ip: string, networks: string[]): boolean;
@@ -1,13 +0,0 @@
1
- import { matches } from 'ip-matching';
2
- /**
3
- * Checks if an IP address is contained in a list of networks
4
- * @param networks List of IP addresses (192.168.0.1), CIDR notations (192.168.0.0/24) or IP ranges (192-168.0.0-192.168.2.0)
5
- * @throws Will throw if list contains invalid network definitions
6
- */
7
- export function ipInNetworks(ip, networks) {
8
- for (const allowedIp of networks) {
9
- if (matches(ip, allowedIp))
10
- return true;
11
- }
12
- return false;
13
- }
@@ -1,4 +0,0 @@
1
- /**
2
- * Checks if the defined redirect after successful SSO login is in the allow list
3
- */
4
- export declare function isLoginRedirectAllowed(redirect: unknown, provider: string): boolean;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes