Skip to content

Releases: costaff-ai/costaff

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Aug 02:58

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.txt asked for
    mcp>=1.9.4 with no upper bound, so any install done after mcp 2.0 shipped
    resolved to 2.0.x — which removed mcp.server.fastmcp, the import that
    mcp_servers/setup.py is built on. Every mcp_servers module failed to
    import, taking the mcp container image and the test suite down with it. The
    bound is now mcp>=1.9.4,<2, matching the release line
    agents/requirements.txt already pinned.
  • WebChat async-push auto-wiring no longer breaks Enterprise stacks.
    costaff channel add/rebuild on a channel whose name contains "webchat"
    now reuses an existing WEBCHAT_ENT_INTERNAL_SECRET as
    WEBCHAT_INTERNAL_SECRET instead of minting a fresh one. The notifier
    prefers the WEBCHAT_* 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 update now flags services/ 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_enabled migration no longer fabricates a live
    agent.
    Any config read (get_config) used to turn the bare legacy flag
    into an ENABLED costaff-agent-coding entry pointing at a default
    container name — on hosts where that container never existed, the entry
    flowed into EXTERNAL_AGENTS_CONFIG and the Manager routed coding tasks
    into a dead endpoint. The migration now only keeps the agent enabled when
    an explicit CODING_A2A_URL/CODING_A2A_INTERNAL_URL proves real wiring;
    a bare flag migrates the entry as DISABLED (visible in costaff agent list, never routed) with a warning, and when a modern coding entry
    already exists the stale flag is dropped instead of registering the same
    agent twice.

v0.1.0-beta-3

v0.1.0-beta-3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Jul 01:44

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 generic WEBCHAT_PUSH_URL /
    WEBCHAT_INTERNAL_SECRET so each stack points at its own webchat container,
    falling back to WEBCHAT_ENT_PUSH_URL / WEBCHAT_ENT_INTERNAL_SECRET so
    existing Enterprise deployments are unaffected. Pairs with WebChat OSS
    beta-3, which receives these pushes over SSE.
  • costaff channel add/rebuild webchat auto-wires async push — zero manual
    setup.
    Adding or rebuilding a WebChat channel now generates
    WEBCHAT_INTERNAL_SECRET (once, then preserved) and derives
    WEBCHAT_PUSH_URL from 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/rebuild and agent add no longer break on a secondary core.
    The compose-fragment generator appended the core's docker network to
    whatever the source docker-compose.yaml hardcoded (typically
    costaff_default) instead of replacing it. On a non-default core (e.g. twk
    → costaff_twk) the service then referenced costaff_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 update now prompts a core rebuild when core/ changes. core/
    (notifiers, dispatcher, models, license) is baked into costaff-mcp-costaff
    via COPY . ., 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 plain restart. core/ is now in that list, so
    the update offers costaff core-rebuild like it does for mcp_servers/ etc.

v0.1.0-beta-2

v0.1.0-beta-2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Jul 03:08

Changed

  • costaff channel is multi-core aware. add/list/remove/rebuild/tags
    now accept --core and resolve the target core's config, container
    prefix, workspace, .env, and compose project — matching costaff 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/transfer recreate 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_ORIGINS no longer
    defaults to * (which let any website script the dashboard). The
    bundled frontend is same-origin and needs no CORS; set ALLOWED_ORIGINS
    only when hosting the frontend on a different origin.
  • costaff database backup/clean/restore fail friendly without a DB.
    They dumped a raw AttributeError traceback when no database was
    configured; now they print the same actionable message as db 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 to notification_outbox
    and retried by a background loop with exponential backoff, marked dead
    only after 8 attempts. A task result is no longer lost because a single
    push happened to fail. (migration 0003_notification_outbox)

Changed

  • Dashboard passwords use PBKDF2-HMAC-SHA256 (600k iterations) instead
    of a single SHA-256 round. Existing auth.json records upgrade
    transparently on the next successful login. Token and password
    comparisons are now constant-time.
  • costaff agent remove stops 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 add fails to bind.
  • costaff update detects core-image changes (anything under
    mcp_servers/, migrations/, agents/, requirements.txt,
    Dockerfile) and guides — or, on a TTY, runs — costaff core-rebuild,
    because a plain restart recreates 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 EVERY doing row 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 cascades failed down its dependency chain instead of leaving
    downstream tasks spinning in queued forever.
  • 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 model really persists for external agents. It now
    writes the agent's plugin .env (which wins in env_file order), backs
    the env-var names into new agent add entries, 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_now to 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 --all is no longer a silent no-op. Called directly
    (not via Typer), the rebuild helpers received the --core OptionInfo
    sentinel and every plugin failed in core resolution (Rebuilt 0/N).
  • dispatch_plan links the chain correctly. It parsed the task id
    with a loose regex that a step title containing ID: could hijack,
    stranding the rest of the chain; it now anchors on the full UUID.
  • Per-agent serialization survives name-spelling drift. coding vs
    coding_agent slipped 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 a done result. All three are fixed.
  • The manager keeps its own MCP across add/remove. agent add no
    longer appends a sub-agent's MCP to the manager (which triggered the
    anyio cancel-scope race), and agent remove tears 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, not costaff_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 use validates on single-install hosts;
    recreate_manager warns on failure instead of claiming success;
    docker up failures raise a catchable error (no traceback);
    costaff restart runs preflight before stopping; and agent add rolls
    back a source it cloned when the deploy fails.

Security

  • Every published port now binds 127.0.0.1 by 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.json aborts loudly instead of being overwritten with defaults;
    retry-exhausted agent runs are recorded as failed, not done.
  • External-agent a2a_url registration 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/config no 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 pushed v* tag cuts a GitHub Release from the
    matching CHANGELOG section.

v0.1.0-alpha-2

v0.1.0-alpha-2 Pre-release
Pre-release

Choose a tag to compare

@LiuYuWei LiuYuWei released this 14 Jun 08:02

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-2 in lockstep — pin them together with --tag v0.1.0-alpha-2.

Highlights

🚀 Tag-aware CLI — pin plugins to a release

  • costaff agent add / channel add accept --tag (alias --ref) to pin a clone to a release tag, branch, or commit.
  • costaff agent rebuild / channel rebuild honour the persisted pin from config.json, switching the working tree via git fetch --tags && git checkout <ref> instead of pull --ff-only; --tag <new> overwrites the pin.
  • costaff update --tag pins the core repo itself.
  • agent list / channel list gained 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).
  • Git wrapper gained clone(..., ref=...), fetch_tags(), checkout(), and current_ref() — covered by 10 + 8 new tests.

🩺 Safer startup & diagnostics

  • costaff start preflight 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 doctor suggested 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 onboard now defaults every prompt to the existing .env value (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 add now seeds agent_mcp_filters with 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.sh no longer aborts on Ubuntu 24.04 (installs python3.12-distutils only 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 bootstrap now generates MCP_SECRET_KEY / API_HEADERS_KEY / ID_SALT like the interactive wizard — CI deploys no longer run with the template salt and unauthenticated internal APIs. Default Gemini model bumped gemini-2.5-flash → gemini-3-flash-preview.
  • .env.template documents COSTAFF_WORKSPACE_DIR and adds worked LiteLLM examples for Ollama / OpenAI / Anthropic.
  • costaff agent rebuild / channel rebuild now force_remove each declared container before compose up --force-recreate, fixing Conflict. The container name "/X" is already in use across mixed deploy histories.
  • rebuild --tag <ref> no longer persists the new ref to config.json when the underlying git checkout fails.

Changed

  • external_agents[name] / dynamic_channels[name] entries in config.json may now carry an optional ref field; absence preserves the legacy "track default branch" behaviour.

Full changelog: CHANGELOG.md · Compare: v0.1.0-alpha-1...v0.1.0-alpha-2