GitHub App auth for the bot, multi-user attribution, Slack UX overhaul, experimental /console, two new community providers (OpenCode and GitHub Copilot), Codex MCP support, and broad workflow/provider hardening.
Added
- GitHub App authentication for the bot: replaces the shared
GITHUB_TOKENPAT with a GitHub App + multi-installation routing. Each repo resolves to the installation that owns it; tokens are minted on demand, cached per installation, refreshed before expiry, and never persisted. Includes a loopback-only/internal/git-credentialendpoint (with a hard127.0.0.1bind check, opt-out viaARCHON_ALLOW_INTERNAL_ON_PUBLIC_BIND=1) so long-running workflowgitoperations can transparently refresh installation tokens via agit-credential-archonhelper installed into the worktree's.git/config(#1788). - Per-user attribution:
user_idis now plumbed from chat and forge adapters through the orchestrator intoconversations,messages,workflow_runs, andisolation_environments. Newusersanduser_identitiestables map platform identities (Slack U-id, Telegram chat id, Discord snowflake, GitHub login) to an Archon-internal user, created lazily on first sight (#1783). - Slack UX upgrade: interactive buttons, status reactions, and native slash commands replace the previous text-only flow. Approval gates, run status, and errors are now surfaced through Slack's UI primitives (#1757).
- Experimental run-centric console UI at
/console, mounted as an isolated in-repo spike underpackages/web/src/experiments/console/. Lint-guarded against importing production web modules so it can be dropped in or deleted cleanly (#1747). assistants.opencodeprovider: community provider that runs OpenCode as an embedded runtime, with per-node agent materialization, multi-agent sessions, structured output, token usage, and multi-agent MCP tool execution (#1384).- GitHub Copilot community provider: registered as a
builtIn: falseprovider in the registry (#1505). - Codex MCP nodes: MCP server support for Codex workflow nodes via the shared
loadMcpConfigmodule — passmcp: <path>on a Codex node and the config is translated to Codex'smcp_serversoverrides at runtime. MCP client errors are surfaced to the workflow author assystemchunks when MCP is explicitly configured for the node (#1459). always_runnode opt-out for resume caching: opt-out for nodes that must re-execute on every resume rather than being skipped as "already completed" (closes #1391, #1730).- Pi deferred extension model resolution so Pi workflows can reference models that are only available after extension loading (#1509).
- Brand foundation page at https://archon.diy/brand/, sourced from
packages/docs-web/src/content/docs/brand/(#1745). - New marketplace workflows:
piv-system-evolutionandarchon-comprehensive-mr-review.
Changed
- Streaming chat continuity: typing indicators and message boundaries are more readable; rapid successive chunks no longer fragment visually (#1617).
- Web chat bubbles wrap long unbreakable strings instead of overflowing (fixes #1738, #1742).
- Web DAG builder recognizes
loopandapprovalnode types and renders them correctly (#1744). - Web execution graph surfaces workflow-definition fetch errors instead of silently rendering an empty graph (#1683, #1698).
- Web copy-message button handles clipboard failures gracefully (#1564).
- Telegramify-markdown bumped to 1.3.3 for correct blockquote escaping (#1340).
- Webhook clones are placed in the workspace
source/subdirectory to match the standard workspace layout (#1554). - Global workflows are now editable through the Web UI builder (#1557).
safeSendMessageconsolidated intoexecutor-sharedto remove duplication across executor variants (#1496).- Direction docs: community-providers policy section added (#1736).
Fixed
workflow approve/resume/rejectno longer fail with "Workflow not found" when the run's working path is a worktree or workspace clone. Resume, approve, and reject now usecodebase.default_cwdfor workflow YAML discovery, falling back toworking_pathwhen no codebase record is found. Fixes #1663 (#1743).- Resume interactive workflows on chat platforms: previously failed because the resume code path assumed web; now works for Slack and Telegram (#1756).
- Web approve/reject responses surface the CLI resume command so users can copy it directly instead of having to look it up (#1523).
DEFAULT_AI_ASSISTANTis now read increateCodebaseso the env var actually controls the default assistant for newly registered codebases (fixes #1703, #1746).- Marketplace
decidenode hardened against non-JSON ai-review output so a prose-prefixed verdict doesn't crash the workflow. - MCP config env vars now expand
${VAR_NAME}brace syntax in addition to$VAR_NAME(#1728). archon-refactor-safelypersists read-only node outputs via bash bridges so downstream nodes can reference them (#1734).- Workflow builder injects
$ARGUMENTSinto generated YAMLs so user arguments reach the first node (#1733). - Codex provider: removed stale
attemptController.abort()that crashed after SDK cleanup (#1735, #1739); freshAbortControllerper retry attempt so a previously-aborted controller can't kill the new attempt (#1266, #1371). - Claude provider rejects directory paths in
claudeBinaryPathand expands npm platform-package directories (e.g.@anthropic-ai/claude-code-darwin-arm64) to the bundled binary (#1723, #1737). - Default assistant resolution: now consults config + per-folder detection on every codebase registration, not just the first (#1729).
- Large node outputs are written to a temp file and referenced rather than inlined into bash substitution, preventing argument-list corruption on big payloads (fixes #1717, #1718).
- Forge clone auth resolves credentials via configured
*_URLenv vars rather than assuminggithub.com(fixes #1704, #1706); non-GitHub forge URLs authenticate viaGITLAB_TOKEN/GITEA_TOKEN(fixes #1655, #1658). - DAG multi-resume: completed node state is now preserved across multiple resume cycles instead of being recomputed (#1530).
- Bash node variables: user-controlled variables are passed via env vars, not shell substitution, to avoid quoting bugs and injection edge cases (#1651).
- Scripts:
ARCHON_STATE_JSONmarker extraction uses line-anchored regex so embedded marker-like strings in script output don't confuse the parser (#1695). - Workflows:
condition_json_parse_failedis now surfaced as a workflow error instead of silently skipping the conditional branch (#1673, #1694).