@salesforce/plugin-agent 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +136 -93
  2. package/lib/commands/agent/create-v2.d.ts +3 -7
  3. package/lib/commands/agent/create-v2.js +31 -75
  4. package/lib/commands/agent/create-v2.js.map +1 -1
  5. package/lib/commands/agent/generate/spec-v2.d.ts +64 -1
  6. package/lib/commands/agent/generate/spec-v2.js +170 -19
  7. package/lib/commands/agent/generate/spec-v2.js.map +1 -1
  8. package/lib/commands/agent/generate/{test-definition.d.ts → test-spec.d.ts} +1 -1
  9. package/lib/commands/agent/generate/{test-cases.js → test-spec.js} +50 -51
  10. package/lib/commands/agent/generate/test-spec.js.map +1 -0
  11. package/lib/commands/agent/test/create.d.ts +23 -0
  12. package/lib/commands/agent/test/create.js +95 -0
  13. package/lib/commands/agent/test/create.js.map +1 -0
  14. package/lib/flags.d.ts +1 -28
  15. package/lib/flags.js +3 -41
  16. package/lib/flags.js.map +1 -1
  17. package/messages/agent.create-v2.md +19 -25
  18. package/messages/agent.generate.spec-v2.md +89 -13
  19. package/messages/agent.generate.test-spec.md +11 -0
  20. package/messages/agent.test.create.md +27 -0
  21. package/messages/shared.md +0 -20
  22. package/npm-shrinkwrap.json +280 -266
  23. package/oclif.lock +64 -17
  24. package/oclif.manifest.json +164 -115
  25. package/package.json +8 -4
  26. package/schemas/agent-create__v2.json +129 -5
  27. package/schemas/agent-test-create.json +19 -0
  28. package/schemas/agent-test-results.json +14 -17
  29. package/lib/commands/agent/generate/test-cases.d.ts +0 -16
  30. package/lib/commands/agent/generate/test-cases.js.map +0 -1
  31. package/lib/commands/agent/generate/test-definition.js +0 -76
  32. package/lib/commands/agent/generate/test-definition.js.map +0 -1
  33. package/messages/agent.generate.test-cases.md +0 -11
  34. package/messages/agent.generate.test-definition.md +0 -13
@@ -5,6 +5,64 @@ export type AgentCreateSpecResult = {
5
5
  errorMessage?: string;
6
6
  specPath?: string;
7
7
  } & AgentJobSpecV2;
8
+ export type AgentSpecFileContents = AgentJobSpecV2 & {
9
+ agentUser?: string;
10
+ enrichLogs?: boolean;
11
+ tone?: 'casual' | 'formal' | 'neutral';
12
+ primaryLanguage?: 'en_US';
13
+ };
14
+ export declare const FLAGGABLE_PROMPTS: {
15
+ type: {
16
+ message: string;
17
+ validate: (d: string) => boolean | string;
18
+ char: "t";
19
+ options: string[];
20
+ required: true;
21
+ };
22
+ role: {
23
+ message: string;
24
+ validate: (d: string) => boolean | string;
25
+ required: true;
26
+ };
27
+ 'company-name': {
28
+ message: string;
29
+ validate: (d: string) => boolean | string;
30
+ required: true;
31
+ };
32
+ 'company-description': {
33
+ message: string;
34
+ validate: (d: string) => boolean | string;
35
+ required: true;
36
+ };
37
+ 'company-website': {
38
+ message: string;
39
+ validate: (d: string) => boolean | string;
40
+ };
41
+ 'max-topics': {
42
+ message: string;
43
+ promptMessage: string;
44
+ validate: () => boolean | string;
45
+ };
46
+ 'agent-user': {
47
+ message: string;
48
+ promptMessage: string;
49
+ validate: () => boolean | string;
50
+ };
51
+ 'enrich-logs': {
52
+ message: string;
53
+ promptMessage: string;
54
+ validate: () => boolean | string;
55
+ options: string[];
56
+ default: string;
57
+ };
58
+ tone: {
59
+ message: string;
60
+ promptMessage: string;
61
+ validate: () => boolean | string;
62
+ options: string[];
63
+ default: string;
64
+ };
65
+ };
8
66
  export default class AgentCreateSpecV2 extends SfCommand<AgentCreateSpecResult> {
9
67
  static readonly summary: string;
10
68
  static readonly description: string;
@@ -14,14 +72,19 @@ export default class AgentCreateSpecV2 extends SfCommand<AgentCreateSpecResult>
14
72
  static readonly flags: {
15
73
  spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
74
  'output-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
17
- 'max-topics': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
75
+ 'full-interview': import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
76
  'prompt-template': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
77
  'grounding-context': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
78
+ 'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
79
  type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
80
  role: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
81
  "company-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
82
  "company-description": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
83
  "company-website": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
84
+ "max-topics": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
85
+ "agent-user": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
86
+ "enrich-logs": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
87
+ tone: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
88
  'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
26
89
  'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
90
  };
@@ -5,14 +5,88 @@
5
5
  * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
6
  */
7
7
  import { join, resolve, dirname } from 'node:path';
8
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
- import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
8
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
9
+ import { SfCommand, Flags, prompts } from '@salesforce/sf-plugins-core';
10
10
  import { Messages } from '@salesforce/core';
11
11
  import YAML from 'yaml';
12
12
  import { Agent } from '@salesforce/agents';
13
- import { FLAGGABLE_SPEC_PROMPTS, makeFlags, promptForFlag, validateAgentType, validateMaxTopics, } from '../../../flags.js';
13
+ import { makeFlags, promptForFlag, validateAgentType, validateMaxTopics } from '../../../flags.js';
14
14
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
15
15
  const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.spec-v2');
16
+ export const FLAGGABLE_PROMPTS = {
17
+ type: {
18
+ message: messages.getMessage('flags.type.summary'),
19
+ validate: (d) => d.length > 0 || 'Type cannot be empty',
20
+ char: 't',
21
+ options: ['customer', 'internal'],
22
+ required: true,
23
+ },
24
+ role: {
25
+ message: messages.getMessage('flags.role.summary'),
26
+ validate: (d) => d.length > 0 || 'Role cannot be empty',
27
+ required: true,
28
+ },
29
+ 'company-name': {
30
+ message: messages.getMessage('flags.company-name.summary'),
31
+ validate: (d) => d.length > 0 || 'Company name cannot be empty',
32
+ required: true,
33
+ },
34
+ 'company-description': {
35
+ message: messages.getMessage('flags.company-description.summary'),
36
+ validate: (d) => d.length > 0 || 'Company description cannot be empty',
37
+ required: true,
38
+ },
39
+ 'company-website': {
40
+ message: messages.getMessage('flags.company-website.summary'),
41
+ validate: (d) => {
42
+ // Allow empty string
43
+ if (d.length === 0)
44
+ return true;
45
+ try {
46
+ const regExp = new RegExp('^(http|https)://', 'i');
47
+ const companySite = regExp.test(d) ? d : `https://${d}`;
48
+ new URL(companySite);
49
+ d = companySite;
50
+ return true;
51
+ }
52
+ catch (e) {
53
+ return 'Please enter a valid URL';
54
+ }
55
+ },
56
+ },
57
+ 'max-topics': {
58
+ message: messages.getMessage('flags.max-topics.summary'),
59
+ promptMessage: messages.getMessage('flags.max-topics.prompt'),
60
+ validate: () => true,
61
+ // min: 1,
62
+ // max: 30,
63
+ },
64
+ 'agent-user': {
65
+ message: messages.getMessage('flags.agent-user.summary'),
66
+ promptMessage: messages.getMessage('flags.agent-user.prompt'),
67
+ validate: () => true,
68
+ },
69
+ 'enrich-logs': {
70
+ message: messages.getMessage('flags.enrich-logs.summary'),
71
+ promptMessage: messages.getMessage('flags.enrich-logs.prompt'),
72
+ validate: () => true,
73
+ options: ['true', 'false'],
74
+ default: 'false',
75
+ },
76
+ tone: {
77
+ message: messages.getMessage('flags.tone.summary'),
78
+ promptMessage: messages.getMessage('flags.tone.prompt'),
79
+ validate: () => true,
80
+ options: ['formal', 'casual', 'neutral'],
81
+ default: 'casual',
82
+ },
83
+ // 'primary-language': {
84
+ // message: messages.getMessage('flags.primary-language.summary'),
85
+ // validate: (): boolean | string => true,
86
+ // options: ['en_US'],
87
+ // default: 'en_US',
88
+ // },
89
+ };
16
90
  export default class AgentCreateSpecV2 extends SfCommand {
17
91
  static summary = messages.getMessage('summary');
18
92
  static description = messages.getMessage('description');
@@ -22,7 +96,8 @@ export default class AgentCreateSpecV2 extends SfCommand {
22
96
  static flags = {
23
97
  'target-org': Flags.requiredOrg(),
24
98
  'api-version': Flags.orgApiVersion(),
25
- ...makeFlags(FLAGGABLE_SPEC_PROMPTS),
99
+ ...makeFlags(FLAGGABLE_PROMPTS),
100
+ // a spec file can be used as input. Allows iterative spec development.
26
101
  spec: Flags.file({
27
102
  summary: messages.getMessage('flags.spec.summary'),
28
103
  exists: true,
@@ -31,9 +106,8 @@ export default class AgentCreateSpecV2 extends SfCommand {
31
106
  summary: messages.getMessage('flags.output-file.summary'),
32
107
  default: join('config', 'agentSpec.yaml'),
33
108
  }),
34
- 'max-topics': Flags.integer({
35
- summary: messages.getMessage('flags.max-topics.summary'),
36
- min: 1,
109
+ 'full-interview': Flags.boolean({
110
+ summary: messages.getMessage('flags.full-interview.summary'),
37
111
  }),
38
112
  'prompt-template': Flags.string({
39
113
  summary: messages.getMessage('flags.prompt-template.summary'),
@@ -42,13 +116,25 @@ export default class AgentCreateSpecV2 extends SfCommand {
42
116
  summary: messages.getMessage('flags.grounding-context.summary'),
43
117
  dependsOn: ['prompt-template'],
44
118
  }),
119
+ 'no-prompt': Flags.boolean({
120
+ summary: messages.getMessage('flags.no-prompt.summary'),
121
+ }),
45
122
  };
46
123
  // eslint-disable-next-line complexity
47
124
  async run() {
48
125
  const { flags } = await this.parse(AgentCreateSpecV2);
126
+ let outputFile;
127
+ try {
128
+ outputFile = await resolveOutputFile(flags['output-file'], flags['no-prompt']);
129
+ }
130
+ catch (e) {
131
+ this.log(messages.getMessage('commandCanceled'));
132
+ // @ts-expect-error expected due to command cancelation.
133
+ return;
134
+ }
49
135
  // throw error if --json is used and not all required flags are provided
50
136
  if (this.jsonEnabled()) {
51
- const missingFlags = Object.entries(FLAGGABLE_SPEC_PROMPTS)
137
+ const missingFlags = Object.entries(FLAGGABLE_PROMPTS)
52
138
  .filter(([key, prompt]) => 'required' in prompt && prompt.required && !(key in flags))
53
139
  .map(([key]) => key);
54
140
  if (missingFlags.length) {
@@ -63,24 +149,42 @@ export default class AgentCreateSpecV2 extends SfCommand {
63
149
  inputSpec = YAML.parse(readFileSync(resolve(flags.spec), 'utf8'));
64
150
  }
65
151
  // Flags override inputSpec values. Prompt if neither is set.
66
- const type = flags.type ?? validateAgentType(inputSpec?.agentType) ?? (await promptForFlag(FLAGGABLE_SPEC_PROMPTS.type));
67
- const role = flags.role ?? inputSpec?.role ?? (await promptForFlag(FLAGGABLE_SPEC_PROMPTS.role));
68
- const companyName = flags['company-name'] ?? inputSpec?.companyName ?? (await promptForFlag(FLAGGABLE_SPEC_PROMPTS['company-name']));
152
+ const type = flags.type ?? validateAgentType(inputSpec?.agentType) ?? (await promptForFlag(FLAGGABLE_PROMPTS.type));
153
+ const companyName = flags['company-name'] ?? inputSpec?.companyName ?? (await promptForFlag(FLAGGABLE_PROMPTS['company-name']));
69
154
  const companyDescription = flags['company-description'] ??
70
155
  inputSpec?.companyDescription ??
71
- (await promptForFlag(FLAGGABLE_SPEC_PROMPTS['company-description']));
156
+ (await promptForFlag(FLAGGABLE_PROMPTS['company-description']));
157
+ const role = flags.role ?? inputSpec?.role ?? (await promptForFlag(FLAGGABLE_PROMPTS.role));
158
+ // full interview prompts
72
159
  const companyWebsite = flags['company-website'] ??
73
160
  inputSpec?.companyWebsite ??
74
- (await promptForFlag(FLAGGABLE_SPEC_PROMPTS['company-website']));
161
+ (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS['company-website']) : undefined);
162
+ const maxNumOfTopics = flags['max-topics'] ??
163
+ validateMaxTopics(inputSpec?.maxNumOfTopics) ??
164
+ (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS['max-topics']) : 10);
165
+ const agentUser = flags['agent-user'] ??
166
+ inputSpec?.agentUser ??
167
+ (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS['agent-user']) : undefined);
168
+ let enrichLogs = flags['enrich-logs'] ??
169
+ inputSpec?.enrichLogs ??
170
+ (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS['enrich-logs']) : undefined);
171
+ enrichLogs = Boolean(enrichLogs === 'true' || enrichLogs === true);
172
+ const tone = flags.tone ??
173
+ inputSpec?.tone ??
174
+ (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS.tone) : undefined);
175
+ // const primaryLanguage =
176
+ // flags['primary-language'] ??
177
+ // inputSpec?.primaryLanguage ??
178
+ // (flags['full-interview'] ? await promptForFlag(FLAGGABLE_PROMPTS['primary-language']) : undefined);
75
179
  this.log();
76
180
  this.spinner.start('Creating agent spec');
77
181
  const connection = flags['target-org'].getConnection(flags['api-version']);
78
182
  const agent = new Agent(connection, this.project);
79
183
  const specConfig = {
80
184
  agentType: type,
81
- role,
82
185
  companyName,
83
186
  companyDescription,
187
+ role,
84
188
  };
85
189
  if (companyWebsite) {
86
190
  specConfig.companyWebsite = companyWebsite;
@@ -93,19 +197,51 @@ export default class AgentCreateSpecV2 extends SfCommand {
93
197
  specConfig.groundingContext = groundingContext;
94
198
  }
95
199
  }
96
- const maxNumOfTopics = flags['max-topics'] ?? validateMaxTopics(inputSpec?.maxNumOfTopics);
97
200
  if (maxNumOfTopics) {
98
- specConfig.maxNumOfTopics = maxNumOfTopics;
201
+ specConfig.maxNumOfTopics = Number(maxNumOfTopics);
99
202
  }
100
203
  // Should we log the specConfig being used? It's returned in the JSON and the generated spec.
101
204
  // this.log(`${ansis.green(figures.tick)} ${ansis.bold(message)} ${ansis.cyan(valueFromFlag)}`);
102
- const agentSpec = await agent.createSpecV2(specConfig);
103
- const outputFilePath = writeSpecFile(flags['output-file'], agentSpec);
205
+ const specResponse = await agent.createSpecV2(specConfig);
206
+ // @ts-expect-error Need better typing
207
+ const specFileContents = buildSpecFile(specResponse, { agentUser, enrichLogs, tone });
208
+ const outputFilePath = writeSpecFile(outputFile, specFileContents);
104
209
  this.spinner.stop();
105
210
  this.log(`\nSaved agent spec: ${outputFilePath}`);
106
- return { ...{ isSuccess: true, specPath: outputFilePath }, ...agentSpec };
211
+ return { ...{ isSuccess: true, specPath: outputFilePath }, ...specResponse, ...specFileContents };
107
212
  }
108
213
  }
214
+ // Builds spec file contents from the spec response and any additional flags
215
+ // in a specific order.
216
+ const buildSpecFile = (specResponse, extraProps) => {
217
+ const propertyOrder = [
218
+ 'agentType',
219
+ 'companyName',
220
+ 'companyDescription',
221
+ 'companyWebsite',
222
+ 'role',
223
+ 'maxNumOfTopics',
224
+ 'agentUser',
225
+ 'enrichLogs',
226
+ 'tone',
227
+ // 'primaryLanguage',
228
+ 'promptTemplateName',
229
+ 'groundingContext',
230
+ 'topics',
231
+ ];
232
+ const specFileContents = {};
233
+ propertyOrder.map((prop) => {
234
+ // @ts-expect-error need better typing of the array.
235
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
236
+ const val = specResponse[prop] ?? extraProps[prop];
237
+ if (val != null || (typeof val === 'string' && val.length > 0)) {
238
+ // @ts-expect-error need better typing of the array.
239
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
240
+ specFileContents[prop] = val;
241
+ }
242
+ });
243
+ return specFileContents;
244
+ };
109
245
  const writeSpecFile = (outputFile, agentSpec) => {
110
246
  // create the directory if not already created
111
247
  const outputFilePath = resolve(outputFile);
@@ -114,4 +250,19 @@ const writeSpecFile = (outputFile, agentSpec) => {
114
250
  writeFileSync(outputFilePath, YAML.stringify(agentSpec));
115
251
  return outputFilePath;
116
252
  };
253
+ const resolveOutputFile = async (outputFile, noPrompt = false) => {
254
+ let resolvedOutputFile = resolve(outputFile);
255
+ if (!noPrompt) {
256
+ if (existsSync(resolvedOutputFile)) {
257
+ const message = messages.getMessage('confirmSpecOverwrite', [resolvedOutputFile]);
258
+ if (!(await prompts.confirm({ message }))) {
259
+ throw Error('NoOverwrite');
260
+ }
261
+ }
262
+ }
263
+ if (!resolvedOutputFile.endsWith('.yaml')) {
264
+ resolvedOutputFile = `${resolvedOutputFile}.yaml`;
265
+ }
266
+ return resolvedOutputFile;
267
+ };
117
268
  //# sourceMappingURL=spec-v2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-v2.js","sourceRoot":"","sources":["../../../../src/commands/agent/generate/spec-v2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-v2.js","sourceRoot":"","sources":["../../../../src/commands/agent/generate/spec-v2.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { SfCommand } from '@salesforce/sf-plugins-core';
2
- export default class AgentGenerateTestDefinition extends SfCommand<void> {
2
+ export default class AgentGenerateTestSpec extends SfCommand<void> {
3
3
  static readonly summary: string;
4
4
  static readonly description: string;
5
5
  static readonly examples: string[];
@@ -4,16 +4,17 @@
4
4
  * Licensed under the BSD 3-Clause license.
5
5
  * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
6
  */
7
- import { dirname, join } from 'node:path';
8
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
7
+ import { join } from 'node:path';
8
+ import { readFile } from 'node:fs/promises';
9
9
  import { SfCommand } from '@salesforce/sf-plugins-core';
10
- import { Messages } from '@salesforce/core';
10
+ import { Messages, SfError } from '@salesforce/core';
11
+ import { generateTestSpec } from '@salesforce/agents';
11
12
  import { select, input, confirm, checkbox } from '@inquirer/prompts';
12
13
  import { XMLParser } from 'fast-xml-parser';
13
14
  import { theme } from '../../../inquirer-theme.js';
14
15
  import { readDir } from '../../../read-dir.js';
15
16
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
16
- const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.test-cases');
17
+ const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.test-spec');
17
18
  function castArray(value) {
18
19
  return Array.isArray(value) ? value : [value];
19
20
  }
@@ -47,15 +48,15 @@ async function promptForTestCase(genAiPlugins) {
47
48
  },
48
49
  theme,
49
50
  });
50
- const topicSequenceExpectedValue = await select({
51
+ const expectedTopic = await select({
51
52
  message: 'Expected topic',
52
53
  choices: [...topics, customKey],
53
54
  theme,
54
55
  });
55
- if (topicSequenceExpectedValue === customKey) {
56
+ if (expectedTopic === customKey) {
56
57
  return {
57
58
  utterance,
58
- topicSequenceExpectedValue: await input({
59
+ expectedTopic: await input({
59
60
  message: 'Expected topic',
60
61
  validate: (d) => {
61
62
  if (!d.length) {
@@ -66,67 +67,56 @@ async function promptForTestCase(genAiPlugins) {
66
67
  theme,
67
68
  }),
68
69
  // If the user selects OTHER for the topic, then we don't have a genAiPlugin to get actions from so we ask for them for custom input
69
- actionSequenceExpectedValue: await askForOtherActions(),
70
- botRatingExpectedValue: await askForBotRating(),
70
+ expectedActions: await askForOtherActions(),
71
+ expectedOutcome: await askForBotRating(),
71
72
  };
72
73
  }
73
- const genAiPluginXml = await readFile(genAiPlugins[topicSequenceExpectedValue], 'utf-8');
74
+ const genAiPluginXml = await readFile(genAiPlugins[expectedTopic], 'utf-8');
74
75
  const parser = new XMLParser();
75
76
  const parsed = parser.parse(genAiPluginXml);
76
77
  const actions = castArray(parsed.GenAiPlugin.genAiFunctions).map((f) => f.functionName);
77
- let actionSequenceExpectedValue = await checkbox({
78
+ let expectedActions = await checkbox({
78
79
  message: 'Expected action(s)',
79
80
  choices: [...actions, customKey],
80
81
  theme,
81
82
  required: true,
82
83
  });
83
- if (actionSequenceExpectedValue.includes(customKey)) {
84
+ if (expectedActions.includes(customKey)) {
84
85
  const additional = await askForOtherActions();
85
- actionSequenceExpectedValue = [...actionSequenceExpectedValue.filter((a) => a !== customKey), ...additional];
86
+ expectedActions = [...expectedActions.filter((a) => a !== customKey), ...additional];
86
87
  }
87
- const botRatingExpectedValue = await askForBotRating();
88
+ const expectedOutcome = await askForBotRating();
88
89
  return {
89
90
  utterance,
90
- actionSequenceExpectedValue,
91
- botRatingExpectedValue,
92
- topicSequenceExpectedValue,
91
+ expectedActions,
92
+ expectedOutcome,
93
+ expectedTopic,
93
94
  };
94
95
  }
95
- export function constructTestSetXML(testCases) {
96
- const tab = ' ';
97
- let xml = `<?xml version="1.0" encoding="UTF-8"?>\n<AiEvaluationTestSet>\n${tab}<subjectType>AGENT</subjectType>\n`;
98
- testCases.forEach((testCase, i) => {
99
- xml += ` <testCase>
100
- <number>${i + 1}</number>
101
- <inputs>
102
- <utterance>${testCase.utterance}</utterance>
103
- </inputs>
104
- <expectation>
105
- <name>topic_sequence_match</name>
106
- <expectedValue>${testCase.topicSequenceExpectedValue}</expectedValue>
107
- </expectation>
108
- <expectation>
109
- <name>action_sequence_match</name>
110
- <expectedValue>${`[${testCase.actionSequenceExpectedValue.map((v) => `"${v}"`).join(',')}]`}</expectedValue>
111
- </expectation>
112
- <expectation>
113
- <name>bot_response_rating</name>
114
- <expectedValue>${testCase.botRatingExpectedValue}</expectedValue>
115
- </expectation>
116
- </testCase>\n`;
117
- });
118
- xml += '</AiEvaluationTestSet>';
119
- return xml;
120
- }
121
- export default class AgentGenerateTestCases extends SfCommand {
96
+ export default class AgentGenerateTestSpec extends SfCommand {
122
97
  static summary = messages.getMessage('summary');
123
98
  static description = messages.getMessage('description');
124
99
  static examples = messages.getMessages('examples');
125
100
  static enableJsonFlag = false;
126
101
  static state = 'beta';
127
102
  async run() {
128
- const testSetName = await input({
129
- message: 'What is the name of this set of test cases',
103
+ const botsDir = join('force-app', 'main', 'default', 'bots');
104
+ const bots = await readDir(botsDir);
105
+ if (bots.length === 0) {
106
+ throw new SfError(`No agents found in ${botsDir}`, 'NoAgentsFoundError');
107
+ }
108
+ const subjectType = await select({
109
+ message: 'What are you testing',
110
+ choices: ['AGENT'],
111
+ theme,
112
+ });
113
+ const subjectName = await select({
114
+ message: 'Select the Agent to test',
115
+ choices: bots,
116
+ theme,
117
+ });
118
+ const name = await input({
119
+ message: 'Enter a name for the test definition',
130
120
  validate(d) {
131
121
  // ensure that it's not empty
132
122
  if (!d.length) {
@@ -140,6 +130,11 @@ export default class AgentGenerateTestCases extends SfCommand {
140
130
  // }
141
131
  // return true;
142
132
  },
133
+ theme,
134
+ });
135
+ const description = await input({
136
+ message: 'Enter a description for test definition (optional)',
137
+ theme,
143
138
  });
144
139
  const genAiPluginDir = join('force-app', 'main', 'default', 'genAiPlugins');
145
140
  const genAiPlugins = Object.fromEntries((await readDir(genAiPluginDir)).map((genAiPlugin) => [
@@ -157,11 +152,15 @@ export default class AgentGenerateTestCases extends SfCommand {
157
152
  message: 'Would you like to add another test case',
158
153
  default: true,
159
154
  }));
160
- const testSetPath = join('force-app', 'main', 'default', 'aiEvaluationTestSets', `${testSetName}.aiEvaluationTestSet-meta.xml`);
161
- await mkdir(dirname(testSetPath), { recursive: true });
162
155
  this.log();
163
- this.log(`Created ${testSetPath}`);
164
- await writeFile(testSetPath, constructTestSetXML(testCases));
156
+ await generateTestSpec({
157
+ name,
158
+ description,
159
+ subjectType,
160
+ subjectName,
161
+ testCases,
162
+ }, `${name}-test-spec.yaml`);
163
+ this.log(`Created ${name}-test-spec.yaml`);
165
164
  }
166
165
  }
167
- //# sourceMappingURL=test-cases.js.map
166
+ //# sourceMappingURL=test-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-spec.js","sourceRoot":"","sources":["../../../../src/commands/agent/generate/test-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { SfCommand } from '@salesforce/sf-plugins-core';
2
+ import { SfError } from '@salesforce/core';
3
+ import { CLIError } from '@oclif/core/errors';
4
+ export type AgentTestCreateResult = {
5
+ path: string;
6
+ contents: string;
7
+ };
8
+ export default class AgentTestCreate extends SfCommand<AgentTestCreateResult> {
9
+ static readonly summary: string;
10
+ static readonly description: string;
11
+ static readonly examples: string[];
12
+ static readonly state = "beta";
13
+ static readonly flags: {
14
+ spec: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
16
+ 'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ preview: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ 'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
19
+ };
20
+ private mso?;
21
+ run(): Promise<AgentTestCreateResult>;
22
+ protected catch(error: Error | SfError | CLIError): Promise<never>;
23
+ }