feat(feishu): replace built-in SDK with community plugin

Replace the built-in Feishu SDK with the community-maintained
clawdbot-feishu plugin by @m1heng.

Changes:
- Remove src/feishu/ directory (19 files)
- Remove src/channels/plugins/outbound/feishu.ts
- Remove src/channels/plugins/normalize/feishu.ts
- Remove src/config/types.feishu.ts
- Remove feishu exports from plugin-sdk/index.ts
- Remove FeishuConfig from types.channels.ts

New features in community plugin:
- Document tools (read/create/edit Feishu docs)
- Wiki tools (navigate/manage knowledge base)
- Drive tools (folder/file management)
- Bitable tools (read/write table records)
- Permission tools (collaborator management)
- Emoji reactions support
- Typing indicators
- Rich media support (bidirectional image/file transfer)
- @mention handling
- Skills for feishu-doc, feishu-wiki, feishu-drive, feishu-perm

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Yifeng Wang
2026-02-05 18:26:05 +08:00
committed by cpojer
parent 02842bef91
commit 2267d58afc
66 changed files with 5702 additions and 4486 deletions

View File

@@ -0,0 +1,105 @@
---
name: feishu-doc
description: |
Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.
---
# Feishu Document Tool
Single tool `feishu_doc` with action parameter for all document operations.
## Token Extraction
From URL `https://xxx.feishu.cn/docx/ABC123def``doc_token` = `ABC123def`
## Actions
### Read Document
```json
{ "action": "read", "doc_token": "ABC123def" }
```
Returns: title, plain text content, block statistics. Check `hint` field - if present, structured content (tables, images) exists that requires `list_blocks`.
### Write Document (Replace All)
```json
{ "action": "write", "doc_token": "ABC123def", "content": "# Title\n\nMarkdown content..." }
```
Replaces entire document with markdown content. Supports: headings, lists, code blocks, quotes, links, images (`![](url)` auto-uploaded), bold/italic/strikethrough.
**Limitation:** Markdown tables are NOT supported.
### Append Content
```json
{ "action": "append", "doc_token": "ABC123def", "content": "Additional content" }
```
Appends markdown to end of document.
### Create Document
```json
{ "action": "create", "title": "New Document" }
```
With folder:
```json
{ "action": "create", "title": "New Document", "folder_token": "fldcnXXX" }
```
### List Blocks
```json
{ "action": "list_blocks", "doc_token": "ABC123def" }
```
Returns full block data including tables, images. Use this to read structured content.
### Get Single Block
```json
{ "action": "get_block", "doc_token": "ABC123def", "block_id": "doxcnXXX" }
```
### Update Block Text
```json
{
"action": "update_block",
"doc_token": "ABC123def",
"block_id": "doxcnXXX",
"content": "New text"
}
```
### Delete Block
```json
{ "action": "delete_block", "doc_token": "ABC123def", "block_id": "doxcnXXX" }
```
## Reading Workflow
1. Start with `action: "read"` - get plain text + statistics
2. Check `block_types` in response for Table, Image, Code, etc.
3. If structured content exists, use `action: "list_blocks"` for full data
## Configuration
```yaml
channels:
feishu:
tools:
doc: true # default: true
```
**Note:** `feishu_wiki` depends on this tool - wiki page content is read/written via `feishu_doc`.
## Permissions
Required: `docx:document`, `docx:document:readonly`, `docx:document.block:convert`, `drive:drive`

View File

@@ -0,0 +1,103 @@
# Feishu Block Types Reference
Complete reference for Feishu document block types. Use with `feishu_doc_list_blocks`, `feishu_doc_update_block`, and `feishu_doc_delete_block`.
## Block Type Table
| block_type | Name | Description | Editable |
| ---------- | --------------- | ------------------------------ | -------- |
| 1 | Page | Document root (contains title) | No |
| 2 | Text | Plain text paragraph | Yes |
| 3 | Heading1 | H1 heading | Yes |
| 4 | Heading2 | H2 heading | Yes |
| 5 | Heading3 | H3 heading | Yes |
| 6 | Heading4 | H4 heading | Yes |
| 7 | Heading5 | H5 heading | Yes |
| 8 | Heading6 | H6 heading | Yes |
| 9 | Heading7 | H7 heading | Yes |
| 10 | Heading8 | H8 heading | Yes |
| 11 | Heading9 | H9 heading | Yes |
| 12 | Bullet | Unordered list item | Yes |
| 13 | Ordered | Ordered list item | Yes |
| 14 | Code | Code block | Yes |
| 15 | Quote | Blockquote | Yes |
| 16 | Equation | LaTeX equation | Partial |
| 17 | Todo | Checkbox / task item | Yes |
| 18 | Bitable | Multi-dimensional table | No |
| 19 | Callout | Highlight block | Yes |
| 20 | ChatCard | Chat card embed | No |
| 21 | Diagram | Diagram embed | No |
| 22 | Divider | Horizontal rule | No |
| 23 | File | File attachment | No |
| 24 | Grid | Grid layout container | No |
| 25 | GridColumn | Grid column | No |
| 26 | Iframe | Embedded iframe | No |
| 27 | Image | Image | Partial |
| 28 | ISV | Third-party widget | No |
| 29 | MindnoteBlock | Mindmap embed | No |
| 30 | Sheet | Spreadsheet embed | No |
| 31 | Table | Table | Partial |
| 32 | TableCell | Table cell | Yes |
| 33 | View | View embed | No |
| 34 | Undefined | Unknown type | No |
| 35 | QuoteContainer | Quote container | No |
| 36 | Task | Lark Tasks integration | No |
| 37 | OKR | OKR integration | No |
| 38 | OKRObjective | OKR objective | No |
| 39 | OKRKeyResult | OKR key result | No |
| 40 | OKRProgress | OKR progress | No |
| 41 | AddOns | Add-ons block | No |
| 42 | JiraIssue | Jira issue embed | No |
| 43 | WikiCatalog | Wiki catalog | No |
| 44 | Board | Board embed | No |
| 45 | Agenda | Agenda block | No |
| 46 | AgendaItem | Agenda item | No |
| 47 | AgendaItemTitle | Agenda item title | No |
| 48 | SyncedBlock | Synced block reference | No |
## Editing Guidelines
### Text-based blocks (2-17, 19)
Update text content using `feishu_doc_update_block`:
```json
{
"doc_token": "ABC123",
"block_id": "block_xxx",
"content": "New text content"
}
```
### Image blocks (27)
Images cannot be updated directly via `update_block`. Use `feishu_doc_write` or `feishu_doc_append` with markdown to add new images.
### Table blocks (31)
**Important:** Table blocks CANNOT be created via the `documentBlockChildren.create` API (error 1770029). This affects `feishu_doc_write` and `feishu_doc_append` - markdown tables will be skipped with a warning.
Tables can only be read (via `list_blocks`) and individual cells (type 32) can be updated, but new tables cannot be inserted programmatically via markdown.
### Container blocks (24, 25, 35)
Grid and QuoteContainer are layout containers. Edit their child blocks instead.
## Common Patterns
### Replace specific paragraph
1. `feishu_doc_list_blocks` - find the block_id
2. `feishu_doc_update_block` - update its content
### Insert content at specific location
Currently, the API only supports appending to document end. For insertion at specific positions, consider:
1. Read existing content
2. Delete affected blocks
3. Rewrite with new content in desired order
### Delete multiple blocks
Blocks must be deleted one at a time. Delete child blocks before parent containers.

View File

@@ -0,0 +1,97 @@
---
name: feishu-drive
description: |
Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.
---
# Feishu Drive Tool
Single tool `feishu_drive` for cloud storage operations.
## Token Extraction
From URL `https://xxx.feishu.cn/drive/folder/ABC123``folder_token` = `ABC123`
## Actions
### List Folder Contents
```json
{ "action": "list" }
```
Root directory (no folder_token).
```json
{ "action": "list", "folder_token": "fldcnXXX" }
```
Returns: files with token, name, type, url, timestamps.
### Get File Info
```json
{ "action": "info", "file_token": "ABC123", "type": "docx" }
```
Searches for the file in the root directory. Note: file must be in root or use `list` to browse folders first.
`type`: `doc`, `docx`, `sheet`, `bitable`, `folder`, `file`, `mindnote`, `shortcut`
### Create Folder
```json
{ "action": "create_folder", "name": "New Folder" }
```
In parent folder:
```json
{ "action": "create_folder", "name": "New Folder", "folder_token": "fldcnXXX" }
```
### Move File
```json
{ "action": "move", "file_token": "ABC123", "type": "docx", "folder_token": "fldcnXXX" }
```
### Delete File
```json
{ "action": "delete", "file_token": "ABC123", "type": "docx" }
```
## File Types
| Type | Description |
| ---------- | ----------------------- |
| `doc` | Old format document |
| `docx` | New format document |
| `sheet` | Spreadsheet |
| `bitable` | Multi-dimensional table |
| `folder` | Folder |
| `file` | Uploaded file |
| `mindnote` | Mind map |
| `shortcut` | Shortcut |
## Configuration
```yaml
channels:
feishu:
tools:
drive: true # default: true
```
## Permissions
- `drive:drive` - Full access (create, move, delete)
- `drive:drive:readonly` - Read only (list, info)
## Known Limitations
- **Bots have no root folder**: Feishu bots use `tenant_access_token` and don't have their own "My Space". The root folder concept only exists for user accounts. This means:
- `create_folder` without `folder_token` will fail (400 error)
- Bot can only access files/folders that have been **shared with it**
- **Workaround**: User must first create a folder manually and share it with the bot, then bot can create subfolders inside it

View File

@@ -0,0 +1,119 @@
---
name: feishu-perm
description: |
Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.
---
# Feishu Permission Tool
Single tool `feishu_perm` for managing file/document permissions.
## Actions
### List Collaborators
```json
{ "action": "list", "token": "ABC123", "type": "docx" }
```
Returns: members with member_type, member_id, perm, name.
### Add Collaborator
```json
{
"action": "add",
"token": "ABC123",
"type": "docx",
"member_type": "email",
"member_id": "user@example.com",
"perm": "edit"
}
```
### Remove Collaborator
```json
{
"action": "remove",
"token": "ABC123",
"type": "docx",
"member_type": "email",
"member_id": "user@example.com"
}
```
## Token Types
| Type | Description |
| ---------- | ----------------------- |
| `doc` | Old format document |
| `docx` | New format document |
| `sheet` | Spreadsheet |
| `bitable` | Multi-dimensional table |
| `folder` | Folder |
| `file` | Uploaded file |
| `wiki` | Wiki node |
| `mindnote` | Mind map |
## Member Types
| Type | Description |
| ------------------ | ------------------ |
| `email` | Email address |
| `openid` | User open_id |
| `userid` | User user_id |
| `unionid` | User union_id |
| `openchat` | Group chat open_id |
| `opendepartmentid` | Department open_id |
## Permission Levels
| Perm | Description |
| ------------- | ------------------------------------ |
| `view` | View only |
| `edit` | Can edit |
| `full_access` | Full access (can manage permissions) |
## Examples
Share document with email:
```json
{
"action": "add",
"token": "doxcnXXX",
"type": "docx",
"member_type": "email",
"member_id": "alice@company.com",
"perm": "edit"
}
```
Share folder with group:
```json
{
"action": "add",
"token": "fldcnXXX",
"type": "folder",
"member_type": "openchat",
"member_id": "oc_xxx",
"perm": "view"
}
```
## Configuration
```yaml
channels:
feishu:
tools:
perm: true # default: false (disabled)
```
**Note:** This tool is disabled by default because permission management is a sensitive operation. Enable explicitly if needed.
## Permissions
Required: `drive:permission`

View File

@@ -0,0 +1,111 @@
---
name: feishu-wiki
description: |
Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.
---
# Feishu Wiki Tool
Single tool `feishu_wiki` for knowledge base operations.
## Token Extraction
From URL `https://xxx.feishu.cn/wiki/ABC123def``token` = `ABC123def`
## Actions
### List Knowledge Spaces
```json
{ "action": "spaces" }
```
Returns all accessible wiki spaces.
### List Nodes
```json
{ "action": "nodes", "space_id": "7xxx" }
```
With parent:
```json
{ "action": "nodes", "space_id": "7xxx", "parent_node_token": "wikcnXXX" }
```
### Get Node Details
```json
{ "action": "get", "token": "ABC123def" }
```
Returns: `node_token`, `obj_token`, `obj_type`, etc. Use `obj_token` with `feishu_doc` to read/write the document.
### Create Node
```json
{ "action": "create", "space_id": "7xxx", "title": "New Page" }
```
With type and parent:
```json
{
"action": "create",
"space_id": "7xxx",
"title": "Sheet",
"obj_type": "sheet",
"parent_node_token": "wikcnXXX"
}
```
`obj_type`: `docx` (default), `sheet`, `bitable`, `mindnote`, `file`, `doc`, `slides`
### Move Node
```json
{ "action": "move", "space_id": "7xxx", "node_token": "wikcnXXX" }
```
To different location:
```json
{
"action": "move",
"space_id": "7xxx",
"node_token": "wikcnXXX",
"target_space_id": "7yyy",
"target_parent_token": "wikcnYYY"
}
```
### Rename Node
```json
{ "action": "rename", "space_id": "7xxx", "node_token": "wikcnXXX", "title": "New Title" }
```
## Wiki-Doc Workflow
To edit a wiki page:
1. Get node: `{ "action": "get", "token": "wiki_token" }` → returns `obj_token`
2. Read doc: `feishu_doc { "action": "read", "doc_token": "obj_token" }`
3. Write doc: `feishu_doc { "action": "write", "doc_token": "obj_token", "content": "..." }`
## Configuration
```yaml
channels:
feishu:
tools:
wiki: true # default: true
doc: true # required - wiki content uses feishu_doc
```
**Dependency:** This tool requires `feishu_doc` to be enabled. Wiki pages are documents - use `feishu_wiki` to navigate, then `feishu_doc` to read/edit content.
## Permissions
Required: `wiki:wiki` or `wiki:wiki:readonly`