Repository navigation
Releases: costaff-ai/costaff
Release list
v0.1.0
First stable release. The whole ecosystem is aligned on this version: the core
CLI, the shared chatbot library, and every tagged agent / channel plugin now
carry v0.1.0, so costaff update --all --tag v0.1.0 pins a known-good set.
Functionally this is beta-3 plus the fixes below; plugins that were still on
v0.1.0-alpha-2 are re-tagged without code changes.
Fixed
- Fresh installs no longer break on mcp 2.0.
requirements.txtasked for
mcp>=1.9.4with no upper bound, so any install done after mcp 2.0 shipped
resolved to 2.0.x — which removedmcp.server.fastmcp, the import that
mcp_servers/setup.pyis built on. Everymcp_serversmodule failed to
import, taking the mcp container image and the test suite down with it. The
bound is nowmcp>=1.9.4,<2, matching the release line
agents/requirements.txtalready pinned. - WebChat async-push auto-wiring no longer breaks Enterprise stacks.
costaff channel add/rebuildon a channel whose name contains "webchat"
now reuses an existingWEBCHAT_ENT_INTERNAL_SECRETas
WEBCHAT_INTERNAL_SECRETinstead of minting a fresh one. The notifier
prefers theWEBCHAT_*pair, so a fresh secret meant the sender and the
Enterprise receiver (which validates against the_ENT_value) disagreed
after the next mcp recreate — async push silently died. costaff updatenow flagsservices/changes for a core rebuild.
services/is baked into the mcp image and imported at container runtime
(mcp_servers/tools/_shared.py→services.config); it was missing from
_CORE_IMAGE_PATHS, so a services-only update ran stale code in the
containers after a plain restart.- Legacy
coding_agent_enabledmigration no longer fabricates a live
agent. Any config read (get_config) used to turn the bare legacy flag
into an ENABLEDcostaff-agent-codingentry pointing at a default
container name — on hosts where that container never existed, the entry
flowed intoEXTERNAL_AGENTS_CONFIGand the Manager routed coding tasks
into a dead endpoint. The migration now only keeps the agent enabled when
an explicitCODING_A2A_URL/CODING_A2A_INTERNAL_URLproves real wiring;
a bare flag migrates the entry as DISABLED (visible incostaff agent list, never routed) with a warning, and when a moderncodingentry
already exists the stale flag is dropped instead of registering the same
agent twice.
v0.1.0-beta-3
Added
- Async task results reach WebChat OSS, not just Enterprise. Delivering a
finished background task ("I'll notify you when it's done") is now a shared
channel capability. The core prefers the genericWEBCHAT_PUSH_URL/
WEBCHAT_INTERNAL_SECRETso each stack points at its own webchat container,
falling back toWEBCHAT_ENT_PUSH_URL/WEBCHAT_ENT_INTERNAL_SECRETso
existing Enterprise deployments are unaffected. Pairs with WebChat OSS
beta-3, which receives these pushes over SSE. costaff channel add/rebuild webchatauto-wires async push — zero manual
setup. Adding or rebuilding a WebChat channel now generates
WEBCHAT_INTERNAL_SECRET(once, then preserved) and derives
WEBCHAT_PUSH_URLfrom the core's container prefix, writing both to the core
.env. The webchat container already mounts that.env, so the two sides
line up automatically — "notify you later" works after a plain rebuild +
costaff restart, without anyone hand-editing env files. Other channels are
left untouched.
Fixed
channel add/rebuildandagent addno longer break on a secondary core.
The compose-fragment generator appended the core's docker network to
whatever the sourcedocker-compose.yamlhardcoded (typically
costaff_default) instead of replacing it. On a non-default core (e.g.twk
→costaff_twk) the service then referencedcostaff_default, which the
fragment doesn't declare, so the build failed with "refers to undefined
network costaff_default". The service now references exactly the core's
network. No change on the default core (the network already is
costaff_default).costaff updatenow prompts a core rebuild whencore/changes.core/
(notifiers, dispatcher, models, license) is baked intocostaff-mcp-costaff
viaCOPY . ., but it was missing from the update command's "needs a
rebuild" path list — so an update whose only image-relevant change was under
core/(e.g. this release's async-push sender) would be silently left
running the old code after a plainrestart.core/is now in that list, so
the update offerscostaff core-rebuildlike it does formcp_servers/etc.
v0.1.0-beta-2
Changed
costaff channelis multi-core aware.add/list/remove/rebuild/tags
now accept--coreand resolve the target core's config, container
prefix, workspace,.env, and compose project — matchingcostaff agent. Channel host ports are reserved across every registered core so
allocation never collides. Single-install hosts are unaffected (the
synthetic default core reproduces the historical layout exactly).costaff agent enable/disable/transferrecreate the Manager. They
changed config and regenerated the env but only told the user to
docker restart— which doesn't re-read env_file, so the change
silently didn't apply. They now recreate the Manager like add/remove.- Dashboard CORS is deny-by-default.
ALLOWED_ORIGINSno longer
defaults to*(which let any website script the dashboard). The
bundled frontend is same-origin and needs no CORS; setALLOWED_ORIGINS
only when hosting the frontend on a different origin. costaff database backup/clean/restorefail friendly without a DB.
They dumped a raw AttributeError traceback when no database was
configured; now they print the same actionable message asdb migrate
and exit non-zero (restore also exits non-zero on a missing file).
Added
- Durable notification outbox. A channel push that fails (Telegram 5xx,
WebChat secret unset, network) is now written tonotification_outbox
and retried by a background loop with exponential backoff, markeddead
only after 8 attempts. A task result is no longer lost because a single
push happened to fail. (migration0003_notification_outbox)
Changed
- Dashboard passwords use PBKDF2-HMAC-SHA256 (600k iterations) instead
of a single SHA-256 round. Existingauth.jsonrecords upgrade
transparently on the next successful login. Token and password
comparisons are now constant-time. costaff agent removestops and removes the agent's containers (like
channel remove/platform remove) and recreates the manager, instead
of leaving an orphaned container holding its host port so the next
agent addfails to bind.costaff updatedetects core-image changes (anything under
mcp_servers/,migrations/,agents/,requirements.txt,
Dockerfile) and guides — or, on a TTY, runs —costaff core-rebuild,
because a plainrestartrecreates containers without rebuilding and
would run the old code / skip a new migration.
Fixed
- Task lifecycle — no more stranded tasks. Startup orphan recovery now
reaps EVERYdoingrow unconditionally (executors die with the process;
the old 30-minute age gate stranded tasks when the container restarted
within 30 minutes of a task starting), plus a periodic sweep catches
workers lost mid-life. Reaped tasks now notify the user, finalize the
live progress panel, and advance the agent's queue. A failed upstream
task now cascadesfaileddown its dependency chain instead of leaving
downstream tasks spinning inqueuedforever. - Per-agent serialization enforced in the executor. A second task for
an agent that is already running one is deferred back to the queue —
concurrent MCP sessions on one sub-agent trigger the anyio cancel-scope
race, so this is now a structural guarantee instead of a convention. costaff agent modelreally persists for external agents. It now
writes the agent's plugin.env(which wins inenv_fileorder), backs
the env-var names into newagent addentries, recovers them from the
manifest for pre-v0.1.0 entries, and exits non-zero instead of printing
a fake success when the agent has no model surface (url-type).send_message_nowto WebChat actually sends. The webchat branch
used to return "Sent." without delivering anything; it now pushes
through the same channel endpoint the notification dispatcher uses.costaff update --allis no longer a silent no-op. Called directly
(not via Typer), the rebuild helpers received the--coreOptionInfo
sentinel and every plugin failed in core resolution (Rebuilt 0/N).dispatch_planlinks the chain correctly. It parsed the task id
with a loose regex that a step title containingID:could hijack,
stranding the rest of the chain; it now anchors on the full UUID.- Per-agent serialization survives name-spelling drift.
codingvs
coding_agentslipped past the busy-check and ran concurrently (the
anyio race); every per-agent comparison now normalizes the name. - Deliveries and failures no longer vanish. A LINE push with a missing
token was recorded as success and skipped the outbox; the license gate
failed a task without advancing the queue (stranding dependents); an
empty ADK reply was stored as adoneresult. All three are fixed. - The manager keeps its own MCP across add/remove.
agent addno
longer appends a sub-agent's MCP to the manager (which triggered the
anyio cancel-scope race), andagent removetears down the MCP wiring
it created so a dead URL isn't fed back to the manager. - Scheduler / delivery correctness. Poll no longer starves a ready
task behind a dependency-blocked one; a finished immediate task isn't
re-run; and the WebChat-Enterprise env guess can't override an
explicitly-set channel. - Plugin fragments join the core's real network (a non-default core
runs on e.g.costaff_asst, notcostaff_default), so the manager can
reach agents/channels deployed with--core. - CLI robustness. A corrupt config on one core no longer aborts port
allocation on another;core usevalidates on single-install hosts;
recreate_managerwarns on failure instead of claiming success;
docker upfailures raise a catchable error (no traceback);
costaff restartruns preflight before stopping; andagent addrolls
back a source it cloned when the deploy fails.
Security
- Every published port now binds
127.0.0.1by default (manager ADK web,
bundled Postgres, dashboard, channel fragments) with per-host opt-out
env vars; fresh installs generate a random Postgres password; corrupt
config.jsonaborts loudly instead of being overwritten with defaults;
retry-exhausted agent runs are recorded asfailed, notdone. - External-agent
a2a_urlregistration now DNS-resolves and rejects
hostnames that map to loopback or the cloud-metadata / link-local range
(SSRF), while still allowing private-LAN federation nodes. GET /api/configno longer returns bot tokens in plaintext — it reports
only whether each is configured.
CI / tooling
- Tests run across the Python 3.10 / 3.11 / 3.12 matrix (the documented
floor); wheels package the CLI subpackages; Dependabot keeps pip and
Actions patched; a pushedv*tag cuts a GitHub Release from the
matching CHANGELOG section.
v0.1.0-alpha-2
The second tagged pre-release of the CoStaff platform core. This release focuses on a smoother first run — preflight validation, a richer onboard wizard, install fixes — and a new tag-pinning workflow for reproducible agent / channel deployments.
The sister agent and channel repos are tagged
v0.1.0-alpha-2in lockstep — pin them together with--tag v0.1.0-alpha-2.
Highlights
🚀 Tag-aware CLI — pin plugins to a release
costaff agent add/channel addaccept--tag(alias--ref) to pin a clone to a release tag, branch, or commit.costaff agent rebuild/channel rebuildhonour the persisted pin fromconfig.json, switching the working tree viagit fetch --tags && git checkout <ref>instead ofpull --ff-only;--tag <new>overwrites the pin.costaff update --tagpins the core repo itself.agent list/channel listgained a Ref column showing the current pin.- New
costaff agent tags <name>/costaff channel tags <name>list available release tags on a plugin's origin (newest first, current pin marked✓ pinned). Gitwrapper gainedclone(..., ref=...),fetch_tags(),checkout(), andcurrent_ref()— covered by 10 + 8 new tests.
🩺 Safer startup & diagnostics
costaff startpreflight check validates.env(model API key, DB URI, security secrets, workspace dir) before touching Docker; fatal issues abort with the exact fix instead of a crash-loop. Skippable via--no-preflight.costaff doctorsuggested fixes — detected problems (Docker unreachable, network missing, dead agent port, env issues, missing channel sources, DB unreachable) are replayed at the end as a deduplicated problem → fix list.
🧭 Onboarding upgrades
- Re-running
costaff onboardnow defaults every prompt to the existing.envvalue (safe re-entry). - The Gemini API key is live-verified against the Gemini API, with an immediate warning on rejection.
- WebChat is pre-selected; already-deployed channels are kept instead of re-cloned; the wizard can create the dashboard admin account; a "next steps" panel closes the flow.
costaff agent addnow seedsagent_mcp_filterswith the 4-core-tool whitelist (send_message_now/add_task_comment/move_to_shared/list_data_files), so fresh sub-agents no longer inherit the manager's full ~40-tool MCP spec.
Fixed
install.shno longer aborts on Ubuntu 24.04 (installspython3.12-distutilsonly where it still exists); on macOS it launches Docker Desktop and waits up to 90s; on Ubuntu it starts the Docker daemon via systemd when stopped.costaff bootstrapnow generatesMCP_SECRET_KEY/API_HEADERS_KEY/ID_SALTlike the interactive wizard — CI deploys no longer run with the template salt and unauthenticated internal APIs. Default Gemini model bumpedgemini-2.5-flash→gemini-3-flash-preview..env.templatedocumentsCOSTAFF_WORKSPACE_DIRand adds worked LiteLLM examples for Ollama / OpenAI / Anthropic.costaff agent rebuild/channel rebuildnowforce_removeeach declared container beforecompose up --force-recreate, fixingConflict. The container name "/X" is already in useacross mixed deploy histories.rebuild --tag <ref>no longer persists the newreftoconfig.jsonwhen the underlyinggit checkoutfails.
Changed
external_agents[name]/dynamic_channels[name]entries inconfig.jsonmay now carry an optionalreffield; absence preserves the legacy "track default branch" behaviour.
Full changelog: CHANGELOG.md · Compare: v0.1.0-alpha-1...v0.1.0-alpha-2