feat: named agents, session resumption, and Slack bot#22
Merged
Conversation
Introduces four related capabilities: - Named agents with system prompts: define reusable agent personalities in parallax.yml; route tickets to specific agents via agentLabels - Agent memory: persist per-agent markdown files under ~/.parallax/agents/<name>/memory.md; prepended to every prompt - Session ID tracking and --resume: capture Claude Code session IDs from system:init events; pass --resume on retry to continue interrupted work - Slack bot (@parallax/slack): Bolt Socket Mode bot for plan approval/rejection, task event notifications, and /parallax slash commands (retry, cancel, status, pr-review) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Agent memory is not needed — each project already has its own markdown files that provide context to the agent. Removes agent-memory.ts, its test, the docs section, and the buildContextPrefix memory injection in BaseAgentAdapter. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-fix prettier formatting in packages/slack (curly braces, line wrapping) - Auto-fix prettier formatting in packages/orchestrator - Remove unused parseLogs function and LOG_LEVEL/LogLevel imports from config-loader - Remove unused Task import from linear/service - Remove unused AppConfig import from index - Rename config param to _config in resolveAgentNameForTask (not referenced) - Add varsIgnorePattern: '^_' to shared ESLint config to allow _prefixed destructuring Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix Block/KnownBlock import: move from @slack/bolt to @slack/web-api - Add .js extension to relative import in formatters.test.ts (NodeNext moduleResolution) - Add @parallax/slack path alias to tsconfig.base.json so orchestrator can type-check the dynamic import - Update slack package.json exports to ./dist/slack/src/index.js to match actual tsc output structure (baseUrl at monorepo root widens rootDir when cross-package path aliases are resolved) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Wrap bot initialization in try/catch and log on failure
- Log successful connection with channel name
- Replace .catch(() => {}) on all notify() calls with error logging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…in API - Sanitize botToken/appToken to '***' in /config API response (security) - Config sidebar: add Agents section listing name/provider/model per agent - Config sidebar: add Slack section showing the configured channel - Task details: add 'Slack channel' chip when Slack is configured Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…eation on agent self-commits Slack formatting: - Convert plan markdown to Slack mrkdwn (## headers → *bold*, **text** → *text*, links) - Remove triple-backtick code fence wrapping that was showing raw markdown symbols Plan approval buttons: - Replace original message (replace_original: true) after Approve/Reject instead of appending a thread reply — buttons are removed and a confirmation line is shown GitHub PR creation: - Fix commitAndPush to check for commits ahead of origin/main rather than only checking for uncommitted working-tree changes; this handles the case where the agent commits its own changes, leaving a clean working tree but unpushed commits - Sanitize branch names derived from externalId: replace '#' and spaces with '-' so GitHub issue refs like 'owner/repo#123' produce valid branch names Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Failure notifications: - persistPlanResult now sends 'failed' notification when plan generation fails - processTask critical-error catch block now sends 'failed' notification (previously these two paths failed silently with no Slack message) Plan approval message: - Remove description (too noisy) - Replace fields array with single section text block - Project shown on first line, task on second line Tests: add 'project before task' and 'no description' assertions; remove stale 'section fields' label from test name Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…detection failure When the local worktree branch contains characters like '#' (from GitHub externalIds like owner/repo#123), gh pr create cannot reliably detect the push remote via tracking config. Pass --head <branchName> explicitly so gh resolves the head ref directly from the sanitized remote branch name. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
AgentDefinitionentries inparallax.yml; route tickets to specific agents usingagentLabels(ticket label → agent name); each agent can have an optionalsystemPromptprepended to every prompt--resume— Claude Codesession_idcaptured fromsystem:initstream events, persisted to the DB, and passed as--resume <id>on retry to continue interrupted work@parallax/slack) — Bolt Socket Mode bot (no public URL needed); posts plan approval messages with Approve/Reject buttons, sends task event notifications (PR created, failed, canceled), and handles/parallaxslash commands (retry,cancel,status,pr-review)Running locally
1. Install and build
2. Update
parallax.ymlwith the new top-level structure3. Set up the Slack bot (optional)
See
docs/slack-bot.mdfor the full step-by-step:xapp-)chat:write,commands,channels:history,groups:historyxoxb-)/parallaxslash commandbotTokenandappTokento theslack:section in yourparallax.yml4. Start
Test plan
pnpm install && pnpm buildcompletes without errors across all packagespnpm test— all new and updated test cases pass (config-loader, provider-services, claude-code adapter, github-service, linear-service, slack formatters)agentLabels; create a GitHub issue with a matching label and verifyagentNameis set on the task--resumeflag appears in task logs when retrying a task that has a storedagentSessionId🤖 Generated with Claude Code