@acquis-consulting/asm 1.0.10 → 1.0.11
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/dist/index.js +43 -16
- package/dist/index.js.map +1 -1
- package/dist/tools/appTabManagement.d.ts +57 -0
- package/dist/tools/appTabManagement.js +124 -0
- package/dist/tools/appTabManagement.js.map +1 -0
- package/dist/tools/createRecordPage.d.ts +219 -0
- package/dist/tools/createRecordPage.js +368 -0
- package/dist/tools/createRecordPage.js.map +1 -0
- package/dist/tools/debugLogs.d.ts +7 -0
- package/dist/tools/debugLogs.js +10 -2
- package/dist/tools/debugLogs.js.map +1 -1
- package/dist/tools/downloadFiles.d.ts +87 -0
- package/dist/tools/downloadFiles.js +1 -0
- package/dist/tools/executeAnonymous.js +3 -3
- package/dist/tools/executeAnonymous.js.map +1 -1
- package/dist/tools/fieldManagement.d.ts +7 -0
- package/dist/tools/fieldManagement.js +9 -0
- package/dist/tools/fieldManagement.js.map +1 -1
- package/dist/tools/objectManagement.d.ts +7 -0
- package/dist/tools/objectManagement.js +60 -3
- package/dist/tools/objectManagement.js.map +1 -1
- package/dist/utils/connection.js +6 -4
- package/dist/utils/connection.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logCompressor.d.ts +1 -0
- package/dist/utils/logCompressor.js +55 -0
- package/dist/utils/logCompressor.js.map +1 -0
- package/dist/utils/orgGuard.d.ts +2 -0
- package/dist/utils/orgGuard.js +23 -0
- package/dist/utils/orgGuard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { toolResponse, formatMetadataErrors } from '../utils/index.js';
|
|
3
|
+
const TEMPLATES = {
|
|
4
|
+
OneColumn: {
|
|
5
|
+
developerName: 'flexipage:recordHomeTemplateDesktop',
|
|
6
|
+
regions: ['header', 'main'],
|
|
7
|
+
},
|
|
8
|
+
TwoColumn: {
|
|
9
|
+
developerName: 'flexipage:recordHomeTemplateDesktop',
|
|
10
|
+
regions: ['header', 'main', 'sidebar'],
|
|
11
|
+
},
|
|
12
|
+
ThreeColumn: {
|
|
13
|
+
developerName: 'flexipage:recordHomeThreeRegionTemplateDesktop',
|
|
14
|
+
regions: ['header', 'left', 'main', 'right'],
|
|
15
|
+
},
|
|
16
|
+
HeaderLeftSidebar: {
|
|
17
|
+
developerName: 'flexipage:recordHomeLeftSidebarTemplateDesktop',
|
|
18
|
+
regions: ['header', 'sidebar', 'main'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
const STANDARD_COMPONENT_NAMES = {
|
|
22
|
+
highlights: 'force:highlightsPanel',
|
|
23
|
+
activity: 'runtime_sales_activities:activitiesObject',
|
|
24
|
+
chatter: 'runtime_chatter:feedContainer',
|
|
25
|
+
};
|
|
26
|
+
export const createRecordPageTool = {
|
|
27
|
+
name: 'salesforce_create_record_page',
|
|
28
|
+
description: 'Create a Salesforce Lightning Record Page (FlexiPage with Dynamic Forms) for an SObject from a JSON spec describing sections, fields, tabs, and a page template. Before calling, use salesforce_describe_object to learn the object\'s field API names, child relationship names, and record types — passing wrong API names will cause the deploy to fail. After the page is created it is automatically set as the System Administrator profile\'s default View action for that object (set setAsAdminDefault=false to skip).',
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
pageName: { type: 'string', description: 'Developer name for the FlexiPage. Letters, numbers, and underscores only.' },
|
|
33
|
+
masterLabel: { type: 'string', description: 'Human-readable label shown in Lightning App Builder.' },
|
|
34
|
+
sobjectType: { type: 'string', description: 'Target SObject API name (e.g. "Account", "MyObj__c").' },
|
|
35
|
+
template: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
enum: ['OneColumn', 'TwoColumn', 'ThreeColumn', 'HeaderLeftSidebar'],
|
|
38
|
+
description: 'Page template. OneColumn=header+main, TwoColumn=header+main+sidebar, ThreeColumn=header+left+main+right, HeaderLeftSidebar=header+sidebar+main.',
|
|
39
|
+
},
|
|
40
|
+
sections: {
|
|
41
|
+
type: 'array',
|
|
42
|
+
description: 'Body field sections (Dynamic Forms). For ThreeColumn, the first half are placed in the left column.',
|
|
43
|
+
},
|
|
44
|
+
tabs: { type: 'array', description: 'Optional tabset placed at the bottom of the main region.' },
|
|
45
|
+
setAsAdminDefault: { type: 'boolean', description: 'Override the System Administrator profile\'s View action for this SObject. Default: true.' },
|
|
46
|
+
},
|
|
47
|
+
required: ['pageName', 'masterLabel', 'sobjectType', 'template', 'sections'],
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const fieldSpecSchema = z.object({
|
|
51
|
+
apiName: z.string().describe('Field API name (e.g. "Name", "MyField__c").'),
|
|
52
|
+
behavior: z.enum(['Readonly', 'Edit', 'Required']).describe('Field UI behavior. Default: Edit.').optional(),
|
|
53
|
+
});
|
|
54
|
+
const sectionSchema = z.object({
|
|
55
|
+
label: z.string().describe('Section header.'),
|
|
56
|
+
columns: z.union([z.literal(1), z.literal(2), z.literal(3)]).describe('Column count inside the section. Default: 2.').optional(),
|
|
57
|
+
collapsible: z.boolean().describe('Whether the section can be collapsed. Default: true.').optional(),
|
|
58
|
+
fields: z.array(fieldSpecSchema).describe('Fields rendered inside this section, in order.'),
|
|
59
|
+
});
|
|
60
|
+
const tabItemSchema = z.discriminatedUnion('type', [
|
|
61
|
+
z.object({
|
|
62
|
+
type: z.literal('fieldSection'),
|
|
63
|
+
label: z.string(),
|
|
64
|
+
columns: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
|
|
65
|
+
collapsible: z.boolean().optional(),
|
|
66
|
+
fields: z.array(fieldSpecSchema),
|
|
67
|
+
}),
|
|
68
|
+
z.object({
|
|
69
|
+
type: z.literal('relatedList'),
|
|
70
|
+
relationshipName: z.string().describe('Child relationship name (e.g. "Contacts" on Account).'),
|
|
71
|
+
}),
|
|
72
|
+
z.object({
|
|
73
|
+
type: z.literal('reportChart'),
|
|
74
|
+
reportId: z.string().describe('15- or 18-character Salesforce report ID.'),
|
|
75
|
+
}),
|
|
76
|
+
z.object({
|
|
77
|
+
type: z.literal('standard'),
|
|
78
|
+
component: z.enum(['highlights', 'activity', 'chatter']),
|
|
79
|
+
}),
|
|
80
|
+
]);
|
|
81
|
+
const tabSchema = z.object({
|
|
82
|
+
label: z.string().describe('Tab label.'),
|
|
83
|
+
items: z.array(tabItemSchema).describe('Components rendered inside the tab, in order.'),
|
|
84
|
+
});
|
|
85
|
+
export const createRecordPageSchema = {
|
|
86
|
+
pageName: z.string().describe('Developer name for the FlexiPage. Letters, numbers, and underscores only.'),
|
|
87
|
+
masterLabel: z.string().describe('Human-readable label shown in Lightning App Builder.'),
|
|
88
|
+
sobjectType: z.string().describe('Target SObject API name (e.g. "Account", "MyObj__c").'),
|
|
89
|
+
template: z
|
|
90
|
+
.enum(['OneColumn', 'TwoColumn', 'ThreeColumn', 'HeaderLeftSidebar'])
|
|
91
|
+
.describe('Page template. OneColumn=header+main, TwoColumn=header+main+sidebar, ThreeColumn=header+left+main+right, HeaderLeftSidebar=header+sidebar+main.'),
|
|
92
|
+
sections: z.array(sectionSchema).describe('Body field sections (Dynamic Forms). For ThreeColumn, the first half are placed in the left column.'),
|
|
93
|
+
relatedLists: z.array(z.string()).describe('Child relationship API names to append as individual related-list components (e.g. ["Contacts", "Opportunities"]). Use salesforce_describe_object to find valid child relationship names.').optional(),
|
|
94
|
+
relatedListsPlacement: z.enum(['main', 'right']).describe('Where to place related lists. "main" appends them below the field sections in the main region (default). "right" places them in the sidebar/right region — only valid for TwoColumn, ThreeColumn, or HeaderLeftSidebar templates.').optional(),
|
|
95
|
+
tabs: z.array(tabSchema).describe('Optional tabset placed at the bottom of the main region.').optional(),
|
|
96
|
+
setAsAdminDefault: z.boolean().describe('Override the System Administrator profile\'s View action for this SObject. Default: true.').optional(),
|
|
97
|
+
};
|
|
98
|
+
function makeIdGenerator() {
|
|
99
|
+
let n = 0;
|
|
100
|
+
return () => `id_${++n}`;
|
|
101
|
+
}
|
|
102
|
+
function buildSection(section, facetRegions, nextId) {
|
|
103
|
+
const columns = section.columns ?? 2;
|
|
104
|
+
const sectionFacetName = `facet_section_${nextId()}`;
|
|
105
|
+
const columnFacetNames = [];
|
|
106
|
+
for (let c = 0; c < columns; c++) {
|
|
107
|
+
columnFacetNames.push(`${sectionFacetName}_col${c + 1}`);
|
|
108
|
+
}
|
|
109
|
+
// Distribute fields round-robin across columns.
|
|
110
|
+
const columnFields = columnFacetNames.map(() => []);
|
|
111
|
+
section.fields.forEach((f, i) => columnFields[i % columns].push(f));
|
|
112
|
+
// The section's main facet — holds N column facets as componentInstances.
|
|
113
|
+
facetRegions.push({
|
|
114
|
+
name: sectionFacetName,
|
|
115
|
+
type: 'Facet',
|
|
116
|
+
itemInstances: columnFacetNames.map((colFacet) => ({
|
|
117
|
+
componentInstance: {
|
|
118
|
+
componentName: 'flexipage:column',
|
|
119
|
+
identifier: nextId(),
|
|
120
|
+
componentInstanceProperties: [
|
|
121
|
+
{ name: 'body', value: colFacet },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
})),
|
|
125
|
+
});
|
|
126
|
+
// One facet region per column, holding the field instances.
|
|
127
|
+
columnFacetNames.forEach((colFacet, idx) => {
|
|
128
|
+
facetRegions.push({
|
|
129
|
+
name: colFacet,
|
|
130
|
+
type: 'Facet',
|
|
131
|
+
itemInstances: columnFields[idx].map((f) => ({
|
|
132
|
+
fieldInstance: {
|
|
133
|
+
fieldItem: `Record.${f.apiName}`,
|
|
134
|
+
identifier: nextId(),
|
|
135
|
+
...(f.behavior ? { uiBehavior: f.behavior } : {}),
|
|
136
|
+
},
|
|
137
|
+
})),
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// Return the section componentInstance to embed in the parent region.
|
|
141
|
+
return {
|
|
142
|
+
componentInstance: {
|
|
143
|
+
componentName: 'flexipage:fieldSection',
|
|
144
|
+
identifier: nextId(),
|
|
145
|
+
componentInstanceProperties: [
|
|
146
|
+
{ name: 'columns', value: sectionFacetName },
|
|
147
|
+
{ name: 'horizontalAlignment', value: 'false' },
|
|
148
|
+
{ name: 'label', value: section.label },
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function buildTabItem(item, facetRegions, nextId) {
|
|
154
|
+
if (item.type === 'fieldSection') {
|
|
155
|
+
return buildSection(item, facetRegions, nextId);
|
|
156
|
+
}
|
|
157
|
+
if (item.type === 'relatedList') {
|
|
158
|
+
return {
|
|
159
|
+
componentInstance: {
|
|
160
|
+
componentName: 'force:relatedListSingleContainer',
|
|
161
|
+
identifier: nextId(),
|
|
162
|
+
componentInstanceProperties: [
|
|
163
|
+
{ name: 'relatedListApiName', value: item.relationshipName },
|
|
164
|
+
{ name: 'relatedListComponentOverride', value: 'NONE' },
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (item.type === 'reportChart') {
|
|
170
|
+
return {
|
|
171
|
+
componentInstance: {
|
|
172
|
+
componentName: 'flexipage:reportChart',
|
|
173
|
+
identifier: nextId(),
|
|
174
|
+
componentInstanceProperties: [
|
|
175
|
+
{ name: 'reportId', value: item.reportId },
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// standard
|
|
181
|
+
return {
|
|
182
|
+
componentInstance: {
|
|
183
|
+
componentName: STANDARD_COMPONENT_NAMES[item.component],
|
|
184
|
+
identifier: nextId(),
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function buildTabset(tabs, facetRegions, nextId) {
|
|
189
|
+
const tabsetFacetName = `facet_tabset_${nextId()}`;
|
|
190
|
+
const tabFacetNames = [];
|
|
191
|
+
// Outer tabset facet: contains one flexipage:tab componentInstance per tab.
|
|
192
|
+
const tabComponentInstances = tabs.map((tab, i) => {
|
|
193
|
+
const tabFacet = `${tabsetFacetName}_tab${i + 1}`;
|
|
194
|
+
tabFacetNames.push(tabFacet);
|
|
195
|
+
return {
|
|
196
|
+
componentInstance: {
|
|
197
|
+
componentName: 'flexipage:tab',
|
|
198
|
+
identifier: nextId(),
|
|
199
|
+
componentInstanceProperties: [
|
|
200
|
+
{ name: 'label', value: tab.label },
|
|
201
|
+
{ name: 'body', value: tabFacet },
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
});
|
|
206
|
+
facetRegions.push({
|
|
207
|
+
name: tabsetFacetName,
|
|
208
|
+
type: 'Facet',
|
|
209
|
+
itemInstances: tabComponentInstances,
|
|
210
|
+
});
|
|
211
|
+
// One facet per tab containing the tab's items.
|
|
212
|
+
tabs.forEach((tab, i) => {
|
|
213
|
+
const tabFacet = tabFacetNames[i];
|
|
214
|
+
facetRegions.push({
|
|
215
|
+
name: tabFacet,
|
|
216
|
+
type: 'Facet',
|
|
217
|
+
itemInstances: tab.items.map((item) => buildTabItem(item, facetRegions, nextId)),
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
componentInstance: {
|
|
222
|
+
componentName: 'flexipage:tabset',
|
|
223
|
+
identifier: nextId(),
|
|
224
|
+
componentInstanceProperties: [
|
|
225
|
+
{ name: 'tabs', value: tabsetFacetName },
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export function buildFlexiPageMetadata(args) {
|
|
231
|
+
const tpl = TEMPLATES[args.template];
|
|
232
|
+
const nextId = makeIdGenerator();
|
|
233
|
+
const facetRegions = [];
|
|
234
|
+
const regions = [];
|
|
235
|
+
// Header — auto highlights panel
|
|
236
|
+
if (tpl.regions.includes('header')) {
|
|
237
|
+
regions.push({
|
|
238
|
+
name: 'header',
|
|
239
|
+
type: 'Region',
|
|
240
|
+
itemInstances: [
|
|
241
|
+
{
|
|
242
|
+
componentInstance: {
|
|
243
|
+
componentName: 'force:highlightsPanel',
|
|
244
|
+
identifier: nextId(),
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
// Body section placement
|
|
251
|
+
let leftSections = [];
|
|
252
|
+
let mainSections = args.sections;
|
|
253
|
+
if (args.template === 'ThreeColumn' && args.sections.length > 1) {
|
|
254
|
+
const split = Math.ceil(args.sections.length / 2);
|
|
255
|
+
leftSections = args.sections.slice(0, split);
|
|
256
|
+
mainSections = args.sections.slice(split);
|
|
257
|
+
}
|
|
258
|
+
if (tpl.regions.includes('left') && leftSections.length > 0) {
|
|
259
|
+
regions.push({
|
|
260
|
+
name: 'left',
|
|
261
|
+
type: 'Region',
|
|
262
|
+
itemInstances: leftSections.map((s) => buildSection(s, facetRegions, nextId)),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
// Build related list component instances
|
|
266
|
+
const buildRelatedListItems = (names) => names.map((relationshipName) => ({
|
|
267
|
+
componentInstance: {
|
|
268
|
+
componentName: 'force:relatedListSingleContainer',
|
|
269
|
+
identifier: nextId(),
|
|
270
|
+
componentInstanceProperties: [
|
|
271
|
+
{ name: 'parentFieldApiName', value: `${args.sobjectType}.Id` },
|
|
272
|
+
{ name: 'relatedListApiName', value: relationshipName },
|
|
273
|
+
{ name: 'relatedListComponentOverride', value: 'NONE' },
|
|
274
|
+
],
|
|
275
|
+
},
|
|
276
|
+
}));
|
|
277
|
+
// Determine placement: 'right' routes to the template's sidebar/right region
|
|
278
|
+
const placeRight = args.relatedListsPlacement === 'right' && args.relatedLists && args.relatedLists.length > 0;
|
|
279
|
+
const sidebarRegionName = tpl.regions.find((r) => r === 'sidebar' || r === 'right');
|
|
280
|
+
// Main region: body sections + (related lists if placement=main) + tabset
|
|
281
|
+
const mainItems = mainSections.map((s) => buildSection(s, facetRegions, nextId));
|
|
282
|
+
if (args.relatedLists && args.relatedLists.length > 0 && !placeRight) {
|
|
283
|
+
mainItems.push(...buildRelatedListItems(args.relatedLists));
|
|
284
|
+
}
|
|
285
|
+
if (args.tabs && args.tabs.length > 0) {
|
|
286
|
+
mainItems.push(buildTabset(args.tabs, facetRegions, nextId));
|
|
287
|
+
}
|
|
288
|
+
regions.push({
|
|
289
|
+
name: 'main',
|
|
290
|
+
type: 'Region',
|
|
291
|
+
itemInstances: mainItems,
|
|
292
|
+
});
|
|
293
|
+
// Sidebar/right region: related lists when placement=right
|
|
294
|
+
if (placeRight && sidebarRegionName) {
|
|
295
|
+
regions.push({
|
|
296
|
+
name: sidebarRegionName,
|
|
297
|
+
type: 'Region',
|
|
298
|
+
itemInstances: buildRelatedListItems(args.relatedLists),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
fullName: args.pageName,
|
|
303
|
+
masterLabel: args.masterLabel,
|
|
304
|
+
type: 'RecordPage',
|
|
305
|
+
sobjectType: args.sobjectType,
|
|
306
|
+
template: { name: tpl.developerName },
|
|
307
|
+
flexiPageRegions: [...regions, ...facetRegions],
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
async function setAdminDefaultViewOverride(conn, sobjectType, pageName) {
|
|
311
|
+
try {
|
|
312
|
+
const result = await conn.metadata.update('Profile', {
|
|
313
|
+
fullName: 'Admin',
|
|
314
|
+
profileActionOverrides: [{
|
|
315
|
+
actionName: 'View',
|
|
316
|
+
content: pageName,
|
|
317
|
+
formFactor: 'Large',
|
|
318
|
+
pageOrSobjectType: sobjectType,
|
|
319
|
+
type: 'Flexipage',
|
|
320
|
+
}],
|
|
321
|
+
});
|
|
322
|
+
if (result.success) {
|
|
323
|
+
return `View action override set on System Administrator profile.`;
|
|
324
|
+
}
|
|
325
|
+
return `Profile update failed: ${formatMetadataErrors(result)}`;
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
return `Profile update failed: ${err.message}`;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
export async function handleCreateRecordPage(conn, args) {
|
|
332
|
+
if (!TEMPLATES[args.template]) {
|
|
333
|
+
return toolResponse(`Unsupported template "${args.template}".`, true);
|
|
334
|
+
}
|
|
335
|
+
if (!args.sections || args.sections.length === 0) {
|
|
336
|
+
return toolResponse('At least one section is required.', true);
|
|
337
|
+
}
|
|
338
|
+
let metadata;
|
|
339
|
+
try {
|
|
340
|
+
metadata = buildFlexiPageMetadata(args);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
return toolResponse(`Failed to build FlexiPage payload: ${err.message}`, true);
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
const result = await conn.metadata.create('FlexiPage', metadata);
|
|
347
|
+
if (!result.success) {
|
|
348
|
+
return toolResponse(`Failed to create FlexiPage: ${formatMetadataErrors(result)}`, true);
|
|
349
|
+
}
|
|
350
|
+
const messages = [
|
|
351
|
+
`FlexiPage "${args.pageName}" created for ${args.sobjectType}.`,
|
|
352
|
+
];
|
|
353
|
+
if (args.setAsAdminDefault !== false) {
|
|
354
|
+
messages.push(await setAdminDefaultViewOverride(conn, args.sobjectType, args.pageName));
|
|
355
|
+
}
|
|
356
|
+
return toolResponse(messages.join('\n'));
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
return toolResponse(`FlexiPage create failed: ${err.message}`, true);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
export const createRecordPageDescriptor = {
|
|
363
|
+
name: 'salesforce_create_record_page',
|
|
364
|
+
description: createRecordPageTool.description,
|
|
365
|
+
schema: createRecordPageSchema,
|
|
366
|
+
handler: handleCreateRecordPage,
|
|
367
|
+
};
|
|
368
|
+
//# sourceMappingURL=createRecordPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRecordPage.js","sourceRoot":"","sources":["../../src/tools/createRecordPage.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,10 @@ export declare const debugLogsTool: {
|
|
|
35
35
|
type: string;
|
|
36
36
|
description: string;
|
|
37
37
|
};
|
|
38
|
+
compress: {
|
|
39
|
+
type: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
38
42
|
};
|
|
39
43
|
required: string[];
|
|
40
44
|
};
|
|
@@ -47,6 +51,7 @@ export interface DebugLogsArgs {
|
|
|
47
51
|
limit?: number;
|
|
48
52
|
logId?: string;
|
|
49
53
|
includeBody?: boolean;
|
|
54
|
+
compress?: boolean;
|
|
50
55
|
}
|
|
51
56
|
export declare function handleDebugLogs(conn: Connection, args: DebugLogsArgs): Promise<{
|
|
52
57
|
content: {
|
|
@@ -76,6 +81,7 @@ export declare const debugLogsSchema: {
|
|
|
76
81
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
77
82
|
logId: z.ZodOptional<z.ZodString>;
|
|
78
83
|
includeBody: z.ZodOptional<z.ZodBoolean>;
|
|
84
|
+
compress: z.ZodOptional<z.ZodBoolean>;
|
|
79
85
|
};
|
|
80
86
|
export declare const debugLogsDescriptor: {
|
|
81
87
|
name: string;
|
|
@@ -101,6 +107,7 @@ export declare const debugLogsDescriptor: {
|
|
|
101
107
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
102
108
|
logId: z.ZodOptional<z.ZodString>;
|
|
103
109
|
includeBody: z.ZodOptional<z.ZodBoolean>;
|
|
110
|
+
compress: z.ZodOptional<z.ZodBoolean>;
|
|
104
111
|
};
|
|
105
112
|
handler: typeof handleDebugLogs;
|
|
106
113
|
};
|
package/dist/tools/debugLogs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod/v4';
|
|
2
|
-
import { toolResponse } from '../utils/index.js';
|
|
2
|
+
import { toolResponse, compressApexLog } from '../utils/index.js';
|
|
3
3
|
export const debugLogsTool = {
|
|
4
4
|
name: 'salesforce_debug_logs',
|
|
5
5
|
description: 'Enable, disable, or retrieve debug logs for a Salesforce user. Smart user lookup: email-like input searches by Username, otherwise by Name. Retrieve by user to list recent logs, or by logId for specific log content.',
|
|
@@ -35,6 +35,10 @@ export const debugLogsTool = {
|
|
|
35
35
|
type: 'boolean',
|
|
36
36
|
description: 'Include full log body when retrieving by logId. Default: false.',
|
|
37
37
|
},
|
|
38
|
+
compress: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
description: 'Remove noise lines (STATEMENT_EXECUTE, HEAP_ALLOCATE, etc.) from log body to reduce size. Default: true.',
|
|
41
|
+
},
|
|
38
42
|
},
|
|
39
43
|
required: ['operation', 'username'],
|
|
40
44
|
},
|
|
@@ -74,7 +78,10 @@ export async function handleDebugLogs(conn, args) {
|
|
|
74
78
|
method: 'GET',
|
|
75
79
|
url: `/services/data/v58.0/tooling/sobjects/ApexLog/${log.Id}/Body`,
|
|
76
80
|
});
|
|
77
|
-
|
|
81
|
+
let bodyStr = typeof body === 'string' ? body : JSON.stringify(body);
|
|
82
|
+
if (args.compress !== false)
|
|
83
|
+
bodyStr = compressApexLog(bodyStr);
|
|
84
|
+
output += `\n\n--- Log Body ---\n${bodyStr}`;
|
|
78
85
|
}
|
|
79
86
|
catch {
|
|
80
87
|
output += '\n\n(Log body not accessible)';
|
|
@@ -179,6 +186,7 @@ export const debugLogsSchema = {
|
|
|
179
186
|
limit: z.number().describe('Max logs to retrieve. Default: 10.').optional(),
|
|
180
187
|
logId: z.string().describe('Specific log ID to retrieve.').optional(),
|
|
181
188
|
includeBody: z.boolean().describe('Include full log body when retrieving by logId. Default: false.').optional(),
|
|
189
|
+
compress: z.boolean().describe('Remove noise lines (STATEMENT_EXECUTE, HEAP_ALLOCATE, etc.) from log body to reduce size. Default: true.').optional(),
|
|
182
190
|
};
|
|
183
191
|
export const debugLogsDescriptor = {
|
|
184
192
|
name: 'salesforce_debug_logs',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debugLogs.js","sourceRoot":"","sources":["../../src/tools/debugLogs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"debugLogs.js","sourceRoot":"","sources":["../../src/tools/debugLogs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Connection } from 'jsforce';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
export declare const downloadFilesTool: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
contentVersionIds: {
|
|
10
|
+
type: string;
|
|
11
|
+
items: {
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
contentDocumentIds: {
|
|
17
|
+
type: string;
|
|
18
|
+
items: {
|
|
19
|
+
type: string;
|
|
20
|
+
};
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
linkedRecordId: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
where: {
|
|
28
|
+
type: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
31
|
+
attachmentIds: {
|
|
32
|
+
type: string;
|
|
33
|
+
items: {
|
|
34
|
+
type: string;
|
|
35
|
+
};
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
outputDir: {
|
|
39
|
+
type: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
maxFiles: {
|
|
43
|
+
type: string;
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export interface DownloadFilesArgs {
|
|
50
|
+
contentVersionIds?: string[];
|
|
51
|
+
contentDocumentIds?: string[];
|
|
52
|
+
linkedRecordId?: string;
|
|
53
|
+
where?: string;
|
|
54
|
+
attachmentIds?: string[];
|
|
55
|
+
outputDir?: string;
|
|
56
|
+
maxFiles?: number;
|
|
57
|
+
}
|
|
58
|
+
export declare function handleDownloadFiles(conn: Connection, args: DownloadFilesArgs): Promise<{
|
|
59
|
+
content: {
|
|
60
|
+
type: "text";
|
|
61
|
+
text: string;
|
|
62
|
+
}[];
|
|
63
|
+
isError: boolean;
|
|
64
|
+
}>;
|
|
65
|
+
export declare const downloadFilesSchema: {
|
|
66
|
+
contentVersionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
67
|
+
contentDocumentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
68
|
+
linkedRecordId: z.ZodOptional<z.ZodString>;
|
|
69
|
+
where: z.ZodOptional<z.ZodString>;
|
|
70
|
+
attachmentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
71
|
+
outputDir: z.ZodOptional<z.ZodString>;
|
|
72
|
+
maxFiles: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
};
|
|
74
|
+
export declare const downloadFilesDescriptor: {
|
|
75
|
+
name: string;
|
|
76
|
+
description: string;
|
|
77
|
+
schema: {
|
|
78
|
+
contentVersionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
79
|
+
contentDocumentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
80
|
+
linkedRecordId: z.ZodOptional<z.ZodString>;
|
|
81
|
+
where: z.ZodOptional<z.ZodString>;
|
|
82
|
+
attachmentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
83
|
+
outputDir: z.ZodOptional<z.ZodString>;
|
|
84
|
+
maxFiles: z.ZodOptional<z.ZodNumber>;
|
|
85
|
+
};
|
|
86
|
+
handler: typeof handleDownloadFiles;
|
|
87
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod/v4";import{toolResponse as t}from"../utils/index.js";import*as n from"node:fs";import*as o from"node:path";import*as s from"node:https";import*as r from"node:http";import{URL as i}from"node:url";export const downloadFilesTool={name:"salesforce_download_files",description:"Download one or more files/attachments from Salesforce to disk. Supports ContentVersion (modern Files) filtered by IDs, ContentDocument IDs, a linked record ID, or a SOQL WHERE clause. Also supports legacy Attachment records by ID. Files are streamed directly to disk.",inputSchema:{type:"object",properties:{contentVersionIds:{type:"array",items:{type:"string"},description:"Specific ContentVersion IDs to download."},contentDocumentIds:{type:"array",items:{type:"string"},description:"ContentDocument IDs — downloads the latest ContentVersion for each."},linkedRecordId:{type:"string",description:"Download all files linked to this Salesforce record ID (via ContentDocumentLink)."},where:{type:"string",description:"SOQL WHERE clause applied to ContentVersion (e.g. \"Title LIKE '%Invoice%' AND CreatedDate = LAST_N_DAYS:7\")."},attachmentIds:{type:"array",items:{type:"string"},description:"Legacy Attachment IDs to download."},outputDir:{type:"string",description:"Directory to save downloaded files. Defaults to SALESFORCE_EXPORT_DIR env var or current working directory."},maxFiles:{type:"number",description:"Maximum number of files to download in a single call. Default: 50."}}}};function a(e){return e>=1048576?`${(e/1048576).toFixed(2)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function c(e,t){let s=o.join(e,t);if(!n.existsSync(s))return s;const r=o.extname(t),i=o.basename(t,r);let a=1;for(;n.existsSync(s);)s=o.join(e,`${i}_${a}${r}`),a++;return s}async function d(e,t,o){return new Promise((a,c)=>{const d=new i(e),l="https:"===d.protocol?s:r,m={hostname:d.hostname,port:d.port||("https:"===d.protocol?443:80),path:d.pathname+d.search,method:"GET",headers:{Authorization:`Bearer ${t}`}},p=l.request(m,e=>{if(e.statusCode&&e.statusCode>=400)return c(new Error(`HTTP ${e.statusCode} from Salesforce`)),void e.resume();const t=n.createWriteStream(o);e.pipe(t),t.on("finish",a),t.on("error",c),e.on("error",c)});p.on("error",c),p.end()})}function l(e){return e.map(e=>`'${e.replace(/'/g,"\\'")}'`).join(", ")}export async function handleDownloadFiles(e,s){const{outputDir:r,maxFiles:i=50,attachmentIds:m}=s,p=s.contentVersionIds?.length||s.contentDocumentIds?.length||s.linkedRecordId||s.where;if(!p&&!m?.length)return t("Provide at least one filter: contentVersionIds, contentDocumentIds, linkedRecordId, where, or attachmentIds.",!0);const u=r||process.env.SALESFORCE_EXPORT_DIR||process.cwd();try{n.existsSync(u)||n.mkdirSync(u,{recursive:!0});const e=o.join(u,`.sf_dl_test_${Date.now()}`);n.writeFileSync(e,""),n.unlinkSync(e)}catch{return t(`Cannot write to output directory: ${u}`,!0)}const h=e.accessToken,f=e.instanceUrl,I=[],y=[];if(p){let o="SELECT Id, Title, FileExtension, ContentSize FROM ContentVersion";try{if(s.contentVersionIds?.length)o+=` WHERE Id IN (${l(s.contentVersionIds)})`;else if(s.linkedRecordId){const n=(await e.query(`SELECT ContentDocumentId FROM ContentDocumentLink WHERE LinkedEntityId = '${s.linkedRecordId.replace(/'/g,"\\'")}'`)).records.map(e=>e.ContentDocumentId);if(!n.length)return t(`No files linked to record ${s.linkedRecordId}.`);o+=` WHERE ContentDocumentId IN (${l(n)}) AND IsLatest = true`}else s.contentDocumentIds?.length?o+=` WHERE ContentDocumentId IN (${l(s.contentDocumentIds)}) AND IsLatest = true`:s.where&&(o+=` WHERE ${s.where}`);const r=(await e.query(o)).records;let m=!1,p=r;r.length>i&&(p=r.slice(0,i),m=!0);for(const t of p){const o=t.FileExtension?`.${t.FileExtension}`:"",s=`${t.Title}${o}`,r=c(u,s),i=`${f}/services/data/v58.0/sobjects/ContentVersion/${t.Id}/VersionData`;try{await d(i,h,r),I.push({name:s,path:r,size:a(t.ContentSize??0)})}catch(e){y.push(`${s}: ${e.message}`),n.existsSync(r)&&n.unlinkSync(r)}}m&&y.push(`Result set was capped at ${i} files (${r.length} matched). Increase maxFiles or narrow your filter.`)}catch(e){return t(`Query failed: ${e.message}`,!0)}}if(m?.length)try{const t=(await e.query(`SELECT Id, Name, BodyLength FROM Attachment WHERE Id IN (${l(m)})`)).records;let o=t;const s=i-I.length;let r=!1;t.length>s&&(o=t.slice(0,s),r=!0);for(const e of o){const t=c(u,e.Name),o=`${f}/services/data/v58.0/sobjects/Attachment/${e.Id}/Body`;try{await d(o,h,t),I.push({name:e.Name,path:t,size:a(e.BodyLength??0)})}catch(o){y.push(`${e.Name}: ${o.message}`),n.existsSync(t)&&n.unlinkSync(t)}}r&&y.push(`Attachment download capped at ${s} (combined maxFiles limit reached).`)}catch(e){return t(`Attachment query failed: ${e.message}`,!0)}if(!I.length&&!y.length)return t("No matching files found.");const D=[];if(I.length){D.push(`Downloaded ${I.length} file(s) to ${u}\n`),D.push("| File | Size | Path |"),D.push("|------|------|------|");for(const e of I)D.push(`| ${e.name} | ${e.size} | ${e.path} |`)}if(y.length){D.push("\nErrors:");for(const e of y)D.push(`- ${e}`)}const w=0===I.length&&y.length>0;return t(D.join("\n"),w)}export const downloadFilesSchema={contentVersionIds:e.array(e.string()).describe("Specific ContentVersion IDs to download.").optional(),contentDocumentIds:e.array(e.string()).describe("ContentDocument IDs — downloads the latest ContentVersion for each.").optional(),linkedRecordId:e.string().describe("Download all files linked to this Salesforce record ID (via ContentDocumentLink).").optional(),where:e.string().describe("SOQL WHERE clause applied to ContentVersion.").optional(),attachmentIds:e.array(e.string()).describe("Legacy Attachment IDs to download.").optional(),outputDir:e.string().describe("Directory to save downloaded files. Defaults to SALESFORCE_EXPORT_DIR env var or cwd.").optional(),maxFiles:e.number().describe("Maximum number of files to download. Default: 50.").optional()};export const downloadFilesDescriptor={name:"salesforce_download_files",description:downloadFilesTool.description,schema:downloadFilesSchema,handler:handleDownloadFiles};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod/v4';
|
|
2
|
-
import { toolResponse } from '../utils/index.js';
|
|
2
|
+
import { toolResponse, compressApexLog } from '../utils/index.js';
|
|
3
3
|
export const executeAnonymousTool = {
|
|
4
4
|
name: 'salesforce_execute_anonymous',
|
|
5
5
|
description: 'Execute anonymous Apex code and return compilation/execution results with debug logs. Useful for quick scripts, data fixes, and testing logic.',
|
|
@@ -49,9 +49,9 @@ export async function handleExecuteAnonymous(conn, args) {
|
|
|
49
49
|
url: `/services/data/v58.0/tooling/sobjects/ApexLog/${logId}/Body`,
|
|
50
50
|
});
|
|
51
51
|
if (logBody) {
|
|
52
|
-
const
|
|
52
|
+
const raw = typeof logBody === 'string' ? logBody : JSON.stringify(logBody);
|
|
53
53
|
lines.push('## Debug Log\n');
|
|
54
|
-
lines.push('```\n' +
|
|
54
|
+
lines.push('```\n' + compressApexLog(raw) + '\n```');
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeAnonymous.js","sourceRoot":"","sources":["../../src/tools/executeAnonymous.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"executeAnonymous.js","sourceRoot":"","sources":["../../src/tools/executeAnonymous.ts"],"names":[],"mappings":"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"}
|