A CLI-first message fabric for AI agent sessions: durable addresses, typed messages with answerback liveness, and an auditable record over SQLite (local, zero-config) or Postgres (networked, with or without Microsoft Entra auth).
One small binary, telex. Carries its own usage instructions for agents: run
telex skill.
The repository also ships a Copilot CLI plugin marketplace (.github/plugin/)
whose plugin lives under copilot/plugin/ (plugin.json + hooks.json +
bootstrap skill). All Copilot-specific content is nested under copilot/
(COPILOT.md, the bridge/ source, and plugin/), so the repository root stays
harness-neutral with room for future sibling harness plugins. The plugin maps Copilot
session env into generic telex session inputs, handles non-destructive
sessionEnd, and guards turn-end re-arming.
Full documentation (install, concepts, guides, and the generated CLI reference) is at https://lossyrob.github.io/telex/.
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/lossyrob/telex/main/install.sh | shWindows (PowerShell):
irm https://raw.githubusercontent.com/lossyrob/telex/main/install.ps1 | iexWith Rust (any platform):
cargo install --git https://github.com/lossyrob/telex --features entraOr grab a prebuilt binary from Releases.
Release installs use a versioned layout with a stable launcher, so upgrades and rollback do not disrupt in-flight processes. See Upgrading the binary in the guide.
telex skill # print the usage guide (also embedded for agents)
export TELEX_SESSION_ID=quickstart # PowerShell: $env:TELEX_SESSION_ID = "quickstart"
telex --address me send --to me --body "hello" # from resolves to `me`
telex --address me inbox --all # read it backNo manual server setup and no config required. The first daemon-backed
verb auto-spawns a per-user local exchange for the default local SQLite store at
~/.telex/telex.db. See the
Quickstart
for a two-session walkthrough.
Tell your agent: "set up telex: run telex skill." The binary self-describes,
so the agent learns to attach to an address, wait for messages, disposition them, and
message peers. To hand an agent a specific assignment in one command:
telex skill --address workstream:proj/node:issue-215In Copilot CLI, install/use the telex plugin and bind with push delivery so messages arrive as turns (no waiter to run or re-arm):
copilot plugin marketplace add lossyrob/telex
copilot plugin install telex@telex
telex --address workstream:proj/node:issue-215 copilot attach --copilot-bridge --description "<work>"
# enable Copilot Extensions under `/experimental` so `extensions_reload` is available,
# then run that tool once; delivered telex messages arrive as turns.
telex --address workstream:proj/node:issue-215 copilot detach # tear down when donetelex wait remains the generic pull primitive for scripts, CI, and non-extension
harnesses. Marketplace install is the supported plugin channel (the plugin lives
under copilot/plugin). See the
Copilot CLI push delivery guide
for CC-observer opt-in (--wake-on-cc), the session-env mapping, teardown, and
compatibility notes.
telex-console is a separate, read-only terminal UI for watching the fabric live — a
feed of every message, an address directory with occupancy, and threaded transcripts
with dispositions. It reuses the core library in-process, so the telex binary itself
stays dependency-light.
cargo install --git https://github.com/lossyrob/telex telex-console
telex-console # the configured default backend
telex-console --backend local # a configured backend, by name
telex-console --db ~/.telex/telex.db # or point at a specific SQLite storeFor an Entra Postgres backend, build the console with --features entra (like the core
binary). Read-only by design — it never holds a lease or changes state. See
telex-console/README.md.
Add a Postgres backend once; then select it by name (or make it the default):
# Azure Postgres with Entra (telex fetches the token itself; uses `az login`,
# or `--entra-cred managed` on a devbox/VM with a managed identity):
telex backend add prod \
--postgres "host=myserver.postgres.database.azure.com port=5432 user=me@example.com dbname=postgres sslmode=require" \
--entra --schema telex --default
telex backend list
telex --backend prod send --to node:x --body "hi"Secrets are referenced (--entra, --password-env, --password-command), never
stored in the config file. See the
networked Postgres guide.
A durable address is the responsibility being served; a per-user local
exchange daemon owns SQLite presence, lease heartbeats, delivery buffering,
and local IPC; a session attaches once to register an in-memory station for
its stable TELEX_SESSION_ID; wait is a one-shot daemon client that receives
one message and exits; ack is the explicit durable consumed mark. If the daemon
restarts, the next verb reconnects, re-registers on NeedsAttach, and continues
against the retained delivery buffer.
- User guide: install, concepts, guides, and the CLI reference
- SKILL.md: how agents use telex (also
telex skill) - telex-console/: the read-only, live-tail TUI for watching messages
- DESIGN.md: the working design
- DECISIONS.md: the decision log
- SECURITY.md: supported versions and how to report a vulnerability
- CONTRIBUTING.md: adding a backend, running the conformance suite, and releasing
- DISPATCH.md: forward-looking discovery & dispatch (broadcast, Contract-Net)
- EXTENSIONS.md: proposal for extensions & capability cards (how addresses advertise what they do)
- TELEX.md / PRODUCT-THESIS.md: the name, the metaphor, the thesis
- spike/: the validation spike that tested the design
