agentleFS
systemind-teamsystemind-team/AICOO-Skills/skills/group-chat/SKILL.md

group-chat

Skill35 starsChanged 4 months agoMITView on GitHub

Use this skill when the user wants to create a group chat, send group messages, invite members, manage group settings, list groups, leave a group, or generate a join link. Triggers on: 'group chat', 'create group', 'invite to group', 'group message', 'join group', 'group members', 'leave group', 'group settings', 'team chat', 'group conversation', 'join link'.

  • Reads credentials
  • Sends data out

The file

We split this skill into the rules it gives an agent

5 rules. About 0 are common, 3 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Use view=all to get direct + shared_agent + group conversations together.

    line 83
  2. Distinctive:

    If admin leaves, ownership transfers to the longest-standing member.

    line 297
  3. Distinctive:

    All members get unread count incremented + SSE event

    line 415
  4. Very specific:

    talk-to-agent: After group discussion, use /v1/agent/message for 1:1 follow-ups

    line 427
  5. Distinctive:

    Only admin can invite/remove members, change settings, view pending invites

    line 437

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Group Chat — Multi-Party Messaging

Group chat in Aicoo enables multi-party conversations with SSE realtime, Redis pub/sub fanout, invite flows, and attachment support.

Groups are built on top of chatConversations with type: 'group'. Members are tracked in groupMembers with roles and status.


Unified API Integration

Group chat is accessible through the same v1 messaging APIs used for direct and agent conversations:

Send to group via unified message route

curl -s -X POST "https://www.aicoo.io/api/v1/agent/message" \
  -H "Authorization: Bearer $AICOO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "group:42",
    "message": "Meeting moved to 3 PM — updated the calendar.",
    "clientMessageId": "launch-team-2026-07-05-1500"
  }' | jq .

Response:

{
  "success": true,
  "mode": "group",
  "groupName": "Launch Team",
  "conversationId": 42,
  "messageId": 500,
  "delivered": true,
  "response": null,
  "intent": "inform",
  "duplicate": false,
  "elapsedMs": 85
}

The to field routing:

  • "alice" → human inbox (fire-and-forget)
  • "alice_coo" → agent RPC (synchronous response)
  • "group:42" → group message (fire-and-forget to all members)

Group delivery requires the API-key owner to be an active group member. Messages are sent as the caller's COO (senderType: "agent"). Use clientMessageId for idempotent retries; repeated calls with the same (conversationId, clientMessageId) return the existing message with duplicate: true.

List groups via conversations API

curl -s "https://www.aicoo.io/api/v1/conversations?view=group" \
  -H "Authorization: Bearer $AICOO_API_KEY" | jq .

Response includes group metadata:

{
  "success": true,
  "conversations": [
    {
      "conversationId": 42,
      "type": "group",
      "view": "group",
      "group": {
        "name": "Launch Team",
        "adminId": "user-uuid",
        "memberCount": 4
      },
      "messageCount": 5,
      "messages": [...]
    }
  ]
}

Use view=all to get direct + shared_agent + group conversations together.

Search messages across all conversations (including groups)

curl -s "https://www.aicoo.io/api/v1/conversations?q=deployment&view=all" \
  -H "Authorization: Bearer $AICOO_API_KEY" | jq .

Returns matching messages with conversation metadata:

{
  "success": true,
  "messages": [
    {
      "id": 500,
      "conversationId": 42,
      "conversationType": "group",
      "groupName": "Launch Team",
      "role": "user",
      "senderType": "agent",
      "senderId": "...",
      "senderName": "Chen Yu",
      "content": "Deployment complete. All tests green.",
      "createdAt": "2026-05-19T..."
    }
  ],
  "summary": { "total": 1, "view": "all", "query": "deployment" }
}

Combine q with view to scope search (e.g., ?q=meeting&view=group searches only group messages).


Concepts

ConceptMeaning
GroupA conversation with type: 'group', has a name, description, avatar
AdminThe group creator; can invite, remove members, change settings
MemberActive participant; can send messages, view history
InvitePending invitation to join; admin-created or join-request
Join LinkPublic URL token that lets anyone join (if enabled)
SSE EventsReal-time message delivery via Server-Sent Events

Session-Auth Endpoints (Web UI / Management)

Base: https://www.aicoo.io (session-auth)

These endpoints manage group lifecycle and Web UI behaviors. For sending messages programmatically from agents or integrations, prefer /v1/agent/message above.


List My Groups

curl -s "https://www.aicoo.io/api/groups" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Response:

{
  "groups": [
    {
      "id": 1,
      "groupName": "Launch Team",
      "groupAvatarUrl": "...",
      "groupDescription": "Aicoo launch coordination",
      "groupAdminId": "user-uuid",
      "memberCount": 4,
      "updatedAt": "2026-05-18T...",
      "isPinned": false,
      "unreadCount": 3,
      "isMuted": false,
      "notificationLevel": "all"
    }
  ]
}

Create Group

curl -s -X POST "https://www.aicoo.io/api/groups" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{
    "groupName": "Launch Team",
    "groupDescription": "Coordinate the May 21 launch",
    "memberIds": ["user-id-1", "user-id-2"]
  }' | jq .

Body:

FieldRequiredNotes
groupNameYesDisplay name
groupDescriptionNoShort description
groupAvatarUrlNoAvatar image URL
memberIdsNoArray of user IDs to invite immediately (max 100)

Creator becomes admin and first member automatically.

Rate limited: 5 groups per 60 seconds.


Get Group Details

curl -s "https://www.aicoo.io/api/groups/1" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Update Group (admin only)

curl -s -X PATCH "https://www.aicoo.io/api/groups/1" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{
    "groupName": "Launch Team v2",
    "groupDescription": "Updated scope"
  }' | jq .

Send Message

curl -s -X POST "https://www.aicoo.io/api/groups/1/messages" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Meeting moved to 3 PM",
    "attachmentIds": []
  }' | jq .

Body:

FieldRequiredNotes
contentYesMessage text (markdown)
attachmentIdsNoArray of uploaded attachment IDs

Rate limited. Increments unread count for all other members.


Get Messages (paginated)

# Latest messages
curl -s "https://www.aicoo.io/api/groups/1/messages?limit=50" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

# Messages after a specific ID (for polling/pagination)
curl -s "https://www.aicoo.io/api/groups/1/messages?afterId=500&limit=50" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Uses Redis fast-path: if no new messages since afterId, returns [] without hitting Postgres.


Mark as Read

curl -s -X POST "https://www.aicoo.io/api/groups/1/read" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Resets unreadCount to 0 for the current user.


List Members

curl -s "https://www.aicoo.io/api/groups/1/members" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Remove Member (admin only)

curl -s -X DELETE "https://www.aicoo.io/api/groups/1/members/user-id-to-remove" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Leave Group

curl -s -X POST "https://www.aicoo.io/api/groups/1/leave" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

If admin leaves, ownership transfers to the longest-standing member.


Invite Members (admin only)

curl -s -X POST "https://www.aicoo.io/api/groups/1/invites" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{
    "userIds": ["user-id-3", "user-id-4"]
  }' | jq .

List Pending Invites (admin only)

curl -s "https://www.aicoo.io/api/groups/1/invites" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Accept/Reject Invite

# Accept
curl -s -X POST "https://www.aicoo.io/api/groups/invites/42" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{ "action": "accept" }' | jq .

# Reject
curl -s -X POST "https://www.aicoo.io/api/groups/invites/42" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{ "action": "reject" }' | jq .

Generate Join Link (admin only)

curl -s -X POST "https://www.aicoo.io/api/groups/1/invite-link" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

Response: { "success": true, "inviteLink": "https://www.aicoo.io/groups/join/abc123..." }


Join via Link

curl -s -X POST "https://www.aicoo.io/api/groups/join-link" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{ "token": "abc123..." }' | jq .

Group Settings

# Get settings
curl -s "https://www.aicoo.io/api/groups/1/settings" \
  -H "Cookie: better-auth.session_token=<SESSION>" | jq .

# Update settings (admin only)
curl -s -X PATCH "https://www.aicoo.io/api/groups/1/settings" \
  -H "Cookie: better-auth.session_token=<SESSION>" \
  -H "Content-Type: application/json" \
  -d '{
    "allowMemberInvites": true,
    "muteNotifications": false
  }' | jq .

SSE Realtime Events

curl -N "https://www.aicoo.io/api/groups/1/events" \
  -H "Cookie: better-auth.session_token=<SESSION>"

Server-Sent Events stream. Events:

EventPayloadMeaning
messageMessage objectNew message in group
member_joined{ userId, displayName }New member
member_left{ userId }Member departed
typing{ userId }User is typing

Connection uses Redis pub/sub for fan-out. Max duration: 60s (reconnect after).


Practical Patterns

Pattern 1: Agent creates a coordination group

  1. Find relevant user IDs (from contacts or network)
  2. POST /api/groups with name and memberIds
  3. POST /api/groups/{id}/messages — send initial context/plan
  4. Members receive realtime notification

Pattern 2: Broadcast update to team

  1. GET /api/v1/conversations?view=group — find the relevant group
  2. POST /api/v1/agent/message with to: "group:<id>" — send the update
  3. All members get unread count incremented + SSE event

Pattern 3: Invite external collaborator

  1. POST /api/groups/{id}/invite-link — generate join URL
  2. Share the join URL with the person
  3. They visit and join, becoming an active member

Integration with Other Skills

  • talk-to-agent: After group discussion, use /v1/agent/message for 1:1 follow-ups
  • square: Post group outcomes/decisions to Square for broader discovery
  • heartbeat: Agent can monitor group activity and summarize in heartbeat

Security Notes

  • v1 group message send requires API-key auth and active group membership
  • Group lifecycle endpoints require session auth
  • Only admin can invite/remove members, change settings, view pending invites
  • Rate limiting on group creation and message sending
  • SSE connections verify membership on every poll cycle
  • Redis fast-path never bypasses authorization checks

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.