Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .beads/issues.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@
{"id":"agent-relay-318","title":"Add team assignment support to agent spawn command","description":"Currently the -\u003erelay:spawn command creates agents but doesn't support assigning them to a specific team. Add support for team assignment in the spawn syntax, e.g.: -\u003erelay:spawn AgentName claude --team=Dashboard 'task description'. This would allow better organization of spawned agents and automatic team membership.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-31T21:12:47.046439+01:00","updated_at":"2025-12-31T21:12:55.078684+01:00"}
{"id":"agent-relay-319","title":"Make notification filtering use dynamic current user instead of hardcoded 'Dashboard'","description":"The notification fix in useMessages.ts:124-125 hardcodes 'Dashboard' to filter out the current user's own messages. This is brittle - when other human users join the chat, they'll see notifications for their own messages. Should dynamically detect the current user's identity (from auth context, session, or websocket connection) and use that for the filter.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-31T21:18:19.280325+01:00","updated_at":"2025-12-31T21:18:19.280325+01:00"}
{"id":"agent-relay-320","title":"Agent Relay logo: mission-control neon mark","description":"Design a scalable Agent Relay logo with mission-control deep space look. Requirements: works on dark backgrounds, cyan #00d9ff glow variant; accents: orange #ff6b35, purple #a855f7, teal/green #00ffc8; explore network/relay nodes, signal waves, abstract AR monogram, orbital/satellite cues, or circuit patterns. Deliver SVG and PNGs (32,64,128,256,512) saved to src/dashboard/public/logos/.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-01T20:07:33.380814+01:00","updated_at":"2026-01-01T20:09:58.339797+01:00","closed_at":"2026-01-01T20:09:58.339797+01:00"}
{"id":"agent-relay-321","title":"Set up cloud infrastructure: Neon Postgres, Upstash Redis, GitHub OAuth","description":"Set up required cloud services for Fly.io deployment:\n\n1. **Neon Postgres** (https://neon.tech) ✅ DONE\n - Create project\n - Get DATABASE_URL connection string\n - Add to Fly secrets\n\n2. **Upstash Redis** (https://upstash.com) ✅ DONE\n - Create Redis database\n - Get REDIS_URL\n - Add to Fly secrets\n\n3. **GitHub OAuth App** (https://github.com/settings/applications/new)\n - Homepage URL: https://agent-relay.com\n - Callback URL: https://agent-relay.com/api/auth/github/callback\n - Get GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET\n - Add to Fly secrets\n\nAfter setup, run:\nfly secrets set -a agent-relay \\\n DATABASE_URL=\"...\" \\\n REDIS_URL=\"...\" \\\n GITHUB_CLIENT_ID=\"...\" \\\n GITHUB_CLIENT_SECRET=\"...\"","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-01T22:13:58.300333+01:00","updated_at":"2026-01-01T22:52:01.408274+01:00"}
{"id":"agent-relay-322","title":"Scale up Fly Postgres when traffic increases","description":"Commands to scale Postgres:\n\n# Increase VM size\nfly postgres config update agent-relay-db --vm-size shared-cpu-2x\n\n# Increase disk size \nfly postgres config update agent-relay-db --volume-size 10\n\n# For high availability, add replicas\nfly postgres config update agent-relay-db --initial-cluster-size 2","status":"open","priority":4,"issue_type":"task","created_at":"2026-01-01T22:51:21.512642+01:00","updated_at":"2026-01-01T22:51:32.021283+01:00"}
{"id":"agent-relay-323","title":"Scale up Fly Redis when traffic increases","description":"Commands to scale Redis (Upstash):\n\n# Check current usage\nfly redis status agent-relay-redis\n\n# Add replica regions for read scaling\nfly redis update agent-relay-redis --replica-regions lax,sea\n\n# For higher limits, upgrade via Upstash console:\n# https://console.upstash.com/\n\n# Or recreate with replicas\nfly redis create --name agent-relay-redis-v2 --region sjc --replica-regions lax","status":"open","priority":4,"issue_type":"task","created_at":"2026-01-01T22:51:22.779079+01:00","updated_at":"2026-01-01T22:51:33.60617+01:00"}
{"id":"agent-relay-324","title":"Switch from GitHub OAuth to GitHub App for repo access","description":"Current OAuth approach has limitations. Need GitHub App for:\n\n1. **Cloning private repos** in workspaces\n - Generate installation access tokens\n - Use for git clone in provisioned containers\n\n2. **GitHub API write access**\n - Create issues\n - Create pull requests\n - Comment on PRs\n - Manage branches\n\n3. **Organization-level installation**\n - Admin installs once\n - All org repos accessible\n - Not tied to individual user\n\n## Implementation Steps\n\n1. Create GitHub App in GitHub settings:\n - Permissions: contents:read, issues:write, pull_requests:write, metadata:read\n - Webhook URL for installation events\n - Generate private key\n\n2. Add app installation flow:\n - POST /api/github/install → redirect to GitHub App install\n - GET /api/github/callback → handle installation callback\n - Store installation ID per org/user\n\n3. Generate installation tokens:\n - JWT signed with private key\n - Exchange for installation access token\n - Use for git clone and API calls\n\n4. Update workspace provisioner:\n - Pass installation token to container\n - Clone repos using token\n - Refresh token when expired (1 hour expiry)\n\n5. Add GitHub API service:\n - createIssue(repo, title, body)\n - createPR(repo, head, base, title, body)\n - addComment(repo, issueNumber, body)\n\n## Environment Variables Needed\n- GITHUB_APP_ID\n- GITHUB_APP_PRIVATE_KEY (base64 encoded)\n- GITHUB_APP_WEBHOOK_SECRET\n- GITHUB_APP_CLIENT_ID (for OAuth fallback)\n- GITHUB_APP_CLIENT_SECRET","status":"open","priority":1,"issue_type":"feature","created_at":"2026-01-01T23:07:00.816801+01:00","updated_at":"2026-01-01T23:07:00.816801+01:00"}
{"id":"agent-relay-325","title":"Add repo context indicator in header with quick switcher","description":"Add Slack-style repo indicator in the header.\n\n## Current State\n- No clear indication of which repo you're working in\n- Have to look at sidebar to see context\n\n## Desired UX\n- Header shows: 'myorg/frontend ▼'\n- Click dropdown to see all repos in workspace\n- Quick switch without opening command palette\n- Show git branch next to repo name\n\n## Implementation\n1. Add RepoContextHeader component\n2. Dropdown with repo list from current workspace\n3. Click to switch repo context\n4. Show current branch (from WorkspaceSelector logic)\n\n## Location\nsrc/dashboard/react-components/layout/Header.tsx (or new component)","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:12:00.536911+01:00","updated_at":"2026-01-01T23:12:00.536911+01:00"}
{"id":"agent-relay-326","title":"Make Cmd+K default to repos/projects first","description":"Improve command palette to be more Slack-like for repo switching.\n\n## Current State\n- Cmd+K opens palette with all categories mixed\n- Projects are one category among many\n- Have to scroll/search to find repos\n\n## Desired UX\n- Cmd+K opens with repos/projects as first/default category\n- Recent repos at top of list\n- Current repo visually indicated\n- Tab to switch between categories\n- Cmd+Shift+K for full palette (agents, actions, settings)\n\n## Implementation\n1. Modify CommandPalette.tsx to prioritize Projects category\n2. Add 'recent projects' tracking (localStorage or state)\n3. Add Tab key handler to cycle categories\n4. Add visual indicator for current project\n5. Optional: Cmd+Shift+K binding for full palette\n\n## Files\n- src/dashboard/react-components/CommandPalette.tsx\n- src/dashboard/react-components/App.tsx (keybindings)","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:12:02.203413+01:00","updated_at":"2026-01-01T23:12:02.203413+01:00"}
{"id":"agent-relay-327","title":"Add recent repos quick access","description":"Track and display recently accessed repos for quick switching.\n\n## Current State\n- No memory of recently used repos\n- Have to search every time\n\n## Desired UX\n- Recent repos shown at top of command palette\n- Recent repos in header dropdown\n- Keyboard shortcut (Cmd+1, Cmd+2) for top 2 recent\n- Persist across sessions\n\n## Implementation\n1. Add useRecentRepos hook\n2. Store in localStorage (last 5-10 repos)\n3. Update on repo switch\n4. Display in CommandPalette Projects section\n5. Display in header dropdown\n6. Optional: Cmd+1/2/3 shortcuts\n\n## Files\n- src/dashboard/hooks/useRecentRepos.ts (new)\n- src/dashboard/react-components/CommandPalette.tsx\n- src/dashboard/react-components/RepoContextHeader.tsx","status":"open","priority":3,"issue_type":"feature","created_at":"2026-01-01T23:12:03.507573+01:00","updated_at":"2026-01-01T23:12:03.507573+01:00"}
{"id":"agent-relay-328","title":"Document cross-project messaging syntax for agents","description":"The parser supports cross-project messaging but agents don't know about it.\n\n## Current Syntax (supported but undocumented)\n\n```\n-\u003erelay:project-id:AgentName \u003c\u003c\u003c\nMessage to agent in another project\u003e\u003e\u003e\n\n-\u003erelay:project-id:* \u003c\u003c\u003c\nBroadcast to all agents in that project\u003e\u003e\u003e\n\n-\u003erelay:project-id:lead \u003c\u003c\u003c\nMessage to lead agent of that project\u003e\u003e\u003e\n```\n\n## Files to Update\n\n1. **docs/agent-relay-snippet.md** - Add cross-project section\n2. **CLAUDE.md** - Update the snippet (or it auto-updates)\n3. **.claude/skills/using-agent-relay/SKILL.md** - If exists\n\n## Content to Add\n\n```markdown\n## Cross-Project Messaging (Bridge Mode)\n\nWhen running with `agent-relay bridge`, you can message agents in other projects:\n\n```\n-\u003erelay:frontend:Designer \u003c\u003c\u003c\nPlease update the UI for the new auth flow\u003e\u003e\u003e\n\n-\u003erelay:backend:* \u003c\u003c\u003c\nAPI changes deployed, please pull latest\u003e\u003e\u003e\n\n-\u003erelay:shared-lib:lead \u003c\u003c\u003c\nNeed a new utility function for date formatting\u003e\u003e\u003e\n```\n\nFormat: `-\u003erelay:project-id:agent-name`\n```\n\n## Also Consider\n- How agents discover available projects\n- How to query which agents are in which project\n- Cross-project thread syntax: `[thread:project:topic]`","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-01T23:17:09.740345+01:00","updated_at":"2026-01-01T23:19:22.409354+01:00","closed_at":"2026-01-01T23:19:22.409354+01:00"}
{"id":"agent-relay-329","title":"Dashboard: Show connected repos/projects indicator","description":"When multiple repos are connected (bridge mode or multi-repo workspace), the dashboard should visually indicate this.\n\n## Current State\n- Dashboard shows agents but no clear indication of which project/repo they belong to\n- No visual cue that multiple projects are bridged\n\n## Desired UX\n\n### Option A: Project badges on agents\nEach agent shows a small badge/tag with their project:\n```\n[frontend] Designer - active\n[backend] API-Dev - idle \n[shared] Utils - active\n```\n\n### Option B: Grouped sidebar\nProjects as collapsible sections (already partially exists in ProjectList):\n```\n▼ frontend (3 agents)\n - Designer\n - Implementer\n - Reviewer\n▼ backend (2 agents)\n - API-Dev\n - DBAdmin\n```\n\n### Option C: Header indicator\nShow connected projects count in header:\n```\n🔗 3 projects connected | Current: frontend\n```\n\n## Implementation Notes\n- Check ProjectList.tsx - already has project grouping logic\n- May need to enhance Header.tsx for connection indicator\n- Consider color-coding projects for quick identification\n\n## Files\n- src/dashboard/react-components/ProjectList.tsx\n- src/dashboard/react-components/layout/Header.tsx\n- src/dashboard/react-components/AgentList.tsx (for badges)","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:19:14.394353+01:00","updated_at":"2026-01-01T23:22:31.628165+01:00","closed_at":"2026-01-01T23:22:31.628165+01:00"}
{"id":"agent-relay-330","title":"Add --architect flag to bridge command for cross-project coordinator","description":"When running bridge mode, optionally spawn an architect agent that coordinates across all projects.\n\n## Usage\n```bash\nagent-relay bridge --architect ~/frontend ~/backend\n# or\nagent-relay bridge --architect claude ~/frontend ~/backend\n```\n\n## Behavior\n1. Bridge connects to all project daemons (existing behavior)\n2. Spawns an Architect agent in a tmux session\n3. Architect agent has access to cross-project messaging:\n - -\u003erelay:project:agent for direct messages\n - -\u003erelay:*:* for broadcast to all\n - -\u003erelay:project:lead for project leads\n4. Architect gets injected with context about connected projects\n\n## Implementation\n- Add --architect flag to bridge command\n- Create temp workspace or use first project as base\n- Spawn tmux wrapper with Architect agent\n- Inject system prompt with project list and cross-project syntax\n\n## Agent Definition\nCould use .claude/agents/architect.md if exists, otherwise default prompt:\n- You are the Architect coordinating: [project list]\n- Use cross-project messaging syntax\n- Assign tasks to project leads\n- Resolve dependencies","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:29:07.473839+01:00","updated_at":"2026-01-01T23:35:27.952802+01:00","closed_at":"2026-01-01T23:35:27.952802+01:00"}
{"id":"agent-relay-37i","title":"Message deduplication uses in-memory Set without limits","description":"In tmux-wrapper.ts:65, sentMessageHashes is a Set that grows unbounded. For long-running sessions, this could cause memory issues. Add: (1) Max size with LRU eviction, (2) Time-based expiration, (3) Bloom filter alternative for memory efficiency.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T00:18:47.229988+01:00","updated_at":"2025-12-20T00:18:47.229988+01:00"}
{"id":"agent-relay-3px","title":"Add playbook system for batch automation","description":"Implement playbook system (like Maestro's Auto Run) for batch-processing task lists through agents. Define workflows in YAML/markdown, execute automatically with context isolation. Enables reproducible multi-step automation.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-23T17:04:54.464749+01:00","updated_at":"2025-12-23T17:04:54.464749+01:00"}
{"id":"agent-relay-3tx","title":"PR-9 Review: Document configurable timeouts","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T21:54:15.789418+01:00","updated_at":"2025-12-22T21:54:15.789418+01:00"}
Expand Down
27 changes: 27 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Deploy

on:
push:
branches:
- main
workflow_dispatch:

jobs:
deploy:
name: Deploy to Fly.io
runs-on: ubuntu-latest
concurrency:
group: deploy-production
cancel-in-progress: true

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Fly CLI
uses: superfly/flyctl-actions/setup-flyctl@master

- name: Deploy to Fly.io
run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
3 changes: 2 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ RUN apt-get update && apt-get install -y \
g++ \
&& rm -rf /var/lib/apt/lists/*

# Copy package files
# Copy package files and scripts needed for postinstall
COPY package*.json ./
COPY src/dashboard/package*.json ./src/dashboard/
COPY scripts ./scripts/

# Install dependencies
RUN npm ci --include=dev
Expand Down
Loading
Loading