@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.
- package/README.md +0 -0
- package/dist/apps/gitDiffReview/gitDiffParser.d.ts +6 -0
- package/dist/apps/gitDiffReview/gitDiffParser.js +1 -0
- package/dist/apps/gitDiffReview/packageXml.d.ts +8 -0
- package/dist/apps/gitDiffReview/packageXml.js +1 -0
- package/dist/apps/gitDiffReview/tools.d.ts +42 -0
- package/dist/apps/gitDiffReview/tools.js +1 -0
- package/dist/apps/gitDiffReview/types.d.ts +19 -0
- package/dist/apps/gitDiffReview/types.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata-diff.html +98 -0
- package/dist/tools/aggregateQuery.d.ts +85 -0
- package/dist/tools/aggregateQuery.js +110 -0
- package/dist/tools/aggregateQuery.js.map +1 -0
- package/dist/tools/bulkExportAbort.d.ts +37 -0
- package/dist/tools/bulkExportAbort.js +44 -0
- package/dist/tools/bulkExportAbort.js.map +1 -0
- package/dist/tools/bulkExportResults.d.ts +51 -0
- package/dist/tools/bulkExportResults.js +76 -0
- package/dist/tools/bulkExportResults.js.map +1 -0
- package/dist/tools/bulkExportStart.d.ts +61 -0
- package/dist/tools/bulkExportStart.js +68 -0
- package/dist/tools/bulkExportStart.js.map +1 -0
- package/dist/tools/bulkExportStatus.d.ts +37 -0
- package/dist/tools/bulkExportStatus.js +54 -0
- package/dist/tools/bulkExportStatus.js.map +1 -0
- package/dist/tools/crossObjectSearch.d.ts +155 -0
- package/dist/tools/crossObjectSearch.js +145 -0
- package/dist/tools/crossObjectSearch.js.map +1 -0
- package/dist/tools/debugLogs.d.ts +106 -0
- package/dist/tools/debugLogs.js +189 -0
- package/dist/tools/debugLogs.js.map +1 -0
- package/dist/tools/deployMetadata.d.ts +60 -0
- package/dist/tools/deployMetadata.js +106 -0
- package/dist/tools/deployMetadata.js.map +1 -0
- package/dist/tools/deployPackage.d.ts +49 -0
- package/dist/tools/deployPackage.js +1 -0
- package/dist/tools/dml.d.ts +70 -0
- package/dist/tools/dml.js +105 -0
- package/dist/tools/dml.js.map +1 -0
- package/dist/tools/dmlDelete.d.ts +51 -0
- package/dist/tools/dmlDelete.js +71 -0
- package/dist/tools/dmlDelete.js.map +1 -0
- package/dist/tools/executeAnonymous.d.ts +63 -0
- package/dist/tools/executeAnonymous.js +77 -0
- package/dist/tools/executeAnonymous.js.map +1 -0
- package/dist/tools/fieldManagement.d.ts +222 -0
- package/dist/tools/fieldManagement.js +234 -0
- package/dist/tools/fieldManagement.js.map +1 -0
- package/dist/tools/fieldPermissions.d.ts +94 -0
- package/dist/tools/fieldPermissions.js +191 -0
- package/dist/tools/fieldPermissions.js.map +1 -0
- package/dist/tools/getDependencies.d.ts +58 -0
- package/dist/tools/getDependencies.js +105 -0
- package/dist/tools/getDependencies.js.map +1 -0
- package/dist/tools/listUserPermissions.d.ts +36 -0
- package/dist/tools/listUserPermissions.js +59 -0
- package/dist/tools/listUserPermissions.js.map +1 -0
- package/dist/tools/metadataDescribe.d.ts +37 -0
- package/dist/tools/metadataDescribe.js +35 -0
- package/dist/tools/metadataDescribe.js.map +1 -0
- package/dist/tools/metadataDiff.d.ts +66 -0
- package/dist/tools/metadataDiff.js +215 -0
- package/dist/tools/metadataDiff.js.map +1 -0
- package/dist/tools/metadataDiffFileDetail.d.ts +44 -0
- package/dist/tools/metadataDiffFileDetail.js +84 -0
- package/dist/tools/metadataDiffFileDetail.js.map +1 -0
- package/dist/tools/metadataDiffFiles.d.ts +37 -0
- package/dist/tools/metadataDiffFiles.js +72 -0
- package/dist/tools/metadataDiffFiles.js.map +1 -0
- package/dist/tools/metadataDiffGeneratePackage.d.ts +73 -0
- package/dist/tools/metadataDiffGeneratePackage.js +122 -0
- package/dist/tools/metadataDiffGeneratePackage.js.map +1 -0
- package/dist/tools/metadataImport.d.ts +63 -0
- package/dist/tools/metadataImport.js +122 -0
- package/dist/tools/metadataImport.js.map +1 -0
- package/dist/tools/metadataJobStatus.d.ts +44 -0
- package/dist/tools/metadataJobStatus.js +101 -0
- package/dist/tools/metadataJobStatus.js.map +1 -0
- package/dist/tools/metadataList.d.ts +44 -0
- package/dist/tools/metadataList.js +49 -0
- package/dist/tools/metadataList.js.map +1 -0
- package/dist/tools/metadataRead.d.ts +47 -0
- package/dist/tools/metadataRead.js +52 -0
- package/dist/tools/metadataRead.js.map +1 -0
- package/dist/tools/metadataTypeSchema.d.ts +44 -0
- package/dist/tools/metadataTypeSchema.js +101 -0
- package/dist/tools/metadataTypeSchema.js.map +1 -0
- package/dist/tools/metadataWsdl.d.ts +19 -0
- package/dist/tools/metadataWsdl.js +1 -0
- package/dist/tools/objectManagement.d.ts +107 -0
- package/dist/tools/objectManagement.js +123 -0
- package/dist/tools/objectManagement.js.map +1 -0
- package/dist/tools/objectPermissions.d.ts +101 -0
- package/dist/tools/objectPermissions.js +157 -0
- package/dist/tools/objectPermissions.js.map +1 -0
- package/dist/tools/objectSchema.d.ts +37 -0
- package/dist/tools/objectSchema.js +66 -0
- package/dist/tools/objectSchema.js.map +1 -0
- package/dist/tools/objectSearch.d.ts +37 -0
- package/dist/tools/objectSearch.js +44 -0
- package/dist/tools/objectSearch.js.map +1 -0
- package/dist/tools/packageStatus.d.ts +24 -0
- package/dist/tools/packageStatus.js +1 -0
- package/dist/tools/permissionSetAssignment.d.ts +39 -0
- package/dist/tools/permissionSetAssignment.js +1 -0
- package/dist/tools/readApexClasses.d.ts +50 -0
- package/dist/tools/readApexClasses.js +83 -0
- package/dist/tools/readApexClasses.js.map +1 -0
- package/dist/tools/readApexTriggers.d.ts +50 -0
- package/dist/tools/readApexTriggers.js +82 -0
- package/dist/tools/readApexTriggers.js.map +1 -0
- package/dist/tools/recordPicker.d.ts +48 -0
- package/dist/tools/recordPicker.js +1 -0
- package/dist/tools/recordQuery.d.ts +68 -0
- package/dist/tools/recordQuery.js +131 -0
- package/dist/tools/recordQuery.js.map +1 -0
- package/dist/tools/retrieveJobStatus.d.ts +51 -0
- package/dist/tools/retrieveJobStatus.js +192 -0
- package/dist/tools/retrieveJobStatus.js.map +1 -0
- package/dist/tools/retrieveMetadata.d.ts +79 -0
- package/dist/tools/retrieveMetadata.js +225 -0
- package/dist/tools/retrieveMetadata.js.map +1 -0
- package/dist/tools/retrievePackage.d.ts +37 -0
- package/dist/tools/retrievePackage.js +1 -0
- package/dist/tools/salesforceLogin.d.ts +36 -0
- package/dist/tools/salesforceLogin.js +75 -0
- package/dist/tools/salesforceLogin.js.map +1 -0
- package/dist/tools/selectOrg.d.ts +25 -0
- package/dist/tools/selectOrg.js +91 -0
- package/dist/tools/selectOrg.js.map +1 -0
- package/dist/tools/toolingQuery.d.ts +37 -0
- package/dist/tools/toolingQuery.js +54 -0
- package/dist/tools/toolingQuery.js.map +1 -0
- package/dist/tools/userPermissions.d.ts +76 -0
- package/dist/tools/userPermissions.js +130 -0
- package/dist/tools/userPermissions.js.map +1 -0
- package/dist/tools/versionMetadataComplete.d.ts +45 -0
- package/dist/tools/versionMetadataComplete.js +1 -0
- package/dist/tools/versionMetadataStart.d.ts +25 -0
- package/dist/tools/versionMetadataStart.js +1 -0
- package/dist/tools/versionMetadataStatus.d.ts +25 -0
- package/dist/tools/versionMetadataStatus.js +1 -0
- package/dist/tools/writeApexClasses.d.ts +64 -0
- package/dist/tools/writeApexClasses.js +79 -0
- package/dist/tools/writeApexClasses.js.map +1 -0
- package/dist/tools/writeApexTriggers.d.ts +71 -0
- package/dist/tools/writeApexTriggers.js +96 -0
- package/dist/tools/writeApexTriggers.js.map +1 -0
- package/dist/types/connection.d.ts +20 -0
- package/dist/types/connection.js +9 -0
- package/dist/types/connection.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metadata.d.ts +44 -0
- package/dist/types/metadata.js +2 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/salesforce.d.ts +38 -0
- package/dist/types/salesforce.js +2 -0
- package/dist/types/salesforce.js.map +1 -0
- package/dist/utils/apexContainer.d.ts +18 -0
- package/dist/utils/apexContainer.js +79 -0
- package/dist/utils/apexContainer.js.map +1 -0
- package/dist/utils/connection.d.ts +3 -0
- package/dist/utils/connection.js +135 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/decomposePermissions.d.ts +16 -0
- package/dist/utils/decomposePermissions.js +188 -0
- package/dist/utils/decomposePermissions.js.map +1 -0
- package/dist/utils/dxPathMapper.d.ts +16 -0
- package/dist/utils/dxPathMapper.js +217 -0
- package/dist/utils/dxPathMapper.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.js +40 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/oauthWebFlow.d.ts +8 -0
- package/dist/utils/oauthWebFlow.js +172 -0
- package/dist/utils/oauthWebFlow.js.map +1 -0
- package/dist/utils/packageJobs.d.ts +17 -0
- package/dist/utils/packageJobs.js +1 -0
- package/dist/utils/packageXml.d.ts +18 -0
- package/dist/utils/packageXml.js +1 -0
- package/dist/utils/permissionSetResolver.d.ts +14 -0
- package/dist/utils/permissionSetResolver.js +1 -0
- package/dist/utils/preSelectMatcher.d.ts +18 -0
- package/dist/utils/preSelectMatcher.js +1 -0
- package/dist/utils/profileCleanup.d.ts +18 -0
- package/dist/utils/profileCleanup.js +1 -0
- package/dist/utils/retrieveStore.d.ts +12 -0
- package/dist/utils/retrieveStore.js +1 -0
- package/dist/utils/sfCli.d.ts +18 -0
- package/dist/utils/sfCli.js +130 -0
- package/dist/utils/sfCli.js.map +1 -0
- package/dist/utils/tokenBroker.d.ts +13 -0
- package/dist/utils/tokenBroker.js +73 -0
- package/dist/utils/tokenBroker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
const PERMISSION_KEYS = ['create', 'read', 'edit', 'delete', 'viewAll', 'modifyAll'];
|
|
4
|
+
const fieldMap = {
|
|
5
|
+
create: 'PermissionsCreate',
|
|
6
|
+
read: 'PermissionsRead',
|
|
7
|
+
edit: 'PermissionsEdit',
|
|
8
|
+
delete: 'PermissionsDelete',
|
|
9
|
+
viewAll: 'PermissionsViewAllRecords',
|
|
10
|
+
modifyAll: 'PermissionsModifyAllRecords',
|
|
11
|
+
};
|
|
12
|
+
export const objectPermissionsTool = {
|
|
13
|
+
name: 'salesforce_manage_object_permissions',
|
|
14
|
+
description: 'View, grant, or revoke object-level permissions (Create, Read, Edit, Delete, ViewAll, ModifyAll) for profiles and permission sets.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
operation: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
enum: ['grant', 'revoke', 'list'],
|
|
21
|
+
description: "'list' = show current permissions. 'grant' = add permissions. 'revoke' = remove all object permissions.",
|
|
22
|
+
},
|
|
23
|
+
objectName: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Object API name. Custom objects must include __c. Examples: Account, Invoice__c.',
|
|
26
|
+
},
|
|
27
|
+
profileNames: {
|
|
28
|
+
type: 'array',
|
|
29
|
+
items: { type: 'string' },
|
|
30
|
+
description: "Profile names. Default: ['System Administrator'] if neither profileNames nor permissionSetNames provided.",
|
|
31
|
+
},
|
|
32
|
+
permissionSetNames: {
|
|
33
|
+
type: 'array',
|
|
34
|
+
items: { type: 'string' },
|
|
35
|
+
description: 'Permission Set API names or labels.',
|
|
36
|
+
},
|
|
37
|
+
permissions: {
|
|
38
|
+
type: 'array',
|
|
39
|
+
items: { type: 'string', enum: ['create', 'read', 'edit', 'delete', 'viewAll', 'modifyAll'] },
|
|
40
|
+
description: 'Which permissions to grant. Defaults to all. Ignored for list and revoke.',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: ['operation', 'objectName'],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
async function resolvePermSetIds(conn, profileNames, permSetNames) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (const name of profileNames) {
|
|
49
|
+
const profResult = await conn.query(`SELECT Id FROM Profile WHERE Name = '${name.replace(/'/g, "\\'")}'`);
|
|
50
|
+
if (!profResult.records?.length)
|
|
51
|
+
throw new Error(`Profile "${name}" not found`);
|
|
52
|
+
const profileId = profResult.records[0].Id;
|
|
53
|
+
const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE ProfileId = '${profileId}' AND IsOwnedByProfile = true`);
|
|
54
|
+
if (!psResult.records?.length)
|
|
55
|
+
throw new Error(`No owned PermissionSet found for profile "${name}"`);
|
|
56
|
+
results.push({ id: psResult.records[0].Id, label: name });
|
|
57
|
+
}
|
|
58
|
+
for (const name of permSetNames) {
|
|
59
|
+
const escaped = name.replace(/'/g, "\\'");
|
|
60
|
+
const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE IsOwnedByProfile = false AND (Name = '${escaped}' OR Label = '${escaped}')`);
|
|
61
|
+
if (!psResult.records?.length)
|
|
62
|
+
throw new Error(`Permission Set "${name}" not found`);
|
|
63
|
+
results.push({ id: psResult.records[0].Id, label: name });
|
|
64
|
+
}
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
export async function handleObjectPermissions(conn, args) {
|
|
68
|
+
const { operation, objectName } = args;
|
|
69
|
+
try {
|
|
70
|
+
if (operation === 'list') {
|
|
71
|
+
const filterProfiles = args.profileNames || [];
|
|
72
|
+
const filterPermSets = args.permissionSetNames || [];
|
|
73
|
+
let parentIdFilter = '';
|
|
74
|
+
if (filterProfiles.length > 0 || filterPermSets.length > 0) {
|
|
75
|
+
const resolved = await resolvePermSetIds(conn, filterProfiles, filterPermSets);
|
|
76
|
+
parentIdFilter = ` AND ParentId IN ('${resolved.map((r) => r.id).join("','")}')`;
|
|
77
|
+
}
|
|
78
|
+
const allFields = Object.values(fieldMap).join(', ');
|
|
79
|
+
const result = await conn.query(`SELECT Parent.Profile.Name, Parent.Label, ${allFields} FROM ObjectPermissions WHERE SobjectType = '${objectName}'${parentIdFilter}`);
|
|
80
|
+
if (!result.records?.length) {
|
|
81
|
+
return toolResponse(`No explicit object permissions found for ${objectName}.`);
|
|
82
|
+
}
|
|
83
|
+
const lines = result.records.map((r) => {
|
|
84
|
+
const label = r.Parent?.Profile?.Name || r.Parent?.Label || '(Permission Set)';
|
|
85
|
+
const granted = PERMISSION_KEYS.filter((k) => r[fieldMap[k]]);
|
|
86
|
+
return `${label}: ${granted.length ? granted.join(', ') : 'none'}`;
|
|
87
|
+
});
|
|
88
|
+
return toolResponse(`Object permissions for ${objectName}:\n\n${lines.join('\n')}`);
|
|
89
|
+
}
|
|
90
|
+
const profileNames = args.profileNames || [];
|
|
91
|
+
const permSetNames = args.permissionSetNames || [];
|
|
92
|
+
const effectiveProfiles = profileNames.length === 0 && permSetNames.length === 0
|
|
93
|
+
? ['System Administrator']
|
|
94
|
+
: profileNames;
|
|
95
|
+
const targets = await resolvePermSetIds(conn, effectiveProfiles, permSetNames);
|
|
96
|
+
const results = [];
|
|
97
|
+
const requestedPerms = operation === 'grant'
|
|
98
|
+
? (args.permissions?.length ? args.permissions : [...PERMISSION_KEYS])
|
|
99
|
+
: [];
|
|
100
|
+
for (const { id: permSetId, label } of targets) {
|
|
101
|
+
try {
|
|
102
|
+
const existing = await conn.query(`SELECT Id FROM ObjectPermissions WHERE ParentId = '${permSetId}' AND SobjectType = '${objectName}'`);
|
|
103
|
+
if (operation === 'grant') {
|
|
104
|
+
const fieldUpdates = {};
|
|
105
|
+
for (const perm of requestedPerms) {
|
|
106
|
+
fieldUpdates[fieldMap[perm]] = true;
|
|
107
|
+
}
|
|
108
|
+
if (existing.records?.length) {
|
|
109
|
+
await conn.sobject('ObjectPermissions').update({
|
|
110
|
+
Id: existing.records[0].Id,
|
|
111
|
+
...fieldUpdates,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
await conn.sobject('ObjectPermissions').create({
|
|
116
|
+
ParentId: permSetId,
|
|
117
|
+
SobjectType: objectName,
|
|
118
|
+
...fieldUpdates,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
results.push(`Granted to "${label}": ${requestedPerms.join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (existing.records?.length) {
|
|
125
|
+
await conn.sobject('ObjectPermissions').destroy(existing.records[0].Id);
|
|
126
|
+
results.push(`Revoked from "${label}"`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
results.push(`No existing permissions for "${label}"`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
results.push(`Failed for "${label}": ${err.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const verb = operation === 'grant' ? 'grant' : 'revoke';
|
|
138
|
+
return toolResponse(`Object permissions ${verb} results for ${objectName}:\n\n${results.join('\n')}`);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
return toolResponse(`Object permissions ${operation} failed: ${error.message}`, true);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export const objectPermissionsSchema = {
|
|
145
|
+
operation: z.enum(['grant', 'revoke', 'list']).describe("'list' = show access. 'grant' = add access. 'revoke' = remove access."),
|
|
146
|
+
objectName: z.string().describe('Object API name. Custom objects must include __c.'),
|
|
147
|
+
profileNames: z.array(z.string()).describe("Profile names. Default: ['System Administrator'] if neither profileNames nor permissionSetNames provided.").optional(),
|
|
148
|
+
permissionSetNames: z.array(z.string()).describe('Permission Set API names or labels.').optional(),
|
|
149
|
+
permissions: z.array(z.enum(['create', 'read', 'edit', 'delete', 'viewAll', 'modifyAll'])).describe('Permissions to grant. Defaults to all. Ignored for list and revoke.').optional(),
|
|
150
|
+
};
|
|
151
|
+
export const objectPermissionsDescriptor = {
|
|
152
|
+
name: 'salesforce_manage_object_permissions',
|
|
153
|
+
description: objectPermissionsTool.description,
|
|
154
|
+
schema: objectPermissionsSchema,
|
|
155
|
+
handler: handleObjectPermissions,
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=objectPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectPermissions.js","sourceRoot":"","sources":["../../src/tools/objectPermissions.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 objectSchemaTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
objectName: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
required: string[];
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export interface ObjectSchemaArgs {
|
|
18
|
+
objectName: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function handleObjectSchema(conn: Connection, args: ObjectSchemaArgs): Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
export declare const objectSchemaSchema: {
|
|
28
|
+
objectName: z.ZodString;
|
|
29
|
+
};
|
|
30
|
+
export declare const objectSchemaDescriptor: {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
schema: {
|
|
34
|
+
objectName: z.ZodString;
|
|
35
|
+
};
|
|
36
|
+
handler: typeof handleObjectSchema;
|
|
37
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
export const objectSchemaTool = {
|
|
4
|
+
name: 'salesforce_describe_object',
|
|
5
|
+
description: 'Get the complete field-level schema of a Salesforce object including all fields, their types, relationships, and picklist values. Use salesforce_search_objects first to find the correct API name.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
objectName: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'The Salesforce object API name (e.g., "Account", "Contact", "MyObject__c").',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ['objectName'],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export async function handleObjectSchema(conn, args) {
|
|
18
|
+
const { objectName } = args;
|
|
19
|
+
const desc = await conn.describe(objectName);
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push(`## ${desc.label} (${desc.name}) — ${desc.custom ? 'Custom' : 'Standard'} Object\n`);
|
|
22
|
+
lines.push('### Fields\n');
|
|
23
|
+
for (const field of desc.fields) {
|
|
24
|
+
let info = `- **${field.name}** — ${field.label} (${field.type}`;
|
|
25
|
+
if (field.length)
|
|
26
|
+
info += `, length: ${field.length}`;
|
|
27
|
+
info += `)`;
|
|
28
|
+
if (!field.nillable && field.name !== 'Id')
|
|
29
|
+
info += ' *required*';
|
|
30
|
+
if (field.referenceTo && field.referenceTo.length > 0) {
|
|
31
|
+
info += ` → ${field.referenceTo.join(', ')}`;
|
|
32
|
+
}
|
|
33
|
+
if (field.picklistValues && field.picklistValues.length > 0) {
|
|
34
|
+
const values = field.picklistValues
|
|
35
|
+
.filter((pv) => pv.active)
|
|
36
|
+
.slice(0, 200)
|
|
37
|
+
.map((pv) => pv.label || pv.value);
|
|
38
|
+
if (values.length > 0) {
|
|
39
|
+
info += `\n Picklist: ${values.join(', ')}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (field.defaultValue !== null && field.defaultValue !== undefined) {
|
|
43
|
+
info += ` (default: ${field.defaultValue})`;
|
|
44
|
+
}
|
|
45
|
+
lines.push(info);
|
|
46
|
+
}
|
|
47
|
+
if (desc.childRelationships && desc.childRelationships.length > 0) {
|
|
48
|
+
lines.push('\n### Child Relationships\n');
|
|
49
|
+
for (const rel of desc.childRelationships) {
|
|
50
|
+
if (rel.relationshipName) {
|
|
51
|
+
lines.push(`- **${rel.relationshipName}** → ${rel.childSObject}.${rel.field}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return toolResponse(lines.join('\n'));
|
|
56
|
+
}
|
|
57
|
+
export const objectSchemaSchema = {
|
|
58
|
+
objectName: z.string().describe('The Salesforce object API name (e.g., "Account", "Contact", "MyObject__c").'),
|
|
59
|
+
};
|
|
60
|
+
export const objectSchemaDescriptor = {
|
|
61
|
+
name: 'salesforce_describe_object',
|
|
62
|
+
description: objectSchemaTool.description,
|
|
63
|
+
schema: objectSchemaSchema,
|
|
64
|
+
handler: handleObjectSchema,
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=objectSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectSchema.js","sourceRoot":"","sources":["../../src/tools/objectSchema.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 objectSearchTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
searchPattern: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
required: string[];
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export interface ObjectSearchArgs {
|
|
18
|
+
searchPattern: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function handleObjectSearch(conn: Connection, args: ObjectSearchArgs): Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
export declare const objectSearchSchema: {
|
|
28
|
+
searchPattern: z.ZodString;
|
|
29
|
+
};
|
|
30
|
+
export declare const objectSearchDescriptor: {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
schema: {
|
|
34
|
+
searchPattern: z.ZodString;
|
|
35
|
+
};
|
|
36
|
+
handler: typeof handleObjectSearch;
|
|
37
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
export const objectSearchTool = {
|
|
4
|
+
name: 'salesforce_search_objects',
|
|
5
|
+
description: 'Search for Salesforce objects by keyword. Matches against object API names and labels. Example: "Account Coverage" finds AccountCoverage__c. Use this to discover object API names before querying.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
searchPattern: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'Space-separated search terms. All terms must match (AND logic). Matches against object name and label (case-insensitive).',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ['searchPattern'],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export async function handleObjectSearch(conn, args) {
|
|
18
|
+
const { searchPattern } = args;
|
|
19
|
+
const terms = searchPattern.toLowerCase().split(/\s+/).filter(Boolean);
|
|
20
|
+
if (terms.length === 0) {
|
|
21
|
+
return toolResponse('Please provide at least one search term.', true);
|
|
22
|
+
}
|
|
23
|
+
const globalDesc = await conn.describeGlobal();
|
|
24
|
+
const matches = globalDesc.sobjects.filter((obj) => {
|
|
25
|
+
const name = obj.name.toLowerCase();
|
|
26
|
+
const label = (obj.label || '').toLowerCase();
|
|
27
|
+
return terms.every((term) => name.includes(term) || label.includes(term));
|
|
28
|
+
});
|
|
29
|
+
if (matches.length === 0) {
|
|
30
|
+
return toolResponse(`No objects found matching "${searchPattern}".`);
|
|
31
|
+
}
|
|
32
|
+
const lines = matches.map((obj) => `${obj.name} — ${obj.label} (${obj.custom ? 'Custom' : 'Standard'})`);
|
|
33
|
+
return toolResponse(`Found ${matches.length} object(s):\n\n${lines.join('\n')}`);
|
|
34
|
+
}
|
|
35
|
+
export const objectSearchSchema = {
|
|
36
|
+
searchPattern: z.string().describe('Space-separated search terms. All terms must match (AND logic). Matches against object name and label (case-insensitive).'),
|
|
37
|
+
};
|
|
38
|
+
export const objectSearchDescriptor = {
|
|
39
|
+
name: 'salesforce_search_objects',
|
|
40
|
+
description: objectSearchTool.description,
|
|
41
|
+
schema: objectSearchSchema,
|
|
42
|
+
handler: handleObjectSearch,
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=objectSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectSearch.js","sourceRoot":"","sources":["../../src/tools/objectSearch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,qMAAqM;IAClN,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2HAA2H;aACzI;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;CACF,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAgB,EAAE,IAAsB;IAC/E,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,8BAA8B,aAAa,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CACrC,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CACrE,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,OAAO,CAAC,MAAM,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2HAA2H,CAAC;CAChK,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,gBAAgB,CAAC,WAAW;IACzC,MAAM,EAAE,kBAAkB;IAC1B,OAAO,EAAE,kBAAkB;CAC5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const packageStatusTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
jobId: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
required: string[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export interface PackageStatusArgs {
|
|
16
|
+
jobId: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function handlePackageStatus(args: PackageStatusArgs): Promise<{
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
isError: boolean;
|
|
24
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{mkdir as e,writeFile as t}from"node:fs/promises";import{join as o,dirname as s}from"node:path";import{toolResponse as r}from"../utils/index.js";import{getJob as n,removeJob as a}from"../utils/packageJobs.js";import{cleanProfileAndPermissionSetFiles as i}from"../utils/profileCleanup.js";export const packageStatusTool={name:"salesforce_package_status",description:'Check the status of an async metadata retrieve or deploy job. Returns progress info and a "done" boolean. When a retrieve completes successfully, files are automatically extracted to the output directory. Poll this tool until done is true.',inputSchema:{type:"object",properties:{jobId:{type:"string",description:"The async job ID returned by salesforce_retrieve_package or salesforce_deploy_package."}},required:["jobId"]}};export async function handlePackageStatus(c){const{jobId:u}=c,l=n(u);if(!l)return r(`No active job found for ID "${u}". The job may have already completed or the server may have restarted.`,!0);try{return"retrieve"===l.type?await async function(c){const u=n(c),l=await u.conn.metadata.checkRetrieveStatus(c),p=l.status;if("true"!==l.done&&!0!==l.done){const e=Math.round((Date.now()-u.startedAt)/1e3);return r(JSON.stringify({done:!1,jobId:c,type:"retrieve",status:p,elapsedSeconds:e,message:`Retrieve in progress (${p}). Poll again.`},null,2))}if("true"!==l.success&&!0!==l.success){const e=l.errorMessage||l.errorStatusCode||"Unknown error";return a(c),r(JSON.stringify({done:!0,jobId:c,type:"retrieve",success:!1,error:e},null,2),!0)}const d=l.zipFile;if(!d||!u.outputDirectory)return a(c),r(JSON.stringify({done:!0,jobId:c,type:"retrieve",success:!0,warning:"No zip data or output directory — cannot extract files."},null,2));const m=(await import("jszip")).default,y=await m.loadAsync(Buffer.from(d,"base64")),f={},b=[];for(const[r,n]of Object.entries(y.files)){if(n.dir)continue;const a=o(u.outputDirectory,r);await e(s(a),{recursive:!0});const i=await n.async("nodebuffer");await t(a,i),b.push(r);const c=r.split("/")[0]||"root";f[c]=(f[c]||0)+1}let g;if(u.componentMap&&(u.componentMap.Profile||u.componentMap.PermissionSet))try{g=await i(u.outputDirectory,u.componentMap)}catch(e){process.stderr.write(`[packageStatus] Profile/PermissionSet cleanup failed (non-fatal): ${e.message}\n`)}return a(c),r(JSON.stringify({done:!0,jobId:c,type:"retrieve",success:!0,outputDirectory:u.outputDirectory,totalFiles:b.length,fileCounts:f,files:b,...null!=g?{profilesCleanedCount:g}:{}},null,2))}(u):await async function(e){const t=n(e),o=await t.conn.metadata.checkDeployStatus(e,!0),s="true"===o.done||!0===o.done,i=o.status;if(!s){const s=null!=o.numberComponentsDeployed?`${o.numberComponentsDeployed}/${o.numberComponentsTotal} components`:i,n=Math.round((Date.now()-t.startedAt)/1e3);return r(JSON.stringify({done:!1,jobId:e,type:"deploy",status:i,progress:s,elapsedSeconds:n,message:`Deploy in progress (${s}). Poll again.`},null,2))}const c="true"===o.success||!0===o.success,u="true"===o.checkOnly||!0===o.checkOnly;if(c){const t=o.numberComponentsDeployed||0,s=function(e){const t=e.details?.runTestResult;return t?{numTestsRun:t.numTestsRun,numFailures:t.numFailures,totalTime:t.totalTime}:void 0}(o);return a(e),r(JSON.stringify({done:!0,jobId:e,type:"deploy",success:!0,checkOnly:u,componentsDeployed:t,...s?{testResults:s}:{}},null,2))}const l=function(e){const t=[],o=e.details?.componentFailures;if(o){const e=Array.isArray(o)?o:[o];for(const o of e)t.push({componentType:o.componentType,fullName:o.fullName,problem:o.problem,problemType:o.problemType,lineNumber:o.lineNumber||void 0,columnNumber:o.columnNumber||void 0})}const s=e.details?.runTestResult?.failures;if(s){const e=Array.isArray(s)?s:[s];for(const o of e)t.push({type:"testFailure",name:o.name,methodName:o.methodName,message:o.message,stackTrace:o.stackTrace})}return 0===t.length&&t.push({message:e.errorMessage||"Unknown deploy error"}),t}(o);return a(e),r(JSON.stringify({done:!0,jobId:e,type:"deploy",success:!1,checkOnly:u,errors:l},null,2),!0)}(u)}catch(e){return r(`Failed to check job status: ${e.message}`,!0)}}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
export declare const permissionSetAssignmentTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
operation: {
|
|
9
|
+
type: string;
|
|
10
|
+
enum: string[];
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
userIdentifier: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
permissionSetNames: {
|
|
18
|
+
type: string;
|
|
19
|
+
items: {
|
|
20
|
+
type: string;
|
|
21
|
+
};
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
required: string[];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export interface PermissionSetAssignmentArgs {
|
|
29
|
+
operation: 'view' | 'assign' | 'unassign';
|
|
30
|
+
userIdentifier?: string;
|
|
31
|
+
permissionSetNames?: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function handlePermissionSetAssignment(conn: Connection, args: PermissionSetAssignmentArgs): Promise<{
|
|
34
|
+
content: {
|
|
35
|
+
type: "text";
|
|
36
|
+
text: string;
|
|
37
|
+
}[];
|
|
38
|
+
isError: boolean;
|
|
39
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{toolResponse as e}from"../utils/index.js";export const permissionSetAssignmentTool={name:"salesforce_manage_permission_set_assignment",description:"View, assign, or unassign permission sets to/from users. View shows assignments by user or permission set.",inputSchema:{type:"object",properties:{operation:{type:"string",enum:["view","assign","unassign"],description:"The operation to perform."},userIdentifier:{type:"string",description:"User identifier: 18-char Salesforce ID, Username, or Email."},permissionSetNames:{type:"array",items:{type:"string"},description:"Permission set DeveloperNames (not profiles). Required for assign/unassign."}},required:["operation"]}};async function s(e,s){if(/^[a-zA-Z0-9]{18}$/.test(s)||/^[a-zA-Z0-9]{15}$/.test(s))try{const n=await e.query(`SELECT Id, Username FROM User WHERE Id = '${s}'`);if(n.records?.length){const e=n.records[0];return{id:e.Id,name:e.Username}}}catch{}const n=await e.query(`SELECT Id, Username FROM User WHERE Username = '${s.replace(/'/g,"\\'")}'`);if(n.records?.length){const e=n.records[0];return{id:e.Id,name:e.Username}}const i=await e.query(`SELECT Id, Username FROM User WHERE Email = '${s.replace(/'/g,"\\'")}'`);if(i.records?.length){if(i.records.length>1)return`Multiple users found with email "${s}". Use Username or Id instead.`;const e=i.records[0];return{id:e.Id,name:e.Username}}return`User "${s}" not found by Id, Username, or Email.`}export async function handlePermissionSetAssignment(n,i){const{operation:r}=i;try{if("view"===r){if(!i.userIdentifier&&!i.permissionSetNames?.length)return e("Provide userIdentifier or permissionSetNames for view operation.",!0);if(i.userIdentifier){const r=await s(n,i.userIdentifier);if("string"==typeof r)return e(r,!0);const t=await n.query(`SELECT PermissionSet.Name, PermissionSet.Label, PermissionSet.IsOwnedByProfile FROM PermissionSetAssignment WHERE AssigneeId = '${r.id}'`);if(!t.records?.length)return e(`No permission set assignments found for ${r.name}.`);const o=[],a=[];for(const e of t.records)e.PermissionSet?.IsOwnedByProfile?o.push(e.PermissionSet.Label):a.push(`${e.PermissionSet.Label} (${e.PermissionSet.Name})`);const m=[];return o.length&&m.push(`Profiles:\n${o.map(e=>` - ${e}`).join("\n")}`),a.length&&m.push(`Permission Sets:\n${a.map(e=>` - ${e}`).join("\n")}`),e(`Assignments for ${r.name}:\n\n${m.join("\n\n")}`)}const r=i.permissionSetNames[0],t=await n.query(`SELECT Id, Label FROM PermissionSet WHERE Name = '${r.replace(/'/g,"\\'")}' AND IsOwnedByProfile = false`);if(!t.records?.length)return e(`Permission set "${r}" not found.`,!0);const o=t.records[0],a=await n.query(`SELECT Assignee.Username, Assignee.Name FROM PermissionSetAssignment WHERE PermissionSetId = '${o.Id}'`);if(!a.records?.length)return e(`No users assigned to "${o.Label}".`);const m=a.records.map(e=>` - ${e.Assignee?.Name} (${e.Assignee?.Username})`);return e(`Users assigned to "${o.Label}" (${r}):\n\n${m.join("\n")}`)}if(!i.userIdentifier)return e("userIdentifier is required for assign/unassign.",!0);if(!i.permissionSetNames?.length)return e("permissionSetNames is required for assign/unassign.",!0);const t=await s(n,i.userIdentifier);if("string"==typeof t)return e(t,!0);const o=[];for(const e of i.permissionSetNames)try{const s=await n.query(`SELECT Id, Label FROM PermissionSet WHERE Name = '${e.replace(/'/g,"\\'")}' AND IsOwnedByProfile = false`);if(!s.records?.length){o.push(`Permission set "${e}" not found`);continue}const i=s.records[0];if("assign"===r){const e=await n.query(`SELECT Id FROM PermissionSetAssignment WHERE AssigneeId = '${t.id}' AND PermissionSetId = '${i.Id}'`);if(e.records?.length){o.push(`"${i.Label}" already assigned to ${t.name}`);continue}await n.sobject("PermissionSetAssignment").create({AssigneeId:t.id,PermissionSetId:i.Id}),o.push(`Assigned "${i.Label}" to ${t.name}`)}else{const e=await n.query(`SELECT Id FROM PermissionSetAssignment WHERE AssigneeId = '${t.id}' AND PermissionSetId = '${i.Id}'`);if(!e.records?.length){o.push(`"${i.Label}" is not assigned to ${t.name}`);continue}await n.sobject("PermissionSetAssignment").destroy(e.records[0].Id),o.push(`Unassigned "${i.Label}" from ${t.name}`)}}catch(s){o.push(`Failed for "${e}": ${s.message}`)}return e(`Permission set ${r} results for ${t.name}:\n\n${o.join("\n")}`)}catch(s){return e(`Permission set assignment ${r} failed: ${s.message}`,!0)}}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const readApexClassesTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
className: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
namePattern: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
includeMetadata: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export interface ReadApexClassesArgs {
|
|
25
|
+
className?: string;
|
|
26
|
+
namePattern?: string;
|
|
27
|
+
includeMetadata?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function handleReadApexClasses(conn: Connection, args: ReadApexClassesArgs): Promise<{
|
|
30
|
+
content: {
|
|
31
|
+
type: "text";
|
|
32
|
+
text: string;
|
|
33
|
+
}[];
|
|
34
|
+
isError: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const readApexClassesSchema: {
|
|
37
|
+
className: z.ZodOptional<z.ZodString>;
|
|
38
|
+
namePattern: z.ZodOptional<z.ZodString>;
|
|
39
|
+
includeMetadata: z.ZodOptional<z.ZodBoolean>;
|
|
40
|
+
};
|
|
41
|
+
export declare const readApexClassesDescriptor: {
|
|
42
|
+
name: string;
|
|
43
|
+
description: string;
|
|
44
|
+
schema: {
|
|
45
|
+
className: z.ZodOptional<z.ZodString>;
|
|
46
|
+
namePattern: z.ZodOptional<z.ZodString>;
|
|
47
|
+
includeMetadata: z.ZodOptional<z.ZodBoolean>;
|
|
48
|
+
};
|
|
49
|
+
handler: typeof handleReadApexClasses;
|
|
50
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
export const readApexClassesTool = {
|
|
4
|
+
name: 'salesforce_read_apex_class',
|
|
5
|
+
description: 'Read Apex class source code or list classes by name pattern. Use exact className to get full source code, or namePattern with wildcards (* and ?) to list matching classes.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
className: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'Exact class name to retrieve full source code.',
|
|
12
|
+
},
|
|
13
|
+
namePattern: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'Pattern to match class names. * = multi-char wildcard, ? = single-char wildcard. Without wildcards, does substring match.',
|
|
16
|
+
},
|
|
17
|
+
includeMetadata: {
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
description: 'Include API version, length, status, last modified date. Default: false.',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
function convertPattern(pattern) {
|
|
25
|
+
if (pattern.includes('*') || pattern.includes('?')) {
|
|
26
|
+
return pattern.replace(/\*/g, '%').replace(/\?/g, '_');
|
|
27
|
+
}
|
|
28
|
+
return `%${pattern}%`;
|
|
29
|
+
}
|
|
30
|
+
export async function handleReadApexClasses(conn, args) {
|
|
31
|
+
const { className, namePattern, includeMetadata } = args;
|
|
32
|
+
try {
|
|
33
|
+
if (className) {
|
|
34
|
+
const result = await conn.tooling.query(`SELECT Id, Name, Body, ApiVersion, LengthWithoutComments, Status, LastModifiedDate FROM ApexClass WHERE Name = '${className.replace(/'/g, "\\'")}'`);
|
|
35
|
+
if (!result.records || result.records.length === 0) {
|
|
36
|
+
return toolResponse(`Apex class "${className}" not found.`);
|
|
37
|
+
}
|
|
38
|
+
const cls = result.records[0];
|
|
39
|
+
let output = `## ${cls.Name}\n\n`;
|
|
40
|
+
if (includeMetadata) {
|
|
41
|
+
output += `API Version: ${cls.ApiVersion} | Length: ${cls.LengthWithoutComments} | Status: ${cls.Status} | Last Modified: ${cls.LastModifiedDate}\n\n`;
|
|
42
|
+
}
|
|
43
|
+
output += '```apex\n' + cls.Body + '\n```';
|
|
44
|
+
return toolResponse(output);
|
|
45
|
+
}
|
|
46
|
+
// Pattern/list mode
|
|
47
|
+
let whereClause = '';
|
|
48
|
+
if (namePattern) {
|
|
49
|
+
const likePattern = convertPattern(namePattern);
|
|
50
|
+
whereClause = ` WHERE Name LIKE '${likePattern.replace(/'/g, "\\'")}'`;
|
|
51
|
+
}
|
|
52
|
+
const fields = includeMetadata
|
|
53
|
+
? 'Id, Name, ApiVersion, LengthWithoutComments, Status, LastModifiedDate'
|
|
54
|
+
: 'Id, Name';
|
|
55
|
+
const result = await conn.tooling.query(`SELECT ${fields} FROM ApexClass${whereClause} ORDER BY Name LIMIT 200`);
|
|
56
|
+
if (!result.records || result.records.length === 0) {
|
|
57
|
+
return toolResponse(`No Apex classes found${namePattern ? ` matching "${namePattern}"` : ''}.`);
|
|
58
|
+
}
|
|
59
|
+
if (includeMetadata) {
|
|
60
|
+
const header = '| Name | API Version | Length | Status | Last Modified |';
|
|
61
|
+
const separator = '|------|-------------|--------|--------|---------------|';
|
|
62
|
+
const rows = result.records.map((r) => `| ${r.Name} | ${r.ApiVersion} | ${r.LengthWithoutComments} | ${r.Status} | ${r.LastModifiedDate} |`);
|
|
63
|
+
return toolResponse(`${result.records.length} class(es) found:\n\n${header}\n${separator}\n${rows.join('\n')}`);
|
|
64
|
+
}
|
|
65
|
+
const names = result.records.map((r) => r.Name);
|
|
66
|
+
return toolResponse(`${names.length} class(es) found:\n\n${names.join('\n')}`);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return toolResponse(`Failed to read Apex classes: ${error.message}`, true);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export const readApexClassesSchema = {
|
|
73
|
+
className: z.string().describe('Exact class name to retrieve full source code.').optional(),
|
|
74
|
+
namePattern: z.string().describe('Pattern to match class names. * = multi-char wildcard, ? = single-char wildcard. Without wildcards, does substring match.').optional(),
|
|
75
|
+
includeMetadata: z.boolean().describe('Include API version, length, status, last modified date. Default: false.').optional(),
|
|
76
|
+
};
|
|
77
|
+
export const readApexClassesDescriptor = {
|
|
78
|
+
name: 'salesforce_read_apex_class',
|
|
79
|
+
description: readApexClassesTool.description,
|
|
80
|
+
schema: readApexClassesSchema,
|
|
81
|
+
handler: handleReadApexClasses,
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=readApexClasses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readApexClasses.js","sourceRoot":"","sources":["../../src/tools/readApexClasses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const readApexTriggersTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
triggerName: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
namePattern: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
includeMetadata: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export interface ReadApexTriggersArgs {
|
|
25
|
+
triggerName?: string;
|
|
26
|
+
namePattern?: string;
|
|
27
|
+
includeMetadata?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function handleReadApexTriggers(conn: Connection, args: ReadApexTriggersArgs): Promise<{
|
|
30
|
+
content: {
|
|
31
|
+
type: "text";
|
|
32
|
+
text: string;
|
|
33
|
+
}[];
|
|
34
|
+
isError: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const readApexTriggersSchema: {
|
|
37
|
+
triggerName: z.ZodOptional<z.ZodString>;
|
|
38
|
+
namePattern: z.ZodOptional<z.ZodString>;
|
|
39
|
+
includeMetadata: z.ZodOptional<z.ZodBoolean>;
|
|
40
|
+
};
|
|
41
|
+
export declare const readApexTriggersDescriptor: {
|
|
42
|
+
name: string;
|
|
43
|
+
description: string;
|
|
44
|
+
schema: {
|
|
45
|
+
triggerName: z.ZodOptional<z.ZodString>;
|
|
46
|
+
namePattern: z.ZodOptional<z.ZodString>;
|
|
47
|
+
includeMetadata: z.ZodOptional<z.ZodBoolean>;
|
|
48
|
+
};
|
|
49
|
+
handler: typeof handleReadApexTriggers;
|
|
50
|
+
};
|