@webiny/api-aco 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7

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 (241) hide show
  1. package/AcoFeature.d.ts +5 -0
  2. package/AcoFeature.js +134 -0
  3. package/AcoFeature.js.map +1 -0
  4. package/AcoFolderSchemaFactory.d.ts +32 -0
  5. package/AcoFolderSchemaFactory.js +82 -0
  6. package/AcoFolderSchemaFactory.js.map +1 -0
  7. package/createAcoGraphQL.d.ts +8 -4
  8. package/createAcoGraphQL.js +56 -96
  9. package/createAcoGraphQL.js.map +1 -1
  10. package/domain/folder/abstractions.d.ts +12 -5
  11. package/domain/folder/abstractions.js +2 -2
  12. package/domain/folder/abstractions.js.map +1 -1
  13. package/domain/folder/folder.model.js +2 -1
  14. package/domain/folder/folder.model.js.map +1 -1
  15. package/exports/api/aco/flp.d.ts +1 -0
  16. package/exports/api/aco/flp.js +1 -0
  17. package/exports/api/aco/folder.d.ts +2 -1
  18. package/exports/api/aco/folder.js +1 -1
  19. package/features/ai/CreateFolderTool.d.ts +49 -0
  20. package/features/ai/CreateFolderTool.js +58 -0
  21. package/features/ai/CreateFolderTool.js.map +1 -0
  22. package/features/ai/CreateTeamTool.d.ts +48 -0
  23. package/features/ai/CreateTeamTool.js +56 -0
  24. package/features/ai/CreateTeamTool.js.map +1 -0
  25. package/features/ai/DeleteFolderTool.d.ts +48 -0
  26. package/features/ai/DeleteFolderTool.js +55 -0
  27. package/features/ai/DeleteFolderTool.js.map +1 -0
  28. package/features/ai/GrantFolderAccessTool.d.ts +77 -0
  29. package/features/ai/GrantFolderAccessTool.js +80 -0
  30. package/features/ai/GrantFolderAccessTool.js.map +1 -0
  31. package/features/ai/ListFoldersTool.d.ts +47 -0
  32. package/features/ai/ListFoldersTool.js +57 -0
  33. package/features/ai/ListFoldersTool.js.map +1 -0
  34. package/features/ai/ListRolesTool.d.ts +39 -0
  35. package/features/ai/ListRolesTool.js +48 -0
  36. package/features/ai/ListRolesTool.js.map +1 -0
  37. package/features/ai/ListTeamsTool.d.ts +39 -0
  38. package/features/ai/ListTeamsTool.js +48 -0
  39. package/features/ai/ListTeamsTool.js.map +1 -0
  40. package/features/ai/RevokeFolderAccessTool.d.ts +63 -0
  41. package/features/ai/RevokeFolderAccessTool.js +69 -0
  42. package/features/ai/RevokeFolderAccessTool.js.map +1 -0
  43. package/features/ai/assertTargetIsUsable.d.ts +10 -0
  44. package/features/ai/assertTargetIsUsable.js +14 -0
  45. package/features/ai/assertTargetIsUsable.js.map +1 -0
  46. package/features/ai/feature.d.ts +12 -0
  47. package/features/ai/feature.js +25 -0
  48. package/features/ai/feature.js.map +1 -0
  49. package/features/ai/index.d.ts +9 -0
  50. package/features/ai/index.js +9 -0
  51. package/features/ai/loadFolderPermissions.d.ts +16 -0
  52. package/features/ai/loadFolderPermissions.js +14 -0
  53. package/features/ai/loadFolderPermissions.js.map +1 -0
  54. package/features/cms/decorators/ListDeletedEntriesWithFlpDecorator.js +1 -0
  55. package/features/cms/decorators/ListDeletedEntriesWithFlpDecorator.js.map +1 -1
  56. package/features/cms/decorators/ListEntriesWithFlpDecorator.js +1 -0
  57. package/features/cms/decorators/ListEntriesWithFlpDecorator.js.map +1 -1
  58. package/features/cms/decorators/ListLatestEntriesWithFlpDecorator.js +1 -0
  59. package/features/cms/decorators/ListLatestEntriesWithFlpDecorator.js.map +1 -1
  60. package/features/cms/decorators/ListPublishedEntriesWithFlpDecorator.js +1 -0
  61. package/features/cms/decorators/ListPublishedEntriesWithFlpDecorator.js.map +1 -1
  62. package/features/cms/decorators/MoveEntryWithFlpDecorator.d.ts +1 -1
  63. package/features/flp/CreateFlp/CreateFlpUseCase.d.ts +3 -3
  64. package/features/flp/CreateFlp/CreateFlpUseCase.js +4 -4
  65. package/features/flp/CreateFlp/CreateFlpUseCase.js.map +1 -1
  66. package/features/flp/CreateFlp/feature.d.ts +1 -6
  67. package/features/flp/CreateFlp/feature.js +3 -2
  68. package/features/flp/CreateFlp/feature.js.map +1 -1
  69. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.d.ts +8 -5
  70. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.js +21 -14
  71. package/features/flp/CreateFlpOnFolderCreated/CreateFlpOnFolderCreatedHandler.js.map +1 -1
  72. package/features/flp/DeleteFlp/DeleteFlpUseCase.d.ts +3 -3
  73. package/features/flp/DeleteFlp/DeleteFlpUseCase.js +3 -3
  74. package/features/flp/DeleteFlp/DeleteFlpUseCase.js.map +1 -1
  75. package/features/flp/DeleteFlp/feature.d.ts +1 -6
  76. package/features/flp/DeleteFlp/feature.js +3 -2
  77. package/features/flp/DeleteFlp/feature.js.map +1 -1
  78. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.d.ts +6 -5
  79. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.js +16 -13
  80. package/features/flp/DeleteFlpOnFolderDeleted/DeleteFlpOnFolderDeletedHandler.js.map +1 -1
  81. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.d.ts +3 -3
  82. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.js +6 -6
  83. package/features/flp/FolderLevelPermissions/FolderLevelPermissions.js.map +1 -1
  84. package/features/flp/FolderLevelPermissions/NoopFolderLevelPermissions.d.ts +25 -0
  85. package/features/flp/FolderLevelPermissions/NoopFolderLevelPermissions.js +48 -0
  86. package/features/flp/FolderLevelPermissions/NoopFolderLevelPermissions.js.map +1 -0
  87. package/features/flp/FolderLevelPermissions/index.d.ts +1 -0
  88. package/features/flp/FolderLevelPermissions/index.js +1 -0
  89. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.d.ts +13 -0
  90. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.js +26 -0
  91. package/features/flp/GetFlp/decorators/GetFlpWithCodeFlps.js.map +1 -0
  92. package/features/flp/GetFlp/feature.d.ts +1 -1
  93. package/features/flp/GetFlp/feature.js +3 -2
  94. package/features/flp/GetFlp/feature.js.map +1 -1
  95. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.d.ts +13 -0
  96. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.js +27 -0
  97. package/features/flp/ListFlps/decorators/ListFlpsWithCodeFlps.js.map +1 -0
  98. package/features/flp/ListFlps/feature.d.ts +1 -1
  99. package/features/flp/ListFlps/feature.js +3 -2
  100. package/features/flp/ListFlps/feature.js.map +1 -1
  101. package/features/flp/UpdateFlp/UpdateFlpUseCase.d.ts +15 -8
  102. package/features/flp/UpdateFlp/UpdateFlpUseCase.js +37 -42
  103. package/features/flp/UpdateFlp/UpdateFlpUseCase.js.map +1 -1
  104. package/features/flp/UpdateFlp/abstractions.d.ts +6 -2
  105. package/features/flp/UpdateFlp/abstractions.js.map +1 -1
  106. package/features/flp/UpdateFlp/feature.d.ts +1 -6
  107. package/features/flp/UpdateFlp/feature.js +7 -2
  108. package/features/flp/UpdateFlp/feature.js.map +1 -1
  109. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.d.ts +8 -5
  110. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.js +21 -16
  111. package/features/flp/UpdateFlpOnFolderUpdated/UpdateFlpOnFolderUpdatedHandler.js.map +1 -1
  112. package/features/flp/shared/CodeFlpMerger.d.ts +26 -0
  113. package/features/flp/shared/CodeFlpMerger.js +20 -0
  114. package/features/flp/shared/CodeFlpMerger.js.map +1 -0
  115. package/features/flp/shared/CodeFlpPath.d.ts +15 -0
  116. package/features/flp/shared/CodeFlpPath.js +29 -0
  117. package/features/flp/shared/CodeFlpPath.js.map +1 -0
  118. package/features/flp/shared/CodeFlpTarget.d.ts +10 -0
  119. package/features/flp/shared/CodeFlpTarget.js +26 -0
  120. package/features/flp/shared/CodeFlpTarget.js.map +1 -0
  121. package/features/flp/shared/CodeFlpsProvider.d.ts +14 -0
  122. package/features/flp/shared/CodeFlpsProvider.js +33 -0
  123. package/features/flp/shared/CodeFlpsProvider.js.map +1 -0
  124. package/features/flp/shared/abstractions.d.ts +77 -0
  125. package/features/flp/shared/abstractions.js +19 -0
  126. package/features/flp/shared/abstractions.js.map +1 -0
  127. package/features/flp/shared/feature.d.ts +5 -0
  128. package/features/flp/shared/feature.js +17 -0
  129. package/features/flp/shared/feature.js.map +1 -0
  130. package/features/flp/shared/index.d.ts +4 -0
  131. package/features/flp/shared/index.js +4 -0
  132. package/features/folder/CreateFolder/CreateFolderRepository.d.ts +3 -3
  133. package/features/folder/CreateFolder/CreateFolderRepository.js +10 -7
  134. package/features/folder/CreateFolder/CreateFolderRepository.js.map +1 -1
  135. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.d.ts +9 -1
  136. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.js +20 -3
  137. package/features/folder/CreateFolder/decorators/CreateFolderWithFolderLevelPermissions.js.map +1 -1
  138. package/features/folder/DeleteFolder/DeleteFolderRepository.d.ts +3 -3
  139. package/features/folder/DeleteFolder/DeleteFolderRepository.js +6 -5
  140. package/features/folder/DeleteFolder/DeleteFolderRepository.js.map +1 -1
  141. package/features/folder/DeleteFolder/decorators/DeleteFolderWithFolderLevelPermissions.d.ts +1 -1
  142. package/features/folder/EnsureFolderIsEmpty/EnsureFolderIsEmpty.js +4 -0
  143. package/features/folder/EnsureFolderIsEmpty/EnsureFolderIsEmpty.js.map +1 -1
  144. package/features/folder/EnsureHcmsFolderIsEmptyOnDelete/ModelFolderBeforeDeleteHandler.js +4 -0
  145. package/features/folder/EnsureHcmsFolderIsEmptyOnDelete/ModelFolderBeforeDeleteHandler.js.map +1 -1
  146. package/features/folder/FolderModelProvider.d.ts +26 -0
  147. package/features/folder/FolderModelProvider.js +22 -0
  148. package/features/folder/FolderModelProvider.js.map +1 -0
  149. package/features/folder/GetAncestors/GetAncestorsRepository.d.ts +3 -3
  150. package/features/folder/GetAncestors/GetAncestorsRepository.js +6 -5
  151. package/features/folder/GetAncestors/GetAncestorsRepository.js.map +1 -1
  152. package/features/folder/GetFolder/GetFolderRepository.d.ts +3 -3
  153. package/features/folder/GetFolder/GetFolderRepository.js +6 -5
  154. package/features/folder/GetFolder/GetFolderRepository.js.map +1 -1
  155. package/features/folder/GetFolder/decorators/GetFolderWithFolderLevelPermissions.d.ts +8 -8
  156. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.d.ts +3 -3
  157. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.js +10 -8
  158. package/features/folder/GetFolderHierarchy/GetFolderHierarchyRepository.js.map +1 -1
  159. package/features/folder/ListFolders/ListFoldersRepository.d.ts +3 -3
  160. package/features/folder/ListFolders/ListFoldersRepository.js +8 -7
  161. package/features/folder/ListFolders/ListFoldersRepository.js.map +1 -1
  162. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.d.ts +11 -0
  163. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.js +38 -0
  164. package/features/folder/NotifyFolderChange/NotifyFolderChangeUseCase.js.map +1 -0
  165. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.d.ts +12 -0
  166. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.js +24 -0
  167. package/features/folder/NotifyFolderChange/NotifyOnFolderDeletedHandler.js.map +1 -0
  168. package/features/folder/NotifyFolderChange/abstractions.d.ts +28 -0
  169. package/features/folder/NotifyFolderChange/abstractions.js +8 -0
  170. package/features/folder/NotifyFolderChange/abstractions.js.map +1 -0
  171. package/features/folder/NotifyFolderChange/feature.d.ts +9 -0
  172. package/features/folder/NotifyFolderChange/feature.js +13 -0
  173. package/features/folder/NotifyFolderChange/feature.js.map +1 -0
  174. package/features/folder/NotifyFolderChange/index.d.ts +2 -0
  175. package/features/folder/NotifyFolderChange/index.js +2 -0
  176. package/features/folder/UpdateFolder/UpdateFolderRepository.d.ts +3 -3
  177. package/features/folder/UpdateFolder/UpdateFolderRepository.js +11 -8
  178. package/features/folder/UpdateFolder/UpdateFolderRepository.js.map +1 -1
  179. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.d.ts +14 -1
  180. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js +52 -4
  181. package/features/folder/UpdateFolder/decorators/UpdateFolderWithFolderLevelPermissions.js.map +1 -1
  182. package/features/folder/shared/abstractions.d.ts +14 -0
  183. package/features/folder/shared/abstractions.js +4 -1
  184. package/features/folder/shared/abstractions.js.map +1 -1
  185. package/filter/filter.gql.d.ts +2 -3
  186. package/filter/filter.gql.js +61 -27
  187. package/filter/filter.gql.js.map +1 -1
  188. package/filter/filter.model.js +2 -1
  189. package/filter/filter.model.js.map +1 -1
  190. package/filter/filter.so.d.ts +8 -2
  191. package/filter/filter.so.js +21 -9
  192. package/filter/filter.so.js.map +1 -1
  193. package/flp/flp.types.d.ts +6 -1
  194. package/flp/index.d.ts +0 -1
  195. package/flp/index.js +0 -1
  196. package/flp/tasks/createFlp.task.d.ts +12 -5
  197. package/flp/tasks/createFlp.task.js +32 -15
  198. package/flp/tasks/createFlp.task.js.map +1 -1
  199. package/flp/tasks/deleteFlp.task.d.ts +10 -5
  200. package/flp/tasks/deleteFlp.task.js +22 -13
  201. package/flp/tasks/deleteFlp.task.js.map +1 -1
  202. package/flp/tasks/index.d.ts +0 -1
  203. package/flp/tasks/index.js +1 -14
  204. package/flp/tasks/index.js.map +1 -1
  205. package/flp/tasks/syncFlp.task.d.ts +10 -5
  206. package/flp/tasks/syncFlp.task.js +34 -13
  207. package/flp/tasks/syncFlp.task.js.map +1 -1
  208. package/flp/tasks/updateFlp.task.d.ts +12 -5
  209. package/flp/tasks/updateFlp.task.js +40 -19
  210. package/flp/tasks/updateFlp.task.js.map +1 -1
  211. package/folder/createFolderTypeDefs.js +4 -1
  212. package/folder/createFolderTypeDefs.js.map +1 -1
  213. package/folder/folder.gql.d.ts +1 -1
  214. package/folder/folder.gql.js +10 -4
  215. package/folder/folder.gql.js.map +1 -1
  216. package/index.d.ts +1 -6
  217. package/index.js +1 -11
  218. package/package.json +25 -26
  219. package/types.d.ts +1 -2
  220. package/types.js.map +1 -1
  221. package/utils/createOperationsWrapper.d.ts +5 -2
  222. package/utils/createOperationsWrapper.js +5 -5
  223. package/utils/createOperationsWrapper.js.map +1 -1
  224. package/utils/decorators/CmsEntriesCrudDecorators.js +9 -5
  225. package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -1
  226. package/utils/resolve.d.ts +2 -2
  227. package/utils/resolve.js +1 -1
  228. package/utils/resolve.js.map +1 -1
  229. package/createAcoContext.d.ts +0 -9
  230. package/createAcoContext.js +0 -109
  231. package/createAcoContext.js.map +0 -1
  232. package/createAcoStorageOperations.d.ts +0 -12
  233. package/createAcoStorageOperations.js +0 -9
  234. package/createAcoStorageOperations.js.map +0 -1
  235. package/createAcoTasks.d.ts +0 -1
  236. package/createAcoTasks.js +0 -14
  237. package/createAcoTasks.js.map +0 -1
  238. package/flp/flp.so.d.ts +0 -20
  239. package/flp/flp.so.js +0 -183
  240. package/flp/flp.so.js.map +0 -1
  241. package/index.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { CreateFolderUseCase } from "../../features/folder/CreateFolder/index.js";
4
+ declare const inputSchema: z.ZodObject<{
5
+ title: z.ZodString;
6
+ slug: z.ZodString;
7
+ type: z.ZodString;
8
+ parentId: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ type Input = z.infer<typeof inputSchema>;
11
+ interface CreatedFolder {
12
+ id: string;
13
+ title: string;
14
+ slug: string;
15
+ path: string;
16
+ type: string;
17
+ }
18
+ declare class CreateFolderToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
19
+ private createFolder;
20
+ constructor(createFolder: CreateFolderUseCase.Interface);
21
+ execute(input: Input): Promise<CreatedFolder>;
22
+ }
23
+ /**
24
+ * Creates a folder.
25
+ *
26
+ * Additive and reversible, so it is not flagged destructive — but it still changes the project, so it
27
+ * is not read-only either and therefore needs the user to approve the exact arguments.
28
+ */
29
+ declare class CreateFolderToolImpl implements AiSdkToolDefinition.Interface<Input> {
30
+ readonly name = "createFolder";
31
+ readonly title = "Create folder";
32
+ readonly description = "Creates a folder in the File Manager ('FmFile') or under a content model ('cms:<modelId>'). Call listFolders first to pick a parent, or omit parentId for the root. Requires user approval.";
33
+ readonly inputSchema: z.ZodObject<{
34
+ title: z.ZodString;
35
+ slug: z.ZodString;
36
+ type: z.ZodString;
37
+ parentId: z.ZodOptional<z.ZodString>;
38
+ }, z.core.$strip>;
39
+ readonly annotations: {
40
+ readOnlyHint: boolean;
41
+ };
42
+ readonly handler: typeof CreateFolderToolHandlerImpl & {
43
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolHandler<any>>;
44
+ };
45
+ }
46
+ export declare const CreateFolderTool: typeof CreateFolderToolImpl & {
47
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolDefinition<any>>;
48
+ };
49
+ export {};
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { CreateFolderUseCase } from "../folder/CreateFolder/index.js";
4
+ const inputSchema = z.object({
5
+ title: z.string().describe("Human-readable folder name, e.g. 'Marketing'."),
6
+ slug: z.string().describe("URL-safe identifier, e.g. 'marketing'. Lowercase, hyphens instead of spaces."),
7
+ type: z.string().describe("Folder namespace: 'FmFile' for File Manager, or 'cms:<modelId>' for a content model's folders."),
8
+ parentId: z.string().optional().describe("Id of the parent folder. Omit to create at the root of that namespace.")
9
+ });
10
+ class CreateFolderToolHandlerImpl {
11
+ constructor(createFolder){
12
+ this.createFolder = createFolder;
13
+ }
14
+ async execute(input) {
15
+ const params = {
16
+ title: input.title,
17
+ slug: input.slug,
18
+ type: input.type,
19
+ parentId: null
20
+ };
21
+ if (input.parentId) params.parentId = input.parentId;
22
+ const result = await this.createFolder.execute(params);
23
+ if (result.isFail()) throw new Error(`Could not create the folder: ${result.error.message}`);
24
+ const folder = result.value;
25
+ return {
26
+ id: folder.id,
27
+ title: folder.title,
28
+ slug: folder.slug,
29
+ path: folder.path,
30
+ type: folder.type
31
+ };
32
+ }
33
+ }
34
+ const CreateFolderToolHandler = AiSdkToolHandler.createImplementation({
35
+ implementation: CreateFolderToolHandlerImpl,
36
+ dependencies: [
37
+ CreateFolderUseCase
38
+ ]
39
+ });
40
+ class CreateFolderToolImpl {
41
+ constructor(){
42
+ this.name = "createFolder";
43
+ this.title = "Create folder";
44
+ this.description = "Creates a folder in the File Manager ('FmFile') or under a content model ('cms:<modelId>'). Call listFolders first to pick a parent, or omit parentId for the root. Requires user approval.";
45
+ this.inputSchema = inputSchema;
46
+ this.annotations = {
47
+ readOnlyHint: false
48
+ };
49
+ this.handler = CreateFolderToolHandler;
50
+ }
51
+ }
52
+ const CreateFolderTool = AiSdkToolDefinition.createImplementation({
53
+ implementation: CreateFolderToolImpl,
54
+ dependencies: []
55
+ });
56
+ export { CreateFolderTool };
57
+
58
+ //# sourceMappingURL=CreateFolderTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ai/CreateFolderTool.js","sources":["../../../src/features/ai/CreateFolderTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { CreateFolderUseCase } from \"~/features/folder/CreateFolder/index.js\";\n\nconst inputSchema = z.object({\n title: z.string().describe(\"Human-readable folder name, e.g. 'Marketing'.\"),\n slug: z\n .string()\n .describe(\"URL-safe identifier, e.g. 'marketing'. Lowercase, hyphens instead of spaces.\"),\n type: z\n .string()\n .describe(\n \"Folder namespace: 'FmFile' for File Manager, or 'cms:<modelId>' for a content model's folders.\"\n ),\n parentId: z\n .string()\n .optional()\n .describe(\"Id of the parent folder. Omit to create at the root of that namespace.\")\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface CreatedFolder {\n id: string;\n title: string;\n slug: string;\n path: string;\n type: string;\n}\n\nclass CreateFolderToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(private createFolder: CreateFolderUseCase.Interface) {}\n\n async execute(input: Input): Promise<CreatedFolder> {\n const params: {\n title: string;\n slug: string;\n type: string;\n parentId: string | null;\n } = {\n title: input.title,\n slug: input.slug,\n type: input.type,\n parentId: null\n };\n\n if (input.parentId) {\n params.parentId = input.parentId;\n }\n\n const result = await this.createFolder.execute(params);\n\n if (result.isFail()) {\n throw new Error(`Could not create the folder: ${result.error.message}`);\n }\n\n const folder = result.value;\n\n return {\n id: folder.id,\n title: folder.title,\n slug: folder.slug,\n path: folder.path,\n type: folder.type\n };\n }\n}\n\nconst CreateFolderToolHandler = AiSdkToolHandler.createImplementation({\n implementation: CreateFolderToolHandlerImpl,\n dependencies: [CreateFolderUseCase]\n});\n\n/**\n * Creates a folder.\n *\n * Additive and reversible, so it is not flagged destructive — but it still changes the project, so it\n * is not read-only either and therefore needs the user to approve the exact arguments.\n */\nclass CreateFolderToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"createFolder\";\n readonly title = \"Create folder\";\n readonly description =\n \"Creates a folder in the File Manager ('FmFile') or under a content model ('cms:<modelId>'). Call listFolders first to pick a parent, or omit parentId for the root. Requires user approval.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: false };\n readonly handler = CreateFolderToolHandler;\n}\n\nexport const CreateFolderTool = AiSdkToolDefinition.createImplementation({\n implementation: CreateFolderToolImpl,\n dependencies: []\n});\n"],"names":["inputSchema","z","CreateFolderToolHandlerImpl","createFolder","input","params","result","Error","folder","CreateFolderToolHandler","AiSdkToolHandler","CreateFolderUseCase","CreateFolderToolImpl","CreateFolderTool","AiSdkToolDefinition"],"mappings":";;;AAIA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,OAAOA,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,MAAMA,EAAAA,MACK,GACN,QAAQ,CAAC;IACd,MAAMA,EAAAA,MACK,GACN,QAAQ,CACL;IAER,UAAUA,EAAAA,MACC,GACN,QAAQ,GACR,QAAQ,CAAC;AAClB;AAYA,MAAMC;IACF,YAAoBC,YAA2C,CAAE;aAA7CA,YAAY,GAAZA;IAA8C;IAElE,MAAM,QAAQC,KAAY,EAA0B;QAChD,MAAMC,SAKF;YACA,OAAOD,MAAM,KAAK;YAClB,MAAMA,MAAM,IAAI;YAChB,MAAMA,MAAM,IAAI;YAChB,UAAU;QACd;QAEA,IAAIA,MAAM,QAAQ,EACdC,OAAO,QAAQ,GAAGD,MAAM,QAAQ;QAGpC,MAAME,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD;QAE/C,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIC,MAAM,CAAC,6BAA6B,EAAED,OAAO,KAAK,CAAC,OAAO,EAAE;QAG1E,MAAME,SAASF,OAAO,KAAK;QAE3B,OAAO;YACH,IAAIE,OAAO,EAAE;YACb,OAAOA,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,MAAMA,OAAO,IAAI;YACjB,MAAMA,OAAO,IAAI;QACrB;IACJ;AACJ;AAEA,MAAMC,0BAA0BC,iBAAiB,oBAAoB,CAAC;IAClE,gBAAgBR;IAChB,cAAc;QAACS;KAAoB;AACvC;AAQA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGZ;aACd,WAAW,GAAG;YAAE,cAAc;QAAM;aACpC,OAAO,GAAGS;;AACvB;AAEO,MAAMI,mBAAmBC,oBAAoB,oBAAoB,CAAC;IACrE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { CreateTeam } from "@webiny/api-core/features/security/teams/CreateTeam/index.js";
4
+ declare const inputSchema: z.ZodObject<{
5
+ name: z.ZodString;
6
+ slug: z.ZodString;
7
+ description: z.ZodOptional<z.ZodString>;
8
+ roles: z.ZodArray<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ type Input = z.infer<typeof inputSchema>;
11
+ interface CreatedTeam {
12
+ id: string;
13
+ name: string;
14
+ slug: string;
15
+ roles: string[];
16
+ }
17
+ declare class CreateTeamToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
18
+ private createTeam;
19
+ constructor(createTeam: CreateTeam.Interface);
20
+ execute(input: Input): Promise<CreatedTeam>;
21
+ }
22
+ /**
23
+ * Creates a team.
24
+ *
25
+ * Not read-only, so it needs approval: a team is an access-control object, and the roles it carries
26
+ * decide what its members can do. The user should see which roles are being granted before it exists.
27
+ */
28
+ declare class CreateTeamToolImpl implements AiSdkToolDefinition.Interface<Input> {
29
+ readonly name = "createTeam";
30
+ readonly title = "Create team";
31
+ readonly description = "Creates a team with a set of roles. Call listRoles first and pass what it returns; do not guess role identifiers. Requires user approval.";
32
+ readonly inputSchema: z.ZodObject<{
33
+ name: z.ZodString;
34
+ slug: z.ZodString;
35
+ description: z.ZodOptional<z.ZodString>;
36
+ roles: z.ZodArray<z.ZodString>;
37
+ }, z.core.$strip>;
38
+ readonly annotations: {
39
+ readOnlyHint: boolean;
40
+ };
41
+ readonly handler: typeof CreateTeamToolHandlerImpl & {
42
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolHandler<any>>;
43
+ };
44
+ }
45
+ export declare const CreateTeamTool: typeof CreateTeamToolImpl & {
46
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolDefinition<any>>;
47
+ };
48
+ export {};
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { CreateTeam } from "@webiny/api-core/features/security/teams/CreateTeam/index.js";
4
+ import { descriptionOnCreate } from "@webiny/api-core/features/security/shared/index.js";
5
+ const inputSchema = z.object({
6
+ name: z.string().describe("Human-readable team name, e.g. 'Marketing'."),
7
+ slug: z.string().describe("URL-safe identifier, e.g. 'marketing'. Lowercase, hyphens instead of spaces."),
8
+ description: z.string().max(500).optional().describe("What the team is for. Shown in the admin UI. Omit it if the user did not say."),
9
+ roles: z.array(z.string()).describe("Roles from listRoles. Prefer the `id`; a `slug` is accepted and resolved for you. Resolve them with listRoles first, since an unknown value is rejected rather than stored.")
10
+ });
11
+ class CreateTeamToolHandlerImpl {
12
+ constructor(createTeam){
13
+ this.createTeam = createTeam;
14
+ }
15
+ async execute(input) {
16
+ const result = await this.createTeam.execute({
17
+ name: input.name,
18
+ slug: input.slug,
19
+ description: descriptionOnCreate(input.description),
20
+ roles: input.roles
21
+ });
22
+ if (result.isFail()) throw new Error(`Could not create the team: ${result.error.message}`);
23
+ const team = result.value;
24
+ return {
25
+ id: team.id,
26
+ name: team.name,
27
+ slug: team.slug,
28
+ roles: team.roles
29
+ };
30
+ }
31
+ }
32
+ const CreateTeamToolHandler = AiSdkToolHandler.createImplementation({
33
+ implementation: CreateTeamToolHandlerImpl,
34
+ dependencies: [
35
+ CreateTeam
36
+ ]
37
+ });
38
+ class CreateTeamToolImpl {
39
+ constructor(){
40
+ this.name = "createTeam";
41
+ this.title = "Create team";
42
+ this.description = "Creates a team with a set of roles. Call listRoles first and pass what it returns; do not guess role identifiers. Requires user approval.";
43
+ this.inputSchema = inputSchema;
44
+ this.annotations = {
45
+ readOnlyHint: false
46
+ };
47
+ this.handler = CreateTeamToolHandler;
48
+ }
49
+ }
50
+ const CreateTeamTool = AiSdkToolDefinition.createImplementation({
51
+ implementation: CreateTeamToolImpl,
52
+ dependencies: []
53
+ });
54
+ export { CreateTeamTool };
55
+
56
+ //# sourceMappingURL=CreateTeamTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ai/CreateTeamTool.js","sources":["../../../src/features/ai/CreateTeamTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { CreateTeam } from \"@webiny/api-core/features/security/teams/CreateTeam/index.js\";\nimport { descriptionOnCreate } from \"@webiny/api-core/features/security/shared/index.js\";\n\nconst inputSchema = z.object({\n name: z.string().describe(\"Human-readable team name, e.g. 'Marketing'.\"),\n slug: z\n .string()\n .describe(\"URL-safe identifier, e.g. 'marketing'. Lowercase, hyphens instead of spaces.\"),\n /*\n * Optional and capped, mirroring the use case's own schema. Requiring it made the model invent a\n * description for every team; `CreateTeam` treats an absent one as empty via `descriptionOnCreate`.\n */\n description: z\n .string()\n .max(500)\n .optional()\n .describe(\"What the team is for. Shown in the admin UI. Omit it if the user did not say.\"),\n roles: z\n .array(z.string())\n .describe(\n \"Roles from listRoles. Prefer the `id`; a `slug` is accepted and resolved for you. Resolve them with listRoles first, since an unknown value is rejected rather than stored.\"\n )\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface CreatedTeam {\n id: string;\n name: string;\n slug: string;\n roles: string[];\n}\n\nclass CreateTeamToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(private createTeam: CreateTeam.Interface) {}\n\n async execute(input: Input): Promise<CreatedTeam> {\n /*\n * Roles go through untouched. `CreateTeam` accepts a role id or a slug and resolves either to\n * the id a team stores, so the tool has nothing to add: doing it here too would read the roles\n * a second time and leave two copies of the same rule to keep in step.\n */\n const result = await this.createTeam.execute({\n name: input.name,\n slug: input.slug,\n // An omitted description becomes \"\", the same mapping the use case applies to its own input.\n description: descriptionOnCreate(input.description),\n roles: input.roles\n });\n\n if (result.isFail()) {\n throw new Error(`Could not create the team: ${result.error.message}`);\n }\n\n const team = result.value;\n\n return {\n id: team.id,\n name: team.name,\n slug: team.slug,\n // From the created team, so the caller sees the resolved ids that were actually stored.\n roles: team.roles\n };\n }\n}\n\nconst CreateTeamToolHandler = AiSdkToolHandler.createImplementation({\n implementation: CreateTeamToolHandlerImpl,\n dependencies: [CreateTeam]\n});\n\n/**\n * Creates a team.\n *\n * Not read-only, so it needs approval: a team is an access-control object, and the roles it carries\n * decide what its members can do. The user should see which roles are being granted before it exists.\n */\nclass CreateTeamToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"createTeam\";\n readonly title = \"Create team\";\n readonly description =\n \"Creates a team with a set of roles. Call listRoles first and pass what it returns; do not guess role identifiers. Requires user approval.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: false };\n readonly handler = CreateTeamToolHandler;\n}\n\nexport const CreateTeamTool = AiSdkToolDefinition.createImplementation({\n implementation: CreateTeamToolImpl,\n dependencies: []\n});\n"],"names":["inputSchema","z","CreateTeamToolHandlerImpl","createTeam","input","result","descriptionOnCreate","Error","team","CreateTeamToolHandler","AiSdkToolHandler","CreateTeam","CreateTeamToolImpl","CreateTeamTool","AiSdkToolDefinition"],"mappings":";;;;AAKA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,MAAMA,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,MAAMA,EAAAA,MACK,GACN,QAAQ,CAAC;IAKd,aAAaA,EAAAA,MACF,GACN,GAAG,CAAC,KACJ,QAAQ,GACR,QAAQ,CAAC;IACd,OAAOA,EAAAA,KACG,CAACA,EAAE,MAAM,IACd,QAAQ,CACL;AAEZ;AAWA,MAAMC;IACF,YAAoBC,UAAgC,CAAE;aAAlCA,UAAU,GAAVA;IAAmC;IAEvD,MAAM,QAAQC,KAAY,EAAwB;QAM9C,MAAMC,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACzC,MAAMD,MAAM,IAAI;YAChB,MAAMA,MAAM,IAAI;YAEhB,aAAaE,oBAAoBF,MAAM,WAAW;YAClD,OAAOA,MAAM,KAAK;QACtB;QAEA,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIE,MAAM,CAAC,2BAA2B,EAAEF,OAAO,KAAK,CAAC,OAAO,EAAE;QAGxE,MAAMG,OAAOH,OAAO,KAAK;QAEzB,OAAO;YACH,IAAIG,KAAK,EAAE;YACX,MAAMA,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;YAEf,OAAOA,KAAK,KAAK;QACrB;IACJ;AACJ;AAEA,MAAMC,wBAAwBC,iBAAiB,oBAAoB,CAAC;IAChE,gBAAgBR;IAChB,cAAc;QAACS;KAAW;AAC9B;AAQA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGZ;aACd,WAAW,GAAG;YAAE,cAAc;QAAM;aACpC,OAAO,GAAGS;;AACvB;AAEO,MAAMI,iBAAiBC,oBAAoB,oBAAoB,CAAC;IACnE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { GetFolderUseCase } from "../../features/folder/GetFolder/index.js";
4
+ import { DeleteFolderUseCase } from "../../features/folder/DeleteFolder/index.js";
5
+ declare const inputSchema: z.ZodObject<{
6
+ folderId: z.ZodString;
7
+ title: z.ZodString;
8
+ }, z.core.$strip>;
9
+ type Input = z.infer<typeof inputSchema>;
10
+ interface DeletedFolder {
11
+ id: string;
12
+ title: string;
13
+ path: string;
14
+ type: string;
15
+ }
16
+ declare class DeleteFolderToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
17
+ private getFolder;
18
+ private deleteFolder;
19
+ constructor(getFolder: GetFolderUseCase.Interface, deleteFolder: DeleteFolderUseCase.Interface);
20
+ execute(input: Input): Promise<DeletedFolder>;
21
+ }
22
+ /**
23
+ * Deletes one folder.
24
+ *
25
+ * Destructive, so the approval says it cannot be undone. Only an empty folder can go: the folder
26
+ * feature refuses to delete one that still holds subfolders or content, and that error reaches the
27
+ * model as-is.
28
+ */
29
+ declare class DeleteFolderToolImpl implements AiSdkToolDefinition.Interface<Input> {
30
+ readonly name = "deleteFolder";
31
+ readonly title = "Delete folder";
32
+ readonly description = "Deletes one empty folder. Folders that still contain subfolders or content are refused. Call listFolders first for the id and exact title. Requires user approval.";
33
+ readonly inputSchema: z.ZodObject<{
34
+ folderId: z.ZodString;
35
+ title: z.ZodString;
36
+ }, z.core.$strip>;
37
+ readonly annotations: {
38
+ readOnlyHint: boolean;
39
+ destructiveHint: boolean;
40
+ };
41
+ readonly handler: typeof DeleteFolderToolHandlerImpl & {
42
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolHandler<any>>;
43
+ };
44
+ }
45
+ export declare const DeleteFolderTool: typeof DeleteFolderToolImpl & {
46
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolDefinition<any>>;
47
+ };
48
+ export {};
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { GetFolderUseCase } from "../folder/GetFolder/index.js";
4
+ import { DeleteFolderUseCase } from "../folder/DeleteFolder/index.js";
5
+ const inputSchema = z.object({
6
+ folderId: z.string().describe("Folder id as returned by listFolders."),
7
+ title: z.string().describe("The folder's current title, exactly as listFolders returned it. The delete is refused if it does not match.")
8
+ });
9
+ class DeleteFolderToolHandlerImpl {
10
+ constructor(getFolder, deleteFolder){
11
+ this.getFolder = getFolder;
12
+ this.deleteFolder = deleteFolder;
13
+ }
14
+ async execute(input) {
15
+ const found = await this.getFolder.execute(input.folderId);
16
+ if (found.isFail()) throw new Error(`Folder "${input.folderId}" not found: ${found.error.message}. Call listFolders for valid ids.`);
17
+ const folder = found.value;
18
+ if (folder.title !== input.title) throw new Error(`Folder "${input.folderId}" is titled "${folder.title}", not "${input.title}", so nothing was deleted. Check the folder with listFolders.`);
19
+ const result = await this.deleteFolder.execute(folder.id);
20
+ if (result.isFail()) throw new Error(`Could not delete the folder: ${result.error.message}`);
21
+ return {
22
+ id: folder.id,
23
+ title: folder.title,
24
+ path: folder.path,
25
+ type: folder.type
26
+ };
27
+ }
28
+ }
29
+ const DeleteFolderToolHandler = AiSdkToolHandler.createImplementation({
30
+ implementation: DeleteFolderToolHandlerImpl,
31
+ dependencies: [
32
+ GetFolderUseCase,
33
+ DeleteFolderUseCase
34
+ ]
35
+ });
36
+ class DeleteFolderToolImpl {
37
+ constructor(){
38
+ this.name = "deleteFolder";
39
+ this.title = "Delete folder";
40
+ this.description = "Deletes one empty folder. Folders that still contain subfolders or content are refused. Call listFolders first for the id and exact title. Requires user approval.";
41
+ this.inputSchema = inputSchema;
42
+ this.annotations = {
43
+ readOnlyHint: false,
44
+ destructiveHint: true
45
+ };
46
+ this.handler = DeleteFolderToolHandler;
47
+ }
48
+ }
49
+ const DeleteFolderTool = AiSdkToolDefinition.createImplementation({
50
+ implementation: DeleteFolderToolImpl,
51
+ dependencies: []
52
+ });
53
+ export { DeleteFolderTool };
54
+
55
+ //# sourceMappingURL=DeleteFolderTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ai/DeleteFolderTool.js","sources":["../../../src/features/ai/DeleteFolderTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { GetFolderUseCase } from \"~/features/folder/GetFolder/index.js\";\nimport { DeleteFolderUseCase } from \"~/features/folder/DeleteFolder/index.js\";\n\nconst inputSchema = z.object({\n folderId: z.string().describe(\"Folder id as returned by listFolders.\"),\n title: z\n .string()\n .describe(\n \"The folder's current title, exactly as listFolders returned it. The delete is refused if it does not match.\"\n )\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface DeletedFolder {\n id: string;\n title: string;\n path: string;\n type: string;\n}\n\n/*\n * The title is part of the input so the approval shows the user which folder goes, rather than only\n * an id. The model supplies it, so it is checked against the stored folder before anything is\n * deleted: what the user approved by name has to be the folder that is removed.\n */\nclass DeleteFolderToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(\n private getFolder: GetFolderUseCase.Interface,\n private deleteFolder: DeleteFolderUseCase.Interface\n ) {}\n\n async execute(input: Input): Promise<DeletedFolder> {\n const found = await this.getFolder.execute(input.folderId);\n\n if (found.isFail()) {\n throw new Error(\n `Folder \"${input.folderId}\" not found: ${found.error.message}. Call listFolders for valid ids.`\n );\n }\n\n const folder = found.value;\n\n if (folder.title !== input.title) {\n throw new Error(\n `Folder \"${input.folderId}\" is titled \"${folder.title}\", not \"${input.title}\", so nothing was deleted. Check the folder with listFolders.`\n );\n }\n\n const result = await this.deleteFolder.execute(folder.id);\n\n if (result.isFail()) {\n throw new Error(`Could not delete the folder: ${result.error.message}`);\n }\n\n return { id: folder.id, title: folder.title, path: folder.path, type: folder.type };\n }\n}\n\nconst DeleteFolderToolHandler = AiSdkToolHandler.createImplementation({\n implementation: DeleteFolderToolHandlerImpl,\n dependencies: [GetFolderUseCase, DeleteFolderUseCase]\n});\n\n/**\n * Deletes one folder.\n *\n * Destructive, so the approval says it cannot be undone. Only an empty folder can go: the folder\n * feature refuses to delete one that still holds subfolders or content, and that error reaches the\n * model as-is.\n */\nclass DeleteFolderToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"deleteFolder\";\n readonly title = \"Delete folder\";\n readonly description =\n \"Deletes one empty folder. Folders that still contain subfolders or content are refused. Call listFolders first for the id and exact title. Requires user approval.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: false, destructiveHint: true };\n readonly handler = DeleteFolderToolHandler;\n}\n\nexport const DeleteFolderTool = AiSdkToolDefinition.createImplementation({\n implementation: DeleteFolderToolImpl,\n dependencies: []\n});\n"],"names":["inputSchema","z","DeleteFolderToolHandlerImpl","getFolder","deleteFolder","input","found","Error","folder","result","DeleteFolderToolHandler","AiSdkToolHandler","GetFolderUseCase","DeleteFolderUseCase","DeleteFolderToolImpl","DeleteFolderTool","AiSdkToolDefinition"],"mappings":";;;;AAKA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,UAAUA,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,OAAOA,EAAAA,MACI,GACN,QAAQ,CACL;AAEZ;AAgBA,MAAMC;IACF,YACYC,SAAqC,EACrCC,YAA2C,CACrD;aAFUD,SAAS,GAATA;aACAC,YAAY,GAAZA;IACT;IAEH,MAAM,QAAQC,KAAY,EAA0B;QAChD,MAAMC,QAAQ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACD,MAAM,QAAQ;QAEzD,IAAIC,MAAM,MAAM,IACZ,MAAM,IAAIC,MACN,CAAC,QAAQ,EAAEF,MAAM,QAAQ,CAAC,aAAa,EAAEC,MAAM,KAAK,CAAC,OAAO,CAAC,iCAAiC,CAAC;QAIvG,MAAME,SAASF,MAAM,KAAK;QAE1B,IAAIE,OAAO,KAAK,KAAKH,MAAM,KAAK,EAC5B,MAAM,IAAIE,MACN,CAAC,QAAQ,EAAEF,MAAM,QAAQ,CAAC,aAAa,EAAEG,OAAO,KAAK,CAAC,QAAQ,EAAEH,MAAM,KAAK,CAAC,6DAA6D,CAAC;QAIlJ,MAAMI,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,OAAO,EAAE;QAExD,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIF,MAAM,CAAC,6BAA6B,EAAEE,OAAO,KAAK,CAAC,OAAO,EAAE;QAG1E,OAAO;YAAE,IAAID,OAAO,EAAE;YAAE,OAAOA,OAAO,KAAK;YAAE,MAAMA,OAAO,IAAI;YAAE,MAAMA,OAAO,IAAI;QAAC;IACtF;AACJ;AAEA,MAAME,0BAA0BC,iBAAiB,oBAAoB,CAAC;IAClE,gBAAgBT;IAChB,cAAc;QAACU;QAAkBC;KAAoB;AACzD;AASA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGd;aACd,WAAW,GAAG;YAAE,cAAc;YAAO,iBAAiB;QAAK;aAC3D,OAAO,GAAGU;;AACvB;AAEO,MAAMK,mBAAmBC,oBAAoB,oBAAoB,CAAC;IACrE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { ListTeamsUseCase } from "@webiny/api-core/features/security/teams/ListTeams/index.js";
4
+ import { GetFolderUseCase } from "../../features/folder/GetFolder/index.js";
5
+ import { UpdateFolderUseCase } from "../../features/folder/UpdateFolder/index.js";
6
+ declare const inputSchema: z.ZodObject<{
7
+ folderId: z.ZodString;
8
+ target: z.ZodString;
9
+ level: z.ZodEnum<{
10
+ editor: "editor";
11
+ "no-access": "no-access";
12
+ owner: "owner";
13
+ public: "public";
14
+ viewer: "viewer";
15
+ }>;
16
+ }, z.core.$strip>;
17
+ type Input = z.infer<typeof inputSchema>;
18
+ interface GrantResult {
19
+ folderId: string;
20
+ title: string;
21
+ path: string;
22
+ /**
23
+ * Every direct rule on the folder afterwards.
24
+ *
25
+ * This is the set the update was asked to store, not an independent read of it:
26
+ * `UpdateFolderWithFolderLevelPermissions` returns the permissions it derived from the input
27
+ * rather than the ones the repository wrote. Treating it as a verification would let the tool
28
+ * confirm its own request back to itself.
29
+ */
30
+ permissions: {
31
+ target: string;
32
+ level: string;
33
+ }[];
34
+ /** True when the target already had a direct rule and its level was changed. */
35
+ replacedExistingLevel?: string;
36
+ }
37
+ declare class GrantFolderAccessToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
38
+ private getFolder;
39
+ private updateFolder;
40
+ private listTeams;
41
+ constructor(getFolder: GetFolderUseCase.Interface, updateFolder: UpdateFolderUseCase.Interface, listTeams: ListTeamsUseCase.Interface);
42
+ execute(input: Input): Promise<GrantResult>;
43
+ }
44
+ /**
45
+ * Grants one target access to one folder, leaving every other rule alone.
46
+ *
47
+ * Additive by design. The earlier tool took the complete permission set and replaced it, which meant
48
+ * approving a change showed what would be SET and said nothing about what would be removed — a rule
49
+ * the model omitted disappeared silently. One target per call keeps the approval honest: what the user
50
+ * sees in the plan is the whole change.
51
+ */
52
+ declare class GrantFolderAccessToolImpl implements AiSdkToolDefinition.Interface<Input> {
53
+ readonly name = "grantFolderAccess";
54
+ readonly title = "Grant folder access";
55
+ readonly description = "Grants one team or user a level of access on one folder, leaving all other permissions untouched. Use listFolders for the folder id and listTeams for a team slug. Requires user approval.";
56
+ readonly inputSchema: z.ZodObject<{
57
+ folderId: z.ZodString;
58
+ target: z.ZodString;
59
+ level: z.ZodEnum<{
60
+ editor: "editor";
61
+ "no-access": "no-access";
62
+ owner: "owner";
63
+ public: "public";
64
+ viewer: "viewer";
65
+ }>;
66
+ }, z.core.$strip>;
67
+ readonly annotations: {
68
+ readOnlyHint: boolean;
69
+ };
70
+ readonly handler: typeof GrantFolderAccessToolHandlerImpl & {
71
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions.js").IAiSdkToolHandler<any>>;
72
+ };
73
+ }
74
+ export declare const GrantFolderAccessTool: typeof GrantFolderAccessToolImpl & {
75
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions.js").IAiSdkToolDefinition<any>>;
76
+ };
77
+ export {};
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { ListTeamsUseCase } from "@webiny/api-core/features/security/teams/ListTeams/index.js";
4
+ import { GetFolderUseCase } from "../folder/GetFolder/index.js";
5
+ import { UpdateFolderUseCase } from "../folder/UpdateFolder/index.js";
6
+ import { loadFolderPermissions } from "./loadFolderPermissions.js";
7
+ import { assertTargetIsUsable } from "./assertTargetIsUsable.js";
8
+ const ACCESS_LEVELS = [
9
+ "owner",
10
+ "editor",
11
+ "viewer",
12
+ "public",
13
+ "no-access"
14
+ ];
15
+ const inputSchema = z.object({
16
+ folderId: z.string().describe("Folder id as returned by listFolders."),
17
+ target: z.string().describe("Who to grant access to. A team is 'team:<slug>' — the SLUG, not the id. A user is 'admin:<userId>'. Resolve with listTeams first."),
18
+ level: z["enum"](ACCESS_LEVELS).describe("owner = full control including permissions; editor = change content; viewer = read only; no-access = explicitly denied.")
19
+ });
20
+ class GrantFolderAccessToolHandlerImpl {
21
+ constructor(getFolder, updateFolder, listTeams){
22
+ this.getFolder = getFolder;
23
+ this.updateFolder = updateFolder;
24
+ this.listTeams = listTeams;
25
+ }
26
+ async execute(input) {
27
+ const loaded = await loadFolderPermissions(this.getFolder, input.folderId);
28
+ await assertTargetIsUsable(this.listTeams, input.target, loaded.inheritedTargets);
29
+ const existing = loaded.direct.find((permission)=>String(permission.target) === input.target);
30
+ const permissions = loaded.direct.filter((permission)=>String(permission.target) !== input.target).concat([
31
+ {
32
+ target: input.target,
33
+ level: input.level
34
+ }
35
+ ]);
36
+ const result = await this.updateFolder.execute(input.folderId, {
37
+ permissions
38
+ });
39
+ if (result.isFail()) throw new Error(`Could not grant access: ${result.error.message}`);
40
+ const folder = result.value;
41
+ const granted = {
42
+ folderId: folder.id,
43
+ title: folder.title,
44
+ path: folder.path,
45
+ permissions: (folder.permissions ?? []).filter((permission)=>!permission.inheritedFrom).map((permission)=>({
46
+ target: String(permission.target),
47
+ level: permission.level
48
+ }))
49
+ };
50
+ if (existing) granted.replacedExistingLevel = existing.level;
51
+ return granted;
52
+ }
53
+ }
54
+ const GrantFolderAccessToolHandler = AiSdkToolHandler.createImplementation({
55
+ implementation: GrantFolderAccessToolHandlerImpl,
56
+ dependencies: [
57
+ GetFolderUseCase,
58
+ UpdateFolderUseCase,
59
+ ListTeamsUseCase
60
+ ]
61
+ });
62
+ class GrantFolderAccessToolImpl {
63
+ constructor(){
64
+ this.name = "grantFolderAccess";
65
+ this.title = "Grant folder access";
66
+ this.description = "Grants one team or user a level of access on one folder, leaving all other permissions untouched. Use listFolders for the folder id and listTeams for a team slug. Requires user approval.";
67
+ this.inputSchema = inputSchema;
68
+ this.annotations = {
69
+ readOnlyHint: false
70
+ };
71
+ this.handler = GrantFolderAccessToolHandler;
72
+ }
73
+ }
74
+ const GrantFolderAccessTool = AiSdkToolDefinition.createImplementation({
75
+ implementation: GrantFolderAccessToolImpl,
76
+ dependencies: []
77
+ });
78
+ export { GrantFolderAccessTool };
79
+
80
+ //# sourceMappingURL=GrantFolderAccessTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ai/GrantFolderAccessTool.js","sources":["../../../src/features/ai/GrantFolderAccessTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListTeamsUseCase } from \"@webiny/api-core/features/security/teams/ListTeams/index.js\";\nimport { GetFolderUseCase } from \"~/features/folder/GetFolder/index.js\";\nimport { UpdateFolderUseCase } from \"~/features/folder/UpdateFolder/index.js\";\nimport type { FolderPermission } from \"~/types.js\";\nimport { loadFolderPermissions } from \"./loadFolderPermissions.js\";\nimport { assertTargetIsUsable } from \"./assertTargetIsUsable.js\";\n\nconst ACCESS_LEVELS = [\"owner\", \"editor\", \"viewer\", \"public\", \"no-access\"] as const;\n\nconst inputSchema = z.object({\n folderId: z.string().describe(\"Folder id as returned by listFolders.\"),\n target: z\n .string()\n .describe(\n \"Who to grant access to. A team is 'team:<slug>' — the SLUG, not the id. A user is 'admin:<userId>'. Resolve with listTeams first.\"\n ),\n level: z\n .enum(ACCESS_LEVELS)\n .describe(\n \"owner = full control including permissions; editor = change content; viewer = read only; no-access = explicitly denied.\"\n )\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface GrantResult {\n folderId: string;\n title: string;\n path: string;\n /**\n * Every direct rule on the folder afterwards.\n *\n * This is the set the update was asked to store, not an independent read of it:\n * `UpdateFolderWithFolderLevelPermissions` returns the permissions it derived from the input\n * rather than the ones the repository wrote. Treating it as a verification would let the tool\n * confirm its own request back to itself.\n */\n permissions: { target: string; level: string }[];\n /** True when the target already had a direct rule and its level was changed. */\n replacedExistingLevel?: string;\n}\n\nclass GrantFolderAccessToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(\n private getFolder: GetFolderUseCase.Interface,\n private updateFolder: UpdateFolderUseCase.Interface,\n private listTeams: ListTeamsUseCase.Interface\n ) {}\n\n async execute(input: Input): Promise<GrantResult> {\n const loaded = await loadFolderPermissions(this.getFolder, input.folderId);\n\n await assertTargetIsUsable(this.listTeams, input.target, loaded.inheritedTargets);\n\n const existing = loaded.direct.find(\n permission => String(permission.target) === input.target\n );\n\n const permissions: FolderPermission[] = loaded.direct\n .filter(permission => String(permission.target) !== input.target)\n .concat([{ target: input.target, level: input.level } as FolderPermission]);\n\n const result = await this.updateFolder.execute(input.folderId, { permissions });\n\n if (result.isFail()) {\n throw new Error(`Could not grant access: ${result.error.message}`);\n }\n\n const folder = result.value;\n\n const granted: GrantResult = {\n folderId: folder.id,\n title: folder.title,\n path: folder.path,\n permissions: (folder.permissions ?? [])\n .filter(permission => !permission.inheritedFrom)\n .map(permission => ({ target: String(permission.target), level: permission.level }))\n };\n\n if (existing) {\n granted.replacedExistingLevel = existing.level;\n }\n\n return granted;\n }\n}\n\nconst GrantFolderAccessToolHandler = AiSdkToolHandler.createImplementation({\n implementation: GrantFolderAccessToolHandlerImpl,\n dependencies: [GetFolderUseCase, UpdateFolderUseCase, ListTeamsUseCase]\n});\n\n/**\n * Grants one target access to one folder, leaving every other rule alone.\n *\n * Additive by design. The earlier tool took the complete permission set and replaced it, which meant\n * approving a change showed what would be SET and said nothing about what would be removed — a rule\n * the model omitted disappeared silently. One target per call keeps the approval honest: what the user\n * sees in the plan is the whole change.\n */\nclass GrantFolderAccessToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"grantFolderAccess\";\n readonly title = \"Grant folder access\";\n readonly description =\n \"Grants one team or user a level of access on one folder, leaving all other permissions untouched. Use listFolders for the folder id and listTeams for a team slug. Requires user approval.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: false };\n readonly handler = GrantFolderAccessToolHandler;\n}\n\nexport const GrantFolderAccessTool = AiSdkToolDefinition.createImplementation({\n implementation: GrantFolderAccessToolImpl,\n dependencies: []\n});\n"],"names":["ACCESS_LEVELS","inputSchema","z","GrantFolderAccessToolHandlerImpl","getFolder","updateFolder","listTeams","input","loaded","loadFolderPermissions","assertTargetIsUsable","existing","permission","String","permissions","result","Error","folder","granted","GrantFolderAccessToolHandler","AiSdkToolHandler","GetFolderUseCase","UpdateFolderUseCase","ListTeamsUseCase","GrantFolderAccessToolImpl","GrantFolderAccessTool","AiSdkToolDefinition"],"mappings":";;;;;;;AASA,MAAMA,gBAAgB;IAAC;IAAS;IAAU;IAAU;IAAU;CAAY;AAE1E,MAAMC,cAAcC,EAAE,MAAM,CAAC;IACzB,UAAUA,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,QAAQA,EAAAA,MACG,GACN,QAAQ,CACL;IAER,OAAOA,CAAC,CAADA,OACE,CAACF,eACL,QAAQ,CACL;AAEZ;AAqBA,MAAMG;IACF,YACYC,SAAqC,EACrCC,YAA2C,EAC3CC,SAAqC,CAC/C;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QAAQC,KAAY,EAAwB;QAC9C,MAAMC,SAAS,MAAMC,sBAAsB,IAAI,CAAC,SAAS,EAAEF,MAAM,QAAQ;QAEzE,MAAMG,qBAAqB,IAAI,CAAC,SAAS,EAAEH,MAAM,MAAM,EAAEC,OAAO,gBAAgB;QAEhF,MAAMG,WAAWH,OAAO,MAAM,CAAC,IAAI,CAC/BI,CAAAA,aAAcC,OAAOD,WAAW,MAAM,MAAML,MAAM,MAAM;QAG5D,MAAMO,cAAkCN,OAAO,MAAM,CAChD,MAAM,CAACI,CAAAA,aAAcC,OAAOD,WAAW,MAAM,MAAML,MAAM,MAAM,EAC/D,MAAM,CAAC;YAAC;gBAAE,QAAQA,MAAM,MAAM;gBAAE,OAAOA,MAAM,KAAK;YAAC;SAAsB;QAE9E,MAAMQ,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACR,MAAM,QAAQ,EAAE;YAAEO;QAAY;QAE7E,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIC,MAAM,CAAC,wBAAwB,EAAED,OAAO,KAAK,CAAC,OAAO,EAAE;QAGrE,MAAME,SAASF,OAAO,KAAK;QAE3B,MAAMG,UAAuB;YACzB,UAAUD,OAAO,EAAE;YACnB,OAAOA,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,aAAcA,AAAAA,CAAAA,OAAO,WAAW,IAAI,EAAC,EAChC,MAAM,CAACL,CAAAA,aAAc,CAACA,WAAW,aAAa,EAC9C,GAAG,CAACA,CAAAA,aAAe;oBAAE,QAAQC,OAAOD,WAAW,MAAM;oBAAG,OAAOA,WAAW,KAAK;gBAAC;QACzF;QAEA,IAAID,UACAO,QAAQ,qBAAqB,GAAGP,SAAS,KAAK;QAGlD,OAAOO;IACX;AACJ;AAEA,MAAMC,+BAA+BC,iBAAiB,oBAAoB,CAAC;IACvE,gBAAgBjB;IAChB,cAAc;QAACkB;QAAkBC;QAAqBC;KAAiB;AAC3E;AAUA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGvB;aACd,WAAW,GAAG;YAAE,cAAc;QAAM;aACpC,OAAO,GAAGkB;;AACvB;AAEO,MAAMM,wBAAwBC,oBAAoB,oBAAoB,CAAC;IAC1E,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { ListFoldersUseCase } from "../../features/folder/ListFolders/index.js";
4
+ declare const inputSchema: z.ZodObject<{
5
+ type: z.ZodString;
6
+ }, z.core.$strip>;
7
+ type Input = z.infer<typeof inputSchema>;
8
+ interface FolderSummary {
9
+ id: string;
10
+ title: string;
11
+ slug: string;
12
+ path: string;
13
+ parentId?: string | null;
14
+ permissions: {
15
+ target: string;
16
+ level: string;
17
+ inherited: boolean;
18
+ }[];
19
+ }
20
+ declare class ListFoldersToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
21
+ private listFolders;
22
+ constructor(listFolders: ListFoldersUseCase.Interface);
23
+ execute(input: Input): Promise<FolderSummary[]>;
24
+ }
25
+ /**
26
+ * Lists folders with their current access rules, so a permission change is proposed against a real
27
+ * folder id and the user can see what the access already is before approving a change to it.
28
+ */
29
+ declare class ListFoldersToolImpl implements AiSdkToolDefinition.Interface<Input> {
30
+ readonly name = "listFolders";
31
+ readonly title = "List folders";
32
+ readonly description = "Lists folders of a given type with their ids, paths and current access permissions. Call this before changing folder permissions so the change targets a real folder.";
33
+ readonly inputSchema: z.ZodObject<{
34
+ type: z.ZodString;
35
+ }, z.core.$strip>;
36
+ readonly annotations: {
37
+ readOnlyHint: boolean;
38
+ idempotentHint: boolean;
39
+ };
40
+ readonly handler: typeof ListFoldersToolHandlerImpl & {
41
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolHandler<any>>;
42
+ };
43
+ }
44
+ export declare const ListFoldersTool: typeof ListFoldersToolImpl & {
45
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolDefinition<any>>;
46
+ };
47
+ export {};
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { ListFoldersUseCase } from "../folder/ListFolders/index.js";
4
+ const inputSchema = z.object({
5
+ type: z.string().describe("Folder namespace, e.g. 'FmFile' for the file manager or 'cms:<modelId>' for a content model's folders.")
6
+ });
7
+ class ListFoldersToolHandlerImpl {
8
+ constructor(listFolders){
9
+ this.listFolders = listFolders;
10
+ }
11
+ async execute(input) {
12
+ const result = await this.listFolders.execute({
13
+ where: {
14
+ type: input.type
15
+ }
16
+ });
17
+ if (result.isFail()) throw new Error(`Could not list folders: ${result.error.message}`);
18
+ return result.value.folders.map((folder)=>({
19
+ id: folder.id,
20
+ title: folder.title,
21
+ slug: folder.slug,
22
+ path: folder.path,
23
+ parentId: folder.parentId,
24
+ permissions: (folder.permissions ?? []).map((permission)=>({
25
+ target: permission.target,
26
+ level: permission.level,
27
+ inherited: Boolean(permission.inheritedFrom)
28
+ }))
29
+ }));
30
+ }
31
+ }
32
+ const ListFoldersToolHandler = AiSdkToolHandler.createImplementation({
33
+ implementation: ListFoldersToolHandlerImpl,
34
+ dependencies: [
35
+ ListFoldersUseCase
36
+ ]
37
+ });
38
+ class ListFoldersToolImpl {
39
+ constructor(){
40
+ this.name = "listFolders";
41
+ this.title = "List folders";
42
+ this.description = "Lists folders of a given type with their ids, paths and current access permissions. Call this before changing folder permissions so the change targets a real folder.";
43
+ this.inputSchema = inputSchema;
44
+ this.annotations = {
45
+ readOnlyHint: true,
46
+ idempotentHint: true
47
+ };
48
+ this.handler = ListFoldersToolHandler;
49
+ }
50
+ }
51
+ const ListFoldersTool = AiSdkToolDefinition.createImplementation({
52
+ implementation: ListFoldersToolImpl,
53
+ dependencies: []
54
+ });
55
+ export { ListFoldersTool };
56
+
57
+ //# sourceMappingURL=ListFoldersTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ai/ListFoldersTool.js","sources":["../../../src/features/ai/ListFoldersTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListFoldersUseCase } from \"~/features/folder/ListFolders/index.js\";\n\nconst inputSchema = z.object({\n type: z\n .string()\n .describe(\n \"Folder namespace, e.g. 'FmFile' for the file manager or 'cms:<modelId>' for a content model's folders.\"\n )\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface FolderSummary {\n id: string;\n title: string;\n slug: string;\n path: string;\n parentId?: string | null;\n permissions: { target: string; level: string; inherited: boolean }[];\n}\n\nclass ListFoldersToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(private listFolders: ListFoldersUseCase.Interface) {}\n\n async execute(input: Input): Promise<FolderSummary[]> {\n const result = await this.listFolders.execute({ where: { type: input.type } });\n\n if (result.isFail()) {\n throw new Error(`Could not list folders: ${result.error.message}`);\n }\n\n return result.value.folders.map(folder => ({\n id: folder.id,\n title: folder.title,\n slug: folder.slug,\n path: folder.path,\n parentId: folder.parentId,\n permissions: (folder.permissions ?? []).map(permission => ({\n target: permission.target,\n level: permission.level,\n // Inherited rules cannot be edited on this folder — only on the ancestor that set them.\n inherited: Boolean(permission.inheritedFrom)\n }))\n }));\n }\n}\n\nconst ListFoldersToolHandler = AiSdkToolHandler.createImplementation({\n implementation: ListFoldersToolHandlerImpl,\n dependencies: [ListFoldersUseCase]\n});\n\n/**\n * Lists folders with their current access rules, so a permission change is proposed against a real\n * folder id and the user can see what the access already is before approving a change to it.\n */\nclass ListFoldersToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"listFolders\";\n readonly title = \"List folders\";\n readonly description =\n \"Lists folders of a given type with their ids, paths and current access permissions. Call this before changing folder permissions so the change targets a real folder.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: true, idempotentHint: true };\n readonly handler = ListFoldersToolHandler;\n}\n\nexport const ListFoldersTool = AiSdkToolDefinition.createImplementation({\n implementation: ListFoldersToolImpl,\n dependencies: []\n});\n"],"names":["inputSchema","z","ListFoldersToolHandlerImpl","listFolders","input","result","Error","folder","permission","Boolean","ListFoldersToolHandler","AiSdkToolHandler","ListFoldersUseCase","ListFoldersToolImpl","ListFoldersTool","AiSdkToolDefinition"],"mappings":";;;AAIA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,MAAMA,EAAAA,MACK,GACN,QAAQ,CACL;AAEZ;AAaA,MAAMC;IACF,YAAoBC,WAAyC,CAAE;aAA3CA,WAAW,GAAXA;IAA4C;IAEhE,MAAM,QAAQC,KAAY,EAA4B;QAClD,MAAMC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO;gBAAE,MAAMD,MAAM,IAAI;YAAC;QAAE;QAE5E,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIC,MAAM,CAAC,wBAAwB,EAAED,OAAO,KAAK,CAAC,OAAO,EAAE;QAGrE,OAAOA,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAACE,CAAAA,SAAW;gBACvC,IAAIA,OAAO,EAAE;gBACb,OAAOA,OAAO,KAAK;gBACnB,MAAMA,OAAO,IAAI;gBACjB,MAAMA,OAAO,IAAI;gBACjB,UAAUA,OAAO,QAAQ;gBACzB,aAAcA,AAAAA,CAAAA,OAAO,WAAW,IAAI,EAAC,EAAG,GAAG,CAACC,CAAAA,aAAe;wBACvD,QAAQA,WAAW,MAAM;wBACzB,OAAOA,WAAW,KAAK;wBAEvB,WAAWC,QAAQD,WAAW,aAAa;oBAC/C;YACJ;IACJ;AACJ;AAEA,MAAME,yBAAyBC,iBAAiB,oBAAoB,CAAC;IACjE,gBAAgBT;IAChB,cAAc;QAACU;KAAmB;AACtC;AAMA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGb;aACd,WAAW,GAAG;YAAE,cAAc;YAAM,gBAAgB;QAAK;aACzD,OAAO,GAAGU;;AACvB;AAEO,MAAMI,kBAAkBC,oBAAoB,oBAAoB,CAAC;IACpE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}