fix(renderer): suppress recoverable OpenCode refresh advisories
This commit is contained in:
parent
9924e447c8
commit
d50d81632a
4 changed files with 70 additions and 5 deletions
|
|
@ -414,7 +414,8 @@ function isRecoverableOpenCodeSessionRefreshMessage(message: string | undefined)
|
||||||
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
||||||
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
||||||
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
||||||
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed'
|
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
||||||
|
refreshMarkerText === 'opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,8 @@ function isRecoverableOpenCodeSessionRefreshText(value: string | undefined): boo
|
||||||
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
refreshMarkerText === 'opencode session changed; refreshing the session before retry' ||
|
||||||
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
refreshMarkerText === 'opencode session refresh scheduled after resolved behavior changed' ||
|
||||||
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
refreshMarkerText === 'opencode_prompt_delivery_session_refresh_scheduled' ||
|
||||||
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed'
|
refreshMarkerText === 'opencode_session_refresh_scheduled_after_resolved_behavior_changed' ||
|
||||||
|
refreshMarkerText === 'opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import {
|
import {
|
||||||
buildMemberLaunchPresentation,
|
buildMemberLaunchPresentation,
|
||||||
getLaunchAwarePresenceLabel,
|
getLaunchAwarePresenceLabel,
|
||||||
getSpawnAwareDotClass,
|
|
||||||
getSpawnAwarePresenceLabel,
|
|
||||||
getSpawnCardClass,
|
|
||||||
getMemberRuntimeAdvisoryLabel,
|
getMemberRuntimeAdvisoryLabel,
|
||||||
getMemberRuntimeAdvisoryTitle,
|
getMemberRuntimeAdvisoryTitle,
|
||||||
getMemberRuntimeAdvisoryTone,
|
getMemberRuntimeAdvisoryTone,
|
||||||
|
getSpawnAwareDotClass,
|
||||||
|
getSpawnAwarePresenceLabel,
|
||||||
|
getSpawnCardClass,
|
||||||
isOpenCodeRelaunchActionable,
|
isOpenCodeRelaunchActionable,
|
||||||
shouldDisplayMemberCurrentTask,
|
shouldDisplayMemberCurrentTask,
|
||||||
} from '@renderer/utils/memberHelpers';
|
} from '@renderer/utils/memberHelpers';
|
||||||
|
|
@ -1333,6 +1333,7 @@ describe('memberHelpers spawn-aware presence', () => {
|
||||||
'OpenCode API error. opencode_prompt_delivery_session_refresh_scheduled.',
|
'OpenCode API error. opencode_prompt_delivery_session_refresh_scheduled.',
|
||||||
'OpenCode session refresh scheduled after resolved behavior changed',
|
'OpenCode session refresh scheduled after resolved behavior changed',
|
||||||
'opencode_session_refresh_scheduled_after_resolved_behavior_changed',
|
'opencode_session_refresh_scheduled_after_resolved_behavior_changed',
|
||||||
|
'OpenCode API error. opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
||||||
])('renders recoverable OpenCode session refresh advisory %s as a warning', (message) => {
|
])('renders recoverable OpenCode session refresh advisory %s as a warning', (message) => {
|
||||||
const advisory = {
|
const advisory = {
|
||||||
kind: 'api_error' as const,
|
kind: 'api_error' as const,
|
||||||
|
|
|
||||||
|
|
@ -851,6 +851,68 @@ describe('member launch diagnostics', () => {
|
||||||
expect(hasMemberLaunchDiagnosticsError(payload)).toBe(false);
|
expect(hasMemberLaunchDiagnosticsError(payload)).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('suppresses stale observe scheduled OpenCode API advisories while the runtime is alive', () => {
|
||||||
|
const payload = buildMemberLaunchDiagnosticsPayload({
|
||||||
|
teamName: 'atlas-hq-15',
|
||||||
|
runId: 'd78fd1d5-f60b-4704-9df3-867c79e840b3',
|
||||||
|
memberName: 'bob',
|
||||||
|
member: {
|
||||||
|
name: 'bob',
|
||||||
|
providerId: 'opencode',
|
||||||
|
model: 'opencode/deepseek-v4-flash-free',
|
||||||
|
agentType: 'general-purpose',
|
||||||
|
laneId: 'secondary:opencode:bob',
|
||||||
|
laneKind: 'secondary',
|
||||||
|
laneOwnerProviderId: 'opencode',
|
||||||
|
},
|
||||||
|
spawnEntry: {
|
||||||
|
status: 'online',
|
||||||
|
launchState: 'confirmed_alive',
|
||||||
|
runtimeAlive: true,
|
||||||
|
bootstrapConfirmed: true,
|
||||||
|
agentToolAccepted: true,
|
||||||
|
hardFailure: false,
|
||||||
|
runtimeDiagnostic: 'OpenCode runtime process detected after bootstrap confirmation',
|
||||||
|
runtimeDiagnosticSeverity: 'info',
|
||||||
|
livenessKind: 'runtime_process',
|
||||||
|
livenessSource: 'heartbeat',
|
||||||
|
updatedAt: '2026-05-30T17:17:33.910Z',
|
||||||
|
},
|
||||||
|
runtimeEntry: {
|
||||||
|
memberName: 'bob',
|
||||||
|
providerId: 'opencode',
|
||||||
|
runtimeModel: 'opencode/deepseek-v4-flash-free',
|
||||||
|
backendType: 'process',
|
||||||
|
alive: true,
|
||||||
|
restartable: false,
|
||||||
|
livenessKind: 'runtime_process',
|
||||||
|
runtimeDiagnostic: 'OpenCode runtime process detected after bootstrap confirmation',
|
||||||
|
runtimeDiagnosticSeverity: 'info',
|
||||||
|
diagnostics: [
|
||||||
|
'OpenCode API error',
|
||||||
|
'opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
||||||
|
'matched OpenCode runtime pid and process identity',
|
||||||
|
'bootstrap confirmed',
|
||||||
|
],
|
||||||
|
updatedAt: '2026-05-30T17:28:39.655Z',
|
||||||
|
},
|
||||||
|
runtimeAdvisoryLabel: 'OpenCode API error',
|
||||||
|
runtimeAdvisoryTitle: 'OpenCode API error',
|
||||||
|
runtimeAdvisory: {
|
||||||
|
kind: 'api_error',
|
||||||
|
observedAt: '2026-05-30T17:26:24.466Z',
|
||||||
|
reasonCode: 'backend_error',
|
||||||
|
message: 'OpenCode API error. opencode_session_stale_observe_scheduled_after_accepted_prompt',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(payload.memberCardError).toBeUndefined();
|
||||||
|
expect(hasMemberLaunchDiagnosticsError(payload)).toBe(false);
|
||||||
|
expect(payload.diagnostics).toContain(
|
||||||
|
'opencode_session_stale_observe_scheduled_after_accepted_prompt'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('treats member card errors from runtime advisory as diagnostics errors', () => {
|
it('treats member card errors from runtime advisory as diagnostics errors', () => {
|
||||||
const payload = buildMemberLaunchDiagnosticsPayload({
|
const payload = buildMemberLaunchDiagnosticsPayload({
|
||||||
memberName: 'tom',
|
memberName: 'tom',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue