@turingflow/agent-kit 0.0.0-stage → 0.1.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/README.md +546 -2
- package/dist/agent.d.ts +27 -0
- package/dist/agent.js +31 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +105 -0
- package/dist/handlers.d.ts +92 -0
- package/dist/handlers.js +211 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +10 -0
- package/dist/sdk.d.ts +106 -0
- package/dist/sdk.js +309 -0
- package/dist/server/agent.d.ts +27 -0
- package/dist/server/agent.js +31 -0
- package/dist/server/artifact-hooks.d.ts +6 -0
- package/dist/server/artifact-hooks.js +37 -0
- package/dist/server/artifact-tool-tracker.d.ts +24 -0
- package/dist/server/artifact-tool-tracker.js +347 -0
- package/dist/server/artifacts.d.ts +227 -0
- package/dist/server/artifacts.js +1061 -0
- package/dist/server/auth/config.d.ts +34 -0
- package/dist/server/auth/config.js +82 -0
- package/dist/server/auth/db.d.ts +159 -0
- package/dist/server/auth/db.js +680 -0
- package/dist/server/auth/handlers.d.ts +27 -0
- package/dist/server/auth/handlers.js +297 -0
- package/dist/server/auth/index.d.ts +15 -0
- package/dist/server/auth/index.js +14 -0
- package/dist/server/auth/login-options.d.ts +14 -0
- package/dist/server/auth/login-options.js +50 -0
- package/dist/server/auth/providers/dingtalk.d.ts +16 -0
- package/dist/server/auth/providers/dingtalk.js +177 -0
- package/dist/server/auth/providers/feishu.d.ts +15 -0
- package/dist/server/auth/providers/feishu.js +100 -0
- package/dist/server/auth/providers/index.d.ts +13 -0
- package/dist/server/auth/providers/index.js +24 -0
- package/dist/server/auth/session.d.ts +48 -0
- package/dist/server/auth/session.js +108 -0
- package/dist/server/auth/types.d.ts +118 -0
- package/dist/server/auth/types.js +7 -0
- package/dist/server/browser-agent-mcp.d.ts +67 -0
- package/dist/server/browser-agent-mcp.js +608 -0
- package/dist/server/cli.d.ts +6 -0
- package/dist/server/cli.js +112 -0
- package/dist/server/debug-log.d.ts +25 -0
- package/dist/server/debug-log.js +86 -0
- package/dist/server/handlers.d.ts +141 -0
- package/dist/server/handlers.js +523 -0
- package/dist/server/index.d.ts +30 -0
- package/dist/server/index.js +28 -0
- package/dist/server/kit-api.d.ts +23 -0
- package/dist/server/kit-api.js +153 -0
- package/dist/server/model-sources.d.ts +32 -0
- package/dist/server/model-sources.js +58 -0
- package/dist/server/oa.d.ts +87 -0
- package/dist/server/oa.js +397 -0
- package/dist/server/providers/openrouter.d.ts +51 -0
- package/dist/server/providers/openrouter.js +283 -0
- package/dist/server/render-markdown.d.ts +2 -0
- package/dist/server/render-markdown.js +50 -0
- package/dist/server/sdk.d.ts +259 -0
- package/dist/server/sdk.js +1991 -0
- package/dist/server/session-access.d.ts +5 -0
- package/dist/server/session-access.js +68 -0
- package/dist/server/session-fork.d.ts +10 -0
- package/dist/server/session-fork.js +142 -0
- package/dist/server/session-store.d.ts +56 -0
- package/dist/server/session-store.js +148 -0
- package/dist/server/sessions.d.ts +24 -0
- package/dist/server/sessions.js +541 -0
- package/dist/server/share.d.ts +15 -0
- package/dist/server/share.js +433 -0
- package/dist/server/tool-activity.d.ts +2 -0
- package/dist/server/tool-activity.js +26 -0
- package/dist/server/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/server/transcription/xiaomi-mimo.js +86 -0
- package/dist/server/upload.d.ts +13 -0
- package/dist/server/upload.js +81 -0
- package/dist/server/user-files.d.ts +28 -0
- package/dist/server/user-files.js +311 -0
- package/dist/server/voice.d.ts +25 -0
- package/dist/server/voice.js +61 -0
- package/dist/server/web-fetch.d.ts +71 -0
- package/dist/server/web-fetch.js +330 -0
- package/dist/styles.css +3354 -0
- package/dist/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/transcription/xiaomi-mimo.js +86 -0
- package/dist/ui/index.d.ts +352 -0
- package/dist/ui/index.js +7730 -0
- package/dist/upload.d.ts +13 -0
- package/dist/upload.js +81 -0
- package/dist/voice.d.ts +25 -0
- package/dist/voice.js +61 -0
- package/package.json +74 -4
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 统一 API 路由工厂:一个 catch-all 文件挂载 agent-kit 的全部 HTTP 端点。
|
|
3
|
+
*
|
|
4
|
+
* 集成方只需建一个文件 app/api/[...path]/route.js:
|
|
5
|
+
* import { createAgentKitApi } from "agent-kit";
|
|
6
|
+
* export const runtime = "nodejs";
|
|
7
|
+
* export const dynamic = "force-dynamic";
|
|
8
|
+
* export const { GET, POST, PATCH, DELETE } = createAgentKitApi({
|
|
9
|
+
* agent: { chat: { allowBash: false } },
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* 内部复用现有端点工厂(createAgentApiRoute / createSessionHandlers /
|
|
13
|
+
* createShareHandlers / createLoginHandlers),按 [方法, 路径段] 分发;
|
|
14
|
+
* 未知路径 → 404,未导出的方法 → 由 Next 自动 405。
|
|
15
|
+
* 以后 kit 新增任何端点只改 agent-kit,应用端零改动。
|
|
16
|
+
*/
|
|
17
|
+
import { createAgentApiRoute } from "./handlers.js";
|
|
18
|
+
import { createSessionHandlers } from "./sessions.js";
|
|
19
|
+
import { createShareHandlers } from "./share.js";
|
|
20
|
+
import { createLoginHandlers } from "./auth/handlers.js";
|
|
21
|
+
import { createUserFilesHandlers } from "./user-files.js";
|
|
22
|
+
import { getModelOptions } from "./model-sources.js";
|
|
23
|
+
const METHOD_NOT_ALLOWED = () => Response.json({ error: "method_not_allowed" }, { status: 405 });
|
|
24
|
+
const SUPPORTED = "/api/chat、/api/chat/answer、/api/chat/steer、/api/chat/browser-answer、/api/upload、" +
|
|
25
|
+
"/api/voice/token、/api/voice/transcribe、/api/artifact、/api/sessions(+子资源)、" +
|
|
26
|
+
"/api/models/list、/api/models/context、/api/share(+token)、/api/auth/*、" +
|
|
27
|
+
"/api/user-files(+raw/mkdir/rename)";
|
|
28
|
+
export function createAgentKitApi(options = {}) {
|
|
29
|
+
// 复用现有端点工厂,不重写任何业务逻辑
|
|
30
|
+
const agentRoute = createAgentApiRoute(options.agent ?? {});
|
|
31
|
+
const session = createSessionHandlers();
|
|
32
|
+
const share = createShareHandlers();
|
|
33
|
+
const login = createLoginHandlers(options.login);
|
|
34
|
+
const userFiles = createUserFilesHandlers();
|
|
35
|
+
const notFound = (detail) => Response.json({ error: `未找到该端点(${detail})。agent-kit 支持:${SUPPORTED}` }, { status: 404 });
|
|
36
|
+
async function dispatch(method, request, context = {}) {
|
|
37
|
+
const raw = (await Promise.resolve(context.params ?? {}));
|
|
38
|
+
const segments = raw.path ?? [];
|
|
39
|
+
const [a, b, c] = segments;
|
|
40
|
+
const idCtx = { params: { id: b } }; // /sessions/:id/*
|
|
41
|
+
const tokenCtx = { params: { token: b } }; // /share/:token
|
|
42
|
+
// ---- agent group(chat / upload / voice / artifact):复用现有 catch-all ----
|
|
43
|
+
if (a === "chat" || a === "upload" || a === "voice") {
|
|
44
|
+
if (method === "POST")
|
|
45
|
+
return agentRoute.POST(request, { params: { agent: segments } });
|
|
46
|
+
return notFound(`POST /api/${segments.join("/")}`);
|
|
47
|
+
}
|
|
48
|
+
if (a === "artifact") {
|
|
49
|
+
if (method === "GET")
|
|
50
|
+
return agentRoute.GET(request, { params: { agent: segments } });
|
|
51
|
+
return notFound("GET /api/artifact");
|
|
52
|
+
}
|
|
53
|
+
// ---- sessions ----
|
|
54
|
+
if (a === "sessions") {
|
|
55
|
+
if (!b) {
|
|
56
|
+
if (method === "GET")
|
|
57
|
+
return session.list(request);
|
|
58
|
+
if (method === "POST")
|
|
59
|
+
return session.create(request);
|
|
60
|
+
return METHOD_NOT_ALLOWED();
|
|
61
|
+
}
|
|
62
|
+
if (!c) {
|
|
63
|
+
if (method === "PATCH")
|
|
64
|
+
return session.rename(request, idCtx);
|
|
65
|
+
if (method === "DELETE")
|
|
66
|
+
return session.remove(request, idCtx);
|
|
67
|
+
return METHOD_NOT_ALLOWED();
|
|
68
|
+
}
|
|
69
|
+
if (c === "messages") {
|
|
70
|
+
if (method === "GET")
|
|
71
|
+
return session.messages(request, idCtx);
|
|
72
|
+
if (method === "POST")
|
|
73
|
+
return session.appendMessage(request, idCtx);
|
|
74
|
+
return METHOD_NOT_ALLOWED();
|
|
75
|
+
}
|
|
76
|
+
if (c === "auto-title" && method === "POST")
|
|
77
|
+
return session.autoTitle(request, idCtx);
|
|
78
|
+
if (c === "truncate" && method === "POST")
|
|
79
|
+
return session.truncate(request, idCtx);
|
|
80
|
+
if (c === "fork" && method === "POST")
|
|
81
|
+
return session.fork(request, idCtx);
|
|
82
|
+
if (c === "close-sdk" && method === "POST")
|
|
83
|
+
return session.closeSdk(request, idCtx);
|
|
84
|
+
return notFound(`/api/sessions/${b}/${c}`);
|
|
85
|
+
}
|
|
86
|
+
// ---- user-files(用户可操作区:目录名 = 登录用户 id,跨会话共享)----
|
|
87
|
+
if (a === "user-files") {
|
|
88
|
+
if (method === "GET")
|
|
89
|
+
return userFiles.GET(request);
|
|
90
|
+
if (method === "POST")
|
|
91
|
+
return userFiles.POST(request);
|
|
92
|
+
if (method === "DELETE")
|
|
93
|
+
return userFiles.DELETE(request);
|
|
94
|
+
return METHOD_NOT_ALLOWED();
|
|
95
|
+
}
|
|
96
|
+
// ---- share ----
|
|
97
|
+
if (a === "share") {
|
|
98
|
+
if (!b) {
|
|
99
|
+
if (method === "POST")
|
|
100
|
+
return share.create.POST(request);
|
|
101
|
+
return METHOD_NOT_ALLOWED();
|
|
102
|
+
}
|
|
103
|
+
if (b === "jsapi-sign") {
|
|
104
|
+
if (method === "POST")
|
|
105
|
+
return share.jsapiSign.POST(request);
|
|
106
|
+
return METHOD_NOT_ALLOWED();
|
|
107
|
+
}
|
|
108
|
+
// /share/:token
|
|
109
|
+
if (method === "GET")
|
|
110
|
+
return share.view.GET(request, tokenCtx);
|
|
111
|
+
if (method === "POST")
|
|
112
|
+
return share.send.POST(request, tokenCtx);
|
|
113
|
+
return METHOD_NOT_ALLOWED();
|
|
114
|
+
}
|
|
115
|
+
// ---- models(模型上下文窗口上限) ----
|
|
116
|
+
if (a === "models" && b === "context" && method === "GET")
|
|
117
|
+
return session.modelContext(request);
|
|
118
|
+
// ---- models/list(下拉模型来源:models.json 自定义模型优先,否则 env AGENT_MODEL_LIST 兜底) ----
|
|
119
|
+
if (a === "models" && b === "list" && method === "GET") {
|
|
120
|
+
return Response.json({ models: getModelOptions() });
|
|
121
|
+
}
|
|
122
|
+
// ---- admin(用量页登录保护:admin/admin,未登录 401) ----
|
|
123
|
+
if (a === "admin") {
|
|
124
|
+
if (b === "login" && method === "POST")
|
|
125
|
+
return session.adminLogin(request);
|
|
126
|
+
if (b === "logout" && method === "POST")
|
|
127
|
+
return session.adminLogout();
|
|
128
|
+
if (b === "usage" && method === "GET")
|
|
129
|
+
return session.adminUsage(request);
|
|
130
|
+
return notFound(`/api/admin/${b ?? ""}`);
|
|
131
|
+
}
|
|
132
|
+
// ---- auth ----
|
|
133
|
+
if (a === "auth") {
|
|
134
|
+
if (b === "login" && method === "GET")
|
|
135
|
+
return login.login.GET(request);
|
|
136
|
+
if (b === "callback" && method === "GET")
|
|
137
|
+
return login.callback.GET(request);
|
|
138
|
+
if (b === "sso" && method === "POST")
|
|
139
|
+
return login.sso.POST(request);
|
|
140
|
+
if (b === "session" && method === "GET")
|
|
141
|
+
return login.session.GET(request);
|
|
142
|
+
if (b === "logout" && method === "POST")
|
|
143
|
+
return login.logout.POST(request);
|
|
144
|
+
return notFound(`/api/auth/${b ?? ""}`);
|
|
145
|
+
}
|
|
146
|
+
return notFound(`/api/${segments.join("/") || ""}`);
|
|
147
|
+
}
|
|
148
|
+
const GET = (request, context = {}) => dispatch("GET", request, context);
|
|
149
|
+
const POST = (request, context = {}) => dispatch("POST", request, context);
|
|
150
|
+
const PATCH = (request, context = {}) => dispatch("PATCH", request, context);
|
|
151
|
+
const DELETE = (request, context = {}) => dispatch("DELETE", request, context);
|
|
152
|
+
return { GET, POST, PATCH, DELETE };
|
|
153
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型来源解析(agent-kit 通用能力,供所有宿主复用):
|
|
3
|
+
*
|
|
4
|
+
* 1. 若用户级 ~/.codebuddy/models.json 配置了自定义模型 → 优先返回这些模型
|
|
5
|
+
* (每项 { id, name, meta },meta 已剔除 apiKey,可安全下发前端);
|
|
6
|
+
* 2. 否则回退到环境变量 AGENT_MODEL_LIST(逗号分隔的纯 id 字符串)。
|
|
7
|
+
*
|
|
8
|
+
* 这是 CodeBuddy 的原生自定义模型机制:models.json 是数组、字段多、由开发者手动维护,
|
|
9
|
+
* agent-kit 只负责读取并暴露给前端下拉,不代为生成。应用端无需感知这套逻辑——
|
|
10
|
+
* 直接调用 getModelOptions(),或让前端自动从 /api/models/list 拉取即可。
|
|
11
|
+
*/
|
|
12
|
+
/** 模型选项:兼容「纯 id 字符串」与「{id, name, meta} 对象」两种来源。 */
|
|
13
|
+
export type ServerModelOption = string | {
|
|
14
|
+
id: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
meta?: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* 读取用户级 ~/.codebuddy/models.json 的自定义模型。
|
|
20
|
+
* 不存在 / 损坏 / models 为空 → 返回 null。
|
|
21
|
+
* 返回的 meta 已剔除 apiKey(绝不把密钥下发前端或写进日志)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function readCodeBuddyModels(): {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
meta: Record<string, unknown>;
|
|
27
|
+
}[] | null;
|
|
28
|
+
/**
|
|
29
|
+
* 解析下拉模型列表:自定义模型优先,否则 env AGENT_MODEL_LIST 兜底。
|
|
30
|
+
* 返回值直接序列化给前端(已剔除 apiKey)。
|
|
31
|
+
*/
|
|
32
|
+
export declare function getModelOptions(): ServerModelOption[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const CODEBUDDY_HOME = path.join(os.homedir(), ".codebuddy");
|
|
5
|
+
/**
|
|
6
|
+
* 读取用户级 ~/.codebuddy/models.json 的自定义模型。
|
|
7
|
+
* 不存在 / 损坏 / models 为空 → 返回 null。
|
|
8
|
+
* 返回的 meta 已剔除 apiKey(绝不把密钥下发前端或写进日志)。
|
|
9
|
+
*/
|
|
10
|
+
export function readCodeBuddyModels() {
|
|
11
|
+
const filePath = path.join(CODEBUDDY_HOME, "models.json");
|
|
12
|
+
try {
|
|
13
|
+
if (!fs.existsSync(filePath))
|
|
14
|
+
return null;
|
|
15
|
+
const cfg = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
16
|
+
const arr = cfg?.models;
|
|
17
|
+
if (!Array.isArray(arr) || arr.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
const list = arr
|
|
20
|
+
.map((m) => {
|
|
21
|
+
if (!m || typeof m !== "object")
|
|
22
|
+
return null;
|
|
23
|
+
const rec = m;
|
|
24
|
+
const id = typeof rec.id === "string" ? rec.id.trim() : "";
|
|
25
|
+
if (!id)
|
|
26
|
+
return null;
|
|
27
|
+
// 剔除 apiKey:绝不下发密钥
|
|
28
|
+
const { apiKey: _apiKey, ...meta } = rec;
|
|
29
|
+
void _apiKey;
|
|
30
|
+
return {
|
|
31
|
+
id,
|
|
32
|
+
name: typeof rec.name === "string" ? rec.name.trim() : "",
|
|
33
|
+
meta,
|
|
34
|
+
};
|
|
35
|
+
})
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
return list.length > 0 ? list : null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// 文件损坏 / 不可读 → 回退 env
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 解析下拉模型列表:自定义模型优先,否则 env AGENT_MODEL_LIST 兜底。
|
|
46
|
+
* 返回值直接序列化给前端(已剔除 apiKey)。
|
|
47
|
+
*/
|
|
48
|
+
export function getModelOptions() {
|
|
49
|
+
const custom = readCodeBuddyModels();
|
|
50
|
+
if (custom && custom.length > 0) {
|
|
51
|
+
return custom.map((m) => ({ id: m.id, name: m.name || undefined, meta: m.meta }));
|
|
52
|
+
}
|
|
53
|
+
const envList = (process.env.AGENT_MODEL_LIST || "")
|
|
54
|
+
.split(",")
|
|
55
|
+
.map((s) => s.trim())
|
|
56
|
+
.filter(Boolean);
|
|
57
|
+
return envList;
|
|
58
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/** 钉钉企业内部应用 access_token(gettoken)。 */
|
|
2
|
+
export declare function getDingTalkToken(appKey: string, appSecret: string): Promise<string>;
|
|
3
|
+
/** 钉钉 jsapi_ticket(H5 JSAPI 前端鉴权用)。 */
|
|
4
|
+
export declare function getDingTalkJsapiTicket(appKey: string, appSecret: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* 根据 unionId 解析企业内 userid(OAuth 登录未落 user_code 时,分享发送链路兜底用)。
|
|
7
|
+
* 接口:POST /topapi/v2/user/getbyunionid(文档另列旧路径 /topapi/user/getbyunionid,失败自动回退)。
|
|
8
|
+
* 权限:成员信息读权限;缺权限或解析失败返回空串,由调用方决定如何报错。
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveDingTalkUserIdByUnionId(appKey: string, appSecret: string, unionId: string): Promise<string>;
|
|
11
|
+
/** 钉钉 H5 JSAPI dd.config 签名参数(企业内部应用 · 官方新版算法)。
|
|
12
|
+
*
|
|
13
|
+
* 重要(2025+ 新版网页应用/H5 微应用,见开放平台《JSAPI鉴权》/《开发网页应用前端》):
|
|
14
|
+
* plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + timeStamp + "&url=" + decodeUrl(url)
|
|
15
|
+
* signature = SHA256(plain)
|
|
16
|
+
* 旧版微应用是 sha1(ticket+nonceStr+timeStamp+url) 纯拼接,新版必须用上面的键值对 + SHA-256,
|
|
17
|
+
* 否则钉钉端重算签名不一致 → dd.config 报 errorCode 9「签名校验失败」(参数全一致也会失败)。
|
|
18
|
+
*/
|
|
19
|
+
export declare function dingTalkJsapiConfig(appKey: string, appSecret: string, corpId: string, agentId: string, url: string): Promise<{
|
|
20
|
+
agentId: string;
|
|
21
|
+
corpId: string;
|
|
22
|
+
timeStamp: string;
|
|
23
|
+
nonceStr: string;
|
|
24
|
+
signature: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* 钉钉「发送普通消息」:向 JSAPI 选中的一次性会话 cid 发消息。
|
|
28
|
+
* opts.url 提供时发 markdown 消息(title + 链接),钉钉客户端渲染为带预览的链接卡片;
|
|
29
|
+
* 否则回退纯文本(兼容旧调用)。
|
|
30
|
+
*/
|
|
31
|
+
export declare function sendDingTalkMessage(appKey: string, appSecret: string, cid: string, sender: string, text: string, opts?: {
|
|
32
|
+
title?: string;
|
|
33
|
+
url?: string;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/** 飞书 tenant_access_token(企业内部应用)。 */
|
|
36
|
+
export declare function getFeishuTenantToken(appId: string, appSecret: string, baseUrl: string): Promise<string>;
|
|
37
|
+
/** 飞书 jsapi_ticket(H5 JSAPI 前端鉴权用)。 */
|
|
38
|
+
export declare function getFeishuJsapiTicket(appId: string, appSecret: string, baseUrl: string): Promise<string>;
|
|
39
|
+
/** 飞书 H5 JSAPI(window.h5sdk.config)签名参数。 */
|
|
40
|
+
export declare function feishuJsapiConfig(appId: string, appSecret: string, baseUrl: string, url: string): Promise<{
|
|
41
|
+
appId: string;
|
|
42
|
+
timestamp: number;
|
|
43
|
+
nonceStr: string;
|
|
44
|
+
signature: string;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* 飞书「发送消息」到会话(chat_id)。
|
|
48
|
+
* opts.url 提供时发 link 消息(title/text/message_link),飞书客户端渲染为链接卡片预览;
|
|
49
|
+
* 否则回退文本消息(兼容旧调用)。
|
|
50
|
+
*/
|
|
51
|
+
export declare function sendFeishuMessage(appId: string, appSecret: string, baseUrl: string, chatId: string, text: string, opts?: {
|
|
52
|
+
title?: string;
|
|
53
|
+
url?: string;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* 飞书「以当前用户身份」发送消息(user_access_token)。
|
|
57
|
+
* 不要求应用机器人加入目标会话(用户本就在自己的会话里);
|
|
58
|
+
* 需应用开通 im:message + im:message.send_as_user(用户身份读发消息)且 OAuth 授权 scope 含 im:message。
|
|
59
|
+
* 注意:im/v1/messages 不支持 msg_type=link(历史 API 才有),带链接时发 interactive 卡片:
|
|
60
|
+
* 大卡片 + 标题竖线 + 直接展示聊天摘要 + 整卡点击跳转(豆包分享同款样式)。
|
|
61
|
+
*/
|
|
62
|
+
export declare function sendFeishuMessageAsUser(userAccessToken: string, baseUrl: string, chatId: string, text: string, opts?: {
|
|
63
|
+
title?: string;
|
|
64
|
+
url?: string;
|
|
65
|
+
chatSummary?: string;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* 飞书 user_access_token 刷新(OAuth offline_access scope)。
|
|
69
|
+
* 返回 { accessToken, refreshToken };refreshToken 为空时表示飞书未返回新刷新令牌(保留旧值)。
|
|
70
|
+
*/
|
|
71
|
+
export declare function refreshFeishuUserToken(appId: string, appSecret: string, baseUrl: string, refreshToken: string): Promise<{
|
|
72
|
+
accessToken: string;
|
|
73
|
+
refreshToken: string | null;
|
|
74
|
+
}>;
|
|
75
|
+
/** 飞书 app_access_token(内部应用;OAuth token 刷新等场景用)。 */
|
|
76
|
+
export declare function getFeishuAppAccessToken(appId: string, appSecret: string, baseUrl: string): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* 钉钉机器人发送群聊消息(企业内部应用机器人)。
|
|
79
|
+
* POST /v1.0/robot/groupMessages/send —— 接受 chooseChat 选会话返回的 openConversationId(旧接口
|
|
80
|
+
* send_to_conversation 只认旧格式 cid 且"不再支持新应用接入",故改用本接口)。
|
|
81
|
+
* 前置条件:应用已申请「企业内机器人发送消息权限」,且机器人已加入目标群。
|
|
82
|
+
* robotCode 未显式配置时用应用 AppKey(企业内部应用机器人 code = AppKey)。
|
|
83
|
+
*/
|
|
84
|
+
export declare function sendDingTalkRobotGroupMessage(appKey: string, appSecret: string, robotCode: string, openConversationId: string, markdown: {
|
|
85
|
+
title: string;
|
|
86
|
+
text: string;
|
|
87
|
+
}): Promise<void>;
|