fix(team): restore task automation ci

This commit is contained in:
777genius 2026-05-07 01:38:28 +03:00
parent 38b3a1e789
commit cbf2d364be
5 changed files with 28 additions and 20 deletions

View file

@ -596,6 +596,17 @@ export class TeamDataService {
kanbanTaskState?: KanbanState['tasks'][string] kanbanTaskState?: KanbanState['tasks'][string]
): 'none' | 'review' | 'needsFix' | 'approved' { ): 'none' | 'review' | 'needsFix' | 'approved' {
const kanbanColumn = kanbanTaskState?.column; const kanbanColumn = kanbanTaskState?.column;
const kanbanWorkflowColumn = kanbanColumn
? getTeamTaskWorkflowColumn({
status: task.status,
reviewState: 'none',
kanbanColumn,
})
: undefined;
if (kanbanWorkflowColumn) {
return kanbanWorkflowColumn;
}
const reviewState = getReviewStateFromTask({ const reviewState = getReviewStateFromTask({
historyEvents: task.historyEvents, historyEvents: task.historyEvents,
reviewState: task.reviewState, reviewState: task.reviewState,

View file

@ -176,6 +176,7 @@ export interface OpenCodeSendMessageCommandBody {
| 'slash_command' | 'slash_command'
| 'slash_command_result' | 'slash_command_result'
| 'task_comment_notification' | 'task_comment_notification'
| 'task_stall_remediation'
| 'member_work_sync_nudge' | 'member_work_sync_nudge'
| 'agent_error'; | 'agent_error';
taskRefs?: { taskId: string; displayId: string; teamName: string }[]; taskRefs?: { taskId: string; displayId: string; teamName: string }[];

View file

@ -1,7 +1,10 @@
import type { OpenCodePromptDeliveryLedgerRecord } from './OpenCodePromptDeliveryLedger'; import type { OpenCodePromptDeliveryLedgerRecord } from './OpenCodePromptDeliveryLedger';
const SECRET_VALUE_PATTERN = const SECRET_VALUE_PATTERNS = [
/\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; /\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 = [ const GENERIC_DELIVERY_DIAGNOSTIC_TOKENS = [
'opencode app mcp was reattached before message delivery', 'opencode app mcp was reattached before message delivery',
@ -43,12 +46,15 @@ const ACTION_REQUIRED_DELIVERY_ERROR_TOKENS = [
export function normalizeOpenCodeRuntimeDeliveryDiagnostic( export function normalizeOpenCodeRuntimeDeliveryDiagnostic(
message: string | null | undefined message: string | null | undefined
): string | null { ): string | null {
const normalized = message const scrubbed = SECRET_VALUE_PATTERNS.reduce(
(current, pattern) => current.replace(pattern, '[redacted]'),
message ?? ''
);
const normalized = scrubbed
?.replace(/\s+/g, ' ') ?.replace(/\s+/g, ' ')
.trim() .trim()
.replace(/^Latest assistant message\s+\S+\s+failed with APIError\s*[-:]\s*/i, '') .replace(/^Latest assistant message\s+\S+\s+failed with APIError\s*[-:]\s*/i, '')
.replace(/^APIError\s*[-:]\s*/i, '') .replace(/^APIError\s*[-:]\s*/i, '');
.replace(SECRET_VALUE_PATTERN, '[redacted]');
return normalized && normalized.length > 0 ? normalized : null; return normalized && normalized.length > 0 ? normalized : null;
} }

View file

@ -72,20 +72,7 @@ export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): bo
} }
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean { export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean {
if (isTeamTaskDeleted(task)) { return isTeamTaskTerminalForActionableWork(task);
return true;
}
const workflowColumn = getTeamTaskWorkflowColumn(task);
if (workflowColumn === 'approved') {
return true;
}
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
return false;
}
return task.status === 'completed';
} }
export function getTeamTaskWorkflowColumn( export function getTeamTaskWorkflowColumn(

View file

@ -1914,7 +1914,7 @@ describe('TeamDataService', () => {
name: 'My team', name: 'My team',
members: [{ name: 'jack', role: 'developer' }], members: [{ name: 'jack', role: 'developer' }],
}, },
getTasks: async () => [ getTasks: async (): Promise<TeamTask[]> => [
{ {
id: 'task-approved', id: 'task-approved',
subject: 'Approved but stale status', subject: 'Approved but stale status',
@ -1975,6 +1975,7 @@ describe('TeamDataService', () => {
id: 'review-started', id: 'review-started',
type: 'review_started', type: 'review_started',
timestamp: '2026-05-06T19:00:00.000Z', timestamp: '2026-05-06T19:00:00.000Z',
from: 'none',
to: 'review', to: 'review',
}, },
], ],
@ -2172,6 +2173,7 @@ describe('TeamDataService', () => {
{ {
id: 'evt-review', id: 'evt-review',
type: 'review_started', type: 'review_started',
from: 'none',
to: 'review', to: 'review',
timestamp: '2026-03-01T09:00:00.000Z', timestamp: '2026-03-01T09:00:00.000Z',
}, },
@ -2182,6 +2184,7 @@ describe('TeamDataService', () => {
{} as never, {} as never,
{} as never, {} as never,
{} as never, {} as never,
{} as never,
{ {
getState: vi.fn(async () => ({ getState: vi.fn(async () => ({
teamName: 'my-team', teamName: 'my-team',