@neomei/opencode-feishu 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -4
- package/README.md +86 -6
- package/dist/cli.js +141 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +21 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/daemon.d.ts.map +1 -1
- package/dist/core/daemon.js +2 -1
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/dedup.d.ts +29 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +69 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/file-downloader.d.ts +24 -0
- package/dist/core/file-downloader.d.ts.map +1 -0
- package/dist/core/file-downloader.js +79 -0
- package/dist/core/file-downloader.js.map +1 -0
- package/dist/core/message-handler.d.ts +6 -0
- package/dist/core/message-handler.d.ts.map +1 -1
- package/dist/core/message-handler.js +66 -7
- package/dist/core/message-handler.js.map +1 -1
- package/dist/core/profile-manager.d.ts +27 -0
- package/dist/core/profile-manager.d.ts.map +1 -0
- package/dist/core/profile-manager.js +149 -0
- package/dist/core/profile-manager.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/feishu/api.d.ts +12 -0
- package/dist/feishu/api.d.ts.map +1 -1
- package/dist/feishu/api.js +89 -0
- package/dist/feishu/api.js.map +1 -1
- package/dist/feishu/card.d.ts +1 -1
- package/dist/feishu/card.d.ts.map +1 -1
- package/dist/feishu/card.js +3 -1
- package/dist/feishu/card.js.map +1 -1
- package/dist/feishu/event-source.d.ts.map +1 -1
- package/dist/feishu/event-source.js +3 -0
- package/dist/feishu/event-source.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/opencode/client.d.ts +5 -1
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +15 -2
- package/dist/opencode/client.js.map +1 -1
- package/dist/opencode/event-handler.d.ts.map +1 -1
- package/dist/opencode/event-handler.js +3 -0
- package/dist/opencode/event-handler.js.map +1 -1
- package/dist/services/approval-service.d.ts +20 -0
- package/dist/services/approval-service.d.ts.map +1 -0
- package/dist/services/approval-service.js +123 -0
- package/dist/services/approval-service.js.map +1 -0
- package/dist/services/base-service.d.ts +22 -0
- package/dist/services/base-service.d.ts.map +1 -0
- package/dist/services/base-service.js +47 -0
- package/dist/services/base-service.js.map +1 -0
- package/dist/services/calendar-service.d.ts +25 -0
- package/dist/services/calendar-service.d.ts.map +1 -0
- package/dist/services/calendar-service.js +220 -0
- package/dist/services/calendar-service.js.map +1 -0
- package/dist/services/chat-service.d.ts +52 -0
- package/dist/services/chat-service.d.ts.map +1 -0
- package/dist/services/chat-service.js +170 -0
- package/dist/services/chat-service.js.map +1 -0
- package/dist/services/contact-service.d.ts +40 -0
- package/dist/services/contact-service.d.ts.map +1 -0
- package/dist/services/contact-service.js +137 -0
- package/dist/services/contact-service.js.map +1 -0
- package/dist/services/doc-service.d.ts +135 -0
- package/dist/services/doc-service.d.ts.map +1 -0
- package/dist/services/doc-service.js +509 -0
- package/dist/services/doc-service.js.map +1 -0
- package/dist/services/im-service.d.ts +64 -0
- package/dist/services/im-service.d.ts.map +1 -0
- package/dist/services/im-service.js +215 -0
- package/dist/services/im-service.js.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/task-service.d.ts +19 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +126 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/setup/device-flow.d.ts +31 -0
- package/dist/setup/device-flow.d.ts.map +1 -0
- package/dist/setup/device-flow.js +133 -0
- package/dist/setup/device-flow.js.map +1 -0
- package/dist/setup/preflight.d.ts +1 -0
- package/dist/setup/preflight.d.ts.map +1 -1
- package/dist/setup/preflight.js +167 -1
- package/dist/setup/preflight.js.map +1 -1
- package/dist/setup/wizard.d.ts +1 -1
- package/dist/setup/wizard.d.ts.map +1 -1
- package/dist/setup/wizard.js +95 -125
- package/dist/setup/wizard.js.map +1 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +17 -2
- package/dist/standalone.js.map +1 -1
- package/dist/types/extended.d.ts +196 -0
- package/dist/types/extended.d.ts.map +1 -0
- package/dist/types/extended.js +6 -0
- package/dist/types/extended.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { BaseService } from './base-service.js';
|
|
2
|
+
import type { FeishuAPI } from '../feishu/api.js';
|
|
3
|
+
import type { DocumentContent, DocumentSearchResult, ResourceUploadResult, FeishuMessage } from '../types/extended.js';
|
|
4
|
+
/**
|
|
5
|
+
* Document Service
|
|
6
|
+
* Provides document operations: create, read, search, update
|
|
7
|
+
* Supports both docx and wiki documents
|
|
8
|
+
*
|
|
9
|
+
* Aligned with lark-cli docs features:
|
|
10
|
+
* - +create: Create from XML/Markdown content
|
|
11
|
+
* - +fetch: Read with detail/scope support
|
|
12
|
+
* - +update: 8 commands (str_replace, block_insert_after, etc.)
|
|
13
|
+
* - +search: Cloud space search
|
|
14
|
+
*/
|
|
15
|
+
export declare class DocService extends BaseService {
|
|
16
|
+
constructor(api: FeishuAPI);
|
|
17
|
+
/**
|
|
18
|
+
* Create a new document from content.
|
|
19
|
+
* Supports XML (default) and Markdown formats.
|
|
20
|
+
*/
|
|
21
|
+
createDocument(options: {
|
|
22
|
+
content: string;
|
|
23
|
+
format?: 'xml' | 'markdown';
|
|
24
|
+
parentToken?: string;
|
|
25
|
+
parentPosition?: string;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
documentId: string;
|
|
28
|
+
revisionId: number;
|
|
29
|
+
url: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Create a document from Markdown content (convenience method).
|
|
33
|
+
*/
|
|
34
|
+
createDocumentFromMarkdown(title: string, markdown: string, options?: {
|
|
35
|
+
parentToken?: string;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
documentId: string;
|
|
38
|
+
revisionId: number;
|
|
39
|
+
url: string;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch document content with support for detail levels and scopes.
|
|
43
|
+
*
|
|
44
|
+
* @param docToken - Document token or URL
|
|
45
|
+
* @param options - Fetch options
|
|
46
|
+
* - detail: 'simple' | 'with-ids' | 'full' (default: 'simple')
|
|
47
|
+
* - scope: 'outline' | 'section' | 'range' | 'keyword' (default: undefined = full doc)
|
|
48
|
+
* - docFormat: 'xml' | 'markdown' | 'text' (default: 'markdown')
|
|
49
|
+
* - startBlockId: For section/range scope
|
|
50
|
+
* - endBlockId: For range scope
|
|
51
|
+
* - keyword: For keyword scope
|
|
52
|
+
* - maxDepth: For outline scope (heading depth limit)
|
|
53
|
+
*/
|
|
54
|
+
fetchDocument(docToken: string, options?: {
|
|
55
|
+
detail?: 'simple' | 'with-ids' | 'full';
|
|
56
|
+
scope?: 'outline' | 'section' | 'range' | 'keyword';
|
|
57
|
+
docFormat?: 'xml' | 'markdown' | 'text';
|
|
58
|
+
startBlockId?: string;
|
|
59
|
+
endBlockId?: string;
|
|
60
|
+
keyword?: string;
|
|
61
|
+
maxDepth?: number;
|
|
62
|
+
}): Promise<DocumentContent>;
|
|
63
|
+
/**
|
|
64
|
+
* Get document outline (table of contents).
|
|
65
|
+
* Returns heading structure up to specified depth.
|
|
66
|
+
*/
|
|
67
|
+
getDocumentOutline(docToken: string, maxDepth?: number): Promise<Array<{
|
|
68
|
+
level: number;
|
|
69
|
+
text: string;
|
|
70
|
+
blockId: string;
|
|
71
|
+
}>>;
|
|
72
|
+
/**
|
|
73
|
+
* Update document content with various commands.
|
|
74
|
+
*
|
|
75
|
+
* Commands:
|
|
76
|
+
* - str_replace: Find and replace text
|
|
77
|
+
* - block_insert_after: Insert after a block
|
|
78
|
+
* - block_replace: Replace a block
|
|
79
|
+
* - block_delete: Delete block(s)
|
|
80
|
+
* - block_copy_insert_after: Copy blocks and insert after
|
|
81
|
+
* - block_move_after: Move blocks after a position
|
|
82
|
+
* - append: Append to end of document
|
|
83
|
+
* - overwrite: Overwrite entire document
|
|
84
|
+
*/
|
|
85
|
+
updateDocument(docToken: string, command: string, options: {
|
|
86
|
+
content?: string;
|
|
87
|
+
pattern?: string;
|
|
88
|
+
blockId?: string;
|
|
89
|
+
srcBlockIds?: string[];
|
|
90
|
+
docFormat?: 'xml' | 'markdown';
|
|
91
|
+
}): Promise<{
|
|
92
|
+
revisionId: number;
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Search documents in cloud space.
|
|
96
|
+
* Supports advanced query syntax.
|
|
97
|
+
*/
|
|
98
|
+
searchDocuments(query: string, options?: {
|
|
99
|
+
pageSize?: number;
|
|
100
|
+
pageToken?: string;
|
|
101
|
+
filters?: {
|
|
102
|
+
docTypes?: string[];
|
|
103
|
+
creatorIds?: string[];
|
|
104
|
+
folderTokens?: string[];
|
|
105
|
+
openTime?: {
|
|
106
|
+
start?: string;
|
|
107
|
+
end?: string;
|
|
108
|
+
};
|
|
109
|
+
createTime?: {
|
|
110
|
+
start?: string;
|
|
111
|
+
end?: string;
|
|
112
|
+
};
|
|
113
|
+
onlyTitle?: boolean;
|
|
114
|
+
onlyComment?: boolean;
|
|
115
|
+
};
|
|
116
|
+
}): Promise<DocumentSearchResult>;
|
|
117
|
+
/**
|
|
118
|
+
* Share a document to a chat as an interactive card.
|
|
119
|
+
*/
|
|
120
|
+
shareDocument(chatId: string, docToken: string, options?: {
|
|
121
|
+
description?: string;
|
|
122
|
+
docType?: 'doc' | 'docx' | 'wiki' | 'sheet';
|
|
123
|
+
}): Promise<FeishuMessage>;
|
|
124
|
+
/**
|
|
125
|
+
* Upload a resource (image/file) to a document.
|
|
126
|
+
*/
|
|
127
|
+
uploadResource(filePath: string, fileName?: string): Promise<ResourceUploadResult>;
|
|
128
|
+
private parseSearchResult;
|
|
129
|
+
private mapDocType;
|
|
130
|
+
private guessMimeType;
|
|
131
|
+
private parseContentToBlocks;
|
|
132
|
+
private markdownToBlocks;
|
|
133
|
+
private xmlToBlocks;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=doc-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-service.d.ts","sourceRoot":"","sources":["../../src/services/doc-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAEV,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,SAAQ,WAAW;gBAC7B,GAAG,EAAE,SAAS;IAI1B;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCpE;;OAEG;IACG,0BAA0B,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAYnE;;;;;;;;;;;;OAYG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;QACxC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;QACpD,SAAS,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;QACxC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,eAAe,CAAC;IA2D3B;;;OAGG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAwBnE;;;;;;;;;;;;OAYG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;KAChC,GACA,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAwFlC;;;OAGG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE;YACR,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;YACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;YACxB,QAAQ,CAAC,EAAE;gBAAE,KAAK,CAAC,EAAE,MAAM,CAAC;gBAAC,GAAG,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAC5C,UAAU,CAAC,EAAE;gBAAE,KAAK,CAAC,EAAE,MAAM,CAAC;gBAAC,GAAG,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;YACpB,WAAW,CAAC,EAAE,OAAO,CAAC;SACvB,CAAC;KACH,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8EjC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;KAC7C,GACA,OAAO,CAAC,aAAa,CAAC;IAkEzB;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC;IAsChC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;CA6BpB"}
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { BaseService } from './base-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Document Service
|
|
4
|
+
* Provides document operations: create, read, search, update
|
|
5
|
+
* Supports both docx and wiki documents
|
|
6
|
+
*
|
|
7
|
+
* Aligned with lark-cli docs features:
|
|
8
|
+
* - +create: Create from XML/Markdown content
|
|
9
|
+
* - +fetch: Read with detail/scope support
|
|
10
|
+
* - +update: 8 commands (str_replace, block_insert_after, etc.)
|
|
11
|
+
* - +search: Cloud space search
|
|
12
|
+
*/
|
|
13
|
+
export class DocService extends BaseService {
|
|
14
|
+
constructor(api) {
|
|
15
|
+
super(api);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new document from content.
|
|
19
|
+
* Supports XML (default) and Markdown formats.
|
|
20
|
+
*/
|
|
21
|
+
async createDocument(options) {
|
|
22
|
+
this.validateRequired(options.content, 'content');
|
|
23
|
+
return this.call('createDocument', async () => {
|
|
24
|
+
const client = this.api.getClient();
|
|
25
|
+
const body = {
|
|
26
|
+
content: options.content,
|
|
27
|
+
};
|
|
28
|
+
if (options.format === 'markdown') {
|
|
29
|
+
body.document_format = 'markdown';
|
|
30
|
+
}
|
|
31
|
+
if (options.parentToken) {
|
|
32
|
+
body.folder_token = options.parentToken;
|
|
33
|
+
}
|
|
34
|
+
const res = await client.request({
|
|
35
|
+
method: 'POST',
|
|
36
|
+
url: '/open-apis/docx/v1/documents',
|
|
37
|
+
data: body,
|
|
38
|
+
});
|
|
39
|
+
if (res.code !== 0) {
|
|
40
|
+
throw new Error(`Failed to create document: ${res.msg || 'Unknown error'}`);
|
|
41
|
+
}
|
|
42
|
+
const doc = res.data?.document;
|
|
43
|
+
return {
|
|
44
|
+
documentId: doc.document_id,
|
|
45
|
+
revisionId: doc.revision_id,
|
|
46
|
+
url: doc.url || `https://open.feishu.cn/docx/${doc.document_id}`,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a document from Markdown content (convenience method).
|
|
52
|
+
*/
|
|
53
|
+
async createDocumentFromMarkdown(title, markdown, options) {
|
|
54
|
+
this.validateRequired(title, 'title');
|
|
55
|
+
this.validateRequired(markdown, 'markdown');
|
|
56
|
+
const content = `# ${title}\n\n${markdown}`;
|
|
57
|
+
return this.createDocument({
|
|
58
|
+
content,
|
|
59
|
+
format: 'markdown',
|
|
60
|
+
parentToken: options?.parentToken,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fetch document content with support for detail levels and scopes.
|
|
65
|
+
*
|
|
66
|
+
* @param docToken - Document token or URL
|
|
67
|
+
* @param options - Fetch options
|
|
68
|
+
* - detail: 'simple' | 'with-ids' | 'full' (default: 'simple')
|
|
69
|
+
* - scope: 'outline' | 'section' | 'range' | 'keyword' (default: undefined = full doc)
|
|
70
|
+
* - docFormat: 'xml' | 'markdown' | 'text' (default: 'markdown')
|
|
71
|
+
* - startBlockId: For section/range scope
|
|
72
|
+
* - endBlockId: For range scope
|
|
73
|
+
* - keyword: For keyword scope
|
|
74
|
+
* - maxDepth: For outline scope (heading depth limit)
|
|
75
|
+
*/
|
|
76
|
+
async fetchDocument(docToken, options) {
|
|
77
|
+
this.validateRequired(docToken, 'docToken');
|
|
78
|
+
return this.call('fetchDocument', async () => {
|
|
79
|
+
const client = this.api.getClient();
|
|
80
|
+
// Build query params
|
|
81
|
+
const params = {};
|
|
82
|
+
if (options?.detail) {
|
|
83
|
+
params.detail = options.detail;
|
|
84
|
+
}
|
|
85
|
+
if (options?.docFormat) {
|
|
86
|
+
params.document_format = options.docFormat;
|
|
87
|
+
}
|
|
88
|
+
if (options?.scope) {
|
|
89
|
+
params.scope = options.scope;
|
|
90
|
+
if (options.scope === 'section' || options.scope === 'range') {
|
|
91
|
+
if (options.startBlockId) {
|
|
92
|
+
params.start_block_id = options.startBlockId;
|
|
93
|
+
}
|
|
94
|
+
if (options.scope === 'range' && options.endBlockId) {
|
|
95
|
+
params.end_block_id = options.endBlockId;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (options.scope === 'keyword' && options.keyword) {
|
|
99
|
+
params.keyword = options.keyword;
|
|
100
|
+
}
|
|
101
|
+
if (options.scope === 'outline' && options.maxDepth !== undefined) {
|
|
102
|
+
params.max_depth = options.maxDepth;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Use v2 API for fetching
|
|
106
|
+
const res = await client.request({
|
|
107
|
+
method: 'GET',
|
|
108
|
+
url: `/open-apis/docx/v1/documents/${docToken}/content`,
|
|
109
|
+
params,
|
|
110
|
+
});
|
|
111
|
+
if (res.code !== 0) {
|
|
112
|
+
throw new Error(`Failed to fetch document: ${res.msg || 'Unknown error'}`);
|
|
113
|
+
}
|
|
114
|
+
const data = res.data || {};
|
|
115
|
+
return {
|
|
116
|
+
documentId: docToken,
|
|
117
|
+
title: data.title || 'Untitled',
|
|
118
|
+
content: data.content,
|
|
119
|
+
revisionId: data.revision_id,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get document outline (table of contents).
|
|
125
|
+
* Returns heading structure up to specified depth.
|
|
126
|
+
*/
|
|
127
|
+
async getDocumentOutline(docToken, maxDepth) {
|
|
128
|
+
const content = await this.fetchDocument(docToken, {
|
|
129
|
+
scope: 'outline',
|
|
130
|
+
maxDepth: maxDepth || 3,
|
|
131
|
+
docFormat: 'xml',
|
|
132
|
+
});
|
|
133
|
+
// Parse outline from XML content
|
|
134
|
+
// Simple regex-based extraction for headings with id attributes
|
|
135
|
+
const outline = [];
|
|
136
|
+
const headingRegex = /<h(\d)[^>]*id="([^"]+)"[^>]*>([^<]*)<\/h\d>/gi;
|
|
137
|
+
let match;
|
|
138
|
+
while ((match = headingRegex.exec(content.content || '')) !== null) {
|
|
139
|
+
outline.push({
|
|
140
|
+
level: parseInt(match[1], 10),
|
|
141
|
+
text: match[3].trim(),
|
|
142
|
+
blockId: match[2],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return outline;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Update document content with various commands.
|
|
149
|
+
*
|
|
150
|
+
* Commands:
|
|
151
|
+
* - str_replace: Find and replace text
|
|
152
|
+
* - block_insert_after: Insert after a block
|
|
153
|
+
* - block_replace: Replace a block
|
|
154
|
+
* - block_delete: Delete block(s)
|
|
155
|
+
* - block_copy_insert_after: Copy blocks and insert after
|
|
156
|
+
* - block_move_after: Move blocks after a position
|
|
157
|
+
* - append: Append to end of document
|
|
158
|
+
* - overwrite: Overwrite entire document
|
|
159
|
+
*/
|
|
160
|
+
async updateDocument(docToken, command, options) {
|
|
161
|
+
this.validateRequired(docToken, 'docToken');
|
|
162
|
+
return this.call('updateDocument', async () => {
|
|
163
|
+
const client = this.api.getClient();
|
|
164
|
+
const body = {
|
|
165
|
+
document_revision_id: -1, // Use latest
|
|
166
|
+
};
|
|
167
|
+
// Build request body based on command
|
|
168
|
+
switch (command) {
|
|
169
|
+
case 'str_replace': {
|
|
170
|
+
if (!options.pattern || options.content === undefined) {
|
|
171
|
+
throw new Error('str_replace requires pattern and content');
|
|
172
|
+
}
|
|
173
|
+
body.replace_texts = [
|
|
174
|
+
{
|
|
175
|
+
old_string: options.pattern,
|
|
176
|
+
new_string: options.content,
|
|
177
|
+
},
|
|
178
|
+
];
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case 'block_insert_after': {
|
|
182
|
+
if (!options.blockId || !options.content) {
|
|
183
|
+
throw new Error('block_insert_after requires blockId and content');
|
|
184
|
+
}
|
|
185
|
+
body.block_id = options.blockId;
|
|
186
|
+
body.children = this.parseContentToBlocks(options.content, options.docFormat);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'block_replace': {
|
|
190
|
+
if (!options.blockId || !options.content) {
|
|
191
|
+
throw new Error('block_replace requires blockId and content');
|
|
192
|
+
}
|
|
193
|
+
body.replace_blocks = {
|
|
194
|
+
block_id: options.blockId,
|
|
195
|
+
children: this.parseContentToBlocks(options.content, options.docFormat),
|
|
196
|
+
};
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'block_delete': {
|
|
200
|
+
if (!options.blockId) {
|
|
201
|
+
throw new Error('block_delete requires blockId');
|
|
202
|
+
}
|
|
203
|
+
body.delete_blocks = options.blockId.split(',');
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case 'append': {
|
|
207
|
+
if (!options.content) {
|
|
208
|
+
throw new Error('append requires content');
|
|
209
|
+
}
|
|
210
|
+
body.block_id = '-1'; // Append to end
|
|
211
|
+
body.children = this.parseContentToBlocks(options.content, options.docFormat);
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case 'overwrite': {
|
|
215
|
+
if (!options.content) {
|
|
216
|
+
throw new Error('overwrite requires content');
|
|
217
|
+
}
|
|
218
|
+
// Overwrite sends the full content
|
|
219
|
+
body.content = options.content;
|
|
220
|
+
if (options.docFormat === 'markdown') {
|
|
221
|
+
body.document_format = 'markdown';
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
default:
|
|
226
|
+
throw new Error(`Unknown command: ${command}`);
|
|
227
|
+
}
|
|
228
|
+
const res = await client.request({
|
|
229
|
+
method: 'PATCH',
|
|
230
|
+
url: `/open-apis/docx/v1/documents/${docToken}`,
|
|
231
|
+
data: body,
|
|
232
|
+
});
|
|
233
|
+
if (res.code !== 0) {
|
|
234
|
+
throw new Error(`Failed to update document: ${res.msg || 'Unknown error'}`);
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
revisionId: res.data?.document?.revision_id,
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Search documents in cloud space.
|
|
243
|
+
* Supports advanced query syntax.
|
|
244
|
+
*/
|
|
245
|
+
async searchDocuments(query, options) {
|
|
246
|
+
this.validateRequired(query, 'query');
|
|
247
|
+
return this.call('searchDocuments', async () => {
|
|
248
|
+
const client = this.api.getClient();
|
|
249
|
+
const body = {
|
|
250
|
+
query,
|
|
251
|
+
search_key: query,
|
|
252
|
+
page_size: options?.pageSize || 20,
|
|
253
|
+
};
|
|
254
|
+
if (options?.pageToken) {
|
|
255
|
+
body.page_token = options.pageToken;
|
|
256
|
+
}
|
|
257
|
+
// Build filters
|
|
258
|
+
const filters = {};
|
|
259
|
+
if (options?.filters) {
|
|
260
|
+
const f = options.filters;
|
|
261
|
+
if (f.docTypes?.length) {
|
|
262
|
+
filters.doc_types = f.docTypes;
|
|
263
|
+
}
|
|
264
|
+
if (f.creatorIds?.length) {
|
|
265
|
+
filters.creator_ids = f.creatorIds;
|
|
266
|
+
}
|
|
267
|
+
if (f.folderTokens?.length) {
|
|
268
|
+
filters.folder_tokens = f.folderTokens;
|
|
269
|
+
}
|
|
270
|
+
if (f.openTime) {
|
|
271
|
+
filters.open_time = {};
|
|
272
|
+
if (f.openTime.start)
|
|
273
|
+
filters.open_time.start = new Date(f.openTime.start).getTime() / 1000;
|
|
274
|
+
if (f.openTime.end)
|
|
275
|
+
filters.open_time.end = new Date(f.openTime.end).getTime() / 1000;
|
|
276
|
+
}
|
|
277
|
+
if (f.createTime) {
|
|
278
|
+
filters.create_time = {};
|
|
279
|
+
if (f.createTime.start)
|
|
280
|
+
filters.create_time.start = new Date(f.createTime.start).getTime() / 1000;
|
|
281
|
+
if (f.createTime.end)
|
|
282
|
+
filters.create_time.end = new Date(f.createTime.end).getTime() / 1000;
|
|
283
|
+
}
|
|
284
|
+
if (f.onlyTitle) {
|
|
285
|
+
filters.only_title = true;
|
|
286
|
+
}
|
|
287
|
+
if (f.onlyComment) {
|
|
288
|
+
filters.only_comment = true;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (Object.keys(filters).length > 0) {
|
|
292
|
+
body.filter = filters;
|
|
293
|
+
}
|
|
294
|
+
const res = await client.request({
|
|
295
|
+
method: 'POST',
|
|
296
|
+
url: '/open-apis/search/v2/doc_wiki/search',
|
|
297
|
+
data: body,
|
|
298
|
+
});
|
|
299
|
+
if (res.code !== 0) {
|
|
300
|
+
throw new Error(`Failed to search documents: ${res.msg || 'Unknown error'}`);
|
|
301
|
+
}
|
|
302
|
+
const data = res.data || {};
|
|
303
|
+
return {
|
|
304
|
+
documents: (data.items || []).map((item) => this.parseSearchResult(item)),
|
|
305
|
+
hasMore: data.has_more || false,
|
|
306
|
+
pageToken: data.page_token,
|
|
307
|
+
};
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Share a document to a chat as an interactive card.
|
|
312
|
+
*/
|
|
313
|
+
async shareDocument(chatId, docToken, options) {
|
|
314
|
+
this.validateRequired(chatId, 'chatId');
|
|
315
|
+
this.validateRequired(docToken, 'docToken');
|
|
316
|
+
return this.call('shareDocument', async () => {
|
|
317
|
+
// Try to fetch document info for better presentation
|
|
318
|
+
let title = '文档';
|
|
319
|
+
let url = '';
|
|
320
|
+
try {
|
|
321
|
+
const docInfo = await this.fetchDocument(docToken, { detail: 'simple' });
|
|
322
|
+
title = docInfo.title || title;
|
|
323
|
+
url = `https://open.feishu.cn/docx/${docToken}`;
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
url = `https://open.feishu.cn/docx/${docToken}`;
|
|
327
|
+
}
|
|
328
|
+
const iconMap = {
|
|
329
|
+
doc: '📄',
|
|
330
|
+
docx: '📝',
|
|
331
|
+
wiki: '📚',
|
|
332
|
+
sheet: '📊',
|
|
333
|
+
};
|
|
334
|
+
const card = {
|
|
335
|
+
config: { wide_screen_mode: true },
|
|
336
|
+
header: {
|
|
337
|
+
template: 'blue',
|
|
338
|
+
title: {
|
|
339
|
+
tag: 'plain_text',
|
|
340
|
+
content: `${iconMap[options?.docType || 'doc']} ${title}`,
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
elements: [
|
|
344
|
+
...(options?.description
|
|
345
|
+
? [
|
|
346
|
+
{
|
|
347
|
+
tag: 'div',
|
|
348
|
+
text: {
|
|
349
|
+
tag: 'lark_md',
|
|
350
|
+
content: options.description,
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
]
|
|
354
|
+
: []),
|
|
355
|
+
{
|
|
356
|
+
tag: 'action',
|
|
357
|
+
actions: [
|
|
358
|
+
{
|
|
359
|
+
tag: 'button',
|
|
360
|
+
text: {
|
|
361
|
+
tag: 'plain_text',
|
|
362
|
+
content: '查看文档',
|
|
363
|
+
},
|
|
364
|
+
type: 'primary',
|
|
365
|
+
url,
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
};
|
|
371
|
+
return this.api.sendCard(chatId, card);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Upload a resource (image/file) to a document.
|
|
376
|
+
*/
|
|
377
|
+
async uploadResource(filePath, fileName) {
|
|
378
|
+
this.validateRequired(filePath, 'filePath');
|
|
379
|
+
return this.call('uploadResource', async () => {
|
|
380
|
+
const { readFileSync } = await import('fs');
|
|
381
|
+
const { basename } = await import('path');
|
|
382
|
+
const buffer = readFileSync(filePath);
|
|
383
|
+
const name = fileName || basename(filePath);
|
|
384
|
+
const mimeType = this.guessMimeType(name);
|
|
385
|
+
const client = this.api.getClient();
|
|
386
|
+
// Create form data for upload
|
|
387
|
+
const form = new FormData();
|
|
388
|
+
form.append('file', new Blob([buffer], { type: mimeType }), name);
|
|
389
|
+
form.append('file_name', name);
|
|
390
|
+
const res = await client.request({
|
|
391
|
+
method: 'POST',
|
|
392
|
+
url: '/open-apis/im/v1/files',
|
|
393
|
+
data: form,
|
|
394
|
+
});
|
|
395
|
+
if (res.code !== 0) {
|
|
396
|
+
throw new Error(`Failed to upload resource: ${res.msg || 'Unknown error'}`);
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
fileKey: res.data?.file_token,
|
|
400
|
+
fileName: name,
|
|
401
|
+
mimeType,
|
|
402
|
+
};
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
// ── Private helpers ──
|
|
406
|
+
parseSearchResult(item) {
|
|
407
|
+
return {
|
|
408
|
+
documentId: item.docs_token || item.token || item.document_id,
|
|
409
|
+
title: item.title || 'Untitled',
|
|
410
|
+
url: item.url || item.document_url,
|
|
411
|
+
type: this.mapDocType(item.doc_type || item.type),
|
|
412
|
+
createTime: item.create_time ? new Date(item.create_time * 1000).toISOString() : undefined,
|
|
413
|
+
updateTime: item.open_time ? new Date(item.open_time * 1000).toISOString() : undefined,
|
|
414
|
+
ownerId: item.creator_id,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
mapDocType(type) {
|
|
418
|
+
const typeMap = {
|
|
419
|
+
'DOC': 'doc',
|
|
420
|
+
'DOCX': 'docx',
|
|
421
|
+
'WIKI': 'wiki',
|
|
422
|
+
'SHEET': 'sheet',
|
|
423
|
+
'BITABLE': 'doc',
|
|
424
|
+
};
|
|
425
|
+
return typeMap[type?.toUpperCase()] || 'docx';
|
|
426
|
+
}
|
|
427
|
+
guessMimeType(fileName) {
|
|
428
|
+
const ext = fileName.split('.').pop()?.toLowerCase();
|
|
429
|
+
const mimeMap = {
|
|
430
|
+
'jpg': 'image/jpeg',
|
|
431
|
+
'jpeg': 'image/jpeg',
|
|
432
|
+
'png': 'image/png',
|
|
433
|
+
'gif': 'image/gif',
|
|
434
|
+
'pdf': 'application/pdf',
|
|
435
|
+
'doc': 'application/msword',
|
|
436
|
+
'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
437
|
+
'xls': 'application/vnd.ms-excel',
|
|
438
|
+
'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
439
|
+
};
|
|
440
|
+
return mimeMap[ext || ''] || 'application/octet-stream';
|
|
441
|
+
}
|
|
442
|
+
parseContentToBlocks(content, format) {
|
|
443
|
+
// Simple parser - in production, would use proper XML/Markdown parser
|
|
444
|
+
if (format === 'markdown') {
|
|
445
|
+
// Convert markdown to basic blocks
|
|
446
|
+
return this.markdownToBlocks(content);
|
|
447
|
+
}
|
|
448
|
+
// Assume XML format
|
|
449
|
+
return this.xmlToBlocks(content);
|
|
450
|
+
}
|
|
451
|
+
markdownToBlocks(markdown) {
|
|
452
|
+
const blocks = [];
|
|
453
|
+
const lines = markdown.split('\n');
|
|
454
|
+
for (const line of lines) {
|
|
455
|
+
if (line.startsWith('# ')) {
|
|
456
|
+
blocks.push({
|
|
457
|
+
block_type: 'heading1',
|
|
458
|
+
heading1: { elements: [{ text_run: { content: line.slice(2) } }] },
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
else if (line.startsWith('## ')) {
|
|
462
|
+
blocks.push({
|
|
463
|
+
block_type: 'heading2',
|
|
464
|
+
heading2: { elements: [{ text_run: { content: line.slice(3) } }] },
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
else if (line.startsWith('- ')) {
|
|
468
|
+
blocks.push({
|
|
469
|
+
block_type: 'bullet',
|
|
470
|
+
bullet: { elements: [{ text_run: { content: line.slice(2) } }] },
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
else if (line.trim()) {
|
|
474
|
+
blocks.push({
|
|
475
|
+
block_type: 'paragraph',
|
|
476
|
+
paragraph: { elements: [{ text_run: { content: line } }] },
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return blocks;
|
|
481
|
+
}
|
|
482
|
+
xmlToBlocks(xml) {
|
|
483
|
+
// Simple XML to blocks conversion
|
|
484
|
+
// In production, use a proper XML parser
|
|
485
|
+
const blocks = [];
|
|
486
|
+
// Parse heading tags
|
|
487
|
+
const headingRegex = /<h(\d)>([^<]*)<\/h\d>/g;
|
|
488
|
+
let match;
|
|
489
|
+
while ((match = headingRegex.exec(xml)) !== null) {
|
|
490
|
+
const level = parseInt(match[1], 10);
|
|
491
|
+
const text = match[2];
|
|
492
|
+
const blockType = level === 1 ? 'heading1' : level === 2 ? 'heading2' : 'heading3';
|
|
493
|
+
blocks.push({
|
|
494
|
+
block_type: blockType,
|
|
495
|
+
[blockType]: { elements: [{ text_run: { content: text } }] },
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
// Parse paragraph tags
|
|
499
|
+
const pRegex = /<p>([^<]*)<\/p>/g;
|
|
500
|
+
while ((match = pRegex.exec(xml)) !== null) {
|
|
501
|
+
blocks.push({
|
|
502
|
+
block_type: 'paragraph',
|
|
503
|
+
paragraph: { elements: [{ text_run: { content: match[1] } }] },
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
return blocks;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=doc-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-service.js","sourceRoot":"","sources":["../../src/services/doc-service.ts"],"names":[],"mappings":"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"}
|