contenox

module
v0.40.6 Latest Latest
Warning

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

Go to latest
Published: Aug 16, 2026 License: Apache-2.0

README

contenox

An agent server.

Docs: contenox.com


The argument

Before Apache, serving a website meant writing your own server: parse the request, hold the connection, decide what to send — all of it welded to the content it existed to deliver. Apache made serving something you install, and HTML became the thing you author.

Everyone building an agent today is back on the wrong side of that line, hand-rolling the same machine: the loop, the tool gate, the approval flow, session persistence — welded to one prompt, rewritten at the next company.

contenox makes that machine infrastructure and the declaration the artifact. Install the server. Author the agent.


You don't build an agent. You declare one.

An agent is one file:

---
name: reviewer
description: Reviews a file for correctness problems
tools: Read, Glob, Grep
---

You are a code reviewer. Read the file you are asked about, then list the
problems you can point at in what you actually read.

Drop it in .contenox/agents/ and the next run picks it up. No build step, no plugin API, no release:

.contenox/
  agents/
    reviewer.md      one agent
    triage.md        another
  agents.toml        the knobs a declaration cannot reach

Already have agents? .claude/agents/ and .agents/agents/ are read where they are. Claude Code, Copilot, Cursor, OpenCode and Antigravity declarations all import — nothing to move or convert, it is the same file.

contenox agent list
contenox mission fire reviewer "review the payment retry change" --wait

A directory of declarations is a workflow. The agent.md at the top reads the request and answers with one label; the branch of that name takes it from there, with its own instruction, its own tools, its own budget:

.contenox/agents/
  triage/
    agent.md         reads the request, answers with one label
    code/
      agent.md       the branch that label routes to
      recovery.md    its second attempt, when the first stops short
    docs/
      agent.md       tools: Read, Glob, Grep — it cannot write
    failure.md       what it says when every branch has given up

default: in the router's frontmatter names the branch an unrecognised answer falls to — the narrowest one, never the most capable.

Behind each declaration contenox compiles a chain that says what happens and a policy that says what is permitted, into .generated/. Both are JSON Schema-validated, both are yours to read, and neither is yours to maintain — edit the declaration and they follow. Every policy denies .ssh, .aws and .kube under every permission setting.

Model routing is configuration too: contenox backend add, contenox config set default-provider.


Install

curl -fsSL https://contenox.com/install.sh | sh

Prefer to read it first?

curl -fsSLO https://contenox.com/install.sh
less install.sh
sh install.sh

Pre-built binaries are on the releases page.


First run

contenox init                           # scaffold .contenox/ — agents, envelopes, config
contenox setup                          # pick a provider and model, once
contenox agent list                     # what is declared, and where it was read from
contenox mission fire triage "sort the tickets that came in overnight"

contenox doctor reports anything missing, and contenox vet checks a policy before anything runs under it. Sessions persist: contenox session list and contenox session switch <name> pick past contexts back up.


Two shapes

Your editor launches it. Zed, JetBrains, AionUi and OpenClaw start contenox as an ACP subprocess over stdio — no plugin lock-in, and approvals route through the editor's own permission UI.

contenox acp                            # speak ACP over stdio to any ACP client

Everything runs locally, with no account. To reach a running session from your phone — reading the transcript, answering approvals — pair the machine with the hosted relay: sign in at app.contenox.com, tap Pair device, and enter the key as /pair <key> in the session. Free for you and three teammates, one machine each, opt-in per machine. How pairing works.

Or it runs as a host. Same runtime, no editor in front of it: it holds the relay connection open and stays up until you stop it, taking missions and reaching the MCP servers you attached.

contenox serve                          # a host on a headless box

The durable ask

Any harness can pause for a human while it holds the connection open. Holding a connection is not the hard part — surviving the wait is.

A run that stops for a person checkpoints where it stopped, saves the ask, and releases the process. Restart the box, close the laptop, let days pass: when the answer arrives, the run resumes from that exact point, exactly once.

contenox approvals list
contenox approvals respond 8f3c --answer "yes, send them"
contenox inbox list

We ship no tools. That is the point.

Apache shipped modules, not websites. contenox owns the tool boundary and you decide what stands on the other side of it. Every tool you do not need is tokens burned on every turn, and one more thing to govern. Tools cross that boundary two ways, and both are yours to choose.

From the client. An ACP client — your editor — negotiates fs/* and terminal/* as capabilities. contenox forwards the call and the client performs it, in the workspace you already have open. local_fs is five tools: read_file, write_file, edit_file, sed, read_file_range. Listing and search go through the shell, on the client's side of the line.

From the operator. Anything reachable over MCP or described by an OpenAPI spec becomes a policy-scoped tool your agents can name:

# Connect any Model Context Protocol (MCP) server
contenox mcp add notion https://mcp.notion.com/mcp --auth-type oauth

# Wrap an internal HTTP API using its OpenAPI specification
contenox tools add erp_billing \
  --url https://erp.internal.example.com \
  --spec ./billing-subset.yaml

A declaration can also bring its own, scoped to that agent, reachable by no other one, retired when you delete the file:

mcpServers:
  filesystem:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-filesystem", "/data"]
remoteTools:
  billing:
    url: https://internal.example.com
    spec: https://internal.example.com/openapi.json

What you connected yourself with contenox mcp add stays yours and is never touched.


What people use it for

  • Standing, scheduled agents — declare one, call it from cron or CI. Each run starts clean.
  • Request processing — intake, classify, draft, hold for a human, send. The hold is the feature.
  • Wrapping internal APIs — expose a subset of an OpenAPI spec as a tool, with sensitive arguments filled in by config rather than the model.
  • Release evidence — aggregate git logs, PRs, tickets and CI output into changelogs and reviewer packets.
  • Live operations — query dashboards, scripts or MCP tools under scoped policies instead of broad credentials.

Backends

Mix local and hosted freely:

# Local & private-network inference
contenox backend add ollama --type ollama
contenox backend add myvllm --type vllm --url http://gpu-host:8000

# Hosted providers
contenox backend add openai    --type openai    --api-key-env OPENAI_API_KEY
contenox backend add anthropic --type anthropic --api-key-env ANTHROPIC_API_KEY
contenox backend add gemini    --type gemini    --api-key-env GEMINI_API_KEY

# Defaults
contenox config set default-provider ollama
contenox config set default-model    qwen2.5:7b

Also supported: Gemini, Vertex AI, and Amazon Bedrock.


Guardrails

Every run is bounded by an envelope: a JSON policy naming what passes silently, what stops for a human, and what is denied outright, plus hard ceilings on tool calls and tokens. Anything no rule matches fails closed — it asks. Six presets ship with contenox init, and the knobs a declaration cannot reach live in agents.toml.

The gate sits at the tool boundary: every call is checked against the policy before it leaves contenox, whether it is headed for the client's terminal or an MCP server you attached. Gated actions ask a human first — in the terminal, in your editor's permission UI, or on your phone — and every session leaves reviewable local state on disk.

The sandbox — Landlock filesystem and exec confinement, scrubbed environment, Linux-only — confines foreign agent code you choose to run locally.


Managed

We provision and run contenox agents for you, on your terms. Tell us what the work is and we will get you set up: hello@contenox.com — or see the hosted app at app.contenox.com.


Building from source

Pure Go, no C toolchain:

git clone https://github.com/contenox/contenox
cd contenox
task build        # https://taskfile.dev — or: CGO_ENABLED=0 go build ./cmd/contenox

Questions: hello@contenox.com

Directories

Path Synopsis
cmd
contenox command
Command contenox is the contenox agent server and its CLI.
Command contenox is the contenox agent server and its CLI.
core module
internal
kernel/agentinstance
Package agentinstance spawns and owns running ACP agent instances on a server-rooted context, independent of any client connection, and lets multiple viewers attach to a session's event stream.
Package agentinstance spawns and owns running ACP agent instances on a server-rooted context, independent of any client connection, and lets multiple viewers attach to a session's event stream.
kernel/nativeturn
Package nativeturn is the serve-level survival layer for native ACP chain turns: an in-flight turn runs on a serve-rooted Registry, so a dropped connection detaches a viewer without cancelling the turn.
Package nativeturn is the serve-level survival layer for native ACP chain turns: an in-flight turn runs on a serve-rooted Registry, so a dropped connection detaches a viewer without cancelling the turn.
kernel/taskengine
Package taskengine orchestrates an agent: it drives LLM turns, tool calls and routing in a loop, defined as a JSON chain.
Package taskengine orchestrates an agent: it drives LLM turns, tool calls and routing in a loop, defined as a JSON chain.
kernel/taskengine/llmretry
Package llmretry wraps a single LLM call with classified retry, exponential backoff, and an optional model fallback.
Package llmretry wraps a single LLM call with classified retry, exponential backoff, and an optional model fallback.
libsandbox
Package libsandbox confines a spawned foreign agent to "the wall": every path out of its tools and workspace — filesystem, network, environment — is absent by construction.
Package libsandbox confines a spawned foreign agent to "the wall": every path out of its tools and workspace — filesystem, network, environment — is absent by construction.
models/llmrepo
Package llmrepo provides a unified facade over LLM backends discovered via runtimestate: prompt, chat, streaming, embedding, and tokenization through a single ModelRepo interface.
Package llmrepo provides a unified facade over LLM backends discovered via runtimestate: prompt, chat, streaming, embedding, and tokenization through a single ModelRepo interface.
models/modelrepo
Package modelrepo defines the provider-facing contracts for LLM backends: the Provider interface, per-capability client interfaces, and shared request/response types.
Package modelrepo defines the provider-facing contracts for LLM backends: the Provider interface, per-capability client interfaces, and shared request/response types.
models/modelrepo/anthropic
Package anthropic is a direct (non-Vertex) provider for the Anthropic API, which speaks the Messages API.
Package anthropic is a direct (non-Vertex) provider for the Anthropic API, which speaks the Messages API.
models/modelrepo/bedrock
Package bedrock is a provider for AWS Bedrock via the unified Converse API.
Package bedrock is a provider for AWS Bedrock via the unified Converse API.
models/modelrepo/codec/chatcompletions
Package chatcompletions is a transport-agnostic codec for the OpenAI Chat Completions wire format.
Package chatcompletions is a transport-agnostic codec for the OpenAI Chat Completions wire format.
models/modelrepo/codec/messages
Package messages is a transport-agnostic codec for Anthropic's Messages API wire format.
Package messages is a transport-agnostic codec for Anthropic's Messages API wire format.
models/modelrepo/gemini
Package gemini implements the modelrepo.Provider contract against Google's Gemini Generative Language API.
Package gemini implements the modelrepo.Provider contract against Google's Gemini Generative Language API.
models/modelrepo/ollama
Package ollama implements the modelrepo.Provider contract against Ollama HTTP endpoints.
Package ollama implements the modelrepo.Provider contract against Ollama HTTP endpoints.
models/modelrepo/openai
Package openai implements the modelrepo.Provider contract against the OpenAI HTTP API and OpenAI-compatible endpoints.
Package openai implements the modelrepo.Provider contract against the OpenAI HTTP API and OpenAI-compatible endpoints.
models/modelrepo/vertex
Package vertex implements the modelrepo.Provider contract against Google Vertex AI publisher endpoints, using OAuth bearer tokens minted from service-account credentials.
Package vertex implements the modelrepo.Provider contract against Google Vertex AI publisher endpoints, using OAuth bearer tokens minted from service-account credentials.
models/modelrepo/vllm
Package vllm implements the modelrepo.Provider contract against vLLM OpenAI-compatible HTTP endpoints.
Package vllm implements the modelrepo.Provider contract against vLLM OpenAI-compatible HTTP endpoints.
models/ollamatokenizer
Package ollamatokenizer provides Tokenizer implementations used by llmrepo to count and split tokens for a given model: an HTTP client, a heuristic estimator, and a mock.
Package ollamatokenizer provides Tokenizer implementations used by llmrepo to count and split tokens for a given model: an HTTP client, a heuristic estimator, and a mock.
models/runtimestate
Package runtimestate reconciles the declared state of LLM backends against their observed state, read-only, intended to run repeatedly from a background task.
Package runtimestate reconciles the declared state of LLM backends against their observed state, read-only, intended to run repeatedly from a background task.
relayacp
Package relayacp carries ACP over a relay connection, so a remote client is just another ACP client of this runtime, routed by librelay.Frame.Session to its own libacp.AgentSideConnection.
Package relayacp carries ACP over a relay connection, so a remote client is just another ACP client of this runtime, routed by librelay.Frame.Session to its own libacp.AgentSideConnection.
relaycreds
Package relaycreds reads and writes the relay enrolment a machine obtained with `contenox login`: the instance token, the relay's public key, and the endpoint both apply to.
Package relaycreds reads and writes the relay enrolment a machine obtained with `contenox login`: the instance token, the relay's public key, and the endpoint both apply to.
relaylink
Package relaylink is the runtime half of the relay connection: it dials a relay, completes the librelay handshake, holds the connection, proves the peer is alive with heartbeats, and redials with backoff when it is not.
Package relaylink is the runtime half of the relay connection: it dials a relay, completes the librelay handshake, holds the connection, proves the peer is alive with heartbeats, and redials with backoff when it is not.
relaypair
Package relaypair redeems a pairing key for this machine's relay credentials via one POST; what comes back is what relaycreds stores.
Package relaypair redeems a pairing key for this machine's relay credentials via one POST; what comes back is what relaycreds stores.
relaytest
Package relaytest is an in-memory stand-in for a relay, for testing a connector without a network.
Package relaytest is an in-memory stand-in for a relay, for testing a connector without a network.
services/accessview
Package accessview computes HITL policy verdicts (reachability plus read/write decisions) for a batch of workspace-relative paths, always returning the full reason rather than only the interesting cases.
Package accessview computes HITL policy verdicts (reachability plus read/write decisions) for a batch of workspace-relative paths, always returning the full reason rather than only the interesting cases.
services/agentdecl
Package agentdecl reads agent declarations — Markdown with a YAML frontmatter header — and renders each as the task chain and human-in-the-loop policy that run it.
Package agentdecl reads agent declarations — Markdown with a YAML frontmatter header — and renders each as the task chain and human-in-the-loop policy that run it.
services/agenthost
Package agenthost is the runtime's client/host-role primitive for driving another ACP agent over stdio.
Package agenthost is the runtime's client/host-role primitive for driving another ACP agent over stdio.
services/agentregistryservice
Package agentregistryservice stores declared agent configurations ("external_acp" or "chain") as the single source of truth for what can be spawned.
Package agentregistryservice stores declared agent configurations ("external_acp" or "chain") as the single source of truth for what can be spawned.
services/agentservice
Package agentservice runs prompts against a task chain and persists their session history.
Package agentservice runs prompts against a task chain and persists their session history.
services/agentview
Package agentview computes, for a workspace path, the access the agent would actually have, by running the agent's own gates rather than a parallel reimplementation.
Package agentview computes, for a workspace path, the access the agent would actually have, by running the agent's own gates rather than a parallel reimplementation.
services/chainagents
Package chainagents seeds the declared-agent registry from the runtime's own task chains.
Package chainagents seeds the declared-agent registry from the runtime's own task chains.
services/chatservice
Package chatservice persists the conversation thread.
Package chatservice persists the conversation thread.
services/clikv
Package clikv reads and writes the CLI's persisted settings (the cli.* KV namespace) and owns the scope of every one of them.
Package clikv reads and writes the CLI's persisted settings (the cli.* KV namespace) and owns the scope of every one of them.
services/eventlog
Package eventlog is the service tier over the durable, append-only domain event log, which itself lives in internal/store/runtimetypes.
Package eventlog is the service tier over the durable, append-only domain event log, which itself lives in internal/store/runtimetypes.
services/eventtrigger
Package eventtrigger routes durable events to the task chains operators configured to react to them, declared in trigger-*.json files.
Package eventtrigger routes durable events to the task chains operators configured to react to them, declared in trigger-*.json files.
services/fleetservice
build.go composes an in-process fleet: agent registry, agentinstance kernel, operator inbox, report router, and the fleet Service, so a host process can dispatch missions as subagents of itself.
build.go composes an in-process fleet: agent registry, agentinstance kernel, operator inbox, report router, and the fleet Service, so a host process can dispatch missions as subagents of itself.
services/hitlservice
Package hitlservice evaluates approval policies for tool calls, returning allow/deny/approve decisions.
Package hitlservice evaluates approval policies for tool calls, returning allow/deny/approve decisions.
services/localtools
Package localtools provides tools that fire around chain execution: approval gates and host-side helpers.
Package localtools provides tools that fire around chain execution: approval gates and host-side helpers.
services/localtools/mcpoauth
Package mcpoauth implements the MCP OAuth 2.1 Authorization Code + PKCE flow for CLI clients: server metadata discovery (RFC 8414), dynamic client registration (RFC 7591), and the local callback server.
Package mcpoauth implements the MCP OAuth 2.1 Authorization Code + PKCE flow for CLI clients: server metadata discovery (RFC 8414), dynamic client registration (RFC 7591), and the local callback server.
services/mcpserverservice
Package mcpserverservice stores MCP server configs.
Package mcpserverservice stores MCP server configs.
services/mcpworker
Package mcpworker keeps MCP server connections alive across chain steps.
Package mcpworker keeps MCP server connections alive across chain steps.
services/missionchanges
Package missionchanges answers two oversight questions from a mission's already-journaled work: what the unit changed, and whether its attention wandered outside its workspace.
Package missionchanges answers two oversight questions from a mission's already-journaled work: what the unit changed, and whether its attention wandered outside its workspace.
services/missionservice
Package missionservice stores mission records: the durable, agent-reportable half of the fleet manager.
Package missionservice stores mission records: the durable, agent-reportable half of the fleet manager.
services/missiontools
Package missiontools is the per-mission tool grant a dispatched unit holds while running unattended: report progress, ask for attention, maintain a living plan, end with a verdict, and heartbeat.
Package missiontools is the per-mission tool grant a dispatched unit holds while running unattended: report progress, ask for attention, maintain a living plan, end with a verdict, and heartbeat.
services/onboarding
Package onboarding is the first-run zero-config path: it registers a probed local Ollama backend and sets it as default.
Package onboarding is the first-run zero-config path: it registers a probed local Ollama backend and sets it as default.
services/operatorinbox
Package operatorinbox is the durable attention surface for mission reports that reached no live supervising session.
Package operatorinbox is the durable attention surface for mission reports that reached no live supervising session.
services/oracletools
Package oracletools is the oracle's tool grant: one model-facing tool, submit_verdict, bound to one durable ask for one chain execution.
Package oracletools is the oracle's tool grant: one model-facing tool, submit_verdict, bound to one durable ask for one chain execution.
services/presence
Package presence lets an editor-spawned contenox process self-register into the shared store so the fleet board can show it.
Package presence lets an editor-spawned contenox process self-register into the shared store so the fleet board can show it.
services/project
Package project owns a project's portable identity marker at <projectRoot>/.contenox/workspace.id: a stable UUID plus an optional friendly Name, travelling with the directory rather than the host-local grant list.
Package project owns a project's portable identity marker at <projectRoot>/.contenox/workspace.id: a stable UUID plus an optional friendly Name, travelling with the directory rather than the host-local grant list.
services/reportrouter
Package reportrouter delivers missionservice's report, ask, status and plan-revision events to the session that fired the mission, falling back to the operator inbox when none is live.
Package reportrouter delivers missionservice's report, ask, status and plan-revision events to the session that fired the mission, falling back to the operator inbox when none is live.
services/sessionservice
Package sessionservice stores CLI chat sessions so conversations persist across terminal restarts.
Package sessionservice stores CLI chat sessions so conversations persist across terminal restarts.
services/setupcheck
Package setupcheck evaluates local runtime readiness (defaults, backends) for the CLI.
Package setupcheck evaluates local runtime readiness (defaults, backends) for the CLI.
services/shellenvservice
Package shellenvservice persists the operator-defined environment variables contenox injects into shells it spawns, layered on top of the environment scrub so they always win.
Package shellenvservice persists the operator-defined environment variables contenox injects into shells it spawns, layered on top of the environment scrub so they always win.
services/toolguidance
Package toolguidance appends short orientation lines to a tool's textual result, derived from per-session counters.
Package toolguidance appends short orientation lines to a tool's textual result, derived from per-session counters.
services/vfs
Package vfs is the single home for workspace-root containment: resolving a candidate path against a root and rejecting anything that escapes it, symlinks included.
Package vfs is the single home for workspace-root containment: resolving a candidate path against a root and rejecting anything that escapes it, symlinks included.
services/workspacegrants
Package workspacegrants owns the durable, hot-reloadable workspace-root allowlist beyond serve's launch-time roots: a durable config value plus a fire-and-forget bus doorbell that tells a running serve to reload.
Package workspacegrants owns the durable, hot-reloadable workspace-root allowlist beyond serve's launch-time roots: a durable config value plus a fire-and-forget bus doorbell that tells a running serve to reload.
surfaces/contenoxcli/brand
Package brand renders contenox's identity device for plain-writer surfaces: the logo-mark as block art beside the wordmark.
Package brand renders contenox's identity device for plain-writer surfaces: the logo-mark as block art beside the wordmark.
surfaces/contenoxcli/sanitize
Package sanitize is beam's gate between untrusted text and a rendered span.
Package sanitize is beam's gate between untrusted text and a rendered span.
surfaces/contenoxcli/textwidth
Package textwidth centralizes rune-safe terminal cell-width math for beam.
Package textwidth centralizes rune-safe terminal cell-width math for beam.
surfaces/fleetboot
Package fleetboot builds the in-process mission fleet a surface embeds so /mission is dispatched as a subagent of the host process.
Package fleetboot builds the in-process mission fleet a surface embeds so /mission is dispatched as a subagent of the host process.
Package libacp implements the Agent Client Protocol (ACP) v1, the JSON-RPC-over-NDJSON protocol editors and agents use to talk to each other.
Package libacp implements the Agent Client Protocol (ACP) v1, the JSON-RPC-over-NDJSON protocol editors and agents use to talk to each other.
acpexec
Package acpexec spawns a subprocess and wires its stdin/stdout together as a single io.ReadWriteCloser, the transport shape libacp's connections expect.
Package acpexec spawns a subprocess and wires its stdin/stdout together as a single io.ReadWriteCloser, the transport shape libacp's connections expect.
cmd/acp-stub-agent command
Command acp-stub-agent is a hermetic ACP Agent used to validate libacp's agent-side wire dispatch against ACP conformance clients, without any LLM backend.
Command acp-stub-agent is a hermetic ACP Agent used to validate libacp's agent-side wire dispatch against ACP conformance clients, without any LLM backend.
Package libbus is a high-level publish-subscribe abstraction over a message broker, offering fire-and-forget publish, streaming subscriptions, and request-reply (Serve/Request) on top of pluggable backends (NATS, SQLite, in-memory).
Package libbus is a high-level publish-subscribe abstraction over a message broker, offering fire-and-forget publish, streaming subscriptions, and request-reply (Serve/Request) on top of pluggable backends (NATS, SQLite, in-memory).
Package libcipher provides cryptographic utilities for encryption, decryption, integrity verification, and key generation: AES-GCM, AES-CBC with HMAC, sealed HMAC hashes, and Ed25519 signing keys.
Package libcipher provides cryptographic utilities for encryption, decryption, integrity verification, and key generation: AES-GCM, AES-CBC with HMAC, sealed HMAC hashes, and Ed25519 signing keys.
Package libdbexec provides driver-agnostic interfaces (DBManager, Exec, QueryRower) for SQL access, implemented for PostgreSQL (lib/pq) and SQLite.
Package libdbexec provides driver-agnostic interfaces (DBManager, Exec, QueryRower) for SQL access, implemented for PostgreSQL (lib/pq) and SQLite.
Package libevents holds the consumer-side state of an event log: durable cursors, firing claims with recorded outcomes, listener subscriptions, and staged events held until a due time.
Package libevents holds the consumer-side state of an event log: durable cursors, firing claims with recorded outcomes, listener subscriptions, and staged events held until a due time.
Package liblease implements a cooperative, time-bounded file lease: a single-holder lock backed by an ordinary JSON file that records who holds the lease and until when.
Package liblease implements a cooperative, time-bounded file lease: a single-holder lock backed by an ordinary JSON file that records who holds the lease and until when.
Package liblog provides a date-organised, size-bounded log directory.
Package liblog provides a date-organised, size-bounded log directory.
Package librelay defines the wire contract between a contenox runtime and a relay: the Frame envelope, its NDJSON codec (Reader, Writer), and the relay-level control messages.
Package librelay defines the wire contract between a contenox runtime and a relay: the Frame envelope, its NDJSON codec (Reader, Writer), and the relay-level control messages.
Package libroutine runs recurring background tasks under circuit-breaker protection: Routine is the breaker, group manages one keyed loop per task, and Runner, Job and Schedule build condition-gated job chains on top of a Routine that can be fired directly, on a Schedule, or from a libbus subject.
Package libroutine runs recurring background tasks under circuit-breaker protection: Routine is the breaker, group manages one keyed loop per task, and Runner, Job and Schedule build condition-gated job chains on top of a Routine that can be fired directly, on a Schedule, or from a libbus subject.
libs
libauth module
libdb module
libollama module
tokenizer module
tools
schema-gen command
version command

Jump to

Keyboard shortcuts

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