config

package
v0.1.35 Latest Latest
Warning

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

Go to latest
Published: Sep 2, 2026 License: Apache-2.0 Imports: 7 Imported by: 1

Documentation

Overview

Package config defines executor-level defaults and tuning knobs.

This includes model/embedder defaults, runtime/storage paths, tool and agent auto-selection defaults, match/resource defaults, and timeout-related settings used by runtime composition.

Index

Constants

View Source
const ToolExecutionProtectionModeAtMostOnce = "atMostOnce"

Variables

This section is empty.

Functions

func CanonicalProtectedToolName added in v0.1.23

func CanonicalProtectedToolName(raw string) (string, error)

CanonicalProtectedToolName applies canonicalization without accepting selectors or wildcard tool identities.

Types

type AgentAutoSelectionDefaults

type AgentAutoSelectionDefaults struct {
	// Model is the model used for routing decisions. When empty, runtime falls back
	// to the conversation default model or Defaults.Model.
	Model string `yaml:"model,omitempty" json:"model,omitempty"`
	// Prompt optionally overrides the default system prompt used by the router.
	// The prompt MUST instruct the LLM to output one of:
	//   {"action":"route","agentId":"<id>"}
	//   {"action":"answer","text":"<capability answer>"}
	//   {"action":"clarify","question":"<clarification>"}
	// (See `agentRouterSystemPrompt` for the built-in default.)
	//
	// Capability detection is the LLM's responsibility, not a pattern-match
	// heuristic — `action: "answer"` is how the router signals "this is a
	// workspace-capability question; here is the answer directly." This
	// eliminates the prior hardcoded `isCapabilityDiscoveryQuery` shortcut
	// and unifies the auto-selection intake into a single LLM call.
	Prompt string `yaml:"prompt,omitempty" json:"prompt,omitempty"`
	// OutputKey controls the JSON field name the classifier should output.
	// Examples: "agentId" (default), "agent_id".
	OutputKey string `yaml:"outputKey,omitempty" json:"outputKey,omitempty"`
	// TimeoutSec caps how long agent auto-selection classification may run.
	// When zero, runtime applies a conservative default.
	TimeoutSec int `yaml:"timeoutSec,omitempty" json:"timeoutSec,omitempty"`
}

AgentAutoSelectionDefaults controls the LLM-based agent classifier used for auto routing.

type AsyncDefaults added in v0.1.8

type AsyncDefaults = wsconfig.WorkspaceConfig

AsyncDefaults carries operator-tunable async defaults. It is a thin alias over wsconfig.WorkspaceConfig so that the workspace YAML (`default.async.*`) is decoded directly into the same struct the bootstrap passes to `Apply` — no duplicated shape, single source of truth.

type Defaults

type Defaults struct {
	AppName    string
	AppIconRef string
	Model      string
	Embedder   string
	Agent      string
	Skills     SkillsDefaults    `yaml:"skills,omitempty" json:"skills,omitempty"`
	Reporting  ReportingDefaults `yaml:"reporting,omitempty" json:"reporting,omitempty"`
	// RuntimeRoot allows separating runtime state (db, snapshots, indexes) from the workspace.
	// Supports ${workspaceRoot}. When empty, defaults to ${workspaceRoot}.
	RuntimeRoot string `yaml:"runtimeRoot,omitempty" json:"runtimeRoot,omitempty"`
	// StatePath overrides the runtime state root (used by cookies/tokens).
	// Supports ${workspaceRoot} and ${runtimeRoot}. When empty, defaults to ${runtimeRoot}/state.
	StatePath string `yaml:"statePath,omitempty" json:"statePath,omitempty"`
	// DBPath overrides the SQLite database file path when AGENTLY_DB_* is not set.
	// Supports ${workspaceRoot} and ${runtimeRoot}. When empty, defaults to ${runtimeRoot}/db/agently.db.
	DBPath string `yaml:"dbPath,omitempty" json:"dbPath,omitempty"`

	// ---- Agent routing defaults (optional) -------------------------
	// When Agent == "auto", the runtime may use these settings to pick a concrete
	// agent for the turn using an LLM-based classifier.
	AgentAutoSelection AgentAutoSelectionDefaults `yaml:"agentAutoSelection,omitempty" json:"agentAutoSelection,omitempty"`

	// ---- Tool routing defaults (optional) --------------------------
	// When enabled, the runtime may select tool bundles for the turn based on the
	// user request when the caller did not explicitly provide tools/bundles.
	ToolAutoSelection ToolAutoSelectionDefaults `yaml:"toolAutoSelection,omitempty" json:"toolAutoSelection,omitempty"`
	// ToolApproval defines global runtime tool execution approval behavior.
	// Applies when callers do not supply per-request tool allow-list overrides.
	ToolApproval ToolApprovalDefaults `yaml:"toolApproval,omitempty" json:"toolApproval,omitempty"`

	// ---- Conversation summary defaults (optional) -------------------
	// When empty the runtime falls back to hard-coded defaults.
	SummaryModel  string `yaml:"summaryModel" json:"summaryModel"`
	SummaryPrompt string `yaml:"summaryPrompt" json:"summaryPrompt"`
	SummaryLastN  int    `yaml:"summaryLastN" json:"summaryLastN"`
	// CapabilityPrompt overrides the system prompt used for capability discovery responses.
	CapabilityPrompt string `yaml:"capabilityPrompt" json:"capabilityPrompt"`

	// ---- Tool-call result controls (grouped) ---------------------
	PreviewSettings PreviewSettings `yaml:"previewSettings" json:"previewSettings"`

	// ---- Prompt-history projection -------------------------------
	Projection Projection `yaml:"projection,omitempty" json:"projection,omitempty"`

	ToolCallMaxResults int `yaml:"toolCallMaxResults" json:"toolCallMaxResults"`

	// ---- Execution timeouts -------------------------------------
	// ToolCallTimeoutSec sets the default per-tool execution timeout in seconds.
	// When zero or missing, runtime falls back to a built-in default.
	ToolCallTimeoutSec int `yaml:"toolCallTimeoutSec,omitempty" json:"toolCallTimeoutSec,omitempty"`
	// ElicitationTimeoutSec caps how long the agent waits for an elicitation
	// (assistant- or tool-originated) before auto-declining. When zero, no
	// special timeout is applied (waits until the turn/request is canceled).
	ElicitationTimeoutSec int `yaml:"elicitationTimeoutSec,omitempty" json:"elicitationTimeoutSec,omitempty"`

	// ToolExecutionProtection is a default-disabled exact-tool at-most-once guard.
	ToolExecutionProtection ToolExecutionProtectionDefaults `yaml:"toolExecutionProtection,omitempty" json:"toolExecutionProtection,omitempty"`

	// ---- Match defaults (optional) -------------------------------
	Match MatchDefaults `yaml:"match" json:"match"`

	// ---- Resources defaults (optional) ---------------------------
	Resources ResourcesDefaults `yaml:"resources,omitempty" json:"resources,omitempty"`

	// ---- Async defaults (optional) -------------------------------
	// Operator-tunable GC cadence and narrator LLM timeout for the
	// async subsystem. Empty / absent → built-in package defaults
	// remain in effect. Applied at bootstrap via wsconfig.Apply.
	Async *AsyncDefaults `yaml:"async,omitempty" json:"async,omitempty"`
	// contains filtered or unexported fields
}

func (*Defaults) HasToolExecutionProtection added in v0.1.23

func (d *Defaults) HasToolExecutionProtection() bool

HasToolExecutionProtection reports whether workspace YAML explicitly supplied the section, including enabled: false.

func (*Defaults) UnmarshalYAML

func (d *Defaults) UnmarshalYAML(value *yaml.Node) error

UnmarshalYAML supports both the current and legacy router keys: - agentAutoSelection (preferred), agentRouter (legacy) - toolAutoSelection (preferred), toolRouter (legacy)

type MatchDefaults

type MatchDefaults struct {
	// MaxFiles is the default per-location cap used by auto/full decision
	// when a knowledge/MCP entry does not specify MaxFiles. When zero,
	// the runtime falls back to hard-coded default (5).
	MaxFiles int `yaml:"maxFiles" json:"maxFiles"`
}

MatchDefaults groups retrieval/matching defaults

type PreviewSettings

type PreviewSettings struct {
	Limit int `yaml:"limit" json:"limit"`

	AgedLimit int `yaml:"agedLimit" json:"agedLimit"`

	// ToolResultLimit optionally caps preview size specifically for tool-result
	// messages. When zero or negative, the general Limit/AgedLimit rules apply.
	ToolResultLimit int `yaml:"toolResultLimit,omitempty" json:"toolResultLimit,omitempty"`

	// How far back until we switch the UI to an aged preview.
	AgedAfterSteps int `yaml:"agedAfterSteps" json:"agedAfterSteps"`

	SummarizeChunk int    `yaml:"summarizeChunk" json:"summarizeChunk"`
	MatchChunk     int    `yaml:"matchChunk" json:"matchChunk"`
	SummaryModel   string `yaml:"summaryModel" json:"summaryModel"`
	EmbeddingModel string `yaml:"embeddingModel" json:"embeddingModel"`
	// Optional system guide document (path or URL) injected when overflow occurs.
	SystemGuidePath string `yaml:"systemGuidePath" json:"systemGuidePath"`
	// SummaryThresholdBytes controls when message:summarize is
	// exposed for overflowed messages. When zero or negative, any
	// overflowed message may use summarize.
	SummaryThresholdBytes int `yaml:"summaryThresholdBytes,omitempty" json:"summaryThresholdBytes,omitempty"`
}

PreviewSettings groups tool-call result presentation and processing settings.

type Projection added in v0.1.7

type Projection struct {
	Relevance            *RelevanceProjection  `yaml:"relevance,omitempty" json:"relevance,omitempty"`
	ToolCallSupersession *ToolCallSupersession `yaml:"toolCallSupersession,omitempty" json:"toolCallSupersession,omitempty"`
}

Projection groups prompt-history projection settings.

func (*Projection) IsSupersessionEnabled added in v0.1.7

func (p *Projection) IsSupersessionEnabled() bool

IsSupersessionEnabled returns whether tool-call supersession is active.

func (*Projection) SupersessionHistoryLimit added in v0.1.7

func (p *Projection) SupersessionHistoryLimit() int

SupersessionHistoryLimit returns the per-key limit for prior turns.

func (*Projection) SupersessionTurnLimit added in v0.1.7

func (p *Projection) SupersessionTurnLimit() int

SupersessionTurnLimit returns the per-key limit for the current turn.

type RelevanceProjection added in v0.1.7

type RelevanceProjection struct {
	Enabled              *bool           `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	ProtectedRecentTurns *int            `yaml:"protectedRecentTurns,omitempty" json:"protectedRecentTurns,omitempty"`
	TokenThreshold       *int            `yaml:"tokenThreshold,omitempty" json:"tokenThreshold,omitempty"`
	ChunkSize            *int            `yaml:"chunkSize,omitempty" json:"chunkSize,omitempty"`
	MaxConcurrency       *int            `yaml:"maxConcurrency,omitempty" json:"maxConcurrency,omitempty"`
	Model                *string         `yaml:"model,omitempty" json:"model,omitempty"`
	Prompt               *binding.Prompt `yaml:"prompt,omitempty" json:"prompt,omitempty"`
}

RelevanceProjection controls optional selector-based hiding of irrelevant prior turns before prompt-history construction.

func (*RelevanceProjection) Chunk added in v0.1.7

func (r *RelevanceProjection) Chunk() int

Chunk returns the candidate chunk size for concurrent selector runs. Default: 0 (no chunking).

func (*RelevanceProjection) Concurrency added in v0.1.7

func (r *RelevanceProjection) Concurrency() int

Concurrency returns the maximum concurrent selector calls for chunked relevance projection. Default: 1.

func (*RelevanceProjection) IsEnabled added in v0.1.7

func (r *RelevanceProjection) IsEnabled() bool

IsEnabled reports whether relevance projection is enabled. Default: true.

func (*RelevanceProjection) ProtectedTurns added in v0.1.7

func (r *RelevanceProjection) ProtectedTurns() int

ProtectedTurns returns the protected recent-tail size. Default: 1.

func (*RelevanceProjection) Threshold added in v0.1.7

func (r *RelevanceProjection) Threshold() int

Threshold returns the approximate token threshold that must be exceeded before selector-based relevance projection runs. Default: 20000.

type ReportingDefaults added in v0.1.14

type ReportingDefaults struct {
	Enabled            bool                                `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	QueueIntervalMs    int                                 `yaml:"queueIntervalMs,omitempty" json:"queueIntervalMs,omitempty"`
	QueueBatchLimit    int                                 `yaml:"queueBatchLimit,omitempty" json:"queueBatchLimit,omitempty"`
	Store              ReportingStoreDefaults              `yaml:"store,omitempty" json:"store,omitempty"`
	TransitionalWithUI ReportingTransitionalWithUIDefaults `yaml:"transitionalWithUI,omitempty" json:"transitionalWithUI,omitempty"`
}

func (ReportingDefaults) BrowserRunPersistenceEnabled added in v0.1.23

func (r ReportingDefaults) BrowserRunPersistenceEnabled() bool

func (ReportingDefaults) ConversationAdoptionEnabled added in v0.1.23

func (r ReportingDefaults) ConversationAdoptionEnabled() bool

func (ReportingDefaults) ExportFromRunEnabled added in v0.1.23

func (r ReportingDefaults) ExportFromRunEnabled() bool

func (ReportingDefaults) OrchestrationEnabled added in v0.1.23

func (r ReportingDefaults) OrchestrationEnabled() bool

OrchestrationEnabled reports whether the transitional hosted run/export continuation is explicitly enabled with its durable prerequisites.

func (ReportingDefaults) ValidateOrchestrationPrerequisites added in v0.1.23

func (r ReportingDefaults) ValidateOrchestrationPrerequisites() error

ValidateOrchestrationPrerequisites validates only an explicitly requested orchestration mode. Disabled and unknown values preserve existing behavior.

type ReportingStoreDefaults added in v0.1.17

type ReportingStoreDefaults struct {
	Backend      string `yaml:"backend,omitempty" json:"backend,omitempty"`
	ConnectorRef string `yaml:"connectorRef,omitempty" json:"connectorRef,omitempty"`
}

type ReportingTransitionalWithUIDefaults added in v0.1.23

type ReportingTransitionalWithUIDefaults struct {
	Admission            string `yaml:"admission,omitempty" json:"admission,omitempty"`
	Persistence          string `yaml:"persistence,omitempty" json:"persistence,omitempty"`
	ExportFromRun        string `yaml:"exportFromRun,omitempty" json:"exportFromRun,omitempty"`
	Orchestration        string `yaml:"orchestration,omitempty" json:"orchestration,omitempty"`
	ConversationAdoption string `yaml:"conversationAdoption,omitempty" json:"conversationAdoption,omitempty"`
}

type ResourceRoot

type ResourceRoot struct {
	ID          string `yaml:"id,omitempty" json:"id,omitempty"`
	URI         string `yaml:"uri,omitempty" json:"uri,omitempty"`
	UpstreamRef string `yaml:"upstreamRef,omitempty" json:"upstreamRef,omitempty"`
	SyncEnabled *bool  `yaml:"syncEnabled,omitempty" json:"syncEnabled,omitempty"`
	MinInterval int    `yaml:"minIntervalSeconds,omitempty" json:"minIntervalSeconds,omitempty"`
	Batch       int    `yaml:"batch,omitempty" json:"batch,omitempty"`
	Shadow      string `yaml:"shadow,omitempty" json:"shadow,omitempty"`
	Force       *bool  `yaml:"force,omitempty" json:"force,omitempty"`
}

ResourceRoot defines a non-MCP resource root with optional upstream binding.

type ResourceUpstream

type ResourceUpstream struct {
	Name               string `yaml:"name,omitempty" json:"name,omitempty"`
	Driver             string `yaml:"driver,omitempty" json:"driver,omitempty"`
	DSN                string `yaml:"dsn,omitempty" json:"dsn,omitempty"`
	Shadow             string `yaml:"shadow,omitempty" json:"shadow,omitempty"`
	Batch              int    `yaml:"batch,omitempty" json:"batch,omitempty"`
	Force              bool   `yaml:"force,omitempty" json:"force,omitempty"`
	Enabled            *bool  `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	MinIntervalSeconds int    `yaml:"minIntervalSeconds,omitempty" json:"minIntervalSeconds,omitempty"`
}

ResourceUpstream defines an upstream database used for local resource sync.

type ResourceUpstreamStore

type ResourceUpstreamStore struct {
	Driver             string `yaml:"driver,omitempty" json:"driver,omitempty"`
	DSN                string `yaml:"dsn,omitempty" json:"dsn,omitempty"`
	Shadow             string `yaml:"shadow,omitempty" json:"shadow,omitempty"`
	Batch              int    `yaml:"batch,omitempty" json:"batch,omitempty"`
	Force              bool   `yaml:"force,omitempty" json:"force,omitempty"`
	MinIntervalSeconds int    `yaml:"minIntervalSeconds,omitempty" json:"minIntervalSeconds,omitempty"`
}

ResourceUpstreamStore defines a default upstream used when no upstreamRef is set.

type ResourcesDefaults

type ResourcesDefaults struct {
	// Locations are root URIs or paths (relative to workspace) such as
	// "documents/", "file:///abs/path", or "mcp:server:/prefix".
	Locations []string `yaml:"locations,omitempty" json:"locations,omitempty"`
	// Roots define resource roots with optional upstream bindings for local/workspace locations.
	Roots []ResourceRoot `yaml:"roots,omitempty" json:"roots,omitempty"`
	// Upstreams define upstream databases for local/workspace resource sync.
	Upstreams []ResourceUpstream `yaml:"upstreams,omitempty" json:"upstreams,omitempty"`
	// UpstreamStore defines the default upstream used when roots omit upstreamRef.
	UpstreamStore *ResourceUpstreamStore `yaml:"upstreamStore,omitempty" json:"upstreamStore,omitempty"`
	// IndexPath controls where Embedius stores local indexes. Supports
	// ${workspaceRoot} and ${user} macros. If empty, defaults to
	// ${workspaceRoot}/index/${user}.
	IndexPath string `yaml:"indexPath,omitempty" json:"indexPath,omitempty"`
	// SnapshotPath controls where MCP snapshot caches are stored. Supports
	// ${workspaceRoot} and ${user} macros. If empty, defaults to
	// ${workspaceRoot}/snapshots.
	SnapshotPath string `yaml:"snapshotPath,omitempty" json:"snapshotPath,omitempty"`
	// TrimPath optionally trims this prefix from presented URIs.
	TrimPath string `yaml:"trimPath,omitempty" json:"trimPath,omitempty"`
	// SummaryFiles lookup order for root descriptions.
	SummaryFiles []string `yaml:"summaryFiles,omitempty" json:"summaryFiles,omitempty"`
	// DescribeMCP enables MCP description fetches for resources.roots when
	// no description is provided by config/metadata.
	DescribeMCP bool `yaml:"describeMCP,omitempty" json:"describeMCP,omitempty"`
	// UpstreamSyncConcurrency controls parallel root syncs for MCP upstreams.
	UpstreamSyncConcurrency int `yaml:"upstreamSyncConcurrency,omitempty" json:"upstreamSyncConcurrency,omitempty"`
	// MatchConcurrency controls parallel match execution across roots.
	MatchConcurrency int `yaml:"matchConcurrency,omitempty" json:"matchConcurrency,omitempty"`
	// IndexAsync enables background indexing for resource matches.
	IndexAsync *bool `yaml:"indexAsync,omitempty" json:"indexAsync,omitempty"`
}

ResourcesDefaults defines default resource roots and presentation hints.

type SkillsDefaults added in v0.1.8

type SkillsDefaults struct {
	Roots []string `yaml:"roots,omitempty" json:"roots,omitempty"`
	Model string   `yaml:"model,omitempty" json:"model,omitempty"`
}

type SupersessionLimit added in v0.1.7

type SupersessionLimit struct {
	// History is the max matching results per key across all prior turns
	// T(LastCheckpoint)..T(N-1). Default: 1 (only the newest survives).
	History *int `yaml:"history,omitempty" json:"history,omitempty"`
	// Turn is the max matching results per key within the current turn TN.
	// Default: 2 (keep last 2, suppress K-2 earliest).
	Turn *int `yaml:"turn,omitempty" json:"turn,omitempty"`
}

SupersessionLimit specifies per-scope retention caps.

type ToolApprovalDefaults

type ToolApprovalDefaults struct {
	// Mode: auto | ask | deny | best_path
	Mode string `yaml:"mode,omitempty" json:"mode,omitempty"`
	// AllowList optionally constrains executable tools to this set.
	AllowList []string `yaml:"allowList,omitempty" json:"allowList,omitempty"`
	// BlockList blocks specific tool names regardless of mode.
	BlockList []string `yaml:"blockList,omitempty" json:"blockList,omitempty"`
}

ToolApprovalDefaults defines global tool approval behavior.

type ToolAutoSelectionDefaults

type ToolAutoSelectionDefaults struct {
	// Enabled turns on auto tool selection when the caller did not specify tools.
	Enabled bool `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	// Model is the model used for routing decisions. When empty, runtime falls back
	// to the conversation default model or Defaults.Model.
	Model string `yaml:"model,omitempty" json:"model,omitempty"`
	// Prompt optionally overrides the default system prompt used by the router.
	Prompt string `yaml:"prompt,omitempty" json:"prompt,omitempty"`
	// OutputKey controls the JSON field name the classifier should output.
	// Example: "toolBundles" (default).
	OutputKey string `yaml:"outputKey,omitempty" json:"outputKey,omitempty"`
	// MaxBundles caps the number of bundles the router may select.
	// When zero, a small default is applied.
	MaxBundles int `yaml:"maxBundles,omitempty" json:"maxBundles,omitempty"`
	// TimeoutSec caps how long tool auto-selection classification may run.
	// When zero, runtime applies a conservative default.
	TimeoutSec int `yaml:"timeoutSec,omitempty" json:"timeoutSec,omitempty"`
}

ToolAutoSelectionDefaults controls the optional tool bundle selector.

type ToolCallSupersession added in v0.1.7

type ToolCallSupersession struct {
	// Enabled controls whether supersession is applied. Default: true.
	Enabled *bool `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	// Limit controls how many matching results per supersession key are
	// retained in each scope.
	Limit *SupersessionLimit `yaml:"limit,omitempty" json:"limit,omitempty"`
}

ToolCallSupersession controls how repeated cacheable tool outputs are superseded during prompt-history construction.

type ToolExecutionProtectionDefaults added in v0.1.23

type ToolExecutionProtectionDefaults struct {
	Enabled bool                          `yaml:"enabled,omitempty" json:"enabled,omitempty"`
	Rules   []ToolExecutionProtectionRule `yaml:"rules,omitempty" json:"rules,omitempty"`
}

ToolExecutionProtectionDefaults configures the default-disabled durable pre-dispatch guard for exact tool identities.

func (*ToolExecutionProtectionDefaults) UnmarshalYAML added in v0.1.23

func (c *ToolExecutionProtectionDefaults) UnmarshalYAML(value *yaml.Node) error

func (ToolExecutionProtectionDefaults) Validate added in v0.1.23

Validate enforces the enabled protection contract without touching a DAO.

type ToolExecutionProtectionRule added in v0.1.23

type ToolExecutionProtectionRule struct {
	ID                string                          `yaml:"id" json:"id"`
	Tool              string                          `yaml:"tool" json:"tool"`
	Mode              string                          `yaml:"mode" json:"mode"`
	SemanticArguments *ToolExecutionSemanticArguments `yaml:"semanticArguments,omitempty" json:"semanticArguments,omitempty"`
}

ToolExecutionProtectionRule protects one exact canonical tool identity.

func (*ToolExecutionProtectionRule) UnmarshalYAML added in v0.1.23

func (r *ToolExecutionProtectionRule) UnmarshalYAML(value *yaml.Node) error

type ToolExecutionSemanticArguments added in v0.1.23

type ToolExecutionSemanticArguments struct {
	Fields        []string `yaml:"fields,omitempty" json:"fields,omitempty"`
	ExcludeFields []string `yaml:"excludeFields,omitempty" json:"excludeFields,omitempty"`
}

ToolExecutionSemanticArguments selects present top-level provider arguments. A nil Fields slice means all arguments; a non-nil empty slice is invalid.

func (*ToolExecutionSemanticArguments) UnmarshalYAML added in v0.1.23

func (s *ToolExecutionSemanticArguments) UnmarshalYAML(value *yaml.Node) error

Jump to

Keyboard shortcuts

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