mirror of
https://github.com/KeygraphHQ/shannon.git
synced 2026-10-10 18:13:57 +02:00
fix: terminate failed scans in Temporal and surface the reason when following (#429)
* fix(cli): skip splash screen off a TTY (e.g. CI) * fix: terminate failed scans in Temporal and surface the reason when following * fix(cli): indent embedded newlines within failure-error segments * fix(worker): omit the Agent Breakdown section when no agents completed * fix(cli): don't reprint the failure reason when the log already showed it * fix(worker): indent embedded newlines within the workflow.log error block
This commit is contained in:
1 parent
53118c6203
commit
b13788d8ef
10 files changed
+261
-81
No files matched your search
@@ -14,5 +14,4 @@ export type {
|
||||
ResumeState,
|
||||
VulnExploitPipelineResult,
|
||||
} from './shared.js';
|
||||
export { PipelineExecutionError } from './shared.js';
|
||||
export { pentestPipeline } from './workflows.js';
|
||||
@@ -60,21 +60,6 @@ export interface PipelineState {
|
||||
summary: PipelineSummary | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Thrown by pentestPipeline() when the run fails, carrying the fully-populated
|
||||
* PipelineState (real agentMetrics, completedAgents, summary) so a consumer can
|
||||
* report actual spend instead of synthesizing a zeroed failed state. `cause`
|
||||
* preserves the original error for classification and Temporal failure reporting.
|
||||
*/
|
||||
export class PipelineExecutionError extends Error {
|
||||
override name = 'PipelineExecutionError' as const;
|
||||
readonly state: PipelineState;
|
||||
constructor(message: string, state: PipelineState, options?: { cause?: unknown }) {
|
||||
super(message, options);
|
||||
this.state = state;
|
||||
}
|
||||
}
|
||||
|
||||
// Extended state returned by getProgress query (includes computed fields)
|
||||
export interface PipelineProgress extends PipelineState {
|
||||
workflowId: string;
|
||||
|
||||
@@ -41,7 +41,6 @@ import type { ActivityInput } from './activities.js';
|
||||
import {
|
||||
type AgentMetrics,
|
||||
getProgress,
|
||||
PipelineExecutionError,
|
||||
type PipelineInput,
|
||||
type PipelineProgress,
|
||||
type PipelineState,
|
||||
@@ -718,9 +717,10 @@ export async function pentestPipeline(input: PipelineInput): Promise<PipelineSta
|
||||
});
|
||||
}
|
||||
|
||||
// Carry the populated state so a consumer can report real spend instead of a zeroed
|
||||
// failed state. The original error rides as `cause` for classification/reporting.
|
||||
throw new PipelineExecutionError(state.error ?? 'Pipeline failed', state, { cause: error });
|
||||
// Terminate the workflow in Temporal's FAILED state. WARNING: this must be an
|
||||
// ApplicationFailure — any other thrown type becomes an unhandled workflow-task failure
|
||||
// that Temporal retries indefinitely, leaving the run stuck in RUNNING.
|
||||
throw ApplicationFailure.nonRetryable(state.error ?? 'Pipeline failed', 'PipelineExecutionError');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user