Skip to content

feat: group DM conversations — lifecycle + members (1/3)#24

Merged
ColonistOne merged 2 commits into
masterfrom
feat/group-dm-lifecycle
May 27, 2026
Merged

feat: group DM conversations — lifecycle + members (1/3)#24
ColonistOne merged 2 commits into
masterfrom
feat/group-dm-lifecycle

Conversation

@ColonistOne
Copy link
Copy Markdown
Collaborator

Summary

First of three PRs porting the group-DM surface from colony-sdk Python v1.13.0 to @thecolony/sdk. Wraps /api/v1/messages/groups/* lifecycle + member-management endpoints. No version bump — per the multi-PR plan we'll combine all three into one release tag.

Methods added (13)

Lifecycle:

  • createGroupConversation(title, members, options?) — invite 1..49 usernames; caller is auto-added as creator/admin
  • listGroupTemplates(options?) — pre-configured group shapes
  • createGroupFromTemplate(template, members, { titleOverride? })
  • getGroupConversation(convId, { limit?, offset? }) — slim envelope (member_count, not full members[])
  • updateGroupConversation(convId, { title?, description? }) — three-state: "" clears, undefined omits
  • sendGroupMessage(convId, body, { replyToMessageId?, idempotencyKey? })

Members:

  • listGroupMembers, addGroupMember, removeGroupMember, setGroupAdmin, transferGroupCreator, respondToGroupInvite, markGroupAllRead

New exported types

GroupConversation, GroupConversationDetail, GroupMember, GroupMembersResponse, GroupTemplate, GroupTemplatesResponse, GroupInviteResponse, MarkGroupReadResponse.

Internal

  • RequestOptions gains extraHeaders?: Record<string, string> so write methods can set per-request headers like Idempotency-Key cleanly. Used so far only by sendGroupMessage; lays groundwork for any future write that needs custom headers.
  • Booleans on query-string endpoints use the lowercase "true"/"false" FastAPI expects (pinned by setGroupAdmin + respondToGroupInvite tests with explicit not.toContain("is_admin=True") assertions).

Test plan

  • npm run typecheck — clean
  • npm run lint — clean
  • npm run format:check — clean (after prettier --write on the updated README table)
  • npm run test224 passed, 50 skipped (+19 new tests, all passing). Baseline was 205 passed.
  • Live API round trip — deferred to a follow-up integration-test PR, same shape as the Python tests/integration/test_group_messages.py work

Per the TheColonyCC/* convention, holding the merge button for human review.

🤖 Generated with Claude Code

Wraps the group-DM surface at /api/v1/messages/groups/* that the
Python SDK shipped in colony-sdk v1.13.0 (#56 over there). First of
three PRs that complete group-DM coverage in the JS SDK; per-message
ops + attachments will follow.

Lifecycle (6 methods):
- createGroupConversation(title, members, options?)
- listGroupTemplates(options?)
- createGroupFromTemplate(template, members, { titleOverride? })
- getGroupConversation(convId, { limit?, offset? })
- updateGroupConversation(convId, { title?, description? })
- sendGroupMessage(convId, body, { replyToMessageId?, idempotencyKey? })

Member management (7 methods):
- listGroupMembers, addGroupMember, removeGroupMember, setGroupAdmin,
  transferGroupCreator, respondToGroupInvite, markGroupAllRead

New exported types: GroupConversation, GroupConversationDetail,
GroupMember, GroupMembersResponse, GroupTemplate,
GroupTemplatesResponse, GroupInviteResponse, MarkGroupReadResponse.

Internal: RequestOptions gains an extraHeaders field so write methods
can set per-request headers like Idempotency-Key cleanly. Booleans on
query-string endpoints use the lowercase "true"/"false" FastAPI
expects, not JavaScript's default capitalised String(true).

19 new unit tests cover request shape, header threading, default-vs-
omitted parameters, the FastAPI lowercase-bool quirk, query-string
escaping (`R&D Lab` → `title=R%26D+Lab`), and the three-state
description contract on update (empty clears, undefined omits).

No version bump per the multi-PR release plan; CHANGELOG entry lands
in Unreleased.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented May 27, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Two branches in the new methods weren't exercised by the original
test set:

- updateGroupConversation with only `title` (not just description) —
  the `if (options.title !== undefined)` true-branch was never hit
- createGroupFromTemplate without `titleOverride` — the optional-
  param branch was only exercised in the override-set case

Adds two focused tests; client.ts branch coverage moves from 97.41
to 98.27. All remaining uncovered branches are pre-existing in
register() and extractItems(), not introduced by this PR.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@ColonistOne ColonistOne merged commit 91a8b36 into master May 27, 2026
7 checks passed
@ColonistOne ColonistOne deleted the feat/group-dm-lifecycle branch May 27, 2026 16:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant