botmux 2.26.0 → 2.27.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.
- package/README.en.md +50 -46
- package/README.md +49 -46
- package/dist/cli.js +279 -40
- package/dist/cli.js.map +1 -1
- package/dist/setup/bots-store.d.ts +3 -0
- package/dist/setup/bots-store.d.ts.map +1 -0
- package/dist/setup/bots-store.js +24 -0
- package/dist/setup/bots-store.js.map +1 -0
- package/dist/setup/lark-scopes.json +301 -0
- package/dist/setup/register-app.d.ts +46 -0
- package/dist/setup/register-app.d.ts.map +1 -0
- package/dist/setup/register-app.js +87 -0
- package/dist/setup/register-app.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts +115 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -0
- package/dist/setup/verify-permissions.js +207 -0
- package/dist/setup/verify-permissions.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭证 + 权限自检. 不阻塞 setup / daemon 启动, 任意失败都降级到"打印剩余步骤".
|
|
3
|
+
*
|
|
4
|
+
* 主路径只用:
|
|
5
|
+
* - {@link validateCredentials} —— 取一次 `tenant_access_token`, 通过才认为
|
|
6
|
+
* AppID/Secret 有效. 没拿到才会让 setup 失败 (拒绝写 bots.json).
|
|
7
|
+
*
|
|
8
|
+
* 仅作为可选 helper, **未启用于 setup / start 主链路**:
|
|
9
|
+
* - {@link checkRequiredScopes} —— 调 `application.v6.scope.list` 比对 botmux
|
|
10
|
+
* 需要的 scope. 待 spike 用真实/可复现 mock 证明 grant_status 闭环后再启用.
|
|
11
|
+
* - {@link applyScopesUnverified} —— 调 `application.v6.scope.apply` 触发管理
|
|
12
|
+
* 员审批. Lark 文档表明它只能提交"已声明但未授权"的 scope, 不能给 manifest
|
|
13
|
+
* 加新 scope, 所以无法绕开"用户去开放平台勾"这步; 同样待 spike 后启用.
|
|
14
|
+
*
|
|
15
|
+
* 安全约束:
|
|
16
|
+
* - Secret 永远不进 console / 日志 / 错误链
|
|
17
|
+
* - 网络/接口错误一律返回结构化结果, 不抛
|
|
18
|
+
*/
|
|
19
|
+
import * as Lark from '@larksuiteoapi/node-sdk';
|
|
20
|
+
/**
|
|
21
|
+
* botmux 运行所需的 scope. 这里**只用于检测/提示**, 不用于自动申请——飞书
|
|
22
|
+
* `scope.apply` 只能提交"已声明但未授权"的, 没法给应用 manifest 加新声明.
|
|
23
|
+
* scope 选择必须用户去开放平台勾.
|
|
24
|
+
*/
|
|
25
|
+
export const BOTMUX_REQUIRED_SCOPES = [
|
|
26
|
+
{ name: 'im:message', desc: '收发消息', critical: true },
|
|
27
|
+
{ name: 'im:message.group_at_msg', desc: '群消息接收', critical: true },
|
|
28
|
+
{ name: 'im:resource', desc: '消息附件下载', critical: true },
|
|
29
|
+
{ name: 'im:chat', desc: '群信息读取', critical: true },
|
|
30
|
+
{ name: 'contact:user.base:readonly', desc: '用户基本信息', critical: true },
|
|
31
|
+
{ name: 'im:message.group_at_msg.include_bot:readonly', desc: '跨 bot @ 事件', critical: false },
|
|
32
|
+
{ name: 'application:application:self_manage', desc: '应用自查 (免审批)', critical: false },
|
|
33
|
+
];
|
|
34
|
+
export function buildScopeDeepLink(appId, scopeName, brand = 'feishu') {
|
|
35
|
+
const host = brand === 'lark' ? 'open.larksuite.com' : 'open.feishu.cn';
|
|
36
|
+
return `https://${host}/app/${appId}/auth?q=${encodeURIComponent(scopeName)}&op_from=openapi&token_type=tenant`;
|
|
37
|
+
}
|
|
38
|
+
export function buildEventSubDeepLink(appId, brand = 'feishu') {
|
|
39
|
+
const host = brand === 'lark' ? 'open.larksuite.com' : 'open.feishu.cn';
|
|
40
|
+
return `https://${host}/app/${appId}/dev-config/event-sub`;
|
|
41
|
+
}
|
|
42
|
+
export function buildAppHomeDeepLink(appId, brand = 'feishu') {
|
|
43
|
+
const host = brand === 'lark' ? 'open.larksuite.com' : 'open.feishu.cn';
|
|
44
|
+
return `https://${host}/app/${appId}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 用 AppID/Secret 取一次 tenant_access_token, 验证凭证可用.
|
|
48
|
+
*
|
|
49
|
+
* Secret 不进 error.message: 错误信息只来自飞书返回的 msg 字段或 axios 错误类型.
|
|
50
|
+
*
|
|
51
|
+
* Codex review #3: 加 AbortController + 总超时. 网络半挂时 `botmux setup` /
|
|
52
|
+
* `botmux start` 不能无限卡住; 超时归类为 network, 这样 setup 走"凭证校验失败
|
|
53
|
+
* 不写盘" 路径, start 走"network 只 WARN 继续"路径.
|
|
54
|
+
*/
|
|
55
|
+
export async function validateCredentials(appId, appSecret, brand = 'feishu', opts = {}) {
|
|
56
|
+
const budgetMs = opts.budgetMs ?? 10_000;
|
|
57
|
+
const host = brand === 'lark' ? 'open.larksuite.com' : 'open.feishu.cn';
|
|
58
|
+
const url = `https://${host}/open-apis/auth/v3/tenant_access_token/internal`;
|
|
59
|
+
// 自家 AbortController 控制总超时; 同时把上层传进来的 signal 也接上.
|
|
60
|
+
const ac = new AbortController();
|
|
61
|
+
const timer = setTimeout(() => ac.abort(), budgetMs);
|
|
62
|
+
if (opts.signal) {
|
|
63
|
+
if (opts.signal.aborted)
|
|
64
|
+
ac.abort();
|
|
65
|
+
else
|
|
66
|
+
opts.signal.addEventListener('abort', () => ac.abort(), { once: true });
|
|
67
|
+
}
|
|
68
|
+
// Codex review v2 follow-up: timer 必须覆盖 res.json() 阶段, 否则飞书极端半挂
|
|
69
|
+
// (body 半 chunk 后服务端不再发) 仍会卡住. clearTimeout 推迟到 JSON 解析之后.
|
|
70
|
+
let res;
|
|
71
|
+
let body;
|
|
72
|
+
try {
|
|
73
|
+
res = await fetch(url, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { 'Content-Type': 'application/json' },
|
|
76
|
+
// 注意: 这是飞书唯一接受 appSecret 的端点; 其它端点全部用 token. 不要把
|
|
77
|
+
// secret 拼到 query string 或日志里.
|
|
78
|
+
body: JSON.stringify({ app_id: appId, app_secret: appSecret }),
|
|
79
|
+
signal: ac.signal,
|
|
80
|
+
});
|
|
81
|
+
body = await res.json();
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
// AbortError (fetch / json() 内部 / 我们自己 timeout) 全部归到 network
|
|
86
|
+
const isAbort = err?.name === 'AbortError' || ac.signal.aborted;
|
|
87
|
+
// JSON 解析错 (非 abort) 归 unknown, 保留旧行为
|
|
88
|
+
if (!isAbort && err instanceof SyntaxError) {
|
|
89
|
+
return { ok: false, error: 'unknown', message: `HTTP ${res?.status ?? '?'} 响应非 JSON` };
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
ok: false,
|
|
93
|
+
error: 'network',
|
|
94
|
+
message: isAbort
|
|
95
|
+
? `请求超时 (> ${budgetMs}ms)`
|
|
96
|
+
: `网络错误: ${err?.code ?? err?.message ?? 'unknown'}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
if (body?.code === 0 && typeof body.tenant_access_token === 'string') {
|
|
101
|
+
return { ok: true, tenantAccessToken: body.tenant_access_token, tokenExpiresIn: body.expire ?? 7200 };
|
|
102
|
+
}
|
|
103
|
+
// 飞书常见错误码:
|
|
104
|
+
// 10003 / 10012: app_id or app_secret invalid
|
|
105
|
+
// 10014: 应用未发布
|
|
106
|
+
// 99991663: app_secret invalid
|
|
107
|
+
if (body?.code === 10003 || body?.code === 10012 || body?.code === 99991663) {
|
|
108
|
+
return { ok: false, error: 'invalid_credentials', message: `凭证无效 (code=${body.code}): ${body.msg ?? ''}` };
|
|
109
|
+
}
|
|
110
|
+
return { ok: false, error: 'unknown', message: `code=${body?.code ?? '?'} msg=${body?.msg ?? ''}` };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 列出应用的 scope grant 状态, 比对 BOTMUX_REQUIRED_SCOPES.
|
|
114
|
+
*
|
|
115
|
+
* **不在主路径使用** — 待 spike 用真实/可复现 mock 证明 grant_status 含义和
|
|
116
|
+
* 状态闭环后再启用. 当前主路径只输出"剩余步骤 + 深链", 不做 grant_status 判定.
|
|
117
|
+
*
|
|
118
|
+
* scope.list 返回 shape (SDK type):
|
|
119
|
+
* `{ data: { scopes: [{ scope_name, grant_status, scope_type }] } }`
|
|
120
|
+
* grant_status 含义未在官方文档明确, 但社区 SDK / 实测一般约定:
|
|
121
|
+
* 1 = 已申请未生效, 2 = 已生效. 启用前 spike 务必确认这个映射.
|
|
122
|
+
*/
|
|
123
|
+
export async function checkRequiredScopes(appId, appSecret, brand = 'feishu') {
|
|
124
|
+
const domain = brand === 'lark' ? Lark.Domain.Lark : Lark.Domain.Feishu;
|
|
125
|
+
const client = new Lark.Client({ appId, appSecret, domain, loggerLevel: Lark.LoggerLevel.error });
|
|
126
|
+
let resp;
|
|
127
|
+
try {
|
|
128
|
+
resp = await client.application.scope.list();
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
return { ok: false, error: 'network', message: `scope.list 调用失败: ${err?.code ?? err?.message ?? 'unknown'}` };
|
|
132
|
+
}
|
|
133
|
+
// SDK 失败时不抛, 返回 { code, msg }
|
|
134
|
+
if (resp?.code === 99991672) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
error: 'need_self_manage',
|
|
138
|
+
message: '应用缺少 application:application:self_manage 权限, 无法自查 scope 列表',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (resp?.code !== 0) {
|
|
142
|
+
return { ok: false, error: 'unknown', message: `code=${resp?.code ?? '?'} msg=${resp?.msg ?? ''}` };
|
|
143
|
+
}
|
|
144
|
+
const scopes = resp?.data?.scopes ?? [];
|
|
145
|
+
// grant_status === 2 → granted (待 spike 确认这是正确映射)
|
|
146
|
+
const grantedNames = scopes
|
|
147
|
+
.filter((s) => s?.grant_status === 2 && typeof s?.scope_name === 'string')
|
|
148
|
+
.map((s) => s.scope_name);
|
|
149
|
+
const missingCritical = BOTMUX_REQUIRED_SCOPES.filter(s => s.critical && !grantedNames.includes(s.name));
|
|
150
|
+
const missingOptional = BOTMUX_REQUIRED_SCOPES.filter(s => !s.critical && !grantedNames.includes(s.name));
|
|
151
|
+
return { ok: true, granted: grantedNames, missingCritical, missingOptional };
|
|
152
|
+
}
|
|
153
|
+
export async function applyScopesUnverified(appId, appSecret, opts = {}) {
|
|
154
|
+
const brand = opts.brand ?? 'feishu';
|
|
155
|
+
const budgetMs = opts.budgetMs ?? 15_000;
|
|
156
|
+
const domain = brand === 'lark' ? Lark.Domain.Lark : Lark.Domain.Feishu;
|
|
157
|
+
const client = new Lark.Client({ appId, appSecret, domain, loggerLevel: Lark.LoggerLevel.error });
|
|
158
|
+
const timeout = new Promise((resolve) => {
|
|
159
|
+
const timer = setTimeout(() => resolve({ status: 'timeout', msg: `> ${budgetMs}ms` }), budgetMs);
|
|
160
|
+
opts.signal?.addEventListener('abort', () => {
|
|
161
|
+
clearTimeout(timer);
|
|
162
|
+
resolve({ status: 'timeout', msg: 'aborted' });
|
|
163
|
+
}, { once: true });
|
|
164
|
+
});
|
|
165
|
+
const call = (async () => {
|
|
166
|
+
try {
|
|
167
|
+
const resp = await client.application.scope.apply();
|
|
168
|
+
const code = resp?.code;
|
|
169
|
+
const msg = resp?.msg;
|
|
170
|
+
if (code === 0)
|
|
171
|
+
return { status: 'submitted', code, msg };
|
|
172
|
+
if (code === 212001)
|
|
173
|
+
return { status: 'super_scope_only', code, msg };
|
|
174
|
+
if (code === 212002)
|
|
175
|
+
return { status: 'nothing_to_apply', code, msg };
|
|
176
|
+
if (code === 212003)
|
|
177
|
+
return { status: 'over_limit', code, msg };
|
|
178
|
+
if (code === 212004)
|
|
179
|
+
return { status: 'already_applied', code, msg };
|
|
180
|
+
return { status: 'error', code, msg };
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return { status: 'error', msg: err?.code ?? err?.message ?? 'unknown' };
|
|
184
|
+
}
|
|
185
|
+
})();
|
|
186
|
+
return Promise.race([call, timeout]);
|
|
187
|
+
}
|
|
188
|
+
// ─── Remaining-steps printer ──────────────────────────────────────────────
|
|
189
|
+
/**
|
|
190
|
+
* setup 后 "还要手动点的步骤" 结构化数据. 跟 cli.ts 的 printRemainingSteps + README
|
|
191
|
+
* "5 分钟快速接入" 一致: 主线就两步 (权限申请 + 按需重定向 URL); PersonalAgent
|
|
192
|
+
* 应用默认订阅事件 + bot 能力, 不在主线提示, 收不到消息时见 README 的 fallback
|
|
193
|
+
* 自查清单.
|
|
194
|
+
*/
|
|
195
|
+
export function buildRemainingSteps(appId, brand = 'feishu') {
|
|
196
|
+
return [
|
|
197
|
+
{
|
|
198
|
+
title: '申请权限 (一次性导入完整 JSON 提交审批) — 进入「权限管理」→「批量导入/导出权限」, 粘贴 ~/.botmux/lark-scopes.json',
|
|
199
|
+
url: `${buildAppHomeDeepLink(appId, brand)}/auth`,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
title: '添加重定向 URL http://127.0.0.1:9768/callback (按需, 用于 botmux 内 /login 跨用户调 API)',
|
|
203
|
+
url: `${buildAppHomeDeepLink(appId, brand)}/safe`,
|
|
204
|
+
},
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=verify-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-permissions.js","sourceRoot":"","sources":["../../src/setup/verify-permissions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "botmux",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.27.1",
|
|
4
4
|
"description": "Bridge between IM platforms and AI coding CLIs — one topic, one CLI session with live streaming",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index-daemon.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"LICENSE"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "tsc && pnpm dashboard:bundle",
|
|
18
|
+
"build": "tsc && cp src/setup/lark-scopes.json dist/setup/ && pnpm dashboard:bundle",
|
|
19
19
|
"dashboard:bundle": "esbuild src/dashboard/web/app.ts --bundle --outfile=dist/dashboard-web/app.js --platform=browser --format=iife --minify && cp src/dashboard/web/index.html dist/dashboard-web/index.html && cp src/dashboard/web/style.css dist/dashboard-web/style.css",
|
|
20
20
|
"daemon": "tsx src/index-daemon.ts",
|
|
21
21
|
"daemon:start": "node dist/cli.js start",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"prepublishOnly": "npm run build"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@larksuiteoapi/node-sdk": "^1.
|
|
35
|
+
"@larksuiteoapi/node-sdk": "^1.64.0",
|
|
36
36
|
"@napi-rs/canvas": "^0.1.65",
|
|
37
37
|
"@xterm/addon-unicode11": "^0.9.0",
|
|
38
38
|
"@xterm/headless": "^6.0.0",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"markdown-it": "^14.1.1",
|
|
42
42
|
"node-pty": "^1.1.0",
|
|
43
43
|
"pm2": "^6.0.0",
|
|
44
|
+
"qrcode-terminal": "^0.12.0",
|
|
44
45
|
"ws": "^8.19.0",
|
|
45
46
|
"zod": "^3.23.0"
|
|
46
47
|
},
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"@playwright/test": "^1.58.2",
|
|
50
51
|
"@types/markdown-it": "^14.1.2",
|
|
51
52
|
"@types/node": "^20.0.0",
|
|
53
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
52
54
|
"@types/ws": "^8.18.1",
|
|
53
55
|
"esbuild": "^0.28.0",
|
|
54
56
|
"memfs": "^4.57.1",
|