Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"@inquirer/prompts": "^7.10.1",
"@oclif/core": "^4",
"@oclif/multi-stage-output": "^0.8.36",
"@salesforce/agents": "^1.1.1",
"@salesforce/agents": "^1.1.2",
"@salesforce/core": "^8.28.3",
"@salesforce/kit": "^3.2.6",
"@salesforce/sf-plugins-core": "^12.2.6",
Expand Down
132 changes: 58 additions & 74 deletions src/commands/agent/publish/authoring-bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,89 +95,73 @@ export default class AgentPublishAuthoringBundle extends SfCommand<AgentPublishA
},
],
});
try {
mso.goto('Validate Bundle');
const targetOrg = flags['target-org'];
const conn = targetOrg.getConnection(flags['api-version']);
const agent = await Agent.init({
connection: conn,
project: this.project!,
aabName,
});

// First compile the .agent file to get the Agent JSON
const compileResponse = await agent.compile();
if (compileResponse.status === 'success') {
mso.skipTo('Publish Agent');
} else {
throwAgentCompilationError(compileResponse.errors);
}
// Then publish the Agent JSON to create the agent
// Set up lifecycle listeners for retrieve events
if (!flags['skip-retrieve']) {
Lifecycle.getInstance().on('scopedPreRetrieve', () => {
mso.skipTo('Retrieve Metadata');
return Promise.resolve();
});
}
// Set up lifecycle listeners for deploy events
Lifecycle.getInstance().on('scopedPreDeploy', () => {
mso.skipTo('Deploy Metadata');
return Promise.resolve();
});

Lifecycle.getInstance().on('scopedPostRetrieve', (result: ScopedPostRetrieve) => {
if (result.retrieveResult.response.status !== RequestStatus.Succeeded) {
const errorMessages = ensureArray(
// @ts-expect-error I saw errorMessages populated with useful information during testing
result?.retrieveResult.response?.messages ?? result?.retrieveResult?.response?.errorMessage
);
mso.goto('Validate Bundle');
const targetOrg = flags['target-org'];
const conn = targetOrg.getConnection(flags['api-version']);
const agent = await Agent.init({
connection: conn,
project: this.project!,
aabName,
});

const errorMessage = `Metadata retrieval failed: ${errorMessages.join(EOL)}`;
mso.error();
throw SfError.create({ name: 'Retrieve Failed', message: errorMessage });
}
// First compile the .agent file to get the Agent JSON
const compileResponse = await agent.compile();
if (compileResponse.status === 'success') {
mso.skipTo('Publish Agent');
} else {
throwAgentCompilationError(compileResponse.errors);
}
// Then publish the Agent JSON to create the agent
// Set up lifecycle listeners for retrieve events
if (!flags['skip-retrieve']) {
Lifecycle.getInstance().on('scopedPreRetrieve', () => {
mso.skipTo('Retrieve Metadata');
return Promise.resolve();
});
}
// Set up lifecycle listeners for deploy events
Lifecycle.getInstance().on('scopedPreDeploy', () => {
mso.skipTo('Deploy Metadata');
return Promise.resolve();
});

Lifecycle.getInstance().on('scopedPostDeploy', (result: ScopedPostDeploy) => {
if (result.deployResult.response.status === RequestStatus.Succeeded) {
mso.stop();
} else {
const deployResponse = result.deployResult.response;

// Check for component failures (most common source of detailed errors)
const failures = ensureArray(deployResponse.details.componentFailures);
throw SfError.create({
name: 'Deployment Failed',
message: failures.map((f) => `${f.problemType!}: ${f.problem!}`).join('\n'),
});
}
return Promise.resolve();
});
Lifecycle.getInstance().on('scopedPostRetrieve', (result: ScopedPostRetrieve) => {
if (result.retrieveResult.response.status !== RequestStatus.Succeeded) {
const errorMessages = ensureArray(
// @ts-expect-error I saw errorMessages populated with useful information during testing
result?.retrieveResult.response?.messages ?? result?.retrieveResult?.response?.errorMessage
);

const result = await agent.publish(flags['skip-retrieve']);
mso.stop();
const errorMessage = `Metadata retrieval failed: ${errorMessages.join(EOL)}`;
mso.error();
throw SfError.create({ name: 'Retrieve Failed', message: errorMessage });
}
return Promise.resolve();
});

return {
success: true,
botDeveloperName: result.developerName,
};
} catch (error) {
// Handle validation errors
const err = SfError.wrap(error);
const message = err.message ? err.message : err.name;
const errorMessage = messages.getMessage('error.publishFailed', [message]);
Lifecycle.getInstance().on('scopedPostDeploy', (result: ScopedPostDeploy) => {
if (result.deployResult.response.status === RequestStatus.Succeeded) {
mso.stop();
} else {
const deployResponse = result.deployResult.response;

// Stop the multi-stage output on error
mso.error();
// Check for component failures (most common source of detailed errors)
const failures = ensureArray(deployResponse.details.componentFailures);
throw SfError.create({
name: 'Deployment Failed',
message: failures.map((f) => `${f.problemType!}: ${f.problem!}`).join('\n'),
});
}
return Promise.resolve();
});

this.error(errorMessage);
const result = await agent.publish(flags['skip-retrieve']);
mso.stop();

return {
success: false,
errors: err.message.split('\n'),
};
}
return {
success: true,
botDeveloperName: result.developerName,
};
}
}
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1593,10 +1593,10 @@
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==

"@salesforce/agents@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.1.1.tgz#72b8c319c141f39153e641d41e8d11eefc0f34ab"
integrity sha512-sHeyUGbBKtO8diQVjH+mb7wB4cfCZVN+WuqVD44GvaGpR1NBycWlSt/P5klekiO5lZoEyl8kGe3BgySShS4W4g==
"@salesforce/agents@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.1.2.tgz#aa2b93e0ba71eefcde05541d9add8da3975577ec"
integrity sha512-p7isCk2WoV0t1skRoTjYeead+GOoF2I7VPo+K6YYt+h6S+v8vJTdBc8NNhnmUJcz386FIK5jc0g7bSz8lCQ0tQ==
dependencies:
"@salesforce/core" "^8.28.3"
"@salesforce/kit" "^3.2.6"
Expand Down
Loading