@acquis-consulting/asm 1.0.5

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 (203) hide show
  1. package/README.md +0 -0
  2. package/dist/apps/gitDiffReview/gitDiffParser.d.ts +6 -0
  3. package/dist/apps/gitDiffReview/gitDiffParser.js +1 -0
  4. package/dist/apps/gitDiffReview/packageXml.d.ts +8 -0
  5. package/dist/apps/gitDiffReview/packageXml.js +1 -0
  6. package/dist/apps/gitDiffReview/tools.d.ts +42 -0
  7. package/dist/apps/gitDiffReview/tools.js +1 -0
  8. package/dist/apps/gitDiffReview/types.d.ts +19 -0
  9. package/dist/apps/gitDiffReview/types.js +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +193 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/metadata-diff.html +98 -0
  14. package/dist/tools/aggregateQuery.d.ts +85 -0
  15. package/dist/tools/aggregateQuery.js +110 -0
  16. package/dist/tools/aggregateQuery.js.map +1 -0
  17. package/dist/tools/bulkExportAbort.d.ts +37 -0
  18. package/dist/tools/bulkExportAbort.js +44 -0
  19. package/dist/tools/bulkExportAbort.js.map +1 -0
  20. package/dist/tools/bulkExportResults.d.ts +51 -0
  21. package/dist/tools/bulkExportResults.js +76 -0
  22. package/dist/tools/bulkExportResults.js.map +1 -0
  23. package/dist/tools/bulkExportStart.d.ts +61 -0
  24. package/dist/tools/bulkExportStart.js +68 -0
  25. package/dist/tools/bulkExportStart.js.map +1 -0
  26. package/dist/tools/bulkExportStatus.d.ts +37 -0
  27. package/dist/tools/bulkExportStatus.js +54 -0
  28. package/dist/tools/bulkExportStatus.js.map +1 -0
  29. package/dist/tools/crossObjectSearch.d.ts +155 -0
  30. package/dist/tools/crossObjectSearch.js +145 -0
  31. package/dist/tools/crossObjectSearch.js.map +1 -0
  32. package/dist/tools/debugLogs.d.ts +106 -0
  33. package/dist/tools/debugLogs.js +189 -0
  34. package/dist/tools/debugLogs.js.map +1 -0
  35. package/dist/tools/deployMetadata.d.ts +60 -0
  36. package/dist/tools/deployMetadata.js +106 -0
  37. package/dist/tools/deployMetadata.js.map +1 -0
  38. package/dist/tools/deployPackage.d.ts +49 -0
  39. package/dist/tools/deployPackage.js +1 -0
  40. package/dist/tools/dml.d.ts +70 -0
  41. package/dist/tools/dml.js +105 -0
  42. package/dist/tools/dml.js.map +1 -0
  43. package/dist/tools/dmlDelete.d.ts +51 -0
  44. package/dist/tools/dmlDelete.js +71 -0
  45. package/dist/tools/dmlDelete.js.map +1 -0
  46. package/dist/tools/executeAnonymous.d.ts +63 -0
  47. package/dist/tools/executeAnonymous.js +77 -0
  48. package/dist/tools/executeAnonymous.js.map +1 -0
  49. package/dist/tools/fieldManagement.d.ts +222 -0
  50. package/dist/tools/fieldManagement.js +234 -0
  51. package/dist/tools/fieldManagement.js.map +1 -0
  52. package/dist/tools/fieldPermissions.d.ts +94 -0
  53. package/dist/tools/fieldPermissions.js +191 -0
  54. package/dist/tools/fieldPermissions.js.map +1 -0
  55. package/dist/tools/getDependencies.d.ts +58 -0
  56. package/dist/tools/getDependencies.js +105 -0
  57. package/dist/tools/getDependencies.js.map +1 -0
  58. package/dist/tools/listUserPermissions.d.ts +36 -0
  59. package/dist/tools/listUserPermissions.js +59 -0
  60. package/dist/tools/listUserPermissions.js.map +1 -0
  61. package/dist/tools/metadataDescribe.d.ts +37 -0
  62. package/dist/tools/metadataDescribe.js +35 -0
  63. package/dist/tools/metadataDescribe.js.map +1 -0
  64. package/dist/tools/metadataDiff.d.ts +66 -0
  65. package/dist/tools/metadataDiff.js +215 -0
  66. package/dist/tools/metadataDiff.js.map +1 -0
  67. package/dist/tools/metadataDiffFileDetail.d.ts +44 -0
  68. package/dist/tools/metadataDiffFileDetail.js +84 -0
  69. package/dist/tools/metadataDiffFileDetail.js.map +1 -0
  70. package/dist/tools/metadataDiffFiles.d.ts +37 -0
  71. package/dist/tools/metadataDiffFiles.js +72 -0
  72. package/dist/tools/metadataDiffFiles.js.map +1 -0
  73. package/dist/tools/metadataDiffGeneratePackage.d.ts +73 -0
  74. package/dist/tools/metadataDiffGeneratePackage.js +122 -0
  75. package/dist/tools/metadataDiffGeneratePackage.js.map +1 -0
  76. package/dist/tools/metadataImport.d.ts +63 -0
  77. package/dist/tools/metadataImport.js +122 -0
  78. package/dist/tools/metadataImport.js.map +1 -0
  79. package/dist/tools/metadataJobStatus.d.ts +44 -0
  80. package/dist/tools/metadataJobStatus.js +101 -0
  81. package/dist/tools/metadataJobStatus.js.map +1 -0
  82. package/dist/tools/metadataList.d.ts +44 -0
  83. package/dist/tools/metadataList.js +49 -0
  84. package/dist/tools/metadataList.js.map +1 -0
  85. package/dist/tools/metadataRead.d.ts +47 -0
  86. package/dist/tools/metadataRead.js +52 -0
  87. package/dist/tools/metadataRead.js.map +1 -0
  88. package/dist/tools/metadataTypeSchema.d.ts +44 -0
  89. package/dist/tools/metadataTypeSchema.js +101 -0
  90. package/dist/tools/metadataTypeSchema.js.map +1 -0
  91. package/dist/tools/metadataWsdl.d.ts +19 -0
  92. package/dist/tools/metadataWsdl.js +1 -0
  93. package/dist/tools/objectManagement.d.ts +107 -0
  94. package/dist/tools/objectManagement.js +123 -0
  95. package/dist/tools/objectManagement.js.map +1 -0
  96. package/dist/tools/objectPermissions.d.ts +101 -0
  97. package/dist/tools/objectPermissions.js +157 -0
  98. package/dist/tools/objectPermissions.js.map +1 -0
  99. package/dist/tools/objectSchema.d.ts +37 -0
  100. package/dist/tools/objectSchema.js +66 -0
  101. package/dist/tools/objectSchema.js.map +1 -0
  102. package/dist/tools/objectSearch.d.ts +37 -0
  103. package/dist/tools/objectSearch.js +44 -0
  104. package/dist/tools/objectSearch.js.map +1 -0
  105. package/dist/tools/packageStatus.d.ts +24 -0
  106. package/dist/tools/packageStatus.js +1 -0
  107. package/dist/tools/permissionSetAssignment.d.ts +39 -0
  108. package/dist/tools/permissionSetAssignment.js +1 -0
  109. package/dist/tools/readApexClasses.d.ts +50 -0
  110. package/dist/tools/readApexClasses.js +83 -0
  111. package/dist/tools/readApexClasses.js.map +1 -0
  112. package/dist/tools/readApexTriggers.d.ts +50 -0
  113. package/dist/tools/readApexTriggers.js +82 -0
  114. package/dist/tools/readApexTriggers.js.map +1 -0
  115. package/dist/tools/recordPicker.d.ts +48 -0
  116. package/dist/tools/recordPicker.js +1 -0
  117. package/dist/tools/recordQuery.d.ts +68 -0
  118. package/dist/tools/recordQuery.js +131 -0
  119. package/dist/tools/recordQuery.js.map +1 -0
  120. package/dist/tools/retrieveJobStatus.d.ts +51 -0
  121. package/dist/tools/retrieveJobStatus.js +192 -0
  122. package/dist/tools/retrieveJobStatus.js.map +1 -0
  123. package/dist/tools/retrieveMetadata.d.ts +79 -0
  124. package/dist/tools/retrieveMetadata.js +225 -0
  125. package/dist/tools/retrieveMetadata.js.map +1 -0
  126. package/dist/tools/retrievePackage.d.ts +37 -0
  127. package/dist/tools/retrievePackage.js +1 -0
  128. package/dist/tools/salesforceLogin.d.ts +36 -0
  129. package/dist/tools/salesforceLogin.js +75 -0
  130. package/dist/tools/salesforceLogin.js.map +1 -0
  131. package/dist/tools/selectOrg.d.ts +25 -0
  132. package/dist/tools/selectOrg.js +91 -0
  133. package/dist/tools/selectOrg.js.map +1 -0
  134. package/dist/tools/toolingQuery.d.ts +37 -0
  135. package/dist/tools/toolingQuery.js +54 -0
  136. package/dist/tools/toolingQuery.js.map +1 -0
  137. package/dist/tools/userPermissions.d.ts +76 -0
  138. package/dist/tools/userPermissions.js +130 -0
  139. package/dist/tools/userPermissions.js.map +1 -0
  140. package/dist/tools/versionMetadataComplete.d.ts +45 -0
  141. package/dist/tools/versionMetadataComplete.js +1 -0
  142. package/dist/tools/versionMetadataStart.d.ts +25 -0
  143. package/dist/tools/versionMetadataStart.js +1 -0
  144. package/dist/tools/versionMetadataStatus.d.ts +25 -0
  145. package/dist/tools/versionMetadataStatus.js +1 -0
  146. package/dist/tools/writeApexClasses.d.ts +64 -0
  147. package/dist/tools/writeApexClasses.js +79 -0
  148. package/dist/tools/writeApexClasses.js.map +1 -0
  149. package/dist/tools/writeApexTriggers.d.ts +71 -0
  150. package/dist/tools/writeApexTriggers.js +96 -0
  151. package/dist/tools/writeApexTriggers.js.map +1 -0
  152. package/dist/types/connection.d.ts +20 -0
  153. package/dist/types/connection.js +9 -0
  154. package/dist/types/connection.js.map +1 -0
  155. package/dist/types/index.d.ts +3 -0
  156. package/dist/types/index.js +4 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/metadata.d.ts +44 -0
  159. package/dist/types/metadata.js +2 -0
  160. package/dist/types/metadata.js.map +1 -0
  161. package/dist/types/salesforce.d.ts +38 -0
  162. package/dist/types/salesforce.js +2 -0
  163. package/dist/types/salesforce.js.map +1 -0
  164. package/dist/utils/apexContainer.d.ts +18 -0
  165. package/dist/utils/apexContainer.js +79 -0
  166. package/dist/utils/apexContainer.js.map +1 -0
  167. package/dist/utils/connection.d.ts +3 -0
  168. package/dist/utils/connection.js +135 -0
  169. package/dist/utils/connection.js.map +1 -0
  170. package/dist/utils/decomposePermissions.d.ts +16 -0
  171. package/dist/utils/decomposePermissions.js +188 -0
  172. package/dist/utils/decomposePermissions.js.map +1 -0
  173. package/dist/utils/dxPathMapper.d.ts +16 -0
  174. package/dist/utils/dxPathMapper.js +217 -0
  175. package/dist/utils/dxPathMapper.js.map +1 -0
  176. package/dist/utils/errors.d.ts +8 -0
  177. package/dist/utils/errors.js +40 -0
  178. package/dist/utils/errors.js.map +1 -0
  179. package/dist/utils/index.d.ts +2 -0
  180. package/dist/utils/index.js +3 -0
  181. package/dist/utils/index.js.map +1 -0
  182. package/dist/utils/oauthWebFlow.d.ts +8 -0
  183. package/dist/utils/oauthWebFlow.js +172 -0
  184. package/dist/utils/oauthWebFlow.js.map +1 -0
  185. package/dist/utils/packageJobs.d.ts +17 -0
  186. package/dist/utils/packageJobs.js +1 -0
  187. package/dist/utils/packageXml.d.ts +18 -0
  188. package/dist/utils/packageXml.js +1 -0
  189. package/dist/utils/permissionSetResolver.d.ts +14 -0
  190. package/dist/utils/permissionSetResolver.js +1 -0
  191. package/dist/utils/preSelectMatcher.d.ts +18 -0
  192. package/dist/utils/preSelectMatcher.js +1 -0
  193. package/dist/utils/profileCleanup.d.ts +18 -0
  194. package/dist/utils/profileCleanup.js +1 -0
  195. package/dist/utils/retrieveStore.d.ts +12 -0
  196. package/dist/utils/retrieveStore.js +1 -0
  197. package/dist/utils/sfCli.d.ts +18 -0
  198. package/dist/utils/sfCli.js +130 -0
  199. package/dist/utils/sfCli.js.map +1 -0
  200. package/dist/utils/tokenBroker.d.ts +13 -0
  201. package/dist/utils/tokenBroker.js +73 -0
  202. package/dist/utils/tokenBroker.js.map +1 -0
  203. package/package.json +54 -0
@@ -0,0 +1,191 @@
1
+ import { z } from 'zod/v4';
2
+ import { toolResponse } from '../utils/index.js';
3
+ export const fieldPermissionsTool = {
4
+ name: 'salesforce_manage_field_permissions',
5
+ description: 'View, grant, or revoke Field Level Security (FLS) for a field across profiles and permission sets.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ operation: {
10
+ type: 'string',
11
+ enum: ['grant', 'revoke', 'list'],
12
+ description: "'list' = show which profiles/permission sets have access. 'grant' = add read/edit access. 'revoke' = remove access.",
13
+ },
14
+ objectName: {
15
+ type: 'string',
16
+ description: 'The object API name.',
17
+ },
18
+ fieldName: {
19
+ type: 'string',
20
+ description: 'The field API name. __c suffix is added automatically if needed.',
21
+ },
22
+ profileNames: {
23
+ type: 'array',
24
+ items: { type: 'string' },
25
+ description: "Profile names. For grant/revoke: default ['System Administrator'] if neither profileNames nor permissionSetNames is provided. For list: optional filter.",
26
+ },
27
+ permissionSetNames: {
28
+ type: 'array',
29
+ items: { type: 'string' },
30
+ description: 'Permission Set API names or labels to target. Supports standalone permission sets (not profile-owned).',
31
+ },
32
+ readable: {
33
+ type: 'boolean',
34
+ description: 'Grant read access. Default: true.',
35
+ },
36
+ editable: {
37
+ type: 'boolean',
38
+ description: 'Grant edit access. Default: true. Requires readable.',
39
+ },
40
+ },
41
+ required: ['operation', 'objectName', 'fieldName'],
42
+ },
43
+ };
44
+ function normalizeFieldName(fieldName) {
45
+ if (fieldName.includes('.'))
46
+ return fieldName;
47
+ if (fieldName.endsWith('__c'))
48
+ return fieldName;
49
+ return `${fieldName}__c`;
50
+ }
51
+ export async function handleFieldPermissions(conn, args) {
52
+ const { operation, objectName } = args;
53
+ const fieldName = normalizeFieldName(args.fieldName);
54
+ const fieldKey = `${objectName}.${fieldName}`;
55
+ try {
56
+ if (operation === 'list') {
57
+ const filterProfiles = args.profileNames || [];
58
+ const filterPermSets = args.permissionSetNames || [];
59
+ let parentIdFilter = '';
60
+ if (filterProfiles.length > 0 || filterPermSets.length > 0) {
61
+ const permSetIds = [];
62
+ for (const name of filterProfiles) {
63
+ const profResult = await conn.query(`SELECT Id FROM Profile WHERE Name = '${name.replace(/'/g, "\\'")}'`);
64
+ if (profResult.records?.length) {
65
+ const profileId = profResult.records[0].Id;
66
+ const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE ProfileId = '${profileId}' AND IsOwnedByProfile = true`);
67
+ if (psResult.records?.length)
68
+ permSetIds.push(psResult.records[0].Id);
69
+ }
70
+ }
71
+ for (const name of filterPermSets) {
72
+ const escaped = name.replace(/'/g, "\\'");
73
+ const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE IsOwnedByProfile = false AND (Name = '${escaped}' OR Label = '${escaped}')`);
74
+ if (psResult.records?.length)
75
+ permSetIds.push(psResult.records[0].Id);
76
+ }
77
+ if (permSetIds.length === 0) {
78
+ return toolResponse('None of the specified profiles or permission sets were found.', true);
79
+ }
80
+ parentIdFilter = ` AND ParentId IN ('${permSetIds.join("','")}')`;
81
+ }
82
+ const result = await conn.query(`SELECT Parent.Profile.Name, Parent.Label, PermissionsRead, PermissionsEdit FROM FieldPermissions WHERE SobjectType = '${objectName}' AND Field = '${fieldKey}'${parentIdFilter}`);
83
+ if (!result.records || result.records.length === 0) {
84
+ return toolResponse(`No explicit FLS grants found for ${fieldKey}. Admins have implicit access. Use operation "grant" to add access.`);
85
+ }
86
+ const lines = result.records.map((r) => {
87
+ const label = r.Parent?.Profile?.Name || r.Parent?.Label || '(Permission Set)';
88
+ const read = r.PermissionsRead ? 'Read' : '';
89
+ const edit = r.PermissionsEdit ? 'Edit' : '';
90
+ return `${label}: ${[read, edit].filter(Boolean).join(', ') || 'No access'}`;
91
+ });
92
+ return toolResponse(`Field permissions for ${fieldKey}:\n\n${lines.join('\n')}`);
93
+ }
94
+ const profileNames = args.profileNames || [];
95
+ const permissionSetNames = args.permissionSetNames || [];
96
+ // Default to System Administrator if neither provided
97
+ const effectiveProfiles = profileNames.length === 0 && permissionSetNames.length === 0
98
+ ? ['System Administrator']
99
+ : profileNames;
100
+ const readable = args.readable !== false;
101
+ const editable = args.editable !== false;
102
+ const results = [];
103
+ async function applyFls(permSetId, label) {
104
+ const existing = await conn.query(`SELECT Id FROM FieldPermissions WHERE ParentId = '${permSetId}' AND SobjectType = '${objectName}' AND Field = '${fieldKey}'`);
105
+ if (operation === 'grant') {
106
+ if (existing.records?.length) {
107
+ await conn.sobject('FieldPermissions').update({
108
+ Id: existing.records[0].Id,
109
+ PermissionsRead: readable,
110
+ PermissionsEdit: editable && readable,
111
+ });
112
+ }
113
+ else {
114
+ await conn.sobject('FieldPermissions').create({
115
+ ParentId: permSetId,
116
+ SobjectType: objectName,
117
+ Field: fieldKey,
118
+ PermissionsRead: readable,
119
+ PermissionsEdit: editable && readable,
120
+ });
121
+ }
122
+ results.push(`Granted to "${label}" (read: ${readable}, edit: ${editable && readable})`);
123
+ }
124
+ else {
125
+ if (existing.records?.length) {
126
+ await conn.sobject('FieldPermissions').destroy(existing.records[0].Id);
127
+ results.push(`Revoked from "${label}"`);
128
+ }
129
+ else {
130
+ results.push(`No existing permissions for "${label}"`);
131
+ }
132
+ }
133
+ }
134
+ // Process profiles
135
+ for (const name of effectiveProfiles) {
136
+ try {
137
+ const profResult = await conn.query(`SELECT Id FROM Profile WHERE Name = '${name.replace(/'/g, "\\'")}'`);
138
+ if (!profResult.records?.length) {
139
+ results.push(`Profile "${name}" not found`);
140
+ continue;
141
+ }
142
+ const profileId = profResult.records[0].Id;
143
+ const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE ProfileId = '${profileId}' AND IsOwnedByProfile = true`);
144
+ if (!psResult.records?.length) {
145
+ results.push(`No permission set for profile "${name}"`);
146
+ continue;
147
+ }
148
+ await applyFls(psResult.records[0].Id, name);
149
+ }
150
+ catch (err) {
151
+ results.push(`Failed for profile "${name}": ${err.message}`);
152
+ }
153
+ }
154
+ // Process standalone permission sets
155
+ for (const name of permissionSetNames) {
156
+ try {
157
+ const escaped = name.replace(/'/g, "\\'");
158
+ const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE IsOwnedByProfile = false AND (Name = '${escaped}' OR Label = '${escaped}')`);
159
+ if (!psResult.records?.length) {
160
+ results.push(`Permission Set "${name}" not found`);
161
+ continue;
162
+ }
163
+ await applyFls(psResult.records[0].Id, name);
164
+ }
165
+ catch (err) {
166
+ results.push(`Failed for permission set "${name}": ${err.message}`);
167
+ }
168
+ }
169
+ const verb = operation === 'grant' ? 'grant' : 'revoke';
170
+ return toolResponse(`FLS ${verb} results for ${fieldKey}:\n\n${results.join('\n')}`);
171
+ }
172
+ catch (error) {
173
+ return toolResponse(`Field permissions ${operation} failed: ${error.message}`, true);
174
+ }
175
+ }
176
+ export const fieldPermissionsSchema = {
177
+ operation: z.enum(['grant', 'revoke', 'list']).describe("'list' = show access. 'grant' = add access. 'revoke' = remove access."),
178
+ objectName: z.string().describe('The object API name.'),
179
+ fieldName: z.string().describe('The field API name. __c suffix is added automatically if needed.'),
180
+ profileNames: z.array(z.string()).describe("Profile names. Default: ['System Administrator'] if neither profileNames nor permissionSetNames is provided.").optional(),
181
+ permissionSetNames: z.array(z.string()).describe('Permission Set API names or labels (standalone, not profile-owned).').optional(),
182
+ readable: z.boolean().describe('Grant read access. Default: true.').optional(),
183
+ editable: z.boolean().describe('Grant edit access. Default: true. Requires readable.').optional(),
184
+ };
185
+ export const fieldPermissionsDescriptor = {
186
+ name: 'salesforce_manage_field_permissions',
187
+ description: fieldPermissionsTool.description,
188
+ schema: fieldPermissionsSchema,
189
+ handler: handleFieldPermissions,
190
+ };
191
+ //# sourceMappingURL=fieldPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldPermissions.js","sourceRoot":"","sources":["../../src/tools/fieldPermissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EAAE,oGAAoG;IACjH,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;gBACjC,WAAW,EAAE,qHAAqH;aACnI;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kEAAkE;aAChF;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,0JAA0J;aACxK;YACD,kBAAkB,EAAE;gBAClB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,wGAAwG;aACtH;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,mCAAmC;aACjD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sDAAsD;aACpE;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;KACnD;CACF,CAAC;AAYF,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,GAAG,SAAS,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAgB,EAAE,IAA0B;IACvF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,cAAc,GAAa,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;YACzD,MAAM,cAAc,GAAa,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;YAE/D,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;gBAEhC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;oBAClC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,wCAAwC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC1G,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;wBAC/B,MAAM,SAAS,GAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,CAAC;wBACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mDAAmD,SAAS,+BAA+B,CAAC,CAAC;wBAC/H,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM;4BAAE,UAAU,CAAC,IAAI,CAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,4EAA4E,OAAO,iBAAiB,OAAO,IAAI,CAAC,CAAC;oBACnJ,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM;wBAAE,UAAU,CAAC,IAAI,CAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;gBAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,YAAY,CAAC,+DAA+D,EAAE,IAAI,CAAC,CAAC;gBAC7F,CAAC;gBACD,cAAc,GAAG,sBAAsB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACpE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,yHAAyH,UAAU,kBAAkB,QAAQ,IAAI,cAAc,EAAE,CAClL,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO,YAAY,CAAC,oCAAoC,QAAQ,qEAAqE,CAAC,CAAC;YACzI,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,kBAAkB,CAAC;gBAC/E,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,OAAO,GAAG,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;YAC/E,CAAC,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC,yBAAyB,QAAQ,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,YAAY,GAAa,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QACvD,MAAM,kBAAkB,GAAa,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAEnE,sDAAsD;QACtD,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;YACpF,CAAC,CAAC,CAAC,sBAAsB,CAAC;YAC1B,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC;QACzC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,KAAa;YACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,qDAAqD,SAAS,wBAAwB,UAAU,kBAAkB,QAAQ,GAAG,CAC9H,CAAC;YACF,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;wBAC5C,EAAE,EAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE;wBACnC,eAAe,EAAE,QAAQ;wBACzB,eAAe,EAAE,QAAQ,IAAI,QAAQ;qBACtC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;wBAC5C,QAAQ,EAAE,SAAS;wBACnB,WAAW,EAAE,UAAU;wBACvB,KAAK,EAAE,QAAQ;wBACf,eAAe,EAAE,QAAQ;wBACzB,eAAe,EAAE,QAAQ,IAAI,QAAQ;qBACtC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,QAAQ,WAAW,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACN,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,CAAC,CAAC;oBAChF,OAAO,CAAC,IAAI,CAAC,iBAAiB,KAAK,GAAG,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,GAAG,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CACjC,wCAAwC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CACrE,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC3F,MAAM,SAAS,GAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,CAAC;gBAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,mDAAmD,SAAS,+BAA+B,CAC5F,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAErG,MAAM,QAAQ,CAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,uBAAuB,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,4EAA4E,OAAO,iBAAiB,OAAO,IAAI,CAChH,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,aAAa,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAEhG,MAAM,QAAQ,CAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxD,OAAO,YAAY,CAAC,OAAO,IAAI,gBAAgB,QAAQ,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,qBAAqB,SAAS,YAAY,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,uEAAuE,CAAC;IAChI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;IAClG,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,8GAA8G,CAAC,CAAC,QAAQ,EAAE;IACrK,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC,QAAQ,EAAE;IAClI,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,QAAQ,EAAE;IAC9E,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC,CAAC,QAAQ,EAAE;CAClG,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EAAE,oBAAoB,CAAC,WAAW;IAC7C,MAAM,EAAE,sBAAsB;IAC9B,OAAO,EAAE,sBAAsB;CAChC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Connection } from 'jsforce';
2
+ import { z } from 'zod/v4';
3
+ export declare const getDependenciesTool: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: "object";
8
+ properties: {
9
+ componentId: {
10
+ type: string;
11
+ description: string;
12
+ };
13
+ direction: {
14
+ type: string;
15
+ enum: string[];
16
+ description: string;
17
+ };
18
+ depth: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ };
23
+ required: string[];
24
+ };
25
+ };
26
+ export interface GetDependenciesArgs {
27
+ componentId: string;
28
+ direction?: 'forward' | 'reverse';
29
+ depth?: number;
30
+ }
31
+ export declare function handleGetDependencies(conn: Connection, args: GetDependenciesArgs): Promise<{
32
+ content: {
33
+ type: "text";
34
+ text: string;
35
+ }[];
36
+ isError: boolean;
37
+ }>;
38
+ export declare const getDependenciesSchema: {
39
+ componentId: z.ZodString;
40
+ direction: z.ZodOptional<z.ZodEnum<{
41
+ reverse: "reverse";
42
+ forward: "forward";
43
+ }>>;
44
+ depth: z.ZodOptional<z.ZodNumber>;
45
+ };
46
+ export declare const getDependenciesDescriptor: {
47
+ name: string;
48
+ description: string;
49
+ schema: {
50
+ componentId: z.ZodString;
51
+ direction: z.ZodOptional<z.ZodEnum<{
52
+ reverse: "reverse";
53
+ forward: "forward";
54
+ }>>;
55
+ depth: z.ZodOptional<z.ZodNumber>;
56
+ };
57
+ handler: typeof handleGetDependencies;
58
+ };
@@ -0,0 +1,105 @@
1
+ import { z } from 'zod/v4';
2
+ import { toolResponse } from '../utils/index.js';
3
+ export const getDependenciesTool = {
4
+ name: 'salesforce_get_dependencies',
5
+ description: 'Analyze metadata component dependencies using the Tooling API MetadataComponentDependency object (Beta). Shows what a component depends on (forward) or what depends on it (reverse), with optional recursive traversal up to 3 levels deep. Useful for impact analysis before modifying Apex classes, triggers, fields, and other metadata.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ componentId: {
10
+ type: 'string',
11
+ description: 'The 15 or 18-character Salesforce ID of the metadata component to analyze.',
12
+ },
13
+ direction: {
14
+ type: 'string',
15
+ enum: ['forward', 'reverse'],
16
+ description: 'Direction of dependency lookup. "forward" = what this component depends on. "reverse" = what depends on this component. Default: "forward".',
17
+ },
18
+ depth: {
19
+ type: 'number',
20
+ description: 'Recursion depth for dependency traversal. 1 = direct dependencies only. Max 3. Default: 1.',
21
+ },
22
+ },
23
+ required: ['componentId'],
24
+ },
25
+ };
26
+ async function queryDependencies(conn, componentIds, direction) {
27
+ const idList = componentIds.map((id) => `'${id}'`).join(',');
28
+ const whereField = direction === 'forward' ? 'MetadataComponentId' : 'RefMetadataComponentId';
29
+ const soql = `SELECT MetadataComponentId, MetadataComponentName, MetadataComponentType, RefMetadataComponentId, RefMetadataComponentName, RefMetadataComponentType FROM MetadataComponentDependency WHERE ${whereField} IN (${idList})`;
30
+ const result = await conn.tooling.query(soql);
31
+ return (result.records || []);
32
+ }
33
+ function getTarget(record, direction) {
34
+ if (direction === 'forward') {
35
+ return { id: record.RefMetadataComponentId, name: record.RefMetadataComponentName, type: record.RefMetadataComponentType };
36
+ }
37
+ return { id: record.MetadataComponentId, name: record.MetadataComponentName, type: record.MetadataComponentType };
38
+ }
39
+ export async function handleGetDependencies(conn, args) {
40
+ const { componentId } = args;
41
+ const direction = args.direction || 'forward';
42
+ const depth = Math.min(Math.max(args.depth || 1, 1), 3);
43
+ if (direction !== 'forward' && direction !== 'reverse') {
44
+ return toolResponse('Invalid direction. Must be "forward" or "reverse".', true);
45
+ }
46
+ try {
47
+ const visited = new Set();
48
+ visited.add(componentId);
49
+ const allLevels = [];
50
+ let currentIds = [componentId];
51
+ let totalCount = 0;
52
+ for (let level = 1; level <= depth; level++) {
53
+ if (currentIds.length === 0)
54
+ break;
55
+ const records = await queryDependencies(conn, currentIds, direction);
56
+ const entryMap = new Map();
57
+ for (const record of records) {
58
+ const target = getTarget(record, direction);
59
+ if (!entryMap.has(target.id) && !visited.has(target.id)) {
60
+ entryMap.set(target.id, target);
61
+ }
62
+ }
63
+ const entries = Array.from(entryMap.values());
64
+ if (entries.length === 0)
65
+ break;
66
+ totalCount += entries.length;
67
+ allLevels.push({ level, entries });
68
+ currentIds = [];
69
+ for (const entry of entries) {
70
+ visited.add(entry.id);
71
+ currentIds.push(entry.id);
72
+ }
73
+ }
74
+ if (totalCount === 0) {
75
+ const dirLabel = direction === 'forward' ? 'dependencies' : 'dependents';
76
+ return toolResponse(`No ${dirLabel} found for component ${componentId}.`);
77
+ }
78
+ const dirLabel = direction === 'forward' ? 'Dependencies (what it depends on)' : 'Dependents (what depends on it)';
79
+ const lines = [`## ${dirLabel}`, `**Component:** ${componentId}`, `**Depth:** ${depth}`, `**Total:** ${totalCount}`, ''];
80
+ for (const { level, entries } of allLevels) {
81
+ lines.push(`### Level ${level}`);
82
+ for (const entry of entries) {
83
+ const indent = ' '.repeat(level - 1);
84
+ lines.push(`${indent}- ${entry.name} (${entry.type}) [${entry.id}]`);
85
+ }
86
+ lines.push('');
87
+ }
88
+ return toolResponse(lines.join('\n'));
89
+ }
90
+ catch (error) {
91
+ return toolResponse(`Dependency query failed: ${error.message}`, true);
92
+ }
93
+ }
94
+ export const getDependenciesSchema = {
95
+ componentId: z.string().describe('The 15 or 18-character Salesforce ID of the metadata component to analyze.'),
96
+ direction: z.enum(['forward', 'reverse']).describe('Direction of dependency lookup. "forward" = what this component depends on. "reverse" = what depends on this component. Default: "forward".').optional(),
97
+ depth: z.number().describe('Recursion depth for dependency traversal. 1 = direct dependencies only. Max 3. Default: 1.').optional(),
98
+ };
99
+ export const getDependenciesDescriptor = {
100
+ name: 'salesforce_get_dependencies',
101
+ description: getDependenciesTool.description,
102
+ schema: getDependenciesSchema,
103
+ handler: handleGetDependencies,
104
+ };
105
+ //# sourceMappingURL=getDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDependencies.js","sourceRoot":"","sources":["../../src/tools/getDependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Connection } from 'jsforce';
2
+ import { z } from 'zod/v4';
3
+ export declare const listUserPermissionsTool: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: "object";
8
+ properties: {
9
+ search: {
10
+ type: string;
11
+ description: string;
12
+ };
13
+ };
14
+ };
15
+ };
16
+ export interface ListUserPermissionsArgs {
17
+ search?: string;
18
+ }
19
+ export declare function handleListUserPermissions(conn: Connection, args: ListUserPermissionsArgs): Promise<{
20
+ content: {
21
+ type: "text";
22
+ text: string;
23
+ }[];
24
+ isError: boolean;
25
+ }>;
26
+ export declare const listUserPermissionsSchema: {
27
+ search: z.ZodOptional<z.ZodString>;
28
+ };
29
+ export declare const listUserPermissionsDescriptor: {
30
+ name: string;
31
+ description: string;
32
+ schema: {
33
+ search: z.ZodOptional<z.ZodString>;
34
+ };
35
+ handler: typeof handleListUserPermissions;
36
+ };
@@ -0,0 +1,59 @@
1
+ import { z } from 'zod/v4';
2
+ import { toolResponse } from '../utils/index.js';
3
+ export const listUserPermissionsTool = {
4
+ name: 'salesforce_list_user_permissions',
5
+ description: 'Discover all user/system permission flags that can be enabled or disabled on profiles and permission sets via salesforce_manage_user_permissions. Returns short name, full API field name, and label.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ search: {
10
+ type: 'string',
11
+ description: "Optional filter. Case-insensitive substring match against short name and label. Example: 'api'.",
12
+ },
13
+ },
14
+ },
15
+ };
16
+ export async function handleListUserPermissions(conn, args) {
17
+ try {
18
+ const describeResult = await conn.describe('PermissionSet');
19
+ const permFields = [];
20
+ for (const field of describeResult.fields) {
21
+ if (field.name?.startsWith('Permissions') && field.type === 'boolean') {
22
+ permFields.push({
23
+ apiName: field.name,
24
+ shortName: field.name.slice('Permissions'.length),
25
+ label: field.label,
26
+ });
27
+ }
28
+ }
29
+ permFields.sort((a, b) => a.shortName.localeCompare(b.shortName));
30
+ const search = args.search;
31
+ const filtered = search
32
+ ? permFields.filter((p) => p.shortName.toLowerCase().includes(search.toLowerCase()) ||
33
+ p.label.toLowerCase().includes(search.toLowerCase()))
34
+ : permFields;
35
+ if (!filtered.length) {
36
+ return toolResponse(search
37
+ ? `No user/system permissions found matching "${search}".`
38
+ : 'No user/system permission fields found on PermissionSet.');
39
+ }
40
+ const lines = filtered.map((p) => `${p.shortName} (${p.apiName}) — ${p.label}`);
41
+ const header = search
42
+ ? `User/system permissions matching "${search}" (${filtered.length} of ${permFields.length} total):\n`
43
+ : `All configurable user/system permissions (${filtered.length}):\n`;
44
+ return toolResponse(header + '\n' + lines.join('\n'));
45
+ }
46
+ catch (error) {
47
+ return toolResponse(`List user permissions failed: ${error.message}`, true);
48
+ }
49
+ }
50
+ export const listUserPermissionsSchema = {
51
+ search: z.string().describe("Optional filter. Case-insensitive substring match against short name and label.").optional(),
52
+ };
53
+ export const listUserPermissionsDescriptor = {
54
+ name: 'salesforce_list_user_permissions',
55
+ description: listUserPermissionsTool.description,
56
+ schema: listUserPermissionsSchema,
57
+ handler: handleListUserPermissions,
58
+ };
59
+ //# sourceMappingURL=listUserPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listUserPermissions.js","sourceRoot":"","sources":["../../src/tools/listUserPermissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Connection } from 'jsforce';
2
+ import { z } from 'zod/v4';
3
+ export declare const metadataDescribeTool: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: "object";
8
+ properties: {
9
+ apiVersion: {
10
+ type: string;
11
+ description: string;
12
+ };
13
+ };
14
+ required: never[];
15
+ };
16
+ };
17
+ export interface MetadataDescribeArgs {
18
+ apiVersion?: string;
19
+ }
20
+ export declare function handleMetadataDescribe(conn: Connection, args: MetadataDescribeArgs): Promise<{
21
+ content: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ isError: boolean;
26
+ }>;
27
+ export declare const metadataDescribeSchema: {
28
+ apiVersion: z.ZodOptional<z.ZodString>;
29
+ };
30
+ export declare const metadataDescribeDescriptor: {
31
+ name: string;
32
+ description: string;
33
+ schema: {
34
+ apiVersion: z.ZodOptional<z.ZodString>;
35
+ };
36
+ handler: typeof handleMetadataDescribe;
37
+ };
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod/v4';
2
+ import { toolResponse } from '../utils/index.js';
3
+ export const metadataDescribeTool = {
4
+ name: 'salesforce_list_metadata_types',
5
+ description: 'List all metadata types available in the Salesforce org. Essential starting point for org analysis — returns every metadata type (CustomObject, ValidationRule, Flow, ApexClass, etc.) with details on child types and folder requirements. Use this to discover what types can be passed to salesforce_list_metadata and salesforce_read_metadata.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ apiVersion: {
10
+ type: 'string',
11
+ description: 'API version to describe (e.g. "59.0"). Defaults to the connection version.',
12
+ },
13
+ },
14
+ required: [],
15
+ },
16
+ };
17
+ export async function handleMetadataDescribe(conn, args) {
18
+ try {
19
+ const result = await conn.metadata.describe(args.apiVersion || conn.version);
20
+ return toolResponse(JSON.stringify(result, null, 2));
21
+ }
22
+ catch (error) {
23
+ return toolResponse(`Metadata describe failed: ${error.message}`, true);
24
+ }
25
+ }
26
+ export const metadataDescribeSchema = {
27
+ apiVersion: z.string().describe('API version to describe (e.g. "59.0"). Defaults to the connection version.').optional(),
28
+ };
29
+ export const metadataDescribeDescriptor = {
30
+ name: 'salesforce_list_metadata_types',
31
+ description: metadataDescribeTool.description,
32
+ schema: metadataDescribeSchema,
33
+ handler: handleMetadataDescribe,
34
+ };
35
+ //# sourceMappingURL=metadataDescribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataDescribe.js","sourceRoot":"","sources":["../../src/tools/metadataDescribe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,gCAAgC;IACtC,WAAW,EAAE,qVAAqV;IAClW,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4EAA4E;aAC1F;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAgB,EAAE,IAA0B;IACvF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAO,IAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAK,IAAY,CAAC,OAAO,CAAC,CAAC;QAE/F,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4EAA4E,CAAC,CAAC,QAAQ,EAAE;CACzH,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,gCAAgC;IACtC,WAAW,EAAE,oBAAoB,CAAC,WAAW;IAC7C,MAAM,EAAE,sBAAsB;IAC9B,OAAO,EAAE,sBAAsB;CAChC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const metadataDiffTool: {
3
+ name: "salesforce_metadata_diff";
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ workingDir: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ };
13
+ required: string[];
14
+ };
15
+ };
16
+ export interface MetadataDiffArgs {
17
+ workingDir: string;
18
+ }
19
+ export interface DiffChange {
20
+ content: string;
21
+ type: 'insert' | 'delete' | 'normal';
22
+ oldLineNumber?: number;
23
+ newLineNumber?: number;
24
+ }
25
+ export interface DiffHunk {
26
+ oldStart: number;
27
+ newStart: number;
28
+ changes: DiffChange[];
29
+ }
30
+ export interface DiffFile {
31
+ oldPath: string;
32
+ newPath: string;
33
+ type: 'add' | 'delete' | 'modify' | 'rename';
34
+ metadataType: string | null;
35
+ componentName: string | null;
36
+ hunks: DiffHunk[];
37
+ }
38
+ export interface DiffResult {
39
+ workingDir: string;
40
+ summary: {
41
+ added: number;
42
+ modified: number;
43
+ deleted: number;
44
+ totalFiles: number;
45
+ };
46
+ files: DiffFile[];
47
+ }
48
+ export declare function handleMetadataDiff(args: MetadataDiffArgs): Promise<{
49
+ content: {
50
+ type: "text";
51
+ text: string;
52
+ }[];
53
+ isError: boolean;
54
+ }>;
55
+ export declare const metadataDiffSchema: {
56
+ workingDir: z.ZodString;
57
+ };
58
+ export declare const metadataDiffDescriptor: {
59
+ name: string;
60
+ description: string;
61
+ schema: {
62
+ workingDir: z.ZodString;
63
+ };
64
+ handler: typeof handleMetadataDiff;
65
+ noConnection: boolean;
66
+ };