runtime

package
v0.15.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2026 License: AGPL-3.0 Imports: 12 Imported by: 0

Documentation

Overview

Package runtime defines caic-owned task execution runtime interfaces and types.

Index

Constants

View Source
const DirEntryLimit = 16000

DirEntryLimit bounds each directory listing.

View Source
const FileChunkSize = 64 << 10

FileChunkSize bounds each runtime file chunk to 64 KiB.

Variables

View Source
var ErrIsDir = errors.New("path is a directory")

ErrIsDir reports that a path names a directory where a regular file was required.

Functions

This section is empty.

Types

type CacheMount

type CacheMount struct {
	Name          string `json:"name"`
	Description   string `json:"description"`
	HostPath      string `json:"host_path"`
	ContainerPath string `json:"container_path"` // Resolved target path in the runtime container.
	ReadOnly      bool   `json:"read_only"`
	Shallow       bool   `json:"shallow"`
}

CacheMount describes a host cache directory made available to a runtime.

Is serialized as task metadata to disk. Is not used for HTTP wire protocol.

type ConnectionInfo

type ConnectionInfo struct {
	AgentTarget      ConnectionTarget
	TailscaleFQDN    string
	TailscaleAuthURL string
}

ConnectionInfo describes connection details returned by a runtime instance.

type ConnectionTarget added in v0.10.1

type ConnectionTarget struct {
	SSHHost string
}

ConnectionTarget describes how agent relay operations reach a runtime.

It is currently SSH-shaped because mdruntime is the only production adapter. Non-SSH adapters should replace direct agent SSH/file-copy operations with a runtime-owned execution and transfer contract instead of leaking adapter details into task orchestration.

type DirEntry added in v0.15.0

type DirEntry struct {
	Name  string
	IsDir bool
	// Size is the reported size in bytes; a directory reports its own metadata.
	Size int64
	// Modified is the modification time, or nil when the runtime cannot report it.
	Modified *time.Time
}

DirEntry is one immediate child of a runtime directory.

type Event

type Event struct {
	InstanceID ID
	Kind       EventKind
}

Event describes one runtime lifecycle transition.

type EventFilter

type EventFilter struct {
	MetadataKey MetadataKey
}

EventFilter selects runtime lifecycle events.

type EventKind added in v0.11.5

type EventKind string

EventKind identifies a runtime lifecycle event.

const (
	// EventDestroy reports that an instance was removed and cannot be revived.
	EventDestroy EventKind = "destroy"
	// EventDie reports that an instance stopped.
	EventDie EventKind = "die"
	// EventOOM reports that the runtime killed an instance for exceeding memory.
	EventOOM EventKind = "oom"
	// EventRestart reports that a previously stopped instance restarted.
	EventRestart EventKind = "restart"
	// EventStart reports that a previously stopped instance started.
	EventStart EventKind = "start"
)

type FetchOpts added in v0.12.0

type FetchOpts struct {
	// Commit commits the instance's pending changes before fetching, so the
	// host receives them as well.
	Commit bool
}

FetchOpts configures Repository.Fetch. Its zero value fetches only what the instance already committed, which leaves its history and working tree untouched.

type FetchedBranch added in v0.12.0

type FetchedBranch struct {
	// RepositoryPath is the repository's absolute path inside the runtime.
	RepositoryPath string
	// BranchName is the short local branch name, such as "main" or "caic-1".
	BranchName string
	// CommitHash is the full Git object ID of the fetched branch tip.
	CommitHash string
}

FetchedBranch identifies an exact repository branch tip observed by Fetch.

type Files added in v0.14.0

type Files interface {
	// ReadFile yields chunks of at most FileChunkSize bytes, borrowed until
	// the next iteration. Empty files yield one empty chunk. Missing files
	// yield fs.ErrNotExist. Offset is a byte offset; length -1 reads to EOF.
	// Stopping iteration releases the reader and process.
	ReadFile(ctx context.Context, id ID, path string, offset, length int64) iter.Seq2[[]byte, error]
	// FileSize returns the current regular-file size; it is not a version validator.
	FileSize(ctx context.Context, id ID, path string) (int64, error)
	// ReadDir returns immediate children of path sorted by name, capped at
	// DirEntryLimit. truncated reports that children were dropped. Missing
	// paths yield fs.ErrNotExist, non-directories ErrIsDir.
	ReadDir(ctx context.Context, id ID, path string) (entries []DirEntry, truncated bool, err error)
}

Files streams regular files from an instance, never the server's filesystem.

type ForkOptions

type ForkOptions struct {
	RuntimeName Name
	Metadata    Metadata
	// Repos is the full set of repositories the fork should contain: every repo
	// already in the source instance plus any new ones to add. Each names its
	// destination primary branch; the caller owns branch uniqueness.
	Repos     []ForkRepo
	Display   bool // Inherit or enable X11/VNC.
	Tailscale bool // Inherit or enable Tailscale.
	USB       bool // Inherit or enable USB.
	Sudo      bool // Inherit or enable root access (password-based sudo).
	Harness   harness.Name
	ExtraEnv  []string  // KEY=VALUE pairs for ~/.env.
	Mounts    []Mount   // Host directories bind-mounted into the fork.
	MaxCPUs   int       // Max CPU cores; 0 means use the default.
	LogWriter io.Writer // Provisioning log output.
}

ForkOptions holds parameters for forking a runtime instance.

type ForkRepo added in v0.11.2

type ForkRepo struct {
	// GitRoot is the absolute host git repository path (the runtime's GitRoot).
	GitRoot string
	// ContainerPath is the container path to mount a new repo at. Used only for repos
	// not already in the source instance; existing repos keep their mount.
	ContainerPath string
	// SourceBranches are the branches to carry, primary first. For a repo already
	// in the source instance these are its current branches; for a new repo they
	// are the host branches to push (empty defaults to the repo's upstream).
	SourceBranches []string
	// DestPrimary is the fork's primary branch. The caller owns its uniqueness;
	// the runtime uses it verbatim.
	DestPrimary string
}

ForkRepo describes one repository in a fork: its identity, the branches it carries, and the fork's destination primary branch.

type GitCommit added in v0.12.0

type GitCommit struct {
	SHA          string
	Subject      string
	Decorations  string
	AuthoredDate string
	Behind       bool // Present only on the comparison branch, not in HEAD's history.
	Stat         []GitFileStat
}

GitCommit describes one commit unique to either side of the comparison branch.

type GitFileStat added in v0.12.0

type GitFileStat struct {
	Path         string
	LinesAdded   int
	LinesDeleted int
	Binary       bool
	OldSize      int64 // Byte size of the binary pre-image; zero for added paths.
	NewSize      int64 // Byte size of the binary post-image; zero for deleted paths.
}

GitFileStat describes one path's changes in a commit.

type GitFileStatus added in v0.12.0

type GitFileStatus struct {
	Path           string
	OriginalPath   string
	IndexStatus    string
	WorktreeStatus string
	LinesAdded     int
	LinesDeleted   int
	Binary         bool
	OldSize        int64 // Byte size of the binary pre-image; zero for added paths.
	NewSize        int64 // Byte size of the binary post-image; zero for deleted paths.
}

GitFileStatus describes one uncommitted path from git status porcelain v2.

type ID added in v0.11.0

type ID string

ID identifies a runtime instance across runtime backends.

It combines a runtime Name with a backend-local instance ID, encoded as "name:instance". Runtime systems receive and return the qualified form so different runtimes can own colliding backend-local instance IDs.

func NewID added in v0.11.0

func NewID(runtimeName Name, instanceID InstanceID) ID

NewID returns a qualified ID from a runtime name and backend-local instance ID.

func (ID) InstanceID added in v0.11.0

func (id ID) InstanceID() InstanceID

InstanceID returns the backend-local instance ID part of the qualified ID.

func (ID) RuntimeName added in v0.11.0

func (id ID) RuntimeName() Name

RuntimeName returns the runtime name part of the qualified ID.

An empty return means the ID is unqualified and invalid outside a concrete runtime backend implementation.

type Instance

type Instance struct {
	ID            ID
	AgentTarget   ConnectionTarget
	State         string
	Repos         []Repo
	Tailscale     bool
	TailscaleFQDN string
	USB           bool
	Display       bool
	Sudo          bool
	VNCPort       int
}

Instance describes a known runtime instance.

type InstanceID

type InstanceID string

InstanceID identifies a backend-local runtime allocation.

It is used only inside concrete runtime adapters when calling their backing runtime APIs. Application-facing runtime interfaces use qualified ID values.

type InstanceInspect added in v0.10.2

type InstanceInspect struct {
	Runtime         string
	ID              ID
	State           string
	ImageRef        string
	ImageID         string
	OS              string
	CPUArchitecture string
	CPULimit        float64
	Mounts          []Mount
	Caches          []CacheMount
}

InstanceInspect describes observed runtime configuration for an instance.

type Inventory

type Inventory interface {
	List(ctx context.Context) ([]Instance, error)
	Metadata(ctx context.Context, id ID, key MetadataKey) (string, error)
	Inspect(ctx context.Context, id ID) (*InstanceInspect, error)
}

Inventory lists runtime instances and their observed metadata.

type Lifecycle added in v0.11.0

type Lifecycle interface {
	// Launch starts the runtime instance and writes connection config. It does
	// not wait for transport readiness. Repos must have branches set.
	Launch(ctx context.Context, repos []Repo, opts *StartOptions) (ID, error)
	// Connect waits for transport readiness and completes provisioning for the
	// runtime instance identified by id. It returns optional connection details.
	Connect(ctx context.Context, id ID, opts *StartOptions) (ConnectionInfo, error)
	// Stop gracefully stops the runtime instance without removing it. The
	// instance can be restarted later with Revive.
	Stop(ctx context.Context, id ID) error
	// Purge stops and removes the runtime instance identified by id.
	Purge(ctx context.Context, id ID) error
	// Revive restarts a stopped runtime instance and waits for connectivity.
	// The instance's filesystem is preserved.
	Revive(ctx context.Context, id ID) error
	// Fork snapshots a running or stopped instance and creates a new one where
	// each mapped repo is checked out on a new branch. opts.Repos names the full
	// repo set and each repo's destination primary branch.
	Fork(ctx context.Context, id ID, opts *ForkOptions) (ID, ConnectionInfo, error)
	// VNCPort returns the host port mapped to the runtime instance's VNC port.
	// Returns 0 when the instance has no display.
	VNCPort(ctx context.Context, id ID) int
	// Processes returns the list of running processes inside the runtime instance.
	Processes(ctx context.Context, id ID) ([]ProcessInfo, error)
	// Signal sends a signal to a process inside the runtime instance.
	Signal(ctx context.Context, id ID, pid int, sig string) error
}

Lifecycle manages runtime instance lifecycle operations.

type Metadata

type Metadata map[MetadataKey]string

Metadata stores runtime-neutral metadata for an instance.

Runtime adapters choose the backing store. mdruntime uses container labels; other adapters can use disk metadata, cloud tags, or a local registry.

type MetadataKey

type MetadataKey string

MetadataKey identifies a caic runtime metadata field.

const (
	MetadataTaskID            MetadataKey = "caic.id"
	MetadataLegacyTaskID      MetadataKey = "caic"
	MetadataHarness           MetadataKey = "caic.harness"
	MetadataLegacyHarness     MetadataKey = "harness"
	MetadataGitHubToken       MetadataKey = "caic.githubToken" //nolint:gosec // Metadata key for a boolean flag, not a credential.
	MetadataModelRefresh      MetadataKey = "caic.modelRefresh"
	MetadataDisplayCapability MetadataKey = "md.display"
	MetadataSmokeRun          MetadataKey = "caic.smoke_run"
)

Runtime metadata keys used to recognize and restore caic-managed instances.

type Monitor

type Monitor interface {
	// DiskUsage returns writable-layer sizes for the requested instances in one
	// batch. Missing entries have no available measurement.
	DiskUsage(ctx context.Context, ids []ID) (map[ID]int64, error)
	WatchStats(ctx context.Context, ids []ID) (iter.Seq2[StatsSample, error], error)
	WatchEvents(ctx context.Context, filter EventFilter) (iter.Seq2[Event, error], error)
}

Monitor reads resource usage and lifecycle events.

type Mount added in v0.10.0

type Mount struct {
	HostPath      string `json:"host_path"`
	ContainerPath string `json:"container_path"` // Resolved target path in the runtime container.
	ReadOnly      bool   `json:"read_only"`
}

Mount describes a host directory bind-mounted into a runtime.

Is serialized as task metadata to disk. Is not used for HTTP wire protocol.

type Name added in v0.11.0

type Name string

Name identifies a runtime backend, such as docker or podman.

type PrivilegeInfo

type PrivilegeInfo interface {
	SudoPassword(ctx context.Context, id ID) (string, error)
}

PrivilegeInfo reads privileged runtime instance credentials.

type ProcessInfo

type ProcessInfo struct {
	// PID is the process ID.
	PID int
	// PPID is the parent process ID.
	PPID int
	// PGRP is the process group ID.
	PGRP int
	// User is the effective user name.
	User string
	// State is the process state and modifiers reported by the runtime.
	State string
	// Priority is the kernel scheduling priority.
	Priority int
	// Nice is the process niceness value.
	Nice int
	// Threads is the number of threads in the process.
	Threads int
	// OpenFDs is the number of open file descriptors, or nil when unavailable.
	OpenFDs *int
	// CPU is the lifetime-average CPU percentage reported by ps (100% per core).
	CPU float64
	// Mem is the percentage of physical memory used at the time of inspection.
	Mem float64
	// RSSBytes is the resident set size in bytes.
	RSSBytes uint64
	// CPUTime is the cumulative user and system CPU time consumed by the process.
	CPUTime time.Duration
	// StartedAt is when the process started.
	StartedAt time.Time
	// Command is the full command line reported by the runtime.
	Command string
}

ProcessInfo describes a single process running inside a runtime instance.

type Repo

type Repo struct {
	GitRoot       string
	ContainerPath string
	Branch        string
	BaseBranch    string
	Remote        string
}

Repo describes a git repository available to a runtime instance.

type Repository added in v0.12.0

type Repository interface {
	TurnSnapshot(ctx context.Context, id ID, previous []FetchedBranch) ([]TurnRepository, error)
	Diff(ctx context.Context, id ID, repoIdx int, args ...string) (string, error)
	Fetch(ctx context.Context, id ID, opts FetchOpts) ([]FetchedBranch, error)
	// RefreshRefs copies cached upstream refs into the instance without moving
	// working branches or committing pending edits.
	RefreshRefs(ctx context.Context, id ID) error
	FileDiff(ctx context.Context, id ID, repoIdx int, commit, path, originalPath string) (string, error)
	RepositoryStatus(ctx context.Context, id ID, repoIdx int) (RepositoryStatus, error)
	// CompactRepositoryStatus returns the branch, divergence, working-tree
	// counts, operation, and branch-diff numstat of one repository without the
	// per-commit log, cheap enough for periodic activity-driven probes.
	CompactRepositoryStatus(ctx context.Context, id ID, repoIdx int) (RepositoryStatus, error)
}

Repository provides repository operations inside runtime instances.

type RepositoryOperation added in v0.12.0

type RepositoryOperation string

RepositoryOperation identifies an in-progress Git operation in a repository.

const (
	RepositoryOperationRebase     RepositoryOperation = "rebase"
	RepositoryOperationMerge      RepositoryOperation = "merge"
	RepositoryOperationCherryPick RepositoryOperation = "cherry-pick"
	RepositoryOperationRevert     RepositoryOperation = "revert"
	RepositoryOperationBisect     RepositoryOperation = "bisect"
)

RepositoryOperation values identify supported in-progress Git operations.

type RepositoryStatus added in v0.12.0

type RepositoryStatus struct {
	Branch      string
	Upstream    string
	Operation   RepositoryOperation
	Ahead       int
	Behind      int
	DiffStat    []GitFileStat
	Commits     []GitCommit
	Uncommitted []GitFileStatus
}

RepositoryStatus describes the checked-out branch and its changes relative to the host checkout's original tracking branch.

type Router added in v0.11.0

type Router struct {
	Runtimes []System
	ByName   map[Name]System
	// contains filtered or unexported fields
}

Router dispatches runtime operations to one of several runtime backends.

func NewRouter added in v0.11.0

func NewRouter(runtimes []System, rec metrics.Recorder) (*Router, error)

NewRouter creates a runtime router. A recorder is required; pass metrics.Nop{} to discard observations.

A router reports unavailable backends to its caller rather than logging them, so it holds no logger of its own.

func (*Router) CompactRepositoryStatus added in v0.13.0

func (r *Router) CompactRepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)

CompactRepositoryStatus returns the log-free repository status from the owning backend.

func (*Router) Connect added in v0.11.0

func (r *Router) Connect(ctx context.Context, id ID, opts *StartOptions) (conn ConnectionInfo, err error)

Connect waits for transport readiness on the selected backend.

func (*Router) Diff added in v0.11.0

func (r *Router) Diff(ctx context.Context, id ID, repoIdx int, args ...string) (out string, err error)

Diff returns a diff from the owning backend.

func (*Router) DiskUsage added in v0.12.0

func (r *Router) DiskUsage(ctx context.Context, ids []ID) (usage map[ID]int64, err error)

DiskUsage returns writable-layer sizes across the requested runtime instances. Each owning runtime receives one batched request.

func (*Router) Fetch added in v0.11.0

func (r *Router) Fetch(ctx context.Context, id ID, opts FetchOpts) (branches []FetchedBranch, err error)

Fetch fetches task repository changes from the owning backend and returns the exact branch tips observed.

func (*Router) FileDiff added in v0.12.0

func (r *Router) FileDiff(ctx context.Context, id ID, repoIdx int, commit, path, originalPath string) (out string, err error)

FileDiff returns one committed or uncommitted file patch from the owning backend.

func (*Router) FileSize added in v0.14.0

func (r *Router) FileSize(ctx context.Context, id ID, path string) (int64, error)

FileSize returns the current regular-file size from the owning runtime.

func (*Router) Fork added in v0.11.0

func (r *Router) Fork(ctx context.Context, id ID, opts *ForkOptions) (forkID ID, conn ConnectionInfo, err error)

Fork snapshots an instance on its owning backend. Cross-runtime forks are rejected.

func (*Router) Inspect added in v0.11.0

func (r *Router) Inspect(ctx context.Context, id ID) (info *InstanceInspect, err error)

Inspect returns observed runtime configuration for an instance.

func (*Router) Launch added in v0.11.0

func (r *Router) Launch(ctx context.Context, repos []Repo, opts *StartOptions) (id ID, err error)

Launch starts a runtime instance on the selected backend.

func (*Router) List added in v0.11.0

func (r *Router) List(ctx context.Context) (out []Instance, err error)

List returns known runtime instances from all inventory backends.

It tolerates a backend being unavailable. Instances from the runtimes that answered come back alongside an error naming the ones that did not, so a caller that can work with a partial inventory uses it and logs the error, while a caller that needs a complete one checks err. The result is nil only when no runtime answered at all, which lets a caller tell an unreadable inventory from an empty one.

func (*Router) Metadata added in v0.11.0

func (r *Router) Metadata(ctx context.Context, id ID, key MetadataKey) (value string, err error)

Metadata returns runtime metadata for an instance.

func (*Router) Processes added in v0.11.0

func (r *Router) Processes(ctx context.Context, id ID) (procs []ProcessInfo, err error)

Processes returns the process list for an instance.

func (*Router) Purge added in v0.11.0

func (r *Router) Purge(ctx context.Context, id ID) (err error)

Purge removes a runtime instance from its owning backend.

func (*Router) ReadDir added in v0.15.0

func (r *Router) ReadDir(ctx context.Context, id ID, path string) ([]DirEntry, bool, error)

ReadDir lists one runtime directory's immediate children.

func (*Router) ReadFile added in v0.14.0

func (r *Router) ReadFile(ctx context.Context, id ID, path string, offset, length int64) iter.Seq2[[]byte, error]

ReadFile streams regular file chunks from the owning runtime.

func (*Router) RefreshRefs added in v0.14.1

func (r *Router) RefreshRefs(ctx context.Context, id ID) (err error)

RefreshRefs copies cached upstream refs into the owning runtime instance.

func (*Router) RepositoryStatus added in v0.12.0

func (r *Router) RepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)

RepositoryStatus returns git branch, commit, and working-tree state from the owning backend. RepositoryStatus returns the repository status from the owning backend.

func (*Router) Revive added in v0.11.0

func (r *Router) Revive(ctx context.Context, id ID) (err error)

Revive restarts a stopped runtime instance on its owning backend.

func (*Router) Signal added in v0.11.0

func (r *Router) Signal(ctx context.Context, id ID, pid int, sig string) (err error)

Signal sends a signal to a process in an instance.

func (*Router) Stop added in v0.11.0

func (r *Router) Stop(ctx context.Context, id ID) (err error)

Stop gracefully stops a runtime instance on its owning backend.

func (*Router) SudoPassword added in v0.11.0

func (r *Router) SudoPassword(ctx context.Context, id ID) (password string, err error)

SudoPassword fetches a sudo password from an instance's owning backend.

func (*Router) TurnSnapshot added in v0.14.0

func (r *Router) TurnSnapshot(ctx context.Context, id ID, previous []FetchedBranch) (out []TurnRepository, err error)

TurnSnapshot fetches once and measures branch and turn changes on the owning backend.

func (*Router) VNCPort added in v0.11.0

func (r *Router) VNCPort(ctx context.Context, id ID) int

VNCPort returns the VNC port for an instance.

func (*Router) WatchEvents added in v0.11.0

func (r *Router) WatchEvents(ctx context.Context, filter EventFilter) (iter.Seq2[Event, error], error)

WatchEvents streams lifecycle events across all runtime backends.

func (*Router) WatchStats added in v0.11.0

func (r *Router) WatchStats(ctx context.Context, ids []ID) (iter.Seq2[StatsSample, error], error)

WatchStats streams stats across the requested runtime instances.

type StartOptions

type StartOptions struct {
	RuntimeName       Name
	Metadata          Metadata
	BaseImage         string
	ContainerPlatform string
	Harness           harness.Name
	Caches            []CacheMount
	Mounts            []Mount
	Tailscale         bool
	USB               bool
	Display           bool
	Sudo              bool
	// MaxCPUs limits the number of CPU cores the runtime instance may use.
	// Zero means use the runtime adapter default.
	MaxCPUs int
	// GitHubToken is the resolved GitHub token to inject into the runtime
	// environment. Empty means no token is injected.
	GitHubToken string
	// ExtraEnv contains additional KEY=VALUE pairs injected into the runtime
	// environment without being represented in runtime metadata.
	ExtraEnv []string
	// LogWriter receives provisioning log lines from the runtime backend.
	// Must not be nil.
	LogWriter io.Writer
}

StartOptions holds optional flags for runtime instance startup.

type Stats

type Stats struct {
	Ts          time.Time
	CPUPerc     float64  // 100% is one fully busy logical CPU.
	CPUCeiling  float64  // Configured upper bound in CPU units; zero when unknown. Excludes inherited limits and process affinity.
	CPUQuota    *float64 // Explicit quota in CPU units; zero is unrestricted, nil is unknown.
	RuntimeCPUs int      // Logical CPUs on the owning runtime; zero when unknown.
	CPUError    string   // Runtime CPU metadata observation failure.
	MemUsed     uint64
	MemLimit    uint64
	MemPerc     float64
	NetRx       uint64
	NetTx       uint64
	BlockRead   uint64
	BlockWrite  uint64
	DiskUsed    int64
}

Stats is a snapshot of runtime resource usage.

type StatsSample added in v0.10.2

type StatsSample struct {
	InstanceID ID
	Stats      Stats
}

StatsSample is a streamed runtime resource usage snapshot for one instance.

type System added in v0.11.0

type System interface {
	Name() Name
	Lifecycle
	Files
	Repository
	Monitor
	Inventory
	PrivilegeInfo
}

System provides all runtime capabilities used by the application.

type TurnRepository added in v0.14.0

type TurnRepository struct {
	RepoIndex int
	Status    RepositoryStatus
	Branches  []FetchedBranch
	TurnDiff  []GitFileStat
	StatusErr error
}

TurnRepository contains one fetched repository's branch summary and committed turn delta. StatusErr leaves the previous live summary in place; fetched branches remain usable. A nil TurnDiff means the previous tip was absent or could not be compared.

Directories

Path Synopsis
Package runtimetest provides shared test doubles for the runtime package's interfaces, reusable by any package that depends on a runtime seam.
Package runtimetest provides shared test doubles for the runtime package's interfaces, reusable by any package that depends on a runtime seam.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL