@salesforce/plugin-agent 1.15.2 → 1.16.0
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 +31 -26
- package/lib/commands/agent/create.js +2 -2
- package/lib/commands/agent/create.js.map +1 -1
- package/lib/commands/agent/generate/test-spec.d.ts +5 -0
- package/lib/commands/agent/generate/test-spec.js +196 -78
- package/lib/commands/agent/generate/test-spec.js.map +1 -1
- package/lib/commands/agent/test/create.d.ts +3 -2
- package/lib/commands/agent/test/create.js +80 -21
- package/lib/commands/agent/test/create.js.map +1 -1
- package/lib/flags.d.ts +1 -0
- package/lib/flags.js +31 -0
- package/lib/flags.js.map +1 -1
- package/lib/handleTestResults.js +2 -21
- package/lib/handleTestResults.js.map +1 -1
- package/lib/yes-no-cancel.d.ts +10 -0
- package/lib/yes-no-cancel.js +60 -0
- package/lib/yes-no-cancel.js.map +1 -0
- package/messages/agent.generate.test-spec.md +16 -0
- package/messages/agent.test.create.md +18 -8
- package/npm-shrinkwrap.json +522 -30
- package/oclif.lock +143 -14
- package/oclif.manifest.json +35 -10
- package/package.json +7 -5
- package/lib/read-dir.d.ts +0 -1
- package/lib/read-dir.js +0 -16
- package/lib/read-dir.js.map +0 -1
package/README.md
CHANGED
|
@@ -132,7 +132,7 @@ EXAMPLES
|
|
|
132
132
|
$ sf agent create --agent-name "Resort Manager" --spec specs/resortManagerAgent.yaml --preview
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
-
_See code: [src/commands/agent/create.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
135
|
+
_See code: [src/commands/agent/create.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/create.ts)_
|
|
136
136
|
|
|
137
137
|
## `sf agent generate agent-spec`
|
|
138
138
|
|
|
@@ -237,7 +237,7 @@ EXAMPLES
|
|
|
237
237
|
$ sf agent generate agent-spec --tone formal --agent-user resortmanager@myorg.com
|
|
238
238
|
```
|
|
239
239
|
|
|
240
|
-
_See code: [src/commands/agent/generate/agent-spec.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
240
|
+
_See code: [src/commands/agent/generate/agent-spec.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/generate/agent-spec.ts)_
|
|
241
241
|
|
|
242
242
|
## `sf agent generate template`
|
|
243
243
|
|
|
@@ -271,7 +271,7 @@ EXAMPLES
|
|
|
271
271
|
force-app/main/default/bots/My_Awesome_Agent/My_Awesome_Agent.bot-meta.xml --agent-version 1
|
|
272
272
|
```
|
|
273
273
|
|
|
274
|
-
_See code: [src/commands/agent/generate/template.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
274
|
+
_See code: [src/commands/agent/generate/template.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/generate/template.ts)_
|
|
275
275
|
|
|
276
276
|
## `sf agent generate test-spec`
|
|
277
277
|
|
|
@@ -279,7 +279,12 @@ Interactively generate a specification file for a AI evaluation test.
|
|
|
279
279
|
|
|
280
280
|
```
|
|
281
281
|
USAGE
|
|
282
|
-
$ sf agent generate test-spec [--flags-dir <value>]
|
|
282
|
+
$ sf agent generate test-spec [--flags-dir <value>] [-d <value>] [--force-overwrite] [-f <value>]
|
|
283
|
+
|
|
284
|
+
FLAGS
|
|
285
|
+
-d, --from-definition=<value> The API name of the AIEvaluationDefinition that you want to convert to a spec file.
|
|
286
|
+
-f, --output-file=<value> The name of the generated spec file. Defaults to "specs/<AGENT_API_NAME>-testSpec.yaml"
|
|
287
|
+
--force-overwrite Don't prompt for confirmation when overwriting an existing test spec file.
|
|
283
288
|
|
|
284
289
|
GLOBAL FLAGS
|
|
285
290
|
--flags-dir=<value> Import flag values from a directory.
|
|
@@ -294,7 +299,7 @@ EXAMPLES
|
|
|
294
299
|
$ sf agent generate test-spec
|
|
295
300
|
```
|
|
296
301
|
|
|
297
|
-
_See code: [src/commands/agent/generate/test-spec.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
302
|
+
_See code: [src/commands/agent/generate/test-spec.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/generate/test-spec.ts)_
|
|
298
303
|
|
|
299
304
|
## `sf agent preview`
|
|
300
305
|
|
|
@@ -329,43 +334,43 @@ FLAG DESCRIPTIONS
|
|
|
329
334
|
the API name of the agent? (TBD based on agents library)
|
|
330
335
|
```
|
|
331
336
|
|
|
332
|
-
_See code: [src/commands/agent/preview.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
337
|
+
_See code: [src/commands/agent/preview.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/preview.ts)_
|
|
333
338
|
|
|
334
339
|
## `sf agent test create`
|
|
335
340
|
|
|
336
|
-
|
|
341
|
+
Convert a test spec file into an AiEvaluationDefinition and deploy it to your org.
|
|
337
342
|
|
|
338
343
|
```
|
|
339
344
|
USAGE
|
|
340
|
-
$ sf agent test create -
|
|
345
|
+
$ sf agent test create -o <value> [--json] [--flags-dir <value>] [--test-api-name <value>] [--spec <value>]
|
|
346
|
+
[--api-version <value>] [--preview] [--force-overwrite]
|
|
341
347
|
|
|
342
348
|
FLAGS
|
|
343
|
-
-o, --target-org=<value>
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
--
|
|
348
|
-
--
|
|
349
|
+
-o, --target-org=<value> (required) Username or alias of the target org. Not required if the `target-org`
|
|
350
|
+
configuration variable is already set.
|
|
351
|
+
--api-version=<value> Override the api version used for api requests made by this command
|
|
352
|
+
--force-overwrite Don't prompt for confirmation when overwriting an existing test.
|
|
353
|
+
--preview Preview the test metadata without deploying to your org.
|
|
354
|
+
--spec=<value> The path to the spec file.
|
|
355
|
+
--test-api-name=<value> The API name of the AiEvaluationDefinition.
|
|
349
356
|
|
|
350
357
|
GLOBAL FLAGS
|
|
351
358
|
--flags-dir=<value> Import flag values from a directory.
|
|
352
359
|
--json Format output as json.
|
|
353
360
|
|
|
354
361
|
DESCRIPTION
|
|
355
|
-
|
|
362
|
+
Convert a test spec file into an AiEvaluationDefinition and deploy it to your org.
|
|
363
|
+
|
|
364
|
+
This command will convert a test spec file into an AiEvaluationDefinition and deploy it to your org. The spec file
|
|
365
|
+
must be in yaml format.
|
|
356
366
|
|
|
357
|
-
|
|
367
|
+
Use the --preview flag to see the metadata that will be deployed without actually deploying it.
|
|
358
368
|
|
|
359
369
|
EXAMPLES
|
|
360
370
|
$ sf agent test create
|
|
361
|
-
|
|
362
|
-
FLAG DESCRIPTIONS
|
|
363
|
-
-s, --spec=<value> Description of a flag.
|
|
364
|
-
|
|
365
|
-
More information about a flag. Don't repeat the summary.
|
|
366
371
|
```
|
|
367
372
|
|
|
368
|
-
_See code: [src/commands/agent/test/create.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
373
|
+
_See code: [src/commands/agent/test/create.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/test/create.ts)_
|
|
369
374
|
|
|
370
375
|
## `sf agent test list`
|
|
371
376
|
|
|
@@ -394,7 +399,7 @@ EXAMPLES
|
|
|
394
399
|
$ sf agent test list
|
|
395
400
|
```
|
|
396
401
|
|
|
397
|
-
_See code: [src/commands/agent/test/list.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
402
|
+
_See code: [src/commands/agent/test/list.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/test/list.ts)_
|
|
398
403
|
|
|
399
404
|
## `sf agent test results`
|
|
400
405
|
|
|
@@ -450,7 +455,7 @@ FLAG DESCRIPTIONS
|
|
|
450
455
|
test results aren't written.
|
|
451
456
|
```
|
|
452
457
|
|
|
453
|
-
_See code: [src/commands/agent/test/results.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
458
|
+
_See code: [src/commands/agent/test/results.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/test/results.ts)_
|
|
454
459
|
|
|
455
460
|
## `sf agent test resume`
|
|
456
461
|
|
|
@@ -513,7 +518,7 @@ FLAG DESCRIPTIONS
|
|
|
513
518
|
test results aren't written.
|
|
514
519
|
```
|
|
515
520
|
|
|
516
|
-
_See code: [src/commands/agent/test/resume.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
521
|
+
_See code: [src/commands/agent/test/resume.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/test/resume.ts)_
|
|
517
522
|
|
|
518
523
|
## `sf agent test run`
|
|
519
524
|
|
|
@@ -576,6 +581,6 @@ FLAG DESCRIPTIONS
|
|
|
576
581
|
test results aren't written.
|
|
577
582
|
```
|
|
578
583
|
|
|
579
|
-
_See code: [src/commands/agent/test/run.ts](https://github.com/salesforcecli/plugin-agent/blob/1.
|
|
584
|
+
_See code: [src/commands/agent/test/run.ts](https://github.com/salesforcecli/plugin-agent/blob/1.16.0/src/commands/agent/test/run.ts)_
|
|
580
585
|
|
|
581
586
|
<!-- commandsstop -->
|
|
@@ -13,7 +13,7 @@ import { MultiStageOutput } from '@oclif/multi-stage-output';
|
|
|
13
13
|
import { input as inquirerInput } from '@inquirer/prompts';
|
|
14
14
|
import { colorize } from '@oclif/core/ux';
|
|
15
15
|
import { Agent, AgentCreateLifecycleStagesV2, generateAgentApiName, } from '@salesforce/agents';
|
|
16
|
-
import { makeFlags, promptForFlag, getAgentUserId, validateAgentType, validateTone, } from '../../flags.js';
|
|
16
|
+
import { makeFlags, promptForFlag, getAgentUserId, validateAgentType, validateTone, promptForYamlFile, } from '../../flags.js';
|
|
17
17
|
import { theme } from '../../inquirer-theme.js';
|
|
18
18
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
19
19
|
const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.create');
|
|
@@ -90,7 +90,7 @@ export default class AgentCreate extends SfCommand {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
// If we don't have an agent spec yet, prompt.
|
|
93
|
-
const specPath = flags.spec ?? (await
|
|
93
|
+
const specPath = flags.spec ?? (await promptForYamlFile(FLAGGABLE_PROMPTS['spec']));
|
|
94
94
|
// Read the agent spec and validate
|
|
95
95
|
const inputSpec = YAML.parse(readFileSync(resolve(specPath), 'utf8'));
|
|
96
96
|
validateSpec(inputSpec);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/agent/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,KAAK,EAGL,4BAA4B,EAE5B,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,SAAS,EACT,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/agent/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,10 @@ export default class AgentGenerateTestSpec extends SfCommand<void> {
|
|
|
5
5
|
static readonly examples: string[];
|
|
6
6
|
static readonly enableJsonFlag = false;
|
|
7
7
|
static readonly state = "beta";
|
|
8
|
+
static readonly flags: {
|
|
9
|
+
'from-definition': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
'force-overwrite': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
8
13
|
run(): Promise<void>;
|
|
9
14
|
}
|
|
@@ -1,45 +1,75 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) 2025, salesforce.com, inc.
|
|
3
3
|
* All rights reserved.
|
|
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 { join } from 'node:path';
|
|
8
7
|
import { readFile } from 'node:fs/promises';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
8
|
+
import { join, parse } from 'node:path';
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
11
|
+
import { Messages, SfError, SfProject } from '@salesforce/core';
|
|
12
|
+
import { writeTestSpec, generateTestSpecFromAiEvalDefinition } from '@salesforce/agents';
|
|
12
13
|
import { select, input, confirm, checkbox } from '@inquirer/prompts';
|
|
13
14
|
import { XMLParser } from 'fast-xml-parser';
|
|
15
|
+
import { ComponentSetBuilder } from '@salesforce/source-deploy-retrieve';
|
|
16
|
+
import { warn } from '@oclif/core/errors';
|
|
14
17
|
import { theme } from '../../../inquirer-theme.js';
|
|
15
|
-
import
|
|
18
|
+
import yesNoOrCancel from '../../../yes-no-cancel.js';
|
|
16
19
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
17
20
|
const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.test-spec');
|
|
18
21
|
function castArray(value) {
|
|
22
|
+
if (!value)
|
|
23
|
+
return [];
|
|
19
24
|
return Array.isArray(value) ? value : [value];
|
|
20
25
|
}
|
|
21
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Prompts the user for test case information through interactive prompts.
|
|
28
|
+
*
|
|
29
|
+
* @param genAiPlugins - Record mapping topic names to GenAiPlugin XML file paths (used to find the related actions)
|
|
30
|
+
* @param genAiFunctions - Array of GenAiFunction names from the GenAiPlanner
|
|
31
|
+
* @returns Promise resolving to a TestCase object containing:
|
|
32
|
+
* - utterance: The user input string
|
|
33
|
+
* - expectedTopic: The expected topic for classification
|
|
34
|
+
* - expectedActions: Array of expected action names
|
|
35
|
+
* - expectedOutcome: Expected outcome string
|
|
36
|
+
*
|
|
37
|
+
* @remarks
|
|
38
|
+
* This function guides users through creating a test case by:
|
|
39
|
+
* 1. Prompting for an utterance
|
|
40
|
+
* 2. Selecting an expected topic (from GenAiPlugins specified in the Bot's GenAiPlanner)
|
|
41
|
+
* 3. Choosing expected actions (from GenAiFunctions in the GenAiPlanner or GenAiPlugin)
|
|
42
|
+
* 4. Defining an expected outcome
|
|
43
|
+
*/
|
|
44
|
+
async function promptForTestCase(genAiPlugins, genAiFunctions) {
|
|
22
45
|
const utterance = await input({
|
|
23
46
|
message: 'Utterance',
|
|
24
47
|
validate: (d) => d.length > 0 || 'utterance cannot be empty',
|
|
25
48
|
theme,
|
|
26
49
|
});
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
50
|
+
const expectedTopic = await select({
|
|
51
|
+
message: 'Expected topic',
|
|
52
|
+
choices: Object.keys(genAiPlugins),
|
|
53
|
+
theme,
|
|
54
|
+
});
|
|
55
|
+
// GenAiFunctions (aka actions) can be defined in the GenAiPlugin or GenAiPlanner
|
|
56
|
+
// the actions from the planner are passed in as an argument to this function
|
|
57
|
+
// the actions from the plugin are read from the GenAiPlugin file
|
|
58
|
+
let actions = [];
|
|
59
|
+
if (genAiPlugins[expectedTopic]) {
|
|
60
|
+
const genAiPluginXml = await readFile(genAiPlugins[expectedTopic], 'utf-8');
|
|
61
|
+
const parser = new XMLParser();
|
|
62
|
+
const parsed = parser.parse(genAiPluginXml);
|
|
63
|
+
actions = castArray(parsed.GenAiPlugin.genAiFunctions ?? []).map((f) => f.functionName);
|
|
64
|
+
}
|
|
65
|
+
const expectedActions = await checkbox({
|
|
30
66
|
message: 'Expected action(s)',
|
|
31
|
-
|
|
32
|
-
if (!d.length) {
|
|
33
|
-
return 'expected value cannot be empty';
|
|
34
|
-
}
|
|
35
|
-
return true;
|
|
36
|
-
},
|
|
67
|
+
choices: [...actions, ...genAiFunctions],
|
|
37
68
|
theme,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
message: 'Expected response',
|
|
69
|
+
required: true,
|
|
70
|
+
});
|
|
71
|
+
const expectedOutcome = await input({
|
|
72
|
+
message: 'Expected outcome',
|
|
43
73
|
validate: (d) => {
|
|
44
74
|
if (!d.length) {
|
|
45
75
|
return 'expected value cannot be empty';
|
|
@@ -48,62 +78,155 @@ async function promptForTestCase(genAiPlugins) {
|
|
|
48
78
|
},
|
|
49
79
|
theme,
|
|
50
80
|
});
|
|
51
|
-
const expectedTopic = await select({
|
|
52
|
-
message: 'Expected topic',
|
|
53
|
-
choices: [...topics, customKey],
|
|
54
|
-
theme,
|
|
55
|
-
});
|
|
56
|
-
if (expectedTopic === customKey) {
|
|
57
|
-
return {
|
|
58
|
-
utterance,
|
|
59
|
-
expectedTopic: await input({
|
|
60
|
-
message: 'Expected topic',
|
|
61
|
-
validate: (d) => {
|
|
62
|
-
if (!d.length) {
|
|
63
|
-
return 'expected value cannot be empty';
|
|
64
|
-
}
|
|
65
|
-
return true;
|
|
66
|
-
},
|
|
67
|
-
theme,
|
|
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
|
|
70
|
-
expectedActions: await askForOtherActions(),
|
|
71
|
-
expectedOutcome: await askForBotRating(),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
const genAiPluginXml = await readFile(genAiPlugins[expectedTopic], 'utf-8');
|
|
75
|
-
const parser = new XMLParser();
|
|
76
|
-
const parsed = parser.parse(genAiPluginXml);
|
|
77
|
-
const actions = castArray(parsed.GenAiPlugin.genAiFunctions).map((f) => f.functionName);
|
|
78
|
-
let expectedActions = await checkbox({
|
|
79
|
-
message: 'Expected action(s)',
|
|
80
|
-
choices: [...actions, customKey],
|
|
81
|
-
theme,
|
|
82
|
-
required: true,
|
|
83
|
-
});
|
|
84
|
-
if (expectedActions.includes(customKey)) {
|
|
85
|
-
const additional = await askForOtherActions();
|
|
86
|
-
expectedActions = [...expectedActions.filter((a) => a !== customKey), ...additional];
|
|
87
|
-
}
|
|
88
|
-
const expectedOutcome = await askForBotRating();
|
|
89
81
|
return {
|
|
90
82
|
utterance,
|
|
83
|
+
expectedTopic,
|
|
91
84
|
expectedActions,
|
|
92
85
|
expectedOutcome,
|
|
93
|
-
expectedTopic,
|
|
94
86
|
};
|
|
95
87
|
}
|
|
88
|
+
function getMetadataFilePaths(cs, type) {
|
|
89
|
+
return [...cs.filter((component) => component.type.name === type && component.fullName !== '*')].reduce((acc, component) => ({
|
|
90
|
+
...acc,
|
|
91
|
+
[component.fullName]: cs.getComponentFilenamesByNameAndType({
|
|
92
|
+
fullName: component.fullName,
|
|
93
|
+
type,
|
|
94
|
+
})[0],
|
|
95
|
+
}), {});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Retrieves GenAIPlugins and GenAiFunctions from a Bot's GenAiPlanner
|
|
99
|
+
*
|
|
100
|
+
* We have to get the bot version and planner for the selected bot so that we can get
|
|
101
|
+
* the actions (GenAiFunctions) and topics (GenAiPlugins) that can be selected for the
|
|
102
|
+
* test cases.
|
|
103
|
+
*
|
|
104
|
+
* The BotVersion tells us which GenAiPlanner to use, and the GenAiPlanner
|
|
105
|
+
* tells us which GenAiPlugins and GenAiFunctions are available. More GenAiFunctions
|
|
106
|
+
* might be available in the GenAiPlugin, so we read those later when the user
|
|
107
|
+
* has selected a GenAiPlugin/topic - inside of `promptForTestCase`.
|
|
108
|
+
*
|
|
109
|
+
* @param subjectName - The name of the Bot to analyze
|
|
110
|
+
* @param cs - ComponentSet containing Bot, GenAiPlanner, and GenAiPlugin components
|
|
111
|
+
*
|
|
112
|
+
* @returns Object containing:
|
|
113
|
+
* - genAiPlugins: Record of plugin names to their file paths
|
|
114
|
+
* - genAiFunctions: Array of function names
|
|
115
|
+
*/
|
|
116
|
+
async function getPluginsAndFunctions(subjectName, cs) {
|
|
117
|
+
const botVersions = getMetadataFilePaths(cs, 'Bot');
|
|
118
|
+
const genAiPlanners = getMetadataFilePaths(cs, 'GenAiPlanner');
|
|
119
|
+
const parser = new XMLParser();
|
|
120
|
+
const botVersionXml = await readFile(botVersions[subjectName], 'utf-8');
|
|
121
|
+
const parsedBotVersion = parser.parse(botVersionXml);
|
|
122
|
+
const plannerXml = await readFile(genAiPlanners[parsedBotVersion.BotVersion.conversationDefinitionPlanners.genAiPlannerName ?? subjectName], 'utf-8');
|
|
123
|
+
const parsedPlanner = parser.parse(plannerXml);
|
|
124
|
+
const genAiFunctions = castArray(parsedPlanner.GenAiPlanner.genAiFunctions).map(({ genAiFunctionName }) => genAiFunctionName);
|
|
125
|
+
const genAiPlugins = castArray(parsedPlanner.GenAiPlanner.genAiPlugins).reduce((acc, { genAiPluginName }) => ({
|
|
126
|
+
...acc,
|
|
127
|
+
[genAiPluginName]: cs.getComponentFilenamesByNameAndType({
|
|
128
|
+
fullName: genAiPluginName,
|
|
129
|
+
type: 'GenAiPlugin',
|
|
130
|
+
})[0],
|
|
131
|
+
}), {});
|
|
132
|
+
return { genAiPlugins, genAiFunctions };
|
|
133
|
+
}
|
|
134
|
+
function ensureYamlExtension(filePath) {
|
|
135
|
+
const parsedPath = parse(filePath);
|
|
136
|
+
if (parsedPath.ext === '.yaml' || parsedPath.ext === '.yml')
|
|
137
|
+
return filePath;
|
|
138
|
+
const normalized = `${join(parsedPath.dir, parsedPath.name)}.yaml`;
|
|
139
|
+
warn(`Provided file path does not have a .yaml or .yml extension. Normalizing to ${normalized}`);
|
|
140
|
+
return normalized;
|
|
141
|
+
}
|
|
142
|
+
async function promptUntilUniqueFile(subjectName, filePath) {
|
|
143
|
+
const outputFile = filePath ??
|
|
144
|
+
(await input({
|
|
145
|
+
message: 'Enter a path for the test spec file',
|
|
146
|
+
validate(d) {
|
|
147
|
+
if (!d.length) {
|
|
148
|
+
return 'Path cannot be empty';
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
},
|
|
152
|
+
theme,
|
|
153
|
+
}));
|
|
154
|
+
const normalized = ensureYamlExtension(outputFile);
|
|
155
|
+
if (!existsSync(normalized)) {
|
|
156
|
+
return normalized;
|
|
157
|
+
}
|
|
158
|
+
const confirmation = await yesNoOrCancel({
|
|
159
|
+
message: `File ${normalized} already exists. Overwrite?`,
|
|
160
|
+
default: false,
|
|
161
|
+
});
|
|
162
|
+
if (confirmation === 'cancel') {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!confirmation) {
|
|
166
|
+
return promptUntilUniqueFile(subjectName);
|
|
167
|
+
}
|
|
168
|
+
return normalized;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* If the user provides the --force-overwrite flag, then we'll use the default file path (either the one provided by --output-file or the default path).
|
|
172
|
+
* If the user doesn't provide it, we'll prompt the user for a file path until they provide a unique one or cancel.
|
|
173
|
+
*/
|
|
174
|
+
async function determineFilePath(subjectName, outputFile, forceOverwrite) {
|
|
175
|
+
const defaultFile = ensureYamlExtension(outputFile ?? join('specs', `${subjectName}-testSpec.yaml`));
|
|
176
|
+
return forceOverwrite ? defaultFile : promptUntilUniqueFile(subjectName, defaultFile);
|
|
177
|
+
}
|
|
96
178
|
export default class AgentGenerateTestSpec extends SfCommand {
|
|
97
179
|
static summary = messages.getMessage('summary');
|
|
98
180
|
static description = messages.getMessage('description');
|
|
99
181
|
static examples = messages.getMessages('examples');
|
|
100
182
|
static enableJsonFlag = false;
|
|
101
183
|
static state = 'beta';
|
|
184
|
+
static flags = {
|
|
185
|
+
'from-definition': Flags.string({
|
|
186
|
+
char: 'd',
|
|
187
|
+
summary: messages.getMessage('flags.from-definition.summary'),
|
|
188
|
+
}),
|
|
189
|
+
'force-overwrite': Flags.boolean({
|
|
190
|
+
summary: messages.getMessage('flags.force-overwrite.summary'),
|
|
191
|
+
}),
|
|
192
|
+
'output-file': Flags.file({
|
|
193
|
+
char: 'f',
|
|
194
|
+
summary: messages.getMessage('flags.output-file.summary'),
|
|
195
|
+
parse: async (raw) => Promise.resolve(raw ? ensureYamlExtension(raw) : undefined),
|
|
196
|
+
}),
|
|
197
|
+
};
|
|
102
198
|
async run() {
|
|
103
|
-
const
|
|
104
|
-
const
|
|
199
|
+
const { flags } = await this.parse(AgentGenerateTestSpec);
|
|
200
|
+
const directoryPaths = (await SfProject.resolve().then((project) => project.getPackageDirectories())).map((dir) => dir.fullPath);
|
|
201
|
+
const cs = await ComponentSetBuilder.build({
|
|
202
|
+
metadata: {
|
|
203
|
+
metadataEntries: ['GenAiPlanner', 'GenAiPlugin', 'Bot', 'AiEvaluationDefinition'],
|
|
204
|
+
directoryPaths,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
if (flags['from-definition']) {
|
|
208
|
+
const aiEvalDefs = getMetadataFilePaths(cs, 'AiEvaluationDefinition');
|
|
209
|
+
if (!aiEvalDefs[flags['from-definition']]) {
|
|
210
|
+
throw new SfError(`AiEvaluationDefinition ${flags['from-definition']} not found`, 'AiEvalDefinitionNotFoundError');
|
|
211
|
+
}
|
|
212
|
+
const spec = await generateTestSpecFromAiEvalDefinition(aiEvalDefs[flags['from-definition']]);
|
|
213
|
+
const outputFile = await determineFilePath(spec.subjectName, flags['output-file'], flags['force-overwrite']);
|
|
214
|
+
if (!outputFile) {
|
|
215
|
+
this.log(messages.getMessage('info.cancel'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
await writeTestSpec(spec, outputFile);
|
|
219
|
+
this.log(`Created ${outputFile}`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const bots = [
|
|
223
|
+
...cs
|
|
224
|
+
.filter((component) => component.type.name === 'Bot')
|
|
225
|
+
.map((c) => c.fullName)
|
|
226
|
+
.filter((n) => n !== '*'),
|
|
227
|
+
];
|
|
105
228
|
if (bots.length === 0) {
|
|
106
|
-
throw new SfError(`No agents found in ${
|
|
229
|
+
throw new SfError(`No agents found in ${directoryPaths.join(', ')}`, 'NoAgentsFoundError');
|
|
107
230
|
}
|
|
108
231
|
const subjectType = await select({
|
|
109
232
|
message: 'What are you testing',
|
|
@@ -115,6 +238,12 @@ export default class AgentGenerateTestSpec extends SfCommand {
|
|
|
115
238
|
choices: bots,
|
|
116
239
|
theme,
|
|
117
240
|
});
|
|
241
|
+
const outputFile = await determineFilePath(subjectName, flags['output-file'], flags['force-overwrite']);
|
|
242
|
+
if (!outputFile) {
|
|
243
|
+
this.log(messages.getMessage('info.cancel'));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const { genAiPlugins, genAiFunctions } = await getPluginsAndFunctions(subjectName, cs);
|
|
118
247
|
const name = await input({
|
|
119
248
|
message: 'Enter a name for the test definition',
|
|
120
249
|
validate(d) {
|
|
@@ -123,12 +252,6 @@ export default class AgentGenerateTestSpec extends SfCommand {
|
|
|
123
252
|
return 'Name cannot be empty';
|
|
124
253
|
}
|
|
125
254
|
return true;
|
|
126
|
-
// TODO: add back validation once we refine the regex
|
|
127
|
-
// check against FORTY_CHAR_API_NAME_REGEX
|
|
128
|
-
// if (!FORTY_CHAR_API_NAME_REGEX.test(d)) {
|
|
129
|
-
// return 'The non-namespaced portion an API name must begin with a letter, contain only letters, numbers, and underscores, not contain consecutive underscores, and not end with an underscore.';
|
|
130
|
-
// }
|
|
131
|
-
// return true;
|
|
132
255
|
},
|
|
133
256
|
theme,
|
|
134
257
|
});
|
|
@@ -136,31 +259,26 @@ export default class AgentGenerateTestSpec extends SfCommand {
|
|
|
136
259
|
message: 'Enter a description for test definition (optional)',
|
|
137
260
|
theme,
|
|
138
261
|
});
|
|
139
|
-
const genAiPluginDir = join('force-app', 'main', 'default', 'genAiPlugins');
|
|
140
|
-
const genAiPlugins = Object.fromEntries((await readDir(genAiPluginDir)).map((genAiPlugin) => [
|
|
141
|
-
genAiPlugin.replace('.genAiPlugin-meta.xml', ''),
|
|
142
|
-
join(genAiPluginDir, genAiPlugin),
|
|
143
|
-
]));
|
|
144
262
|
const testCases = [];
|
|
145
263
|
do {
|
|
146
264
|
this.log();
|
|
147
265
|
this.styledHeader(`Adding test case #${testCases.length + 1}`);
|
|
148
266
|
// eslint-disable-next-line no-await-in-loop
|
|
149
|
-
testCases.push(await promptForTestCase(genAiPlugins));
|
|
267
|
+
testCases.push(await promptForTestCase(genAiPlugins, genAiFunctions));
|
|
150
268
|
} while ( // eslint-disable-next-line no-await-in-loop
|
|
151
269
|
await confirm({
|
|
152
270
|
message: 'Would you like to add another test case',
|
|
153
271
|
default: true,
|
|
154
272
|
}));
|
|
155
273
|
this.log();
|
|
156
|
-
await
|
|
274
|
+
await writeTestSpec({
|
|
157
275
|
name,
|
|
158
276
|
description,
|
|
159
277
|
subjectType,
|
|
160
278
|
subjectName,
|
|
161
279
|
testCases,
|
|
162
|
-
},
|
|
163
|
-
this.log(`Created ${
|
|
280
|
+
}, outputFile);
|
|
281
|
+
this.log(`Created ${outputFile}`);
|
|
164
282
|
}
|
|
165
283
|
}
|
|
166
284
|
//# sourceMappingURL=test-spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-spec.js","sourceRoot":"","sources":["../../../../src/commands/agent/generate/test-spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"test-spec.js","sourceRoot":"","sources":["../../../../src/commands/agent/generate/test-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,12 @@ export default class AgentTestCreate extends SfCommand<AgentTestCreateResult> {
|
|
|
11
11
|
static readonly examples: string[];
|
|
12
12
|
static readonly state = "beta";
|
|
13
13
|
static readonly flags: {
|
|
14
|
-
spec: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
14
|
'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
15
|
'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
16
|
preview: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
-
'
|
|
17
|
+
'force-overwrite': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
"test-api-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
20
|
};
|
|
20
21
|
private mso?;
|
|
21
22
|
run(): Promise<AgentTestCreateResult>;
|