@spaceflow/core 0.1.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 (116) hide show
  1. package/CHANGELOG.md +1176 -0
  2. package/README.md +105 -0
  3. package/nest-cli.json +10 -0
  4. package/package.json +128 -0
  5. package/rspack.config.mjs +62 -0
  6. package/src/__mocks__/@opencode-ai/sdk.js +9 -0
  7. package/src/__mocks__/c12.ts +3 -0
  8. package/src/app.module.ts +18 -0
  9. package/src/config/ci.config.ts +29 -0
  10. package/src/config/config-loader.ts +101 -0
  11. package/src/config/config-reader.module.ts +16 -0
  12. package/src/config/config-reader.service.ts +133 -0
  13. package/src/config/feishu.config.ts +35 -0
  14. package/src/config/git-provider.config.ts +29 -0
  15. package/src/config/index.ts +29 -0
  16. package/src/config/llm.config.ts +110 -0
  17. package/src/config/schema-generator.service.ts +129 -0
  18. package/src/config/spaceflow.config.ts +292 -0
  19. package/src/config/storage.config.ts +33 -0
  20. package/src/extension-system/extension.interface.ts +221 -0
  21. package/src/extension-system/index.ts +1 -0
  22. package/src/index.ts +80 -0
  23. package/src/locales/en/translation.json +11 -0
  24. package/src/locales/zh-cn/translation.json +11 -0
  25. package/src/shared/claude-setup/claude-setup.module.ts +8 -0
  26. package/src/shared/claude-setup/claude-setup.service.ts +131 -0
  27. package/src/shared/claude-setup/index.ts +2 -0
  28. package/src/shared/editor-config/index.ts +23 -0
  29. package/src/shared/feishu-sdk/feishu-sdk.module.ts +77 -0
  30. package/src/shared/feishu-sdk/feishu-sdk.service.ts +130 -0
  31. package/src/shared/feishu-sdk/fieshu-card.service.ts +139 -0
  32. package/src/shared/feishu-sdk/index.ts +4 -0
  33. package/src/shared/feishu-sdk/types/card-action.ts +132 -0
  34. package/src/shared/feishu-sdk/types/card.ts +64 -0
  35. package/src/shared/feishu-sdk/types/common.ts +22 -0
  36. package/src/shared/feishu-sdk/types/index.ts +46 -0
  37. package/src/shared/feishu-sdk/types/message.ts +35 -0
  38. package/src/shared/feishu-sdk/types/module.ts +21 -0
  39. package/src/shared/feishu-sdk/types/user.ts +77 -0
  40. package/src/shared/git-provider/adapters/gitea.adapter.spec.ts +473 -0
  41. package/src/shared/git-provider/adapters/gitea.adapter.ts +499 -0
  42. package/src/shared/git-provider/adapters/github.adapter.spec.ts +341 -0
  43. package/src/shared/git-provider/adapters/github.adapter.ts +830 -0
  44. package/src/shared/git-provider/adapters/gitlab.adapter.ts +839 -0
  45. package/src/shared/git-provider/adapters/index.ts +3 -0
  46. package/src/shared/git-provider/detect-provider.spec.ts +195 -0
  47. package/src/shared/git-provider/detect-provider.ts +112 -0
  48. package/src/shared/git-provider/git-provider.interface.ts +188 -0
  49. package/src/shared/git-provider/git-provider.module.ts +73 -0
  50. package/src/shared/git-provider/git-provider.service.spec.ts +282 -0
  51. package/src/shared/git-provider/git-provider.service.ts +309 -0
  52. package/src/shared/git-provider/index.ts +7 -0
  53. package/src/shared/git-provider/parse-repo-url.spec.ts +221 -0
  54. package/src/shared/git-provider/parse-repo-url.ts +155 -0
  55. package/src/shared/git-provider/types.ts +434 -0
  56. package/src/shared/git-sdk/git-sdk-diff.utils.spec.ts +344 -0
  57. package/src/shared/git-sdk/git-sdk-diff.utils.ts +151 -0
  58. package/src/shared/git-sdk/git-sdk.module.ts +8 -0
  59. package/src/shared/git-sdk/git-sdk.service.ts +235 -0
  60. package/src/shared/git-sdk/git-sdk.types.ts +25 -0
  61. package/src/shared/git-sdk/index.ts +4 -0
  62. package/src/shared/i18n/i18n.spec.ts +96 -0
  63. package/src/shared/i18n/i18n.ts +86 -0
  64. package/src/shared/i18n/index.ts +1 -0
  65. package/src/shared/i18n/locale-detect.ts +134 -0
  66. package/src/shared/llm-jsonput/index.ts +94 -0
  67. package/src/shared/llm-jsonput/types.ts +17 -0
  68. package/src/shared/llm-proxy/adapters/claude-code.adapter.spec.ts +131 -0
  69. package/src/shared/llm-proxy/adapters/claude-code.adapter.ts +208 -0
  70. package/src/shared/llm-proxy/adapters/index.ts +4 -0
  71. package/src/shared/llm-proxy/adapters/llm-adapter.interface.ts +23 -0
  72. package/src/shared/llm-proxy/adapters/open-code.adapter.ts +342 -0
  73. package/src/shared/llm-proxy/adapters/openai.adapter.spec.ts +215 -0
  74. package/src/shared/llm-proxy/adapters/openai.adapter.ts +153 -0
  75. package/src/shared/llm-proxy/index.ts +6 -0
  76. package/src/shared/llm-proxy/interfaces/config.interface.ts +32 -0
  77. package/src/shared/llm-proxy/interfaces/index.ts +4 -0
  78. package/src/shared/llm-proxy/interfaces/message.interface.ts +48 -0
  79. package/src/shared/llm-proxy/interfaces/session.interface.ts +28 -0
  80. package/src/shared/llm-proxy/llm-proxy.module.ts +140 -0
  81. package/src/shared/llm-proxy/llm-proxy.service.spec.ts +303 -0
  82. package/src/shared/llm-proxy/llm-proxy.service.ts +132 -0
  83. package/src/shared/llm-proxy/llm-session.spec.ts +111 -0
  84. package/src/shared/llm-proxy/llm-session.ts +109 -0
  85. package/src/shared/llm-proxy/stream-logger.ts +97 -0
  86. package/src/shared/logger/index.ts +11 -0
  87. package/src/shared/logger/logger.interface.ts +93 -0
  88. package/src/shared/logger/logger.spec.ts +178 -0
  89. package/src/shared/logger/logger.ts +175 -0
  90. package/src/shared/logger/renderers/plain.renderer.ts +116 -0
  91. package/src/shared/logger/renderers/tui.renderer.ts +162 -0
  92. package/src/shared/mcp/index.ts +332 -0
  93. package/src/shared/output/index.ts +2 -0
  94. package/src/shared/output/output.module.ts +9 -0
  95. package/src/shared/output/output.service.ts +97 -0
  96. package/src/shared/package-manager/index.ts +115 -0
  97. package/src/shared/parallel/index.ts +1 -0
  98. package/src/shared/parallel/parallel-executor.ts +169 -0
  99. package/src/shared/rspack-config/index.ts +1 -0
  100. package/src/shared/rspack-config/rspack-config.ts +157 -0
  101. package/src/shared/source-utils/index.ts +130 -0
  102. package/src/shared/spaceflow-dir/index.ts +158 -0
  103. package/src/shared/storage/adapters/file.adapter.ts +113 -0
  104. package/src/shared/storage/adapters/index.ts +3 -0
  105. package/src/shared/storage/adapters/memory.adapter.ts +50 -0
  106. package/src/shared/storage/adapters/storage-adapter.interface.ts +48 -0
  107. package/src/shared/storage/index.ts +4 -0
  108. package/src/shared/storage/storage.module.ts +150 -0
  109. package/src/shared/storage/storage.service.ts +293 -0
  110. package/src/shared/storage/types.ts +51 -0
  111. package/src/shared/verbose/index.ts +73 -0
  112. package/test/app.e2e-spec.ts +22 -0
  113. package/tsconfig.build.json +4 -0
  114. package/tsconfig.json +25 -0
  115. package/tsconfig.skill.json +18 -0
  116. package/vitest.config.ts +58 -0
@@ -0,0 +1,130 @@
1
+ import { Inject, Injectable, type OnModuleDestroy, type OnModuleInit } from "@nestjs/common";
2
+ import { EventEmitter2 } from "@nestjs/event-emitter";
3
+ import * as lark from "@larksuiteoapi/node-sdk";
4
+ import {
5
+ FeishuModuleOptions,
6
+ FEISHU_MODULE_OPTIONS,
7
+ FeishuUser,
8
+ GetUserParams,
9
+ FEISHU_CARD_ACTION_TRIGGER,
10
+ type CardEvents,
11
+ type CardActionTriggerResponse,
12
+ type CardActionTriggerEvent,
13
+ } from "./types";
14
+
15
+ /**
16
+ * 飞书 API 服务
17
+ */
18
+ @Injectable()
19
+ export class FeishuSdkService implements OnModuleInit, OnModuleDestroy {
20
+ protected readonly client: lark.Client;
21
+
22
+ onModuleInit(): void {
23
+ const eventDispatcher = new lark.EventDispatcher({
24
+ encryptKey: "encrypt key",
25
+ }).register<CardEvents>({
26
+ [FEISHU_CARD_ACTION_TRIGGER]: async (data) => {
27
+ let done: (result: CardActionTriggerResponse) => void = () => null;
28
+ const p = new Promise<CardActionTriggerResponse>((resolve) => {
29
+ done = resolve;
30
+ });
31
+
32
+ // 转换为事件监听器友好的格式
33
+ const event: CardActionTriggerEvent = {
34
+ ...data,
35
+ done,
36
+ };
37
+
38
+ this.eventEmitter.emit(FEISHU_CARD_ACTION_TRIGGER, event);
39
+ return await p;
40
+ },
41
+ });
42
+ }
43
+
44
+ onModuleDestroy(): void {
45
+ this.eventEmitter.removeAllListeners();
46
+ }
47
+
48
+ constructor(
49
+ @Inject(FEISHU_MODULE_OPTIONS)
50
+ protected readonly options: FeishuModuleOptions,
51
+ protected readonly eventEmitter: EventEmitter2,
52
+ ) {
53
+ this.client = new lark.Client({
54
+ appId: options.appId,
55
+ appSecret: options.appSecret,
56
+ appType: options.appType === "store" ? lark.AppType.ISV : lark.AppType.SelfBuild,
57
+ domain: options.domain === "lark" ? lark.Domain.Lark : lark.Domain.Feishu,
58
+ });
59
+ }
60
+
61
+ /**
62
+ * 验证飞书配置
63
+ */
64
+ validateConfig(): void {
65
+ if (!this.options?.appId) {
66
+ throw new Error("缺少配置 feishu.appId (环境变量 FEISHU_APP_ID)");
67
+ }
68
+
69
+ if (!this.options?.appSecret) {
70
+ throw new Error("缺少配置 feishu.appSecret (环境变量 FEISHU_APP_SECRET)");
71
+ }
72
+ }
73
+
74
+ /**
75
+ * 获取原始 Lark Client 实例
76
+ * 用于调用 SDK 中未封装的 API
77
+ */
78
+ getClient(): lark.Client {
79
+ return this.client;
80
+ }
81
+
82
+ /**
83
+ * 获取用户信息
84
+ * @param params 获取用户信息的参数
85
+ * @returns 用户信息
86
+ */
87
+ async getUser(params: GetUserParams): Promise<FeishuUser | null> {
88
+ const { userId, userIdType = "open_id", departmentIdType } = params;
89
+
90
+ const response = await this.client.contact.user.get({
91
+ path: {
92
+ user_id: userId,
93
+ },
94
+ params: {
95
+ user_id_type: userIdType,
96
+ department_id_type: departmentIdType,
97
+ },
98
+ });
99
+
100
+ if (response.code !== 0) {
101
+ throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);
102
+ }
103
+
104
+ return response.data?.user as FeishuUser | null;
105
+ }
106
+
107
+ /**
108
+ * 批量获取用户信息
109
+ * @param userIds 用户 ID 列表
110
+ * @param userIdType 用户 ID 类型
111
+ * @returns 用户信息列表
112
+ */
113
+ async batchGetUsers(
114
+ userIds: string[],
115
+ userIdType: "open_id" | "union_id" | "user_id" = "open_id",
116
+ ): Promise<FeishuUser[]> {
117
+ const response = await this.client.contact.user.batch({
118
+ params: {
119
+ user_ids: userIds,
120
+ user_id_type: userIdType,
121
+ },
122
+ });
123
+
124
+ if (response.code !== 0) {
125
+ throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);
126
+ }
127
+
128
+ return (response.data?.items || []) as FeishuUser[];
129
+ }
130
+ }
@@ -0,0 +1,139 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { FeishuSdkService } from "./feishu-sdk.service";
3
+ import {
4
+ SendCardParams,
5
+ ReplyCardParams,
6
+ UpdateCardParams,
7
+ SendMessageResponse,
8
+ CardContent,
9
+ type CardActionTriggerCallback,
10
+ } from "./types";
11
+ import { OnEvent, type EventEmitter2 } from "@nestjs/event-emitter";
12
+ import { FEISHU_CARD_ACTION_TRIGGER } from "./types";
13
+
14
+ /**
15
+ * 飞书卡片消息服务
16
+ * 提供卡片消息的发送、回复、更新功能
17
+ */
18
+ @Injectable()
19
+ export class FeishuCardService {
20
+ constructor(
21
+ protected readonly feishuSdkService: FeishuSdkService,
22
+ protected readonly eventEmitter: EventEmitter2,
23
+ ) {}
24
+
25
+ @OnEvent(FEISHU_CARD_ACTION_TRIGGER)
26
+ async handleCardActionTrigger(event: CardActionTriggerCallback) {
27
+ const event_hook = event.header.event_type ?? event.event.action.tag;
28
+
29
+ // console.log(event_hook);
30
+ }
31
+
32
+ /**
33
+ * 将卡片内容转换为字符串
34
+ */
35
+ protected serializeCard(card: CardContent): string {
36
+ return typeof card === "string" ? card : JSON.stringify(card);
37
+ }
38
+
39
+ /**
40
+ * 转换 API 响应为统一格式
41
+ */
42
+ protected transformMessageResponse(data: any): SendMessageResponse {
43
+ return {
44
+ messageId: data.message_id,
45
+ rootId: data.root_id,
46
+ parentId: data.parent_id,
47
+ msgType: data.msg_type,
48
+ createTime: data.create_time,
49
+ updateTime: data.update_time,
50
+ deleted: data.deleted,
51
+ updated: data.updated,
52
+ chatId: data.chat_id,
53
+ sender: {
54
+ id: data.sender?.id,
55
+ idType: data.sender?.id_type,
56
+ senderType: data.sender?.sender_type,
57
+ tenantKey: data.sender?.tenant_key,
58
+ },
59
+ };
60
+ }
61
+
62
+ /**
63
+ * 发送卡片消息
64
+ * @param params 发送卡片消息的参数
65
+ * @returns 发送结果
66
+ */
67
+ async sendCard(params: SendCardParams): Promise<SendMessageResponse> {
68
+ const { receiveId, receiveIdType, card, uuid } = params;
69
+ const client = this.feishuSdkService.getClient();
70
+
71
+ const response = await client.im.message.create({
72
+ params: {
73
+ receive_id_type: receiveIdType,
74
+ },
75
+ data: {
76
+ receive_id: receiveId,
77
+ msg_type: "interactive",
78
+ content: this.serializeCard(card),
79
+ uuid,
80
+ },
81
+ });
82
+
83
+ if (response.code !== 0) {
84
+ throw new Error(`飞书发送卡片失败: ${response.code} - ${response.msg}`);
85
+ }
86
+
87
+ return this.transformMessageResponse(response.data);
88
+ }
89
+
90
+ /**
91
+ * 回复卡片消息
92
+ * @param params 回复卡片消息的参数
93
+ * @returns 回复结果
94
+ */
95
+ async replyCard(params: ReplyCardParams): Promise<SendMessageResponse> {
96
+ const { messageId, card, uuid } = params;
97
+ const client = this.feishuSdkService.getClient();
98
+
99
+ const response = await client.im.message.reply({
100
+ path: {
101
+ message_id: messageId,
102
+ },
103
+ data: {
104
+ msg_type: "interactive",
105
+ content: this.serializeCard(card),
106
+ uuid,
107
+ },
108
+ });
109
+
110
+ if (response.code !== 0) {
111
+ throw new Error(`飞书回复卡片失败: ${response.code} - ${response.msg}`);
112
+ }
113
+
114
+ return this.transformMessageResponse(response.data);
115
+ }
116
+
117
+ /**
118
+ * 更新卡片消息
119
+ * @param params 更新卡片消息的参数
120
+ * @returns 更新是否成功
121
+ */
122
+ async updateCard(params: UpdateCardParams): Promise<void> {
123
+ const { messageId, card } = params;
124
+ const client = this.feishuSdkService.getClient();
125
+
126
+ const response = await client.im.message.patch({
127
+ path: {
128
+ message_id: messageId,
129
+ },
130
+ data: {
131
+ content: this.serializeCard(card),
132
+ },
133
+ });
134
+
135
+ if (response.code !== 0) {
136
+ throw new Error(`飞书更新卡片失败: ${response.code} - ${response.msg}`);
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./feishu-sdk.module";
2
+ export * from "./feishu-sdk.service";
3
+ export * from "./fieshu-card.service";
4
+ export * from "./types/index";
@@ -0,0 +1,132 @@
1
+ /**
2
+ * 飞书 SDK 卡片交互回调相关类型
3
+ */
4
+
5
+ import type { I18nLocale } from "./common";
6
+ import type { CardData } from "./card";
7
+
8
+ /** 卡片交互事件名称常量 */
9
+ export const FEISHU_CARD_ACTION_TRIGGER = "card.action.trigger" as const;
10
+
11
+ /** 回调基本信息 (header) */
12
+ export interface CardActionHeader {
13
+ /** 回调的唯一标识 */
14
+ event_id: string;
15
+ /** 应用的 Verification Token */
16
+ token: string;
17
+ /** 回调发送的时间,微秒级时间戳 */
18
+ create_time: string;
19
+ /** 回调类型,固定为 "card.action.trigger" */
20
+ event_type: typeof FEISHU_CARD_ACTION_TRIGGER;
21
+ /** 应用归属的 tenant key */
22
+ tenant_key: string;
23
+ /** 应用的 App ID */
24
+ app_id: string;
25
+ }
26
+
27
+ /** 操作者信息 */
28
+ export interface CardActionOperator {
29
+ /** 回调触发者的 tenant key */
30
+ tenant_key: string;
31
+ /** 回调触发者的 user_id (需开启权限) */
32
+ user_id?: string;
33
+ /** 回调触发者的 open_id */
34
+ open_id: string;
35
+ /** 回调触发者的 union_id */
36
+ union_id?: string;
37
+ }
38
+
39
+ /** 交互信息 */
40
+ export interface CardActionInfo {
41
+ /** 交互组件绑定的开发者自定义回传数据 */
42
+ value?: Record<string, unknown> | string;
43
+ /** 交互组件的标签 */
44
+ tag: string;
45
+ /** 用户当前所在地区的时区 */
46
+ timezone?: string;
47
+ /** 组件的自定义唯一标识 */
48
+ name?: string;
49
+ /** 表单容器内用户提交的数据 */
50
+ form_value?: Record<string, unknown>;
51
+ /** 输入框组件提交的数据 (未内嵌在表单中时) */
52
+ input_value?: string;
53
+ /** 单选组件的选项回调值 */
54
+ option?: string;
55
+ /** 多选组件的选项回调值 */
56
+ options?: string[];
57
+ /** 勾选器组件的回调数据 */
58
+ checked?: boolean;
59
+ }
60
+
61
+ /** 展示场景上下文 */
62
+ export interface CardActionContext {
63
+ /** 链接地址 (适用于链接预览场景) */
64
+ url?: string;
65
+ /** 链接预览的 token */
66
+ preview_token?: string;
67
+ /** 消息 ID */
68
+ open_message_id: string;
69
+ /** 会话 ID */
70
+ open_chat_id: string;
71
+ }
72
+
73
+ /** 回调详细信息 (event) */
74
+ export interface CardActionEventData {
75
+ /** 回调触发者信息 */
76
+ operator: CardActionOperator;
77
+ /** 更新卡片用的凭证,有效期 30 分钟,最多可更新 2 次 */
78
+ token: string;
79
+ /** 交互信息 */
80
+ action: CardActionInfo;
81
+ /** 卡片展示场景 */
82
+ host?: string;
83
+ /** 卡片分发类型,链接预览卡片时为 url_preview */
84
+ delivery_type?: "url_preview";
85
+ /** 展示场景上下文 */
86
+ context: CardActionContext;
87
+ }
88
+
89
+ /** 回调结构体 (schema 2.0) */
90
+ export interface CardActionTriggerCallback {
91
+ /** 回调版本,固定为 "2.0" */
92
+ schema: "2.0";
93
+ /** 回调基本信息 */
94
+ header: CardActionHeader;
95
+ /** 回调详细信息 */
96
+ event: CardActionEventData;
97
+ }
98
+
99
+ /** Toast 提示配置 */
100
+ export interface CardActionToast {
101
+ /** 弹窗提示的类型 */
102
+ type?: "info" | "success" | "error" | "warning";
103
+ /** 单语言提示文案 */
104
+ content?: string;
105
+ /** 多语言提示文案 */
106
+ i18n?: Partial<Record<I18nLocale, string>>;
107
+ }
108
+
109
+ /** 响应回调的结构体 */
110
+ export interface CardActionTriggerResponse {
111
+ /** Toast 弹窗提示 */
112
+ toast?: CardActionToast;
113
+ /** 卡片数据 (用于更新卡片) */
114
+ card?: CardData;
115
+ }
116
+
117
+ /** 交互事件回调接口 */
118
+ export interface CardActionTriggerEventCallback {
119
+ /** 完成回调,返回响应结果 */
120
+ done: (result: CardActionTriggerResponse) => void;
121
+ }
122
+
123
+ /** 交互事件 (用于事件监听器),包含回调数据和 done 方法 */
124
+ export interface CardActionTriggerEvent
125
+ extends CardActionTriggerEventCallback, CardActionTriggerCallback {}
126
+
127
+ /** 事件注册类型 */
128
+ export interface CardEvents {
129
+ [FEISHU_CARD_ACTION_TRIGGER]: (
130
+ data: CardActionTriggerCallback,
131
+ ) => Promise<CardActionTriggerResponse>;
132
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 飞书 SDK 卡片消息相关类型
3
+ */
4
+
5
+ import type { ReceiveIdType } from "./message";
6
+
7
+ /** 卡片消息内容,可以是 JSON 对象或 JSON 字符串 */
8
+ export type CardContent = Record<string, unknown> | string;
9
+
10
+ /** 发送卡片消息参数 */
11
+ export interface SendCardParams {
12
+ /** 接收者 ID */
13
+ receiveId: string;
14
+ /** 接收者 ID 类型 */
15
+ receiveIdType: ReceiveIdType;
16
+ /** 卡片内容 (JSON 对象或字符串) */
17
+ card: CardContent;
18
+ /** 可选的 UUID,用于幂等性控制 */
19
+ uuid?: string;
20
+ }
21
+
22
+ /** 回复卡片消息参数 */
23
+ export interface ReplyCardParams {
24
+ /** 要回复的消息 ID */
25
+ messageId: string;
26
+ /** 卡片内容 (JSON 对象或字符串) */
27
+ card: CardContent;
28
+ /** 可选的 UUID,用于幂等性控制 */
29
+ uuid?: string;
30
+ }
31
+
32
+ /** 更新卡片消息参数 */
33
+ export interface UpdateCardParams {
34
+ /** 要更新的消息 ID */
35
+ messageId: string;
36
+ /** 新的卡片内容 (JSON 对象或字符串) */
37
+ card: CardContent;
38
+ }
39
+
40
+ /** 卡片数据 - 使用 JSON 代码 */
41
+ export interface CardDataRaw {
42
+ /** 卡片类型: raw 表示 JSON 构建的卡片 */
43
+ type: "raw";
44
+ /** 卡片的 JSON 数据 */
45
+ data: Record<string, unknown>;
46
+ }
47
+
48
+ /** 卡片数据 - 使用卡片模板 */
49
+ export interface CardDataTemplate {
50
+ /** 卡片类型: template 表示卡片模板 */
51
+ type: "template";
52
+ /** 卡片模板数据 */
53
+ data: {
54
+ /** 卡片模板 ID */
55
+ template_id: string;
56
+ /** 卡片模板版本号 */
57
+ template_version_name?: string;
58
+ /** 卡片模板变量 */
59
+ template_variable?: Record<string, unknown>;
60
+ };
61
+ }
62
+
63
+ /** 卡片数据类型 */
64
+ export type CardData = CardDataRaw | CardDataTemplate;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 飞书 SDK 通用类型
3
+ */
4
+
5
+ /** 支持的语言类型 */
6
+ export type I18nLocale =
7
+ | "zh_cn"
8
+ | "en_us"
9
+ | "zh_hk"
10
+ | "zh_tw"
11
+ | "ja_jp"
12
+ | "id_id"
13
+ | "vi_vn"
14
+ | "th_th"
15
+ | "pt_br"
16
+ | "es_es"
17
+ | "ko_kr"
18
+ | "de_de"
19
+ | "fr_fr"
20
+ | "it_it"
21
+ | "ru_ru"
22
+ | "ms_my";
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 飞书 SDK 类型定义
3
+ */
4
+
5
+ // Module - 模块配置
6
+ export {
7
+ FEISHU_MODULE_OPTIONS,
8
+ type FeishuModuleOptions,
9
+ type FeishuModuleAsyncOptions,
10
+ } from "./module";
11
+
12
+ // Common - 通用类型
13
+ export { type I18nLocale } from "./common";
14
+
15
+ // User - 用户相关
16
+ export { type UserIdType, type FeishuUser, type GetUserParams } from "./user";
17
+
18
+ // Message - 消息相关
19
+ export { type ReceiveIdType, type SendMessageResponse } from "./message";
20
+
21
+ // Card - 卡片消息
22
+ export {
23
+ type CardContent,
24
+ type SendCardParams,
25
+ type ReplyCardParams,
26
+ type UpdateCardParams,
27
+ type CardDataRaw,
28
+ type CardDataTemplate,
29
+ type CardData,
30
+ } from "./card";
31
+
32
+ // CardAction - 卡片交互回调
33
+ export {
34
+ FEISHU_CARD_ACTION_TRIGGER,
35
+ type CardActionHeader,
36
+ type CardActionOperator,
37
+ type CardActionInfo,
38
+ type CardActionContext,
39
+ type CardActionEventData,
40
+ type CardActionTriggerCallback,
41
+ type CardActionToast,
42
+ type CardActionTriggerResponse,
43
+ type CardActionTriggerEventCallback,
44
+ type CardActionTriggerEvent,
45
+ type CardEvents,
46
+ } from "./card-action";
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 飞书 SDK 消息相关类型
3
+ */
4
+
5
+ /** 消息接收者类型 */
6
+ export type ReceiveIdType = "open_id" | "user_id" | "union_id" | "email" | "chat_id";
7
+
8
+ /** 发送/回复消息的响应 */
9
+ export interface SendMessageResponse {
10
+ /** 消息 ID */
11
+ messageId: string;
12
+ /** 根消息 ID (用于消息链) */
13
+ rootId?: string;
14
+ /** 父消息 ID */
15
+ parentId?: string;
16
+ /** 消息类型 */
17
+ msgType: string;
18
+ /** 创建时间 (毫秒时间戳) */
19
+ createTime: string;
20
+ /** 更新时间 (毫秒时间戳) */
21
+ updateTime: string;
22
+ /** 是否被撤回 */
23
+ deleted: boolean;
24
+ /** 是否被更新 */
25
+ updated: boolean;
26
+ /** 会话 ID */
27
+ chatId: string;
28
+ /** 发送者信息 */
29
+ sender: {
30
+ id: string;
31
+ idType: string;
32
+ senderType: string;
33
+ tenantKey?: string;
34
+ };
35
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 飞书 SDK 模块配置类型
3
+ */
4
+
5
+ export const FEISHU_MODULE_OPTIONS = "FEISHU_MODULE_OPTIONS";
6
+
7
+ export interface FeishuModuleOptions {
8
+ /** 应用 ID */
9
+ appId: string;
10
+ /** 应用密钥 */
11
+ appSecret: string;
12
+ /** 应用类型:自建应用或商店应用 */
13
+ appType?: "self_build" | "store";
14
+ /** 域名:飞书或 Lark */
15
+ domain?: "feishu" | "lark";
16
+ }
17
+
18
+ export interface FeishuModuleAsyncOptions {
19
+ useFactory: (...args: any[]) => Promise<FeishuModuleOptions> | FeishuModuleOptions;
20
+ inject?: any[];
21
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * 飞书 SDK 用户相关类型
3
+ */
4
+
5
+ /** 用户 ID 类型 */
6
+ export type UserIdType = "open_id" | "union_id" | "user_id";
7
+
8
+ /** 用户信息 */
9
+ export interface FeishuUser {
10
+ /** 用户的 union_id */
11
+ union_id?: string;
12
+ /** 用户的 user_id */
13
+ user_id?: string;
14
+ /** 用户的 open_id */
15
+ open_id?: string;
16
+ /** 用户名 */
17
+ name?: string;
18
+ /** 英文名 */
19
+ en_name?: string;
20
+ /** 昵称 */
21
+ nickname?: string;
22
+ /** 邮箱 */
23
+ email?: string;
24
+ /** 手机号 */
25
+ mobile?: string;
26
+ /** 手机号码可见性 */
27
+ mobile_visible?: boolean;
28
+ /** 性别 */
29
+ gender?: number;
30
+ /** 头像 */
31
+ avatar?: {
32
+ avatar_72?: string;
33
+ avatar_240?: string;
34
+ avatar_640?: string;
35
+ avatar_origin?: string;
36
+ };
37
+ /** 用户状态 */
38
+ status?: {
39
+ is_frozen?: boolean;
40
+ is_resigned?: boolean;
41
+ is_activated?: boolean;
42
+ is_exited?: boolean;
43
+ is_unjoin?: boolean;
44
+ };
45
+ /** 所属部门 ID 列表 */
46
+ department_ids?: string[];
47
+ /** 直属主管的用户 ID */
48
+ leader_user_id?: string;
49
+ /** 城市 */
50
+ city?: string;
51
+ /** 国家或地区 */
52
+ country?: string;
53
+ /** 工位 */
54
+ work_station?: string;
55
+ /** 入职时间 */
56
+ join_time?: number;
57
+ /** 是否是租户管理员 */
58
+ is_tenant_manager?: boolean;
59
+ /** 工号 */
60
+ employee_no?: string;
61
+ /** 员工类型 */
62
+ employee_type?: number;
63
+ /** 企业邮箱 */
64
+ enterprise_email?: string;
65
+ /** 职务 */
66
+ job_title?: string;
67
+ }
68
+
69
+ /** 获取用户信息的参数 */
70
+ export interface GetUserParams {
71
+ /** 用户 ID */
72
+ userId: string;
73
+ /** 用户 ID 类型 */
74
+ userIdType?: UserIdType;
75
+ /** 部门 ID 类型 */
76
+ departmentIdType?: "department_id" | "open_department_id";
77
+ }