# @kaiban/sdk — Changelog

All notable changes to this package will be documented here.
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

---

## [2.5.1] — 2026-04-16

### Fixed

- `activities.bulkCreate()` was sending the items array as a raw body instead of `{ items: [...] }`, causing 422 validation errors from the API.

---

## [2.5.0] — 2026-04-11

### Added

**Notifications** (`src/resources/notifications.ts`)
- `list`, `get`, `update` (mark read), `delete`, `markAllRead({ user_id })` → `{ updated: number }`.

**Apps** (`src/resources/apps.ts`)
- Apps CRUD: `list`, `create`, `get`, `update`, `delete`.
- Settings sub-resource: `listSettings`, `createSettings`, `getSettings`, `updateSettings`, `deleteSettings`.

**Integrations** (`src/resources/integrations.ts`)
- `list`, `create`, `get`, `update`, `delete`.
- `getConfig(id)` — returns integration with decrypted config (server-side use only).

**Agent Drafts** (`src/resources/agent-drafts.ts`)
- `list`, `create`, `get`, `update`, `delete`.
- `publish(id, data)` — promotes draft to live `Agent`; returns the resulting `Agent`.

**Positions** (`src/resources/positions.ts`)
- CRUD: `list`, `create`, `get`, `update`, `delete`.

**Resources** (`src/resources/resources.ts`)
- CRUD: `list`, `create`, `get`, `update`, `delete`.

**New domain types**
- `Notification`, `NotificationCreate`, `NotificationUpdate`, `MarkAllReadBody`, `NotificationType`.
- `App`, `AppCreate`, `AppUpdate`, `AppSettings`, `AppSettingsCreate`, `AppSettingsUpdate`.
- `Integration`, `IntegrationCreate`, `IntegrationUpdate`.
- `AgentDraft`, `AgentDraftCreate`, `AgentDraftUpdate`, `AgentDraftPublishBody`, `AgentDraftStatus`, `AgentDraftPriority`.
- `Position`, `PositionCreate`, `PositionUpdate`, `PositionStatus`.
- `Resource`, `ResourceCreate`, `ResourceUpdate`, `ResourceStatus`, `EmbeddingProvider`, `DocumentParser`.

**Bundle size:** ~83 KB (up from 64 KB).

---

## [2.4.0] — 2026-04-11

### Added

**Agents resource (`src/resources/agents.ts`)**
- `client.agents.list(params?)` — cursor-paginated list.
- `client.agents.create(data)` — create agent.
- `client.agents.get(id)` — fetch by ID.
- `client.agents.update(id, data)` — partial update.
- `client.agents.delete(id)` — permanently remove agent.
- `client.agents.retire(id, data)` — retire agent from boards with per-board `remove`/`keep` action; returns `AgentRetireResult`.
- `client.agents.listFeedback(agentId, params?)` — list feedback entries.
- `client.agents.createFeedback(agentId, data)` — submit feedback.
- `client.agents.getFeedback(agentId, feedbackId)` — fetch feedback entry.
- `client.agents.updateFeedback(agentId, feedbackId, data)` — update feedback.
- `client.agents.deleteFeedback(agentId, feedbackId)` — delete feedback.
- `client.agents.listSupervisorFeedback(agentId, params?)` — list supervisor feedback.
- `client.agents.createSupervisorFeedback(agentId, data)` — submit supervisor feedback.
- `client.agents.getSupervisorFeedback(agentId, sfid)` — fetch supervisor feedback.
- `client.agents.updateSupervisorFeedback(agentId, sfid, data)` — update supervisor feedback.
- `client.agents.deleteSupervisorFeedback(agentId, sfid)` — delete supervisor feedback.

**New domain types**
- `Agent`, `AgentCreate`, `AgentUpdate`, `AgentExample`, `AgentResource`.
- `AgentRetireBody`, `AgentRetireResult`, `AgentRetireBoardEntry`.
- `AgentFeedback`, `AgentFeedbackCreate`, `AgentFeedbackUpdate`.
- `SupervisorFeedback`, `SupervisorFeedbackCreate`, `SupervisorFeedbackUpdate`.
- Enums: `AgentKind`, `AgentStatus`, `AgentRetireAction`, `FeedbackType`, `FeedbackStatus`, `FeedbackEvaluation`.

**Bundle size:** ~64 KB (up from 52 KB).

---

## [2.3.0] — 2026-04-11

### Added

**Boards resource (`src/resources/boards.ts`)**
- `client.boards.list(params?)` — cursor-paginated list.
- `client.boards.create(data)` — create board.
- `client.boards.get(id)` — fetch by ID or alias.
- `client.boards.update(id, data)` — partial update.
- `client.boards.delete(id)` — remove board.
- `client.boards.listTags(id)` — aggregated tags across all cards on the board.
- `client.boards.listMembers(id)` — aggregated `member_ids` and `agent_ids`.
- `client.boards.emptyRecycleBin(id)` — hard-delete all recycled cards; returns `{ deleted_count }`.
- `client.boards.listChannels(boardId, params?)` — list external channels.
- `client.boards.createChannel(boardId, data)` — link external channel.
- `client.boards.getChannel(boardId, channelId)` — fetch channel.
- `client.boards.updateChannel(boardId, channelId, data)` — update channel.
- `client.boards.deleteChannel(boardId, channelId)` — unlink channel.

**Cards resource (`src/resources/cards.ts`)**
- `client.cards.list(params?)` — cursor-paginated list; supports `deleted: true` for recycle bin.
- `client.cards.create(data)` — create card.
- `client.cards.get(id)` — fetch card with `related_cards_resolved` enrichment.
- `client.cards.update(id, data)` — partial update.
- `client.cards.delete(id, { permanent? })` — soft-delete or hard-delete.
- `client.cards.bulkCreate(items)` — create many cards.
- `client.cards.bulkUpdate(items)` — update many cards.
- `client.cards.bulkDelete(items, { permanent? })` — delete many cards.
- `client.cards.bulkMove(items)` — move many cards to a target column.
- `client.cards.restore(id)` — restore from recycle bin.
- `client.cards.clone(id)` — duplicate card.
- `client.cards.assignAgent(id, { agent_id })` — assign or clear agent (`null` to clear).
- `client.cards.addMember(id, { user_id })` — add member.
- `client.cards.removeMember(id, userId)` — remove member.
- `client.cards.addAttachment(id, data)` — attach uploaded file.
- `client.cards.removeAttachment(id, { file_id })` — remove attachment.
- Sessions: `createSession`, `listSessions`, `getSession`, `updateSession`, `deleteSession`.
- Session Data: `createSessionData` (single or batch), `listSessionData`, `getSessionData`, `updateSessionData`, `deleteSessionData`.
- Comments: `createComment`, `listComments`, `updateComment`, `deleteComment`.
- Replies: `createReply`, `listReplies`.

**New domain types**
- Boards: `Board`, `BoardCreate`, `BoardUpdate`, `Column`, `TagDefinition`, `TagDefinitionColor`.
- External Channels: `ExternalChannel`, `ExternalChannelCreate`, `ExternalChannelUpdate`.
- Cards: `Card`, `CardCreate`, `CardUpdate`, `CardBulkUpdateItem`, `CardBulkMoveItem`, `CardBulkDeleteItem`.
- Parts: `Part`, `TextPart`, `FilePart`, `DataPart`, `CardInputPart`, `RelatedCardResolved`.
- Sessions: `Session`, `SessionCreate`, `SessionUpdate`, `SessionData`, `SessionDataCreate`, `SessionDataUpdate`.
- Comments: `CardComment`, `CardCommentCreate`, `CardCommentUpdate`.
- Enums: `CardStatus`, `CardPriority`, `PartType`.

**Bundle size:** ~52 KB (up from 28 KB — boards + cards domain added).

---

## [2.2.0] — 2026-04-11

### Changed

- **Auth:** Added `apiKey` option to `ClientConfig` — sent as `X-Api-Key` header for agents and external systems.
- `token` / `getToken` remain for Bearer (Firebase JWT) auth.
- `resolveToken()` replaced by `resolveAuth()` — returns the correct header key + value per auth method. API key takes precedence.
- Default base URL updated to `https://agi.kaiban.io/api/v2`.

---

## [2.1.0] — 2026-04-11

Initial release. Universal TypeScript/JS SDK for Kaiban API v2 — works in Node 18+, all modern browsers, and edge runtimes (Cloudflare Workers, Vercel Edge).

### Added

**Client**
- `KaibanClient` — single entry point; instantiate once, reuse everywhere.

**Authentication — two methods**
- `apiKey` → `X-Api-Key` header — for agents and external systems (`kb_t_...` / `kb_s_...`).
- `token` / `getToken` → `Authorization: Bearer` — for user identity (static JWT or Firebase auto-refresh factory).

**HTTP layer (`src/http/`)**
- `Fetcher` — universal fetch wrapper built on `globalThis.fetch`; zero Node-specific imports.
- Automatic `x-tenant` header injection on every request.
- Timeout via `AbortSignal.timeout()` with per-request override support.
- `AbortSignal.any()` composition (with fallback for Node < 20).
- RFC 9457 error mapping — typed error classes for every HTTP status.
- `stream()` method returns raw `Response` for SSE consumption.

**Error classes (`src/http/errors.ts`)**
- `KaibanError` base with `status` and `problem: ProblemDetail`.
- `BadRequestError`, `UnauthorizedError`, `ForbiddenError`, `NotFoundError`, `ConflictError`, `ValidationError`, `RateLimitError`, `ServerError`, `ServiceUnavailableError`, `TimeoutError`, `AbortedError`.

**Teams resource (`src/resources/teams.ts`)**
- `client.teams.list(params?)` — cursor-paginated list.
- `client.teams.create(data)` — create team.
- `client.teams.get(id)` — fetch by ID.
- `client.teams.update(id, data)` — partial update.
- `client.teams.delete(id)` — remove team.
- `client.teams.listMembers(teamId, params?)` — list team members.
- `client.teams.addMember(teamId, data)` — add member.
- `client.teams.updateMember(teamId, memberId, data)` — update member role / profile.
- `client.teams.removeMember(teamId, memberId)` — remove member.
- `client.teams.invite(teamId, data)` — invite user by email.
- `client.teams.listInvitations(teamId, params?)` — list pending invitations.
- `client.teams.deleteInvitation(teamId, invitationId)` — revoke invitation.

**Activities resource (`src/resources/activities.ts`)**
- `client.activities.list(params?)` — cursor-paginated list with DSL filter support.
- `client.activities.create(data)` — log a single activity.
- `client.activities.bulkCreate(items)` — log multiple activities in one request.
- `client.activities.stream(options)` — real-time SSE stream via WHATWG `ReadableStream`; returns `StreamHandle` with `cancel()`.

**Domain types**
- All types imported directly from `api-v2/src/types/` — single source of truth, no duplication.
- `Team`, `TeamCreate`, `TeamUpdate`, `Invite`, `InviteCreate`.
- `TeamMember`, `TeamMemberCreate`, `TeamMemberUpdate`, `TeamMemberRole`.
- `Activity`, `ActivityCreate`, `Actor`, `ActivityType`, `ActorTypeValues`.
- `Paginated<T>`, `ListParams` — SDK-specific shared types.
- `zod` declared as `peerDependency >=4.0.0`; marked `external` in tsup — not bundled.

**Build**
- Dual ESM + CJS output via `tsup`.
- Full `.d.ts` declarations generated.
- `platform: "neutral"` — no Node or browser globals assumed beyond `globalThis.fetch`.
- Bundle size: ~28 KB (zod excluded).
