iop/packages/go/workspaceprotocol/terminal.go
toki d7a150c7fe feat(agent): 단일 요청 실행 경로를 완성한다
Claude의 단일 Anthropic 요청 안에서 IOP가 Plan, Work, Review와 workspace 도구 실행을 끝내고 실제 dev smoke로 계약을 검증할 수 있어야 한다.\n\n완료 task evidence와 마일스톤 검토 상태도 같은 변경에 고정한다.
2026-08-08 23:35:13 +09:00

105 lines
6.2 KiB
Go

package workspaceprotocol
import (
iop "iop/proto/gen/iop"
)
// ToolTerminal returns the exact canonical message for a tool status and error code pair.
// Returns (message, true) for valid canonical pairs, or ("", false) if the pair is invalid.
func ToolTerminal(status iop.WorkspaceStatus, code iop.WorkspaceErrorCode) (string, bool) {
switch {
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_SUCCESS && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSPECIFIED:
return "", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_READY:
return "workspace runtime not ready", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSUPPORTED:
return "workspace operation unsupported", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_FOUND:
return "workspace entry not found", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INVALID_REQUEST:
return "workspace request rejected", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_TIMEOUT && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_TIMEOUT:
return "workspace command timed out", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_CANCELLED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_CANCELLED:
return "workspace command cancelled", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INTERNAL:
return "workspace operation failed", true
default:
return "", false
}
}
// ArtifactTerminal returns the exact canonical message for an internal artifact
// status and error code pair. Artifact terminals never include a path, artifact
// content, or a raw filesystem/runtime error.
func ArtifactTerminal(status iop.WorkspaceStatus, code iop.WorkspaceErrorCode) (string, bool) {
switch {
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_SUCCESS && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSPECIFIED:
return "", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_READY:
return "workspace runtime not ready", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_FOUND:
return "workspace artifact not found", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INVALID_REQUEST:
return "workspace artifact request rejected", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INTERNAL:
return "workspace artifact operation failed", true
default:
return "", false
}
}
// CancelTerminal returns the exact canonical message for a cancel status and error code pair.
// Returns (message, true) for valid canonical pairs, or ("", false) if the pair is invalid.
func CancelTerminal(status iop.WorkspaceStatus, code iop.WorkspaceErrorCode) (string, bool) {
switch {
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_CANCELLED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_CANCELLED:
return "workspace command cancelled", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_FOUND:
return "workspace command not found", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INVALID_REQUEST:
return "workspace cancellation rejected", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_READY:
return "workspace runtime not ready", true
default:
return "", false
}
}
// OpenTerminal returns the exact canonical message for an open status and error code pair.
// Returns (message, true) for valid canonical pairs, or ("", false) if the pair is invalid.
func OpenTerminal(status iop.WorkspaceStatus, code iop.WorkspaceErrorCode) (string, bool) {
switch {
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_SUCCESS && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSPECIFIED:
return "", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_READY:
return "workspace runtime not ready", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INVALID_REQUEST:
return "workspace open rejected", true
default:
return "", false
}
}
// CleanupTerminal returns the exact canonical message for a cleanup status and error code pair.
// Returns (message, true) for valid canonical pairs, or ("", false) if the pair is invalid.
func CleanupTerminal(status iop.WorkspaceStatus, code iop.WorkspaceErrorCode) (string, bool) {
switch {
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_SUCCESS && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSPECIFIED:
return "", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_READY:
return "workspace runtime not ready", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_UNSUPPORTED && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_UNSUPPORTED:
return "workspace cleanup unsupported", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_NOT_FOUND:
return "workspace request not found", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INVALID_REQUEST:
return "workspace cleanup rejected", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_TIMEOUT && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_TIMEOUT:
return "workspace cleanup timed out", true
case status == iop.WorkspaceStatus_WORKSPACE_STATUS_ERROR && code == iop.WorkspaceErrorCode_WORKSPACE_ERROR_CODE_INTERNAL:
return "workspace cleanup failed", true
default:
return "", false
}
}