(
turnId: string,
toolUseId: string,
questions: UserQuestion[],
abortSignal: AbortSignal,
queue: DurableSessionEventSink,
)
| 2093 | } |
| 2094 | |
| 2095 | private async askUserQuestion( |
| 2096 | turnId: string, |
| 2097 | toolUseId: string, |
| 2098 | questions: UserQuestion[], |
| 2099 | abortSignal: AbortSignal, |
| 2100 | queue: DurableSessionEventSink, |
| 2101 | ): Promise<UserQuestionResult> { |
| 2102 | throwIfAborted(abortSignal); |
| 2103 | const hostedRun = this.interactionRun(); |
| 2104 | const requestId = this.input.newId(); |
| 2105 | const parked = this.userQuestions.park(requestId, { |
| 2106 | toolUseId, |
| 2107 | questions, |
| 2108 | hosted: hostedRun !== undefined, |
| 2109 | }); |
| 2110 | const onAbort = (): void => { |
| 2111 | if (hostedRun) return; |
| 2112 | this.userQuestions.reject(requestId, abortErrorFromSignal(abortSignal)); |
| 2113 | this.finishDeferredQuestionTurnClosure(); |
| 2114 | }; |
| 2115 | abortSignal.addEventListener('abort', onAbort, { once: true }); |
| 2116 | if (hostedRun) void parked.catch(() => undefined); |
| 2117 | try { |
| 2118 | const request: UserQuestionRequestEvent = { |
| 2119 | type: 'user_question_request', |
| 2120 | id: this.input.newId(), |
| 2121 | turnId, |
| 2122 | ts: this.input.now(), |
| 2123 | requestId, |
| 2124 | toolUseId, |
| 2125 | questions, |
| 2126 | }; |
| 2127 | if (hostedRun) { |
| 2128 | const settlement = this.createUserQuestionSettlement(turnId, requestId); |
| 2129 | const admission = hostedRun.admitUserQuestionRequest({ request, settlement }); |
| 2130 | try { |
| 2131 | await racePromiseWithAbort(admission, abortSignal); |
| 2132 | } catch (error) { |
| 2133 | if (abortSignal.aborted) { |
| 2134 | void admission.catch((admissionError) => { |
| 2135 | this.userQuestions.reject( |
| 2136 | requestId, |
| 2137 | admissionError instanceof Error |
| 2138 | ? admissionError |
| 2139 | : new RuntimeInteractionFailStopError( |
| 2140 | `Could not confirm admission for question ${requestId}`, |
| 2141 | admissionError, |
| 2142 | ), |
| 2143 | ); |
| 2144 | this.finishDeferredQuestionTurnClosure(); |
| 2145 | }); |
| 2146 | throw abortErrorFromSignal(abortSignal); |
| 2147 | } |
| 2148 | this.userQuestions.reject( |
| 2149 | requestId, |
| 2150 | error instanceof Error |
| 2151 | ? error |
| 2152 | : new RuntimeInteractionFailStopError( |
no test coverage detected