Files
ajet a3ef6ec077
CI / Test + coverage (pull_request) Successful in 1m41s
framework-ify. proper agent runtime + adopt ag-ui
2026-09-21 18:34:19 -09:00

70 lines
3.8 KiB
Plaintext

# Copy to .env and fill in: cp .env-template .env
# script/server loads .env automatically; with Docker pass it via `docker run --env-file .env`
# (so keep values unquoted). .env is git-ignored and excluded from the image; never commit it.
# --- Server ---------------------------------------------------------------
# PORT=3000
# --- Gitea OAuth login ------------------------------------------------------
# Register an OAuth2 application in Gitea (Settings > Applications) as a confidential
# client, with the redirect URI <BASE_URL>/auth/callback
GITEA_URL=https://gitea.example.com
GITEA_CLIENT_ID=
GITEA_CLIENT_SECRET=
# Public URL of this app, as the browser reaches it. Use https in production: that also
# marks the session cookie Secure.
BASE_URL=http://localhost:3000
# Signs and encrypts session cookies. Generate with: openssl rand -hex 32
# Unset = a random key per start, so everyone is logged out on every restart.
SESSION_SECRET=
# --- Admin API --------------------------------------------------------------
# Comma-separated Gitea usernames allowed to use the admin API (POST /nrepl).
# Empty = nobody can.
ADMIN_USERS=
# --- Database -----------------------------------------------------------------
# The one SQLite file the app keeps everything in: the todos, and the MCP server's OAuth state
# (registered clients, and the hashed tokens of every client a user has approved). The directory
# is created on first use. In Docker, mount a volume here or the todos vanish with the container
# and every MCP client has to be approved again after a restart. BASE_URL (above) must be the
# address MCP clients use.
# DB_PATH=data/tbd.db
# --- Agent (LM Studio, via LangChain4j) ---------------------------------------
# The agent (tbd.agent.core, a LangChain4j streaming chat model) talks to an LM Studio server.
# Two surfaces use it: the chat widget in the UI (the green square, bottom left; POST /api/chat, an
# AG-UI run, logged-in users only) and the A2A server for other agents (POST /a2a, the same OAuth
# access token as /mcp; see /.well-known/agent-card.json). Point it at your LM Studio instance:
# server address, no /v1 (start its server, and enable "Serve on Local Network" for a remote one).
# Unset LMSTUDIO_URL = both surfaces answer "not configured".
# LMSTUDIO_URL=http://192.168.1.20:1234
# Model id to ask for; empty = whichever model LM Studio has loaded.
# LMSTUDIO_MODEL=
# Only if the server requires an API key.
# LMSTUDIO_API_KEY=
# Seconds the LLM server may stay silent (before it starts answering, or between two pieces of the
# reply) before giving up (default 120).
# LMSTUDIO_TIMEOUT_SECONDS=120
# Every turn (chat or A2A) is summarised in the server's log. To also keep the model's full
# reasoning and replies, and the messages it was sent (for finding out why it loops), append a JSON
# trace to this file. It holds what users typed, so keep it private.
# CHAT_TRACE_FILE=data/chat-trace.jsonl
# --- WebMCP origin trial ------------------------------------------------------
# Chrome's WebMCP (the UI's browser tools) is in an origin trial. Register BASE_URL's origin at
# https://developer.chrome.com/origintrials and paste the token here: the server then sends it
# as an `Origin-Trial` header on the page, and Chrome turns WebMCP on for everyone who opens it.
# The token is only good for that exact origin (scheme, host and port), and expires with the trial.
# Empty = no header (in Chrome you can still enable chrome://flags/#enable-webmcp-testing).
WEBMCP_ORIGIN_TRIAL_TOKEN=
# --- nREPL debug server (POST /nrepl) -----------------------------------------
# nREPL has no authentication and evaluates arbitrary code, so it listens on loopback
# only by default. Changing NREPL_BIND to 0.0.0.0 exposes it to the network: only do that
# behind a firewall or an SSH tunnel.
# NREPL_PORT=7888
# NREPL_BIND=127.0.0.1