@salesforce/plugin-agent 1.42.1 → 1.44.4

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 (115) hide show
  1. package/README.md +513 -68
  2. package/lib/adlUtils.d.ts +2 -0
  3. package/lib/adlUtils.js +31 -0
  4. package/lib/adlUtils.js.map +1 -0
  5. package/lib/commands/agent/adl/create.d.ts +6 -1
  6. package/lib/commands/agent/adl/create.js +83 -19
  7. package/lib/commands/agent/adl/create.js.map +1 -1
  8. package/lib/commands/agent/adl/delete.d.ts +0 -1
  9. package/lib/commands/agent/adl/delete.js +3 -2
  10. package/lib/commands/agent/adl/delete.js.map +1 -1
  11. package/lib/commands/agent/adl/file/add.d.ts +0 -1
  12. package/lib/commands/agent/adl/file/add.js +3 -2
  13. package/lib/commands/agent/adl/file/add.js.map +1 -1
  14. package/lib/commands/agent/adl/file/delete.d.ts +0 -1
  15. package/lib/commands/agent/adl/file/delete.js +4 -3
  16. package/lib/commands/agent/adl/file/delete.js.map +1 -1
  17. package/lib/commands/agent/adl/file/list.d.ts +5 -5
  18. package/lib/commands/agent/adl/file/list.js +31 -7
  19. package/lib/commands/agent/adl/file/list.js.map +1 -1
  20. package/lib/commands/agent/adl/get.d.ts +0 -1
  21. package/lib/commands/agent/adl/get.js +15 -3
  22. package/lib/commands/agent/adl/get.js.map +1 -1
  23. package/lib/commands/agent/adl/list.d.ts +0 -1
  24. package/lib/commands/agent/adl/list.js +3 -2
  25. package/lib/commands/agent/adl/list.js.map +1 -1
  26. package/lib/commands/agent/adl/status.d.ts +1 -1
  27. package/lib/commands/agent/adl/status.js +21 -4
  28. package/lib/commands/agent/adl/status.js.map +1 -1
  29. package/lib/commands/agent/adl/update.d.ts +1 -1
  30. package/lib/commands/agent/adl/update.js +18 -5
  31. package/lib/commands/agent/adl/update.js.map +1 -1
  32. package/lib/commands/agent/adl/upload.d.ts +0 -1
  33. package/lib/commands/agent/adl/upload.js +3 -2
  34. package/lib/commands/agent/adl/upload.js.map +1 -1
  35. package/lib/commands/agent/generate/test-spec.d.ts +9 -0
  36. package/lib/commands/agent/generate/test-spec.js +194 -11
  37. package/lib/commands/agent/generate/test-spec.js.map +1 -1
  38. package/lib/commands/agent/mcp/asset/list.d.ts +16 -0
  39. package/lib/commands/agent/mcp/asset/list.js +68 -0
  40. package/lib/commands/agent/mcp/asset/list.js.map +1 -0
  41. package/lib/commands/agent/mcp/asset/replace.d.ts +18 -0
  42. package/lib/commands/agent/mcp/asset/replace.js +95 -0
  43. package/lib/commands/agent/mcp/asset/replace.js.map +1 -0
  44. package/lib/commands/agent/mcp/create.d.ts +24 -0
  45. package/lib/commands/agent/mcp/create.js +112 -0
  46. package/lib/commands/agent/mcp/create.js.map +1 -0
  47. package/lib/commands/agent/mcp/delete.d.ts +19 -0
  48. package/lib/commands/agent/mcp/delete.js +65 -0
  49. package/lib/commands/agent/mcp/delete.js.map +1 -0
  50. package/lib/commands/agent/mcp/fetch.d.ts +16 -0
  51. package/lib/commands/agent/mcp/fetch.js +68 -0
  52. package/lib/commands/agent/mcp/fetch.js.map +1 -0
  53. package/lib/commands/agent/mcp/get.d.ts +16 -0
  54. package/lib/commands/agent/mcp/get.js +58 -0
  55. package/lib/commands/agent/mcp/get.js.map +1 -0
  56. package/lib/commands/agent/mcp/list.d.ts +18 -0
  57. package/lib/commands/agent/mcp/list.js +73 -0
  58. package/lib/commands/agent/mcp/list.js.map +1 -0
  59. package/lib/commands/agent/mcp/update.d.ts +24 -0
  60. package/lib/commands/agent/mcp/update.js +115 -0
  61. package/lib/commands/agent/mcp/update.js.map +1 -0
  62. package/lib/commands/agent/preview/start.d.ts +1 -0
  63. package/lib/commands/agent/preview/start.js +4 -1
  64. package/lib/commands/agent/preview/start.js.map +1 -1
  65. package/lib/commands/agent/preview.d.ts +1 -0
  66. package/lib/commands/agent/preview.js +4 -0
  67. package/lib/commands/agent/preview.js.map +1 -1
  68. package/lib/components/agent-preview-react.d.ts +2 -1
  69. package/lib/components/agent-preview-react.js +3 -3
  70. package/lib/components/agent-preview-react.js.map +1 -1
  71. package/lib/flags.d.ts +12 -1
  72. package/lib/flags.js +31 -0
  73. package/lib/flags.js.map +1 -1
  74. package/messages/agent.adl.create.md +22 -0
  75. package/messages/agent.adl.file.add.md +2 -0
  76. package/messages/agent.adl.file.delete.md +4 -0
  77. package/messages/agent.adl.file.list.md +12 -0
  78. package/messages/agent.adl.status.md +5 -1
  79. package/messages/agent.adl.update.md +4 -0
  80. package/messages/agent.adl.upload.md +2 -0
  81. package/messages/agent.generate.test-spec.md +33 -5
  82. package/messages/agent.mcp.asset.list.md +25 -0
  83. package/messages/agent.mcp.asset.replace.md +49 -0
  84. package/messages/agent.mcp.create.md +61 -0
  85. package/messages/agent.mcp.delete.md +37 -0
  86. package/messages/agent.mcp.fetch.md +25 -0
  87. package/messages/agent.mcp.get.md +25 -0
  88. package/messages/agent.mcp.list.md +33 -0
  89. package/messages/agent.mcp.update.md +65 -0
  90. package/messages/shared.md +16 -0
  91. package/oclif.manifest.json +1774 -842
  92. package/package.json +14 -4
  93. package/schemas/agent-adl-create.json +63 -3
  94. package/schemas/agent-adl-delete.json +5 -2
  95. package/schemas/agent-adl-file-add.json +7 -2
  96. package/schemas/agent-adl-file-delete.json +5 -2
  97. package/schemas/agent-adl-file-list.json +26 -3
  98. package/schemas/agent-adl-get.json +63 -3
  99. package/schemas/agent-adl-list.json +55 -3
  100. package/schemas/agent-adl-status.json +44 -4
  101. package/schemas/agent-adl-update.json +63 -3
  102. package/schemas/agent-adl-upload.json +5 -2
  103. package/schemas/agent-mcp-asset-list.json +65 -0
  104. package/schemas/agent-mcp-asset-replace.json +65 -0
  105. package/schemas/agent-mcp-create.json +144 -0
  106. package/schemas/agent-mcp-delete.json +22 -0
  107. package/schemas/agent-mcp-fetch.json +66 -0
  108. package/schemas/agent-mcp-get.json +86 -0
  109. package/schemas/agent-mcp-list.json +101 -0
  110. package/schemas/agent-mcp-update.json +86 -0
  111. package/schemas/agent-preview-end.json +8 -3
  112. package/schemas/agent-publish-authoring__bundle.json +8 -3
  113. package/schemas/agent-trace-delete.json +7 -2
  114. package/schemas/agent-trace-list.json +9 -2
  115. package/schemas/agent-trace-read.json +131 -21
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,oBAAoB,CAAC;AAE/E,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;AAIrF,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAA6B;IAC9D,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC;IACtC,MAAM,CAAU,KAAK,GAAG,SAAS,CAAC;IAElC,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE;QACjC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;QACpC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC;YACzD,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU;SACxD,CAAC,EAAE;KACL,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3E,IAAI,MAA2C,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC/C,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9G,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC;gBACT,IAAI,EAAE,MAAM,CAAC,SAAS;gBACtB,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;oBACpC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE;oBACxC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;oBAC1C,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjC,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE;iBACjD;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;AAIrF,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAA6B;IAC9D,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC;IAEtC,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE;QACjC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;QACpC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC;YACzD,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU;SACxD,CAAC,EAAE;KACL,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3E,IAAI,MAA2C,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC/C,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC;YACjE,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC;gBACT,IAAI,EAAE,MAAM,CAAC,SAAS;gBACtB,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;oBACpC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE;oBACxC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;oBAC1C,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjC,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE;iBACjD;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC"}
@@ -6,11 +6,11 @@ export default class AgentAdlStatus extends SfCommand<AgentAdlStatusResult> {
6
6
  static readonly description: string;
7
7
  static readonly examples: string[];
8
8
  static readonly enableJsonFlag = true;
9
- static readonly state = "preview";
10
9
  static readonly flags: {
11
10
  'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
12
11
  'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
12
  'library-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ 'include-artifacts': import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  };
15
15
  run(): Promise<AgentAdlStatusResult>;
16
16
  }
@@ -16,6 +16,7 @@
16
16
  import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
17
17
  import { Messages, SfError } from '@salesforce/core';
18
18
  import { AgentDataLibrary } from '@salesforce/agents';
19
+ import { extractApiError } from '../../../adlUtils.js';
19
20
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
20
21
  const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.adl.status');
21
22
  export default class AgentAdlStatus extends SfCommand {
@@ -23,7 +24,6 @@ export default class AgentAdlStatus extends SfCommand {
23
24
  static description = messages.getMessage('description');
24
25
  static examples = messages.getMessages('examples');
25
26
  static enableJsonFlag = true;
26
- static state = 'preview';
27
27
  static flags = {
28
28
  'target-org': Flags.requiredOrg(),
29
29
  'api-version': Flags.orgApiVersion(),
@@ -32,23 +32,40 @@ export default class AgentAdlStatus extends SfCommand {
32
32
  char: 'i',
33
33
  required: true,
34
34
  }),
35
+ 'include-artifacts': Flags.boolean({
36
+ summary: messages.getMessage('flags.include-artifacts.summary'),
37
+ default: false,
38
+ }),
35
39
  };
36
40
  async run() {
37
41
  const { flags } = await this.parse(AgentAdlStatus);
38
42
  const connection = flags['target-org'].getConnection(flags['api-version']);
39
43
  let result;
40
44
  try {
41
- result = await AgentDataLibrary.status(connection, flags['library-id']);
45
+ result = await AgentDataLibrary.status(connection, flags['library-id'], {
46
+ includeArtifacts: flags['include-artifacts'],
47
+ });
42
48
  }
43
49
  catch (error) {
44
50
  const wrapped = SfError.wrap(error);
45
- throw new SfError(messages.getMessage('error.statusFailed', [wrapped.message]), 'StatusFailed', [], 4, wrapped);
51
+ const cleanMessage = extractApiError(wrapped) ?? wrapped.message;
52
+ throw new SfError(messages.getMessage('error.statusFailed', [cleanMessage]), 'StatusFailed', [], 4, wrapped);
46
53
  }
47
54
  const { indexingStatus } = result;
48
55
  this.log(`Library ${indexingStatus.libraryId}: ${indexingStatus.status}`);
49
56
  if (indexingStatus.stageDetails) {
50
57
  for (const stage of indexingStatus.stageDetails) {
51
- this.log(` ${stage.name}: ${stage.status}${stage.error ? ` (${stage.error})` : ''}`);
58
+ let line = ` ${stage.name}: ${stage.status}`;
59
+ if (stage.errorCode)
60
+ line += ` [${stage.errorCode}]`;
61
+ if (stage.error)
62
+ line += ` (${stage.error})`;
63
+ this.log(line);
64
+ if (stage.artifacts?.length) {
65
+ for (const artifact of stage.artifacts) {
66
+ this.log(` → ${artifact.assetType}: ${artifact.label} (${artifact.id})`);
67
+ }
68
+ }
52
69
  }
53
70
  }
54
71
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAA+B,MAAM,oBAAoB,CAAC;AAEnF,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;AAIvF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,SAA+B;IAClE,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC;IACtC,MAAM,CAAU,KAAK,GAAG,SAAS,CAAC;IAElC,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE;QACjC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;QACpC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,0BAA0B,CAAC;YACxD,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3E,IAAI,MAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,SAAS,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAA+B,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;AAIvF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,SAA+B;IAClE,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC;IAEtC,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE;QACjC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;QACpC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,0BAA0B,CAAC;YACxD,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,iCAAiC,CAAC;YAC/D,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3E,IAAI,MAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE;gBACtE,gBAAgB,EAAE,KAAK,CAAC,mBAAmB,CAAC;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC;YACjE,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/G,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,SAAS,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;gBAChD,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC9C,IAAI,KAAK,CAAC,SAAS;oBAAE,IAAI,IAAI,KAAK,KAAK,CAAC,SAAS,GAAG,CAAC;gBACrD,IAAI,KAAK,CAAC,KAAK;oBAAE,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;gBAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC5B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACvC,IAAI,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC"}
@@ -6,7 +6,6 @@ export default class AgentAdlUpdate extends SfCommand<AgentAdlUpdateResult> {
6
6
  static readonly description: string;
7
7
  static readonly examples: string[];
8
8
  static readonly enableJsonFlag = true;
9
- static readonly state = "preview";
10
9
  static readonly flags: {
11
10
  'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
12
11
  'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -15,6 +14,7 @@ export default class AgentAdlUpdate extends SfCommand<AgentAdlUpdateResult> {
15
14
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
15
  'content-fields': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
16
  'restrict-to-public-articles': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ 'data-category-rule': import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
18
  'retriever-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
19
  };
20
20
  run(): Promise<AgentAdlUpdateResult>;
@@ -16,6 +16,7 @@
16
16
  import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
17
17
  import { Messages, SfError } from '@salesforce/core';
18
18
  import { AgentDataLibrary } from '@salesforce/agents';
19
+ import { extractApiError } from '../../../adlUtils.js';
19
20
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
20
21
  const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.adl.update');
21
22
  export default class AgentAdlUpdate extends SfCommand {
@@ -23,7 +24,6 @@ export default class AgentAdlUpdate extends SfCommand {
23
24
  static description = messages.getMessage('description');
24
25
  static examples = messages.getMessages('examples');
25
26
  static enableJsonFlag = true;
26
- static state = 'preview';
27
27
  static flags = {
28
28
  'target-org': Flags.requiredOrg(),
29
29
  'api-version': Flags.orgApiVersion(),
@@ -46,6 +46,10 @@ export default class AgentAdlUpdate extends SfCommand {
46
46
  summary: messages.getMessage('flags.restrict-to-public-articles.summary'),
47
47
  allowNo: true,
48
48
  }),
49
+ 'data-category-rule': Flags.boolean({
50
+ summary: messages.getMessage('flags.data-category-rule.summary'),
51
+ allowNo: true,
52
+ }),
49
53
  'retriever-id': Flags.string({
50
54
  summary: messages.getMessage('flags.retriever-id.summary'),
51
55
  }),
@@ -58,20 +62,28 @@ export default class AgentAdlUpdate extends SfCommand {
58
62
  input.masterLabel = flags.name;
59
63
  if (flags.description)
60
64
  input.description = flags.description;
61
- const hasKnowledgeFlags = flags['content-fields'] !== undefined || flags['restrict-to-public-articles'] !== undefined;
65
+ const hasKnowledgeFlags = flags['content-fields'] !== undefined ||
66
+ flags['restrict-to-public-articles'] !== undefined ||
67
+ flags['data-category-rule'] !== undefined;
62
68
  if (hasKnowledgeFlags) {
63
69
  const detail = await AgentDataLibrary.get(connection, flags['library-id']);
64
70
  if (detail.sourceType !== 'KNOWLEDGE') {
65
- this.warn('--content-fields and --restrict-to-public-articles are only valid for KNOWLEDGE libraries. Ignoring.');
71
+ this.warn('--content-fields, --restrict-to-public-articles, and --data-category-rule are only valid for KNOWLEDGE libraries. Ignoring.');
66
72
  }
67
73
  else {
68
74
  const knowledgeConfig = {};
69
75
  if (flags['content-fields'] !== undefined) {
70
- knowledgeConfig.contentFields = flags['content-fields'].split(',').map((f) => f.trim());
76
+ knowledgeConfig.contentFields = flags['content-fields']
77
+ .split(',')
78
+ .map((f) => f.trim())
79
+ .filter(Boolean);
71
80
  }
72
81
  if (flags['restrict-to-public-articles'] !== undefined) {
73
82
  knowledgeConfig.isRestrictToPublicArticle = flags['restrict-to-public-articles'];
74
83
  }
84
+ if (flags['data-category-rule'] !== undefined) {
85
+ knowledgeConfig.isDataCategoryRuleEnabled = flags['data-category-rule'];
86
+ }
75
87
  input.groundingSource = {
76
88
  sourceType: 'KNOWLEDGE',
77
89
  knowledgeConfig,
@@ -93,7 +105,8 @@ export default class AgentAdlUpdate extends SfCommand {
93
105
  }
94
106
  catch (error) {
95
107
  const wrapped = SfError.wrap(error);
96
- throw new SfError(messages.getMessage('error.updateFailed', [wrapped.message]), 'UpdateFailed', [], 4, wrapped);
108
+ const cleanMessage = extractApiError(wrapped) ?? wrapped.message;
109
+ throw new SfError(messages.getMessage('error.updateFailed', [cleanMessage]), 'UpdateFailed', [], 4, wrapped);
97
110
  }
98
111
  this.log(`Updated data library "${result.masterLabel}" (${result.libraryId}).`);
99
112
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/update.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,6 @@ export default class AgentAdlUpload extends SfCommand<AgentAdlUploadResult> {
6
6
  static readonly description: string;
7
7
  static readonly examples: string[];
8
8
  static readonly enableJsonFlag = true;
9
- static readonly state = "preview";
10
9
  static readonly flags: {
11
10
  'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
12
11
  'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -16,6 +16,7 @@
16
16
  import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
17
17
  import { Messages, SfError } from '@salesforce/core';
18
18
  import { AgentDataLibrary } from '@salesforce/agents';
19
+ import { extractApiError } from '../../../adlUtils.js';
19
20
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
20
21
  const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.adl.upload');
21
22
  export default class AgentAdlUpload extends SfCommand {
@@ -23,7 +24,6 @@ export default class AgentAdlUpload extends SfCommand {
23
24
  static description = messages.getMessage('description');
24
25
  static examples = messages.getMessages('examples');
25
26
  static enableJsonFlag = true;
26
- static state = 'preview';
27
27
  static flags = {
28
28
  'target-org': Flags.requiredOrg(),
29
29
  'api-version': Flags.orgApiVersion(),
@@ -63,7 +63,8 @@ export default class AgentAdlUpload extends SfCommand {
63
63
  }
64
64
  catch (error) {
65
65
  const wrapped = SfError.wrap(error);
66
- throw new SfError(wrapped.message, wrapped.name ?? 'UploadFailed', [], 4, wrapped);
66
+ const cleanMessage = extractApiError(wrapped) ?? wrapped.message;
67
+ throw new SfError(cleanMessage, wrapped.name ?? 'UploadFailed', [], 4, wrapped);
67
68
  }
68
69
  if (result.status === 'READY') {
69
70
  this.log('Library ready.');
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/upload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../../src/commands/agent/adl/upload.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { SfCommand } from '@salesforce/sf-plugins-core';
2
+ import { type NgtTestCase } from '@salesforce/agents';
2
3
  import { ComponentSet } from '@salesforce/source-deploy-retrieve';
4
+ type TestRunner = 'agentforce-studio' | 'testing-center';
3
5
  type TestCase = {
4
6
  utterance: string;
5
7
  expectedActions: string[];
@@ -67,6 +69,12 @@ export declare function getPluginsAndFunctions(subjectName: string, cs: Componen
67
69
  genAiFunctions: string[];
68
70
  }>;
69
71
  export declare function ensureYamlExtension(filePath: string): string;
72
+ /**
73
+ * Infer the test runner from the file extension of an AiEvaluationDefinition / AiTestingDefinition
74
+ * metadata XML file. Throws when the extension matches neither.
75
+ */
76
+ export declare function inferRunnerFromMdPath(mdPath: string): TestRunner;
77
+ export declare function promptForNgtTestCase(topics: string[], bots: string[], subjectName: string, caseNumber: number, log: (msg?: string) => void): Promise<NgtTestCase>;
70
78
  export default class AgentGenerateTestSpec extends SfCommand<void> {
71
79
  static readonly summary: string;
72
80
  static readonly description: string;
@@ -76,6 +84,7 @@ export default class AgentGenerateTestSpec extends SfCommand<void> {
76
84
  'from-definition': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
77
85
  'force-overwrite': import("@oclif/core/interfaces").BooleanFlag<boolean>;
78
86
  'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
87
+ 'test-runner': import("@oclif/core/interfaces").OptionFlag<"agentforce-studio" | "testing-center" | undefined, import("@oclif/core/interfaces").CustomOptions>;
79
88
  };
80
89
  run(): Promise<void>;
81
90
  }
@@ -18,7 +18,7 @@ import { join, parse } from 'node:path';
18
18
  import { existsSync } from 'node:fs';
19
19
  import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
20
20
  import { Messages, SfError, SfProject } from '@salesforce/core';
21
- import { AgentTest } from '@salesforce/agents';
21
+ import { AgentTest, NgtScorerCatalog, } from '@salesforce/agents';
22
22
  import { select, input, confirm, checkbox } from '@inquirer/prompts';
23
23
  import { XMLParser } from 'fast-xml-parser';
24
24
  import { ComponentSetBuilder } from '@salesforce/source-deploy-retrieve';
@@ -26,6 +26,7 @@ import { warn } from '@oclif/core/errors';
26
26
  import { ensureArray } from '@salesforce/kit';
27
27
  import { theme } from '../../../inquirer-theme.js';
28
28
  import yesNoOrCancel from '../../../yes-no-cancel.js';
29
+ import { testRunnerFlag } from '../../../flags.js';
29
30
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
30
31
  const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.test-spec');
31
32
  /**
@@ -291,6 +292,17 @@ export function ensureYamlExtension(filePath) {
291
292
  warn(`Provided file path does not have a .yaml or .yml extension. Normalizing to ${normalized}`);
292
293
  return normalized;
293
294
  }
295
+ /**
296
+ * Infer the test runner from the file extension of an AiEvaluationDefinition / AiTestingDefinition
297
+ * metadata XML file. Throws when the extension matches neither.
298
+ */
299
+ export function inferRunnerFromMdPath(mdPath) {
300
+ if (mdPath.endsWith('aiTestingDefinition-meta.xml'))
301
+ return 'agentforce-studio';
302
+ if (mdPath.endsWith('aiEvaluationDefinition-meta.xml'))
303
+ return 'testing-center';
304
+ throw messages.createError('error.UnknownDefinitionExtension', [mdPath]);
305
+ }
294
306
  async function promptUntilUniqueFile(subjectName, filePath) {
295
307
  const outputFile = filePath ??
296
308
  (await input({
@@ -323,10 +335,151 @@ async function promptUntilUniqueFile(subjectName, filePath) {
323
335
  * 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).
324
336
  * If the user doesn't provide it, we'll prompt the user for a file path until they provide a unique one or cancel.
325
337
  */
326
- async function determineFilePath(subjectName, outputFile, forceOverwrite) {
327
- const defaultFile = ensureYamlExtension(outputFile ?? join('specs', `${subjectName}-testSpec.yaml`));
338
+ async function determineFilePath(subjectName, outputFile, forceOverwrite, testRunner = 'testing-center') {
339
+ const suffix = testRunner === 'agentforce-studio' ? '-ngtTestSpec.yaml' : '-testSpec.yaml';
340
+ const defaultFile = ensureYamlExtension(outputFile ?? join('specs', `${subjectName}${suffix}`));
328
341
  return forceOverwrite ? defaultFile : promptUntilUniqueFile(subjectName, defaultFile);
329
342
  }
343
+ const NGT_BOILERPLATE_HISTORY = [
344
+ { role: 'user', message: 'example user message' },
345
+ { role: 'agent', message: 'example agent message', topic: 'Example_agent_topic' },
346
+ ];
347
+ async function promptForNgtContextVariables() {
348
+ const vars = [];
349
+ let wantsMore = await confirm({ message: 'Add context variables to this case', default: false, theme });
350
+ while (wantsMore) {
351
+ // eslint-disable-next-line no-await-in-loop
352
+ const name = await input({
353
+ message: 'Variable name',
354
+ validate: (d) => d.length > 0 || 'Name cannot be empty',
355
+ theme,
356
+ });
357
+ // eslint-disable-next-line no-await-in-loop
358
+ const value = await input({ message: 'Variable value', theme });
359
+ vars.push({ name, value });
360
+ // eslint-disable-next-line no-await-in-loop
361
+ wantsMore = await confirm({ message: 'Add another context variable', default: false, theme });
362
+ }
363
+ return vars;
364
+ }
365
+ async function promptForNgtUtterance(message) {
366
+ return input({
367
+ message,
368
+ validate: (d) => d.length > 0 || 'utterance cannot be empty',
369
+ theme,
370
+ });
371
+ }
372
+ async function promptForNgtInputs() {
373
+ const isMulti = await confirm({
374
+ message: 'Does this case have multiple input phrasings sharing one scorer set',
375
+ default: false,
376
+ theme,
377
+ });
378
+ // contextVariables / conversationHistory are decided once and shared across the input set.
379
+ const contextVariables = await promptForNgtContextVariables();
380
+ const wantsHistory = await confirm({
381
+ message: 'Generate boilerplate conversation history for this case',
382
+ default: false,
383
+ theme,
384
+ });
385
+ const conversationHistory = wantsHistory ? [...NGT_BOILERPLATE_HISTORY] : undefined;
386
+ const utterances = [];
387
+ if (!isMulti) {
388
+ utterances.push(await promptForNgtUtterance('Utterance'));
389
+ }
390
+ else {
391
+ utterances.push(await promptForNgtUtterance('Utterance #1'));
392
+ let addAnother = await confirm({ message: 'Add another input utterance', default: true, theme });
393
+ while (addAnother) {
394
+ // eslint-disable-next-line no-await-in-loop
395
+ utterances.push(await promptForNgtUtterance(`Utterance #${utterances.length + 1}`));
396
+ // eslint-disable-next-line no-await-in-loop
397
+ addAnother = await confirm({ message: 'Add another input utterance', default: false, theme });
398
+ }
399
+ }
400
+ return utterances.map((utterance) => {
401
+ const ngtInput = { utterance };
402
+ if (contextVariables.length > 0)
403
+ ngtInput.contextVariables = contextVariables;
404
+ if (conversationHistory)
405
+ ngtInput.conversationHistory = conversationHistory;
406
+ return ngtInput;
407
+ });
408
+ }
409
+ /* eslint-disable camelcase */
410
+ const NGT_SCORER_HELP = {
411
+ topic_sequence_match: 'Topic API name (DeveloperName from a GenAiPlugin).',
412
+ action_sequence_match: "Single action API name, OR a Python-list-style string for multi-action: ['Verify_Customer','Get_Order_Status'].",
413
+ agent_handoff_match: "Target agent's DeveloperName (NOT label).",
414
+ bot_response_rating: "Natural-language assertion (LLM-judged). Example: 'Agent confirms the cancellation.'",
415
+ response_match: "Natural-language assertion (LLM-judged). Example: 'Agent confirms the cancellation.'",
416
+ };
417
+ /* eslint-enable camelcase */
418
+ async function promptForNgtScorerExpected(scorerName, topics, bots, subjectName) {
419
+ const help = NGT_SCORER_HELP[scorerName] ?? '';
420
+ if (scorerName === 'topic_sequence_match' && topics.length > 0) {
421
+ return select({
422
+ message: `Expected for ${scorerName}: ${help}`,
423
+ choices: topics.map((t) => ({ name: t, value: t })),
424
+ theme,
425
+ });
426
+ }
427
+ if (scorerName === 'agent_handoff_match') {
428
+ const targets = bots.filter((b) => b !== subjectName);
429
+ if (targets.length > 0) {
430
+ return select({
431
+ message: `Expected for ${scorerName}: ${help}`,
432
+ choices: targets.map((t) => ({ name: t, value: t })),
433
+ theme,
434
+ });
435
+ }
436
+ }
437
+ return input({
438
+ message: `Expected for ${scorerName}${help ? `: ${help}` : ''}`,
439
+ validate: (d) => d.length > 0 || 'expected cannot be empty',
440
+ theme,
441
+ });
442
+ }
443
+ async function promptForNgtScorers(topics, bots, subjectName) {
444
+ const choices = Object.keys(NgtScorerCatalog).map((n) => ({ name: n, value: n }));
445
+ const selected = await checkbox({
446
+ message: 'Select scorers for this test case',
447
+ choices,
448
+ required: true,
449
+ theme,
450
+ });
451
+ const scorers = [];
452
+ for (const name of selected) {
453
+ if (NgtScorerCatalog[name].needsExpected) {
454
+ // eslint-disable-next-line no-await-in-loop
455
+ const expected = await promptForNgtScorerExpected(name, topics, bots, subjectName);
456
+ scorers.push({ name, expected });
457
+ }
458
+ else {
459
+ scorers.push({ name });
460
+ }
461
+ }
462
+ return scorers;
463
+ }
464
+ export async function promptForNgtTestCase(topics, bots, subjectName, caseNumber, log) {
465
+ const inputs = await promptForNgtInputs();
466
+ const scorers = await promptForNgtScorers(topics, bots, subjectName);
467
+ const usesTaskResolution = scorers.some((s) => s.name === 'task_resolution');
468
+ const hasHistory = inputs.some((i) => Array.isArray(i.conversationHistory) && i.conversationHistory.length > 0);
469
+ if (usesTaskResolution && !hasHistory) {
470
+ const wantsBoilerplate = await confirm({
471
+ message: 'task_resolution requires conversationHistory. Add boilerplate conversation history now',
472
+ default: true,
473
+ theme,
474
+ });
475
+ if (wantsBoilerplate) {
476
+ const stamped = inputs.map((i) => ({ ...i, conversationHistory: [...NGT_BOILERPLATE_HISTORY] }));
477
+ return { inputs: stamped, scorers };
478
+ }
479
+ log(messages.getMessage('warning.NoConversationHistoryForTaskResolution', [caseNumber.toString()]));
480
+ }
481
+ return { inputs, scorers };
482
+ }
330
483
  export default class AgentGenerateTestSpec extends SfCommand {
331
484
  static summary = messages.getMessage('summary');
332
485
  static description = messages.getMessage('description');
@@ -337,12 +490,6 @@ export default class AgentGenerateTestSpec extends SfCommand {
337
490
  char: 'd',
338
491
  exists: true,
339
492
  summary: messages.getMessage('flags.from-definition.summary'),
340
- parse: async (raw) => {
341
- if (!raw.endsWith('aiEvaluationDefinition-meta.xml')) {
342
- throw messages.createError('error.InvalidAiEvaluationDefinition');
343
- }
344
- return Promise.resolve(raw);
345
- },
346
493
  }),
347
494
  'force-overwrite': Flags.boolean({
348
495
  summary: messages.getMessage('flags.force-overwrite.summary'),
@@ -352,6 +499,7 @@ export default class AgentGenerateTestSpec extends SfCommand {
352
499
  summary: messages.getMessage('flags.output-file.summary'),
353
500
  parse: async (raw) => Promise.resolve(ensureYamlExtension(raw)),
354
501
  }),
502
+ 'test-runner': testRunnerFlag,
355
503
  };
356
504
  async run() {
357
505
  const { flags } = await this.parse(AgentGenerateTestSpec);
@@ -363,9 +511,14 @@ export default class AgentGenerateTestSpec extends SfCommand {
363
511
  },
364
512
  });
365
513
  if (flags['from-definition']) {
514
+ const inferredRunner = inferRunnerFromMdPath(flags['from-definition']);
515
+ if (flags['test-runner'] && flags['test-runner'] !== inferredRunner) {
516
+ throw messages.createError('error.RunnerMismatch', [flags['test-runner'], inferredRunner]);
517
+ }
518
+ const testRunner = flags['test-runner'] ?? inferredRunner;
366
519
  const agentTest = new AgentTest({ mdPath: flags['from-definition'] });
367
520
  const spec = await agentTest.getTestSpec();
368
- const outputFile = await determineFilePath(spec.subjectName, flags['output-file'], flags['force-overwrite']);
521
+ const outputFile = await determineFilePath(spec.subjectName, flags['output-file'], flags['force-overwrite'], testRunner);
369
522
  if (!outputFile) {
370
523
  this.log(messages.getMessage('info.cancel'));
371
524
  return;
@@ -383,6 +536,7 @@ export default class AgentGenerateTestSpec extends SfCommand {
383
536
  if (bots.length === 0) {
384
537
  throw messages.createError('error.NoAgentsFound', [directoryPaths.join(', ')]);
385
538
  }
539
+ const testRunner = flags['test-runner'] ?? 'testing-center';
386
540
  const subjectType = (await select({
387
541
  message: 'What are you testing',
388
542
  choices: ['AGENT'],
@@ -393,7 +547,7 @@ export default class AgentGenerateTestSpec extends SfCommand {
393
547
  choices: bots,
394
548
  theme,
395
549
  });
396
- const outputFile = await determineFilePath(subjectName, flags['output-file'], flags['force-overwrite']);
550
+ const outputFile = await determineFilePath(subjectName, flags['output-file'], flags['force-overwrite'], testRunner);
397
551
  if (!outputFile) {
398
552
  this.log(messages.getMessage('info.cancel'));
399
553
  return;
@@ -414,6 +568,35 @@ export default class AgentGenerateTestSpec extends SfCommand {
414
568
  message: 'Enter a description for the test (optional)',
415
569
  theme,
416
570
  });
571
+ if (testRunner === 'agentforce-studio') {
572
+ const subjectVersion = await input({
573
+ message: 'Enter the agent version (e.g. v1)',
574
+ default: 'v1',
575
+ theme,
576
+ });
577
+ const ngtTestCases = [];
578
+ do {
579
+ this.log();
580
+ this.styledHeader(`Adding test case #${ngtTestCases.length + 1}`);
581
+ // eslint-disable-next-line no-await-in-loop
582
+ const tc = await promptForNgtTestCase(Object.keys(genAiPlugins), bots, subjectName, ngtTestCases.length + 1, (msg) => this.warn(msg ?? ''));
583
+ ngtTestCases.push(tc);
584
+ } while ( // eslint-disable-next-line no-await-in-loop
585
+ await confirm({ message: 'Do you want to add another test case', default: true }));
586
+ this.log();
587
+ const ngtSpec = {
588
+ name,
589
+ description: description || undefined,
590
+ subjectType,
591
+ subjectName,
592
+ subjectVersion,
593
+ testCases: ngtTestCases,
594
+ };
595
+ const agentTest = new AgentTest({ specData: ngtSpec });
596
+ await agentTest.writeTestSpec(outputFile);
597
+ this.log(`Created ${outputFile}`);
598
+ return;
599
+ }
417
600
  const testCases = [];
418
601
  do {
419
602
  this.log();