@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,54 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
export const toolingQueryTool = {
|
|
4
|
+
name: 'salesforce_tooling_query',
|
|
5
|
+
description: 'Execute a SOQL query against the Salesforce Tooling API. Useful for querying metadata objects not available through the standard API: ValidationRule, FlowDefinition, WorkflowRule, ApexClass, ApexTrigger, ApexPage, ApexComponent, CustomField, CustomObject, Layout, RecordType, CustomTab, AuraDefinitionBundle, LightningComponentBundle. Note: The Metadata compound field should only be queried when limiting results to 1 record.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
soqlQuery: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'The SOQL query to execute against the Tooling API.',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ['soqlQuery'],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
function stripAttributes(obj) {
|
|
18
|
+
if (Array.isArray(obj))
|
|
19
|
+
return obj.map(stripAttributes);
|
|
20
|
+
if (obj && typeof obj === 'object') {
|
|
21
|
+
const cleaned = {};
|
|
22
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
23
|
+
if (key === 'attributes')
|
|
24
|
+
continue;
|
|
25
|
+
cleaned[key] = stripAttributes(value);
|
|
26
|
+
}
|
|
27
|
+
return cleaned;
|
|
28
|
+
}
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
export async function handleToolingQuery(conn, args) {
|
|
32
|
+
const { soqlQuery } = args;
|
|
33
|
+
try {
|
|
34
|
+
const result = await conn.tooling.query(soqlQuery);
|
|
35
|
+
const records = stripAttributes(result.records || []);
|
|
36
|
+
if (records.length === 0) {
|
|
37
|
+
return toolResponse(`No results found.\n\nQuery: ${soqlQuery}`);
|
|
38
|
+
}
|
|
39
|
+
return toolResponse(`${result.totalSize} record(s) returned:\n\n${JSON.stringify(records, null, 2)}\n\nQuery: ${soqlQuery}`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return toolResponse(`Tooling query failed: ${error.message}\n\nQuery: ${soqlQuery}`, true);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const toolingQuerySchema = {
|
|
46
|
+
soqlQuery: z.string().describe('The SOQL query to execute against the Tooling API.'),
|
|
47
|
+
};
|
|
48
|
+
export const toolingQueryDescriptor = {
|
|
49
|
+
name: 'salesforce_tooling_query',
|
|
50
|
+
description: toolingQueryTool.description,
|
|
51
|
+
schema: toolingQuerySchema,
|
|
52
|
+
handler: handleToolingQuery,
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=toolingQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolingQuery.js","sourceRoot":"","sources":["../../src/tools/toolingQuery.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,0BAA0B;IAChC,WAAW,EAAE,4aAA4a;IACzb,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oDAAoD;aAClE;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;CACF,CAAC;AAMF,SAAS,eAAe,CAAC,GAAQ;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,KAAK,YAAY;gBAAE,SAAS;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAgB,EAAE,IAAsB;IAC/E,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,YAAY,CACjB,GAAG,MAAM,CAAC,SAAS,2BAA2B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,SAAS,EAAE,CACxG,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,yBAAyB,KAAK,CAAC,OAAO,cAAc,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CACrF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,gBAAgB,CAAC,WAAW;IACzC,MAAM,EAAE,kBAAkB;IAC1B,OAAO,EAAE,kBAAkB;CAC5B,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const userPermissionsTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
operation: {
|
|
10
|
+
type: string;
|
|
11
|
+
enum: string[];
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
permissions: {
|
|
15
|
+
type: string;
|
|
16
|
+
items: {
|
|
17
|
+
type: string;
|
|
18
|
+
};
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
profileNames: {
|
|
22
|
+
type: string;
|
|
23
|
+
items: {
|
|
24
|
+
type: string;
|
|
25
|
+
};
|
|
26
|
+
description: string;
|
|
27
|
+
};
|
|
28
|
+
permissionSetNames: {
|
|
29
|
+
type: string;
|
|
30
|
+
items: {
|
|
31
|
+
type: string;
|
|
32
|
+
};
|
|
33
|
+
description: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
required: string[];
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export interface UserPermissionsArgs {
|
|
40
|
+
operation: 'list' | 'enable' | 'disable';
|
|
41
|
+
permissions: string[];
|
|
42
|
+
profileNames?: string[];
|
|
43
|
+
permissionSetNames?: string[];
|
|
44
|
+
}
|
|
45
|
+
export declare function handleUserPermissions(conn: Connection, args: UserPermissionsArgs): Promise<{
|
|
46
|
+
content: {
|
|
47
|
+
type: "text";
|
|
48
|
+
text: string;
|
|
49
|
+
}[];
|
|
50
|
+
isError: boolean;
|
|
51
|
+
}>;
|
|
52
|
+
export declare const userPermissionsSchema: {
|
|
53
|
+
operation: z.ZodEnum<{
|
|
54
|
+
list: "list";
|
|
55
|
+
enable: "enable";
|
|
56
|
+
disable: "disable";
|
|
57
|
+
}>;
|
|
58
|
+
permissions: z.ZodArray<z.ZodString>;
|
|
59
|
+
profileNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
60
|
+
permissionSetNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
61
|
+
};
|
|
62
|
+
export declare const userPermissionsDescriptor: {
|
|
63
|
+
name: string;
|
|
64
|
+
description: string;
|
|
65
|
+
schema: {
|
|
66
|
+
operation: z.ZodEnum<{
|
|
67
|
+
list: "list";
|
|
68
|
+
enable: "enable";
|
|
69
|
+
disable: "disable";
|
|
70
|
+
}>;
|
|
71
|
+
permissions: z.ZodArray<z.ZodString>;
|
|
72
|
+
profileNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
73
|
+
permissionSetNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
74
|
+
};
|
|
75
|
+
handler: typeof handleUserPermissions;
|
|
76
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
export const userPermissionsTool = {
|
|
4
|
+
name: 'salesforce_manage_user_permissions',
|
|
5
|
+
description: 'View, enable, or disable user/system permission flags (e.g. ModifyAllData, ApiEnabled) on profiles and permission sets. Use salesforce_list_user_permissions to discover available permission names.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
operation: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
enum: ['list', 'enable', 'disable'],
|
|
12
|
+
description: "'list' = show ON/OFF status. 'enable' = turn on. 'disable' = turn off.",
|
|
13
|
+
},
|
|
14
|
+
permissions: {
|
|
15
|
+
type: 'array',
|
|
16
|
+
items: { type: 'string' },
|
|
17
|
+
description: "Short permission names (the part after 'Permissions'). Examples: ['ModifyAllData', 'ApiEnabled']. Use salesforce_list_user_permissions to discover names.",
|
|
18
|
+
},
|
|
19
|
+
profileNames: {
|
|
20
|
+
type: 'array',
|
|
21
|
+
items: { type: 'string' },
|
|
22
|
+
description: "Profile names. Default: ['System Administrator'] if neither profileNames nor permissionSetNames provided.",
|
|
23
|
+
},
|
|
24
|
+
permissionSetNames: {
|
|
25
|
+
type: 'array',
|
|
26
|
+
items: { type: 'string' },
|
|
27
|
+
description: 'Permission Set API names or labels.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['operation', 'permissions'],
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
async function resolveTargets(conn, profileNames, permSetNames) {
|
|
34
|
+
const results = [];
|
|
35
|
+
for (const name of profileNames) {
|
|
36
|
+
const profResult = await conn.query(`SELECT Id FROM Profile WHERE Name = '${name.replace(/'/g, "\\'")}'`);
|
|
37
|
+
if (!profResult.records?.length)
|
|
38
|
+
throw new Error(`Profile "${name}" not found`);
|
|
39
|
+
const profileId = profResult.records[0].Id;
|
|
40
|
+
const psResult = await conn.query(`SELECT Id FROM PermissionSet WHERE ProfileId = '${profileId}' AND IsOwnedByProfile = true`);
|
|
41
|
+
if (!psResult.records?.length)
|
|
42
|
+
throw new Error(`No owned PermissionSet found for profile "${name}"`);
|
|
43
|
+
results.push({ id: psResult.records[0].Id, label: name });
|
|
44
|
+
}
|
|
45
|
+
for (const name of permSetNames) {
|
|
46
|
+
const escaped = name.replace(/'/g, "\\'");
|
|
47
|
+
const psResult = await conn.query(`SELECT Id, Name, Label FROM PermissionSet WHERE IsOwnedByProfile = false AND (Name = '${escaped}' OR Label = '${escaped}')`);
|
|
48
|
+
if (!psResult.records?.length)
|
|
49
|
+
throw new Error(`Permission Set "${name}" not found`);
|
|
50
|
+
const rec = psResult.records[0];
|
|
51
|
+
results.push({ id: rec.Id, label: rec.Label || rec.Name });
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
export async function handleUserPermissions(conn, args) {
|
|
56
|
+
const { operation } = args;
|
|
57
|
+
const permissions = args.permissions;
|
|
58
|
+
if (!permissions?.length) {
|
|
59
|
+
return toolResponse("At least one permission name must be provided in the 'permissions' array.", true);
|
|
60
|
+
}
|
|
61
|
+
// Strip leading "Permissions" prefix if accidentally included
|
|
62
|
+
const shortNames = permissions.map((p) => p.startsWith('Permissions') ? p.slice('Permissions'.length) : p);
|
|
63
|
+
const fieldNames = shortNames.map((s) => `Permissions${s}`);
|
|
64
|
+
try {
|
|
65
|
+
if (operation === 'list') {
|
|
66
|
+
const filterProfiles = args.profileNames || [];
|
|
67
|
+
const filterPermSets = args.permissionSetNames || [];
|
|
68
|
+
let targets = [];
|
|
69
|
+
if (filterProfiles.length > 0 || filterPermSets.length > 0) {
|
|
70
|
+
targets = await resolveTargets(conn, filterProfiles, filterPermSets);
|
|
71
|
+
}
|
|
72
|
+
const selectFields = ['Id', 'Label', 'ProfileId', ...fieldNames].join(', ');
|
|
73
|
+
const whereClause = targets.length > 0
|
|
74
|
+
? ` WHERE Id IN ('${targets.map((t) => t.id).join("','")}') `
|
|
75
|
+
: ' ';
|
|
76
|
+
const result = await conn.query(`SELECT ${selectFields} FROM PermissionSet${whereClause}ORDER BY Label ASC`);
|
|
77
|
+
if (!result.records?.length) {
|
|
78
|
+
return toolResponse('No matching permission sets / profiles found.');
|
|
79
|
+
}
|
|
80
|
+
const lines = [];
|
|
81
|
+
for (const rec of result.records) {
|
|
82
|
+
const rowLabel = rec.Label || rec.Name || rec.Id;
|
|
83
|
+
const statuses = shortNames
|
|
84
|
+
.map((s, i) => `${s}: ${rec[fieldNames[i]] ? 'ON' : 'OFF'}`)
|
|
85
|
+
.join(', ');
|
|
86
|
+
lines.push(`${rowLabel}: ${statuses}`);
|
|
87
|
+
}
|
|
88
|
+
return toolResponse(`User/system permission status:\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 resolveTargets(conn, effectiveProfiles, permSetNames);
|
|
96
|
+
const results = [];
|
|
97
|
+
const newValue = operation === 'enable';
|
|
98
|
+
for (const { id: permSetId, label } of targets) {
|
|
99
|
+
try {
|
|
100
|
+
const updatePayload = { Id: permSetId };
|
|
101
|
+
for (const field of fieldNames) {
|
|
102
|
+
updatePayload[field] = newValue;
|
|
103
|
+
}
|
|
104
|
+
await conn.sobject('PermissionSet').update(updatePayload);
|
|
105
|
+
const verb = newValue ? 'Enabled' : 'Disabled';
|
|
106
|
+
results.push(`${verb} for "${label}": ${shortNames.join(', ')}`);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
results.push(`Failed for "${label}": ${err.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return toolResponse(`User/system permissions ${operation} results:\n\n${results.join('\n')}`);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return toolResponse(`User permissions ${operation} failed: ${error.message}`, true);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export const userPermissionsSchema = {
|
|
119
|
+
operation: z.enum(['list', 'enable', 'disable']).describe("'list' = show status. 'enable' = turn on. 'disable' = turn off."),
|
|
120
|
+
permissions: z.array(z.string()).describe("Short permission names (after 'Permissions'). E.g. ['ModifyAllData', 'ApiEnabled']."),
|
|
121
|
+
profileNames: z.array(z.string()).describe("Profile names. Default: ['System Administrator'] if neither provided.").optional(),
|
|
122
|
+
permissionSetNames: z.array(z.string()).describe('Permission Set API names or labels.').optional(),
|
|
123
|
+
};
|
|
124
|
+
export const userPermissionsDescriptor = {
|
|
125
|
+
name: 'salesforce_manage_user_permissions',
|
|
126
|
+
description: userPermissionsTool.description,
|
|
127
|
+
schema: userPermissionsSchema,
|
|
128
|
+
handler: handleUserPermissions,
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=userPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userPermissions.js","sourceRoot":"","sources":["../../src/tools/userPermissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Connection } from 'jsforce';
|
|
2
|
+
export declare const versionMetadataCompleteTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
retrieveId: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
repoUrl: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
branchName: {
|
|
17
|
+
type: string;
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
commitMessage: {
|
|
21
|
+
type: string;
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
subdirectory: {
|
|
25
|
+
type: string;
|
|
26
|
+
description: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
required: string[];
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export interface VersionMetadataCompleteArgs {
|
|
33
|
+
retrieveId: string;
|
|
34
|
+
repoUrl: string;
|
|
35
|
+
branchName: string;
|
|
36
|
+
commitMessage: string;
|
|
37
|
+
subdirectory?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function handleVersionMetadataComplete(_conn: Connection, args: VersionMetadataCompleteArgs): Promise<{
|
|
40
|
+
content: {
|
|
41
|
+
type: "text";
|
|
42
|
+
text: string;
|
|
43
|
+
}[];
|
|
44
|
+
isError: boolean;
|
|
45
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as e from"node:fs";import*as t from"node:path";import{execFileSync as r}from"node:child_process";import{createInflateRaw as o}from"node:zlib";import{toolResponse as n}from"../utils/index.js";import{getRetrieveEntry as i,deleteRetrieveEntry as a}from"../utils/retrieveStore.js";export const versionMetadataCompleteTool={name:"salesforce_version_metadata_complete",description:"Convert retrieved metadata from MDAPI to Salesforce DX source format and commit/push to a git repository branch. Requires a completed retrieve from salesforce_version_metadata_status.",inputSchema:{type:"object",properties:{retrieveId:{type:"string",description:"The retrieve ID from a completed salesforce_version_metadata_start operation."},repoUrl:{type:"string",description:"Git repository URL to clone and push to (e.g. https://github.com/org/repo.git)."},branchName:{type:"string",description:"Branch name to create or update in the repository."},commitMessage:{type:"string",description:"Git commit message for the metadata snapshot."},subdirectory:{type:"string",description:"Optional subdirectory within the repo to place converted source. Defaults to repo root."}},required:["retrieveId","repoUrl","branchName","commitMessage"]}};function s(e,t){return r("git",e,{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}function c(r,o){const n=e.readdirSync(r,{withFileTypes:!0});for(const i of n){const n=t.join(r,i.name),a=t.join(o,i.name);i.isDirectory()?(e.mkdirSync(a,{recursive:!0}),c(n,a)):e.copyFileSync(n,a)}}function d(t){try{e.rmSync(t,{recursive:!0,force:!0})}catch{}}export async function handleVersionMetadataComplete(r,p){const{retrieveId:m,repoUrl:u,branchName:l,commitMessage:y,subdirectory:f}=p,h=i(m);if(!h)return n(`No retrieve operation found for ID "${m}". It may have already been completed or the server was restarted.`,!0);if("Succeeded"!==h.status||!h.zipPath)return n(`Retrieve "${m}" is not ready. Current status: ${h.status}. Use salesforce_version_metadata_status to check and wait for completion first.`,!0);const{tempDir:v,zipPath:g}=h;try{const r=t.join(v,"mdapi_source");e.mkdirSync(r,{recursive:!0}),process.stderr.write(`[versionMetadata] Extracting zip to ${r}\n`),await async function(r,n){const i=e.readFileSync(r);let a=0;for(;a<i.length-4&&80===i[a]&&75===i[a+1]&&3===i[a+2]&&4===i[a+3];){const r=i.readUInt16LE(a+8),s=i.readUInt32LE(a+18),c=i.readUInt16LE(a+26),d=i.readUInt16LE(a+28),p=i.subarray(a+30,a+30+c).toString("utf-8"),m=a+30+c+d;if(p.endsWith("/"))e.mkdirSync(t.join(n,p),{recursive:!0});else{const a=t.join(n,p);e.mkdirSync(t.dirname(a),{recursive:!0});const c=i.subarray(m,m+s);if(0===r)e.writeFileSync(a,c);else{if(8!==r)throw new Error(`Unsupported compression method ${r} for ${p}`);{const t=await new Promise((e,t)=>{const r=[],n=o();n.on("data",e=>r.push(e)),n.on("end",()=>e(Buffer.concat(r))),n.on("error",t),n.end(c)});e.writeFileSync(a,t)}}}a=m+s}}(g,r);const i=e.readdirSync(r);let p=r;if(1===i.length){const o=t.join(r,i[0]);e.statSync(o).isDirectory()&&(p=o)}const h=t.join(v,"dx_source");e.mkdirSync(h,{recursive:!0}),process.stderr.write("[versionMetadata] Converting MDAPI → DX source format\n"),await async function(e,t){const{MetadataConverter:r,MetadataResolver:o}=await import("@salesforce/source-deploy-retrieve"),n=(new o).getComponentsFromPath(e),i=new r;await i.convert(Array.from(n),"source",{type:"directory",outputDirectory:t})}(p,h);const w=t.join(v,"repo");process.stderr.write(`[versionMetadata] Cloning ${u}\n`),s(["clone","--depth","1","--no-single-branch",u,w],v);let S=!1;try{s(["rev-parse","--verify",`origin/${l}`],w),s(["checkout",l],w)}catch{let e="master";for(const t of["develop","main","master"])try{s(["rev-parse","--verify",`origin/${t}`],w),e=t;break}catch{continue}s(["checkout","-b",l,`origin/${e}`],w),S=!0}const $=f?t.join(w,f):w;f&&e.mkdirSync($,{recursive:!0}),c(h,$),s(["add","-A"],w);const b=s(["status","--porcelain"],w);if(!b)return d(v),a(m),n(`No changes detected.\n\nThe converted metadata is identical to what's already in the "${l}" branch. Nothing to commit.`);s(["commit","-m",y],w),s(["push","-u","origin",l],w);const _=s(["rev-parse","HEAD"],w),M=b.split("\n").filter(Boolean).length;return d(v),a(m),n(`Metadata successfully committed and pushed.\n\nCommit: ${_}\nBranch: ${l}${S?" (newly created)":""}\nRepository: ${u}\nFiles changed: ${M}\nMessage: ${y}`)}catch(e){return n(`Failed to complete metadata versioning: ${e.message}\n\nTemp directory preserved for debugging: ${v}`,!0)}}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Connection } from 'jsforce';
|
|
2
|
+
export declare const versionMetadataStartTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
packageXml: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
required: string[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export interface VersionMetadataStartArgs {
|
|
17
|
+
packageXml: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function handleVersionMetadataStart(conn: Connection, args: VersionMetadataStartArgs): Promise<{
|
|
20
|
+
content: {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError: boolean;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as e from"node:fs";import*as t from"node:os";import*as s from"node:path";import{toolResponse as r}from"../utils/index.js";import{setRetrieveEntry as a}from"../utils/retrieveStore.js";export const versionMetadataStartTool={name:"salesforce_version_metadata_start",description:"Start a metadata retrieve from Salesforce using a package.xml definition. Returns a retrieveId — use salesforce_version_metadata_status to poll for completion, then salesforce_version_metadata_complete to convert and push to git.",inputSchema:{type:"object",properties:{packageXml:{type:"string",description:"The full XML content of a package.xml file defining which metadata types and members to retrieve."}},required:["packageXml"]}};export async function handleVersionMetadataStart(n,o){const{packageXml:i}=o;try{const o=function(e){const t=[],s=e.match(/<version>\s*([^<]+)\s*<\/version>/),r=s?s[1].trim():"62.0",a=/<types>([\s\S]*?)<\/types>/g;let n;for(;null!==(n=a.exec(e));){const e=n[1],s=e.match(/<name>\s*([^<]+)\s*<\/name>/);if(!s)continue;const r=s[1].trim(),a=[],o=/<members>\s*([^<]+)\s*<\/members>/g;let i;for(;null!==(i=o.exec(e));)a.push(i[1].trim());a.length>0&&t.push({members:a,name:r})}return{types:t,version:r}}(i);if(0===o.types.length)return r("Failed to parse package.xml: no valid <types> blocks found. Ensure the XML contains <types> with <name> and <members> elements.",!0);const m=(await n.metadata.retrieve({apiVersion:o.version,unpackaged:{types:o.types.map(e=>({members:e.members,name:e.name})),version:o.version}})).id,p=e.mkdtempSync(s.join(t.tmpdir(),"sf-version-"));a({retrieveId:m,status:"InProgress",packageXml:i,tempDir:p,createdAt:Date.now()});const c=o.types.map(e=>` - ${e.name}: ${e.members.join(", ")}`).join("\n");return r(`Metadata retrieve started successfully.\n\nRetrieve ID: ${m}\nAPI Version: ${o.version}\nTypes requested:\n${c}\n\nNext step: Use salesforce_version_metadata_status with retrieveId "${m}" to check progress.`)}catch(e){return r(`Failed to start metadata retrieve: ${e.message}`,!0)}}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Connection } from 'jsforce';
|
|
2
|
+
export declare const versionMetadataStatusTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
retrieveId: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
required: string[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export interface VersionMetadataStatusArgs {
|
|
17
|
+
retrieveId: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function handleVersionMetadataStatus(conn: Connection, args: VersionMetadataStatusArgs): Promise<{
|
|
20
|
+
content: {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError: boolean;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as e from"node:fs";import*as t from"node:path";import{toolResponse as r}from"../utils/index.js";import{getRetrieveEntry as s,setRetrieveEntry as a}from"../utils/retrieveStore.js";export const versionMetadataStatusTool={name:"salesforce_version_metadata_status",description:"Check the status of a metadata retrieve started with salesforce_version_metadata_start. When complete, the zip is saved to disk for salesforce_version_metadata_complete.",inputSchema:{type:"object",properties:{retrieveId:{type:"string",description:"The retrieve ID returned by salesforce_version_metadata_start."}},required:["retrieveId"]}};export async function handleVersionMetadataStatus(o,i){const{retrieveId:n}=i,c=s(n);if(!c)return r(`No retrieve operation found for ID "${n}". It may have already been completed or the server was restarted.`,!0);try{const s=await o.metadata.checkRetrieveStatus(n);if(!s.done)return r(`Retrieve is still in progress.\n\nRetrieve ID: ${n}\nStatus: ${s.status}\n\nNext step: Call salesforce_version_metadata_status again in a few seconds to re-check.`);if(s.success){const o=t.join(c.tempDir,"retrieve.zip"),i=Buffer.from(s.zipFile,"base64");return e.writeFileSync(o,i),a({...c,status:"Succeeded",zipPath:o}),r(`Retrieve completed successfully.\n\nRetrieve ID: ${n}\nStatus: Succeeded\nZip size: ${(i.length/1024).toFixed(1)} KB\nSaved to: ${o}\n\nNext step: Use salesforce_version_metadata_complete with retrieveId "${n}" plus repoUrl, branchName, and commitMessage to convert and push to git.`)}const i=s.errorMessage||"Unknown error";return a({...c,status:"Failed",errorMessage:i}),r(`Retrieve failed.\n\nRetrieve ID: ${n}\nError: ${i}`,!0)}catch(e){return r(`Failed to check retrieve status: ${e.message}`,!0)}}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const writeApexClassesTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
operation: {
|
|
10
|
+
type: string;
|
|
11
|
+
enum: string[];
|
|
12
|
+
};
|
|
13
|
+
className: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
body: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
apiVersion: {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
required: string[];
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export interface WriteApexClassesArgs {
|
|
30
|
+
operation: 'create' | 'update';
|
|
31
|
+
className: string;
|
|
32
|
+
body: string;
|
|
33
|
+
apiVersion?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function handleWriteApexClasses(conn: Connection, args: WriteApexClassesArgs): Promise<{
|
|
36
|
+
content: {
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}[];
|
|
40
|
+
isError: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
export declare const writeApexClassesSchema: {
|
|
43
|
+
operation: z.ZodEnum<{
|
|
44
|
+
update: "update";
|
|
45
|
+
create: "create";
|
|
46
|
+
}>;
|
|
47
|
+
className: z.ZodString;
|
|
48
|
+
body: z.ZodString;
|
|
49
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
50
|
+
};
|
|
51
|
+
export declare const writeApexClassesDescriptor: {
|
|
52
|
+
name: string;
|
|
53
|
+
description: string;
|
|
54
|
+
schema: {
|
|
55
|
+
operation: z.ZodEnum<{
|
|
56
|
+
update: "update";
|
|
57
|
+
create: "create";
|
|
58
|
+
}>;
|
|
59
|
+
className: z.ZodString;
|
|
60
|
+
body: z.ZodString;
|
|
61
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
62
|
+
};
|
|
63
|
+
handler: typeof handleWriteApexClasses;
|
|
64
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse } from '../utils/index.js';
|
|
3
|
+
import { deployApexViaContainer } from '../utils/apexContainer.js';
|
|
4
|
+
export const writeApexClassesTool = {
|
|
5
|
+
name: 'salesforce_write_apex_class',
|
|
6
|
+
description: 'Create or update an Apex class via the Tooling API. Validates that the body contains the correct class/interface/enum name before saving.',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
operation: {
|
|
11
|
+
type: 'string',
|
|
12
|
+
enum: ['create', 'update'],
|
|
13
|
+
},
|
|
14
|
+
className: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'The Apex class name.',
|
|
17
|
+
},
|
|
18
|
+
body: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'The full Apex class source code.',
|
|
21
|
+
},
|
|
22
|
+
apiVersion: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Salesforce API version. Default: "58.0".',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ['operation', 'className', 'body'],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export async function handleWriteApexClasses(conn, args) {
|
|
31
|
+
const { operation, className, body, apiVersion = '58.0' } = args;
|
|
32
|
+
const namePattern = new RegExp(`(class|interface|enum)\\s+${className.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'i');
|
|
33
|
+
if (!namePattern.test(body)) {
|
|
34
|
+
return toolResponse(`Body does not contain a class, interface, or enum named "${className}". Ensure the body includes: class ${className}, interface ${className}, or enum ${className}.`, true);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
if (operation === 'create') {
|
|
38
|
+
const existing = await conn.tooling.query(`SELECT Id FROM ApexClass WHERE Name = '${className.replace(/'/g, "\\'")}'`);
|
|
39
|
+
if (existing.records && existing.records.length > 0) {
|
|
40
|
+
return toolResponse(`Apex class "${className}" already exists. Use operation "update" instead.`, true);
|
|
41
|
+
}
|
|
42
|
+
const result = await conn.tooling.sobject('ApexClass').create({
|
|
43
|
+
Name: className,
|
|
44
|
+
Body: body,
|
|
45
|
+
ApiVersion: apiVersion,
|
|
46
|
+
});
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
return toolResponse(`Failed to create class: ${JSON.stringify(result.errors)}`, true);
|
|
49
|
+
}
|
|
50
|
+
return toolResponse(`Apex class "${className}" created.\nID: ${result.id}\nAPI Version: ${apiVersion}`);
|
|
51
|
+
}
|
|
52
|
+
// Update
|
|
53
|
+
const existing = await conn.tooling.query(`SELECT Id, LastModifiedDate FROM ApexClass WHERE Name = '${className.replace(/'/g, "\\'")}'`);
|
|
54
|
+
if (!existing.records || existing.records.length === 0) {
|
|
55
|
+
return toolResponse(`Apex class "${className}" not found. Use operation "create" instead.`, true);
|
|
56
|
+
}
|
|
57
|
+
const cls = existing.records[0];
|
|
58
|
+
const error = await deployApexViaContainer(conn, 'ApexClassMember', cls.Id, body, className);
|
|
59
|
+
if (error)
|
|
60
|
+
return toolResponse(`Failed to update class: ${error}`, true);
|
|
61
|
+
return toolResponse(`Apex class "${className}" updated.\nID: ${cls.Id}\nPrevious modified: ${cls.LastModifiedDate}`);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return toolResponse(`Apex class ${operation} failed: ${error.message}`, true);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export const writeApexClassesSchema = {
|
|
68
|
+
operation: z.enum(['create', 'update']),
|
|
69
|
+
className: z.string().describe('The Apex class name.'),
|
|
70
|
+
body: z.string().describe('The full Apex class source code.'),
|
|
71
|
+
apiVersion: z.string().describe('Salesforce API version. Default: "58.0".').optional(),
|
|
72
|
+
};
|
|
73
|
+
export const writeApexClassesDescriptor = {
|
|
74
|
+
name: 'salesforce_write_apex_class',
|
|
75
|
+
description: writeApexClassesTool.description,
|
|
76
|
+
schema: writeApexClassesSchema,
|
|
77
|
+
handler: handleWriteApexClasses,
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=writeApexClasses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeApexClasses.js","sourceRoot":"","sources":["../../src/tools/writeApexClasses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const writeApexTriggersTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
operation: {
|
|
10
|
+
type: string;
|
|
11
|
+
enum: string[];
|
|
12
|
+
};
|
|
13
|
+
triggerName: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
body: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
objectName: {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
apiVersion: {
|
|
26
|
+
type: string;
|
|
27
|
+
description: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
required: string[];
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export interface WriteApexTriggersArgs {
|
|
34
|
+
operation: 'create' | 'update';
|
|
35
|
+
triggerName: string;
|
|
36
|
+
body: string;
|
|
37
|
+
objectName?: string;
|
|
38
|
+
apiVersion?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function handleWriteApexTriggers(conn: Connection, args: WriteApexTriggersArgs): Promise<{
|
|
41
|
+
content: {
|
|
42
|
+
type: "text";
|
|
43
|
+
text: string;
|
|
44
|
+
}[];
|
|
45
|
+
isError: boolean;
|
|
46
|
+
}>;
|
|
47
|
+
export declare const writeApexTriggersSchema: {
|
|
48
|
+
operation: z.ZodEnum<{
|
|
49
|
+
update: "update";
|
|
50
|
+
create: "create";
|
|
51
|
+
}>;
|
|
52
|
+
triggerName: z.ZodString;
|
|
53
|
+
body: z.ZodString;
|
|
54
|
+
objectName: z.ZodOptional<z.ZodString>;
|
|
55
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
56
|
+
};
|
|
57
|
+
export declare const writeApexTriggersDescriptor: {
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
schema: {
|
|
61
|
+
operation: z.ZodEnum<{
|
|
62
|
+
update: "update";
|
|
63
|
+
create: "create";
|
|
64
|
+
}>;
|
|
65
|
+
triggerName: z.ZodString;
|
|
66
|
+
body: z.ZodString;
|
|
67
|
+
objectName: z.ZodOptional<z.ZodString>;
|
|
68
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
69
|
+
};
|
|
70
|
+
handler: typeof handleWriteApexTriggers;
|
|
71
|
+
};
|