001/* 002 * Copyright 2022-2026 Revetware LLC. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.soklet; 018 019import org.jspecify.annotations.NonNull; 020 021import javax.annotation.concurrent.ThreadSafe; 022import java.util.List; 023import java.util.Optional; 024 025/** 026 * Immutable terminal state for one MCP simulation. 027 * 028 * @author <a href="https://www.revetkn.com">Mark Allen</a> 029 */ 030@ThreadSafe 031public interface McpSimulationCompletion { 032 /** 033 * @return the exact public request-stream termination reason 034 */ 035 @NonNull 036 McpStreamTerminationReason getReason(); 037 038 /** 039 * Returns the terminal SSE JSON message when its frame was successfully 040 * captured. The same message also remains available as one ordinary stream 041 * item; nonstreaming JSON responses never appear here. 042 * 043 * @return the duplicated terminal stream message, otherwise empty 044 */ 045 @NonNull 046 Optional<@NonNull McpJsonValue> getTerminalMessage(); 047 048 /** 049 * Returns an immutable ordered view of terminal failures. Throwable instances 050 * retain their exact identities and may contain application-sensitive data; 051 * callers own any logging or disclosure decision. 052 * 053 * @return terminal failures in observation order 054 */ 055 @NonNull 056 List<@NonNull Throwable> getThrowables(); 057}