@neomei/opencode-feishu 0.1.2 → 0.2.1

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.
Files changed (124) hide show
  1. package/CHANGELOG.md +29 -4
  2. package/LICENSE +0 -0
  3. package/README.md +114 -6
  4. package/dist/cli.js +154 -6
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/config.d.ts +30 -0
  7. package/dist/core/config.d.ts.map +1 -1
  8. package/dist/core/config.js +41 -1
  9. package/dist/core/config.js.map +1 -1
  10. package/dist/core/daemon.d.ts.map +1 -1
  11. package/dist/core/daemon.js +2 -1
  12. package/dist/core/daemon.js.map +1 -1
  13. package/dist/core/dedup.d.ts +29 -0
  14. package/dist/core/dedup.d.ts.map +1 -0
  15. package/dist/core/dedup.js +69 -0
  16. package/dist/core/dedup.js.map +1 -0
  17. package/dist/core/file-downloader.d.ts +24 -0
  18. package/dist/core/file-downloader.d.ts.map +1 -0
  19. package/dist/core/file-downloader.js +79 -0
  20. package/dist/core/file-downloader.js.map +1 -0
  21. package/dist/core/hook-manager.d.ts +14 -0
  22. package/dist/core/hook-manager.d.ts.map +1 -0
  23. package/dist/core/hook-manager.js +71 -0
  24. package/dist/core/hook-manager.js.map +1 -0
  25. package/dist/core/message-handler.d.ts +17 -1
  26. package/dist/core/message-handler.d.ts.map +1 -1
  27. package/dist/core/message-handler.js +151 -8
  28. package/dist/core/message-handler.js.map +1 -1
  29. package/dist/core/profile-manager.d.ts +27 -0
  30. package/dist/core/profile-manager.d.ts.map +1 -0
  31. package/dist/core/profile-manager.js +149 -0
  32. package/dist/core/profile-manager.js.map +1 -0
  33. package/dist/core/session-manager.d.ts +8 -1
  34. package/dist/core/session-manager.d.ts.map +1 -1
  35. package/dist/core/session-manager.js +27 -4
  36. package/dist/core/session-manager.js.map +1 -1
  37. package/dist/core/types.d.ts +13 -0
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/feishu/api.d.ts +17 -0
  40. package/dist/feishu/api.d.ts.map +1 -1
  41. package/dist/feishu/api.js +106 -0
  42. package/dist/feishu/api.js.map +1 -1
  43. package/dist/feishu/card.d.ts +4 -1
  44. package/dist/feishu/card.d.ts.map +1 -1
  45. package/dist/feishu/card.js +26 -6
  46. package/dist/feishu/card.js.map +1 -1
  47. package/dist/feishu/event-source.d.ts.map +1 -1
  48. package/dist/feishu/event-source.js +3 -0
  49. package/dist/feishu/event-source.js.map +1 -1
  50. package/dist/feishu/silent-logger.d.ts +5 -5
  51. package/dist/feishu/silent-logger.d.ts.map +1 -1
  52. package/dist/feishu/silent-logger.js +5 -5
  53. package/dist/feishu/silent-logger.js.map +1 -1
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/opencode/client.d.ts +5 -1
  59. package/dist/opencode/client.d.ts.map +1 -1
  60. package/dist/opencode/client.js +15 -2
  61. package/dist/opencode/client.js.map +1 -1
  62. package/dist/opencode/event-handler.d.ts +6 -1
  63. package/dist/opencode/event-handler.d.ts.map +1 -1
  64. package/dist/opencode/event-handler.js +31 -3
  65. package/dist/opencode/event-handler.js.map +1 -1
  66. package/dist/plugin.d.ts.map +1 -1
  67. package/dist/plugin.js +4 -2
  68. package/dist/plugin.js.map +1 -1
  69. package/dist/services/approval-service.d.ts +20 -0
  70. package/dist/services/approval-service.d.ts.map +1 -0
  71. package/dist/services/approval-service.js +123 -0
  72. package/dist/services/approval-service.js.map +1 -0
  73. package/dist/services/base-service.d.ts +22 -0
  74. package/dist/services/base-service.d.ts.map +1 -0
  75. package/dist/services/base-service.js +47 -0
  76. package/dist/services/base-service.js.map +1 -0
  77. package/dist/services/calendar-service.d.ts +25 -0
  78. package/dist/services/calendar-service.d.ts.map +1 -0
  79. package/dist/services/calendar-service.js +220 -0
  80. package/dist/services/calendar-service.js.map +1 -0
  81. package/dist/services/chat-service.d.ts +52 -0
  82. package/dist/services/chat-service.d.ts.map +1 -0
  83. package/dist/services/chat-service.js +170 -0
  84. package/dist/services/chat-service.js.map +1 -0
  85. package/dist/services/contact-service.d.ts +40 -0
  86. package/dist/services/contact-service.d.ts.map +1 -0
  87. package/dist/services/contact-service.js +137 -0
  88. package/dist/services/contact-service.js.map +1 -0
  89. package/dist/services/doc-service.d.ts +137 -0
  90. package/dist/services/doc-service.d.ts.map +1 -0
  91. package/dist/services/doc-service.js +516 -0
  92. package/dist/services/doc-service.js.map +1 -0
  93. package/dist/services/im-service.d.ts +64 -0
  94. package/dist/services/im-service.d.ts.map +1 -0
  95. package/dist/services/im-service.js +215 -0
  96. package/dist/services/im-service.js.map +1 -0
  97. package/dist/services/index.d.ts +9 -0
  98. package/dist/services/index.d.ts.map +1 -0
  99. package/dist/services/index.js +10 -0
  100. package/dist/services/index.js.map +1 -0
  101. package/dist/services/task-service.d.ts +19 -0
  102. package/dist/services/task-service.d.ts.map +1 -0
  103. package/dist/services/task-service.js +126 -0
  104. package/dist/services/task-service.js.map +1 -0
  105. package/dist/setup/device-flow.d.ts +31 -0
  106. package/dist/setup/device-flow.d.ts.map +1 -0
  107. package/dist/setup/device-flow.js +133 -0
  108. package/dist/setup/device-flow.js.map +1 -0
  109. package/dist/setup/preflight.d.ts +1 -0
  110. package/dist/setup/preflight.d.ts.map +1 -1
  111. package/dist/setup/preflight.js +167 -1
  112. package/dist/setup/preflight.js.map +1 -1
  113. package/dist/setup/wizard.d.ts +3 -1
  114. package/dist/setup/wizard.d.ts.map +1 -1
  115. package/dist/setup/wizard.js +113 -125
  116. package/dist/setup/wizard.js.map +1 -1
  117. package/dist/standalone.d.ts.map +1 -1
  118. package/dist/standalone.js +49 -13
  119. package/dist/standalone.js.map +1 -1
  120. package/dist/types/extended.d.ts +196 -0
  121. package/dist/types/extended.d.ts.map +1 -0
  122. package/dist/types/extended.js +6 -0
  123. package/dist/types/extended.js.map +1 -0
  124. package/package.json +5 -3
@@ -0,0 +1,215 @@
1
+ import { BaseService } from './base-service.js';
2
+ /**
3
+ * IM (Instant Messaging) Service
4
+ * Provides message operations: send, reply, search, download resources
5
+ */
6
+ export class IMService extends BaseService {
7
+ constructor(api) {
8
+ super(api);
9
+ }
10
+ /**
11
+ * Send a text message to a chat.
12
+ */
13
+ async sendTextMessage(chatId, text) {
14
+ this.validateRequired(chatId, 'chatId');
15
+ this.validateRequired(text, 'text');
16
+ return this.call('sendTextMessage', () => this.api.sendText(chatId, text));
17
+ }
18
+ /**
19
+ * Send an interactive card to a chat.
20
+ */
21
+ async sendCardMessage(chatId, card) {
22
+ this.validateRequired(chatId, 'chatId');
23
+ return this.call('sendCardMessage', () => this.api.sendCard(chatId, card));
24
+ }
25
+ /**
26
+ * Send a post (rich text) message to a chat.
27
+ * Supports text, links, mentions, images in one message.
28
+ */
29
+ async sendPostMessage(chatId, title, content) {
30
+ this.validateRequired(chatId, 'chatId');
31
+ return this.call('sendPostMessage', async () => {
32
+ const client = this.api.getClient();
33
+ const res = await client.im.v1.message.create({
34
+ params: { receive_id_type: 'chat_id' },
35
+ data: {
36
+ receive_id: chatId,
37
+ msg_type: 'post',
38
+ content: JSON.stringify({
39
+ post: {
40
+ zh_cn: {
41
+ title,
42
+ content: [content],
43
+ },
44
+ },
45
+ }),
46
+ },
47
+ });
48
+ if (res.code !== 0) {
49
+ throw new Error(`Failed to send post message: ${res.msg || 'Unknown error'}`);
50
+ }
51
+ return res.data;
52
+ });
53
+ }
54
+ /**
55
+ * Send a document link as an interactive card.
56
+ * Displays document title, description, and a clickable button.
57
+ */
58
+ async sendDocumentCard(chatId, docInfo) {
59
+ this.validateRequired(chatId, 'chatId');
60
+ this.validateRequired(docInfo.title, 'title');
61
+ this.validateRequired(docInfo.url, 'url');
62
+ return this.call('sendDocumentCard', async () => {
63
+ const iconMap = {
64
+ doc: '📄',
65
+ docx: '📝',
66
+ wiki: '📚',
67
+ sheet: '📊',
68
+ };
69
+ const card = {
70
+ config: { wide_screen_mode: true },
71
+ header: {
72
+ template: 'blue',
73
+ title: {
74
+ tag: 'plain_text',
75
+ content: `${iconMap[docInfo.docType || 'doc']} ${docInfo.title}`,
76
+ },
77
+ },
78
+ elements: [
79
+ ...(docInfo.description
80
+ ? [
81
+ {
82
+ tag: 'div',
83
+ text: {
84
+ tag: 'lark_md',
85
+ content: docInfo.description,
86
+ },
87
+ },
88
+ ]
89
+ : []),
90
+ {
91
+ tag: 'action',
92
+ actions: [
93
+ {
94
+ tag: 'button',
95
+ text: {
96
+ tag: 'plain_text',
97
+ content: '查看文档',
98
+ },
99
+ type: 'primary',
100
+ url: docInfo.url,
101
+ },
102
+ ],
103
+ },
104
+ ],
105
+ };
106
+ return this.api.sendCard(chatId, card);
107
+ });
108
+ }
109
+ /**
110
+ * Reply to a specific message.
111
+ * Supports replying in thread.
112
+ */
113
+ async replyMessage(options) {
114
+ this.validateRequired(options.messageId, 'messageId');
115
+ this.validateRequired(options.content, 'content');
116
+ return this.call('replyMessage', async () => {
117
+ const client = this.api.getClient();
118
+ const res = await client.im.v1.message.create({
119
+ params: {
120
+ receive_id_type: 'chat_id'
121
+ },
122
+ data: {
123
+ receive_id: options.messageId,
124
+ msg_type: options.msgType || 'text',
125
+ content: JSON.stringify({ text: options.content }),
126
+ },
127
+ });
128
+ if (res.code !== 0) {
129
+ throw new Error(`Failed to reply message: ${res.msg || 'Unknown error'}`);
130
+ }
131
+ return res.data;
132
+ });
133
+ }
134
+ /**
135
+ * Search messages in a chat or globally.
136
+ */
137
+ async searchMessages(query, options) {
138
+ this.validateRequired(query, 'query');
139
+ return this.call('searchMessages', async () => {
140
+ const client = this.api.getClient();
141
+ const params = {
142
+ query,
143
+ ...this.buildPagination(options?.pageSize || 20, options?.pageToken),
144
+ };
145
+ if (options?.chatId) {
146
+ params.chat_id = options.chatId;
147
+ }
148
+ const res = await client.request({
149
+ method: 'GET',
150
+ url: '/open-apis/im/v1/messages',
151
+ params,
152
+ });
153
+ if (res.code !== 0) {
154
+ throw new Error(`Failed to search messages: ${res.msg || 'Unknown error'}`);
155
+ }
156
+ const data = res.data || {};
157
+ return {
158
+ messages: (data.items || []),
159
+ hasMore: data.has_more || false,
160
+ pageToken: data.page_token,
161
+ };
162
+ });
163
+ }
164
+ /**
165
+ * Download a resource (image/file) from a message.
166
+ * Supports range requests for large files.
167
+ */
168
+ async downloadResource(messageId, fileKey, type, outputPath) {
169
+ this.validateRequired(messageId, 'messageId');
170
+ this.validateRequired(fileKey, 'fileKey');
171
+ return this.call('downloadResource', async () => {
172
+ const buffer = await this.api.downloadMedia(messageId, fileKey, type);
173
+ // Generate output path if not provided
174
+ const finalPath = outputPath || `${Date.now()}_${fileKey}`;
175
+ // Save to file system (using FileDownloader)
176
+ const { FileDownloader } = await import('../core/file-downloader.js');
177
+ const downloader = new FileDownloader();
178
+ const result = await downloader.saveBuffer(buffer, finalPath, type === 'image' ? 'image/jpeg' : 'application/octet-stream');
179
+ return {
180
+ filePath: result.filePath,
181
+ fileName: result.fileName,
182
+ mimeType: result.mimeType,
183
+ size: buffer.length,
184
+ };
185
+ });
186
+ }
187
+ /**
188
+ * Get message history for a chat.
189
+ */
190
+ async getMessageHistory(chatId, options) {
191
+ this.validateRequired(chatId, 'chatId');
192
+ return this.call('getMessageHistory', async () => {
193
+ const client = this.api.getClient();
194
+ const res = await client.request({
195
+ method: 'GET',
196
+ url: '/open-apis/im/v1/messages',
197
+ params: {
198
+ container_id_type: 'chat',
199
+ container_id: chatId,
200
+ ...this.buildPagination(options?.pageSize || 20, options?.pageToken),
201
+ },
202
+ });
203
+ if (res.code !== 0) {
204
+ throw new Error(`Failed to get message history: ${res.msg || 'Unknown error'}`);
205
+ }
206
+ const data = res.data || {};
207
+ return {
208
+ messages: (data.items || []),
209
+ hasMore: data.has_more || false,
210
+ pageToken: data.page_token,
211
+ };
212
+ });
213
+ }
214
+ }
215
+ //# sourceMappingURL=im-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"im-service.js","sourceRoot":"","sources":["../../src/services/im-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { BaseService } from './base-service.js';
2
+ export { IMService } from './im-service.js';
3
+ export { DocService } from './doc-service.js';
4
+ export { ChatService } from './chat-service.js';
5
+ export { ContactService } from './contact-service.js';
6
+ export { CalendarService } from './calendar-service.js';
7
+ export { TaskService } from './task-service.js';
8
+ export { ApprovalService } from './approval-service.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ // Service exports
2
+ export { BaseService } from './base-service.js';
3
+ export { IMService } from './im-service.js';
4
+ export { DocService } from './doc-service.js';
5
+ export { ChatService } from './chat-service.js';
6
+ export { ContactService } from './contact-service.js';
7
+ export { CalendarService } from './calendar-service.js';
8
+ export { TaskService } from './task-service.js';
9
+ export { ApprovalService } from './approval-service.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { BaseService } from './base-service.js';
2
+ import type { FeishuAPI } from '../feishu/api.js';
3
+ import type { TaskInfo, TaskSearchResult } from '../types/extended.js';
4
+ export declare class TaskService extends BaseService {
5
+ constructor(api: FeishuAPI);
6
+ listTasks(options?: {
7
+ pageSize?: number;
8
+ pageToken?: string;
9
+ completed?: boolean;
10
+ }): Promise<TaskSearchResult>;
11
+ getTask(taskId: string): Promise<TaskInfo>;
12
+ createTask(task: Partial<TaskInfo>): Promise<TaskInfo>;
13
+ updateTask(taskId: string, task: Partial<TaskInfo>): Promise<TaskInfo>;
14
+ completeTask(taskId: string): Promise<TaskInfo>;
15
+ deleteTask(taskId: string): Promise<void>;
16
+ private parseTask;
17
+ private buildTaskPayload;
18
+ }
19
+ //# sourceMappingURL=task-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,GAAG,EAAE,SAAS;IAIpB,SAAS,CAAC,OAAO,CAAC,EAAE;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2BvB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmB1C,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBtE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQ/C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,gBAAgB;CAkBzB"}
@@ -0,0 +1,126 @@
1
+ import { BaseService } from './base-service.js';
2
+ export class TaskService extends BaseService {
3
+ constructor(api) {
4
+ super(api);
5
+ }
6
+ async listTasks(options) {
7
+ return this.call('listTasks', async () => {
8
+ const client = this.api.getClient();
9
+ const params = {
10
+ ...this.buildPagination(options?.pageSize || 100, options?.pageToken),
11
+ };
12
+ const res = await client.request({
13
+ method: 'GET',
14
+ url: '/open-apis/task/v2/tasks',
15
+ params,
16
+ });
17
+ if (res.code !== 0) {
18
+ throw new Error(`Failed to list tasks: ${res.msg || 'Unknown error'}`);
19
+ }
20
+ const data = res.data || {};
21
+ return {
22
+ tasks: (data.items || []).map((task) => this.parseTask(task)),
23
+ hasMore: data.has_more || false,
24
+ pageToken: data.page_token,
25
+ };
26
+ });
27
+ }
28
+ async getTask(taskId) {
29
+ this.validateRequired(taskId, 'taskId');
30
+ return this.call('getTask', async () => {
31
+ const client = this.api.getClient();
32
+ const res = await client.request({
33
+ method: 'GET',
34
+ url: `/open-apis/task/v2/tasks/${encodeURIComponent(taskId)}`,
35
+ });
36
+ if (res.code !== 0) {
37
+ throw new Error(`Failed to get task: ${res.msg || 'Unknown error'}`);
38
+ }
39
+ return this.parseTask(res.data);
40
+ });
41
+ }
42
+ async createTask(task) {
43
+ this.validateRequired(task.summary || '', 'summary');
44
+ return this.call('createTask', async () => {
45
+ const client = this.api.getClient();
46
+ const res = await client.request({
47
+ method: 'POST',
48
+ url: '/open-apis/task/v2/tasks',
49
+ data: this.buildTaskPayload(task),
50
+ });
51
+ if (res.code !== 0) {
52
+ throw new Error(`Failed to create task: ${res.msg || 'Unknown error'}`);
53
+ }
54
+ return this.parseTask(res.data);
55
+ });
56
+ }
57
+ async updateTask(taskId, task) {
58
+ this.validateRequired(taskId, 'taskId');
59
+ return this.call('updateTask', async () => {
60
+ const client = this.api.getClient();
61
+ const res = await client.request({
62
+ method: 'PATCH',
63
+ url: `/open-apis/task/v2/tasks/${encodeURIComponent(taskId)}`,
64
+ data: this.buildTaskPayload(task),
65
+ });
66
+ if (res.code !== 0) {
67
+ throw new Error(`Failed to update task: ${res.msg || 'Unknown error'}`);
68
+ }
69
+ return this.parseTask(res.data);
70
+ });
71
+ }
72
+ async completeTask(taskId) {
73
+ this.validateRequired(taskId, 'taskId');
74
+ return this.call('completeTask', async () => {
75
+ return this.updateTask(taskId, { status: 'completed', completedTime: new Date().toISOString() });
76
+ });
77
+ }
78
+ async deleteTask(taskId) {
79
+ this.validateRequired(taskId, 'taskId');
80
+ return this.call('deleteTask', async () => {
81
+ const client = this.api.getClient();
82
+ const res = await client.request({
83
+ method: 'DELETE',
84
+ url: `/open-apis/task/v2/tasks/${encodeURIComponent(taskId)}`,
85
+ });
86
+ if (res.code !== 0) {
87
+ throw new Error(`Failed to delete task: ${res.msg || 'Unknown error'}`);
88
+ }
89
+ });
90
+ }
91
+ parseTask(task) {
92
+ if (!task)
93
+ throw new Error('Task data is null');
94
+ return {
95
+ taskId: task.task_id,
96
+ summary: task.summary || 'Untitled Task',
97
+ description: task.description,
98
+ dueTime: task.due?.timestamp || task.due_time,
99
+ completedTime: task.completed_time,
100
+ status: task.completed ? 'completed' : 'needs_action',
101
+ creator: task.creator?.id,
102
+ assignees: (task.assignees || []).map((a) => a.id),
103
+ followers: (task.followers || []).map((f) => f.id),
104
+ };
105
+ }
106
+ buildTaskPayload(task) {
107
+ const payload = {};
108
+ if (task.summary)
109
+ payload.summary = task.summary;
110
+ if (task.description !== undefined)
111
+ payload.description = task.description;
112
+ if (task.dueTime)
113
+ payload.due = { timestamp: task.dueTime };
114
+ if (task.assignees?.length) {
115
+ payload.assignees = task.assignees.map(id => ({ id }));
116
+ }
117
+ if (task.followers?.length) {
118
+ payload.followers = task.followers.map(id => ({ id }));
119
+ }
120
+ if (task.status === 'completed') {
121
+ payload.completed = true;
122
+ }
123
+ return payload;
124
+ }
125
+ }
126
+ //# sourceMappingURL=task-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.js","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,YAAY,GAAc;QACxB,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAIf;QACC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAEpC,MAAM,MAAM,GAAwB;gBAClC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC;aACtE,CAAC;YAEF,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,0BAA0B;gBAC/B,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO;gBACL,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAClE,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;gBAC/B,SAAS,EAAE,IAAI,CAAC,UAAU;aAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAEpC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,EAAE;aAC9D,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;YACvE,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAuB;QACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAErD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAEpC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,0BAA0B;gBAC/B,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,IAAuB;QACtD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAEpC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,OAAO;gBACf,GAAG,EAAE,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,EAAE;gBAC7D,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAEpC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,QAAQ;gBAChB,GAAG,EAAE,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,EAAE;aAC9D,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,IAAS;QACzB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,eAAe;YACxC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC,QAAQ;YAC7C,aAAa,EAAE,IAAI,CAAC,cAAc;YAClC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YACrD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;YACzB,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,IAAuB;QAC9C,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACjD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3E,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ interface AppRegistrationResponse {
2
+ deviceCode: string;
3
+ userCode: string;
4
+ verificationUri: string;
5
+ verificationUriComplete: string;
6
+ expiresIn: number;
7
+ interval: number;
8
+ }
9
+ interface AppRegistrationResult {
10
+ clientID: string;
11
+ clientSecret: string;
12
+ userInfo?: {
13
+ openID: string;
14
+ tenantBrand: string;
15
+ };
16
+ }
17
+ /**
18
+ * Initiate the app registration device flow.
19
+ * This calls the Feishu Open Platform API to begin device authorization.
20
+ */
21
+ export declare function requestAppRegistration(): Promise<AppRegistrationResponse>;
22
+ /**
23
+ * Generate and display QR code in terminal.
24
+ */
25
+ export declare function displayQRCode(url: string): Promise<void>;
26
+ /**
27
+ * Poll the app registration endpoint until the app is created or timeout.
28
+ */
29
+ export declare function pollAppRegistration(deviceCode: string, interval: number, expiresIn: number): Promise<AppRegistrationResult>;
30
+ export {};
31
+ //# sourceMappingURL=device-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/setup/device-flow.ts"],"names":[],"mappings":"AAKA,UAAU,uBAAuB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAQD;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAmC/E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
@@ -0,0 +1,133 @@
1
+ import { createLogger } from '../core/logger.js';
2
+ import qrcode from 'qrcode';
3
+ const log = createLogger('DeviceFlow');
4
+ const ACCOUNTS_ENDPOINT = 'https://accounts.feishu.cn';
5
+ const OPEN_ENDPOINT = 'https://open.feishu.cn';
6
+ const APP_REGISTRATION_PATH = '/oauth/v1/app/registration';
7
+ const MAX_POLL_ATTEMPTS = 200;
8
+ const MAX_POLL_INTERVAL = 60;
9
+ /**
10
+ * Initiate the app registration device flow.
11
+ * This calls the Feishu Open Platform API to begin device authorization.
12
+ */
13
+ export async function requestAppRegistration() {
14
+ const endpoint = `${ACCOUNTS_ENDPOINT}${APP_REGISTRATION_PATH}`;
15
+ const form = new URLSearchParams();
16
+ form.set('action', 'begin');
17
+ form.set('archetype', 'PersonalAgent');
18
+ form.set('auth_method', 'client_secret');
19
+ form.set('request_user_info', 'open_id tenant_brand');
20
+ const resp = await fetch(endpoint, {
21
+ method: 'POST',
22
+ headers: {
23
+ 'Content-Type': 'application/x-www-form-urlencoded',
24
+ },
25
+ body: form.toString(),
26
+ });
27
+ const data = await resp.json();
28
+ if (!resp.ok || data.error) {
29
+ const msg = data.error_description || data.error || 'Unknown error';
30
+ throw new Error(`App registration failed: ${msg}`);
31
+ }
32
+ const userCode = data.user_code || '';
33
+ const verificationUriComplete = `${OPEN_ENDPOINT}/page/cli?user_code=${userCode}`;
34
+ return {
35
+ deviceCode: data.device_code || '',
36
+ userCode: userCode,
37
+ verificationUri: data.verification_uri || '',
38
+ verificationUriComplete: verificationUriComplete,
39
+ expiresIn: data.expires_in || 300,
40
+ interval: data.interval || 5,
41
+ };
42
+ }
43
+ /**
44
+ * Generate and display QR code in terminal.
45
+ */
46
+ export async function displayQRCode(url) {
47
+ try {
48
+ const qr = await qrcode.toString(url, {
49
+ type: 'terminal',
50
+ small: true,
51
+ });
52
+ console.log('\n📱 请使用飞书扫描二维码创建应用:\n');
53
+ console.log(qr);
54
+ console.log('\n💡 或点击链接:', url);
55
+ console.log('⏳ 等待扫码确认...\n');
56
+ }
57
+ catch (err) {
58
+ log.error({ err }, 'Failed to generate QR code');
59
+ console.log('\n📱 请访问以下链接创建应用:');
60
+ console.log(' ', url);
61
+ console.log('⏳ 等待扫码确认...\n');
62
+ }
63
+ }
64
+ /**
65
+ * Poll the app registration endpoint until the app is created or timeout.
66
+ */
67
+ export async function pollAppRegistration(deviceCode, interval, expiresIn) {
68
+ const endpoint = `${ACCOUNTS_ENDPOINT}${APP_REGISTRATION_PATH}`;
69
+ const deadline = Date.now() + expiresIn * 1000;
70
+ let currentInterval = interval;
71
+ let attempts = 0;
72
+ while (Date.now() < deadline && attempts < MAX_POLL_ATTEMPTS) {
73
+ attempts++;
74
+ await new Promise(resolve => setTimeout(resolve, currentInterval * 1000));
75
+ const form = new URLSearchParams();
76
+ form.set('action', 'poll');
77
+ form.set('device_code', deviceCode);
78
+ try {
79
+ const resp = await fetch(endpoint, {
80
+ method: 'POST',
81
+ headers: {
82
+ 'Content-Type': 'application/x-www-form-urlencoded',
83
+ },
84
+ body: form.toString(),
85
+ });
86
+ const data = await resp.json();
87
+ const errStr = data.error || '';
88
+ // Success: client_id present
89
+ if (!errStr && data.client_id) {
90
+ const result = {
91
+ clientID: data.client_id,
92
+ clientSecret: data.client_secret || '',
93
+ };
94
+ if (data.user_info) {
95
+ result.userInfo = {
96
+ openID: data.user_info.open_id || '',
97
+ tenantBrand: data.user_info.tenant_brand || 'feishu',
98
+ };
99
+ }
100
+ return result;
101
+ }
102
+ switch (errStr) {
103
+ case 'authorization_pending':
104
+ continue;
105
+ case 'slow_down':
106
+ currentInterval = Math.min(currentInterval + 5, MAX_POLL_INTERVAL);
107
+ log.info({ interval: currentInterval }, 'Rate limited, increasing interval');
108
+ continue;
109
+ case 'access_denied':
110
+ throw new Error('App registration denied by user');
111
+ case 'expired_token':
112
+ case 'invalid_grant':
113
+ throw new Error('Device code expired, please try again');
114
+ default:
115
+ const desc = data.error_description || errStr || 'Unknown error';
116
+ throw new Error(`App registration failed: ${desc}`);
117
+ }
118
+ }
119
+ catch (err) {
120
+ if (err instanceof Error &&
121
+ (err.message.includes('denied') || err.message.includes('expired'))) {
122
+ throw err;
123
+ }
124
+ log.warn({ err }, 'Poll error, retrying...');
125
+ currentInterval = Math.min(currentInterval + 1, MAX_POLL_INTERVAL);
126
+ }
127
+ }
128
+ if (attempts >= MAX_POLL_ATTEMPTS) {
129
+ throw new Error('Max poll attempts reached');
130
+ }
131
+ throw new Error('App registration timed out');
132
+ }
133
+ //# sourceMappingURL=device-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/setup/device-flow.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export declare function checkConfigWritable(configPath?: string): Promise<CheckR
18
18
  export declare function checkFeishuCredentials(appId: string | undefined, appSecret: string | undefined, domain?: 'feishu' | 'lark'): Promise<CheckResult>;
19
19
  export declare function checkOpenCodeServer(url: string): Promise<CheckResult>;
20
20
  export declare function checkAllowlist(config: FeishuConfig | null): Promise<CheckResult>;
21
+ export declare function checkPermissions(appId: string | undefined, appSecret: string | undefined, domain?: 'feishu' | 'lark'): Promise<CheckResult[]>;
21
22
  /**
22
23
  * Run all applicable checks given a (possibly partial) config.
23
24
  * Order: cheapest/most foundational first so short-circuit decisions
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/setup/preflight.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,wBAAsB,eAAe,CAAC,UAAU,SAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAU5F;AAED,wBAAsB,mBAAmB,CAAC,UAAU,SAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAchG;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,GAAE,QAAQ,GAAG,MAAiB,GACnC,OAAO,CAAC,WAAW,CAAC,CAgDtB;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiC3E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BtF;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/setup/preflight.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,wBAAsB,eAAe,CAAC,UAAU,SAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAU5F;AAED,wBAAsB,mBAAmB,CAAC,UAAU,SAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAchG;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,GAAE,QAAQ,GAAG,MAAiB,GACnC,OAAO,CAAC,WAAW,CAAC,CAgDtB;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiC3E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BtF;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,GAAE,QAAQ,GAAG,MAAiB,GACnC,OAAO,CAAC,WAAW,EAAE,CAAC,CAkKxB;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,WAAW,EAAE,CAAC,CA4BxB"}