PR C: wire real NotaryRegistry on Chain 138 (arch step 4) (#7)
Some checks failed
CI / Frontend Lint (push) Failing after 6s
CI / Frontend Type Check (push) Failing after 6s
CI / Frontend Build (push) Failing after 6s
CI / Frontend E2E Tests (push) Failing after 8s
CI / Contracts Compile (push) Has been cancelled
CI / Contracts Test (push) Has been cancelled
CI / Orchestrator Build (push) Has been cancelled
Security Scan / OWASP ZAP Scan (push) Has been cancelled
Security Scan / Dependency Vulnerability Scan (push) Has been cancelled

This commit was merged in pull request #7.
This commit is contained in:
2026-04-22 17:11:50 +00:00
parent e4b0be8a63
commit 3e1fb9ef7e
19 changed files with 1585 additions and 177 deletions

View File

@@ -4,6 +4,7 @@ import { createHash } from "crypto";
import { validatePlan, checkStepDependencies } from "../services/planValidation";
import { storePlan, getPlanById, updatePlanSignature, listPlans } from "../db/plans";
import { asyncHandler, AppError, ErrorType } from "../services/errorHandler";
import { getTransactionState, getTransitionHistory } from "../services/stateMachine";
import type { Plan, PlanStep } from "../types/plan";
/**
@@ -194,3 +195,28 @@ export const validatePlanEndpoint = asyncHandler(async (req: Request, res: Respo
});
});
/**
* GET /api/plans/:planId/state
* Return the current workflow state + full state-transition history.
* Arch note §8 + §14 (audit chain).
*/
export const getPlanState = asyncHandler(async (req: Request, res: Response) => {
const { planId } = req.params;
const plan = await getPlanById(planId);
if (!plan) {
throw new AppError(ErrorType.NOT_FOUND_ERROR, 404, "Plan not found");
}
const [state, history] = await Promise.all([
getTransactionState(planId),
getTransitionHistory(planId),
]);
res.json({
plan_id: planId,
transaction_state: state,
legacy_status: plan.status,
transitions: history,
});
});