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]
): '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,

View file

@ -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 }[];

View file

@ -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;
}

View file

@ -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(

View file

@ -1914,7 +1914,7 @@ describe('TeamDataService', () => {
name: 'My team',
members: [{ name: 'jack', role: 'developer' }],
},
getTasks: async () => [
getTasks: async (): Promise<TeamTask[]> => [
{
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',