(event: StreamEndEvent)
| 7874 | } |
| 7875 | |
| 7876 | private async finalizeWorkspaceTurnFromStreamEnd(event: StreamEndEvent): Promise<boolean> { |
| 7877 | const metadata = this.getWorkspaceTurnMetadata(event); |
| 7878 | if (metadata == null) { |
| 7879 | if (event.metadata.muxMetadata != null) { |
| 7880 | return false; |
| 7881 | } |
| 7882 | return await this.interruptWorkspaceTurnFromUncorrelatedStreamEnd(event); |
| 7883 | } |
| 7884 | const record = await this.taskHandleStore.getWorkspaceTurn( |
| 7885 | metadata.ownerWorkspaceId, |
| 7886 | metadata.taskHandleId |
| 7887 | ); |
| 7888 | if (record == null) { |
| 7889 | log.warn("Ignoring missing workspace turn stream-end handle", { |
| 7890 | workspaceId: event.workspaceId, |
| 7891 | taskHandleId: metadata.taskHandleId, |
| 7892 | }); |
| 7893 | return true; |
| 7894 | } |
| 7895 | if (record.workspaceId !== event.workspaceId || record.turnId !== metadata.turnId) { |
| 7896 | log.warn("Ignoring out-of-scope workspace turn stream-end", { |
| 7897 | workspaceId: event.workspaceId, |
| 7898 | taskHandleId: metadata.taskHandleId, |
| 7899 | }); |
| 7900 | return true; |
| 7901 | } |
| 7902 | if (this.isDeferredWorkspaceTurnMessage(record, event.messageId)) { |
| 7903 | return true; |
| 7904 | } |
| 7905 | |
| 7906 | const next = this.buildTerminalWorkspaceTurnRecordFromEvent(record, event); |
| 7907 | await this.settleWorkspaceTurn({ |
| 7908 | record, |
| 7909 | next, |
| 7910 | waiterSettlement: |
| 7911 | next.status === "completed" |
| 7912 | ? { status: "completed", result: this.buildWorkspaceTurnWaitResult(next) } |
| 7913 | : { status: "error", error: new Error(next.error ?? "Workspace turn failed") }, |
| 7914 | }); |
| 7915 | return true; |
| 7916 | } |
| 7917 | |
| 7918 | private async handleStreamEnd(event: StreamEndEvent): Promise<void> { |
| 7919 | const workspaceId = event.workspaceId; |
no test coverage detected