Documentation
ΒΆ
Overview ΒΆ
Package odek is a minimal Go agent loop runtime.
odek implements the ReAct (Reasoning + Acting) pattern β the "think, therefore act" loop that powers autonomous AI agents. It is not a framework or an SDK. It is a runtime: one loop, one binary, minimal deps.
Design ΒΆ
- Minimal external dependencies. stdlib + a few focused packages.
- Session isolation via Docker containers (--sandbox).
- LLM-agnostic. Any OpenAI-compatible endpoint works.
- Tool-first. Tools are the only extension point.
Security ΒΆ
When running with --sandbox, each session executes in a fresh Docker container. The container has no network access, no host mounts beyond the working directory, and is destroyed on exit. The agent can never access files outside its working directory.
Index ΒΆ
- Constants
- Variables
- func BuildRuntimeContext(platform string) string
- func LoadProjectFile() string
- func ProfileLabel(model string) string
- type Agent
- func (a *Agent) Close() error
- func (a *Agent) EmitEvent(ev events.Event)
- func (a *Agent) Memory() *memory.MemoryManager
- func (a *Agent) Run(ctx context.Context, task string) (string, error)
- func (a *Agent) RunID() string
- func (a *Agent) RunWithMessages(ctx context.Context, messages []llm.Message) (string, []llm.Message, error)
- func (a *Agent) SetEventSessionID(id string)
- func (a *Agent) SetMessagesPersistCallback(cb loop.MessagesPersistCallback)
- func (a *Agent) SkillManager() *skills.SkillManager
- func (a *Agent) SwitchModel(model string)
- func (a *Agent) SwitchThinking(thinking string)
- func (a *Agent) TotalCacheCreationTokens() int
- func (a *Agent) TotalCacheReadTokens() int
- func (a *Agent) TotalCachedTokens() int
- func (a *Agent) TotalInputTokens() int
- func (a *Agent) TotalOutputTokens() int
- type Config
- type ModelProfile
- type Tool
- type ToolFilterConfig
Constants ΒΆ
const ProjectFileName = "AGENTS.md"
ProjectFileName is the name of the project-level instructions file that odek automatically loads from the working directory.
Variables ΒΆ
var KnownProfiles = []struct { Prefix string Profile ModelProfile }{ { Prefix: "glm-5.3", Profile: ModelProfile{ Label: "GLM 5.3 (Z.ai)", Timeout: 300, MaxContext: 1_000_000, }, }, { Prefix: "glm-5.2", Profile: ModelProfile{ Label: "GLM 5.2 (Z.ai)", Timeout: 300, MaxContext: 1_000_000, }, }, { Prefix: "glm-5-turbo", Profile: ModelProfile{ Label: "GLM 5 Turbo (Z.ai)", Timeout: 180, MaxContext: 200_000, }, }, { Prefix: "glm-", Profile: ModelProfile{ Label: "GLM (Z.ai)", Timeout: 180, MaxContext: 131_072, }, }, { Prefix: "kimi-", Profile: ModelProfile{ Label: "Kimi", Timeout: 300, MaxContext: 262_144, }, }, { Prefix: "k3-256k", Profile: ModelProfile{ Label: "Kimi", Timeout: 300, MaxContext: 262_144, }, }, { Prefix: "k3", Profile: ModelProfile{ Label: "Kimi", Timeout: 300, MaxContext: 1_000_000, }, }, { Prefix: "deepseek-v4-pro", Profile: ModelProfile{ Label: "DeepSeek v4 Pro", DefaultThinking: "enabled", Timeout: 180, MaxContext: 1_000_000, }, }, { Prefix: "deepseek-v4-flash", Profile: ModelProfile{ Label: "DeepSeek v4 Flash", DefaultThinking: "", Timeout: 90, MaxContext: 131_072, }, }, { Prefix: "deepseek-", Profile: ModelProfile{ Label: "DeepSeek (generic)", MaxContext: 131_072, }, }, }
KnownProfiles lists all built-in model profiles. Each entry is matched by longest prefix β "deepseek-v4-flash" matches before "deepseek-" would. Add new profiles here; the rest of odek consumes them automatically.
Functions ΒΆ
func BuildRuntimeContext ΒΆ
BuildRuntimeContext returns a system prompt header with OS, hostname, working directory, current date/time, and platform-specific formatting rules for the given transport (platform). platform can be "telegram", "terminal", "web", or empty for generic.
This context eliminates the need for the agent to run shell commands to discover its own environment β the most common waste of tokens in CLI agent usage.
func LoadProjectFile ΒΆ
func LoadProjectFile() string
LoadProjectFile reads ProjectFileName from the current working directory. Returns the file content (trimmed) if it exists and is readable. Returns empty string if the file doesn't exist or can't be read. Checks for symlinks to prevent following attacker-controlled paths. The content is intended to be appended to the system message with a clear header β use it for project conventions, architecture notes, etc.
func ProfileLabel ΒΆ
ProfileLabel returns the human-readable label for a model, or the model name itself if no profile matches. Used in CLI headers and status output.
Types ΒΆ
type Agent ΒΆ
type Agent struct {
// contains filtered or unexported fields
}
Agent is the agent loop runtime.
func New ΒΆ
New creates a new Agent with the given configuration.
If Config.SandboxCleanup is set, the cleanup function is called when Close() is invoked. The caller is responsible for creating the sandbox container and wiring up tool executables to use it before calling New().
func (*Agent) Close ΒΆ
Close cleans up resources. If a sandbox container was created, it is destroyed. Always call Close() when done with the agent.
Close first drains background memory work with a bounded wait: session-end episode extraction and consolidation run on tracked goroutines (see MemoryManager.RunBackground) and would otherwise be silently killed when the CLI process exits right after a run. This is the single choke point every CLI path reaches via `defer agent.Close()` (run, continue, REPL, serve, telegram), so the drain lives here rather than at each call site.
func (*Agent) EmitEvent ΒΆ added in v1.24.0
EmitEvent emits a caller-originated runtime event (e.g. session_saved from the session persistence layer, budget_exceeded from budget enforcement) through the same non-blocking, run-scoped pipeline as engine events. No-op when no EventHandler is configured.
func (*Agent) Memory ΒΆ
func (a *Agent) Memory() *memory.MemoryManager
Memory returns the agent's memory manager. Used by the CLI layer to append buffer entries after each turn and signal session end. Returns nil if memory is disabled.
func (*Agent) RunID ΒΆ added in v1.24.0
RunID returns the random identifier stamped on every runtime event of this agent's run, or "" when no EventHandler is configured.
func (*Agent) RunWithMessages ΒΆ
func (a *Agent) RunWithMessages(ctx context.Context, messages []llm.Message) (string, []llm.Message, error)
RunWithMessages executes the agent loop starting from a pre-built message history. Use this for multi-turn conversations where the full conversation context (system prompt, prior turns) has been loaded from a session file and the new user message appended.
Returns the final answer plus the complete updated message history. The caller should persist the history (e.g. to a session file) so the conversation can be continued in a future call.
func (*Agent) SetEventSessionID ΒΆ added in v1.24.0
SetEventSessionID stamps the session identifier on subsequent runtime events. Call it as soon as the session ID is known (events emitted earlier simply carry no session_id). No-op when no EventHandler is configured.
func (*Agent) SetMessagesPersistCallback ΒΆ added in v1.19.0
func (a *Agent) SetMessagesPersistCallback(cb loop.MessagesPersistCallback)
SetMessagesPersistCallback registers a callback the loop fires after each completed step β once a tool batch's result messages are appended, and again after the final assistant message β with a copy of the current message history. Callers use it to persist per-turn progress so an interrupted run (Ctrl-C, SIGTERM, crash) can be resumed from the last completed step. Safe to call between RunWithMessages calls.
func (*Agent) SkillManager ΒΆ
func (a *Agent) SkillManager() *skills.SkillManager
SkillManager returns the agent's skill manager. Used by the CLI, WebUI, and Telegram layers to run learning heuristics after agent completion. Returns nil if skills are disabled.
func (*Agent) SwitchModel ΒΆ
SwitchModel updates the LLM model used by this agent at runtime. The model string must be a valid OpenAI-compatible model identifier. This is safe to call between RunWithMessages calls to switch models mid-session. Empty strings are silently ignored.
func (*Agent) SwitchThinking ΒΆ added in v1.0.0
SwitchThinking updates the reasoning/thinking mode used by this agent at runtime. Accepts the same values as Config.Thinking: "enabled", "disabled", "low", "medium", "high", or "" (provider default / off). Safe to call between RunWithMessages calls to toggle thinking per-query.
func (*Agent) TotalCacheCreationTokens ΒΆ
TotalCacheCreationTokens returns the cumulative Anthropic cache creation tokens across all iterations of the most recent run.
func (*Agent) TotalCacheReadTokens ΒΆ
TotalCacheReadTokens returns the cumulative Anthropic cache read tokens across all iterations of the most recent run.
func (*Agent) TotalCachedTokens ΒΆ
TotalCachedTokens returns the cumulative OpenAI cached prompt tokens across all iterations of the most recent run.
func (*Agent) TotalInputTokens ΒΆ
TotalInputTokens returns the cumulative prompt tokens consumed across all iterations of the most recent RunWithMessages call.
func (*Agent) TotalOutputTokens ΒΆ
TotalOutputTokens returns the cumulative completion tokens generated across all iterations of the most recent RunWithMessages call.
type Config ΒΆ
type Config struct {
// Model is the LLM model identifier (e.g., "deepseek-v4-flash").
Model string
// BaseURL is the OpenAI-compatible API endpoint.
// Default: "https://api.deepseek.com/v1"
BaseURL string
// APIKey authenticates with the LLM provider.
// Falls back to DEEPSEEK_API_KEY, then OPENAI_API_KEY env vars.
APIKey string
// Thinking controls the model's reasoning depth. Provider-specific:
//
// Deepseek: "enabled" or "disabled" β {"type": "enabled"}
// OpenAI o-series: "low", "medium", "high" β {"reasoning_effort": "low"}
//
// When empty, the model's profile default is used. If the profile also
// has no default, the field is not sent (provider default behavior).
Thinking string
// Temperature controls LLM output randomness (0.0β2.0).
// Negative = omit from request (use provider default).
// 0.0 = deterministic, 1.0 = creative. Default: 0.0 for benchmark
// stability; set to -1 to use provider defaults.
Temperature float64
// ThinkingBudget is the maximum thinking tokens for Anthropic extended thinking (default 5000).
ThinkingBudget int
// Tools available to the agent.
Tools []Tool
// ToolFilter controls which auto-registered tools are exposed to the LLM
// (for example the memory tool when a MemoryManager is provided). It is
// not applied to caller-supplied Tools; callers are responsible for
// filtering their own tool slices. Enabled is a whitelist; Disabled is a
// blacklist. Empty Enabled means "no whitelist".
ToolFilter ToolFilterConfig
// MaxIterations caps the number of thinkβact cycles (default: 90).
MaxIterations int
// SystemMessage is the system prompt injected at the start of every run.
// Runtime context (OS, hostname, cwd, date, platform) is automatically
// prepended to this message before it reaches the LLM.
// If AGENTS.md exists in the working directory, its content is appended
// automatically. Set NoProjectFile to true to skip this.
SystemMessage string
// RuntimeContext, when set, prepends environment awareness to the system
// message: OS, hostname, working directory, current date/time, and
// platform-specific formatting rules. Each entry point (CLI, Telegram,
// WebUI) sets this automatically. When empty, BuildRuntimeContext("")
// provides generic terminal context.
RuntimeContext string
// NoProjectFile disables automatic loading of AGENTS.md from the
// working directory. By default, odek reads AGENTS.md and appends
// its content to the system message with a "Project Instructions" header.
NoProjectFile bool
// SandboxCleanup, if set, is called by Agent.Close() to destroy the
// Docker sandbox container. Set by the CLI when --sandbox is active.
// Programmatic API users can set this to their own cleanup logic
// (e.g., remove a container, delete a VM, tear down a network).
// When nil, Close() is a no-op.
SandboxCleanup func() error
// Renderer, if set, produces colored terminal output for each phase
// of the agent loop. When nil, the agent runs silently (programmatic API).
Renderer *render.Renderer
// ToolEventHandler, if set, is invoked for each tool call and result
// during the agent loop. Fires "tool_call" before and "tool_result"
// after each tool invocation. Used by the WebUI for live streaming.
ToolEventHandler func(event string, name string, data string)
// InteractionMode controls tool-call rendering: "engaging" (default), "enhance", "verbose", or "off".
InteractionMode string
// IterationCallback, if set, is invoked after each iteration of the
// agent loop with progress info (turn number, tokens, tools called).
// Used by the Telegram handler for periodic progress updates.
IterationCallback loop.IterationCallback
// Skills configures the skill system. When nil, skills are disabled.
Skills *skills.SkillsConfig
// SkillManager holds the loaded skill state. Passed by the CLI layer;
// when nil, New() auto-loads from default directories.
SkillManager *skills.SkillManager
// MemoryDir sets the directory for persistent memory storage.
// Default: ~/.odek/memory/
MemoryDir string
// MemoryConfig controls the memory system (facts, buffer, episodes).
// Default: memory.DefaultMemoryConfig()
MemoryConfig memory.MemoryConfig
// Guard is the prompt-injection detector shared across subsystems.
// When nil, subsystems fall back to local rule-based scanning on demand.
Guard guard.Guard
// GuardConfig is the resolved guard configuration used to decide which
// surfaces are scanned. It mirrors the guard instance passed above.
GuardConfig guard.Config
// PromptCaching enables prompt caching markers for supported providers.
// When enabled (default: false), the system prompt and first user message
// are annotated with cache_control markers, and Anthropic-style system
// blocks are used. Supported by:
// - Anthropic (explicit cache_control markers)
// - DeepSeek (automatic β prefix stability helps)
// - OpenAI (automatic β prefix stability helps)
//
// When disabled (default), no cache markers are sent and the system
// prompt stays in the messages array for maximum provider compatibility.
// Enable this when using Anthropic models to get ~90% cost reduction
// on cached tokens and ~60-80% TTFT latency reduction.
PromptCaching bool
// Stream enables SSE streaming of LLM responses for the main think
// step (default: false). Requires DeltaHandler to display anything
// incrementally; without one the behavior matches the buffered path.
// Auxiliary LLM calls (compaction, progress summaries, memory) always
// stay buffered. See docs/STREAMING.md.
Stream bool
// DeltaHandler receives streamed output fragments when Stream is
// enabled. It is invoked synchronously and must be non-blocking;
// returning an error aborts generation for that call.
DeltaHandler func(llm.Delta) error
// MaxToolParallel controls how many tool calls run concurrently per
// agent iteration. 0 = use default (4). Models that emit multiple
// parallel tool calls benefit from concurrent execution of I/O-bound
// tools like read_file, search_files, and web_search.
MaxToolParallel int
// SkillEventHandler, if set, is invoked when a skill lifecycle event
// occurs (loaded, autoloaded, saved, deleted, etc.). Used by WebUI
// (WebSocket streaming) and Telegram (inline messages).
SkillEventHandler func(event skills.SkillEvent)
// MemoryEventHandler, if set, is invoked when a memory lifecycle event
// occurs (fact add/merge/consolidate, episode store/dedup/evict/promote).
// Fans out alongside the terminal renderer so embedding programs, the WebUI
// (WebSocket streaming), and Telegram can observe memory activity that was
// previously silent.
MemoryEventHandler func(event memory.MemoryEvent)
// AgentSignalHandler, if set, is invoked on internal agent-loop signals
// (context-window trim, tool-failure recovery) that the engine previously
// handled silently. Used for observability across all surfaces.
AgentSignalHandler func(event loop.SignalEvent)
// EventHandler, if set, receives the structured runtime event stream
// (schema odek.event/v1 β see docs/EXTENSIONS.md): run_started,
// iteration_completed, tool_call_started/completed/failed,
// session_saved, context_trimmed, budget_exceeded, run_completed,
// run_failed.
//
// Dispatch is non-blocking (buffered channel, drop-on-full) and
// panic-isolated: a slow or panicking handler can never stall or crash
// the agent loop. Events never carry raw tool arguments by default
// (SHA-256 digest + sizes + a structured argv0/target/class summary
// only) and human-readable fields pass through secret redaction.
EventHandler func(event events.Event)
// EventsIncludeArgs opts the event stream into carrying the raw
// (secret-redacted) tool-call arguments in tool_call_started events.
// Default off: raw arguments can include sensitive task content, but
// incident review on an opt-in basis beats a stream that cannot answer
// "what actually ran?" once the session has been deleted.
EventsIncludeArgs bool
// ExternalRefs carries operator-supplied pointers to state that lives
// outside odek (schema odek-extension/v1 β see docs/EXTENSIONS.md).
// The caller attaches them to the session at creation time via
// session.Session.AddExternalRefs; odek stores and returns these refs
// verbatim and NEVER resolves or dereferences their URIs. New rejects
// invalid refs with a descriptive error.
ExternalRefs []session.ExternalRef
// Limits configures hard execution budgets for a run
// (odek-extension/v1 β see docs/EXTENSIONS.md): wall-clock runtime,
// tool-call count, cumulative input/output tokens, and estimated cost.
// The zero value disables enforcement. On exhaustion the loop emits a
// budget_exceeded event, persists the latest safe session state via the
// messages-persist callback, and returns a typed *budget.Error (match
// with budget.As). Cost enforcement is active only when MaxCostUSD and
// both per-million prices are configured β odek never hard-codes
// provider prices.
Limits budget.Limits
// Approver gates dangerous tool operations. When set and the LLM returns
// multiple tool calls in one iteration, a single batch approval prompt
// is shown instead of N individual prompts. If denied, no tools run
// for that iteration. If approved, individual tool-level PromptCommand
// calls are bypassed via SetTrustAll.
Approver danger.Approver
// DangerousConfig holds the user's risk class configuration (Allow/Deny/
// Prompt per risk class). Used by the batch gate to decide whether a
// tool call needs approval before showing the prompt. When nil, the
// batch gate plays safe and shows the prompt for any classified tool.
DangerousConfig *danger.DangerousConfig
// UntrustedWrapper, if set, is applied to skill and episode context before
// injection into the model's system context. It should wrap externally-
// sourced content with a nonce'd boundary (and record it for audit). When
// nil, skill/episode content is injected directly (not recommended for
// production surfaces).
UntrustedWrapper func(source, content string) string
// Compaction enables LLM-based rolling compaction. When enabled,
// conversation turn groups dropped by context trimming are
// summarized by the model into a rolling digest system message instead of
// vanishing entirely, so long sessions retain a compressed memory of
// earlier work. Each compaction costs one extra LLM call per trim.
// The CLI resolves it to ON by default (an explicit compaction=false,
// ODEK_COMPACTION=false, or --no-compaction disables it); library
// users of New must opt in explicitly here.
Compaction bool
}
Config configures an Agent instance.
type ModelProfile ΒΆ
type ModelProfile struct {
// Label is a human-readable name for the model family.
Label string
// DefaultThinking is the thinking value applied when Config.Thinking
// is empty. Empty string means don't send the field (provider default).
DefaultThinking string
// Timeout is the default request timeout in seconds.
// Zero means use the global default (120s). Increased for
// models that take longer to reason (e.g. deepseek-v4-pro).
Timeout int
// MaxContext is the model's maximum context window in tokens.
// The loop engine automatically trims conversation history when
// estimated tokens approach this limit. Zero means no limit
// enforcement (unknown or effectively unlimited models).
MaxContext int
}
ModelProfile holds per-model defaults applied when the user hasn't explicitly provided a value. Zero values leave the system default.
func LookupProfile ΒΆ
func LookupProfile(model string) *ModelProfile
LookupProfile returns the best-matching ModelProfile for a model name, or nil if no profile matches. Matching uses longest prefix β a model named "deepseek-v4-flash-custom" would match "deepseek-v4-flash".
type Tool ΒΆ
type Tool interface {
Name() string
Description() string
Schema() any // JSON Schema for the tool's parameters
Call(args string) (string, error)
}
Tool represents a single capability the agent can invoke.
type ToolFilterConfig ΒΆ added in v1.11.0
type ToolFilterConfig struct {
// Enabled is a whitelist. When non-nil, only tools whose names appear
// here are registered. An empty (but non-nil) slice means no tools.
Enabled []string
// Disabled is a blacklist. Tools whose names appear here are removed
// after the whitelist is applied.
Disabled []string
}
ToolFilterConfig controls which tools are exposed to the LLM.
Directories
ΒΆ
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
odek
command
|
|
|
internal
|
|
|
artifact
Package artifact implements parsing, validation, and model-facing rendering of odek.artifact-ref/v1 references carried inside odek.tool-result/v1 envelopes (see docs/EXTENSIONS.md).
|
Package artifact implements parsing, validation, and model-facing rendering of odek.artifact-ref/v1 references carried inside odek.tool-result/v1 envelopes (see docs/EXTENSIONS.md). |
|
budget
Package budget implements hard execution budgets for an agent run (odek-extension/v1 β see docs/EXTENSIONS.md): a Limits struct describing the configured caps, a typed Error returned when a cap is exhausted, and a Checker the loop engine consults at each enforcement point.
|
Package budget implements hard execution budgets for an agent run (odek-extension/v1 β see docs/EXTENSIONS.md): a Limits struct describing the configured caps, a typed Error returned when a cap is exhausted, and a Checker the loop engine consults at each enforcement point. |
|
config
Package config loads and merges odek configuration from multiple sources.
|
Package config loads and merges odek configuration from multiple sources. |
|
danger
Package danger classifies shell commands by risk level and provides a configurable approval system for dangerous operations.
|
Package danger classifies shell commands by risk level and provides a configurable approval system for dangerous operations. |
|
embedding
Package embedding is the shared text-embedding seam used by every semantic retrieval path in odek: memory (episode recall, dedup, ranking, fact merge), session search, and skill matching.
|
Package embedding is the shared text-embedding seam used by every semantic retrieval path in odek: memory (episode recall, dedup, ranking, fact merge), session search, and skill matching. |
|
events
Package events implements odek's structured runtime event stream (schema odek.event/v1, see docs/EXTENSIONS.md): a small Event type, a non-blocking panic-isolated Emitter that fans events out to a handler, and an append-only JSONL sink (jsonl.go).
|
Package events implements odek's structured runtime event stream (schema odek.event/v1, see docs/EXTENSIONS.md): a small Event type, a non-blocking panic-isolated Emitter that fans events out to a handler, and an append-only JSONL sink (jsonl.go). |
|
flock
Package flock provides a portable advisory file lock.
|
Package flock provides a portable advisory file lock. |
|
fsatomic
Package fsatomic provides a crash-durable atomic file write.
|
Package fsatomic provides a crash-durable atomic file write. |
|
guard
Package guard provides a pluggable prompt-injection detector for odek.
|
Package guard provides a pluggable prompt-injection detector for odek. |
|
llm
Package llm provides an OpenAI-compatible HTTP client using only stdlib.
|
Package llm provides an OpenAI-compatible HTTP client using only stdlib. |
|
loop
Package loop implements the ReAct (Reasoning + Acting) agent loop.
|
Package loop implements the ReAct (Reasoning + Acting) agent loop. |
|
maintenance
Package maintenance provides periodic storage hygiene for the odek home directory (~/.odek): session retention, audit-record retention, log rotation, Telegram plan/media cleanup, and skill skip-list garbage collection.
|
Package maintenance provides periodic storage hygiene for the odek home directory (~/.odek): session retention, audit-record retention, log rotation, Telegram plan/media cleanup, and skill skip-list garbage collection. |
|
mcp
Package mcp implements a Model Context Protocol server over stdio.
|
Package mcp implements a Model Context Protocol server over stdio. |
|
mcpclient
Package mcpclient implements an MCP client that connects to external MCP servers over stdio.
|
Package mcpclient implements an MCP client that connects to external MCP servers over stdio. |
|
memory
Package memory provides persistent, agent-managed memory across sessions.
|
Package memory provides persistent, agent-managed memory across sessions. |
|
memory/extended
Package extended implements the Extended Memory subsystem for odek.
|
Package extended implements the Extended Memory subsystem for odek. |
|
narrate
Package narrate produces human-friendly, emoji-rich transition messages describing what the agent is doing.
|
Package narrate produces human-friendly, emoji-rich transition messages describing what the agent is doing. |
|
pathutil
Package pathutil provides small, security-critical helpers for path confinement and symlink-aware resolution.
|
Package pathutil provides small, security-critical helpers for path confinement and symlink-aware resolution. |
|
redact
Package redact provides secret detection and redaction for odek output.
|
Package redact provides secret detection and redaction for odek output. |
|
render
Package render provides emoji-driven terminal rendering for the odek agent loop.
|
Package render provides emoji-driven terminal rendering for the odek agent loop. |
|
resource
Package resource implements @-prefixed resource discovery and inline resolution.
|
Package resource implements @-prefixed resource discovery and inline resolution. |
|
sandbox
Package sandbox builds and operates the Docker container that isolates the agent's shell and file-tool execution from the host.
|
Package sandbox builds and operates the Docker container that isolates the agent's shell and file-tool execution from the host. |
|
schedule
Package schedule provides a native, in-process task scheduler for odek.
|
Package schedule provides a native, in-process task scheduler for odek. |
|
session
Package session persists agent conversation history across runs.
|
Package session persists agent conversation history across runs. |
|
skills
Package skills β advanced skill matching using scoring-based approach.
|
Package skills β advanced skill matching using scoring-based approach. |
|
telegram
Package telegram provides Telegram bot integration.
|
Package telegram provides Telegram bot integration. |
|
tool
Package tool provides the clarify tool β ask the user a question and wait for a response.
|
Package tool provides the clarify tool β ask the user a question and wait for a response. |
|
transport
Package transport provides tuned HTTP transports for odek's API clients.
|
Package transport provides tuned HTTP transports for odek's API clients. |
|
ws
Package ws provides WebSocket constants used by cmd/odek/serve.go.
|
Package ws provides WebSocket constants used by cmd/odek/serve.go. |