fix(team): restore task automation ci
This commit is contained in:
parent
38b3a1e789
commit
cbf2d364be
5 changed files with 28 additions and 20 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 }[];
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue