chore: test deploy snapshot

This commit is contained in:
2026-05-27 10:43:01 +09:00
parent c1d0f4c1db
commit 4c4b3c8d2c
78 changed files with 10392 additions and 2301 deletions

View File

@@ -18,7 +18,6 @@ import {
appendChatConversationMessage,
appendChatConversationActivityLine,
getChatConversationRequest,
markChatConversationRequestManualCompletion,
type ChatConversationRequestItem,
type ChatConversationRequestUsageSnapshot,
getChatConversation,
@@ -46,6 +45,7 @@ import {
import { extractChatMessageParts, type ChatMessagePart } from './chat-message-parts.js';
import { resolveMainProjectRoot } from './main-project-root-service.js';
import { isRuntimeDraining, trackWebSocketConnectionClosed, trackWebSocketConnectionOpened } from './runtime-drain-service.js';
import { isCurrentWorkServerSlotActive } from './work-server-slot-service.js';
import {
findLatestPlanItem,
findPlanItemByPreviewUrl,
@@ -117,23 +117,6 @@ type ChatPromptContextRef = {
parentQuestionText?: string | null;
};
export function shouldAutoCompleteReplyParentVerification(options: {
requestOrigin?: 'composer' | 'prompt' | null;
responseMessageId?: number | null;
responseText?: string | null;
manualVerificationCompletedAt?: string | null;
} | null | undefined) {
if (!options || options.requestOrigin !== 'composer' || options.manualVerificationCompletedAt) {
return false;
}
if (options.responseMessageId != null) {
return true;
}
return String(options.responseText ?? '').trim().length > 0;
}
type ChatInboundMessage =
| {
type: 'context:update';
@@ -4428,6 +4411,21 @@ export class ChatService {
}
async recoverInterruptedSessions() {
if (!(await isCurrentWorkServerSlotActive())) {
this.logger.info(
{
slot: process.env.WORK_SERVER_SLOT?.trim() || null,
},
'skip interrupted chat recovery on inactive work-server slot',
);
return {
sessionCount: 0,
restartedCount: 0,
requeuedCount: 0,
};
}
const recoverableRequests = await listRecoverableChatConversationRequests();
if (recoverableRequests.length === 0) {
@@ -5748,31 +5746,6 @@ export class ChatService {
omitPromptHistory: requestOptions?.omitPromptHistory === true,
context: cloneChatContext(state.context),
};
const parentRequest = request.parentRequestId
? await getChatConversationRequest(state.sessionId, request.parentRequestId)
: null;
const shouldAutoCompleteParentVerification = shouldAutoCompleteReplyParentVerification({
requestOrigin,
responseMessageId: parentRequest?.responseMessageId ?? null,
responseText: parentRequest?.responseText ?? '',
manualVerificationCompletedAt: parentRequest?.manualVerificationCompletedAt ?? null,
});
const completeParentVerificationIfNeeded = async () => {
if (!request.parentRequestId || !shouldAutoCompleteParentVerification) {
return;
}
const updatedParentRequest = await markChatConversationRequestManualCompletion(
state.sessionId,
request.parentRequestId,
'verification',
);
if (updatedParentRequest) {
this.broadcastRequestUpdate(state.sessionId, updatedParentRequest);
}
};
if (mode === 'queue' && (state.activeRequestCount > 0 || state.queue.length > 0)) {
const queuedUserMessage = {
...createMessage('user', trimmed, nextRequestId),
@@ -5807,6 +5780,7 @@ export class ChatService {
requestOrigin: request.requestOrigin,
sharedResourceTokenId: request.sharedResourceTokenId,
parentRequestId: request.parentRequestId,
promptContextRef: request.promptContextRef,
status: 'queued',
statusMessage: `대기열 ${state.queue.length}`,
userMessageId: queuedUserMessage.id,
@@ -5814,11 +5788,9 @@ export class ChatService {
}).catch((error: unknown) => {
this.logger.error(error, 'failed to persist queued chat request');
});
await completeParentVerificationIfNeeded();
return nextRequestId;
}
await completeParentVerificationIfNeeded();
void this.executeRequest(state, request).catch((error: unknown) => {
this.logger.error(error, 'direct chat reply build failed');
this.sendToSession(state, {
@@ -5851,6 +5823,10 @@ export class ChatService {
const compactActivityLineMap = new Map<number, string>();
session.activeRequestCount += 1;
const existingRequest = await getChatConversationRequest(session.sessionId, request.requestId);
const isRetryAttempt =
existingRequest != null
&& !existingRequest.hasResponse
&& (existingRequest.status === 'failed' || existingRequest.status === 'cancelled');
const hasStoredUserMessage = existingRequest?.userMessageId != null;
let userMessageId = existingRequest?.userMessageId ?? null;
@@ -5873,7 +5849,11 @@ export class ChatService {
requestOrigin: request.requestOrigin,
sharedResourceTokenId: request.sharedResourceTokenId,
parentRequestId: request.parentRequestId,
promptContextRef: request.promptContextRef,
status: request.mode === 'direct' ? 'accepted' : existingRequest?.status ?? 'queued',
statusMessage: isRetryAttempt ? '재처리 요청 접수' : undefined,
incrementRetryCount: isRetryAttempt,
allowTerminalStatusReset: isRetryAttempt,
userMessageId,
userText: request.text,
});