@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,25 @@
1
+ import { BaseService } from './base-service.js';
2
+ import type { FeishuAPI } from '../feishu/api.js';
3
+ import type { CalendarInfo, CalendarEvent, CalendarSearchResult, EventSearchResult, FreeBusyResult } from '../types/extended.js';
4
+ export declare class CalendarService extends BaseService {
5
+ constructor(api: FeishuAPI);
6
+ listCalendars(options?: {
7
+ pageSize?: number;
8
+ pageToken?: string;
9
+ }): Promise<CalendarSearchResult>;
10
+ getPrimaryCalendar(): Promise<CalendarInfo>;
11
+ listEvents(calendarId: string, options?: {
12
+ startTime?: string;
13
+ endTime?: string;
14
+ pageSize?: number;
15
+ pageToken?: string;
16
+ }): Promise<EventSearchResult>;
17
+ getEvent(calendarId: string, eventId: string): Promise<CalendarEvent>;
18
+ createEvent(calendarId: string, event: Partial<CalendarEvent>): Promise<CalendarEvent>;
19
+ updateEvent(calendarId: string, eventId: string, event: Partial<CalendarEvent>): Promise<CalendarEvent>;
20
+ deleteEvent(calendarId: string, eventId: string): Promise<void>;
21
+ queryFreeBusy(openIds: string[], startTime: string, endTime: string): Promise<FreeBusyResult[]>;
22
+ private parseEvent;
23
+ private buildEventPayload;
24
+ }
25
+ //# sourceMappingURL=calendar-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-service.d.ts","sourceRoot":"","sources":["../../src/services/calendar-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,GAAG,EAAE,SAAS;IAIpB,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA6B3B,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;IAwB3C,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,iBAAiB,CAAC;IA+BvB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBrE,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC;IAqBnB,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC;IAqBnB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/D,aAAa,CACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,EAAE,CAAC;IAkC5B,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,iBAAiB;CA2B1B"}
@@ -0,0 +1,220 @@
1
+ import { BaseService } from './base-service.js';
2
+ export class CalendarService extends BaseService {
3
+ constructor(api) {
4
+ super(api);
5
+ }
6
+ async listCalendars(options) {
7
+ return this.call('listCalendars', async () => {
8
+ const client = this.api.getClient();
9
+ const res = await client.request({
10
+ method: 'GET',
11
+ url: '/open-apis/calendar/v4/calendars',
12
+ params: this.buildPagination(options?.pageSize || 100, options?.pageToken),
13
+ });
14
+ if (res.code !== 0) {
15
+ throw new Error(`Failed to list calendars: ${res.msg || 'Unknown error'}`);
16
+ }
17
+ const data = res.data || {};
18
+ return {
19
+ calendars: (data.calendars || []).map((cal) => ({
20
+ calendarId: cal.calendar?.calendar_id || cal.calendar_id,
21
+ name: cal.calendar?.name || cal.name || 'Untitled',
22
+ description: cal.calendar?.description || cal.description,
23
+ isPrimary: cal.calendar?.is_primary || cal.is_primary,
24
+ isPublic: cal.calendar?.is_public || cal.is_public,
25
+ })),
26
+ hasMore: data.has_more || false,
27
+ pageToken: data.page_token,
28
+ };
29
+ });
30
+ }
31
+ async getPrimaryCalendar() {
32
+ return this.call('getPrimaryCalendar', async () => {
33
+ const client = this.api.getClient();
34
+ const res = await client.request({
35
+ method: 'GET',
36
+ url: '/open-apis/calendar/v4/calendars/primary',
37
+ });
38
+ if (res.code !== 0) {
39
+ throw new Error(`Failed to get primary calendar: ${res.msg || 'Unknown error'}`);
40
+ }
41
+ const cal = res.data || {};
42
+ return {
43
+ calendarId: cal.calendar_id,
44
+ name: cal.name || 'Primary Calendar',
45
+ description: cal.description,
46
+ isPrimary: true,
47
+ isPublic: cal.is_public,
48
+ };
49
+ });
50
+ }
51
+ async listEvents(calendarId, options) {
52
+ this.validateRequired(calendarId, 'calendarId');
53
+ return this.call('listEvents', async () => {
54
+ const client = this.api.getClient();
55
+ const params = {
56
+ ...this.buildPagination(options?.pageSize || 500, options?.pageToken),
57
+ };
58
+ if (options?.startTime)
59
+ params.start_time = options.startTime;
60
+ if (options?.endTime)
61
+ params.end_time = options.endTime;
62
+ const res = await client.request({
63
+ method: 'GET',
64
+ url: `/open-apis/calendar/v4/calendars/${encodeURIComponent(calendarId)}/events`,
65
+ params,
66
+ });
67
+ if (res.code !== 0) {
68
+ throw new Error(`Failed to list events: ${res.msg || 'Unknown error'}`);
69
+ }
70
+ const data = res.data || {};
71
+ return {
72
+ events: (data.items || []).map((evt) => this.parseEvent(evt)),
73
+ hasMore: data.has_more || false,
74
+ pageToken: data.page_token,
75
+ };
76
+ });
77
+ }
78
+ async getEvent(calendarId, eventId) {
79
+ this.validateRequired(calendarId, 'calendarId');
80
+ this.validateRequired(eventId, 'eventId');
81
+ return this.call('getEvent', async () => {
82
+ const client = this.api.getClient();
83
+ const res = await client.request({
84
+ method: 'GET',
85
+ url: `/open-apis/calendar/v4/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
86
+ });
87
+ if (res.code !== 0) {
88
+ throw new Error(`Failed to get event: ${res.msg || 'Unknown error'}`);
89
+ }
90
+ return this.parseEvent(res.data);
91
+ });
92
+ }
93
+ async createEvent(calendarId, event) {
94
+ this.validateRequired(calendarId, 'calendarId');
95
+ this.validateRequired(event.summary || '', 'summary');
96
+ return this.call('createEvent', async () => {
97
+ const client = this.api.getClient();
98
+ const res = await client.request({
99
+ method: 'POST',
100
+ url: `/open-apis/calendar/v4/calendars/${encodeURIComponent(calendarId)}/events`,
101
+ data: this.buildEventPayload(event),
102
+ });
103
+ if (res.code !== 0) {
104
+ throw new Error(`Failed to create event: ${res.msg || 'Unknown error'}`);
105
+ }
106
+ return this.parseEvent(res.data);
107
+ });
108
+ }
109
+ async updateEvent(calendarId, eventId, event) {
110
+ this.validateRequired(calendarId, 'calendarId');
111
+ this.validateRequired(eventId, 'eventId');
112
+ return this.call('updateEvent', async () => {
113
+ const client = this.api.getClient();
114
+ const res = await client.request({
115
+ method: 'PATCH',
116
+ url: `/open-apis/calendar/v4/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
117
+ data: this.buildEventPayload(event),
118
+ });
119
+ if (res.code !== 0) {
120
+ throw new Error(`Failed to update event: ${res.msg || 'Unknown error'}`);
121
+ }
122
+ return this.parseEvent(res.data);
123
+ });
124
+ }
125
+ async deleteEvent(calendarId, eventId) {
126
+ this.validateRequired(calendarId, 'calendarId');
127
+ this.validateRequired(eventId, 'eventId');
128
+ return this.call('deleteEvent', async () => {
129
+ const client = this.api.getClient();
130
+ const res = await client.request({
131
+ method: 'DELETE',
132
+ url: `/open-apis/calendar/v4/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
133
+ });
134
+ if (res.code !== 0) {
135
+ throw new Error(`Failed to delete event: ${res.msg || 'Unknown error'}`);
136
+ }
137
+ });
138
+ }
139
+ async queryFreeBusy(openIds, startTime, endTime) {
140
+ if (!openIds?.length)
141
+ throw new Error('openIds is required');
142
+ this.validateRequired(startTime, 'startTime');
143
+ this.validateRequired(endTime, 'endTime');
144
+ return this.call('queryFreeBusy', async () => {
145
+ const client = this.api.getClient();
146
+ const res = await client.request({
147
+ method: 'POST',
148
+ url: '/open-apis/calendar/v4/freebusy/list',
149
+ data: {
150
+ user_id_type: 'open_id',
151
+ user_ids: openIds,
152
+ start_time: startTime,
153
+ end_time: endTime,
154
+ },
155
+ });
156
+ if (res.code !== 0) {
157
+ throw new Error(`Failed to query freebusy: ${res.msg || 'Unknown error'}`);
158
+ }
159
+ const data = res.data || {};
160
+ return (data.freebusy_list || []).map((item) => ({
161
+ openId: item.user_id,
162
+ busyTimes: (item.freebusy || []).map((fb) => ({
163
+ start: fb.start_time,
164
+ end: fb.end_time,
165
+ })),
166
+ }));
167
+ });
168
+ }
169
+ parseEvent(evt) {
170
+ if (!evt)
171
+ throw new Error('Event data is null');
172
+ return {
173
+ eventId: evt.event_id,
174
+ summary: evt.summary || 'Untitled Event',
175
+ description: evt.description,
176
+ startTime: evt.start_time?.timestamp || evt.start_time,
177
+ endTime: evt.end_time?.timestamp || evt.end_time,
178
+ location: evt.location?.name || evt.location,
179
+ attendees: (evt.attendees || []).map((att) => ({
180
+ openId: att.user_id,
181
+ userId: att.user_id,
182
+ email: att.email,
183
+ displayName: att.display_name,
184
+ responseStatus: att.response_status,
185
+ isOptional: att.is_optional,
186
+ isResource: att.is_resource,
187
+ })),
188
+ recurrence: evt.recurrence,
189
+ status: evt.status,
190
+ };
191
+ }
192
+ buildEventPayload(event) {
193
+ const payload = {};
194
+ if (event.summary)
195
+ payload.summary = event.summary;
196
+ if (event.description)
197
+ payload.description = event.description;
198
+ if (event.startTime) {
199
+ payload.start_time = { timestamp: event.startTime };
200
+ }
201
+ if (event.endTime) {
202
+ payload.end_time = { timestamp: event.endTime };
203
+ }
204
+ if (event.location) {
205
+ payload.location = { name: event.location };
206
+ }
207
+ if (event.attendees?.length) {
208
+ payload.attendees = event.attendees.map(att => ({
209
+ user_id: att.openId || att.userId,
210
+ email: att.email,
211
+ is_optional: att.isOptional,
212
+ }));
213
+ }
214
+ if (event.recurrence) {
215
+ payload.recurrence = event.recurrence;
216
+ }
217
+ return payload;
218
+ }
219
+ }
220
+ //# sourceMappingURL=calendar-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-service.js","sourceRoot":"","sources":["../../src/services/calendar-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { BaseService } from './base-service.js';
2
+ import type { FeishuAPI } from '../feishu/api.js';
3
+ import type { ChatInfo, ChatSearchResult, ChatMember } from '../types/extended.js';
4
+ /**
5
+ * Chat/Group Service
6
+ * Provides chat operations: search, create, manage members
7
+ */
8
+ export declare class ChatService extends BaseService {
9
+ constructor(api: FeishuAPI);
10
+ /**
11
+ * Search for chats by keyword.
12
+ */
13
+ searchChats(query: string, options?: {
14
+ searchTypes?: string[];
15
+ memberIds?: string[];
16
+ pageSize?: number;
17
+ pageToken?: string;
18
+ }): Promise<ChatSearchResult>;
19
+ /**
20
+ * Get chat info by ID.
21
+ */
22
+ getChatInfo(chatId: string): Promise<ChatInfo>;
23
+ /**
24
+ * Create a new chat/group.
25
+ */
26
+ createChat(options: {
27
+ name: string;
28
+ description?: string;
29
+ memberIds?: string[];
30
+ chatType?: 'group' | 'p2p';
31
+ }): Promise<ChatInfo>;
32
+ /**
33
+ * Get chat members.
34
+ */
35
+ getChatMembers(chatId: string, options?: {
36
+ pageSize?: number;
37
+ pageToken?: string;
38
+ }): Promise<{
39
+ members: ChatMember[];
40
+ hasMore: boolean;
41
+ pageToken?: string;
42
+ }>;
43
+ /**
44
+ * Add members to a chat.
45
+ */
46
+ addChatMembers(chatId: string, memberIds: string[]): Promise<void>;
47
+ /**
48
+ * Remove members from a chat.
49
+ */
50
+ removeChatMembers(chatId: string, memberIds: string[]): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=chat-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-service.d.ts","sourceRoot":"","sources":["../../src/services/chat-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,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;;GAGG;AACH,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,GAAG,EAAE,SAAS;IAI1B;;OAEG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAwC5B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2BpD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;KAC5B,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6BrB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B3E;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB5E"}
@@ -0,0 +1,170 @@
1
+ import { BaseService } from './base-service.js';
2
+ /**
3
+ * Chat/Group Service
4
+ * Provides chat operations: search, create, manage members
5
+ */
6
+ export class ChatService extends BaseService {
7
+ constructor(api) {
8
+ super(api);
9
+ }
10
+ /**
11
+ * Search for chats by keyword.
12
+ */
13
+ async searchChats(query, options) {
14
+ this.validateRequired(query, 'query');
15
+ return this.call('searchChats', async () => {
16
+ const client = this.api.getClient();
17
+ const res = await client.request({
18
+ method: 'POST',
19
+ url: '/open-apis/im/v1/chats/search',
20
+ data: {
21
+ query,
22
+ ...(options?.searchTypes ? { search_types: options.searchTypes } : {}),
23
+ ...(options?.memberIds ? { member_ids: options.memberIds } : {}),
24
+ ...this.buildPagination(options?.pageSize || 20, options?.pageToken),
25
+ },
26
+ });
27
+ if (res.code !== 0) {
28
+ throw new Error(`Failed to search chats: ${res.msg || 'Unknown error'}`);
29
+ }
30
+ const data = res.data || {};
31
+ const chats = (data.items || []).map((chat) => ({
32
+ chatId: chat.chat_id,
33
+ name: chat.name,
34
+ description: chat.description,
35
+ ownerId: chat.owner_id,
36
+ memberCount: chat.member_count,
37
+ chatType: chat.chat_type,
38
+ createTime: chat.create_time,
39
+ }));
40
+ return {
41
+ chats,
42
+ hasMore: data.has_more || false,
43
+ pageToken: data.page_token,
44
+ };
45
+ });
46
+ }
47
+ /**
48
+ * Get chat info by ID.
49
+ */
50
+ async getChatInfo(chatId) {
51
+ this.validateRequired(chatId, 'chatId');
52
+ return this.call('getChatInfo', async () => {
53
+ const client = this.api.getClient();
54
+ const res = await client.im.v1.chat.get({
55
+ path: { chat_id: chatId },
56
+ });
57
+ if (res.code !== 0) {
58
+ throw new Error(`Failed to get chat info: ${res.msg || 'Unknown error'}`);
59
+ }
60
+ const data = res.data || {};
61
+ return {
62
+ chatId: data.chat_id,
63
+ name: data.name,
64
+ description: data.description,
65
+ ownerId: data.owner_id,
66
+ memberCount: data.member_count,
67
+ chatType: data.chat_type,
68
+ createTime: data.create_time,
69
+ };
70
+ });
71
+ }
72
+ /**
73
+ * Create a new chat/group.
74
+ */
75
+ async createChat(options) {
76
+ this.validateRequired(options.name, 'name');
77
+ return this.call('createChat', async () => {
78
+ const client = this.api.getClient();
79
+ const res = await client.im.v1.chat.create({
80
+ data: {
81
+ name: options.name,
82
+ description: options.description,
83
+ ...(options.memberIds ? { user_id_list: options.memberIds } : {}),
84
+ chat_type: options.chatType || 'group',
85
+ },
86
+ });
87
+ if (res.code !== 0) {
88
+ throw new Error(`Failed to create chat: ${res.msg || 'Unknown error'}`);
89
+ }
90
+ const data = res.data || {};
91
+ return {
92
+ chatId: data.chat_id,
93
+ name: options.name,
94
+ description: options.description,
95
+ chatType: options.chatType || 'group',
96
+ };
97
+ });
98
+ }
99
+ /**
100
+ * Get chat members.
101
+ */
102
+ async getChatMembers(chatId, options) {
103
+ this.validateRequired(chatId, 'chatId');
104
+ return this.call('getChatMembers', async () => {
105
+ const client = this.api.getClient();
106
+ const res = await client.im.v1.chatMembers.get({
107
+ path: { chat_id: chatId },
108
+ params: this.buildPagination(options?.pageSize || 100, options?.pageToken),
109
+ });
110
+ if (res.code !== 0) {
111
+ throw new Error(`Failed to get chat members: ${res.msg || 'Unknown error'}`);
112
+ }
113
+ const data = res.data || {};
114
+ const members = (data.items || []).map((member) => ({
115
+ openId: member.member_id,
116
+ userId: member.user_id,
117
+ name: member.name,
118
+ role: member.role,
119
+ }));
120
+ return {
121
+ members,
122
+ hasMore: data.has_more || false,
123
+ pageToken: data.page_token,
124
+ };
125
+ });
126
+ }
127
+ /**
128
+ * Add members to a chat.
129
+ */
130
+ async addChatMembers(chatId, memberIds) {
131
+ this.validateRequired(chatId, 'chatId');
132
+ if (!memberIds || memberIds.length === 0) {
133
+ throw new Error('memberIds cannot be empty');
134
+ }
135
+ return this.call('addChatMembers', async () => {
136
+ const client = this.api.getClient();
137
+ const res = await client.im.v1.chatMembers.create({
138
+ path: { chat_id: chatId },
139
+ data: {
140
+ id_list: memberIds,
141
+ },
142
+ });
143
+ if (res.code !== 0) {
144
+ throw new Error(`Failed to add chat members: ${res.msg || 'Unknown error'}`);
145
+ }
146
+ });
147
+ }
148
+ /**
149
+ * Remove members from a chat.
150
+ */
151
+ async removeChatMembers(chatId, memberIds) {
152
+ this.validateRequired(chatId, 'chatId');
153
+ if (!memberIds || memberIds.length === 0) {
154
+ throw new Error('memberIds cannot be empty');
155
+ }
156
+ return this.call('removeChatMembers', async () => {
157
+ const client = this.api.getClient();
158
+ const res = await client.im.v1.chatMembers.delete({
159
+ path: { chat_id: chatId },
160
+ data: {
161
+ id_list: memberIds,
162
+ },
163
+ });
164
+ if (res.code !== 0) {
165
+ throw new Error(`Failed to remove chat members: ${res.msg || 'Unknown error'}`);
166
+ }
167
+ });
168
+ }
169
+ }
170
+ //# sourceMappingURL=chat-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../src/services/chat-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { BaseService } from './base-service.js';
2
+ import type { FeishuAPI } from '../feishu/api.js';
3
+ import type { UserInfo, UserSearchResult } from '../types/extended.js';
4
+ /**
5
+ * Contact/ User Service
6
+ * Provides user operations: search, get info, department query
7
+ */
8
+ export declare class ContactService extends BaseService {
9
+ constructor(api: FeishuAPI);
10
+ /**
11
+ * Search users by keyword (name, email, phone).
12
+ */
13
+ searchUsers(query: string, options?: {
14
+ pageSize?: number;
15
+ pageToken?: string;
16
+ }): Promise<UserSearchResult>;
17
+ /**
18
+ * Get user info by ID.
19
+ */
20
+ getUserInfo(userId: string): Promise<UserInfo>;
21
+ /**
22
+ * Get current bot info.
23
+ */
24
+ getBotInfo(): Promise<{
25
+ openId: string;
26
+ name: string;
27
+ }>;
28
+ /**
29
+ * Get user list by department.
30
+ */
31
+ getDepartmentUsers(departmentId: string, options?: {
32
+ pageSize?: number;
33
+ pageToken?: string;
34
+ }): Promise<UserSearchResult>;
35
+ /**
36
+ * Parse user object from API response.
37
+ */
38
+ private parseUser;
39
+ }
40
+ //# sourceMappingURL=contact-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-service.d.ts","sourceRoot":"","sources":["../../src/services/contact-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;;;GAGG;AACH,qBAAa,cAAe,SAAQ,WAAW;gBACjC,GAAG,EAAE,SAAS;IAI1B;;OAEG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,gBAAgB,CAAC;IA8C5B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmBpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAoB7D;;OAEG;IACG,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,gBAAgB,CAAC;IA2B5B;;OAEG;IACH,OAAO,CAAC,SAAS;CAqBlB"}