Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–17 unchanged (17 lines)
18 notes: str | None = None
19 created_at: datetime = Field(default_factory=utc_now)
20
21 @field_serializer('key')
22 def serialize_key(self, key: SecretStr, info: Any):
23 """Conditionally serialize the key based on context."""
24 if info.context and info.context.get('reveal_secrets'):
25 return key.get_secret_value()
26 return str(key) # Returns '**********' by default
27
28
29def get_default_encryption_keys(workspace_dir: Path) -> list[EncryptionKey]:
30 """Generate default encryption keys."""
…lines 31–59 unchanged (29 lines)

After

…lines 1–17 unchanged (17 lines)
18 notes: str | None = None
19 created_at: datetime = Field(default_factory=utc_now)
20
21 @field_serializer('key')
22 def serialize_key(self, key: SecretStr, info: Any):
23 """Conditionally serialize the key based on context."""
24 if info.context and info.context.get('expose_secrets'):
25 return key.get_secret_value()
26 return str(key) # Returns '**********' by default
27
28
29def get_default_encryption_keys(workspace_dir: Path) -> list[EncryptionKey]:
30 """Generate default encryption keys."""
…lines 31–59 unchanged (29 lines)

Before

module
import_statement
import "import"
dotted_name
identifier "os"
import_from_statement
from "from"
dotted_name
identifier "datetime"
import "import"
dotted_name
identifier "datetime"
import_from_statement
from "from"
dotted_name
identifier "pathlib"
import "import"
dotted_name
identifier "Path"
import_from_statement
from "from"
dotted_name
identifier "typing"
import "import"
dotted_name
identifier "Any"
import_statement
import "import"
dotted_name
identifier "base62"
import_from_statement
from "from"
dotted_name
identifier "pydantic"
import "import"
dotted_name
identifier "BaseModel"
, ","
dotted_name
identifier "Field"
, ","
dotted_name
identifier "SecretStr"
, ","
dotted_name
identifier "TypeAdapter"
, ","
dotted_name
identifier "field_serializer"
import_from_statement
from "from"
dotted_name
identifier "openhands"
. "."
identifier "agent_server"
. "."
identifier "utils"
import "import"
dotted_name
identifier "utc_now"
class_definition
class "class"
identifier "EncryptionKey"
argument_list
( "("
identifier "BaseModel"
) ")"
: ":"
block
expression_statement
string
string_start "\"\"\""
string_content "Configuration for an encryption key."
string_end "\"\"\""
expression_statement (+35 nodes collapsed)
expression_statement
assignment
identifier "key"
: ":"
type
identifier "SecretStr"
expression_statement
assignment
identifier "active"
: ":"
type
identifier "bool"
= "="
true "True"
expression_statement
assignment
identifier "notes"
: ":"
type
binary_operator
identifier "str"
| "|"
none "None"
= "="
none "None"
expression_statement
assignment
identifier "created_at"
: ":"
type
identifier "datetime"
= "="
call
identifier "Field"
argument_list
( "("
keyword_argument
identifier "default_factory"
= "="
identifier "utc_now"
) ")"
decorated_definition
decorator
@ "@"
call
identifier "field_serializer"
argument_list
( "("
string
string_start "'"
string_content "key"
string_end "'"
) ")"
function_definition
def "def"
identifier "serialize_key"
parameters
( "("
identifier "self"
, ","
typed_parameter
identifier "key"
: ":"
type
identifier "SecretStr"
, ","
typed_parameter
identifier "info"
: ":"
type
identifier "Any"
) ")"
: ":"
block
expression_statement
string
string_start "\"\"\""
string_content "Conditionally serialize the key based on context."
string_end "\"\"\""
if_statement
if "if"
boolean_operator
attribute
identifier "info"
. "."
identifier "context"
and "and"
call
attribute
attribute
identifier "info"
. "."
identifier "context"
. "."
identifier "get"
argument_list
( "("
string
string_start "'"
string_content "reveal_secrets"
string_end "'"
) ")"
: ":"
block
return_statement
return "return"
call
attribute
identifier "key"
. "."
identifier "get_secret_value"
argument_list
( "("
) ")"
return_statement
return "return"
call
identifier "str"
argument_list
( "("
identifier "key"
) ")"
comment "# Returns '**********' by default"
function_definition (+232 nodes collapsed)

After

module
import_statement
import "import"
dotted_name
identifier "os"
import_from_statement
from "from"
dotted_name
identifier "datetime"
import "import"
dotted_name
identifier "datetime"
import_from_statement
from "from"
dotted_name
identifier "pathlib"
import "import"
dotted_name
identifier "Path"
import_from_statement
from "from"
dotted_name
identifier "typing"
import "import"
dotted_name
identifier "Any"
import_statement
import "import"
dotted_name
identifier "base62"
import_from_statement
from "from"
dotted_name
identifier "pydantic"
import "import"
dotted_name
identifier "BaseModel"
, ","
dotted_name
identifier "Field"
, ","
dotted_name
identifier "SecretStr"
, ","
dotted_name
identifier "TypeAdapter"
, ","
dotted_name
identifier "field_serializer"
import_from_statement
from "from"
dotted_name
identifier "openhands"
. "."
identifier "agent_server"
. "."
identifier "utils"
import "import"
dotted_name
identifier "utc_now"
class_definition
class "class"
identifier "EncryptionKey"
argument_list
( "("
identifier "BaseModel"
) ")"
: ":"
block
expression_statement
string
string_start "\"\"\""
string_content "Configuration for an encryption key."
string_end "\"\"\""
expression_statement (+35 nodes collapsed)
expression_statement
assignment
identifier "key"
: ":"
type
identifier "SecretStr"
expression_statement
assignment
identifier "active"
: ":"
type
identifier "bool"
= "="
true "True"
expression_statement
assignment
identifier "notes"
: ":"
type
binary_operator
identifier "str"
| "|"
none "None"
= "="
none "None"
expression_statement
assignment
identifier "created_at"
: ":"
type
identifier "datetime"
= "="
call
identifier "Field"
argument_list
( "("
keyword_argument
identifier "default_factory"
= "="
identifier "utc_now"
) ")"
decorated_definition
decorator
@ "@"
call
identifier "field_serializer"
argument_list
( "("
string
string_start "'"
string_content "key"
string_end "'"
) ")"
function_definition
def "def"
identifier "serialize_key"
parameters
( "("
identifier "self"
, ","
typed_parameter
identifier "key"
: ":"
type
identifier "SecretStr"
, ","
typed_parameter
identifier "info"
: ":"
type
identifier "Any"
) ")"
: ":"
block
expression_statement
string
string_start "\"\"\""
string_content "Conditionally serialize the key based on context."
string_end "\"\"\""
if_statement
if "if"
boolean_operator
attribute
identifier "info"
. "."
identifier "context"
and "and"
call
attribute
attribute
identifier "info"
. "."
identifier "context"
. "."
identifier "get"
argument_list
( "("
string
string_start "'"
string_content "expose_secrets"
string_end "'"
) ")"
: ":"
block
return_statement
return "return"
call
attribute
identifier "key"
. "."
identifier "get_secret_value"
argument_list
( "("
) ")"
return_statement
return "return"
call
identifier "str"
argument_list
( "("
identifier "key"
) ")"
comment "# Returns '**********' by default"
function_definition (+232 nodes collapsed)