open-local-audit 0.66.0 → 0.67.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/CHANGELOG.md +9 -0
- package/README.md +34 -1
- package/dist/cli.js +22 -4
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/workflow-config.d.ts +1 -0
- package/dist/workflow-config.js +17 -0
- package/dist/workflow-config.js.map +1 -1
- package/dist/workflow-state.d.ts +35 -0
- package/dist/workflow-state.js +294 -0
- package/dist/workflow-state.js.map +1 -0
- package/dist/workflow-status.d.ts +26 -0
- package/dist/workflow-status.js +154 -0
- package/dist/workflow-status.js.map +1 -0
- package/dist/workflow.d.ts +16 -0
- package/dist/workflow.js +191 -112
- package/dist/workflow.js.map +1 -1
- package/docs/architecture/workflow-command.md +7 -2
- package/docs/architecture/workflow-status.md +137 -0
- package/package.json +3 -2
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { workflowConfigFingerprint } from "./workflow-config.js";
|
|
5
|
+
import { writeWorkflowOutputFile } from "./workflow-output.js";
|
|
6
|
+
const stateKeys = [
|
|
7
|
+
"version",
|
|
8
|
+
"configFingerprint",
|
|
9
|
+
"phase",
|
|
10
|
+
"currentStage",
|
|
11
|
+
"checkpointHash",
|
|
12
|
+
"startedAt",
|
|
13
|
+
"updatedAt",
|
|
14
|
+
"summary"
|
|
15
|
+
];
|
|
16
|
+
const workflowStageNames = ["discovery", "shortlist", "review", "packaging"];
|
|
17
|
+
const workflowStageStatuses = ["success", "failed", "skipped", "not-run"];
|
|
18
|
+
const workflowPackageStatuses = ["packaged", "skipped", "failed"];
|
|
19
|
+
const workflowManagedPathKeys = [
|
|
20
|
+
"leadsCsv",
|
|
21
|
+
"discoverySummaryJson",
|
|
22
|
+
"shortlistCsv",
|
|
23
|
+
"shortlistSummaryJson",
|
|
24
|
+
"reviewSummaryJson",
|
|
25
|
+
"workflowSummaryJson",
|
|
26
|
+
"reportsDir",
|
|
27
|
+
"packagesDir"
|
|
28
|
+
];
|
|
29
|
+
export function workflowStatePath(config) {
|
|
30
|
+
return join(config.outDir, "workflow-state.json");
|
|
31
|
+
}
|
|
32
|
+
export function createWorkflowState(config, summary, timestamp = new Date().toISOString()) {
|
|
33
|
+
return {
|
|
34
|
+
version: 1,
|
|
35
|
+
configFingerprint: workflowConfigFingerprint(config),
|
|
36
|
+
phase: "running",
|
|
37
|
+
currentStage: null,
|
|
38
|
+
checkpointHash: null,
|
|
39
|
+
startedAt: timestamp,
|
|
40
|
+
updatedAt: timestamp,
|
|
41
|
+
summary
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function transitionWorkflowState(state, transition, timestamp = new Date().toISOString()) {
|
|
45
|
+
return {
|
|
46
|
+
...state,
|
|
47
|
+
...transition,
|
|
48
|
+
updatedAt: timestamp
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function parseWorkflowState(value, config) {
|
|
52
|
+
if (!isWorkflowState(value, config)) {
|
|
53
|
+
return { kind: "invalid", message: "Workflow state is invalid" };
|
|
54
|
+
}
|
|
55
|
+
return { kind: "valid", state: value };
|
|
56
|
+
}
|
|
57
|
+
export async function readWorkflowState(config) {
|
|
58
|
+
const path = workflowStatePath(config);
|
|
59
|
+
let content;
|
|
60
|
+
try {
|
|
61
|
+
const info = await lstat(path);
|
|
62
|
+
if (!info.isFile() || info.isSymbolicLink()) {
|
|
63
|
+
return { kind: "invalid", message: "Workflow state is invalid" };
|
|
64
|
+
}
|
|
65
|
+
content = await readFile(path, "utf8");
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (isMissingPath(error)) {
|
|
69
|
+
return { kind: "missing" };
|
|
70
|
+
}
|
|
71
|
+
return { kind: "invalid", message: "Workflow state is invalid" };
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
return parseWorkflowState(JSON.parse(content), config);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return { kind: "invalid", message: "Workflow state is invalid" };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function writeWorkflowState(config, state) {
|
|
81
|
+
const parsed = parseWorkflowState(state, config);
|
|
82
|
+
if (parsed.kind !== "valid") {
|
|
83
|
+
throw new Error(parsed.kind === "invalid" ? parsed.message : "Workflow state is missing");
|
|
84
|
+
}
|
|
85
|
+
const path = workflowStatePath(config);
|
|
86
|
+
try {
|
|
87
|
+
const info = await lstat(path);
|
|
88
|
+
if (!info.isFile() || info.isSymbolicLink()) {
|
|
89
|
+
throw new Error("Workflow state must be a regular file");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (!isMissingPath(error)) {
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
await writeWorkflowOutputFile(path, `${JSON.stringify(parsed.state, null, 2)}\n`, {
|
|
98
|
+
managedOutputRoot: config.outDir
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export async function hashWorkflowCheckpoint(config) {
|
|
102
|
+
const checkpointPath = join(config.outDir, "workflow-checkpoint.json");
|
|
103
|
+
try {
|
|
104
|
+
const info = await lstat(checkpointPath);
|
|
105
|
+
if (!info.isFile() || info.isSymbolicLink()) {
|
|
106
|
+
throw new Error("Workflow checkpoint must be a regular file");
|
|
107
|
+
}
|
|
108
|
+
return createHash("sha256").update(await readFile(checkpointPath)).digest("hex");
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isMissingPath(error)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function isMissingPath(error) {
|
|
118
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
119
|
+
}
|
|
120
|
+
function isRecord(value) {
|
|
121
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
122
|
+
}
|
|
123
|
+
function hasExactKeys(value, keys) {
|
|
124
|
+
return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
|
|
125
|
+
}
|
|
126
|
+
function hasOnlyKeys(value, keys) {
|
|
127
|
+
return Object.keys(value).every((key) => keys.includes(key));
|
|
128
|
+
}
|
|
129
|
+
function isHash(value) {
|
|
130
|
+
return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
|
|
131
|
+
}
|
|
132
|
+
function isTimestamp(value) {
|
|
133
|
+
if (typeof value !== "string") {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const parsed = Date.parse(value);
|
|
137
|
+
return Number.isFinite(parsed) && new Date(parsed).toISOString() === value;
|
|
138
|
+
}
|
|
139
|
+
function isCount(value) {
|
|
140
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
141
|
+
}
|
|
142
|
+
function isStageName(value) {
|
|
143
|
+
return typeof value === "string" && workflowStageNames.includes(value);
|
|
144
|
+
}
|
|
145
|
+
function isStageSummary(value, countKeys) {
|
|
146
|
+
return (isRecord(value) &&
|
|
147
|
+
hasOnlyKeys(value, ["status", ...countKeys]) &&
|
|
148
|
+
typeof value.status === "string" &&
|
|
149
|
+
workflowStageStatuses.includes(value.status) &&
|
|
150
|
+
countKeys.every((key) => value[key] === undefined || isCount(value[key])));
|
|
151
|
+
}
|
|
152
|
+
function isPackageEntry(value) {
|
|
153
|
+
if (!isRecord(value) || typeof value.leadKey !== "string" || typeof value.companyName !== "string") {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (value.status === "packaged") {
|
|
157
|
+
return hasExactKeys(value, ["leadKey", "companyName", "status", "outDir"]) && typeof value.outDir === "string";
|
|
158
|
+
}
|
|
159
|
+
if (value.status === "skipped") {
|
|
160
|
+
return hasExactKeys(value, ["leadKey", "companyName", "status"]);
|
|
161
|
+
}
|
|
162
|
+
return (value.status === "failed" &&
|
|
163
|
+
hasExactKeys(value, ["leadKey", "companyName", "status", "error"]) &&
|
|
164
|
+
typeof value.error === "string");
|
|
165
|
+
}
|
|
166
|
+
function isWorkflowSummary(value) {
|
|
167
|
+
if (!isRecord(value) ||
|
|
168
|
+
!hasOnlyKeys(value, ["version", "status", "stages", "outputs", "discoveredLeads", "selectedLeads", "packages", "error"]) ||
|
|
169
|
+
value.version !== 1 ||
|
|
170
|
+
(value.status !== "success" && value.status !== "failed") ||
|
|
171
|
+
!isRecord(value.stages) ||
|
|
172
|
+
!hasExactKeys(value.stages, workflowStageNames) ||
|
|
173
|
+
!isRecord(value.outputs) ||
|
|
174
|
+
!hasExactKeys(value.outputs, workflowManagedPathKeys) ||
|
|
175
|
+
!isCount(value.discoveredLeads) ||
|
|
176
|
+
!isCount(value.selectedLeads) ||
|
|
177
|
+
!isRecord(value.packages) ||
|
|
178
|
+
!hasExactKeys(value.packages, ["packaged", "skipped", "failed", "entries"])) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const stages = value.stages;
|
|
182
|
+
const outputs = value.outputs;
|
|
183
|
+
const packages = value.packages;
|
|
184
|
+
const error = value.error;
|
|
185
|
+
return (isStageSummary(stages.discovery, ["totalCandidates", "suppressedCandidates", "audited"]) &&
|
|
186
|
+
isStageSummary(stages.shortlist, ["totalRows", "suppressedRows", "filteredRows", "selected"]) &&
|
|
187
|
+
isStageSummary(stages.review, ["totalRows", "reviewedRows", "actionableLeads", "staleRows", "invalidReviewedAtRows", "unreviewedRows"]) &&
|
|
188
|
+
isStageSummary(stages.packaging, ["packaged", "skipped", "failed"]) &&
|
|
189
|
+
workflowManagedPathKeys.every((key) => typeof outputs[key] === "string") &&
|
|
190
|
+
isCount(packages.packaged) &&
|
|
191
|
+
isCount(packages.skipped) &&
|
|
192
|
+
isCount(packages.failed) &&
|
|
193
|
+
Array.isArray(packages.entries) &&
|
|
194
|
+
packages.entries.every(isPackageEntry) &&
|
|
195
|
+
(error === undefined || (isRecord(error) && hasExactKeys(error, ["stage", "message"]) && isStageName(error.stage) && typeof error.message === "string")));
|
|
196
|
+
}
|
|
197
|
+
function isWorkflowState(value, config) {
|
|
198
|
+
if (!isRecord(value) || !hasExactKeys(value, stateKeys)) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const structuralValidity = value.version === 1 &&
|
|
202
|
+
isHash(value.configFingerprint) &&
|
|
203
|
+
(value.phase === "running" || value.phase === "failed" || value.phase === "completed") &&
|
|
204
|
+
(value.currentStage === null || isStageName(value.currentStage)) &&
|
|
205
|
+
(value.checkpointHash === null || isHash(value.checkpointHash)) &&
|
|
206
|
+
isTimestamp(value.startedAt) &&
|
|
207
|
+
isTimestamp(value.updatedAt);
|
|
208
|
+
if (!structuralValidity || !isWorkflowSummary(value.summary)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
const summary = value.summary;
|
|
212
|
+
const phase = value.phase;
|
|
213
|
+
const currentStage = value.currentStage;
|
|
214
|
+
if (config &&
|
|
215
|
+
(value.configFingerprint !== workflowConfigFingerprint(config) ||
|
|
216
|
+
!workflowManagedPathKeys.every((key) => summary.outputs[key] === config.paths[key]))) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (phase === "completed") {
|
|
220
|
+
return (summary.status === "success" &&
|
|
221
|
+
summary.error === undefined &&
|
|
222
|
+
currentStage === null &&
|
|
223
|
+
hasValidStageProgress(summary, phase, currentStage, config));
|
|
224
|
+
}
|
|
225
|
+
if (phase === "failed") {
|
|
226
|
+
return (summary.status === "failed" &&
|
|
227
|
+
summary.error !== undefined &&
|
|
228
|
+
currentStage === summary.error.stage &&
|
|
229
|
+
hasValidStageProgress(summary, phase, currentStage, config));
|
|
230
|
+
}
|
|
231
|
+
return (summary.status === "success" &&
|
|
232
|
+
summary.error === undefined &&
|
|
233
|
+
hasValidStageProgress(summary, phase, currentStage, config));
|
|
234
|
+
}
|
|
235
|
+
function hasValidStageProgress(summary, phase, currentStage, config) {
|
|
236
|
+
const stageStatuses = workflowStageNames.map((name) => [name, summary.stages[name].status]);
|
|
237
|
+
const enabled = (stage) => stage === "discovery" ||
|
|
238
|
+
stage === "shortlist" ||
|
|
239
|
+
(stage === "review"
|
|
240
|
+
? config === undefined || config.review !== undefined
|
|
241
|
+
: config === undefined || config.packageReports);
|
|
242
|
+
const isOptional = (stage) => stage === "review" || stage === "packaging";
|
|
243
|
+
if (stageStatuses.some(([stage, status]) => {
|
|
244
|
+
if (!isOptional(stage)) {
|
|
245
|
+
return status === "skipped";
|
|
246
|
+
}
|
|
247
|
+
if (config) {
|
|
248
|
+
return enabled(stage) ? status === "skipped" : status !== "skipped";
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
})) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const activeStages = stageStatuses.filter(([stage, status]) => !(isOptional(stage) && status === "skipped"));
|
|
255
|
+
if (phase === "completed") {
|
|
256
|
+
return activeStages.every(([, status]) => status === "success");
|
|
257
|
+
}
|
|
258
|
+
if (phase === "running") {
|
|
259
|
+
if (activeStages.some(([, status]) => status !== "success" && status !== "not-run")) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
let foundNotRun = false;
|
|
263
|
+
for (const [stage, status] of activeStages) {
|
|
264
|
+
if (status === "not-run") {
|
|
265
|
+
foundNotRun = true;
|
|
266
|
+
}
|
|
267
|
+
else if (foundNotRun || status !== "success") {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
if (currentStage === stage && status !== "not-run") {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return currentStage === null || (enabled(currentStage) && summary.stages[currentStage].status === "not-run");
|
|
275
|
+
}
|
|
276
|
+
if (!currentStage || summary.stages[currentStage].status !== "failed" || !enabled(currentStage)) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
let foundFailedStage = false;
|
|
280
|
+
for (const [stage, status] of activeStages) {
|
|
281
|
+
if (stage === currentStage) {
|
|
282
|
+
foundFailedStage = true;
|
|
283
|
+
if (status !== "failed") {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
if (!foundFailedStage ? status !== "success" : status !== "not-run") {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return foundFailedStage;
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=workflow-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type WorkflowStageName, type WorkflowSummary } from "./workflow.js";
|
|
2
|
+
export type WorkflowStatusReportStatus = "not-started" | "running-or-interrupted" | "failed" | "completed" | "invalid";
|
|
3
|
+
export type WorkflowArtifactValidation = "valid" | "invalid" | "not-applicable";
|
|
4
|
+
export type WorkflowStatusNextActionKind = "run" | "resume" | "confirm-active-process" | "none" | "inspect";
|
|
5
|
+
export interface WorkflowStatusNextAction {
|
|
6
|
+
kind: WorkflowStatusNextActionKind;
|
|
7
|
+
argv: string[] | null;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkflowStatusReport {
|
|
11
|
+
version: 1;
|
|
12
|
+
status: WorkflowStatusReportStatus;
|
|
13
|
+
currentStage: WorkflowStageName | null;
|
|
14
|
+
lastSuccessfulStage: WorkflowStageName | null;
|
|
15
|
+
resumeAvailable: boolean;
|
|
16
|
+
updatedAt: string | null;
|
|
17
|
+
stages: WorkflowSummary["stages"];
|
|
18
|
+
artifactValidation: WorkflowArtifactValidation;
|
|
19
|
+
nextAction: WorkflowStatusNextAction;
|
|
20
|
+
error: {
|
|
21
|
+
message: string;
|
|
22
|
+
} | null;
|
|
23
|
+
}
|
|
24
|
+
export declare function runWorkflowStatus(configPath: string): Promise<WorkflowStatusReport>;
|
|
25
|
+
export declare function renderWorkflowStatusTerminal(report: WorkflowStatusReport, configPath: string): string;
|
|
26
|
+
export declare function renderWorkflowStatusJson(report: WorkflowStatusReport): string;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readWorkflowConfig } from "./workflow-config.js";
|
|
2
|
+
import { readWorkflowState } from "./workflow-state.js";
|
|
3
|
+
import { inspectWorkflowCheckpoint } from "./workflow.js";
|
|
4
|
+
const stageNames = ["discovery", "shortlist", "review", "packaging"];
|
|
5
|
+
function initialStages(config) {
|
|
6
|
+
return {
|
|
7
|
+
discovery: { status: "not-run" },
|
|
8
|
+
shortlist: { status: "not-run" },
|
|
9
|
+
review: { status: config.review ? "not-run" : "skipped" },
|
|
10
|
+
packaging: { status: config.packageReports ? "not-run" : "skipped" }
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function lastSuccessfulStage(stages) {
|
|
14
|
+
let last = null;
|
|
15
|
+
for (const stage of stageNames) {
|
|
16
|
+
if (stages[stage].status === "success") {
|
|
17
|
+
last = stage;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return last;
|
|
21
|
+
}
|
|
22
|
+
function nextIncompleteStage(stages) {
|
|
23
|
+
return stageNames.find((stage) => stages[stage].status !== "success" && stages[stage].status !== "skipped") ?? null;
|
|
24
|
+
}
|
|
25
|
+
function runAction(configPath) {
|
|
26
|
+
return {
|
|
27
|
+
kind: "run",
|
|
28
|
+
argv: ["workflow", "--config", configPath],
|
|
29
|
+
message: "Run the workflow from the beginning."
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function resumeAction(configPath) {
|
|
33
|
+
return {
|
|
34
|
+
kind: "resume",
|
|
35
|
+
argv: ["workflow", "--config", configPath, "--resume"],
|
|
36
|
+
message: "Resume from the latest validated checkpoint."
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function runningAction(configPath, resumeAvailable) {
|
|
40
|
+
return {
|
|
41
|
+
kind: "confirm-active-process",
|
|
42
|
+
argv: resumeAvailable ? ["workflow", "--config", configPath, "--resume"] : ["workflow", "--config", configPath],
|
|
43
|
+
message: "Confirm that no workflow process is active before running this command."
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function invalidReport(stages, artifactValidation, message) {
|
|
47
|
+
return {
|
|
48
|
+
version: 1,
|
|
49
|
+
status: "invalid",
|
|
50
|
+
currentStage: null,
|
|
51
|
+
lastSuccessfulStage: lastSuccessfulStage(stages),
|
|
52
|
+
resumeAvailable: false,
|
|
53
|
+
updatedAt: null,
|
|
54
|
+
stages,
|
|
55
|
+
artifactValidation,
|
|
56
|
+
nextAction: { kind: "inspect", argv: null, message: "Inspect workflow state and checkpoint files before running." },
|
|
57
|
+
error: { message }
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function hasCompletedStages(stages) {
|
|
61
|
+
return stageNames.every((stage) => stages[stage].status === "success" || stages[stage].status === "skipped");
|
|
62
|
+
}
|
|
63
|
+
function checkpointIsUsable(inspection, hash) {
|
|
64
|
+
return inspection.kind === "valid" && hash !== null && inspection.checkpointHash === hash;
|
|
65
|
+
}
|
|
66
|
+
export async function runWorkflowStatus(configPath) {
|
|
67
|
+
const config = await readWorkflowConfig(configPath);
|
|
68
|
+
const [stateResult, checkpoint] = await Promise.all([readWorkflowState(config), inspectWorkflowCheckpoint(config)]);
|
|
69
|
+
if (stateResult.kind === "invalid") {
|
|
70
|
+
return invalidReport(initialStages(config), "invalid", "Workflow state is invalid.");
|
|
71
|
+
}
|
|
72
|
+
if (stateResult.kind === "missing") {
|
|
73
|
+
if (checkpoint.kind === "missing") {
|
|
74
|
+
const stages = initialStages(config);
|
|
75
|
+
return {
|
|
76
|
+
version: 1,
|
|
77
|
+
status: "not-started",
|
|
78
|
+
currentStage: null,
|
|
79
|
+
lastSuccessfulStage: null,
|
|
80
|
+
resumeAvailable: false,
|
|
81
|
+
updatedAt: null,
|
|
82
|
+
stages,
|
|
83
|
+
artifactValidation: "not-applicable",
|
|
84
|
+
nextAction: runAction(configPath),
|
|
85
|
+
error: null
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (checkpoint.kind === "invalid") {
|
|
89
|
+
return invalidReport(initialStages(config), "invalid", "Workflow checkpoint is invalid.");
|
|
90
|
+
}
|
|
91
|
+
const completed = hasCompletedStages(checkpoint.summary.stages);
|
|
92
|
+
return {
|
|
93
|
+
version: 1,
|
|
94
|
+
status: completed ? "completed" : "running-or-interrupted",
|
|
95
|
+
currentStage: completed ? null : nextIncompleteStage(checkpoint.summary.stages),
|
|
96
|
+
lastSuccessfulStage: lastSuccessfulStage(checkpoint.summary.stages),
|
|
97
|
+
resumeAvailable: !completed,
|
|
98
|
+
updatedAt: null,
|
|
99
|
+
stages: checkpoint.summary.stages,
|
|
100
|
+
artifactValidation: "valid",
|
|
101
|
+
nextAction: completed
|
|
102
|
+
? { kind: "none", argv: null, message: "Workflow completion is recorded." }
|
|
103
|
+
: runningAction(configPath, true),
|
|
104
|
+
error: null
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const state = stateResult.state;
|
|
108
|
+
const stages = state.summary.stages;
|
|
109
|
+
if (state.checkpointHash !== null && !checkpointIsUsable(checkpoint, state.checkpointHash)) {
|
|
110
|
+
return invalidReport(stages, "invalid", "Workflow checkpoint is missing, invalid, or does not match the state.");
|
|
111
|
+
}
|
|
112
|
+
if (state.phase === "completed" && !checkpointIsUsable(checkpoint, state.checkpointHash)) {
|
|
113
|
+
return invalidReport(stages, "invalid", "Completed workflow state requires a matching checkpoint.");
|
|
114
|
+
}
|
|
115
|
+
const resumeAvailable = checkpointIsUsable(checkpoint, state.checkpointHash);
|
|
116
|
+
const status = state.phase === "running" ? "running-or-interrupted" : state.phase === "failed" ? "failed" : "completed";
|
|
117
|
+
const nextAction = state.phase === "running"
|
|
118
|
+
? runningAction(configPath, resumeAvailable)
|
|
119
|
+
: state.phase === "failed"
|
|
120
|
+
? resumeAvailable
|
|
121
|
+
? resumeAction(configPath)
|
|
122
|
+
: runAction(configPath)
|
|
123
|
+
: { kind: "none", argv: null, message: "Workflow completion is recorded." };
|
|
124
|
+
return {
|
|
125
|
+
version: 1,
|
|
126
|
+
status,
|
|
127
|
+
currentStage: state.currentStage,
|
|
128
|
+
lastSuccessfulStage: lastSuccessfulStage(stages),
|
|
129
|
+
resumeAvailable,
|
|
130
|
+
updatedAt: state.updatedAt,
|
|
131
|
+
stages,
|
|
132
|
+
artifactValidation: resumeAvailable ? "valid" : "not-applicable",
|
|
133
|
+
nextAction,
|
|
134
|
+
error: state.phase === "failed" && state.currentStage ? { message: `Workflow failed during ${state.currentStage}` } : null
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export function renderWorkflowStatusTerminal(report, configPath) {
|
|
138
|
+
const command = report.nextAction.argv === null ? [] : [`Command: ${report.nextAction.argv.join(" ")}`];
|
|
139
|
+
const error = report.error === null ? [] : [`Error: ${report.error.message}`];
|
|
140
|
+
return `${[
|
|
141
|
+
`Workflow status: ${report.status.toUpperCase().replaceAll("-", " ")}`,
|
|
142
|
+
`Config: ${configPath}`,
|
|
143
|
+
`Current stage: ${report.currentStage ?? "none"}`,
|
|
144
|
+
`Last successful stage: ${report.lastSuccessfulStage ?? "none"}`,
|
|
145
|
+
`Artifact validation: ${report.artifactValidation.toUpperCase().replaceAll("-", " ")}`,
|
|
146
|
+
`Next action: ${report.nextAction.kind.toUpperCase().replaceAll("-", " ")}`,
|
|
147
|
+
...command,
|
|
148
|
+
...error
|
|
149
|
+
].join("\n")}\n`;
|
|
150
|
+
}
|
|
151
|
+
export function renderWorkflowStatusJson(report) {
|
|
152
|
+
return `${JSON.stringify(report, null, 2)}\n`;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=workflow-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-status.js","sourceRoot":"","sources":["../src/workflow-status.ts"],"names":[],"mappings":"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"}
|
package/dist/workflow.d.ts
CHANGED
|
@@ -5,10 +5,12 @@ import { type ShortlistRunOptions } from "./shortlist-runner.js";
|
|
|
5
5
|
import type { ShortlistResult } from "./shortlist.js";
|
|
6
6
|
import { resolveGoogleMapsApiKey } from "./secrets.js";
|
|
7
7
|
import { readWorkflowConfig, type ResolvedWorkflowConfig, type WorkflowManagedPaths } from "./workflow-config.js";
|
|
8
|
+
import { writeWorkflowState } from "./workflow-state.js";
|
|
8
9
|
export type WorkflowStatus = "success" | "failed";
|
|
9
10
|
export type WorkflowStageStatus = "success" | "failed" | "skipped" | "not-run";
|
|
10
11
|
export type WorkflowStageName = "discovery" | "shortlist" | "review" | "packaging";
|
|
11
12
|
export type WorkflowPackageStatus = "packaged" | "skipped" | "failed";
|
|
13
|
+
export { workflowConfigFingerprint } from "./workflow-config.js";
|
|
12
14
|
export interface WorkflowDiscoveryStageSummary {
|
|
13
15
|
status: WorkflowStageStatus;
|
|
14
16
|
totalCandidates?: number;
|
|
@@ -75,14 +77,28 @@ export interface WorkflowDependencies {
|
|
|
75
77
|
summarizeReviewCsvFile: typeof summarizeReviewCsvFile;
|
|
76
78
|
packageReport: (options: Parameters<typeof packageReport>[0]) => Promise<ReportPackResult>;
|
|
77
79
|
resolveGoogleMapsApiKey: typeof resolveGoogleMapsApiKey;
|
|
80
|
+
now: () => Date;
|
|
81
|
+
writeWorkflowState: typeof writeWorkflowState;
|
|
78
82
|
}
|
|
79
83
|
export interface WorkflowRunOptions {
|
|
80
84
|
resume?: boolean;
|
|
81
85
|
}
|
|
86
|
+
export type WorkflowCheckpointInspection = {
|
|
87
|
+
kind: "missing";
|
|
88
|
+
} | {
|
|
89
|
+
kind: "invalid";
|
|
90
|
+
message: string;
|
|
91
|
+
} | {
|
|
92
|
+
kind: "valid";
|
|
93
|
+
summary: WorkflowSummary;
|
|
94
|
+
checkpointPath: string;
|
|
95
|
+
checkpointHash: string;
|
|
96
|
+
};
|
|
82
97
|
export declare class WorkflowRunError extends Error {
|
|
83
98
|
readonly summary: WorkflowSummary;
|
|
84
99
|
constructor(summary: WorkflowSummary);
|
|
85
100
|
}
|
|
86
101
|
export declare function safeLeadSlug(leadKey: string, companyName: string): string;
|
|
102
|
+
export declare function inspectWorkflowCheckpoint(config: ResolvedWorkflowConfig): Promise<WorkflowCheckpointInspection>;
|
|
87
103
|
export declare function runWorkflow(configPath: string, dependencies?: Partial<WorkflowDependencies>, options?: WorkflowRunOptions): Promise<WorkflowSummary>;
|
|
88
104
|
export declare function runResolvedWorkflow(config: ResolvedWorkflowConfig, dependencies?: Partial<WorkflowDependencies>, options?: WorkflowRunOptions): Promise<WorkflowSummary>;
|