@directus/api 32.2.0 → 33.1.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 (297) hide show
  1. package/dist/ai/chat/controllers/chat.post.js +19 -4
  2. package/dist/ai/chat/lib/create-ui-stream.d.ts +8 -7
  3. package/dist/ai/chat/lib/create-ui-stream.js +28 -25
  4. package/dist/ai/chat/middleware/load-settings.js +31 -7
  5. package/dist/ai/chat/models/chat-request.d.ts +135 -2
  6. package/dist/ai/chat/models/chat-request.js +56 -2
  7. package/dist/ai/chat/models/providers.d.ts +16 -2
  8. package/dist/ai/chat/models/providers.js +16 -2
  9. package/dist/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.js +3 -4
  10. package/dist/ai/chat/utils/format-context.d.ts +5 -0
  11. package/dist/ai/chat/utils/format-context.js +122 -0
  12. package/dist/ai/mcp/server.d.ts +27 -1
  13. package/dist/ai/providers/index.d.ts +3 -0
  14. package/dist/ai/providers/index.js +3 -0
  15. package/dist/ai/providers/options.d.ts +14 -0
  16. package/dist/ai/providers/options.js +26 -0
  17. package/dist/ai/providers/registry.d.ts +6 -0
  18. package/dist/ai/providers/registry.js +65 -0
  19. package/dist/ai/providers/types.d.ts +34 -0
  20. package/dist/ai/providers/types.js +1 -0
  21. package/dist/ai/tools/assets/index.js +1 -1
  22. package/dist/ai/tools/collections/index.js +2 -2
  23. package/dist/ai/tools/fields/index.js +2 -2
  24. package/dist/ai/tools/files/index.js +1 -1
  25. package/dist/ai/tools/flows/index.js +1 -1
  26. package/dist/ai/tools/folders/index.js +1 -1
  27. package/dist/ai/tools/items/index.js +6 -3
  28. package/dist/ai/tools/items/prompt.md +7 -9
  29. package/dist/ai/tools/relations/index.js +1 -1
  30. package/dist/ai/tools/schema.js +1 -1
  31. package/dist/ai/tools/trigger-flow/index.js +1 -1
  32. package/dist/app.js +12 -8
  33. package/dist/auth/drivers/ldap.d.ts +1 -1
  34. package/dist/auth/drivers/ldap.js +144 -139
  35. package/dist/auth/drivers/local.js +1 -1
  36. package/dist/auth/drivers/oauth2.d.ts +1 -2
  37. package/dist/auth/drivers/oauth2.js +22 -17
  38. package/dist/auth/drivers/openid.d.ts +1 -2
  39. package/dist/auth/drivers/openid.js +18 -13
  40. package/dist/auth/drivers/saml.js +3 -3
  41. package/dist/auth/utils/generate-callback-url.d.ts +11 -0
  42. package/dist/auth/utils/generate-callback-url.js +40 -0
  43. package/dist/auth/utils/is-login-redirect-allowed.d.ts +7 -0
  44. package/dist/{utils → auth/utils}/is-login-redirect-allowed.js +12 -9
  45. package/dist/cache.d.ts +12 -0
  46. package/dist/cache.js +27 -3
  47. package/dist/cli/commands/bootstrap/index.js +2 -2
  48. package/dist/cli/commands/database/install.js +1 -1
  49. package/dist/cli/commands/database/migrate.js +1 -1
  50. package/dist/cli/commands/init/index.js +2 -2
  51. package/dist/cli/commands/roles/create.js +4 -4
  52. package/dist/cli/commands/schema/apply.js +3 -3
  53. package/dist/cli/commands/schema/snapshot.js +1 -1
  54. package/dist/cli/utils/create-db-connection.d.ts +1 -1
  55. package/dist/cli/utils/create-db-connection.js +1 -1
  56. package/dist/cli/utils/create-env/env-stub.liquid +3 -0
  57. package/dist/cli/utils/create-env/index.js +1 -1
  58. package/dist/constants.d.ts +7 -3
  59. package/dist/constants.js +7 -3
  60. package/dist/controllers/access.js +1 -1
  61. package/dist/controllers/assets.js +1 -1
  62. package/dist/controllers/deployment.js +481 -0
  63. package/dist/controllers/extensions.js +1 -1
  64. package/dist/controllers/fields.js +8 -6
  65. package/dist/controllers/files.js +1 -1
  66. package/dist/controllers/items.js +1 -1
  67. package/dist/controllers/not-found.js +1 -1
  68. package/dist/controllers/relations.js +1 -1
  69. package/dist/database/errors/dialects/mysql.d.ts +1 -1
  70. package/dist/database/errors/dialects/postgres.d.ts +1 -1
  71. package/dist/database/errors/dialects/sqlite.d.ts +1 -1
  72. package/dist/database/errors/translate.d.ts +1 -1
  73. package/dist/database/errors/translate.js +1 -1
  74. package/dist/database/get-ast-from-query/lib/parse-fields.js +2 -2
  75. package/dist/database/helpers/date/dialects/mssql.js +1 -1
  76. package/dist/database/helpers/date/dialects/mysql.js +1 -1
  77. package/dist/database/helpers/date/types.js +1 -1
  78. package/dist/database/helpers/schema/dialects/cockroachdb.d.ts +1 -0
  79. package/dist/database/helpers/schema/dialects/cockroachdb.js +24 -1
  80. package/dist/database/helpers/schema/dialects/mssql.d.ts +1 -1
  81. package/dist/database/helpers/schema/dialects/mysql.d.ts +2 -1
  82. package/dist/database/helpers/schema/dialects/mysql.js +16 -3
  83. package/dist/database/helpers/schema/dialects/postgres.d.ts +1 -1
  84. package/dist/database/helpers/schema/types.d.ts +13 -0
  85. package/dist/database/helpers/schema/types.js +24 -0
  86. package/dist/database/index.js +4 -4
  87. package/dist/database/migrations/20220429A-add-flows.js +1 -1
  88. package/dist/database/migrations/20230526A-migrate-translation-strings.js +1 -1
  89. package/dist/database/migrations/20231009A-update-csv-fields-to-text.js +1 -1
  90. package/dist/database/migrations/20240204A-marketplace.js +9 -7
  91. package/dist/database/migrations/20240311A-deprecate-webhooks.d.ts +15 -0
  92. package/dist/database/migrations/20240311A-deprecate-webhooks.js +1 -1
  93. package/dist/database/migrations/20240806A-permissions-policies.js +2 -2
  94. package/dist/database/migrations/20240924A-migrate-legacy-comments.js +1 -1
  95. package/dist/database/migrations/20251014A-add-project-owner.js +1 -1
  96. package/dist/database/migrations/20251224A-remove-webhooks.d.ts +3 -0
  97. package/dist/database/migrations/20251224A-remove-webhooks.js +19 -0
  98. package/dist/database/migrations/20260110A-add-ai-provider-settings.d.ts +3 -0
  99. package/dist/database/migrations/20260110A-add-ai-provider-settings.js +35 -0
  100. package/dist/database/migrations/20260113A-add-revisions-index.d.ts +3 -0
  101. package/dist/database/migrations/20260113A-add-revisions-index.js +41 -0
  102. package/dist/database/migrations/20260128A-add-collaborative-editing.d.ts +3 -0
  103. package/dist/database/migrations/20260128A-add-collaborative-editing.js +10 -0
  104. package/dist/database/migrations/20260204A-add-deployment.d.ts +3 -0
  105. package/dist/database/migrations/20260204A-add-deployment.js +32 -0
  106. package/dist/database/migrations/run.js +3 -3
  107. package/dist/database/run-ast/lib/apply-query/add-join.js +1 -1
  108. package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.d.ts +2 -2
  109. package/dist/database/run-ast/lib/apply-query/filter/get-filter-type.js +1 -1
  110. package/dist/database/run-ast/lib/apply-query/filter/index.js +1 -1
  111. package/dist/database/run-ast/lib/apply-query/filter/operator.js +1 -1
  112. package/dist/database/run-ast/lib/apply-query/sort.js +1 -1
  113. package/dist/database/run-ast/utils/get-column-pre-processor.js +2 -2
  114. package/dist/database/run-ast/utils/get-column.js +1 -1
  115. package/dist/database/seeds/run.js +3 -3
  116. package/dist/deployment/deployment.d.ts +94 -0
  117. package/dist/deployment/deployment.js +29 -0
  118. package/dist/deployment/drivers/index.d.ts +1 -0
  119. package/dist/deployment/drivers/index.js +1 -0
  120. package/dist/deployment/drivers/vercel.d.ts +32 -0
  121. package/dist/deployment/drivers/vercel.js +208 -0
  122. package/dist/deployment/index.d.ts +2 -0
  123. package/dist/deployment/index.js +2 -0
  124. package/dist/deployment.d.ts +24 -0
  125. package/dist/deployment.js +39 -0
  126. package/dist/extensions/lib/get-extensions-path.js +1 -1
  127. package/dist/extensions/lib/get-extensions-settings.js +1 -1
  128. package/dist/extensions/lib/get-extensions.js +1 -1
  129. package/dist/extensions/lib/get-shared-deps-mapping.js +3 -3
  130. package/dist/extensions/lib/installation/manager.js +3 -3
  131. package/dist/extensions/lib/sandbox/register/route.d.ts +1 -1
  132. package/dist/extensions/lib/sync/status.js +1 -1
  133. package/dist/extensions/lib/sync/sync.js +7 -7
  134. package/dist/extensions/lib/sync/utils.js +2 -2
  135. package/dist/extensions/manager.d.ts +1 -1
  136. package/dist/extensions/manager.js +8 -8
  137. package/dist/flows.d.ts +1 -1
  138. package/dist/logger/index.js +1 -1
  139. package/dist/logger/logs-stream.d.ts +1 -1
  140. package/dist/logger/logs-stream.js +1 -1
  141. package/dist/mailer.js +1 -1
  142. package/dist/metrics/lib/create-metrics.js +2 -2
  143. package/dist/middleware/authenticate.js +3 -3
  144. package/dist/middleware/collection-exists.js +1 -1
  145. package/dist/middleware/extract-token.js +1 -1
  146. package/dist/middleware/graphql.js +2 -2
  147. package/dist/middleware/respond.js +27 -14
  148. package/dist/middleware/validate-batch.js +1 -1
  149. package/dist/operations/exec/index.js +2 -1
  150. package/dist/operations/mail/index.js +1 -1
  151. package/dist/operations/mail/rate-limiter.js +2 -2
  152. package/dist/permissions/cache.js +5 -0
  153. package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.js +1 -1
  154. package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.js +1 -1
  155. package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js +2 -2
  156. package/dist/permissions/modules/process-ast/lib/inject-cases.js +1 -1
  157. package/dist/permissions/modules/process-ast/process-ast.js +1 -1
  158. package/dist/permissions/modules/process-ast/utils/find-related-collection.js +1 -1
  159. package/dist/permissions/modules/process-payload/process-payload.js +1 -1
  160. package/dist/permissions/modules/validate-access/lib/validate-item-access.d.ts +14 -2
  161. package/dist/permissions/modules/validate-access/lib/validate-item-access.js +72 -13
  162. package/dist/permissions/modules/validate-access/validate-access.js +3 -2
  163. package/dist/rate-limiter.js +1 -1
  164. package/dist/request/is-denied-ip.js +1 -1
  165. package/dist/schedules/project.js +1 -1
  166. package/dist/schedules/telemetry.js +1 -1
  167. package/dist/schedules/tus.js +1 -1
  168. package/dist/server.js +6 -5
  169. package/dist/services/assets.d.ts +2 -1
  170. package/dist/services/assets.js +35 -8
  171. package/dist/services/authentication.js +2 -2
  172. package/dist/services/collections.js +1 -1
  173. package/dist/services/deployment-projects.d.ts +20 -0
  174. package/dist/services/deployment-projects.js +34 -0
  175. package/dist/services/deployment-runs.d.ts +13 -0
  176. package/dist/services/deployment-runs.js +6 -0
  177. package/dist/services/deployment.d.ts +40 -0
  178. package/dist/services/deployment.js +202 -0
  179. package/dist/services/extensions.d.ts +1 -1
  180. package/dist/services/files/utils/get-metadata.d.ts +1 -1
  181. package/dist/services/files/utils/get-metadata.js +1 -1
  182. package/dist/services/files.d.ts +1 -1
  183. package/dist/services/files.js +4 -4
  184. package/dist/services/graphql/index.d.ts +1 -1
  185. package/dist/services/graphql/index.js +1 -1
  186. package/dist/services/graphql/resolvers/mutation.js +1 -1
  187. package/dist/services/graphql/resolvers/system-admin.js +2 -3
  188. package/dist/services/graphql/schema/get-types.d.ts +1 -1
  189. package/dist/services/graphql/schema/read.js +1 -1
  190. package/dist/services/graphql/subscription.d.ts +1 -1
  191. package/dist/services/graphql/types/date.js +1 -1
  192. package/dist/services/graphql/types/hash.js +1 -1
  193. package/dist/services/graphql/utils/add-path-to-validation-error.js +1 -1
  194. package/dist/services/graphql/utils/filter-replace-m2a.js +3 -4
  195. package/dist/services/import-export.d.ts +1 -1
  196. package/dist/services/import-export.js +2 -2
  197. package/dist/services/index.d.ts +3 -1
  198. package/dist/services/index.js +3 -1
  199. package/dist/services/mail/index.js +2 -2
  200. package/dist/services/mail/rate-limiter.js +2 -2
  201. package/dist/services/payload.js +2 -2
  202. package/dist/services/schema.js +1 -1
  203. package/dist/services/server.js +13 -4
  204. package/dist/services/settings.js +2 -2
  205. package/dist/services/specifications.js +2 -2
  206. package/dist/services/tfa.js +1 -1
  207. package/dist/services/translations.js +1 -1
  208. package/dist/services/tus/data-store.d.ts +1 -3
  209. package/dist/services/tus/data-store.js +2 -5
  210. package/dist/services/tus/server.js +6 -6
  211. package/dist/services/users.js +4 -4
  212. package/dist/services/versions.js +1 -1
  213. package/dist/telemetry/lib/get-report.js +2 -0
  214. package/dist/telemetry/lib/send-report.d.ts +1 -1
  215. package/dist/telemetry/lib/send-report.js +1 -1
  216. package/dist/telemetry/lib/track.js +1 -1
  217. package/dist/telemetry/types/report.d.ts +8 -0
  218. package/dist/telemetry/utils/get-settings.d.ts +2 -0
  219. package/dist/telemetry/utils/get-settings.js +5 -0
  220. package/dist/test-utils/knex.js +1 -1
  221. package/dist/types/collection.d.ts +1 -1
  222. package/dist/utils/async-handler.d.ts +1 -1
  223. package/dist/utils/calculate-field-depth.js +1 -1
  224. package/dist/utils/compress.js +1 -1
  225. package/dist/utils/deep-map-response.d.ts +1 -1
  226. package/dist/utils/deep-map-response.js +2 -2
  227. package/dist/utils/get-cache-key.js +1 -1
  228. package/dist/utils/get-column-path.js +1 -1
  229. package/dist/utils/get-field-system-rows.js +1 -1
  230. package/dist/utils/get-ip-from-req.d.ts +1 -1
  231. package/dist/utils/get-ip-from-req.js +1 -1
  232. package/dist/utils/get-local-type.js +7 -3
  233. package/dist/utils/get-service.js +7 -3
  234. package/dist/utils/get-snapshot-diff.js +1 -1
  235. package/dist/utils/is-field-allowed.d.ts +4 -0
  236. package/dist/utils/is-field-allowed.js +9 -0
  237. package/dist/utils/is-url-allowed.js +1 -1
  238. package/dist/utils/jwt.js +1 -1
  239. package/dist/utils/sanitize-schema.d.ts +1 -1
  240. package/dist/utils/should-clear-cache.d.ts +1 -1
  241. package/dist/utils/should-skip-cache.js +2 -2
  242. package/dist/utils/validate-diff.js +1 -1
  243. package/dist/utils/validate-snapshot.js +3 -3
  244. package/dist/utils/validate-storage.js +2 -2
  245. package/dist/utils/verify-session-jwt.js +1 -1
  246. package/dist/utils/versioning/handle-version.js +1 -1
  247. package/dist/websocket/collab/calculate-cache-metadata.d.ts +9 -0
  248. package/dist/websocket/collab/calculate-cache-metadata.js +121 -0
  249. package/dist/websocket/collab/collab.d.ts +63 -0
  250. package/dist/websocket/collab/collab.js +481 -0
  251. package/dist/websocket/collab/constants.d.ts +1 -0
  252. package/dist/websocket/collab/constants.js +13 -0
  253. package/dist/websocket/collab/filter-to-fields.d.ts +2 -0
  254. package/dist/websocket/collab/filter-to-fields.js +11 -0
  255. package/dist/websocket/collab/messenger.d.ts +43 -0
  256. package/dist/websocket/collab/messenger.js +225 -0
  257. package/dist/websocket/collab/payload-permissions.d.ts +18 -0
  258. package/dist/websocket/collab/payload-permissions.js +158 -0
  259. package/dist/websocket/collab/permissions-cache.d.ts +52 -0
  260. package/dist/websocket/collab/permissions-cache.js +204 -0
  261. package/dist/websocket/collab/room.d.ts +125 -0
  262. package/dist/websocket/collab/room.js +593 -0
  263. package/dist/websocket/collab/store.d.ts +7 -0
  264. package/dist/websocket/collab/store.js +33 -0
  265. package/dist/websocket/collab/types.d.ts +21 -0
  266. package/dist/websocket/collab/types.js +1 -0
  267. package/dist/websocket/collab/verify-permissions.d.ts +11 -0
  268. package/dist/websocket/collab/verify-permissions.js +100 -0
  269. package/dist/websocket/controllers/base.d.ts +2 -2
  270. package/dist/websocket/controllers/base.js +3 -3
  271. package/dist/websocket/controllers/graphql.d.ts +1 -1
  272. package/dist/websocket/controllers/graphql.js +1 -1
  273. package/dist/websocket/controllers/logs.d.ts +1 -1
  274. package/dist/websocket/controllers/rest.d.ts +1 -1
  275. package/dist/websocket/controllers/rest.js +2 -2
  276. package/dist/websocket/handlers/heartbeat.js +1 -1
  277. package/dist/websocket/handlers/index.d.ts +2 -0
  278. package/dist/websocket/handlers/index.js +9 -0
  279. package/dist/websocket/handlers/items.js +2 -2
  280. package/dist/websocket/handlers/subscribe.js +1 -1
  281. package/dist/websocket/types.d.ts +1 -1
  282. package/dist/websocket/utils/items.d.ts +2 -2
  283. package/dist/websocket/utils/message.d.ts +1 -1
  284. package/dist/websocket/utils/message.js +2 -2
  285. package/dist/websocket/utils/wait-for-message.js +1 -1
  286. package/package.json +35 -33
  287. package/dist/controllers/webhooks.js +0 -74
  288. package/dist/services/webhooks.d.ts +0 -14
  289. package/dist/services/webhooks.js +0 -32
  290. package/dist/utils/get-relation-info.d.ts +0 -6
  291. package/dist/utils/get-relation-info.js +0 -43
  292. package/dist/utils/get-relation-type.d.ts +0 -6
  293. package/dist/utils/get-relation-type.js +0 -18
  294. package/dist/utils/is-login-redirect-allowed.d.ts +0 -4
  295. package/dist/utils/versioning/deep-map-with-schema.d.ts +0 -23
  296. package/dist/utils/versioning/deep-map-with-schema.js +0 -81
  297. /package/dist/controllers/{webhooks.d.ts → deployment.d.ts} +0 -0
@@ -25,6 +25,11 @@ export declare class DirectusMCP {
25
25
  content: ({
26
26
  type: "text";
27
27
  text: string;
28
+ annotations?: {
29
+ audience?: ("user" | "assistant")[] | undefined;
30
+ priority?: number | undefined;
31
+ lastModified?: string | undefined;
32
+ } | undefined;
28
33
  _meta?: {
29
34
  [x: string]: unknown;
30
35
  } | undefined;
@@ -32,6 +37,11 @@ export declare class DirectusMCP {
32
37
  type: "image";
33
38
  data: string;
34
39
  mimeType: string;
40
+ annotations?: {
41
+ audience?: ("user" | "assistant")[] | undefined;
42
+ priority?: number | undefined;
43
+ lastModified?: string | undefined;
44
+ } | undefined;
35
45
  _meta?: {
36
46
  [x: string]: unknown;
37
47
  } | undefined;
@@ -39,6 +49,11 @@ export declare class DirectusMCP {
39
49
  type: "audio";
40
50
  data: string;
41
51
  mimeType: string;
52
+ annotations?: {
53
+ audience?: ("user" | "assistant")[] | undefined;
54
+ priority?: number | undefined;
55
+ lastModified?: string | undefined;
56
+ } | undefined;
42
57
  _meta?: {
43
58
  [x: string]: unknown;
44
59
  } | undefined;
@@ -48,6 +63,11 @@ export declare class DirectusMCP {
48
63
  type: "resource_link";
49
64
  description?: string | undefined;
50
65
  mimeType?: string | undefined;
66
+ annotations?: {
67
+ audience?: ("user" | "assistant")[] | undefined;
68
+ priority?: number | undefined;
69
+ lastModified?: string | undefined;
70
+ } | undefined;
51
71
  _meta?: {
52
72
  [x: string]: unknown;
53
73
  } | undefined;
@@ -55,6 +75,7 @@ export declare class DirectusMCP {
55
75
  src: string;
56
76
  mimeType?: string | undefined;
57
77
  sizes?: string[] | undefined;
78
+ theme?: "light" | "dark" | undefined;
58
79
  }[] | undefined;
59
80
  title?: string | undefined;
60
81
  } | {
@@ -74,14 +95,19 @@ export declare class DirectusMCP {
74
95
  [x: string]: unknown;
75
96
  } | undefined;
76
97
  };
98
+ annotations?: {
99
+ audience?: ("user" | "assistant")[] | undefined;
100
+ priority?: number | undefined;
101
+ lastModified?: string | undefined;
102
+ } | undefined;
77
103
  _meta?: {
78
104
  [x: string]: unknown;
79
105
  } | undefined;
80
106
  })[];
81
107
  _meta?: {
82
108
  [x: string]: unknown;
109
+ progressToken?: string | number | undefined;
83
110
  "io.modelcontextprotocol/related-task"?: {
84
- [x: string]: unknown;
85
111
  taskId: string;
86
112
  } | undefined;
87
113
  } | undefined;
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './registry.js';
3
+ export * from './options.js';
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './registry.js';
3
+ export * from './options.js';
@@ -0,0 +1,14 @@
1
+ import { type ModelDefinition, type ProviderType } from '@directus/ai';
2
+ import type { AISettings } from './types.js';
3
+ export declare function getModelDefinition(provider: ProviderType, model: string, settings: AISettings): ModelDefinition | undefined;
4
+ export declare function getProviderOptions(provider: ProviderType, model: string, settings: AISettings): {
5
+ openai: {
6
+ reasoningSummary: string;
7
+ store: boolean;
8
+ include: string[];
9
+ };
10
+ } | {
11
+ [x: string]: {
12
+ [key: string]: import("@directus/ai").JSONValue;
13
+ };
14
+ };
@@ -0,0 +1,26 @@
1
+ import { buildCustomModels, DEFAULT_AI_MODELS } from '@directus/ai';
2
+ export function getModelDefinition(provider, model, settings) {
3
+ const customModels = buildCustomModels(settings.openaiCompatibleModels);
4
+ return [...DEFAULT_AI_MODELS, ...customModels].find((m) => m.provider === provider && m.model === model);
5
+ }
6
+ const OPENAI_REASONING_OPTIONS = {
7
+ openai: {
8
+ reasoningSummary: 'auto',
9
+ store: false,
10
+ include: ['reasoning.encrypted_content'],
11
+ },
12
+ };
13
+ export function getProviderOptions(provider, model, settings) {
14
+ const modelDef = getModelDefinition(provider, model, settings);
15
+ if (provider === 'openai' && modelDef?.reasoning) {
16
+ return OPENAI_REASONING_OPTIONS;
17
+ }
18
+ if (provider === 'openai-compatible') {
19
+ const customModel = settings.openaiCompatibleModels?.find((m) => m.id === model);
20
+ if (customModel?.providerOptions) {
21
+ const providerName = settings.openaiCompatibleName ?? 'openai-compatible';
22
+ return { [providerName]: customModel.providerOptions };
23
+ }
24
+ }
25
+ return {};
26
+ }
@@ -0,0 +1,6 @@
1
+ import { createProviderRegistry } from 'ai';
2
+ import type { AISettings, ProviderConfig } from './types.js';
3
+ type ProviderRegistry = ReturnType<typeof createProviderRegistry>;
4
+ export declare function buildProviderConfigs(settings: AISettings): ProviderConfig[];
5
+ export declare function createAIProviderRegistry(configs: ProviderConfig[], settings?: AISettings): ProviderRegistry;
6
+ export {};
@@ -0,0 +1,65 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
3
+ import { createOpenAI } from '@ai-sdk/openai';
4
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
5
+ import { createProviderRegistry } from 'ai';
6
+ export function buildProviderConfigs(settings) {
7
+ const configs = [];
8
+ if (settings.openaiApiKey) {
9
+ configs.push({
10
+ type: 'openai',
11
+ apiKey: settings.openaiApiKey,
12
+ });
13
+ }
14
+ if (settings.anthropicApiKey) {
15
+ configs.push({
16
+ type: 'anthropic',
17
+ apiKey: settings.anthropicApiKey,
18
+ });
19
+ }
20
+ if (settings.googleApiKey) {
21
+ configs.push({
22
+ type: 'google',
23
+ apiKey: settings.googleApiKey,
24
+ });
25
+ }
26
+ if (settings.openaiCompatibleApiKey && settings.openaiCompatibleBaseUrl) {
27
+ configs.push({
28
+ type: 'openai-compatible',
29
+ apiKey: settings.openaiCompatibleApiKey,
30
+ baseUrl: settings.openaiCompatibleBaseUrl,
31
+ });
32
+ }
33
+ return configs;
34
+ }
35
+ export function createAIProviderRegistry(configs, settings) {
36
+ const providers = {};
37
+ for (const config of configs) {
38
+ switch (config.type) {
39
+ case 'openai':
40
+ providers['openai'] = createOpenAI({ apiKey: config.apiKey });
41
+ break;
42
+ case 'anthropic':
43
+ providers['anthropic'] = createAnthropic({ apiKey: config.apiKey });
44
+ break;
45
+ case 'google':
46
+ providers['google'] = createGoogleGenerativeAI({ apiKey: config.apiKey });
47
+ break;
48
+ case 'openai-compatible':
49
+ if (config.baseUrl) {
50
+ const customHeaders = settings?.openaiCompatibleHeaders?.reduce((acc, { header, value }) => {
51
+ acc[header] = value;
52
+ return acc;
53
+ }, {}) ?? {};
54
+ providers['openai-compatible'] = createOpenAICompatible({
55
+ name: settings?.openaiCompatibleName ?? 'openai-compatible',
56
+ apiKey: config.apiKey,
57
+ baseURL: config.baseUrl,
58
+ headers: customHeaders,
59
+ });
60
+ }
61
+ break;
62
+ }
63
+ }
64
+ return createProviderRegistry(providers);
65
+ }
@@ -0,0 +1,34 @@
1
+ import type { OpenAICompatibleHeader, OpenAICompatibleModel } from '@directus/ai';
2
+ interface OpenAIConfig {
3
+ type: 'openai';
4
+ apiKey: string;
5
+ }
6
+ interface AnthropicConfig {
7
+ type: 'anthropic';
8
+ apiKey: string;
9
+ }
10
+ interface GoogleConfig {
11
+ type: 'google';
12
+ apiKey: string;
13
+ }
14
+ interface OpenAICompatibleConfig {
15
+ type: 'openai-compatible';
16
+ apiKey: string;
17
+ baseUrl: string;
18
+ }
19
+ export type ProviderConfig = OpenAIConfig | AnthropicConfig | GoogleConfig | OpenAICompatibleConfig;
20
+ export interface AISettings {
21
+ openaiApiKey: string | null;
22
+ anthropicApiKey: string | null;
23
+ googleApiKey: string | null;
24
+ openaiCompatibleApiKey: string | null;
25
+ openaiCompatibleBaseUrl: string | null;
26
+ openaiCompatibleName: string | null;
27
+ openaiCompatibleModels: OpenAICompatibleModel[] | null;
28
+ openaiCompatibleHeaders: OpenAICompatibleHeader[] | null;
29
+ openaiAllowedModels: string[] | null;
30
+ anthropicAllowedModels: string[] | null;
31
+ googleAllowedModels: string[] | null;
32
+ systemPrompt: string | null;
33
+ }
34
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
- import { UnsupportedMediaTypeError } from '@directus/errors';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { UnsupportedMediaTypeError } from '@directus/errors';
4
4
  import { z } from 'zod';
5
5
  import { AssetsService } from '../../../services/assets.js';
6
6
  import { FilesService } from '../../../services/files.js';
@@ -1,7 +1,7 @@
1
- import { InvalidPayloadError } from '@directus/errors';
2
- import { isObject, toArray } from '@directus/utils';
3
1
  import { dirname, resolve } from 'node:path';
4
2
  import { fileURLToPath } from 'node:url';
3
+ import { InvalidPayloadError } from '@directus/errors';
4
+ import { isObject, toArray } from '@directus/utils';
5
5
  import { z } from 'zod';
6
6
  import { CollectionsService } from '../../../services/collections.js';
7
7
  import { requireText } from '../../../utils/require-text.js';
@@ -1,7 +1,7 @@
1
- import { InvalidPayloadError } from '@directus/errors';
2
- import { toArray } from '@directus/utils';
3
1
  import { dirname, resolve } from 'node:path';
4
2
  import { fileURLToPath } from 'node:url';
3
+ import { InvalidPayloadError } from '@directus/errors';
4
+ import { toArray } from '@directus/utils';
5
5
  import { z } from 'zod';
6
6
  import { clearSystemCache } from '../../../cache.js';
7
7
  import getDatabase from '../../../database/index.js';
@@ -1,6 +1,6 @@
1
- import { isObject } from '@directus/utils';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { isObject } from '@directus/utils';
4
4
  import { z } from 'zod';
5
5
  import { FilesService } from '../../../services/files.js';
6
6
  import { requireText } from '../../../utils/require-text.js';
@@ -1,6 +1,6 @@
1
- import { isObject } from '@directus/utils';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { isObject } from '@directus/utils';
4
4
  import { z } from 'zod';
5
5
  import { FlowsService } from '../../../services/flows.js';
6
6
  import { requireText } from '../../../utils/require-text.js';
@@ -1,6 +1,6 @@
1
- import { toArray } from '@directus/utils';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { toArray } from '@directus/utils';
4
4
  import { z } from 'zod';
5
5
  import { FoldersService } from '../../../services/folders.js';
6
6
  import { requireText } from '../../../utils/require-text.js';
@@ -1,9 +1,9 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
1
3
  import { ForbiddenError, InvalidPayloadError } from '@directus/errors';
2
4
  import { isSystemCollection } from '@directus/system-data';
3
5
  import { toArray } from '@directus/utils';
4
6
  import { isObject } from 'graphql-compose';
5
- import { dirname, resolve } from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
7
  import { z } from 'zod';
8
8
  import { ItemsService } from '../../../services/items.js';
9
9
  import { requireText } from '../../../utils/require-text.js';
@@ -41,7 +41,10 @@ const ItemsInputSchema = z.object({
41
41
  collection: z.string().describe('The name of the collection'),
42
42
  query: QueryInputSchema.optional(),
43
43
  keys: z.array(PrimaryKeyInputSchema).optional(),
44
- data: z.array(ItemInputSchema).optional().describe('Always an array of objects'),
44
+ data: z
45
+ .union([z.array(ItemInputSchema), ItemInputSchema])
46
+ .optional()
47
+ .describe('Object when using keys, array with PKs for batch updates'),
45
48
  });
46
49
  export const items = defineTool({
47
50
  name: 'items',
@@ -99,7 +99,7 @@ Core: `_eq`, `_neq`, `_in`, `_nin`, `_null`, `_nnull`, `_lt`, `_lte`, `_gt`, `_g
99
99
  "action": "update",
100
100
  "collection": "posts",
101
101
  "keys": ["uuid-1", "uuid-2"],
102
- "data": [{ "status": "published" }] // Partial update
102
+ "data": { "status": "published" }
103
103
  }
104
104
  ```
105
105
 
@@ -123,15 +123,13 @@ Core: `_eq`, `_neq`, `_in`, `_nin`, `_null`, `_nnull`, `_lt`, `_lte`, `_gt`, `_g
123
123
  "action": "update",
124
124
  "collection": "posts",
125
125
  "keys": ["uuid-1"],
126
- "data": [
127
- {
128
- "categories": {
129
- "create": [{ "name": "New Category" }],
130
- "update": [{ "id": 3, "name": "Renamed" }],
131
- "delete": [5]
132
- }
126
+ "data": {
127
+ "categories": {
128
+ "create": [{ "name": "New Category" }],
129
+ "update": [{ "id": 3, "name": "Renamed" }],
130
+ "delete": [5]
133
131
  }
134
- ]
132
+ }
135
133
  }
136
134
  ```
137
135
 
@@ -1,6 +1,6 @@
1
- import { InvalidPayloadError } from '@directus/errors';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { InvalidPayloadError } from '@directus/errors';
4
4
  import { z } from 'zod';
5
5
  import { RelationsService } from '../../../services/relations.js';
6
6
  import { requireText } from '../../../utils/require-text.js';
@@ -108,7 +108,7 @@ export const FileImportItemValidateSchema = z.object({
108
108
  url: z.string(),
109
109
  file: FileItemValidateSchema,
110
110
  });
111
- // opertations
111
+ // operations
112
112
  export const OperationItemInputSchema = z
113
113
  .object({
114
114
  id: z.string(),
@@ -1,6 +1,6 @@
1
- import { InvalidPayloadError } from '@directus/errors';
2
1
  import { dirname, resolve } from 'node:path';
3
2
  import { fileURLToPath } from 'node:url';
3
+ import { InvalidPayloadError } from '@directus/errors';
4
4
  import { z } from 'zod';
5
5
  import { getFlowManager } from '../../../flows.js';
6
6
  import { FlowsService } from '../../../services/flows.js';
package/dist/app.js CHANGED
@@ -1,3 +1,6 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'path';
1
4
  import { useEnv } from '@directus/env';
2
5
  import { InvalidPayloadError, ServiceUnavailableError } from '@directus/errors';
3
6
  import { handlePressure } from '@directus/pressure';
@@ -5,10 +8,8 @@ import { toBoolean } from '@directus/utils';
5
8
  import cookieParser from 'cookie-parser';
6
9
  import express from 'express';
7
10
  import { merge } from 'lodash-es';
8
- import { readFile } from 'node:fs/promises';
9
- import { createRequire } from 'node:module';
10
- import path from 'path';
11
11
  import qs from 'qs';
12
+ import { aiChatRouter } from './ai/chat/router.js';
12
13
  import { registerAuthProviders } from './auth.js';
13
14
  import accessRouter from './controllers/access.js';
14
15
  import activityRouter from './controllers/activity.js';
@@ -17,6 +18,7 @@ import authRouter from './controllers/auth.js';
17
18
  import collectionsRouter from './controllers/collections.js';
18
19
  import commentsRouter from './controllers/comments.js';
19
20
  import dashboardsRouter from './controllers/dashboards.js';
21
+ import deploymentRouter from './controllers/deployment.js';
20
22
  import extensionsRouter from './controllers/extensions.js';
21
23
  import fieldsRouter from './controllers/fields.js';
22
24
  import filesRouter from './controllers/files.js';
@@ -45,8 +47,8 @@ import tusRouter from './controllers/tus.js';
45
47
  import usersRouter from './controllers/users.js';
46
48
  import utilsRouter from './controllers/utils.js';
47
49
  import versionsRouter from './controllers/versions.js';
48
- import webhooksRouter from './controllers/webhooks.js';
49
50
  import { isInstalled, validateDatabaseConnection, validateDatabaseExtensions, validateMigrations, } from './database/index.js';
51
+ import { registerDeploymentDrivers } from './deployment.js';
50
52
  import emitter from './emitter.js';
51
53
  import { getExtensionManager } from './extensions/index.js';
52
54
  import { getFlowManager } from './flows.js';
@@ -61,14 +63,13 @@ import rateLimiter from './middleware/rate-limiter-ip.js';
61
63
  import sanitizeQuery from './middleware/sanitize-query.js';
62
64
  import schema from './middleware/schema.js';
63
65
  import metricsSchedule from './schedules/metrics.js';
66
+ import projectSchedule from './schedules/project.js';
64
67
  import retentionSchedule from './schedules/retention.js';
65
68
  import telemetrySchedule from './schedules/telemetry.js';
66
69
  import tusSchedule from './schedules/tus.js';
67
- import projectSchedule from './schedules/project.js';
68
70
  import { getConfigFromEnv } from './utils/get-config-from-env.js';
69
71
  import { Url } from './utils/url.js';
70
72
  import { validateStorage } from './utils/validate-storage.js';
71
- import { aiChatRouter } from './ai/chat/router.js';
72
73
  const require = createRequire(import.meta.url);
73
74
  export default async function createApp() {
74
75
  const env = useEnv();
@@ -94,6 +95,7 @@ export default async function createApp() {
94
95
  await validateDatabaseExtensions();
95
96
  await validateStorage();
96
97
  await registerAuthProviders();
98
+ registerDeploymentDrivers();
97
99
  const extensionManager = getExtensionManager();
98
100
  const flowManager = getFlowManager();
99
101
  await extensionManager.initialize();
@@ -223,6 +225,7 @@ export default async function createApp() {
223
225
  app.use('/collections', collectionsRouter);
224
226
  app.use('/comments', commentsRouter);
225
227
  app.use('/dashboards', dashboardsRouter);
228
+ app.use('/deployments', deploymentRouter);
226
229
  app.use('/extensions', extensionsRouter);
227
230
  app.use('/fields', fieldsRouter);
228
231
  if (env['TUS_ENABLED'] === true) {
@@ -235,7 +238,9 @@ export default async function createApp() {
235
238
  if (toBoolean(env['MCP_ENABLED']) === true) {
236
239
  app.use('/mcp', mcpRouter);
237
240
  }
238
- app.use('/ai/chat', aiChatRouter);
241
+ if (toBoolean(env['AI_ENABLED']) === true) {
242
+ app.use('/ai/chat', aiChatRouter);
243
+ }
239
244
  if (env['METRICS_ENABLED'] === true) {
240
245
  app.use('/metrics', metricsRouter);
241
246
  }
@@ -256,7 +261,6 @@ export default async function createApp() {
256
261
  app.use('/users', usersRouter);
257
262
  app.use('/utils', utilsRouter);
258
263
  app.use('/versions', versionsRouter);
259
- app.use('/webhooks', webhooksRouter);
260
264
  // Register custom endpoints
261
265
  await emitter.emitInit('routes.custom.before', { app });
262
266
  app.use(extensionManager.getEndpointRouter());
@@ -1,5 +1,5 @@
1
1
  import { Router } from 'express';
2
- import type { Client } from 'ldapjs';
2
+ import { Client } from 'ldapts';
3
3
  import type { AuthDriverOptions, User } from '../../types/index.js';
4
4
  import { AuthDriver } from '../auth.js';
5
5
  export declare class LDAPAuthDriver extends AuthDriver {