From 32d0755ee6aa86665a9e34236d7b32b7005b5777 Mon Sep 17 00:00:00 2001 From: Umberto Sgueglia Date: Wed, 17 Jun 2026 13:12:53 +0200 Subject: [PATCH 1/5] fix: translate keys Signed-off-by: Umberto Sgueglia --- .../data-access-layer/src/osspckgs/stewardships.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/services/libs/data-access-layer/src/osspckgs/stewardships.ts b/services/libs/data-access-layer/src/osspckgs/stewardships.ts index 8583d73b67..291fa2e035 100644 --- a/services/libs/data-access-layer/src/osspckgs/stewardships.ts +++ b/services/libs/data-access-layer/src/osspckgs/stewardships.ts @@ -441,6 +441,15 @@ export const ESCALATION_RESOLUTION_PATHS = [ export type EscalationResolutionPath = (typeof ESCALATION_RESOLUTION_PATHS)[number] +export const ESCALATION_RESOLUTION_PATH_LABELS: Record = { + right_of_first_refusal: 'Right of First Refusal', + replace_the_dependency: 'Replace the Dependency', + find_vendor_for_lts: 'Find Vendor for LTS', + consortium_adopts_maintainership: 'Consortium Adopts Maintainership', + compensating_controls_monitor: 'Compensating Controls / Monitor', + namespace_takeover: 'Namespace Takeover', +} + /** * Escalates a stewardship. Updates status to 'escalated' and logs the * chosen resolution path in stewardship_activity metadata. @@ -478,7 +487,7 @@ export async function escalateStewardship( resolutionPath: data.resolutionPath, statusNote: data.notes ?? null, actorUserId: data.actorUserId, - content: `Escalated with resolution path: ${data.resolutionPath}`, + content: `Escalated with resolution path: ${ESCALATION_RESOLUTION_PATH_LABELS[data.resolutionPath]}`, metadata: JSON.stringify({ resolutionPath: data.resolutionPath, ...(data.notes ? { notes: data.notes } : {}), From caa9df52ae7097346583663b758a7dae996e6201 Mon Sep 17 00:00:00 2001 From: Umberto Sgueglia Date: Wed, 17 Jun 2026 15:11:13 +0200 Subject: [PATCH 2/5] fix: translate keys for frontend Signed-off-by: Umberto Sgueglia --- .../data-access-layer/src/osspckgs/stewardships.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/libs/data-access-layer/src/osspckgs/stewardships.ts b/services/libs/data-access-layer/src/osspckgs/stewardships.ts index 291fa2e035..40acf4f5e1 100644 --- a/services/libs/data-access-layer/src/osspckgs/stewardships.ts +++ b/services/libs/data-access-layer/src/osspckgs/stewardships.ts @@ -383,7 +383,7 @@ export async function listStewardshipActivity( actorUserId: row.actorUserId, actorType: row.actorType, activityType: row.activityType, - content: row.content, + content: translateActivityContent(row.content), metadata: row.metadata as Record | null, stewardshipStatus: row.stewardshipStatus, createdAt: toIso(row.createdAt), @@ -424,7 +424,7 @@ export async function listPackageHistory( actorUserId: r.actorUserId ? String(r.actorUserId) : null, actorType: String(r.actorType), activityType: String(r.activityType), - content: r.content ? String(r.content) : null, + content: translateActivityContent(r.content ? String(r.content) : null), metadata: r.metadata as Record | null, createdAt: toIso(r.createdAt), })) @@ -450,6 +450,14 @@ export const ESCALATION_RESOLUTION_PATH_LABELS: Record { + const label = ESCALATION_RESOLUTION_PATH_LABELS[key as EscalationResolutionPath] + return label ? `${prefix}${label}` : content + }) +} + /** * Escalates a stewardship. Updates status to 'escalated' and logs the * chosen resolution path in stewardship_activity metadata. @@ -487,7 +495,7 @@ export async function escalateStewardship( resolutionPath: data.resolutionPath, statusNote: data.notes ?? null, actorUserId: data.actorUserId, - content: `Escalated with resolution path: ${ESCALATION_RESOLUTION_PATH_LABELS[data.resolutionPath]}`, + content: `Escalated with resolution path: ${data.resolutionPath}`, metadata: JSON.stringify({ resolutionPath: data.resolutionPath, ...(data.notes ? { notes: data.notes } : {}), From efaaa0c42513897c0aa88ed505e8818e130130af Mon Sep 17 00:00:00 2001 From: Umberto Sgueglia Date: Wed, 17 Jun 2026 15:21:14 +0200 Subject: [PATCH 3/5] fix: translate keys for frontend Signed-off-by: Umberto Sgueglia --- backend/src/api/public/v1/ossprey/packageList.ts | 3 ++- .../libs/data-access-layer/src/osspckgs/api.ts | 5 +++-- .../data-access-layer/src/osspckgs/stewardships.ts | 14 +++++++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/backend/src/api/public/v1/ossprey/packageList.ts b/backend/src/api/public/v1/ossprey/packageList.ts index 6247a758d1..0aad235e50 100644 --- a/backend/src/api/public/v1/ossprey/packageList.ts +++ b/backend/src/api/public/v1/ossprey/packageList.ts @@ -5,6 +5,7 @@ import { computeHealthBand, getPackageStatusCounts, listPackagesForApi, + translateActivityContent, } from '@crowd/data-access-layer' import { getPackagesQx } from '@/db/packagesDb' @@ -79,7 +80,7 @@ export async function packageListHandler(req: Request, res: Response): Promise | null lastActivityAt?: Date | null stewards?: StewardEntry[] total: string @@ -470,7 +471,7 @@ export async function listPackagesForApi( opts.includeLastActivity === true ? ` LEFT JOIN LATERAL ( - SELECT sa.activity_type, sa.content, sa.created_at + SELECT sa.activity_type, sa.content, sa.metadata, sa.created_at FROM stewardship_activity sa WHERE sa.stewardship_id = s.id ORDER BY sa.created_at DESC @@ -502,7 +503,7 @@ export async function listPackagesForApi( pm_counts.cnt AS "maintainerCount", r_sc.scorecard_score AS "scorecardScore", p.latest_release_at AS "latestReleaseAt", - ${opts.includeLastActivity === true ? `last_act.activity_type AS "lastActivityType", last_act.content AS "lastActivityContent", last_act.created_at AS "lastActivityAt",` : ''} + ${opts.includeLastActivity === true ? `last_act.activity_type AS "lastActivityType", last_act.content AS "lastActivityContent", last_act.metadata AS "lastActivityMetadata", last_act.created_at AS "lastActivityAt",` : ''} ${opts.includeStewards === true ? "COALESCE(ss_agg.stewards, '[]'::json) AS stewards," : ''} COUNT(*) OVER() AS total FROM packages p diff --git a/services/libs/data-access-layer/src/osspckgs/stewardships.ts b/services/libs/data-access-layer/src/osspckgs/stewardships.ts index 40acf4f5e1..c84d0eb8b9 100644 --- a/services/libs/data-access-layer/src/osspckgs/stewardships.ts +++ b/services/libs/data-access-layer/src/osspckgs/stewardships.ts @@ -383,7 +383,7 @@ export async function listStewardshipActivity( actorUserId: row.actorUserId, actorType: row.actorType, activityType: row.activityType, - content: translateActivityContent(row.content), + content: translateActivityContent(row.content, row.activityType, row.metadata as Record | null), metadata: row.metadata as Record | null, stewardshipStatus: row.stewardshipStatus, createdAt: toIso(row.createdAt), @@ -424,7 +424,7 @@ export async function listPackageHistory( actorUserId: r.actorUserId ? String(r.actorUserId) : null, actorType: String(r.actorType), activityType: String(r.activityType), - content: translateActivityContent(r.content ? String(r.content) : null), + content: translateActivityContent(r.content ? String(r.content) : null, String(r.activityType), r.metadata as Record | null), metadata: r.metadata as Record | null, createdAt: toIso(r.createdAt), })) @@ -450,8 +450,16 @@ export const ESCALATION_RESOLUTION_PATH_LABELS: Record | null, +): string | null { if (!content) return content + if (activityType === 'escalation' && metadata?.resolutionPath) { + const label = ESCALATION_RESOLUTION_PATH_LABELS[metadata.resolutionPath as EscalationResolutionPath] + if (label) return `Escalated with resolution path: ${label}` + } return content.replace(/^(Escalated with resolution path: )(\S+)$/, (_, prefix, key) => { const label = ESCALATION_RESOLUTION_PATH_LABELS[key as EscalationResolutionPath] return label ? `${prefix}${label}` : content From 779fd4e7086407a442079a7267794406a8511e4f Mon Sep 17 00:00:00 2001 From: Umberto Sgueglia Date: Wed, 17 Jun 2026 15:24:29 +0200 Subject: [PATCH 4/5] fix: lint Signed-off-by: Umberto Sgueglia --- backend/src/api/public/v1/ossprey/packageList.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/api/public/v1/ossprey/packageList.ts b/backend/src/api/public/v1/ossprey/packageList.ts index 0aad235e50..02e3228cfe 100644 --- a/backend/src/api/public/v1/ossprey/packageList.ts +++ b/backend/src/api/public/v1/ossprey/packageList.ts @@ -80,7 +80,11 @@ export async function packageListHandler(req: Request, res: Response): Promise Date: Wed, 17 Jun 2026 15:27:03 +0200 Subject: [PATCH 5/5] fix: lint Signed-off-by: Umberto Sgueglia --- .../src/osspckgs/stewardships.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/services/libs/data-access-layer/src/osspckgs/stewardships.ts b/services/libs/data-access-layer/src/osspckgs/stewardships.ts index c84d0eb8b9..6577435474 100644 --- a/services/libs/data-access-layer/src/osspckgs/stewardships.ts +++ b/services/libs/data-access-layer/src/osspckgs/stewardships.ts @@ -383,7 +383,11 @@ export async function listStewardshipActivity( actorUserId: row.actorUserId, actorType: row.actorType, activityType: row.activityType, - content: translateActivityContent(row.content, row.activityType, row.metadata as Record | null), + content: translateActivityContent( + row.content, + row.activityType, + row.metadata as Record | null, + ), metadata: row.metadata as Record | null, stewardshipStatus: row.stewardshipStatus, createdAt: toIso(row.createdAt), @@ -424,7 +428,11 @@ export async function listPackageHistory( actorUserId: r.actorUserId ? String(r.actorUserId) : null, actorType: String(r.actorType), activityType: String(r.activityType), - content: translateActivityContent(r.content ? String(r.content) : null, String(r.activityType), r.metadata as Record | null), + content: translateActivityContent( + r.content ? String(r.content) : null, + String(r.activityType), + r.metadata as Record | null, + ), metadata: r.metadata as Record | null, createdAt: toIso(r.createdAt), })) @@ -457,7 +465,8 @@ export function translateActivityContent( ): string | null { if (!content) return content if (activityType === 'escalation' && metadata?.resolutionPath) { - const label = ESCALATION_RESOLUTION_PATH_LABELS[metadata.resolutionPath as EscalationResolutionPath] + const label = + ESCALATION_RESOLUTION_PATH_LABELS[metadata.resolutionPath as EscalationResolutionPath] if (label) return `Escalated with resolution path: ${label}` } return content.replace(/^(Escalated with resolution path: )(\S+)$/, (_, prefix, key) => {