This changelog documents internal development changes, refactors, tooling updates, and other non-user-facing modifications.
- Added
gitHubUserIdandurlto theUserPick type inpackages/core/src/issue-tracker/types.ts, enabling access to Linear users' linked GitHub accounts and profile URLs. AddedresolveGitHubUsername()method toPromptBuilderthat resolves numeric GitHub user IDs to usernames via the public GitHub REST API (GET /user/{id}). Integrated GitHub username resolution into bothbuildLabelBasedPrompt()andbuildIssueContextPrompt()flows. Updatedstandard-issue-assigned-user-prompt.mdandlabel-prompt-template.mdtemplates to include<assignee>context with<linear_display_name>,<linear_profile_url>,<github_username>,<github_user_id>, and<github_noreply_email>fields—tag names clarify metadata source (Linear vs GitHub). Updatedgh-pr.mdsubroutine to instruct agents to add "Assignee: @username" at the top of PR descriptions (GitHub notification), with a fallback to "Assignee: Display Name" for users without linked GitHub accounts (audit trail). AddedassigneeGitHubUsernamefield toPromptAssemblyInputtype. (CYPACK-843, #895) - Updated
gh-pr.mdsubroutine with optional "Deploy Preview" section at the tail end, referencing any available skill whose "use me when" description refers to creating deploy previews for a branch. This allows agents to optionally set up preview environments to test PRs before merging, using generic language for flexibility and robustness to skill availability changes. (CYPACK-846, #898)
- Added
SimpleCodexRunnerandSimpleCursorRunnerimplementations for constrained-response queries (ProcedureAnalyzer classification). Both follow the sameSimpleAgentRunner<T>abstract pattern as Claude and Gemini. AddeddefaultRunnerfield toEdgeConfigSchema(flows through to config update endpoint automatically).RunnerSelectionService.getDefaultRunner()implements priority: explicit config > single-API-key auto-detect > "claude" fallback.ProcedureAnalyzernow supports all 4 runner types with runner-specific default models. Pinned zod to 4.3.6 via pnpm overrides to eliminate dual-version type incompatibility that blocked cross-package type resolution. Deleted obsoletecodex-runner-shim.d.ts. ChangedSDKMessageimports insimple-agent-runnerfrom@anthropic-ai/claude-agent-sdktocyrus-coreto avoid cross-package type conflicts. (CYPACK-826, #878)
- Moved GPT Image and Sora video generation tools from
cyrus-claude-runnertocyrus-mcp-tools, integrating them into thecyrus-toolsMCP server viaregisterImageTools()/registerSoraTools(). Converted from@anthropic-ai/claude-agent-sdktool()/createSdkMcpServer()pattern to@modelcontextprotocol/sdkserver.registerTool()pattern. API key now sourced fromprocess.env.OPENAI_API_KEYinstead ofrepository.openaiApiKeyconfig. RemovedopenaiApiKeyandopenaiOutputDirectoryfromRepositoryConfigSchema. Removedopenaidependency fromcyrus-claude-runner, added tocyrus-mcp-tools. Removed separateimage-toolsandsora-toolsMCP server creation from EdgeWorker'sbuildMcpConfig(). (CYPACK-831, #883) - Updated
@anthropic-ai/claude-agent-sdkto v0.2.47 and@anthropic-ai/sdkto v0.77.0. Addedspeedfield toBetaUsageobjects in codex-runner and gemini-runner, added type annotations forContentBlockfilters in claude-runner to resolve TypeScript inference issues with updated SDK types. (CYPACK-827, #880) SlackEventTransport.getSlackBotToken()now readsSLACK_BOT_TOKENexclusively fromprocess.envwith no header fallback. TheX-Slack-Bot-Tokenrequest header is no longer used. (CYPACK-824, #876)- Refactored
EdgeWorker.tsby extracting 5 service modules:ActivityPoster(Linear activity posting),AttachmentService(attachment download/manifests),ConfigManager(config file watching/reload/change detection),PromptBuilder(prompt assembly/system prompts/issue context), andRunnerSelectionService(runner/model selection/tool configuration). Reduced EdgeWorker from 7,687 to 5,466 lines (29% reduction) while maintaining full test coverage (522 tests). (CYPACK-822, #874) - Merged
mainintocypack-807branch, resolving 7 merge conflicts and fixing auto-merge issues across AgentSessionManager, EdgeWorker, GitService, ProcedureAnalyzer, gemini-runner, and changelogs. Updated 2 test files fromIIssueTrackerServicetoIActivitySinkinterface. (CYPACK-821, #873) - Decoupled Slack webhook handler from
RepositoryConfig: introducedNoopActivitySinkfor non-repository sessions, dedicatedslackSessionManageronEdgeWorker, andslackThreadSessionsmap for thread-based session reuse.createSlackWorkspacenow creates plain directories under~/.cyrus/slack-workspaces/instead of git worktrees. Runner config is built inline (bypassingbuildAgentRunnerConfigwhich requires a repository). AddedSlackReactionServicetocyrus-slack-event-transportpackage. (CYPACK-815, #868) - Refactored logging across all packages to use a dedicated
ILoggerinterface andLoggerimplementation inpackages/core/src/logging/. Replaced directconsole.log/console.errorcalls in EdgeWorker, AgentSessionManager, ClaudeRunner, GitService, RepositoryRouter, SharedApplicationServer, SharedWebhookServer, WorktreeIncludeService, ProcedureAnalyzer, AskUserQuestionHandler, LinearEventTransport, and LinearIssueTrackerService with structured logger calls. Log level is configurable via theCYRUS_LOG_LEVELenvironment variable (DEBUG, INFO, WARN, ERROR, SILENT). - Added source context (session ID, platform, issue identifier, repository) to log messages via
logger.withContext(), enabling easier debugging and log filtering across concurrent sessions - Updated
CyrusAgentSessionschema to v3.0: renamedlinearAgentActivitySessionIdtoid, added optionalexternalSessionIdfor tracker-specific IDs, added optionalissueContextobject for issue metadata, madeissueandissueIdoptional to support standalone sessions (CYPACK-728, #770) - Updated
PersistenceManagerto v3.0 format with automatic migration from v2.0, preserving all existing session data during migration (CYPACK-728, #770) - GitHub webhook handling now uses forwarded installation tokens:
GitHubEventTransportextractsX-GitHub-Installation-Tokenheader from CYHOST webhooks and includes it in emitted events,EdgeWorker.postGitHubReply()andEdgeWorker.fetchPRBranchRef()prefer the forwarded token overprocess.env.GITHUB_TOKEN, enabling self-hosted Cyrus instances to post PR comment replies and fetch PR branch details using short-lived (1-hour) GitHub App installation tokens (CYPACK-773, #821, CYPACK-774, #822)
- New
cyrus-slack-event-transportpackage: EventEmitter-based transport for receiving and verifying forwarded Slack webhooks from CYHOST, with proxy (Bearer token) verification mode. IncludesSlackMessageTranslatorfor translatingapp_mentionevents into unifiedSessionStartMessageandUserPromptMessagetypes, thread-aware session key generation (channel:thread_ts),@mentionstripping, and Slack Bot token forwarding viaX-Slack-Bot-Tokenheader. AddedSlackSessionStartPlatformData,SlackUserPromptPlatformData, and corresponding type guards tocyrus-core. (CYPACK-807, #861) - New
cyrus-github-event-transportpackage: EventEmitter-based transport for receiving and verifying forwarded GitHub webhooks, with proxy (Bearer token) and signature (HMAC-SHA256) verification modes, aGitHubCommentServicefor posting replies via GitHub REST API, and utility functions for extracting webhook payload data. (CYPACK-772, #820) - EdgeWorker GitHub webhook integration:
/github-webhookendpoint, session creation flow for PR comments, git worktree checkout for PR branches, and reply posting via GitHub API. (CYPACK-772, #820) - Subroutine result text is now stored in procedure history when advancing between subroutines. On error results (e.g.
error_max_turnsfrom single-turn subroutines),AgentSessionManagerrecovers by using the last completed subroutine's result viaProcedureAnalyzer.getLastSubroutineResult(), allowing the procedure to continue to completion instead of failing - Created
GlobalSessionRegistryclass for centralized session storage across all repositories, enabling cross-repository session lookups in orchestrator workflows (CYPACK-725, #766) - Extracted
IActivitySinkinterface andLinearActivitySinkimplementation to decouple activity posting fromIIssueTrackerService, enabling multiple activity sinks to receive session activities (CYPACK-726, #767) - Integrated
GlobalSessionRegistrywithEdgeWorker, making it the single source of truth for parent-child session mappings and cross-repository session lookups (CYPACK-727, #769) - Added Cursor harness
[agent=cursor], including offline F1 drives for stop/tool activity, resume continuation, and permission synchronization behavior. Also added project-level Cursor CLI permissions mapping from Cyrus tool permissions (including subroutine-time updates), pre-run MCP server enablement (agent mcp list+agent mcp enable <server>), switched the default Codex runner model togpt-5.3-codex, and aligned edge-worker Vitest module resolution to use localcyrus-claude-runnersources during tests. (CYPACK-804, #858) - Added Fastify MCP transport for
cyrus-toolson the shared application server endpoint, replacing inline SDK-only wiring with HTTP MCP configuration and per-session context headers, and now enforcingAuthorization: Bearer <CYRUS_API_KEY>on/mcp/cyrus-toolsrequests. Also fixed Codex MCP server config mapping soheadersare translated to Codexhttp_headers(while preservinghttp_headers,env_http_headers, andbearer_token_env_var) for authenticated HTTP MCP initialization. Includes F1 validation coveringinitializeandtools/liston/mcp/cyrus-tools. (CYPACK-817, #870)
- Updated orchestrator system prompts to explicitly require
state: "To Do"when creating issues viamcp__linear__create_issue, preventing issues from being created in "Triage" status. (CYPACK-761, #815)
- Refactored formatting strategy from TodoWrite to Task tools (TaskCreate, TaskUpdate, TaskList, TaskGet). Added
formatTaskParameter()method to IMessageFormatter interface and updated AgentSessionManager to handle Task tools as thought activities. (CYPACK-788, #837) - Redesigned TaskCreate formatting for parallel execution (concise
⏳ **subject**checklist items), improved TaskUpdate/TaskGet to show subject names with status emojis, added ToolSearch formatting (🔍 Loading/🔍 Searching tools) rendered as non-ephemeral thought in AgentSessionManager, and added TaskOutput formatting (📤 Waiting for/📤 Checking). Updated both ClaudeMessageFormatter and GeminiMessageFormatter with matching logic. (CYPACK-795, #846) - Deferred TaskUpdate/TaskGet activity posting from tool_use time to tool_result time to enrich with task subject. Added
taskSubjectsByToolUseIdandtaskSubjectsByIdcaches to AgentSessionManager for subject resolution from TaskCreate results and TaskGet result parsing. (CYPACK-797, #847)
- Subroutine result text is now stored in procedure history when advancing between subroutines. On error results (e.g.
error_max_turnsfrom single-turn subroutines),AgentSessionManagerrecovers by using the last completed subroutine's result viaProcedureAnalyzer.getLastSubroutineResult(), allowing the procedure to continue to completion instead of failing. AddeddisallowAllToolsparameter tobuildAgentRunnerConfigandtoolsconfig pass-through toClaudeRunnerfor properly disabling built-in tools. (CYPACK-792, #843)
(No internal changes in this release)
- Fixed labelPrompts schema to accept both simple array form (
{ debugger: ["Bug"] }) and complex object form ({ debugger: { labels: ["Bug"], allowedTools?: ... } }). This resolves type mismatches when cyrus-hosted sends simplified configurations. (#802)
- Replaced manual TypeScript interfaces with Zod schemas as the source of truth for
EdgeConfig,RepositoryConfig, and related configuration types. This ensures type safety at both compile-time and runtime, and fixes type drift whereCyrusConfigPayloadwas missing fields likeissueUpdateTrigger. (#800)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
(No internal changes in this release)
- Moved publishing docs from CLAUDE.md to
/releaseskill for cleaner documentation and easier invocation (CYPACK-667, #705)
- Fixed the CLI issue tracker's
labels()method to return actual label data instead of an empty array, enabling correct runner selection (Codex/Gemini) in F1 tests (CYPACK-547, #624)