From cbf2d364bed547b27914771776702f7060d2cebe Mon Sep 17 00:00:00 2001 From: 777genius Date: Thu, 7 May 2026 01:38:28 +0300 Subject: [PATCH] fix(team): restore task automation ci --- src/main/services/team/TeamDataService.ts | 11 +++++++++++ .../bridge/OpenCodeBridgeCommandContract.ts | 1 + .../OpenCodeRuntimeDeliveryDiagnostics.ts | 16 +++++++++++----- src/shared/utils/teamTaskState.ts | 15 +-------------- test/main/services/team/TeamDataService.test.ts | 5 ++++- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/services/team/TeamDataService.ts b/src/main/services/team/TeamDataService.ts index b27ba729..2d1be942 100644 --- a/src/main/services/team/TeamDataService.ts +++ b/src/main/services/team/TeamDataService.ts @@ -596,6 +596,17 @@ export class TeamDataService { kanbanTaskState?: KanbanState['tasks'][string] ): 'none' | 'review' | 'needsFix' | 'approved' { const kanbanColumn = kanbanTaskState?.column; + const kanbanWorkflowColumn = kanbanColumn + ? getTeamTaskWorkflowColumn({ + status: task.status, + reviewState: 'none', + kanbanColumn, + }) + : undefined; + if (kanbanWorkflowColumn) { + return kanbanWorkflowColumn; + } + const reviewState = getReviewStateFromTask({ historyEvents: task.historyEvents, reviewState: task.reviewState, diff --git a/src/main/services/team/opencode/bridge/OpenCodeBridgeCommandContract.ts b/src/main/services/team/opencode/bridge/OpenCodeBridgeCommandContract.ts index c8d2090f..788c8b9a 100644 --- a/src/main/services/team/opencode/bridge/OpenCodeBridgeCommandContract.ts +++ b/src/main/services/team/opencode/bridge/OpenCodeBridgeCommandContract.ts @@ -176,6 +176,7 @@ export interface OpenCodeSendMessageCommandBody { | 'slash_command' | 'slash_command_result' | 'task_comment_notification' + | 'task_stall_remediation' | 'member_work_sync_nudge' | 'agent_error'; taskRefs?: { taskId: string; displayId: string; teamName: string }[]; diff --git a/src/main/services/team/opencode/delivery/OpenCodeRuntimeDeliveryDiagnostics.ts b/src/main/services/team/opencode/delivery/OpenCodeRuntimeDeliveryDiagnostics.ts index 648ec547..8fc937bc 100644 --- a/src/main/services/team/opencode/delivery/OpenCodeRuntimeDeliveryDiagnostics.ts +++ b/src/main/services/team/opencode/delivery/OpenCodeRuntimeDeliveryDiagnostics.ts @@ -1,7 +1,10 @@ import type { OpenCodePromptDeliveryLedgerRecord } from './OpenCodePromptDeliveryLedger'; -const SECRET_VALUE_PATTERN = - /\b(?:sk-[A-Za-z0-9_-]{12,}|[A-Za-z0-9_-]*api[_-]?key[A-Za-z0-9_-]*[=:]\s*['"]?[^'"\s]+|authorization:\s*bearer\s+[^'"\s]+)\b/gi; +const SECRET_VALUE_PATTERNS = [ + /\bsk-[A-Z0-9_-]{12,}\b/gi, + /\b[A-Z0-9_-]*api[_-]?key[A-Z0-9_-]*[=:]\s*['"]?[^'"\s]+/gi, + /\bauthorization:\s*bearer\s+[^'"\s]+/gi, +] as const; const GENERIC_DELIVERY_DIAGNOSTIC_TOKENS = [ 'opencode app mcp was reattached before message delivery', @@ -43,12 +46,15 @@ const ACTION_REQUIRED_DELIVERY_ERROR_TOKENS = [ export function normalizeOpenCodeRuntimeDeliveryDiagnostic( message: string | null | undefined ): string | null { - const normalized = message + const scrubbed = SECRET_VALUE_PATTERNS.reduce( + (current, pattern) => current.replace(pattern, '[redacted]'), + message ?? '' + ); + const normalized = scrubbed ?.replace(/\s+/g, ' ') .trim() .replace(/^Latest assistant message\s+\S+\s+failed with APIError\s*[-:]\s*/i, '') - .replace(/^APIError\s*[-:]\s*/i, '') - .replace(SECRET_VALUE_PATTERN, '[redacted]'); + .replace(/^APIError\s*[-:]\s*/i, ''); return normalized && normalized.length > 0 ? normalized : null; } diff --git a/src/shared/utils/teamTaskState.ts b/src/shared/utils/teamTaskState.ts index 961b0f1a..b3d059a8 100644 --- a/src/shared/utils/teamTaskState.ts +++ b/src/shared/utils/teamTaskState.ts @@ -72,20 +72,7 @@ export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): bo } export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean { - if (isTeamTaskDeleted(task)) { - return true; - } - - const workflowColumn = getTeamTaskWorkflowColumn(task); - if (workflowColumn === 'approved') { - return true; - } - - if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) { - return false; - } - - return task.status === 'completed'; + return isTeamTaskTerminalForActionableWork(task); } export function getTeamTaskWorkflowColumn( diff --git a/test/main/services/team/TeamDataService.test.ts b/test/main/services/team/TeamDataService.test.ts index 02b672ee..e89ee34f 100644 --- a/test/main/services/team/TeamDataService.test.ts +++ b/test/main/services/team/TeamDataService.test.ts @@ -1914,7 +1914,7 @@ describe('TeamDataService', () => { name: 'My team', members: [{ name: 'jack', role: 'developer' }], }, - getTasks: async () => [ + getTasks: async (): Promise => [ { id: 'task-approved', subject: 'Approved but stale status', @@ -1975,6 +1975,7 @@ describe('TeamDataService', () => { id: 'review-started', type: 'review_started', timestamp: '2026-05-06T19:00:00.000Z', + from: 'none', to: 'review', }, ], @@ -2172,6 +2173,7 @@ describe('TeamDataService', () => { { id: 'evt-review', type: 'review_started', + from: 'none', to: 'review', timestamp: '2026-03-01T09:00:00.000Z', }, @@ -2182,6 +2184,7 @@ describe('TeamDataService', () => { {} as never, {} as never, {} as never, + {} as never, { getState: vi.fn(async () => ({ teamName: 'my-team',